localhost 2 жил өмнө
parent
commit
acad10a790

+ 106 - 0
WCS.Data/Models/RESULTINFO.cs

@@ -277,6 +277,112 @@ namespace WCS.Data.Models
         public bool IsLastBox { get; set; }
     }
 
+    public class GetExeTaskParam
+    {
+        /// <summary>
+        /// 容器编号
+        /// </summary>
+        public string ContainerBarCode { get; set; }
+        /// <summary>
+        /// 容器类型(数字越大代表货位越大,0不算)
+        /// </summary>
+        public int ContainerType { get; set; }
+        /// <summary>
+        /// 物料条码
+        /// </summary>
+        public string MatBarCode { get; set; }
+        /// <summary>
+        /// 仓库编码
+        /// </summary>
+        public string WareHouseId { get; set; }
+        /// <summary>
+        /// 设备编号
+        /// </summary>
+        public string EquipmentNo { get; set; }
+        /// <summary>
+        /// 目标位置(0.无效参数 1.srm;2.Aeaa_1;3.Aeaa_2)
+        /// </summary>
+        public string EndPostion { get; set; }
+        /// <summary>
+        /// 1.分配巷道 2.分配货位
+        /// </summary>
+        public string Memo1 { get; set; }
+        /// <summary>
+        ///  托盘异常退回输送线编号(不用退回则为空)
+        /// </summary>
+        public string Memo2 { get; set; }
+        /// <summary>
+        /// 退料卷一
+        /// </summary>
+        public string Memo3 { get; set; }
+        /// <summary>
+        /// 退料卷二
+        /// </summary>
+        public string Memo4 { get; set; }
+
+        public bool IsBan { get; set; }
+    }
+    public class GetExeTaskReply
+    {
+        /// <summary>
+        /// 1:成功,0:失败
+        /// </summary>
+        public bool ResType { get; set; }
+        public string ResMessage { get; set; }
+        public string WMSTaskNum { get; set; }
+        /// <summary>
+        /// 任务类型(1:入库2:出库3:移库4:移动(搬运) 5:异常 6:托盘异常退回)
+        /// </summary>
+        public int TaskType { get; set; }
+        /// <summary>
+        /// 仓库名称
+        /// </summary>
+        public string WareHouseName { get; set; }
+        /// <summary>
+        /// 入库巷道(集合巷道,由WCS自行判断入到哪一个巷道,最前面的最优先)
+        /// </summary>
+        public string TunnelNum { get; set; }
+        /// <summary>
+        /// 目标位置(入库该地址为srm.如果是移动任务,该地址为WCS传递的目标位置)
+        /// </summary>
+        public string EndPostion { get; set; }
+        public int Priority { get; set; }
+        /// <summary>
+        /// 重量
+        /// </summary>
+        public decimal TASK_WEIGHT { get; set; }
+        /// <summary>
+        /// 垛型
+        /// </summary>
+        public int TASK_STACKINGTYPE { get; set; }
+        /// <summary>
+        /// 是否缠膜(1.缠膜;0.不缠膜)
+        /// </summary>
+        public string Memo1 { get; set; }
+        public string Memo2 { get; set; }
+        public string Memo3 { get; set; }
+        /// <summary>
+        /// 熟化类型(0=不需熟化、1=熟化房熟化、2=小烘房熟化)
+        /// </summary>
+        public int TASK_MatureType { get; set; }
+        /// <summary>
+        /// 熟化时间(小时:10,16)
+        /// </summary>
+        public decimal TASK_MatureDate { get; set; }
+        /// <summary>
+        /// 熟化温度(小数)
+        /// </summary>
+        public decimal TASK_MatureTemperat { get; set; }
+        /// <summary>
+        /// 码垛箱子尺寸
+        /// </summary>
+        public string PalletizingBoxSize { get; set; }
+        /// <summary>
+        /// 是否最后一箱
+        /// </summary>
+        public bool IsLastBox { get; set; }
+    }
+
     public class UploadExcTaskParam
     {
         public string OutId { get; set; }

+ 2 - 0
WCS.Data/Utils/AppSettings.cs

@@ -11,6 +11,8 @@ namespace WCS.Data
     public class AppSettings
     {
         public string GetInTask { get; set; }
+        public string GetExeTask { get; set; }
+        
         public string GetTunnelList { get; set; }
         public string GetWareCell { get; set; }
         public string PutTaskStep { get; set; }

+ 224 - 0
WCS.PLC/BaseWorkflow.cs

@@ -620,6 +620,138 @@ namespace WCS.PLC
             return result;
         }
 
+        public static WCS_TASK GetExeTask(GetExeTaskParam param)
+        {
+            WCS_TASK wcstask = null;
+            try
+            {
+                wcstask = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_BOXBARCODE == param.ContainerBarCode);
+                if (wcstask == null)
+                {
+                    var reply = Current.WmsInterface.I_WCS_GetExeTask(param);
+                    string errormsg = CheckGetExeTask(param, reply);
+                    if (string.IsNullOrWhiteSpace(errormsg))
+                    {
+                        //添加wcs任务
+                        wcstask = new WCS_TASK();
+                        wcstask.TASK_WMSNO = reply.WMSTaskNum;
+                        wcstask.TASK_COMTYPE = reply.TaskType;
+                        wcstask.TASK_SYSTYPE = "WMS";
+                        wcstask.TASK_POSIDFROM = param.EquipmentNo;//起点地址
+                        wcstask.TASK_POSIDCUR = param.EquipmentNo;
+                        wcstask.TASK_POSIDNEXT = param.EquipmentNo;
+                        wcstask.TASK_POSIDMOVE = "";
+                        wcstask.TASK_PRIORITY = reply.Priority;
+                        wcstask.TASK_WKSTATUS = 0;
+                        wcstask.TASK_WHID = reply.WareHouseName;
+                        wcstask.TASK_ADDUSERNO = "WMS";
+                        wcstask.TASK_ADDDATETIME = DateTime.Now;
+                        wcstask.TASK_EDITUSERNO = "WMS";
+                        wcstask.TASK_EDITDATETIME = DateTime.Now;
+                        wcstask.TASK_NOTES = "";
+                        wcstask.TASK_RGVNO = "";
+                        wcstask.TASK_BOXBARCODE = param.ContainerBarCode;
+                        wcstask.TASK_WEIGHT = reply.TASK_WEIGHT;
+                        wcstask.TASK_STACKINGTYPE = reply.TASK_STACKINGTYPE;
+                        if (!string.IsNullOrWhiteSpace(reply.Memo1))
+                        {
+                            wcstask.TASK_IsWrapFilm = reply.Memo1.Trim() == "1" ? true : false;
+                        }
+
+                        if (string.IsNullOrWhiteSpace(param.Memo1))
+                        {
+                            wcstask.TASK_POSIDTO = reply.EndPostion;
+                            wcstask.TASK_SRMNO = reply.EndPostion;
+                            wcstask.PalletizingBoxSize = reply.PalletizingBoxSize;
+                            wcstask.TASK_ORDERTYPE = reply.IsLastBox ? 1 : 0;
+                        }
+                        else if (param.Memo1.Trim() == "1")
+                        {
+                            string srmno = string.Empty;
+                            wcstask.TASK_EndTunnelNum = ConveyorHelper.QueryTunnel(wcstask.TASK_WMSNO, reply.TunnelNum, out srmno);
+                            wcstask.TASK_POSIDTO = srmno;
+                            wcstask.TASK_SRMNO = srmno;
+                        }
+                        else if (param.Memo1.Trim() == "2")
+                        {
+                            wcstask.TASK_POSIDTO = reply.EndPostion;
+                            wcstask.TASK_EndTunnelNum = reply.TunnelNum;
+                            wcstask.TASK_SRMNO = Current.SysSets.Where(v => v.SET_ID.Contains("Tunnel")).FirstOrDefault(v => v.SET_VALUE == reply.TunnelNum).SET_VALUE;
+                        }
+                        else
+                        {
+                            throw new Exception(string.Format("托盘[{0}]调用WMS入库接口传递参数Memo1错误.", param.ContainerBarCode));
+                        }
+                        int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity();
+                        if (id <= 0)
+                        {
+                            throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败", reply.WMSTaskNum));
+                        }
+                        else
+                        {
+                            wcstask.TASK_NO = id;
+                        }
+                    }
+                    else
+                    {
+                        LogMessageHelper.RecordLogMessage(errormsg);
+                        AddLedErrorMsg(param.EquipmentNo, errormsg, 0);
+                        if (!string.IsNullOrWhiteSpace(param.Memo2))
+                        {
+                            //wms任务异常需要生成退回托盘任务
+                            wcstask = new WCS_TASK()
+                            {
+                                TASK_WMSNO = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"),
+                                TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回,
+                                TASK_SYSTYPE = "WCS",
+                                TASK_POSIDFROM = param.EquipmentNo,//起点地址
+                                TASK_POSIDCUR = param.EquipmentNo,
+                                TASK_POSIDNEXT = param.EquipmentNo,
+                                TASK_POSIDMOVE = "",
+                                TASK_PRIORITY = 1,
+                                TASK_WKSTATUS = 1,
+                                TASK_WHID = string.IsNullOrWhiteSpace(reply.WareHouseName) ? Current.WareNameList[0] : reply.WareHouseName,
+                                TASK_ADDUSERNO = "WCS",
+                                TASK_ADDDATETIME = DateTime.Now,
+                                TASK_EDITUSERNO = "WCS",
+                                TASK_EDITDATETIME = DateTime.Now,
+                                TASK_NOTES = "",
+                                TASK_RGVNO = "",
+                                TASK_BOXBARCODE = param.ContainerBarCode,
+                                TASK_POSIDTO = param.Memo2.Trim()
+                            };
+                            int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity();
+                            if (id <= 0)
+                            {
+                                throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败", reply.WMSTaskNum));
+                            }
+                            else
+                            {
+                                wcstask.TASK_NO = id;
+                            }
+
+                            var task_dtl = new WCS_TASK_DTL()
+                            {
+                                ID = Guid.NewGuid().ToString(),
+                                PARENTID = wcstask.TASK_NO,
+                                TASKNO = wcstask.TASK_NO,
+                                POSIDCUR = param.EquipmentNo,
+                                POSIDNEXT = param.EquipmentNo,
+                                DESCRIPTION = errormsg,
+                                EXECUTEDATE = DateTime.Now
+                            };
+                            SugarBase.DB.Insertable(task_dtl).ExecuteReturnIdentity();
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                LogMessageHelper.RecordLogMessage(ex);
+            }
+            return wcstask;
+        }
+
         private static string CheckGetInTask(GetInTaskParam param, GetInTaskReply reply)
         {
             string errorMsg = string.Empty;
@@ -694,6 +826,80 @@ namespace WCS.PLC
             return errorMsg;
         }
 
+        private static string CheckGetExeTask(GetExeTaskParam param, GetExeTaskReply reply)
+        {
+            string errorMsg = string.Empty;
+            if (reply == null)
+            {
+                throw new Exception(string.Format("托盘[{0}]调用WMS入库接口,反馈的对象为空。", param.ContainerBarCode));
+            }
+
+            if (reply.ResType)
+            {
+                if (string.IsNullOrWhiteSpace(reply.WMSTaskNum))
+                {
+                    errorMsg = string.Format("托盘[{0}]调用WMS入库接口,反馈的WMS任务号不能为空。", param.ContainerBarCode);
+                }
+                else if (string.IsNullOrWhiteSpace(reply.EndPostion))
+                {
+                    errorMsg = string.Format("托盘[{0}]调用WMS入库接口,反馈的目标地址不能为空。", param.ContainerBarCode);
+                }
+                else if (string.IsNullOrWhiteSpace(reply.EndPostion))
+                {
+                    errorMsg = string.Format("托盘[{0}]调用WMS入库接口,反馈的目标地址不能为空。", param.ContainerBarCode);
+                }
+                else if (string.IsNullOrWhiteSpace(reply.WareHouseName))
+                {
+                    errorMsg = string.Format("托盘[{0}]调用WMS入库接口,反馈的仓库名称不能为空。", param.ContainerBarCode);
+                }
+                else if (reply.TASK_WEIGHT < 1 && param.EquipmentNo == "1390")
+                {
+                    errorMsg = string.Format("料箱[{0}]调用WMS入库接口,反馈的重量要大于0。", param.ContainerBarCode);
+                }
+                else if (reply.TASK_STACKINGTYPE < 1 && param.EquipmentNo == "1390")
+                {
+                    errorMsg = string.Format("料箱[{0}]调用WMS入库接口,反馈的垛型要大于0。", param.ContainerBarCode);
+                }
+                //else if (string.IsNullOrWhiteSpace(reply.Memo1) && param.EquipmentNo == "1200" && param.ContainerBarCode.Contains("TPA"))
+                //{
+                //    errorMsg = string.Format("托盘[{0}]18#调用WMS入库接口,反馈的是否缠膜不能为空。", param.ContainerBarCode);
+                //}
+                else if (!string.IsNullOrWhiteSpace(param.Memo1))
+                {
+                    if (string.IsNullOrWhiteSpace(reply.TunnelNum) || reply.TunnelNum.Trim() == "0")
+                    {
+                        errorMsg = string.Format("托盘[{0}]调用WMS入库接口,没有返回巷道。", param.ContainerBarCode);
+                    }
+                    if (param.Memo1.Trim() == "2")
+                    {
+                        if (reply.EndPostion.Length < 10)
+                        {
+                            errorMsg = string.Format("托盘[{0}]调用WMS入库接口,没有分配货位。", param.ContainerBarCode);
+                        }
+                    }
+                    else if (param.Memo1.Trim() == "1")
+                    {
+                    }
+                    else
+                    {
+                        errorMsg = string.Format("托盘[{0}]调用WMS入库接口传递参数Memo1[{1}]错误.", param.ContainerBarCode, param.Memo1);
+                    }
+                }
+            }
+            else
+            {
+                if (reply == null)
+                {
+                    errorMsg = string.Format("托盘[{0}]调用WMS入库接口,反馈的对象为空。", param.ContainerBarCode);
+                }
+                else
+                {
+                    errorMsg = string.Format("位置[{0}]生产编码[{1}]获取入库任务失败,反馈结果:[{2}]", param.EquipmentNo, param.ContainerBarCode, reply.ResMessage);
+                }
+            }
+            return errorMsg;
+        }
+
         /// <summary>
         /// 获取入库任务
         /// </summary>
@@ -1157,6 +1363,24 @@ namespace WCS.PLC
             return task;
         }
 
+        private static List<string> TrayList_1 = new List<string>();
+
+        public static WCS_TASK GetWcsExeTask(GetExeTaskParam param)
+        {
+            WCS_TASK task = null;
+            if (TrayList_1.Contains(param.ContainerBarCode))
+            {
+                Log4netHelper.Logger_Info.InfoFormat("托盘[{0}]方法[GetExeTask]调用失败,WMS接口[I_WCS_GetExeTask]调用正在执行中", param.ContainerBarCode);
+            }
+            else
+            {
+                TrayList_1.Add(param.ContainerBarCode);
+                task = GetExeTask(param);
+                TrayList_1.Remove(param.ContainerBarCode);
+            }
+            return task;
+        }
+
         private static List<string> AgvTaskNoSet = new List<string>();
 
         /// <summary>

+ 2 - 0
WCS.Service/appsettings.json

@@ -51,6 +51,8 @@
     "GetWeight": "http://192.168.249.101:8006/api/Task/I_WCS_GetWeight",
     //上传连续熟化开始结束时间
     "GetMatureContinueMode": "http://192.168.249.101:8006/api/Task/I_WCS_GetMatureContinueMode",
+    //缠膜机禁用时获取排出到车间任务
+    "GetExeTask": "http://192.168.249.101:8006/api/Task/IsStartWrappingmachine",
     //入库位置是否补空料箱
     "IsOutEmptyBox": false,
     "TaskStatusUpdateConNoStr": "1133,1140,1142,1215,1216,1217,1218,1199,1168,1169,1170,1171",

+ 57 - 1
WCS.WMSWorkflow/Contracts/WMS_API.cs

@@ -22,7 +22,7 @@ namespace WCS.WMSWorkflow
             try
             {
                 DateTime startDateTime = DateTime.Now;
-                Log4netHelper.Logger_Info.Info(string.Format("开始:WCS调用WMS接口函数I_WCS_GetInTask。参数:[{0}]", WebApiHelper.GetJson(param)));
+                Log4netHelper.Logger_Info.Info(string.Format("开始:WCS开始调用WMS接口函数I_WCS_GetInTask。参数:[{0}]", WebApiHelper.GetJson(param)));
           
                 //调用WMS接口
                 reply = (GetInTaskReply)MethodOutTimeHelper.OutTimeSomeParemReturn(WCS_GetInTask, AppSettingsHelper.AppSettings.MethodOutTimeMilliseconds, param);
@@ -71,6 +71,62 @@ namespace WCS.WMSWorkflow
             }
             return reply;
         }
+
+        public GetExeTaskReply I_WCS_GetExeTask(GetExeTaskParam param)
+        {
+            GetExeTaskReply reply = null;
+            try
+            {
+                DateTime startDateTime = DateTime.Now;
+                Log4netHelper.Logger_Info.Info(string.Format("开始:WCS调用WMS接口函数I_WCS_GetExeTask。参数:[{0}]", WebApiHelper.GetJson(param)));
+
+                //调用WMS接口
+                reply = (GetExeTaskReply)MethodOutTimeHelper.OutTimeSomeParemReturn(WCS_GetExeTask, AppSettingsHelper.AppSettings.MethodOutTimeMilliseconds, param);
+
+                //JObject jobj = WebApiHelper.SendInfoToWebAPI(AppSettingsHelper.AppSettings.GetInTask, "", "Post", ja);
+                //reply = WebApiHelper.ParseFromJson<GetInTaskReply>(jobj.ToString());
+                if (reply == null)
+                {
+                    //reply = new GetInTaskReply();
+                    //throw new Exception(string.Format("结束:WCS调用WMS接口函数I_WCS_GetInTask。参数:[{0}]反馈结果:[接口报错或接口超时]", WebApiHelper.GetJson(param)));
+                    //throw new Exception("访问网络超时");
+                }
+                else
+                {
+                    Log4netHelper.Logger_Info.Info(string.Format("结束:WCS调用WMS接口函数I_WCS_GetExeTask。参数:[{0}]反馈结果:[{1}]", WebApiHelper.GetJson(param), WebApiHelper.GetJson(reply)));
+                }
+                DateTime endDateTime = DateTime.Now;
+                if (startDateTime.AddSeconds(30) < endDateTime)
+                {
+                    string message = string.Format("WCS调用WMS接口函数I_WCS_GetExeTask超过30秒,调用开始时间:[{0}]调用结束时间[{1}]参数[{2}]", startDateTime.ToString("yyyy-MM-dd HH:mm:ss"), endDateTime.ToString("yyyy-MM-dd HH:mm:ss"), WebApiHelper.GetJson(param));
+                    //接口超时30秒以上
+                    LogMessageHelper.RecordLogMessage(message);
+                }
+            }
+            catch (Exception ex)
+            {
+                Log4netHelper.Logger_Error.ErrorFormat(ex.ToString());
+                reply.ResMessage = ex.Message;
+            }
+            return reply;
+        }
+        private object WCS_GetExeTask(object obj)
+        {
+            GetExeTaskReply reply = null;
+            try
+            {
+                var param = obj as GetExeTaskParam;
+                JArray ja = new JArray();
+                ja.Add(WebApiHelper.GetJson(param));
+                JObject jobj = WebApiHelper.SendInfoToAPI(AppSettingsHelper.AppSettings.GetExeTask, "", "Post", ja);
+                reply = WebApiHelper.ParseFromJson<GetExeTaskReply>(jobj.ToString());
+            }
+            catch (Exception ex)
+            {
+                LogMessageHelper.RecordLogMessage(ex);
+            }
+            return reply;
+        }
         public GetMoveTaskReply I_WCS_GetMoveTask(GetMoveTaskParam param)
         {
             GetMoveTaskReply reply = null;

+ 5 - 0
WCS.WMSWorkflow/Contracts/WMS_InBuilt.cs

@@ -17,6 +17,11 @@ namespace WCS.WMSWorkflow
             throw new NotImplementedException();
         }
 
+        public GetExeTaskReply I_WCS_GetExeTask(GetExeTaskParam param)
+        {
+            throw new NotImplementedException();
+        }
+
         public GetMoveTaskReply I_WCS_GetMoveTask(GetMoveTaskParam param)
         {
             throw new NotImplementedException();

+ 5 - 0
WCS.WMSWorkflow/IContracts/IWMS.cs

@@ -28,6 +28,11 @@ namespace WCS.WMSWorkflow
         /// 获取入库任务
         /// </summary>
         GetInTaskReply I_WCS_GetInTask(GetInTaskParam param);
+
+        /// <summary>
+        /// 获取排往18车间任务
+        /// </summary>
+        GetExeTaskReply I_WCS_GetExeTask(GetExeTaskParam param);
         /// <summary>
         /// 上传设备异常信息
         /// </summary>

+ 30 - 10
WCS.Workflow/ConvPlc02.cs

@@ -804,6 +804,8 @@ namespace WCS.Workflow
 
                     var cv_1401 = ConveyorHelper.GetConveyorSignal("conveyor03", "1401");
                     var cv_1416 = ConveyorHelper.GetConveyorSignal("conveyor03", "1416");
+                    //获取缠膜机是否屏蔽信号
+                    var cv_1205 = ConveyorHelper.GetConveyorSignal("conveyor02", "1205");
 
                     if ((cv_1401.DB521_Request && cv_1401.DB521_Goodsend.ToString() == convNo) ||
                         (cv_1416.DB521_Request && cv_1416.DB521_Goodsend.ToString() == convNo))
@@ -816,19 +818,37 @@ namespace WCS.Workflow
                     var taskitem = SugarBase.DB.Queryable<WCS_TASK>().Single(v => v.TASK_BOXBARCODE == barcode && v.TASK_POSIDFROM == convNo && v.TASK_WKSTATUS <= 1);
                     if (taskitem == null)
                     {
-                        Log4netHelper.Logger_Info.InfoFormat(string.Format("码垛位置[{0}]条码[{1}]获取到机械手传递的高度是否超过1.7[{2}]", convNo, barcode, equ_conv.DB521_Res01));
+                        Log4netHelper.Logger_Info.InfoFormat(string.Format("码垛位置[{0}]条码[{1}]获取到机械手传递的高度是否超过1.70[{2}]", convNo, barcode, equ_conv.DB521_Res01));
 
                         int contype = equ_conv.DB521_Res01 ? 2 : 1;
-                        var param = new GetInTaskParam()
+                        //检测到缠膜机禁用时获取排往18车间的任务
+                        if(cv_1205.DB521_Overload && (convNo == "1252"  || convNo == "1258"))
                         {
-                            ContainerBarCode = barcode,
-                            ContainerType = contype,
-                            MatBarCode = string.Empty,
-                            WareHouseId = Current.Pvchouseputong,
-                            EquipmentNo = convNo,
-                            EndPostion = "srm"
-                        };
-                        task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param);
+                            var param = new GetExeTaskParam()
+                            {
+                                ContainerBarCode = barcode,
+                                ContainerType = contype,
+                                MatBarCode = string.Empty,
+                                WareHouseId = Current.Pvchouseputong,
+                                EquipmentNo = convNo,
+                                EndPostion = "srm",
+                                IsBan = true                             
+                            };
+                            task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsExeTask, param);
+                        }
+                        else
+                        {
+                            var param = new GetInTaskParam()
+                            {
+                                ContainerBarCode = barcode,
+                                ContainerType = contype,
+                                MatBarCode = string.Empty,
+                                WareHouseId = Current.Pvchouseputong,
+                                EquipmentNo = convNo,
+                                EndPostion = "srm"
+                            };
+                            task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param);
+                        }                        
                     }
                     else
                     {