using System; using System.Collections.Generic; using System.Linq; using System.Text; using WCS.Data; using WCS.Data.Models; using WCS.Data.Utils; using WCS.PLC; using WCS.PLC.Model.Equipment; namespace WCS.Workflow { public class ConvPlc03 : Base_Conv { #region 只读变量 private readonly string Conv_1390 = "1390"; private readonly string Conv_1418 = "1418"; private readonly string Conv_1401 = "1401"; private readonly string Conv_1416 = "1416"; #endregion; public override void Run() { Conv_ScanBarCodeExeTask(); ConvTaskFinish(); } private void ConvTaskFinish() { ConveyorTaskFinish(PlcName, Conv_1401, false, true); ConveyorTaskFinish(PlcName, Conv_1416, false, true); ConveyorTaskFinish(); } public void ConveyorTaskFinish() { try { //调用函数完成任务 string result = TryCachHelper.TryExecute((db) => { var task = db.Queryable().First(v => v.TASK_POSIDTO == Conv_1418 && v.TASK_POSIDCUR != v.TASK_POSIDFROM); if (task == null) return; //修改任务的状态 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); }); if (!string.IsNullOrWhiteSpace(result)) { throw new Exception(result); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 输送线任务完成 /// /// Plc /// 输送线出口 /// 是否检测当前地址和任务目标地址一致 /// 是否删除输送线任务 public override void ConveyorTaskFinish(string plcName, string convNo, bool isCheckEndPos = true, bool isTaskDelete = false) { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == plcName); var conveyorTo = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo); var cs = conveyorTo.EquSignal_Conv; if (cs.DB521_Tasknum > 0 && cs.DB521_Request) { if (convNo == "1401" || convNo == "1416") { Log4netHelper.Logger_Info.InfoFormat(string.Format("工位[{0}]获取删除任务请求信号成功!", convNo)); } //调用函数完成任务 string result = TryCachHelper.TryExecute((db) => { WCS_TASK taskcur = db.Queryable().First(v => v.TASK_NO == cs.DB521_Tasknum && v.TASK_WKSTATUS < 99); if (taskcur == null) return; if (isCheckEndPos) { if (taskcur.TASK_COMTYPE != 6 && taskcur.TASK_POSIDTO != convNo) return; } //任务类型不是出库/搬运/移动类型 if (taskcur.TASK_COMTYPE != 2 && taskcur.TASK_COMTYPE != 4 && taskcur.TASK_COMTYPE != 5) return; //var task = db.Queryable().First(v => v.TASK_WKSTATUS == 99 && v.TASK_POSIDFROM == "1390" && v.TASK_POSIDTO == taskcur.TASK_POSIDTO); //if (task == null) //{ //修改任务的状态 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == taskcur.TASK_NO) .ExecuteCommand(); //} //else //{ // BaseWorkflow.AddLedErrorMsg(convNo, string.Format("目标工位[{0}]上一个箱子[{1}]存在未完成任务[{2}]",task.TASK_POSIDTO, task.TASK_BOXBARCODE,task.TASK_NO), 0); // // LogMessageHelper.RecordLogMessage(string.Format("上一个箱子[{0}]存在未完成任务", task.TASK_BOXBARCODE, task.TASK_NO), true, LogLevelEnum.INFO.ToString()); // throw new Exception(string.Format("目标工位[{0}]上一个箱子[{1}]存在未完成任务[{2}]", task.TASK_POSIDTO, task.TASK_BOXBARCODE, task.TASK_NO)); //} }); if (!string.IsNullOrWhiteSpace(result)) { throw new Exception(result); } else { if (convNo == "1401" || convNo == "1416") { Log4netHelper.Logger_Info.InfoFormat(string.Format("工位[{0}]任务[{1}]标识完成成功!", convNo, cs.DB521_Tasknum)); } } if (isTaskDelete) { if (cs.DB521_Tasknum > 0 && cs.DB523_Fault == false && cs.CvDB51_PH_Status == false //&& cs.DB521_Goodsend == Convert.ToInt32(convNo) && cs.DB521_Request) { var converywrite = new WCSWriteToConveyorSignal() { Plc = plc.Plc, DBName = plc.WriteDBName, ConveyorNo = convNo, WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox, TaskDelete = true }; WriteInfoToConv(cs, converywrite, true); } } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private void Conv_ScanBarCodeExeTask() { Conv_ScanningRequest(Conv_1390, Current.Pvchouseputong, Conv_1418); } public string TranslationBarCode(string barCode) { var arr = barCode.Split('}'); return arr[1]; } protected virtual void Conv_ScanningRequest(string convPosFrom, string warehouseid, string exitNo = "") { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convPosFrom); var cs = conveyor.EquSignal_Conv; if (!cs.DB521_Request) return; if (cs.DB520_Confirm) return; WCS_TASK task = QueryTaskByCode(cs, convPosFrom, exitNo); if (task == null) { string code = TranslationBarCode(cs.BarCodeStr); var param = new GetInTaskParam() { ContainerBarCode = code, ContainerType = 1, MatBarCode = string.Empty, WareHouseId = warehouseid, EquipmentNo = convPosFrom, EndPostion = string.Empty, Memo2 = exitNo }; task = BaseWorkflow.GetWcsInTask(param); } if (task == null) return; //判断任务是否已经执行 if (task.TASK_WKSTATUS >= 2) { if (task.TASK_POSIDFROM != task.TASK_POSIDCUR) { task = SugarBase.DB.Queryable().First(v => v.TASK_POSIDFROM == convPosFrom && v.TASK_POSIDCUR == convPosFrom && v.TASK_COMTYPE == 6); if (task == null) { #region 重码异常口排出 string message = string.Format("条码[{0}]是重码。", cs.BarCodeStr); LogMessageHelper.RecordLogMessage(message); var wcstask = new WCS_TASK() { TASK_WMSNO = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"), TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回, TASK_SYSTYPE = "WCS", TASK_POSIDFROM = convPosFrom,//起点地址 TASK_POSIDCUR = convPosFrom, TASK_POSIDNEXT = convPosFrom, TASK_POSIDMOVE = "", TASK_PRIORITY = 1, TASK_WKSTATUS = 1, TASK_WHID = Current.Pvchouseputong, TASK_ADDUSERNO = "WCS", TASK_ADDDATETIME = DateTime.Now, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now, TASK_NOTES = "", TASK_RGVNO = "", TASK_BOXBARCODE = "MultipleCoding_" + DateTime.Now.ToString("yyyyMMddhhmmss"), TASK_POSIDTO = Conv_1418 }; string result = TryCachHelper.TryTranExecute((db) => { int id = db.Insertable(wcstask).ExecuteReturnIdentity(); if (id <= 0) { throw new Exception(string.Format("重码[{0}]添加异常排出任务失败。", cs.BarCodeStr)); } 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 = convPosFrom, POSIDNEXT = convPosFrom, DESCRIPTION = message, EXECUTEDATE = DateTime.Now }; db.Insertable(task_dtl).ExecuteReturnIdentity(); BaseWorkflow.AddLedErrorMsg(db, convPosFrom, message, wcstask.TASK_NO, 100); }); if (!string.IsNullOrWhiteSpace(result)) { throw new Exception(result); } #endregion; } } } if (task.TASK_WKSTATUS >= 2) return; //WCS_PalletizingCode palletizingCode = null; if (task.TASK_COMTYPE != 6) { //var PalletizingCodeSet = SugarBase.DB.Queryable().ToList(); //palletizingCode = Current.IsAvailableRange_BoxSize(PalletizingCodeSet, task.PalletizingBoxSize, task.TASK_NO); //palletizingCode = PalletizingCodeSet.FirstOrDefault(v => v.IsAvailableRange_BoxSize(task.PalletizingBoxSize, task.TASK_NO)); if (task == null) { throw new Exception(string.Format("输送线[{0}]任务[{1}]未获取到码垛清单,请维护码垛信息.", convPosFrom, task.TASK_NO)); } } bool notask = false; int goodsend = 0; if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回) { notask = true; goodsend = Convert.ToInt32(exitNo); } else { var routeSet = EquRouteHelper.QueryRoute(convPosFrom, task.TASK_POSIDTO); var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convPosFrom).ToList(); if (routes.Count() == 0) { throw new Exception(string.Format("输送线扫描位置[{0}]任务[{1}]查询路由失败。", convPosFrom, task.TASK_NO)); } else { goodsend = Convert.ToInt32(routes.First().ROUTE_SONPOS); } } if (goodsend == 0) return; var converywrite = new WCSWriteToConveyorSignal() { Plc = plc.Plc, DBName = plc.WriteDBName, ConveyorNo = convPosFrom, WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox, Tasknum = task.TASK_NO, Goodstype = Convert.ToInt32(task.TASK_POSIDTO), Goodssize = task.TASK_COMTYPE != 6 ? Convert.ToInt32(task.PalletizingBoxSize) : 0, Goodsstart = Convert.ToInt32(convPosFrom), //UpMatRequest = task.TASK_ORDERTYPE >= 1 ? true : false, TASK_WEIGHT = task.TASK_COMTYPE != 6 ? Convert.ToInt32(task.TASK_WEIGHT) : 0, Notask = notask, Goodsend = goodsend }; WriteInfoToConv(cs, converywrite); } catch (Exception ex) { BaseWorkflow.AddLedErrorMsg(convPosFrom, ex.Message, 0); LogMessageHelper.RecordLogMessage(ex); } } protected WCS_TASK QueryTaskByCode(ConvSignal cs, string convPosFrom,string exitNo) { WCS_TASK task = null; if (cs.DB521_BCR_Noread) { task = Current.TaskSet.SingleOrDefault(v => v.TASK_POSIDFROM == convPosFrom && v.TASK_POSIDCUR == convPosFrom); if (task == null) { string errormsg = string.Format("箱式输送线[{0}]条码未读出。", convPosFrom); LogMessageHelper.RecordLogMessage(errormsg); BaseWorkflow.AddLedErrorMsg(convPosFrom, errormsg, 0); string wmsno = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"); //wms任务异常需要生成退回托盘任务 task = new WCS_TASK() { TASK_WMSNO = wmsno, TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回, TASK_SYSTYPE = "WCS", TASK_POSIDFROM = convPosFrom,//起点地址 TASK_POSIDCUR = convPosFrom, TASK_POSIDNEXT = convPosFrom, TASK_POSIDMOVE = "", TASK_PRIORITY = 1, TASK_WKSTATUS = 1, TASK_WHID = "PVC普通立库", TASK_ADDUSERNO = "WCS", TASK_ADDDATETIME = DateTime.Now, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now, TASK_NOTES = "", TASK_RGVNO = "", TASK_BOXBARCODE = wmsno, TASK_POSIDTO = exitNo }; int id = SugarBase.DB.Insertable(task).ExecuteReturnIdentity(); if (id <= 0) { throw new Exception(string.Format("添加WCS读码异常任务失败")); } else { task.TASK_NO = id; } var task_dtl = new WCS_TASK_DTL() { ID = Guid.NewGuid().ToString(), PARENTID = task.TASK_NO, TASKNO = task.TASK_NO, POSIDCUR = convPosFrom, POSIDNEXT = convPosFrom, DESCRIPTION = errormsg, EXECUTEDATE = DateTime.Now }; SugarBase.DB.Insertable(task_dtl).ExecuteReturnIdentity(); } } else { if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convPosFrom)); if (cs.BarCodeStr.ToUpper().Contains("ERROR") || cs.BarCodeStr.ToUpper().Contains("N") || cs.BarCodeStr.Contains("?")) { throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", convPosFrom, cs.BarCodeStr)); } } if (task == null) { string code = TranslationBarCode(cs.BarCodeStr); task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == code); } if (task == null) { task = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDFROM == convPosFrom && v.TASK_POSIDCUR==convPosFrom && v.TASK_POSIDNEXT==convPosFrom && v.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回); } //if (task != null && task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回 && task.TASK_WKSTATUS == 2) //{ // int updateResult = SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "wcs", TASK_EDITDATETIME = DateTime.Now }) // .Where(it => it.TASK_NO == task.TASK_NO) // .ExecuteCommand(); // if (updateResult <= 0) // { // throw new Exception(string.Format("异常任务[{0}]结束失败。", task.TASK_NO)); // } // task = null; //} return task; } } }