using HH.WCS.Hexafluo; using HH.WCS.Hexafluo.device; using HH.WCS.Hexafluo.dispatch; using HH.WCS.Hexafluo.process; using HH.WCS.Hexafluo.util; using HH.WCS.Hexafluo.wms; using HH.WCS.SJML.Comm; using HH.WCS.SJML.dispatch; using HH.WCS.SJML.Dto; using HH.WCS.SJML.Entitys; using HH.WCS.SJML.util; using HH.WCS.ZCQTJ.dispatch; using HH.WCS.ZCQTJ.Entitys; using HH.WCS.ZCQTJ.Entitys.MES中间表; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; using static HH.WCS.Hexafluo.device.OITcpHelper; namespace HH.WCS.SJML.Bll { public class StateTaskBLL { public virtual OperateResult ExecuteState(string taskNo, string taskState, LogPara logPara, WMSTask Task = null, string UserName = "") { var executeStatePara = ExecuteStateHandlePara(taskNo, taskState, logPara, Task, UserName); if (executeStatePara == null) { return OperateResult.Error("未查询到任务数据!任务号为:" + taskNo); } var result = new OperateResult(); switch (taskState) { case "执行中": result = StartTask(executeStatePara, logPara); break; case "开始取货": result = StartTaskQh(executeStatePara, logPara); break; case "取货完成": result = PickSucc(executeStatePara, logPara); if (!executeStatePara.transportTask.S_TASK_NO.Contains("_") && executeStatePara.transportTask.S_TYPE == "出库" && executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.JbTray != null) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); var transportTask = newDb.Queryable().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First(); var TaryJb = JsonConvert.DeserializeObject>(transportTask.TypeJson); var Kklock = newDb.Queryable().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First(); if (TaryJb.FindAll(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ToList().Count > 0 && (Kklock != null && Kklock.TransportLock == "Y")) { try { newDb.BeginTran(); newDb.Deleteable().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "取货完成释放接驳位的空托缓存数据 报错:" + ex.Message); } } } break; case "完成": result = CompleteTask(executeStatePara, logPara); if (!executeStatePara.transportTask.S_TASK_NO.Contains("_") && executeStatePara.transportTask.S_TYPE == "出库" && executeStatePara.transportTask.S_NOTE.Equals("立库任务")) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); var transportTask = newDb.Queryable().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First(); var TaryJb = JsonConvert.DeserializeObject>(transportTask.TypeJson); var Kklock = newDb.Queryable().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First(); if (TaryJb.FindAll(e => e.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ToList().Count > 0 && (Kklock != null && Kklock.TransportLock == "Y")) { JbTrayNumberEntitys jbTray = new JbTrayNumberEntitys(); jbTray.S_LOC_CODE = executeStatePara.transportTask.S_END_LOC; jbTray.S_CNTR_CODE = executeStatePara.transportTask.S_CNTRS; try { newDb.BeginTran(); newDb.Insertable(jbTray).ExecuteCommand(); newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "任务完成释放接驳位的空托缓存数据 报错:" + ex.Message); } } } try { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); var transJson = newDb.Queryable().Where(e => e.Autoindex == "库区任务统计对照单")?.First(); var ListString = JsonConvert.DeserializeObject>(transJson.TypeJson); #region 巷道任务数量统计表 if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "入库" && result.Success) { var taskview = newDb.Queryable().Where(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA && e.N_ROADWAY == executeStatePara.endIsCurrentTask.N_ROADWAY && e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd"))?.First(); if (taskview == null)//创建 { try { TaskViewEntitys taskView = new TaskViewEntitys(); taskView.S_AREA_CODE = executeStatePara.transportTask.S_END_LAREA; taskView.N_ROADWAY = executeStatePara.endIsCurrentTask.N_ROADWAY; taskView.TASK_NUM = 1; newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成统计任务数量 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new TaskViewEntitys() { TASK_NUM = taskview.TASK_NUM + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成统计任务数量 报错:" + ex.Message); newDb.RollbackTran(); } } } if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "出库" && result.Success) { var taskview = newDb.Queryable().Where(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA && e.N_ROADWAY == executeStatePara.startIsCurrentTask.N_ROADWAY && e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd"))?.First(); if (taskview == null)//创建 { try { TaskViewEntitys taskView = new TaskViewEntitys(); taskView.S_AREA_CODE = executeStatePara.transportTask.S_START_LAREA; taskView.N_ROADWAY = executeStatePara.startIsCurrentTask.N_ROADWAY; taskView.TASK_NUM = 1; newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成统计任务数量 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new TaskViewEntitys() { TASK_NUM = taskview.TASK_NUM + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成统计任务数量 报错:" + ex.Message); newDb.RollbackTran(); } } } #endregion #region 库区出入库总量统计表 if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "入库" && result.Success) { var Texp = Expressionable.Create(); AREANUMEntitys taskView = new AREANUMEntitys(); var ggd = ListString.Find(e => e.AreaCode == executeStatePara.transportTask.S_END_LAREA); if (ggd != null) { taskView.S_CNTR_TYPE = ggd.TrayState; } if (executeStatePara.transportTask.S_END_LAREA == "LC11T") { Texp.And(e => e.S_CNTR_TYPE == executeStatePara.transportTask.S_TOOLS_TPYE); taskView.S_CNTR_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE; } Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA); Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd")); var taskview = newDb.Queryable().Where(Texp.ToExpression())?.First(); if (taskview == null)//创建 { try { taskView.S_AREA_CODE = executeStatePara.transportTask.S_END_LAREA; taskView.N_ENTER_NUM = 1; newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new AREANUMEntitys() { N_ENTER_NUM = taskview.N_ENTER_NUM + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } } if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "出库" && result.Success) { var Texp = Expressionable.Create(); AREANUMEntitys taskView = new AREANUMEntitys(); var ggd = ListString.Find(e => e.AreaCode == executeStatePara.transportTask.S_START_LAREA); if (ggd != null) { taskView.S_CNTR_TYPE = ggd.TrayState; } if (executeStatePara.transportTask.S_START_LAREA == "LC11T") { Texp.And(e => e.S_CNTR_TYPE == executeStatePara.transportTask.S_TOOLS_TPYE); taskView.S_CNTR_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE; } Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA); Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd")); var taskview = newDb.Queryable().Where(Texp.ToExpression())?.First(); if (taskview == null)//创建 { try { taskView.S_AREA_CODE = executeStatePara.transportTask.S_START_LAREA; taskView.N_OUT_NUM = 1; newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new AREANUMEntitys() { N_OUT_NUM = taskview.N_OUT_NUM + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } } #endregion #region 库区出入库小时统计表 DateTime Da = DateTime.Now; if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "入库" && result.Success) { AreaTaskHourNumberEntitys taskView = new AreaTaskHourNumberEntitys(); var Texp = Expressionable.Create(); var ggd = ListString.Find(e => e.AreaCode == executeStatePara.transportTask.S_END_LAREA); if (ggd != null) { taskView.S_CNTR_TYPE = ggd.TrayState; } if (executeStatePara.transportTask.S_END_LAREA == "LC11T") { Texp.And(e => e.S_CNTR_TYPE == executeStatePara.transportTask.S_TOOLS_TPYE); taskView.S_CNTR_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE; } Texp.And(e => e.Area_Code == executeStatePara.transportTask.S_END_LAREA); Texp.And(e => e.Date == Da.Date); Texp.And(e => e.hour == Da.Hour); var taskview = newDb.Queryable().Where(Texp.ToExpression())?.First(); if (taskview == null)//创建 { try { taskView.Area_Code = executeStatePara.transportTask.S_END_LAREA; taskView.Num_RK = 1; newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new AreaTaskHourNumberEntitys() { Num_RK = taskview.Num_RK + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } } if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "出库" && result.Success) { AreaTaskHourNumberEntitys taskView = new AreaTaskHourNumberEntitys(); var Texp = Expressionable.Create(); var ggd = ListString.Find(e => e.AreaCode == executeStatePara.transportTask.S_END_LAREA); if (ggd != null) { taskView.S_CNTR_TYPE = ggd.TrayState; } if (executeStatePara.transportTask.S_START_LAREA == "LC11T") { Texp.And(e => e.S_CNTR_TYPE == executeStatePara.transportTask.S_TOOLS_TPYE); taskView.S_CNTR_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE; } Texp.And(e => e.Area_Code == executeStatePara.transportTask.S_START_LAREA); Texp.And(e => e.Date == Da.Date); Texp.And(e => e.hour == Da.Hour); var taskview = newDb.Queryable().Where(Texp.ToExpression())?.First(); if (taskview == null)//创建 { try { taskView.Area_Code = executeStatePara.transportTask.S_START_LAREA; taskView.Num_CK = 1; newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new AreaTaskHourNumberEntitys() { Num_CK = taskview.Num_CK + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } } #endregion #region AGV每小时出入库统计 DateTime Daagv = DateTime.Now; if (executeStatePara.transportTask.S_NOTE == "agv任务" && executeStatePara.transportTask.S_TYPE == "入库" && result.Success) { var taskview = newDb.Queryable().Where(e => e.AgvLicense == executeStatePara.transportTask.S_EQ_NO && e.Date == Daagv.Date && e.hour == Daagv.Hour)?.First(); if (taskview == null)//创建 { try { AgvAreaTaskHourNumberEntitys taskView = new AgvAreaTaskHourNumberEntitys(); taskView.AgvLicense = executeStatePara.transportTask.S_EQ_NO; taskView.Num_RK = 1; newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new AgvAreaTaskHourNumberEntitys() { Num_RK = taskview.Num_RK + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } } if (executeStatePara.transportTask.S_NOTE == "agv任务" && executeStatePara.transportTask.S_TYPE == "出库" && result.Success) { var taskview = newDb.Queryable().Where(e => e.AgvLicense == executeStatePara.transportTask.S_EQ_NO && e.Date == Daagv.Date && e.hour == Daagv.Hour)?.First(); if (taskview == null)//创建 { try { AgvAreaTaskHourNumberEntitys taskView = new AgvAreaTaskHourNumberEntitys(); taskView.AgvLicense = executeStatePara.transportTask.S_EQ_NO; taskView.Num_CK = 1; newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new AgvAreaTaskHourNumberEntitys() { Num_CK = taskview.Num_CK + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } } #endregion #region 库区出入库天统计表 if (!executeStatePara.transportTask.S_TASK_NO.Contains("_") && result.Success) { var Texp = Expressionable.Create(); DayAreaTaskEntitys taskView = new DayAreaTaskEntitys(); if (executeStatePara.transportTask.S_TYPE == "入库") { Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA); } else { // Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA); Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA); } Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd")); var taskview = newDb.Queryable().Where(Texp.ToExpression())?.First(); if (taskview == null)//创建 { try { taskView.S_AREA_CODE = executeStatePara.transportTask.S_END_LAREA; if (executeStatePara.transportTask.S_TYPE == "入库") { taskView.Num_RK = 1; } else { taskView.Num_CK = 1; } newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); if (executeStatePara.transportTask.S_TYPE == "入库") { var I = newDb.Updateable().SetColumns(it => new DayAreaTaskEntitys() { Num_RK = taskview.Num_RK + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } } else { var I = newDb.Updateable().SetColumns(it => new DayAreaTaskEntitys() { Num_CK = taskview.Num_CK + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } } else { if (executeStatePara.transportTask.S_NOTE == "立库任务" && result.Success) { var Texp = Expressionable.Create(); DayAreaTaskEntitys taskView = new DayAreaTaskEntitys(); if (executeStatePara.transportTask.S_TYPE == "入库") { Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA); } else { Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA); } Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd")); var taskview = newDb.Queryable().Where(Texp.ToExpression())?.First(); if (taskview == null)//创建 { try { taskView.S_AREA_CODE = executeStatePara.transportTask.S_END_LAREA; if (executeStatePara.transportTask.S_TYPE == "入库") { taskView.Num_RK = 1; } else { taskView.Num_CK = 1; } newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); if (executeStatePara.transportTask.S_TYPE == "入库") { var I = newDb.Updateable().SetColumns(it => new DayAreaTaskEntitys() { Num_RK = taskview.Num_RK + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } } else { var I = newDb.Updateable().SetColumns(it => new DayAreaTaskEntitys() { Num_CK = taskview.Num_CK + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } } } #endregion #region 任务 年统计 if (!executeStatePara.transportTask.S_TASK_NO.Contains("_") && result.Success) { var Texp = Expressionable.Create(); YearAreaTaskEntitys taskView = new YearAreaTaskEntitys(); Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy")); var taskview = newDb.Queryable().Where(Texp.ToExpression())?.First(); if (taskview == null)//创建 { try { taskView.TASK_NUM = 1; newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new YearAreaTaskEntitys() { TASK_NUM = taskview.TASK_NUM + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } } else { if (executeStatePara.transportTask.S_NOTE == "立库任务" && result.Success) { var Texp = Expressionable.Create(); YearAreaTaskEntitys taskView = new YearAreaTaskEntitys(); Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy")); var taskview = newDb.Queryable().Where(Texp.ToExpression())?.First(); if (taskview == null)//创建 { try { taskView.TASK_NUM = 1; newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new YearAreaTaskEntitys() { TASK_NUM = taskview.TASK_NUM + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } } } #endregion #region 库区出库物料统计表 if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.trayItemMsts.Count > 0 && executeStatePara.transportTask.S_TYPE == "出库" && result.Success) { if (executeStatePara.trayItemMsts.Count > 0) { var Texp = Expressionable.Create(); AreaIetmNumEntitys taskView = new AreaIetmNumEntitys(); var ggd = ListString.Find(e => e.AreaCode == executeStatePara.transportTask.S_START_LAREA); if (ggd != null) { taskView.S_CNTR_TYPE = ggd.TrayState; } if (executeStatePara.transportTask.S_START_LAREA == "LC11T") { Texp.And(e => e.S_CNTR_TYPE == executeStatePara.transportTask.S_TOOLS_TPYE); taskView.S_CNTR_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE; } Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA); Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd")); var taskview = newDb.Queryable().Where(Texp.ToExpression())?.First(); if (taskview == null)//创建 { try { taskView.S_AREA_CODE = executeStatePara.transportTask.S_START_LAREA; taskView.N_OUT_NUM = 1; newDb.BeginTran(); var I = newDb.Insertable(taskView).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } else//任务数+1 { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new AreaIetmNumEntitys() { N_OUT_NUM = taskview.N_OUT_NUM + 1 }).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message); newDb.RollbackTran(); } } } } #endregion } catch (Exception ex) { throw; } if (!executeStatePara.transportTask.S_TASK_NO.Contains("_") && executeStatePara.transportTask.S_TYPE == "出库" && executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.JbTray != null) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); var transportTask = newDb.Queryable().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First(); var TaryJb = JsonConvert.DeserializeObject>(transportTask.TypeJson); var Kklock = newDb.Queryable().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First(); if (TaryJb.FindAll(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ToList().Count > 0 && (Kklock != null && Kklock.TransportLock == "Y")) { try { newDb.BeginTran(); newDb.Deleteable().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, "任务完成释放接驳位的空托缓存数据 报错:" + ex.Message); } } } break; case "开始卸货": result = StartTaskXh(executeStatePara, logPara); break; case "卸货完成": result = UnloadingSucc(executeStatePara, logPara); break; case "取消": result = CancelTask(executeStatePara, logPara, UserName); break; } return result; } public ExecuteStateParaDto ExecuteStateHandlePara(string taskNo, string taskState, LogPara logPara, WMSTask Task = null, string UserName = "") { var executeStatePara = new ExecuteStateParaDto(); executeStatePara.Name = UserName; var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); //查询任务 if (Task != null) { executeStatePara.transportTask = Task; } else { LogHelper.TaskDetail(logPara, "开始查询:任务编号: " + taskNo); executeStatePara.transportTask = newDb.Queryable().Where(e => e.S_TASK_NO == taskNo)?.First(); } if (executeStatePara.transportTask == null) { return null; } executeStatePara.transportTaskSrc = newDb.Queryable().Where(e => e.S_SRC_NO == executeStatePara.transportTask.S_SRC_NO).ToList(); if (taskNo.IndexOf('_') > 0) { var tno = taskNo.Substring(0, taskNo.LastIndexOf("_")); executeStatePara.transportTaskZ = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno); } LogHelper.TaskDetail(logPara, "结束查询 任务结束:任务编号: " + taskNo); //起点库区 var QbArea = newDb.Queryable().Where(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA.Trim() || e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA.Trim()).ToList(); executeStatePara.startStockArea = QbArea.Find(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA.Trim()); //结束库区 executeStatePara.endStockArea = QbArea.Find(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA.Trim()); // SqlSugarHelper.Db.Queryable().Where(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA.Trim())?.First(); LogHelper.TaskDetail(logPara, "结束查询 起点/终点 库区结束:任务编号: " + taskNo); //起点货位是否绑定托盘 //executeStatePara.startTrayLocation = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS)?.First(); var QbTrayCode = newDb.Queryable().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC || e.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ToList(); executeStatePara.startTrayLocation = QbTrayCode.Find(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC); //终点货位是否绑定托盘 executeStatePara.endTrayLocation = QbTrayCode.Find(e => e.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC); LogHelper.TaskDetail(logPara, "结束查询 起点/终点 托盘货位结束:任务编号: " + taskNo); //起点货位拓展 var QbLocation = newDb.Queryable().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC || e.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ToList(); executeStatePara.startIsCurrentTask = QbLocation.Find(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC); //终点货位拓展 executeStatePara.endIsCurrentTask = QbLocation.Find(e => e.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC); LogHelper.TaskDetail(logPara, "结束查询 起点/终点 货位结束:任务编号: " + taskNo); //托盘物料主表 executeStatePara.trayItemMsts = newDb.Queryable().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ToList(); LogHelper.TaskDetail(logPara, "结束查询 托盘物料结束:任务编号: " + taskNo); ////作业流程 executeStatePara.WorkFlows = newDb.Queryable().Where(e => e.S_FlowNo == executeStatePara.transportTask.S_FlowNo)?.First(); executeStatePara.JbTray = newDb.Queryable().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS && e.S_IS_USE == "N")?.First(); //任务状态 executeStatePara.taskState = taskState; return executeStatePara; } public virtual OperateResult StartTask(ExecuteStateParaDto executeStatePara, LogPara logPara) { if (!executeStatePara.transportTask.S_B_STATE.Equals(Constants.TaskState_NoExecuted) && !executeStatePara.transportTask.S_B_STATE.Equals("已推送")) return OperateResult.Error("请启动未执行的任务!"); if (executeStatePara.transportTask.S_NOTE.Equals("自管任务") && executeStatePara.transportTask.S_Subtask == "Y") { return OperateResult.Error("主任务禁止直接开始任务!"); } var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); string UserName = ""; WMSTask task = executeStatePara.transportTask; if (executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.Name == "") { UserName = "agv"; } else if (!executeStatePara.transportTask.S_NOTE.Equals("自管任务") && executeStatePara.Name == "") { UserName = "立库"; } else { UserName = executeStatePara.Name; } if (executeStatePara.transportTask.S_NOTE == "立库任务") { string no = executeStatePara.transportTask.S_TASK_NO; if (no.IndexOf('_') > 0) { no = no.Substring(0, no.LastIndexOf("_")); task = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == no); } // 获取主任务 LogHelper.TaskDetail(logPara, "获取主任务:任务编号: " + no); var bit = ""; if (task.S_TYPE == "出库") { bit = task.S_END_LOC; } } if (executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.transportTask.S_TYPE == "入库") { var tac = newDb.Queryable().Where(a => a.LocationCode == executeStatePara.transportTask.S_START_LOC)?.First(); if (tac != null) { //查询通讯方式 if (tac.CtiaMode == "MODBUS") { if (string.IsNullOrEmpty(tac.host) || tac.port == 0) { LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{executeStatePara.transportTask.S_START_LOC} ip地址 写入目标设备的IP端口 有空值或者默认值"); } else { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 1; Register.data = tac.dataNum; LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); } } if (tac.CtiaMode == "VMI") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_READY_FOR_OPERATION").ExecuteCommand(); if (GGF == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_READY_FOR_OPERATION字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_READY_FOR_OPERATION 字段为 1成功"); } } } else if (executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.transportTask.S_TYPE == "出库") { var tac = newDb.Queryable().Where(a => a.LocationCode == executeStatePara.transportTask.S_END_LOC)?.First(); if (tac != null) { //查询通讯方式 if (tac.CtiaMode == "MODBUS") { if (string.IsNullOrEmpty(tac.host) || tac.port == 0) { LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{executeStatePara.transportTask.S_END_LOC} ip地址 写入目标设备的IP端口 有空值或者默认值"); } else { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr; Register.data = tac.dataNum; var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); } } if (tac.CtiaMode == "VMI") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_READY_FOR_OPERATION").ExecuteCommand(); if (GGF == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_READY_FOR_OPERATION字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_READY_FOR_OPERATION 字段为 1成功"); } } } try { LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO); newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new WMSTask() { T_START_TIME = DateTime.Now, S_B_STATE = Constants.TaskState_Executing }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } if (executeStatePara.transportTask.S_TYPE == "入库" && executeStatePara.transportTask.S_NOTE.Equals("agv任务")) { var fff = executeStatePara.transportTaskSrc.Select(e => e.S_ID).ToList(); I = newDb.Updateable().SetColumns(it => new WMSTask() { T_START_TIME = DateTime.Now, T_MODIFY = DateTime.Now }).Where(e => fff.Contains(e.S_ID)).ExecuteCommand(); } if (executeStatePara.transportTask.S_TYPE == "出库" && executeStatePara.transportTask.S_NOTE.Equals("立库任务")) { var fff = executeStatePara.transportTaskSrc.Select(e => e.S_ID).ToList(); I = newDb.Updateable().SetColumns(it => new WMSTask() { T_START_TIME = DateTime.Now, T_MODIFY = DateTime.Now }).Where(e => fff.Contains(e.S_ID)).ExecuteCommand(); } newDb.CommitTran(); LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO); Task.Run(() => { if (executeStatePara.transportTask.S_SRC_SYS == "MES") { ZCReceivePriorityEntity mes = new ZCReceivePriorityEntity(); var tno = executeStatePara.transportTask.S_TASK_NO; mes.taskNo = executeStatePara.transportTask.S_UpstreamNo; var task2 = new WMSTask(); if (executeStatePara.transportTask.S_TYPE == "入库") { task2 = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == executeStatePara.transportTask.S_UpstreamNo); } else { if (tno.IndexOf('_') > 0) { tno = tno.Substring(0, tno.LastIndexOf("_")); } //task2 = SqlSugarHelper.Db.Queryable().Where(e => e.S_TASK_NO == tno)?.First(); task2 = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno); } if (task2 != null) { if (executeStatePara.transportTask.S_TYPE == "入库") { mes.End_big = task2?.S_START_LOC ?? executeStatePara.transportTask.S_START_LOC; } if (executeStatePara.transportTask.S_TYPE == "出库") { mes.End_big = task2?.S_END_LOC ?? executeStatePara.transportTask.S_END_LOC; } mes.Data_status = 1; //调mes接口 BLLCreator.CreateSingleton().MesTaskEntity(mes); } } }); return OperateResult.Succeed(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); return OperateResult.Error(JsonConvert.SerializeObject(ex)); } } public virtual OperateResult StartTaskQh(ExecuteStateParaDto executeStatePara, LogPara logPara) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO); newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new WMSTask() { T_START_TIME = DateTime.Now, T_MODIFY = DateTime.Now, S_B_STATE = Constants.TaskState_Executing }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } newDb.CommitTran(); LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO); return OperateResult.Succeed(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); return OperateResult.Error(JsonConvert.SerializeObject(ex)); } } public virtual OperateResult StartTaskXh(ExecuteStateParaDto executeStatePara, LogPara logPara) { List TaskState = new List() { "取消", "完成", "卸货完成" }; if (TaskState.Contains(executeStatePara.transportTask.S_B_STATE)) { return OperateResult.Error("只能执行没有 取消/完成/卸货完成的任务!"); } var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO); newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new WMSTask() { S_B_STATE = Constants.TaskState_Executing }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } newDb.CommitTran(); LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO); return OperateResult.Succeed(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); return OperateResult.Error(JsonConvert.SerializeObject(ex)); } } /// /// 任务完成 /// /// /// /// public virtual OperateResult CompleteTask(ExecuteStateParaDto executeStatePara, LogPara logPara) { //对取消的任务类型进行筛选 if (!executeStatePara.transportTask.S_B_STATE.Equals("未执行") && !executeStatePara.transportTask.S_B_STATE.Equals("已推送") && !executeStatePara.transportTask.S_B_STATE.Equals("执行中") && !executeStatePara.transportTask.S_B_STATE.Equals("完成一半") && !executeStatePara.transportTask.S_B_STATE.Equals("取货完成") && !executeStatePara.transportTask.S_B_STATE.Equals("卸货完成")) { return OperateResult.Error("只能完成未执行、执行中的任务!"); } //需要写入货位表的参数合集 #region 拼接上下架表数据 GroundingOffshelfEntitys UoDown = new GroundingOffshelfEntitys(); UoDown.S_CNTR_CODE = executeStatePara.transportTask.S_CNTRS; UoDown.S_TRAY_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE; UoDown.S_TASK_NO = executeStatePara.transportTask.S_TASK_NO; #endregion var productionDate = ""; var takeEffectTime = ""; var expireTime = ""; var S_TRAY_TYPE = ""; deadlockRollEntitys Deck = new deadlockRollEntitys(); Deck.S_INTER_STATE = "2"; Deck.S_VALUE_JSON = executeStatePara.transportTask.S_TASK_NO; if (executeStatePara.transportTask.S_CNTRS != null && executeStatePara.transportTask.S_CNTRS.Contains("KJZ")) { S_TRAY_TYPE = "KJZ"; UoDown.S_TRAY_TYPE = "KJZ"; } else { if (executeStatePara.trayItemMsts?.Count() > 0) { S_TRAY_TYPE = "MT"; } else { S_TRAY_TYPE = "KT"; } } if (executeStatePara.trayItemMsts?.Count() > 0) { var tex = executeStatePara.trayItemMsts.FirstOrDefault(); productionDate = tex.productionDate.ToString(); takeEffectTime = tex.takeEffectTime.ToString(); expireTime = tex.expireTime.ToString(); UoDown.S_ITEM_CODE = tex.S_ITEM_CODE; UoDown.S_ITEM_NAME = tex.S_ITEM_NAME; UoDown.F_QTY = tex.F_QTY; UoDown.F_AVG_QTY = tex.F_AVG_QTY; UoDown.F_SUM_QTY = tex.F_SUM_QTY; UoDown.expireTime = tex.expireTime; UoDown.itemFeature = tex.itemFeature; UoDown.itemModel = tex.itemModel; UoDown.Level = tex.Level; UoDown.productionDate = tex.productionDate; UoDown.takeEffectTime = tex.takeEffectTime; UoDown.TurnCardNum = tex.TurnCardNum; UoDown.S_ITEM_STATE = tex.S_ITEM_STATE; UoDown.S_BATCH_NO = tex.S_BATCH_NO; UoDown.applyProdSpecList = tex.applyProdSpecList; } //判断是否是自管任务 因为中策项目的流程是拆分子任务的流程 主任务直接完成了 但是子任务任在运行 当子任务上报完成了 主任务比子任务先完成 会出现逻辑错误 if (executeStatePara.transportTask.S_NOTE.Equals("自管任务") && executeStatePara.transportTask.S_Subtask == "Y") { return OperateResult.Error("主任务禁止直接完成!"); } string no = executeStatePara.transportTask.S_TASK_NO; if (no.IndexOf('_') < 1 && executeStatePara.transportTask.S_Subtask == "Y") { return OperateResult.Error("主任务不允许直接完成,请先完成子任务!!"); } string UserName = ""; if (executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.Name == "") { UserName = "agv"; } else if (!executeStatePara.transportTask.S_NOTE.Equals("自管任务") && executeStatePara.Name == "" && executeStatePara.transportTask.S_Subtask == "Y") { UserName = "立库"; } else { UserName = executeStatePara.Name; } string tno = executeStatePara.transportTask.S_TASK_NO; if (tno.IndexOf('_') > 0) { tno = tno.Substring(0, tno.LastIndexOf("_")); } var cno = ""; // 获取主任务 // var task = SqlSugarHelper.Db.Queryable().Where(e => e.S_TASK_NO == tno)?.First(); var task = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno); UoDown.S_TASK_NO = task?.S_TASK_NO; executeStatePara.ZtransportTask = task; string bit = null; if (task.S_TYPE == "出库") { bit = task.S_END_LOC; if (task.S_Subtask == "Y" && executeStatePara.transportTask.S_NOTE == "agv任务") { var WcsTask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == executeStatePara.transportTask.S_SRC_NO + "_1"); if (WcsTask != null) { if (WcsTask.S_B_STATE != "完成") { return OperateResult.Error("立库任务还没完成,agv任务暂时不能完成!"); } } } } //更新任务状态 var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO); newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new WMSTask() { T_END_TIME = DateTime.Now, S_B_STATE = Constants.TaskState_Complete }).Where(x => x.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } LogHelper.TaskDetail(logPara, "更新任务状态-任务号:" + executeStatePara.transportTask.S_TASK_NO + "状态为:" + executeStatePara.taskState); if (executeStatePara.transportTask.S_SRC_NO == executeStatePara.transportTask.S_TASK_NO) { var Task_tk = tno + "_yk"; if (Task_tk != executeStatePara.transportTask.S_TASK_NO) { if (executeStatePara.transportTaskZ != null) { I = newDb.Updateable().SetColumns(it => new WMSTask() { T_END_TIME = DateTime.Now, S_B_STATE = Constants.TaskState_Complete }).Where(x => x.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } } } } string taskNo = executeStatePara.transportTask.S_TASK_NO; //出库第二阶段任务 标记 用于完成时跳过起点货位状态变动 string JbTaskNo = null; //立库任务 子任务完成时,需要同步处理主任务 if (taskNo.IndexOf('_') > 0) { string topNo = taskNo.Substring(0, taskNo.IndexOf("_")); string navNo = taskNo.Substring(taskNo.IndexOf("_") + 1); cno = navNo; if (navNo == "2") { JbTaskNo = navNo; } //A到B的AGV搬运任务 if (navNo == "1") { if (task.S_TYPE == "出库") { I = newDb.Updateable().SetColumns(it => new WMSTask() { T_START_TIME = DateTime.Now, S_B_STATE = Constants.TaskState_Executing }).Where(x => x.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } LogHelper.TaskDetail(logPara, "更新主任务状态-任务号:" + topNo + "状态为:" + Constants.TaskState_Executing); } else { //主任务状态更改为:完成一半 //I = SqlSugarHelper.Db.Updateable().SetColumns(it => new WMSTask() { S_B_STATE = Constants.TaskState_CompleteHalf, S_READ_LOCK = "N" }).Where(x => x.S_TASK_NO == topNo).ExecuteCommand(); //if (I == 0) //{ // throw new Exception("更新任务状态失败"); //} //LogHelper.TaskDetail(logPara, "更新主任务状态-任务号:" + topNo + "状态为:" + Constants.TaskState_CompleteHalf); } } //B到C的立库搬运任务 if (navNo == "2") { //主任务状态更改为:完成 I = newDb.Updateable().SetColumns(it => new WMSTask() { T_END_TIME = DateTime.Now, S_B_STATE = Constants.TaskState_Complete }).Where(x => x.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } LogHelper.TaskDetail(logPara, "更新任务状态-任务号:" + topNo + "状态为:" + Constants.TaskState_Complete); } } if (executeStatePara.transportTask.S_TYPE == null) executeStatePara.transportTask.S_TYPE = ""; #region 入库 + 转运 if (executeStatePara.transportTask.S_TYPE.Equals("入库") || executeStatePara.transportTask.S_TYPE.Equals("转运")) { var LocCnt = new LocCntrRel(); LocCnt.S_CNTR_CODE = executeStatePara.transportTask.S_CNTRS; LocCnt.S_LOC_CODE = executeStatePara.transportTask.S_END_LOC; LocCnt.S_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE; if (executeStatePara.transportTask.S_CNTRS != null && executeStatePara.transportTask.S_CNTRS.Contains("KJZ")) { LocCnt.S_TYPE = "KJZ"; } if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 I = newDb.Deleteable().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); if (I == 0) { LogHelper.TaskDetail(logPara, "删除起点托盘货位表失败"); // throw new Exception("删除起点托盘货位表失败"); } else { LogHelper.TaskDetail(logPara, "删除起点托盘货位表成功"); } LogHelper.TaskDetail(logPara, "删除起点托盘货位表"); //起点 if (executeStatePara.startIsCurrentTask != null && executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y") && executeStatePara.transportTask.S_TYPE.Equals("转运")) { I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 0, T_EMPTY_TIME = DateTime.Now, S_LOCK_STATE = "无", S_TRAY_TYPE = "", productionDate = "", takeEffectTime = "", expireTime = "" }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ExecuteCommand(); if (I == 0) { throw new Exception("更新出库锁的货位状态为无数量为0失败"); } LogHelper.TaskDetail(logPara, "更新出库锁的货位状态为无数量为0,起点货位号:" + executeStatePara.transportTask.S_START_LOC); } } if (executeStatePara.endTrayLocation == null) { if (( executeStatePara.endIsCurrentTask != null) && executeStatePara.endStockArea.S_CONTROL_QTY.Equals("Y")) { //添加托盘货位 I = newDb.Insertable(LocCnt).ExecuteCommand(); if (I == 0) { throw new Exception("添加托盘货位表数据失败 " + executeStatePara.transportTask.S_CNTRS); } LogHelper.TaskDetail(logPara, "添加终点托盘货位表 " + executeStatePara.transportTask.S_CNTRS); UoDown.Type = "+"; I = newDb.Insertable(UoDown).ExecuteCommand(); LogHelper.TaskDetail(logPara, "添加上架表"); I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 1, T_FULL_TIME = DateTime.Now, S_LOCK_STATE = "无", S_TRAY_TYPE = S_TRAY_TYPE, productionDate = productionDate, takeEffectTime = takeEffectTime, expireTime = expireTime }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ExecuteCommand(); if (I == 0) { throw new Exception("更新入库锁的货位状态为无数量为1失败"); } LogHelper.TaskDetail(logPara, "更新入库锁的货位状态为无数量为1,终点货位号:" + executeStatePara.transportTask.S_END_LOC); } } } #endregion #region 出库 if (executeStatePara.transportTask.S_TYPE.Equals("出库")) { var LocCnt = new LocCntrRel(); LocCnt.S_CNTR_CODE = executeStatePara.transportTask.S_CNTRS; LocCnt.S_LOC_CODE = executeStatePara.transportTask.S_END_LOC; if (executeStatePara.startTrayLocation != null) { I = newDb.Deleteable().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); if (I == 0) { LogHelper.TaskDetail(logPara, "删除起点托盘货位表失败 " + executeStatePara.transportTask.S_CNTRS); // throw new Exception("删除起点托盘货位表失败"); } else { LogHelper.TaskDetail(logPara, "删除起点托盘货位表成功 " + executeStatePara.transportTask.S_CNTRS); } //if (executeStatePara.trayItemMsts?.Count() > 0) //{ // I = SqlSugarHelper.Db.Deleteable().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); // if (I == 0) // { // LogHelper.TaskDetail(logPara, "删除起点托盘货位表失败 " + executeStatePara.transportTask.S_CNTRS); // // throw new Exception("删除起点托盘货位表失败"); // } // else // { // LogHelper.TaskDetail(logPara, "删除起点托盘货位表成功 " + executeStatePara.transportTask.S_CNTRS); // } //} if (executeStatePara.trayItemMsts?.Count() > 0) { I = newDb.Deleteable().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); LogHelper.TaskDetail(logPara, "删除托盘物料表 " + executeStatePara.transportTask.S_CNTRS + $" 影响行数{I}"); } } if (executeStatePara.startIsCurrentTask.S_LOC_TYPE != "接驳位") { UoDown.Type = "-"; I = newDb.Insertable(UoDown).ExecuteCommand(); LogHelper.TaskDetail(logPara, "添加下架表"); } //起点 if (executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y") && string.IsNullOrEmpty(JbTaskNo) && executeStatePara.startIsCurrentTask.N_CAPACITY < 2) { I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 0, T_EMPTY_TIME = DateTime.Now, S_LOCK_STATE = "无", S_TRAY_TYPE = "", productionDate = "", takeEffectTime = "", expireTime = "" }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ExecuteCommand(); if (I == 0) { throw new Exception("更新出库锁的货位状态为无数量为0失败"); } LogHelper.TaskDetail(logPara, "更新出库锁的货位状态为无数量为0,起点货位号:" + executeStatePara.transportTask.S_START_LOC); } //终点 if (executeStatePara.endStockArea.S_CONTROL_QTY.Equals("Y") && executeStatePara.endIsCurrentTask.N_CAPACITY < 2) { I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 1, T_FULL_TIME = DateTime.Now, S_LOCK_STATE = "无", S_TRAY_TYPE = S_TRAY_TYPE, productionDate = productionDate, takeEffectTime = takeEffectTime, expireTime = expireTime }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ExecuteCommand(); if (I == 0) { throw new Exception("更新入库锁的货位状态为无数量为1失败"); } LogHelper.TaskDetail(logPara, "更新入库锁的货位状态为无数量为1,终点货位号:" + executeStatePara.transportTask.S_END_LOC); //添加托盘货位 if (executeStatePara.endTrayLocation == null) { I = newDb.Insertable(LocCnt).ExecuteCommand(); if (I == 0) { throw new Exception("添加托盘货位表数据失败 " + executeStatePara.transportTask.S_CNTRS); } LogHelper.TaskDetail(logPara, "添加终点托盘货位表 " + executeStatePara.transportTask.S_CNTRS); } } else { if (executeStatePara.trayItemMsts.Any()) { I = newDb.Deleteable().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); if (I == 0) { LogHelper.TaskDetail(logPara, "删除托盘物料表失败"); // throw new Exception("删除托盘物料表失败"); } else { LogHelper.TaskDetail(logPara, "删除托盘物料表成功"); } } if (executeStatePara.endIsCurrentTask.S_LOC_TYPE == "堆叠") { I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = it.N_CURRENT_NUM + 1, T_FULL_TIME = DateTime.Now, S_LOCK_STATE = "无", S_TRAY_TYPE = S_TRAY_TYPE }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ExecuteCommand(); LogHelper.TaskDetail(logPara, "堆叠式更新货位容量,终点货位号:" + executeStatePara.transportTask.S_END_LOC + " 影响行数:" + I); } } } #endregion #region 移库 if (executeStatePara.transportTask.S_TYPE.Equals("移库")) { var LocCnt = new LocCntrRel(); LocCnt.S_CNTR_CODE = executeStatePara.transportTask.S_CNTRS; LocCnt.S_LOC_CODE = executeStatePara.transportTask.S_END_LOC; if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 I = newDb.Deleteable().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); if (I == 0) { throw new Exception("删除起点托盘货位表失败"); } LogHelper.TaskDetail(logPara, "删除起点托盘货位表"); } if (executeStatePara.endTrayLocation == null) { //添加托盘货位 I = newDb.Insertable(LocCnt).ExecuteCommand(); if (I == 0) { throw new Exception("添加托盘货位表数据失败"); } LogHelper.TaskDetail(logPara, "添加终点托盘货位表"); //终点 if (executeStatePara.endIsCurrentTask != null && executeStatePara.endStockArea.S_CONTROL_QTY.Equals("Y")) { I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 1, T_FULL_TIME = DateTime.Now, S_LOCK_STATE = "无", S_TRAY_TYPE = S_TRAY_TYPE, productionDate = productionDate, takeEffectTime = takeEffectTime, expireTime = expireTime }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ExecuteCommand(); if (I == 0) { throw new Exception("更新入库锁的货位状态为无数量为1失败"); } LogHelper.TaskDetail(logPara, "更新入库锁的货位状态为无数量为1失败,终点货位号:" + executeStatePara.transportTask.S_END_LOC); } //起点 if (executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y")) { I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 0, T_EMPTY_TIME = DateTime.Now, S_LOCK_STATE = "无", S_TRAY_TYPE = "", productionDate = "", takeEffectTime = "", expireTime = "" }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ExecuteCommand(); if (I == 0) { throw new Exception("更新出库锁的货位状态为无数量为0失败"); } LogHelper.TaskDetail(logPara, "更新出库锁的货位状态为无数量为0,起点货位号:" + executeStatePara.transportTask.S_START_LOC); } } } #endregion #region 添加点对点接驳位释放表数据 if (executeStatePara.transportTask.S_Subtask != "Y" && executeStatePara.transportTask.S_TASK_NO.IndexOf('_') < 0 && executeStatePara.transportTask.S_TYPE == "出库" && executeStatePara.transportTask.S_NOTE == "立库任务") { if (executeStatePara.endStockArea.S_CONTROL_QTY.Equals("Y")) { AloneWcsTaskUnbingEntitys aloneWcsTask = new AloneWcsTaskUnbingEntitys() { S_TASK_NO = executeStatePara.transportTask.S_TASK_NO, JbLocation = executeStatePara.transportTask.S_END_LOC, IsRead = "N" }; I = newDb.Insertable(aloneWcsTask).ExecuteCommand(); if (I == 0) { throw new Exception("添加点对点接驳位释放表数据失败"); } LogHelper.TaskDetail(logPara, "添加点对点接驳位释放表数据失败"); } } #endregion newDb.CommitTran(); LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO); Task.Run(() => { if (executeStatePara.transportTask.S_SRC_SYS == "MES") { ZCReceivePriorityEntity mes = new ZCReceivePriorityEntity(); mes.taskNo = executeStatePara.transportTask.S_UpstreamNo; var task2 = new WMSTask(); if (executeStatePara.transportTask.S_TYPE == "入库") { task2 = SqlSugarHelper.Db.Queryable().Where(e => e.S_TASK_NO == executeStatePara.transportTask.S_UpstreamNo)?.First(); } else { task2 = SqlSugarHelper.Db.Queryable().Where(e => e.S_TASK_NO == tno)?.First(); } if (task2 != null) { if (executeStatePara.transportTask.S_TYPE == "入库") { mes.End_big = "LCRKAGV"; } if (executeStatePara.transportTask.S_TYPE == "出库") { mes.End_big = task2?.S_END_LOC ?? executeStatePara.transportTask.S_END_LOC; } mes.Data_status = 2; //调mes接口 BLLCreator.CreateSingleton().MesTaskEntity(mes); } } }); return OperateResult.Succeed(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); if (ex.Message.Contains("死锁")) { newDb.BeginTran(); var I = newDb.Insertable(Deck).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } return OperateResult.Error(JsonConvert.SerializeObject(ex)); } } public virtual OperateResult CancelTask(ExecuteStateParaDto executeStatePara, LogPara logPara, string UserName = "") { List TaskState = new List() { "取消", "完成", "卸货完成" }; if (TaskState.Contains(executeStatePara.transportTask.S_B_STATE)) { return OperateResult.Error("只能取消非取消/完成/卸货完成的任务!"); } deadlockRollEntitys Deck = new deadlockRollEntitys(); Deck.S_INTER_STATE = "7"; Deck.S_VALUE_JSON = executeStatePara.transportTask.S_TASK_NO; //中策项目对取消操作管控的最严 一不留神的操作可能造成整个任务和数据的错乱 WMSTask task = executeStatePara.transportTask; WMSTask Wmtask = null; WMSTask Twotask = null; WMSTask Agvtask = null; string tno = executeStatePara.transportTask.S_TASK_NO; string navNo = ""; if (tno.IndexOf('_') > 0) { navNo = tno.Substring(tno.IndexOf("_") + 1); } //主任务号 string Tno = ""; bool Desc = false; bool esc = false; bool Wcs = false; bool CkTask2 = false; bool RkTask = false; var WcsTask = new WMSTask(); //这里 如果任务有分发子任务 说明是出库任务 并且该任务在进行的途中 这时候是不允许取消主任务的 //立库任务取消要通知立库 if (tno.IndexOf('_') < 0 && executeStatePara.transportTask.S_Subtask == "Y") { var tasklist = new List { tno + "_1", tno + "_2" }; Wmtask = executeStatePara.transportTaskSrc.Find(e => tasklist.Contains(e.S_TASK_NO)); if (Wmtask != null) { return OperateResult.Error("主任务不允许直接取消,请先取消子任务!!"); } } //如果程序进入这里 ↓ 说明是子任务取消操作 这时候获取主任务的信息 if (tno.IndexOf('_') > 0) { tno = tno.Substring(0, tno.LastIndexOf("_")); task = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno); Tno = tno; } else if (executeStatePara.transportTask.S_TYPE.Equals("入库")) { //能进这里 说明是agv在入库 或者 RFID不符的时候 上报取消操作 这时候需要先删除库中的物料 RkTask = true; } if (navNo == "2" && executeStatePara.transportTask.S_NOTE.Equals("agv任务"))//出库 { //能进这里 说明是agv在出库 这时候要判断 立库是否执行完成 如果完成了 可以取消 没完成禁止取消 Twotask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == Tno + "_1"); if (Twotask.S_B_STATE.Trim().Equals("完成") || Twotask.S_B_STATE.Trim().Equals("取消")) { Desc = true; } else { return OperateResult.Error("立库任务一旦运行,无法取消!"); } } if (navNo == "2" && executeStatePara.transportTask.S_NOTE.Equals("agv任务"))//出库 { //能进这里说明立库任务已经处于完成状态 这时候 查询agv任务 Twotask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == Tno + "_2"); if (Twotask.S_B_STATE.Equals("取货完成")) { CkTask2 = true; } } if (navNo == "2" && executeStatePara.transportTask.S_NOTE.Equals("立库任务"))//入库 { //能进这里说明是入库的第二阶段 八成原因的RFID异常 要取消任务 这时候需要判断ams任务是否处于完成状态 Twotask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == Tno + "_1"); if (Twotask.S_B_STATE.Trim().Equals("完成") || Twotask.S_B_STATE.Trim().Equals("卸货完成")) { esc = true; } } if (navNo == "1" && executeStatePara.transportTask.S_NOTE.Equals("立库任务"))//出库 { //能进这里说明 是出库任务 并且报取消的是立库任务 这时候需要判断立库任务的实时状态 Twotask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == Tno + "_1"); Agvtask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == Tno + "_2"); if (Twotask.S_B_STATE.Trim().Equals("未执行") || Twotask.S_B_STATE.Trim().Equals("执行中") || Twotask.S_B_STATE.Trim().Equals("取货完成")) { Wcs = true; } else { return OperateResult.Error("立库任务一旦运行,无法取消!"); } } if (navNo == "1" && executeStatePara.transportTask.S_NOTE.Equals("agv任务"))//入库 { //能进这里说明 是入库任务 并且报取消的是立库任务 这时候需要判断立库任务的实时状态 Task.Run(() => { NDCHelper.Cancel(executeStatePara.transportTask.S_TASK_NO);//取消agv任务 LogHelper.TaskDetail(logPara, "1通知agv取消任务" + executeStatePara.transportTask.S_TASK_NO); }); } var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO); newDb.BeginTran(); var I = 0; if (CkTask2) { I = newDb.Updateable().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } LogHelper.TaskDetail(logPara, "更新任务状态失败" + executeStatePara.transportTask.S_TASK_NO); if (Tno != "") { //当子任务取消了 主任务跟着取消 I = newDb.Updateable().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } } } if (RkTask) { I = newDb.Deleteable().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); LogHelper.TaskDetail(logPara, "删除托盘物料表 托盘:" + executeStatePara.transportTask.S_CNTRS); } if (executeStatePara.transportTask.S_NOTE.Equals("agv任务") && UserName == "") { UserName = "agv"; } else if (!executeStatePara.transportTask.S_NOTE.Equals("自管任务") && UserName == "") { UserName = "立库"; } //更新任务状态 I = newDb.Updateable().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } LogHelper.TaskDetail(logPara, "更新任务状态成功" + executeStatePara.transportTask.S_TASK_NO); if (Tno != "") { I = newDb.Updateable().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } LogHelper.TaskDetail(logPara, "更新任务状态失败 " + "子任务取消 主任务跟着取消 主任务 任务号为" + Tno); } //终点 if (executeStatePara.transportTask.S_TYPE.Equals("入库") || executeStatePara.transportTask.S_TYPE.Equals("转运") || executeStatePara.transportTask.S_TYPE.Equals("移库")) { if (executeStatePara.transportTask.S_TASK_NO.IndexOf('_') < 1 && executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.transportTask.S_Subtask != "Y") { NDCHelper.Cancel(executeStatePara.transportTask.S_TASK_NO);//取消agv任务 LogHelper.TaskDetail(logPara, "通知agv取消3任务" + executeStatePara.transportTask.S_TASK_NO); } else if (executeStatePara.transportTask.S_TASK_NO.IndexOf('_') < 1 && executeStatePara.transportTask.S_NOTE.Equals("立库任务") && executeStatePara.transportTask.S_Subtask != "Y") { var re = BLLCreator.CreateSingleton().WcsCancellTask(executeStatePara.transportTask); LogHelper.TaskDetail(logPara, $"立库任务取消通知{JsonConvert.SerializeObject(executeStatePara.transportTask)} 是否成功:{JsonConvert.SerializeObject(re)}"); if (!re.Success) { throw new Exception(re.Msg); } } if (executeStatePara.endStockArea.S_CONTROL_QTY.Equals("Y")) { I = newDb.Updateable().SetColumns(it => new Location() { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC && x.S_LOCK_STATE == "入库锁").ExecuteCommand(); LogHelper.TaskDetail(logPara, "更新终点货位" + executeStatePara.transportTask.S_END_LOC + "的状态为无!" + $"影响行数{I}"); } if (task != null) { I = newDb.Updateable().SetColumns(it => new Location() { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == task.S_END_LOC && x.S_LOCK_STATE == "入库锁").ExecuteCommand(); LogHelper.TaskDetail(logPara, "更新主任务终点货位" + task.S_END_LOC + "的状态为无!" + $"影响行数{I}"); if (task.S_TYPE.Equals("入库")) { I = newDb.Deleteable().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); LogHelper.TaskDetail(logPara, "删除托盘产品关联结果--托盘:" + executeStatePara.transportTask.S_CNTRS); } } } if (Desc) { if (executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y")) { AloneWcsTaskUnbingEntitys aloneWcsTask = new AloneWcsTaskUnbingEntitys() { S_TASK_NO = executeStatePara.transportTask.S_TASK_NO, JbLocation = Twotask.S_START_LOC, IsRead = "N" }; I = newDb.Insertable(aloneWcsTask).ExecuteCommand(); if (I == 0) { throw new Exception("Agv取消释放接驳位"); } LogHelper.TaskDetail(logPara, "Agv取消释放接驳位"); } NDCHelper.Cancel(Twotask.S_TASK_NO);//取消agv任务 LogHelper.TaskDetail(logPara, "2通知agv取消任务" + Twotask.S_TASK_NO); } if (esc) { var re = BLLCreator.CreateSingleton().WcsCancellTask(executeStatePara.transportTask); LogHelper.TaskDetail(logPara, $"立库任务取消通知{JsonConvert.SerializeObject(executeStatePara.transportTask)} 是否成功:{JsonConvert.SerializeObject(re)}"); if (!re.Success) { throw new Exception(re.Msg); } I = newDb.Updateable().SetColumns(it => new Location() { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC && x.S_LOCK_STATE == "入库锁").ExecuteCommand(); LogHelper.TaskDetail(logPara, "更新主任务终点货位" + executeStatePara.transportTask.S_END_LOC + "的状态为无!"); } //在立库任务没有执行的时候取消任务则释放 终点接驳位 if (Wcs) { var re = BLLCreator.CreateSingleton().WcsCancellTask(Twotask); LogHelper.TaskDetail(logPara, $"立库任务取消通知{JsonConvert.SerializeObject(Twotask)} 是否成功:{JsonConvert.SerializeObject(re)}"); if (!re.Success) { throw new Exception(re.Msg); } I = newDb.Updateable().SetColumns(it => new Location() { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == Twotask.S_END_LOC && x.S_LOCK_STATE == "入库锁").ExecuteCommand(); LogHelper.TaskDetail(logPara, "更新立库任务终点货位" + Twotask.S_END_LOC + "的状态为无!" + $"影响行数{I}"); //更新agv子任务 任务状态 I = newDb.Updateable().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == Agvtask.S_ID).ExecuteCommand(); LogHelper.TaskDetail(logPara, "更新agv子任务的任务 " + Agvtask.S_TASK_NO + "的状态为取消!" + $"影响行数{I}"); NDCHelper.Cancel(Agvtask.S_TASK_NO);//取消agv任务 LogHelper.TaskDetail(logPara, "3通知agv取消任务" + Agvtask.S_TASK_NO); } //起点 if (executeStatePara.transportTask.S_TYPE.Equals("出库") || executeStatePara.transportTask.S_TYPE.Equals("转运") || executeStatePara.transportTask.S_TYPE.Equals("移库")) { if (executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y")) { var Stalocarion = Twotask?.S_START_LOC ?? executeStatePara.transportTask.S_START_LOC; I = newDb.Updateable().SetColumns(it => new Location() { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == Stalocarion && x.S_LOCK_STATE == "出库锁").ExecuteCommand(); LogHelper.TaskDetail(logPara, "更新起点货位" + executeStatePara.transportTask.S_START_LOC + "的状态为无!" + $"影响行数{I}"); } if (executeStatePara.transportTask.S_TASK_NO.IndexOf('_') < 1 && executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.transportTask.S_Subtask != "Y") { NDCHelper.Cancel(executeStatePara.transportTask.S_TASK_NO);//取消agv任务 LogHelper.TaskDetail(logPara, "4通知agv取消任务" + executeStatePara.transportTask.S_TASK_NO); } if (executeStatePara.transportTask.S_TASK_NO.IndexOf('_') < 1 && executeStatePara.transportTask.S_NOTE.Equals("立库任务") && executeStatePara.transportTask.S_Subtask != "Y") { var re = BLLCreator.CreateSingleton().WcsCancellTask(executeStatePara.transportTask); LogHelper.TaskDetail(logPara, $"立库任务取消通知{JsonConvert.SerializeObject(executeStatePara.transportTask)} 是否成功:{JsonConvert.SerializeObject(re)}"); if (!re.Success) { throw new Exception(re.Msg); } } if (executeStatePara.transportTask.S_Subtask == "Y" && executeStatePara.transportTask.S_NOTE.Equals("agv任务")) { if (executeStatePara.transportTask.S_B_STATE.Equals("未执行") || executeStatePara.transportTask.S_B_STATE.Equals("执行中") || executeStatePara.transportTask.S_B_STATE.Equals("已推送")) { AloneWcsTaskUnbingEntitys aloneWcsTask = new AloneWcsTaskUnbingEntitys() { S_TASK_NO = executeStatePara.transportTask.S_TASK_NO, JbLocation = executeStatePara.transportTask.S_START_LOC, IsRead = "N" }; I = newDb.Insertable(aloneWcsTask).ExecuteCommand(); if (I == 0) { throw new Exception("添加点对点接驳位释放表数据失败"); } LogHelper.TaskDetail(logPara, "添加点对点接驳位释放表数据"); } } } LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO); newDb.CommitTran(); Task.Run(() => { if (executeStatePara.transportTask.S_SRC_SYS == "MES") { ZCReceivePriorityEntity mes = new ZCReceivePriorityEntity(); mes.taskNo = executeStatePara.transportTask.S_UpstreamNo; var task2 = new WMSTask(); if (executeStatePara.transportTask.S_TYPE == "入库") { task2 = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == executeStatePara.transportTask.S_UpstreamNo); } else { task2 = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno); } if (task2 != null) { if (executeStatePara.transportTask.S_TYPE == "入库") { mes.End_big = task2?.S_START_LOC ?? executeStatePara.transportTask.S_START_LOC; } if (executeStatePara.transportTask.S_TYPE == "出库") { mes.End_big = task2?.S_END_LOC ?? executeStatePara.transportTask.S_END_LOC; } mes.Data_status = 3; //调mes接口 BLLCreator.CreateSingleton().MesTaskEntity(mes); } } }); return OperateResult.Succeed(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); if (ex.Message.Contains("死锁")) { newDb.BeginTran(); var I = newDb.Insertable(Deck).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } return OperateResult.Error(JsonConvert.SerializeObject(ex)); } } public OperateResult PickSucc(ExecuteStateParaDto executeStatePara, LogPara logPara) { if (!executeStatePara.transportTask.S_B_STATE.Equals("未执行") && !executeStatePara.transportTask.S_B_STATE.Equals("已推送") && !executeStatePara.transportTask.S_B_STATE.Equals("执行中") && !executeStatePara.transportTask.S_B_STATE.Equals("开始取货")) { return OperateResult.Error("只能执行已推送/未执行/执行中的任务!"); } var locationExt = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC)?.First(); if (locationExt == null) { return OperateResult.Error("当前任务起点未找到货位扩展记录!"); } string tno = executeStatePara.transportTask.S_TASK_NO; if (tno.IndexOf('_') > 0) { tno = tno.Substring(0, tno.LastIndexOf("_")); } // 获取主任务 // var task = SqlSugarHelper.Db.Queryable().Where(e => e.S_TASK_NO == tno)?.First(); var task = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno); LogHelper.TaskDetail(logPara, "获取主任务:任务编号: " + tno); var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); Location location2 = null; List ListValues = new List(); //if (executeStatePara.startIsCurrentTask.S_NOTE == "智能空桶满托") //{ // //查询配置表信息 // var transport = newDb.Queryable().Where(e => e.Autoindex == "智能空桶缓存")?.First(); // if (transport != null) // { // ListValues = JsonConvert.DeserializeObject>(transport.TypeJson); // if (ListValues.Count() > 0) // { // //查询出对应的空托缓存位 // var ggf = ListValues.Find(e => e.LocationCode1 == executeStatePara.transportTask.S_START_LOC); // if (ggf != null) // { // location2 = newDb.Queryable().Where(e => e.S_LOC_CODE == ggf.LocationCode2)?.First(); // } // } // } //} try { LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO); newDb.BeginTran(); //更新任务状态 var I = newDb.Updateable().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } LogHelper.TaskDetail(logPara, "更新任务状态" + executeStatePara.transportTask.S_TASK_NO); LogHelper.TaskDetail(logPara, "更新任务状态为:" + executeStatePara.taskState); //回报mes var bit = ""; if (task.S_TYPE == "出库") { bit = task.S_END_LOC; } if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 I = newDb.Deleteable().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); //I = SqlSugarHelper.Db.Deleteable(executeStatePara.startTrayLocation).ExecuteCommand(); if (I == 0) { LogHelper.TaskDetail(logPara, "删除起点托盘货位表失败 " + executeStatePara.transportTask.S_CNTRS); // throw new Exception("删除起点托盘货位表失败"); } else { LogHelper.TaskDetail(logPara, "删除起点托盘货位表成功 " + executeStatePara.transportTask.S_CNTRS); } //I = SqlSugarHelper.Db.Updateable().SetColumns(it => new Location() { N_CURRENT_NUM = 0, S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && x.S_LOCK_STATE == "出库锁").ExecuteCommand(); //if (I == 0) //{ // throw new Exception("更新终点货位" + executeStatePara.transportTask.S_END_LOC + "的状态为无!"); //} //LogHelper.TaskDetail(logPara, "更新任务终点货位" + executeStatePara.transportTask.S_START_LOC + "的状态锁为无!"); } //if (executeStatePara.transportTask.S_TYPE.Equals("入库") && executeStatePara.startIsCurrentTask.S_NOTE == "智能空桶满托") //{ // if (location2 != null && (location2.N_CURRENT_NUM - 1 >= 0)) // { // I = newDb.Updateable().SetColumns(it => new Location() // { // T_MODIFY = DateTime.Now, // N_CURRENT_NUM = it.N_CURRENT_NUM - 1, // T_EMPTY_TIME = DateTime.Now // }).Where(x => x.S_LOC_CODE == location2.S_LOC_CODE).ExecuteCommand(); // if (I == 0) // { // throw new Exception("更新终点当前容量-1失败"); // } // } //} if (executeStatePara.transportTask.S_TYPE.Equals("出库")) { //删除托盘产品关联 if (executeStatePara.endStockArea.S_CONTROL_QTY != "Y") { I = newDb.Deleteable().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand(); //if (I == 0) //{ // throw new Exception("删除托盘物料表失败"); //} LogHelper.TaskDetail(logPara, "删除托盘产品关联结果--托盘:" + executeStatePara.transportTask.S_CNTRS); } } //起点是否属于当前任务 if (executeStatePara.startIsCurrentTask != null && executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y")) { if (executeStatePara.startIsCurrentTask.N_CAPACITY < 2) { I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 0, S_LOCK_STATE = "无", S_TRAY_TYPE = "", productionDate = "", takeEffectTime = "", expireTime = "" }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ExecuteCommand(); if (I == 0) { throw new Exception("更新终点货位" + executeStatePara.transportTask.S_START_LOC + "的状态为无 更新失败!"); } LogHelper.TaskDetail(logPara, "更新任务终点货位" + executeStatePara.transportTask.S_START_LOC + "的状态锁为无!"); } } newDb.CommitTran(); LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO); return OperateResult.Succeed(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); return OperateResult.Error(JsonConvert.SerializeObject(ex)); } } /// /// 卸货完成 /// /// /// /// public OperateResult UnloadingSucc(ExecuteStateParaDto executeStatePara, LogPara logPara) { List TaskState = new List() { "取消", "完成", "卸货完成" }; if (TaskState.Contains(executeStatePara.transportTask.S_B_STATE)) { return OperateResult.Error("只能执行没有 取消/完成/卸货完成的任务!"); } if (executeStatePara.transportTask.S_NOTE.Equals("自管任务") && executeStatePara.transportTask.S_Subtask == "Y") { return OperateResult.Error("主任务禁止直接完成!"); } var taskNo = executeStatePara.transportTask.S_TASK_NO; string topNo = ""; if (taskNo.IndexOf("_") > 0) { topNo = taskNo.Substring(0, taskNo.IndexOf("_")); } var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); List AreaLo = new List() { "TCXB", "TTXB", "NCXB", "DSXB", "TMXB", "TQXB", "TQJT" }; WMSTask PritTask = null; //查询是否是相关库区 if (executeStatePara.transportTask.S_TYPE == "出库" && AreaLo.Contains(executeStatePara.transportTask.S_END_LAREA)) { LogHelper.TaskDetail(logPara, $"更新任务优先级-任务号:{executeStatePara.transportTask.S_TASK_NO} 终点库区是否包含{JsonConvert.SerializeObject(AreaLo)} 本任务:" + executeStatePara.transportTask.S_END_LAREA); //查询配置文件 var transportTask = STAttribute.GetValueTwo(executeStatePara.transportTask.S_END_LAREA + "-送满取空"); if (transportTask != null) { var ListString = JsonConvert.DeserializeObject>(transportTask); if (ListString != null && ListString.Count > 0) { var Strin = ListString.Find(e => e.LocationCode1 == executeStatePara.transportTask.S_END_LOC); LogHelper.TaskDetail(logPara, "更新任务优先级-任务号:" + executeStatePara.transportTask.S_TASK_NO + "是否匹配到了队友的货位信息" + JsonConvert.SerializeObject(Strin)); if (Strin != null) { //查询旁边的货位是否有已推送但是没执行的任务 // List TaskState2 = new List { "未执行", "已推送", "执行中" }; var SfgLo = newDb.Queryable().Where(e => Strin.LocationCode2.Contains(e.S_START_LOC) && e.S_NOTE.Equals("agv任务") && (e.S_B_STATE == "未执行" || e.S_B_STATE == "已推送" || e.S_B_STATE == "执行中")).ToList(); LogHelper.TaskDetail(logPara, "更新任务优先级-任务号:" + executeStatePara.transportTask.S_TASK_NO + "匹配到的货位 是否存在 是agv任务 并且任务状态为 未执行/已推送/执行中 的任务有:" + JsonConvert.SerializeObject(SfgLo)); if (SfgLo.Count() > 0)//有这个任务 { //看这个任务是否是有处于配置空托第一位的货位 var OneLoc = Strin.LocationCode2.FirstOrDefault(); LogHelper.TaskDetail(logPara, "更新任务优先级 配置中第一个货位为:" + OneLoc); var OneTask = SfgLo.Find(e => e.S_START_LOC == OneLoc); if (OneTask != null) { if (OneTask.S_B_STATE == "未执行")//推送任务 { OneTask.N_PRIORITY = 60; TaskProcess.SendTask(OneTask); } else { var Agvstr = NDCHelper.ChangeParamPri(OneTask.S_TASK_NO, 60); LogHelper.TaskDetail(logPara, "更新任务优先级-任务号:" + OneTask.S_TASK_NO + "优先级为:" + 60 + " 是否成功 :" + Agvstr); } PritTask = OneTask; } else { SfgLo = SfgLo.OrderBy(e => e.T_CREATE).ToList(); var OneTaskR = SfgLo.FirstOrDefault(); if (OneTaskR.S_B_STATE == "未执行")//推送任务 { OneTaskR.N_PRIORITY = 60; TaskProcess.SendTask(OneTaskR); } else { var Agvstr = NDCHelper.ChangeParamPri(OneTaskR.S_TASK_NO, 60); LogHelper.TaskDetail(logPara, "更新任务优先级-任务号:" + OneTaskR.S_TASK_NO + "优先级为:" + 60 + " 是否成功 :" + Agvstr); } PritTask = OneTaskR; } } } } } } try { LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO); newDb.BeginTran(); //更新任务状态 var I = newDb.Updateable().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } LogHelper.TaskDetail(logPara, "更新任务状态" + executeStatePara.transportTask.S_TASK_NO); LogHelper.TaskDetail(logPara, "更新任务状态为:" + executeStatePara.taskState); //主任务状态更改为:完成一半 LogHelper.TaskDetail(logPara, $" 主任务号{topNo} 类型:{executeStatePara.transportTask.S_TYPE} mark:{executeStatePara.transportTask.mark}"); if (!string.IsNullOrEmpty(topNo) && executeStatePara.transportTask.S_TYPE.Equals("入库") && executeStatePara.transportTask.mark != "Y") { if (executeStatePara.endIsCurrentTask.S_LOC_TYPE != "接驳位") { I = newDb.Updateable().SetColumns(it => new WMSTask() { S_B_STATE = Constants.TaskState_Complete }).Where(e => e.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } LogHelper.TaskDetail(logPara, "更新主任务状态-任务号:" + topNo + "状态为:" + Constants.TaskState_Complete); } else { I = newDb.Updateable().SetColumns(it => new WMSTask() { S_B_STATE = Constants.TaskState_CompleteHalf, S_READ_LOCK = "N" }).Where(e => e.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("更新任务状态失败"); } LogHelper.TaskDetail(logPara, "更新主任务状态-任务号:" + topNo + "状态为:" + Constants.TaskState_CompleteHalf); } } if (executeStatePara.endIsCurrentTask.S_NOTE == "智能空桶缓存点") { if (executeStatePara.endIsCurrentTask.N_CURRENT_NUM + 1 <= executeStatePara.endIsCurrentTask.N_CAPACITY) { I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = it.N_CURRENT_NUM + 1, T_EMPTY_TIME = DateTime.Now }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ExecuteCommand(); if (I == 0) { throw new Exception("更新终点当前容量+1失败"); } } } if (PritTask != null) { // var ddd = executeStatePara.transportTaskSrc.Select(e => e.S_ID).ToList(); var ggj = newDb.Updateable().SetColumns(it => new WMSTask() { N_PRIORITY = 60 }).Where(e => e.S_ID == PritTask.S_ID).ExecuteCommand(); LogHelper.TaskDetail(logPara, "更新任务优先级-任务号:" + PritTask.S_TASK_NO + "优先级为:" + 60 + " 是否成功 改wms任务 影响行数:" + ggj); } newDb.CommitTran(); LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO); return OperateResult.Succeed(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); return OperateResult.Error(JsonConvert.SerializeObject(ex)); } } } }