using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using Newtonsoft.Json.Linq; using SqlSugar; using WCS.Data; using WCS.Data.Models; using WCS.Data.Utils; using WCS.PLC.Model.Equipment; using WCS.WMSWorkflow; using static WCS.WMSWorkflow.ApiParam; namespace WCS.PLC { public class BaseWorkflow { private static int _putTaskStep = 0; #region private Method public static void MoveTaskToDis(WCS_TASK task) { TryCachHelper.TryTranExecute((db) => { //添加机械手码垛位置条码信息 var sysset = Current.SysSets.SingleOrDefault(v => v.SET_TYPE == "PalletizingPos" && v.SET_ID == task.TASK_POSIDTO && task.TASK_POSIDFROM != "1390"); if (sysset != null) { string time = DateTime.Now.ToString("yyyyMMddhhmmss"); db.Updateable(it => new WCS_SYSSET() { SET_MEMO = task.TASK_BOXBARCODE, SET_EDITUSERNO = "wcs", SET_EDITTIME = time }) .Where(it => it.SET_ID == sysset.SET_ID).ExecuteCommand(); } //移动任务到历史列表 var task_dis = ExtendsUtil.Mapper(task); task_dis.TASK_DELETEUSER = "wcs"; task_dis.TASK_DELETEDATE = db.GetDate(); if (db.Insertable(task_dis).ExecuteCommand() <= 0) { throw new Exception(string.Format("任务[{0}]插入历史列表失败", task_dis.TASK_NO)); } var taskdtlSet = db.Queryable().Where(v => v.PARENTID == task.TASK_NO).ToList(); foreach (var taskdtl in taskdtlSet) { var task_dis_dtl = ExtendsUtil.Mapper(taskdtl); if (db.Insertable(task_dis_dtl).ExecuteCommand() <= 0) { throw new Exception(string.Format("任务[{0}]明细插入到历史列表失败", task_dis.TASK_NO)); } if (db.Deleteable(taskdtl).ExecuteCommand() <= 0) { throw new Exception(string.Format("任务[{0}]明细删除失败", task_dis.TASK_NO)); } } //删除当前任务 if (db.Deleteable(task).ExecuteCommand() <= 0) { throw new Exception(string.Format("任务[{0}]删除失败", task_dis.TASK_NO)); } }); } public static void MoveAgvTaskToDis(Middle_AGVTask task) { TryCachHelper.TryTranExecute((db) => { //移动任务到历史列表 var task_dis = ExtendsUtil.Mapper(task); task_dis.Task_FinishDate = db.GetDate(); if (db.Insertable(task_dis).ExecuteCommand() <= 0) { throw new Exception(string.Format("任务[{0}]插入历史列表失败", task_dis.Task_Id)); } //删除当前任务 if (db.Deleteable(task).ExecuteCommand() <= 0) { throw new Exception(string.Format("任务[{0}]删除失败", task_dis.Task_Id)); } }); } #endregion; #region public Method /// /// 更新任务进程 /// public static void PutTaskStep() { if (Interlocked.Exchange(ref _putTaskStep, 1) == 0) { try { var tasks =SugarBase.DB.Queryable().Where(v => v.TASK_WKSTATUS >= 1).ToList(); var agvtasks = Current.AgvTaskSet.Where(v => v.Task_WcsStatus == 106 || v.Task_WcsStatus == 99 || v.Task_WcsStatus == 4).ToList(); if (tasks.Count == 0 && agvtasks.Count == 0) return; var tasks_NoFinish = tasks.Where(v => v.TASK_WKSTATUS < 99 && v.TASK_COMTYPE != 6 && (v.TASK_POSIDTO != "1288") && (v.TASK_POSIDTO != "1293")).ToList(); if (tasks_NoFinish.Count > 0) { var PutTaskStepList = Current.WmsInterface.I_WCS_PutTaskStep(tasks_NoFinish); foreach (var item in PutTaskStepList) { var task = tasks.FirstOrDefault(v => v.TASK_WMSNO == item.WMSTaskNum); if (!item.ResType) { string msg = string.Format("任务[{0}]更新进程失败,原因:[{1}]", task.TASK_NO, item.ResMessage); LogMessageHelper.RecordLogMessage(msg); } } } var tasks_Finish = tasks.Where(v => v.TASK_WKSTATUS >= 99 && (v.TASK_POSIDTO != "1508") && (v.TASK_POSIDTO != "1509")&& (v.TASK_POSIDTO != "1288") && (v.TASK_POSIDTO != "1293")).ToList(); if (tasks_Finish.Count > 0) { var PutTaskStepList_finish = Current.WmsInterface.I_WCS_PutTaskStep(tasks_Finish); foreach (var item in PutTaskStepList_finish) { var task = tasks.FirstOrDefault(v => v.TASK_WMSNO == item.WMSTaskNum); if (item.ResType) { if (task.TASK_WKSTATUS >= 99) { MoveTaskToDis(task); } } else { string msg = string.Format("任务[{0}]更新进程失败,原因:[{1}]", task.TASK_NO, item.ResMessage); LogMessageHelper.RecordLogMessage(msg); } } } var task_Finish2 = tasks.FirstOrDefault(v => v.TASK_WKSTATUS >= 99 && v.TASK_POSIDTO == "1508"); if (task_Finish2 != null) { var tasks_Finishs = new List(); tasks_Finishs.Add(task_Finish2); var PutTaskStepList_finish = Current.WmsInterface.I_WCS_PutTaskStep(tasks_Finishs); foreach (var item in PutTaskStepList_finish) { var task = tasks.FirstOrDefault(v => v.TASK_WMSNO == item.WMSTaskNum); if (item.ResType) { if (task.TASK_WKSTATUS >= 99) { if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE == task_Finish2.TASK_BOXBARCODE && v.TASK_COMTYPE == 1)) { MoveTaskToDis(task); } } } else { string msg = string.Format("任务[{0}]更新进程失败,原因:[{1}]", task.TASK_NO, item.ResMessage); LogMessageHelper.RecordLogMessage(msg); } } } var task_Finish3 = tasks.FirstOrDefault(v => v.TASK_WKSTATUS >= 99 && v.TASK_POSIDTO == "1509"); if (task_Finish3 != null) { var tasks_F = new List(); tasks_F.Add(task_Finish3); var PutTaskStepList_finish = Current.WmsInterface.I_WCS_PutTaskStep(tasks_F); foreach (var item in PutTaskStepList_finish) { var task = tasks.FirstOrDefault(v => v.TASK_WMSNO == item.WMSTaskNum); if (item.ResType) { if (task.TASK_WKSTATUS >= 99) { if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE == task_Finish3.TASK_BOXBARCODE && v.TASK_COMTYPE == 1)) { MoveTaskToDis(task); } } } else { string msg = string.Format("任务[{0}]更新进程失败,原因:[{1}]", task.TASK_NO, item.ResMessage); LogMessageHelper.RecordLogMessage(msg); } } } var tasks_Exception = tasks.Where(v => v.TASK_WKSTATUS >= 99 && (v.TASK_COMTYPE == 6 || v.TASK_POSIDTO == "1288" || v.TASK_POSIDTO == "1293")).ToList(); foreach (var item in tasks_Exception) { MoveTaskToDis(item); } foreach (var item in agvtasks) { if (item.Task_WcsStatus == 99 || item.Task_WcsStatus == 4) { //if (item.Task_Type == 3 || (item.Task_Type == 1 && (item.Task_WorkshopNo == "18" || item.Task_WorkshopNo == "4" || item.Task_WorkshopNo == "5"))) if (item.Task_Type == 3 || (item.Task_Type == 1 && item.Task_WorkshopNo == "18")) { var wcstask = Current.TaskSet.SingleOrDefault(v => v.TASK_ITEM8 == item.Task_Id.ToString()); if (wcstask == null || wcstask.TASK_WKSTATUS >= 99) { if (item.Task_WcsStatus == 99) MoveAgvTaskToDis(item);//任务完成 continue; } wcstask.TASK_WKSTATUS = 99; wcstask.TASK_EDITUSERNO = "wcs"; wcstask.TASK_EDITDATETIME = DateTime.Now; int updateresult = SugarBase.DB.Updateable(wcstask) .UpdateColumns(it => new { it.TASK_WKSTATUS, it.TASK_EDITUSERNO, it.TASK_EDITDATETIME }) .ExecuteCommand(); if (updateresult <= 0) { LogMessageHelper.RecordLogMessage(string.Format("空熟化架呼叫AGV任务[{0}]已完成,完成WCS任务[{1}]失败。", item.Task_Id, wcstask.TASK_NO)); continue; } else { if (item.Task_WcsStatus == 99) MoveAgvTaskToDis(item);//任务完成 } } else if (item.Task_Type == 1 || item.Task_Type == 2 || item.Task_Type == 4) { if (item.Task_WcsStatus == 99) MoveAgvTaskToDis(item);//任务完成 } } else if (item.Task_WcsStatus == 106 && item.Task_AgvStatus == 106) { MoveAgvTaskToDis(item);//任务完成 } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } finally { Interlocked.Exchange(ref _putTaskStep, 0); } } } public static WCS_TASK GetInTask(GetInTaskParam param) { WCS_TASK wcstask = null; try { wcstask = SugarBase.DB.Queryable().First(v => v.TASK_BOXBARCODE == param.ContainerBarCode); if (wcstask == null) { var reply = Current.WmsInterface.I_WCS_GetInTask(param); string errormsg = CheckGetInTask(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)); } if (param.EquipmentNo == "1109" || param.EquipmentNo == "1114" || param.EquipmentNo == "1102" || param.EquipmentNo == "1094") { wcstask.TASK_MatureType = reply.TASK_MatureType; wcstask.TASK_MatureTemperat = reply.TASK_MatureTemperat; wcstask.TASK_MatureDate = reply.TASK_MatureDate; } 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; } public static bool WCS_GetOutTask(GetOutTaskParam param) { bool result = false; WCS_TASK wcstask = null; try { var reply = Current.WmsInterface.I_WCS_GetOutTask(param); if (reply.ResType) { if (!string.IsNullOrWhiteSpace(param.Memo1)) { if(param.Memo1.Trim()=="1") { var agvtask = Current.AgvTaskSet.FirstOrDefault(v => v.Task_Id.ToString() == param.OutId); if (agvtask != null) { DateTime dt = SugarBase.DB.GetDate(); int task_id = Convert.ToInt32(param.OutId); SugarBase.DB.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 5, Task_UpdateUser = "wcs", Task_UpdateDate = dt }) .Where(it => it.Task_Id == task_id).ExecuteCommand(); } result = true; return result; } } if (string.IsNullOrWhiteSpace(reply.WMSTaskNum)) { throw new Exception(string.Format("工位[{0}]申请出库任务反馈WMS任务号不能为空。", param.OutEndPostion)); } if (reply.TaskType <= 0) { throw new Exception(string.Format("工位[{0}]申请出库任务反馈任务类型必须大于零。", param.OutEndPostion)); } if (string.IsNullOrWhiteSpace(reply.OutWareCellNo)) { throw new Exception(string.Format("工位[{0}]申请出库任务反馈出库位置不能为空。", param.OutEndPostion)); } if (string.IsNullOrWhiteSpace(reply.WareHouseName)) { throw new Exception(string.Format("工位[{0}]申请出库任务反馈仓库不能为空。", param.OutEndPostion)); } if (string.IsNullOrWhiteSpace(reply.ContainerBarCode)) { throw new Exception(string.Format("工位[{0}]申请出库任务反馈条码编号不能为空。", param.OutEndPostion)); } if (reply.TaskType == 2 && string.IsNullOrWhiteSpace(reply.TunnelNum)) { throw new Exception(string.Format("工位[{0}]申请出库任务反馈巷道号不能为空。", param.OutEndPostion)); } if (reply.TASK_STACKINGTYPE <= 0 && (param.OutEndPostion == "1251" || param.OutEndPostion == "1261" || param.OutEndPostion == "1226" || param.OutEndPostion == "1234" || param.OutEndPostion == "1257" || param.OutEndPostion == "1252" || param.OutEndPostion == "1231" || param.OutEndPostion == "1258" || param.OutEndPostion == "1278" || param.OutEndPostion == "1283")) { throw new Exception(string.Format("工位[{0}]申请出库任务[1]垛型存在问题,传递值必须大于零。", param.OutEndPostion, reply.WMSTaskNum)); } if (string.IsNullOrWhiteSpace(reply.PalletizingBoxSize) && Convert.ToInt32(reply.PalletizingBoxSize) <= 0 && (param.OutEndPostion == "1251" || param.OutEndPostion == "1261" || param.OutEndPostion == "1226" || param.OutEndPostion == "1234" || param.OutEndPostion == "1257" || param.OutEndPostion == "1252" || param.OutEndPostion == "1231" || param.OutEndPostion == "1258" || param.OutEndPostion == "1278" || param.OutEndPostion == "1283")) { throw new Exception(string.Format("工位[{0}]申请出库任务[1]箱子尺寸存在问题,传递值必须大于零。", param.OutEndPostion, reply.WMSTaskNum)); } var task = SugarBase.DB.Queryable().First(v => v.TASK_WMSNO == reply.WMSTaskNum); if (task == null) { var agvtask = Current.AgvTaskSet.FirstOrDefault(v => v.Task_Id.ToString() == param.OutId); string msg = TryCachHelper.TryTranExecute((db) => { if (agvtask != null) { DateTime dt = db.GetDate(); int task_id = Convert.ToInt32(param.OutId); db.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 5, Task_UpdateUser = "wcs", Task_UpdateDate = dt }) .Where(it => it.Task_Id == task_id).ExecuteCommand(); } //添加wcs任务 wcstask = new WCS_TASK(); wcstask.TASK_WMSNO = reply.WMSTaskNum; wcstask.TASK_COMTYPE = reply.TaskType; wcstask.TASK_SYSTYPE = "WMS"; wcstask.TASK_POSIDFROM = reply.OutWareCellNo;//起点地址 wcstask.TASK_POSIDCUR = reply.OutWareCellNo; wcstask.TASK_POSIDNEXT = reply.OutWareCellNo; 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 = reply.ContainerBarCode; wcstask.TASK_POSIDTO = param.OutEndPostion; wcstask.TASK_PRIORITY = reply.Priority; wcstask.TASK_ITEM8 = param.OutId; wcstask.TASK_ITEM9 = reply.Memo4; wcstask.TASK_ITEM10 = reply.Memo5; wcstask.PalletizingSonTraySize = reply.PalletizingSonTraySize; wcstask.PalletizingBoxSize = reply.PalletizingBoxSize; wcstask.SonTrayColorNo = reply.SonTrayColorNo; wcstask.TASK_MatureDate = reply.MatureDateLength; wcstask.TASK_WEIGHT = reply.TASK_WEIGHT; wcstask.TASK_STACKINGTYPE = reply.TASK_STACKINGTYPE; if (param.TASK_MatureDate == 12 && wcstask.TASK_MatureDate == 48) { wcstask.MatureNum = 4; } else { wcstask.MatureNum = 1; } if (wcstask.TASK_BOXBARCODE.Substring(0, 2) == "SH") { wcstask.TASK_ITEM2 = "2"; } else if (wcstask.TASK_BOXBARCODE.Substring(0, 3) == "TPC") { wcstask.TASK_ITEM2 = "1"; } else { wcstask.TASK_ITEM2 = "3"; } if (string.IsNullOrWhiteSpace(reply.TunnelNum)) { //wcstask.TASK_SRMNO = reply.EndPostion; } else { wcstask.TASK_FromTunnelNum = reply.TunnelNum; wcstask.TASK_SRMNO = Current.SysSets.Where(v => v.SET_ID.Contains("Tunnel")).FirstOrDefault(v => v.SET_VALUE == reply.TunnelNum).SET_TYPE; } int id = db.Insertable(wcstask).ExecuteReturnIdentity(); if (id <= 0) { throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败", reply.WMSTaskNum)); } }); if (string.IsNullOrWhiteSpace(msg)) { result = true; } else { throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败,消息[{1}]", reply.WMSTaskNum, msg)); } } //var task = SugarBase.DB.Queryable().First(v => v.TASK_WMSNO == reply.WMSTaskNum); //if (task == null) //{ // //添加wcs任务 // wcstask = new WCS_TASK(); // wcstask.TASK_WMSNO = reply.WMSTaskNum; // wcstask.TASK_COMTYPE = reply.TaskType; // wcstask.TASK_SYSTYPE = "WMS"; // wcstask.TASK_POSIDFROM = reply.OutWareCellNo;//起点地址 // wcstask.TASK_POSIDCUR = reply.OutWareCellNo; // wcstask.TASK_POSIDNEXT = reply.OutWareCellNo; // 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 = reply.ContainerBarCode; // wcstask.TASK_POSIDTO = param.OutEndPostion; // wcstask.TASK_PRIORITY = reply.Priority; // wcstask.TASK_ITEM8 = param.OutId; // wcstask.TASK_ITEM9 = reply.Memo4; // wcstask.TASK_ITEM10 = reply.Memo5; // if (wcstask.TASK_BOXBARCODE.Substring(0, 2) == "SH") // { // wcstask.TASK_ITEM2 = "2"; // } // else if (wcstask.TASK_BOXBARCODE.Substring(0, 3) == "TPC") // { // wcstask.TASK_ITEM2 = "1"; // } // else // { // wcstask.TASK_ITEM2 = "3"; // } // if (string.IsNullOrWhiteSpace(reply.TunnelNum)) // { // //wcstask.TASK_SRMNO = reply.EndPostion; // } // else // { // wcstask.TASK_FromTunnelNum = reply.TunnelNum; // wcstask.TASK_SRMNO = Current.SysSets.Where(v => v.SET_ID.Contains("Tunnel")).FirstOrDefault(v => v.SET_VALUE == reply.TunnelNum).SET_TYPE; // } // int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity(); // if (id <= 0) // { // throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败", reply.WMSTaskNum)); // } // else // { // result = true; // } //} } else { var msg = string.Format("目标位置[{0}]获取出库任务失败,原因:[{1}]", param.OutEndPostion, reply.ResMessage); throw new Exception(msg); } } catch (Exception ex) { AddLedErrorMsg(param.OutEndPostion, ex.Message, 0); LogMessageHelper.RecordLogMessage(ex); } return result; } private static string CheckGetInTask(GetInTaskParam param, GetInTaskReply 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; } /// /// 获取入库任务 /// /// public static WCS_TASK GetInTask_2(GetInTaskParam param) { WCS_TASK wcstask = null; try { if(!string.IsNullOrWhiteSpace(param.ContainerBarCode)) { wcstask = SugarBase.DB.Queryable().First(v => v.TASK_BOXBARCODE == param.ContainerBarCode); } if (wcstask == null) { var reply = Current.WmsInterface.I_WCS_GetInTask(param); if (reply.ResType) { if (string.IsNullOrWhiteSpace(reply.EndPostion)) { throw new Exception(string.Format("托盘[{0}]调用WMS入库接口返回成功,但是没有返回目标地址。", reply.EndPostion)); } //添加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; if (string.IsNullOrWhiteSpace(param.Memo1)) { wcstask.TASK_POSIDTO = reply.EndPostion; wcstask.TASK_SRMNO = reply.EndPostion; } else if (param.Memo1.Trim() == "1") { if (string.IsNullOrWhiteSpace(reply.TunnelNum) || reply.TunnelNum.Trim() == "0") { throw new Exception(string.Format("托盘[{0}]申请入库没有分配巷道,生成WCS任务失败。", param.ContainerBarCode)); } else { string srmno = string.Empty; wcstask.TASK_EndTunnelNum = ConveyorHelper.QueryTunnel(wcstask.TASK_WMSNO, param.EquipmentNo, out srmno); wcstask.TASK_POSIDTO = wcstask.TASK_EndTunnelNum; 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 { string msg = string.Format("位置[{0}]条码[{1}]获取入库任务失败,反馈结果:[{2}]",param.EquipmentNo, param.ContainerBarCode, reply.ResMessage); LogMessageHelper.RecordLogMessage(msg); } } } catch (Exception ex) { //ThreadHelper.TaskThread(UploadExcTask, new { EquipmentNo = param.EquipmentNo, Alaram = ex.Message }); LogMessageHelper.RecordLogMessage(ex); } return wcstask; } /// /// 上传设备异常信息 /// //public static void UploadExcTask(UploadExcTaskParam param) //{ // try // { // Log4netHelper.Logger_Info.InfoFormat(string.Format("开始:输送线[{0}]报警信息[{1}]上传WMS。", param.EquipmentNo, param.ExcMessage)); // var reply = Current.WmsInterface.I_WCS_UploadExcTask(param); // if (reply.ResType) // { // Log4netHelper.Logger_Info.InfoFormat(string.Format("成功:输送线[{0}]报警信息[{1}]上传WMS。", param.EquipmentNo, param.ExcMessage)); // } // else // { // throw new Exception(string.Format("失败:输送线[{0}]报警信息[{1}]上传WMS。原因:[{2}]", param.EquipmentNo, param.ExcMessage, reply.ResMessage)); // } // } // catch (Exception ex) // { // Log4netHelper.Logger_Error.ErrorFormat(ex.ToString()); // } // finally // { // Log4netHelper.Logger_Info.InfoFormat(string.Format("结束:输送线[{0}]报警信息[{1}]上传WMS。", param.EquipmentNo, param.ExcMessage)); // } //} /// /// 添加异常信息 /// /// /// /// /// public static void AddLedErrorMsg(SqlSugarClient db, string equipmentNo, string alaram, int task_no, int alaramCount = 10) { int wmstask_no = 0; var task = db.Queryable().First(v => v.TASK_NO == task_no); if (task != null) { wmstask_no = Convert.ToInt32(task.TASK_WMSNO); } CommonData.AddLedErrorMsg(db, equipmentNo, alaram, task_no, wmstask_no, alaramCount); } /// /// 添加异常信息 /// /// /// /// /// public static void AddLedErrorMsg(string equipmentNo, string alaram, int task_no) { int wmstask_no = 0; var task = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == task_no); if (task != null) { wmstask_no = Convert.ToInt32(task.TASK_WMSNO); } TryCachHelper.TryExecute((db) => { CommonData.AddLedErrorMsg(db, equipmentNo, alaram, task_no, wmstask_no); }); } private static int _upLoadExcToWMS = 0; /// /// 上传设备异常信息 /// public static void UpLoadExcToWMS() { if (Interlocked.Exchange(ref _upLoadExcToWMS, 1) == 0) { string result = TryCachHelper.TryExecute((db) => { var ExcMsg = db.Queryable().First(v => v.LED_ISUPLOADWMSFINISH == false); if (ExcMsg != null) { var param = new UploadExcTaskParam(); param.OutId = ExcMsg.LED_ID; param.EquipmentNo = ExcMsg.LED_CONVYORNO; param.WCSTaskNum = ExcMsg.LED_WCSTASK_NO.ToString(); param.WMSTaskNum = ExcMsg.LED_WMSTASK_NO.ToString(); param.ExcCode = ExcMsg.LED_ALARMSMSG; param.ExcMessage = ExcMsg.LED_ALARMSMSG; var reply = Current.WmsInterface.I_WCS_UploadExcTask(param); if (reply.ResType) { //修改上传完成 db.Updateable(it => new WCS_LEDALARMSMSG() { LED_ISUPLOADWMSFINISH = true, LED_UPDATETIME = DateTime.Now }) .Where(it => it.LED_ID == ExcMsg.LED_ID) .ExecuteCommand(); } } }); Interlocked.Exchange(ref _upLoadExcToWMS, 0); } } private static int _putDevInfoToWMS = 0; /// /// 上传设PLC备信息 /// public static void PutDevInfoToWMS() { if (Interlocked.Exchange(ref _putDevInfoToWMS, 1) == 0) { Thread.Sleep(2000); string result = TryCachHelper.TryTranExecute((db) => { List DevList = new List(); //var EquState = db.Queryable().Where(v => v.Equ_Type == "srm").ToList(); var EquState = Current.PlcSet.Where(v => v.PLC_EQUIPMENTTYPE == "srm" && v.PLC_WCSSYSTEM == Current.WcsSystem).ToList(); foreach (var item in EquState) { var srmState = item.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item.PLC_NAME); var param = new PutDevInfoParam(); param.STA_EQUIPMENTNO = item.PLC_NAME; if (!string.IsNullOrWhiteSpace(srmState.EquSignal_Srm.SrmFault)) { param.STA_ALARMS = string.Format("设备[{0}][{1}]", item.PLC_NAME, srmState.EquSignal_Srm.SrmFault); param.STA_ALARMSMSG = string.Format("设备[{0}][{1}]", item.PLC_NAME, srmState.EquSignal_Srm.SrmFault); } param.STA_DATA = srmState.EquSignal_Srm.ToJson(); DevList.Add(param); } var convStatue = Current.PlcSet.Where(v => v.PLC_EQUIPMENTTYPE != "srm" && v.PLC_WCSSYSTEM == Current.WcsSystem).ToList(); foreach (var item in convStatue) { foreach (var equinfo in item.WCS_EquipmentInfoSet) { var param = new PutDevInfoParam(); if (equinfo.Equ_Type == EquipmentType.conveyor.ToString()) { param.STA_EQUIPMENTNO = equinfo.Equ_No; string alarms = equinfo.EquSignal_Conv.ConvFault.ToString(); if (string.IsNullOrWhiteSpace(alarms) == false && alarms != "0") { param.STA_ALARMS = string.Format("设备[{0}][{1}]", equinfo.Equ_No, alarms); param.STA_ALARMSMSG = string.Format("设备[{0}][{1}]", equinfo.Equ_No, alarms); } } else if (equinfo.Equ_Type == EquipmentType.rgv.ToString()) { param.STA_EQUIPMENTNO = equinfo.Equ_No; string alarmagv= equinfo.EquSignal_Rgv.AlarmFault; if (string.IsNullOrWhiteSpace(alarmagv) == false && alarmagv != "0") { param.STA_ALARMS = string.Format("设备[{0}][{1}]", equinfo.Equ_No, alarmagv); param.STA_ALARMSMSG = string.Format("设备[{0}][{1}]", equinfo.Equ_No, alarmagv); } } DevList.Add(param); } } var reply = Current.WmsInterface.I_WCS_PutDevInfo(DevList); string resMessage = "接口返回Null"; if (reply != null) resMessage = reply.ResMessage; if (reply == null || reply.ResType == false) { LogMessageHelper.RecordLogMessage(string.Format("上传设备PLC信息失败,原因:[{0}]。", resMessage)); } }); Interlocked.Exchange(ref _putDevInfoToWMS, 0); } } /// /// 称重上传 /// /// public static bool GetWeight(GetWeightParam param) { bool result = true; try { var reply = Current.WmsInterface.I_WCS_GetWeight(param); if (reply.ResType) { var task = Current.TaskSet.FirstOrDefault(v => v.TASK_WMSNO == param.WMSTaskNum); //修改任务,添加重量 string resultmsg = TryCachHelper.TryTranExecute((db) => { db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 2, TASK_GrossWeight = param.Weight, TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand(); string msg = string.Format("称重任务[{0}]已称重,重量[{1}]克。", task.TASK_NO, param.Weight); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDNEXT, msg); }); if (!string.IsNullOrWhiteSpace(resultmsg)) { throw new Exception(resultmsg); } } else { string error = string.Format("任务[{0}]重量[{1}]上传失败,原因:[{2}]", param.WMSTaskNum, param.Weight, reply.ResMessage); throw new Exception(error); } } catch (Exception ex) { result = false; LogMessageHelper.RecordLogMessage(ex.Message, ex); } return result; } #region WMS接口调用 static List AssignSrmTaskNoSet = new List(); public static void AssignSrm(WCS_TASK task) { if (AssignSrmTaskNoSet.Contains(task.TASK_NO)) { Log4netHelper.Logger_Info.InfoFormat("任务[{0}]方法[AssignSrm]调用失败,WMS接口[I_WCS_GetTunnelList]调用正在执行中", task.TASK_NO); } else { AssignSrmTaskNoSet.Add(task.TASK_NO); ConveyorHelper.AssignSrm(task); AssignSrmTaskNoSet.Remove(task.TASK_NO); } } static List PreparatoryAssignSrmTaskNoSet = new List(); public static void PreparatoryAssignSrmTunnel(WCS_TASK task) { if (PreparatoryAssignSrmTaskNoSet.Contains(task.TASK_NO)) { Log4netHelper.Logger_Info.InfoFormat("任务[{0}]方法[AssignSrm]调用失败,WMS接口[I_WCS_GetTunnelList]调用正在执行中", task.TASK_NO); } else { PreparatoryAssignSrmTaskNoSet.Add(task.TASK_NO); ConveyorHelper.PreparatoryAssignSrmTunnel(task); PreparatoryAssignSrmTaskNoSet.Remove(task.TASK_NO); } } static List TrayList = new List(); public static WCS_TASK GetWcsInTask(GetInTaskParam param) { WCS_TASK task = null; if (TrayList.Contains(param.ContainerBarCode)) { Log4netHelper.Logger_Info.InfoFormat("托盘[{0}]方法[GetInTask]调用失败,WMS接口[I_WCS_GetInTask]调用正在执行中", param.ContainerBarCode); } else { TrayList.Add(param.ContainerBarCode); task = GetInTask(param); TrayList.Remove(param.ContainerBarCode); } return task; } static List AgvTaskNoSet = new List(); public static void GetOutTask(GetOutTaskParam param) { if (AgvTaskNoSet.Contains(param.OutId)) { Log4netHelper.Logger_Info.InfoFormat("呼叫位置[{0}]方法[GetOutTask]调用失败,WMS接口[I_WCS_GetOutTask]调用正在执行中", param.OutEndPostion); } else { AgvTaskNoSet.Add(param.OutId); WCS_GetOutTask(param); AgvTaskNoSet.Remove(param.OutId); } } static List GetWeightSet = new List(); public static void ProInGetWeight(GetWeightParam param) { if (GetWeightSet.Contains(param.WMSTaskNum)) { Log4netHelper.Logger_Info.InfoFormat("任务[{0}]调用方法[GetWeight]调用失败,WMS接口[I_WCS_GetWeight]调用正在执行中", param.WMSTaskNum); } else { GetWeightSet.Add(param.WMSTaskNum); GetWeight(param); GetWeightSet.Remove(param.WMSTaskNum); } } #endregion; private static int _putUpdateUnexecuteTask = 0; /// /// 更新未执行任务 /// public static void UpdateUnexecuteTask() { if (Interlocked.Exchange(ref _putUpdateUnexecuteTask, 1) == 0) { Thread.Sleep(90000); try { TryCachHelper.TryExecute((db) => { //更新每台堆垛机未执行任务数量 var srmName = db.Queryable().Where(v => v.PLC_EQUIPMENTTYPE == "srm").ToList(); foreach (var item in srmName) { var taskSRMCount = db.Queryable().Where(v => (v.TASK_WKSTATUS == 0 || v.TASK_WKSTATUS == 1 || v.TASK_WKSTATUS == 5) && v.TASK_SRMNO == item.PLC_NAME).ToList(); //更新未执行任务数量 db.Updateable(it => new WCS_PLC() { PLC_UNEXECUTETASK = taskSRMCount.Count }).Where(it => it.PLC_NAME == item.PLC_NAME).ExecuteCommand(); } var rgvName = db.Queryable().Where(v => v.PLC_EQUIPMENTTYPE == "rgv").ToList(); foreach (var item in rgvName) { var OutInMat = db.Queryable().Where(v => v.RGVOUTIN_RGVNO == item.PLC_NAME && (v.RGVOUTIN_OUTINTYPE == "OnMat" || v.RGVOUTIN_OUTINTYPE == "OnUpMat")).Select(v => v.RGVOUTIN_CONVNO).ToList(); var taskRGVCount = db.Queryable().Where(v => (OutInMat.Contains(v.TASK_POSIDCUR) && v.TASK_POSIDCUR == v.TASK_POSIDNEXT) || (v.TASK_WKSTATUS == 7 && v.TASK_RGVNO == item.PLC_NAME)).ToList(); db.Updateable(it => new WCS_PLC() { PLC_UNEXECUTETASK = taskRGVCount.Count }).Where(it => it.PLC_NAME == item.PLC_NAME).ExecuteCommand(); } }); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } finally { Interlocked.Exchange(ref _putTaskStep, 0); } } } #endregion; } }