using HH.WCS.Hexafluo; 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.ZCQTJ.dispatch; using HH.WCS.ZCQTJ.Dto; using HH.WCS.ZCQTJ.Entitys; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Data; using System.Linq; using static HH.WCS.SJML.api.ApiModel; namespace HH.WCS.SJML.Bll { public class ZCBLL { /// /// 处理自管任务 /// public void SelfManageTaskOut(List TaskList) { try { #region 参数校验1 config List ors = new List(); #endregion var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); foreach (var task in TaskList) { LogHelper.DanInfo("处理自管任务", " 出库 开始------任务:" + task.S_TASK_NO); try { bool ggf = true; bool WCSBOOL = false; // 出库主任务是同时下两条子任务 if ((task.S_TYPE == "出库") && task.S_Subtask == "Y") { #region 出库 #region 参数校验2 //立库货位 string lkBit = task.S_START_LOC; var locationBit = LocationHelper.LocationCode(lkBit); var tTaskNum = newDb.Queryable().Where(e => e.S_AreaCode == task.S_START_LAREA && e.S_IsUse == "Y")?.First(); //获取托盘号 如果起点管控的话 var endArea = newDb.Queryable().Where(e => e.S_AREA_CODE == task.S_END_LAREA)?.First(); if (endArea != null && endArea.S_CONTROL_QTY == "Y") { var locaBit = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_CNTRS).First(); if (locaBit == null) { LogHelper.DanInfo("处理自管任务", "未找到托盘货位绑定:其中 S_CNTRS=" + task.S_CNTRS); throw new Exception("未找到托盘货位绑定:其中 S_CNTRS=" + task.S_CNTRS); } } var Itemgh = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_CNTRS).First(); var ToBit = LocationHelper.LocationCodeJbw(task.S_START_LOC); if (ToBit == null) { LogHelper.DanInfo("处理自管任务", "未找到巷道号:其中 S_START_LOC=" + task.S_START_LOC); throw new Exception("未找到巷道号:其中 S_START_LOC=" + task.S_START_LOC); } if (locationBit == null) throw new Exception("未找到立库货位:" + lkBit); //通过任务类型找接驳位 var _bit = ""; string input = task.S_Jb_Bit; List result = input.Split(',').ToList(); if (tTaskNum != null && Itemgh != null) { //查询起点库区对应巷道总任务量 var TaskLis = newDb.Queryable().Where(e => e.S_START_LAREA == task.S_START_LAREA && e.S_Main_task == "主任务" && e.S_B_STATE == "未执行" && (e.S_Jb_Bit.Contains(result.FirstOrDefault()) || e.S_Jb_Bit.Contains(result.LastOrDefault()))).ToList(); if (TaskLis.Count > 0) { //筛选出库的全部满托任务 var TaskTray = TaskLis.Select(e => e.S_CNTRS).ToList(); LogHelper.DanInfo("处理自管任务", "筛选出库的全部满托任务" + JsonConvert.SerializeObject(TaskTray)); //查托盘空满 var TaskItemghList = newDb.Queryable().Where(e => TaskTray.Contains(e.S_CNTR_CODE)).ToList(); if (TaskItemghList.Count() > 0) { //获取满托的托盘集合 var MtTray = TaskItemghList.Select(e => e.S_CNTR_CODE).ToList(); LogHelper.DanInfo("处理自管任务", "筛选出库的全部满托任务" + JsonConvert.SerializeObject(MtTray)); TaskLis = TaskLis.FindAll(e => MtTray.Contains(e.S_CNTRS)).ToList(); } } if (TaskLis.Count() > 0) { LogHelper.DanInfo("处理自管任务", $"起点库区{task.S_START_LAREA} 所处的巷道的 未执行的任务量为:{TaskLis.Count()}"); LogHelper.DanInfo("处理自管任务", $"最大任务数为{tTaskNum.N_TaskQuantity}"); if (TaskLis.Count() < tTaskNum.N_TaskQuantity) { if (result.Count > 1) { LogHelper.DanInfo("处理自管任务", $"排除前接驳位有{JsonConvert.SerializeObject(result)}"); result.RemoveRange(1, result.Count - 1); LogHelper.DanInfo("处理自管任务", $"排除后接驳位有{JsonConvert.SerializeObject(result)}"); } } } } Location connectBit = new Location(); foreach (var item in result) { if (string.IsNullOrEmpty(item)) continue; connectBit = LocationHelper.LocationCodeJbw(item); if (connectBit == null) continue; if (connectBit.N_CAPACITY > 1) { ggf = false; //查任务数 List State = new List { "完成", "取消" }; var TaskLis = newDb.Queryable().Where(e => e.S_NOTE == "立库任务" && !State.Contains(e.S_B_STATE) && e.S_TYPE == "出库" && e.S_END_LOC == connectBit.S_LOC_CODE).ToList(); if (TaskLis.Count() >= connectBit.N_CAPACITY) { continue; } } else { if (connectBit.S_LOCK_STATE != "无" || connectBit.N_CURRENT_NUM > 0) continue; } _bit = item; } if (string.IsNullOrEmpty(_bit)) { throw new Exception("当前出库任务" + task.S_TASK_NO + "没有可用接驳位!"); } //var readytBit = LocationHelper.LocationCode(task.S_Zb_Bit); //if (readytBit == null) // throw new Exception("未找到准备点货位:" + task.S_Zb_Bit); #endregion //赋值接驳位 #region 检查待出库托盘的外侧是否有托盘阻挡,如果有则将其移开 bool existObstruct = false; Location obstructBit = null; WMSTask taskEntityYk = null; string taskNoYk = task.S_TASK_NO + "_yk"; if (locationBit.N_SIDE == 2) { var lca = Expressionable.Create(); lca.And(it => it.N_ROW == locationBit.N_ROW); lca.And(it => it.N_COL == locationBit.N_COL); lca.And(it => it.N_LAYER == locationBit.N_LAYER); lca.And(it => it.N_ROADWAY == locationBit.N_ROADWAY); List lstLocation = newDb.Queryable().Where(lca.ToExpression()).ToList(); if (lstLocation.Count() == 0) { LogHelper.DanInfo("处理自管任务", "移库任务:: 货位表没有可用货位"); throw new Exception("没有可用货位"); } //如果外侧有阻挡,就将外侧的货位的CN_S_TASK_NO 获取到 obstructBit = lstLocation.Where(o => o.S_LOC_CODE != locationBit.S_LOC_CODE).FirstOrDefault(); if (obstructBit != null) if (obstructBit.S_LOCK_STATE == "无" && obstructBit.N_CURRENT_NUM > 0 && obstructBit.N_SIDE == 1) { existObstruct = true; //生成一条移库任务LocCntrRel LocCntrRel objTray = newDb.Queryable().Where(e => e.S_LOC_CODE == obstructBit.S_LOC_CODE).First(); if (objTray == null) { throw new Exception("阻挡货位没有绑定托盘:" + obstructBit.S_LOC_CODE); } //获取该巷道中的空货位 var emptyLca = Expressionable.Create(); emptyLca.And(it => it.S_LOCK_STATE == "无"); emptyLca.And(it => it.N_CURRENT_NUM == 0); emptyLca.And(it => it.N_ROADWAY == locationBit.N_ROADWAY); emptyLca.And(it => it.S_AREA_CODE == locationBit.S_AREA_CODE); List emptyLocation = newDb.Queryable().Where(emptyLca.ToExpression()).ToList(); if (emptyLocation.Count() == 0) { LogHelper.DanInfo("处理自管任务", "移库任务:: 货位表没有该巷道中的可用空货位 CN_S_AREA_CODE=" + locationBit.S_AREA_CODE); throw new Exception("没有可用货位"); } var exp = Expressionable.Create(); exp.And(it => it.S_AREA_CODE == obstructBit.S_AREA_CODE); exp.And(it => it.S_STRATEGY_TYPE == "入库"); exp.And(it => it.S_START_USING == "Y"); List lstStrategy = newDb.Queryable().Where(exp.ToExpression()).ToList(); //获取预出库锁定的货位 if (lstStrategy.Select(o => o.S_STRATEGY_CODE).ToList().Contains("FirstInLastOut")) { //去除预出库锁定的排列层 var loca = Expressionable.Create(); loca.And(it => it.S_WH_CODE == obstructBit.S_WH_CODE); loca.And(it => it.S_AREA_CODE == obstructBit.S_AREA_CODE); loca.And(it => it.S_LOCK_STATE == "出库锁"); List locationOutLock = newDb.Queryable().Where(loca.ToExpression()).ToList(); LogHelper.DanInfo("处理自管任务", "locationOutLock数据:" + JsonConvert.SerializeObject(locationOutLock)); foreach (Location lEntity in locationOutLock) { emptyLocation.RemoveAll(o => o.N_ROW == lEntity.N_ROW && o.N_COL == lEntity.N_COL && o.N_LAYER == lEntity.N_LAYER); } LogHelper.DanInfo("处理自管任务", "去除预出库锁定后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation)); //去除预入库锁定的排列层 var locaIn = Expressionable.Create(); locaIn.And(it => it.S_WH_CODE == obstructBit.S_WH_CODE); locaIn.And(it => it.S_AREA_CODE == obstructBit.S_AREA_CODE); locaIn.And(it => it.S_LOCK_STATE == "入库锁"); List locationInLock = newDb.Queryable().Where(locaIn.ToExpression()).ToList(); LogHelper.DanInfo("处理自管任务", "locationInLock数据:" + JsonConvert.SerializeObject(locationInLock)); foreach (Location lEntity in locationInLock) { emptyLocation.RemoveAll(o => o.N_ROW == lEntity.N_ROW && o.N_COL == lEntity.N_COL && o.N_LAYER == lEntity.N_LAYER); } LogHelper.DanInfo("处理自管任务", "去除预入库锁定后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation)); //去除被外侧货物阻挡的货位 var locaWc = Expressionable.Create(); locaWc.And(it => it.S_WH_CODE == obstructBit.S_WH_CODE); locaWc.And(it => it.S_AREA_CODE == obstructBit.S_AREA_CODE); locaWc.And(it => it.S_LOCK_STATE == "无"); locaWc.And(it => it.N_SIDE == 1); lca.And(it => it.N_CURRENT_NUM > 0); List lstLocationHasItem = newDb.Queryable().Where(locaWc.ToExpression()).ToList(); LogHelper.DanInfo("处理自管任务", "lstLocationHasItem数据:" + JsonConvert.SerializeObject(lstLocationHasItem)); List lstLocationHasItemOrder = new List(); foreach (Location itemC in lstLocationHasItem) { emptyLocation.RemoveAll(o => o.N_ROW == itemC.N_ROW && o.N_COL == itemC.N_COL && o.N_LAYER == itemC.N_LAYER && o.N_SIDE > itemC.N_SIDE); } LogHelper.DanInfo("处理自管任务", "去除阻挡后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation)); if (emptyLocation.Count() > 0) { var emptyLocation_inside = emptyLocation.FindAll(f => f.N_SIDE == 2); if (emptyLocation_inside.Any()) { emptyLocation = emptyLocation_inside; } } else { LogHelper.DanInfo("处理自管任务", "移库任务:: 货位表没有该巷道中的可用空货位 S_AREA_CODE=" + locationBit.S_AREA_CODE); throw new Exception("没有可用货位"); } // } taskEntityYk = new WMSTask(); taskEntityYk.S_TASK_NO = taskNoYk; taskEntityYk.S_START_LAREA = task.S_START_LAREA; taskEntityYk.S_END_LAREA = task.S_END_LAREA; taskEntityYk.S_START_LOC = obstructBit.S_LOC_CODE; taskEntityYk.S_END_LOC = emptyLocation[0].S_LOC_CODE; taskEntityYk.S_TYPE = "移库"; taskEntityYk.S_CNTRS = objTray.S_CNTR_CODE; taskEntityYk.N_CNTR_COUNT = 1; taskEntityYk.N_PRIORITY = 0; taskEntityYk.S_NOTE = Constants.TaskFlag_LG; taskEntityYk.S_SRC_SYS = task.S_SRC_SYS; taskEntityYk.S_READ_LOCK = "N"; taskEntityYk.S_Subtask = "N"; taskEntityYk.S_FlowNo = ""; taskEntityYk.S_SRC_NO = task.S_TASK_NO; taskEntityYk.S_UpstreamNo = task.S_UpstreamNo; taskEntityYk.S_Jb_Bit = _bit; taskEntityYk.S_Main_task = "子任务"; taskEntityYk.S_Zb_Bit = task.S_Zb_Bit; } } #endregion string taskNo1 = task.S_TASK_NO + "_1"; //创建第一个任务 #region 创建子任务 将参数放到 WMSTask 中 WMSTask taskEntity1 = new WMSTask(); taskEntity1.S_TASK_NO = taskNo1; taskEntity1.S_START_LAREA = task.S_START_LAREA; taskEntity1.S_END_LAREA = connectBit.S_AREA_CODE; taskEntity1.S_START_LOC = task.S_START_LOC; taskEntity1.S_END_LOC = _bit; taskEntity1.S_TYPE = "出库"; taskEntity1.S_B_STATE = "未执行"; taskEntity1.S_CNTRS = task.S_CNTRS; taskEntity1.N_CNTR_COUNT = 1; taskEntity1.N_PRIORITY = 0; taskEntity1.S_NOTE = Constants.TaskFlag_LG; taskEntity1.S_READ_LOCK = "N"; taskEntity1.S_Subtask = "N"; taskEntity1.S_FlowNo = ""; taskEntity1.S_SRC_SYS = task.S_SRC_SYS; taskEntity1.S_Jb_Bit = _bit; taskEntity1.S_UpstreamNo = task.S_UpstreamNo; taskEntity1.S_Zb_Bit = task.S_Zb_Bit; taskEntity1.S_SRC_NO = task.S_TASK_NO; taskEntity1.S_Main_task = "子任务"; taskEntity1.S_TOOLS_TPYE = task.S_TOOLS_TPYE; LogHelper.DanInfo("处理自管任务", "11---" + JsonConvert.SerializeObject(taskEntity1)); string taskNo2 = task.S_TASK_NO + "_2"; //创建第二个任务 WMSTask taskEntity2 = new WMSTask() { S_TASK_NO = taskNo2, S_START_LAREA = connectBit.S_AREA_CODE, S_END_LAREA = task.S_END_LAREA, S_START_LOC = _bit, S_END_LOC = task.S_END_LOC, S_TYPE = "出库", S_B_STATE = "未执行", S_CNTRS = task.S_CNTRS, N_CNTR_COUNT = 1, N_PRIORITY = 0, S_SRC_SYS = task.S_SRC_SYS, S_NOTE = Constants.TaskFlag_AGV, S_READ_LOCK = "N", S_Subtask = "N", S_FlowNo = "", S_Jb_Bit = _bit, S_UpstreamNo = task.S_UpstreamNo, S_Zb_Bit = task.S_Zb_Bit, S_SRC_NO = task.S_TASK_NO, S_Main_task = "子任务", S_TOOLS_TPYE = task.S_TOOLS_TPYE }; LogHelper.DanInfo("处理自管任务", "12---" + JsonConvert.SerializeObject(taskEntity2)); #region 任务下达 #region 如果有阻挡需要移库则产生移库任务 if (existObstruct) { newDb.BeginTran(); var A = newDb.Insertable(taskEntityYk).ExecuteCommand(); if (A == 0) { newDb.RollbackTran(); throw new Exception("任务表添加失败"); } A = newDb.Updateable().SetColumns(it => it.S_LOCK_STATE == "入库锁").Where(x => x.S_LOC_CODE == taskEntityYk.S_END_LOC && x.S_LOCK_STATE == "无").ExecuteCommand(); if (A == 0) { newDb.RollbackTran(); throw new Exception("锁定终点货位并发异常:" + taskEntityYk.S_END_LOC); } LogHelper.DanInfo("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntityYk.S_END_LOC + "--锁定终点货位 任务号为:" + taskNoYk); A = newDb.Updateable().SetColumns(it => new Location { S_LOCK_STATE = "出库锁", T_MODIFY = DateTime.Now }).Where(x => x.S_LOC_CODE == taskEntityYk.S_START_LOC && x.S_LOCK_STATE == "无").ExecuteCommand(); if (A == 0) { newDb.RollbackTran(); throw new Exception("锁定起点货位并发异常:" + taskEntityYk.S_START_LOC); } LogHelper.DanInfo("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntityYk.S_START_LOC + "--锁定终点货位 任务号为:" + taskNoYk); LogHelper.DanInfo("处理自管任务", "移库任务下发给WCS 参数为" + JsonConvert.SerializeObject(taskEntityYk)); //下发任务给WCS--立库 var tr = BLLCreator.CreateSingleton().WcsTaskEntity(taskEntityYk); LogHelper.DanInfo("处理自管任务", "移库任务调用WCS接口执行任务 执行结果:" + JsonConvert.SerializeObject(tr)); if (!tr.Success) { WCSBOOL = tr.Success; newDb.RollbackTran(); throw new Exception("移库任务调用WCS接口执行任务: 执行结果:" + JsonConvert.SerializeObject(tr)); } newDb.CommitTran(); } #endregion #region 添加第一个子任务 //增加子任务 newDb.BeginTran(); var B = newDb.Insertable(taskEntity1).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("任务表添加失败"); } //更新接驳位状态 if (ggf) { B = newDb.Updateable().SetColumns(it => new Location { S_LOCK_STATE = "入库锁", T_MODIFY = DateTime.Now }).Where(x => x.S_LOC_CODE == taskEntity1.S_END_LOC && x.S_LOCK_STATE == "无").ExecuteCommand(); LogHelper.DanInfo("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntity1.S_END_LOC + "--锁定货位为预入库 任务号为:" + taskNo1 + JsonConvert.SerializeObject(B)); if (B == 0) { newDb.RollbackTran(); throw new Exception("锁定更新接驳位状态异常:" + taskEntity1.S_END_LOC); } } // 更新主任务接驳位 状态置为执行中 记录接驳位和准备点 B = newDb.Updateable().SetColumns(it => it.S_B_STATE == Constants.TaskState_Executing).Where(x => x.S_ID == task.S_ID).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("更新主任务状态异常:" + taskEntity1.S_END_LOC); } #endregion #region 发送Wcs任务 LogHelper.DanInfo("处理自管任务", "下发给WCS 参数为" + JsonConvert.SerializeObject(taskEntity1)); LogHelper.DanInfo("处理自管任务", "调用WCS接口"); var re = BLLCreator.CreateSingleton().WcsTaskEntity(taskEntity1, Itemgh); //如果任务成功下达 则主任务不需要在循环了 if (!re.Success) { newDb.RollbackTran(); throw new Exception("调用WCS接口执行任务 执行结果:" + JsonConvert.SerializeObject(re)); } else { WCSBOOL = re.Success; } LogHelper.DanInfo("处理自管任务", "调用WCS接口执行任务 执行结果:" + JsonConvert.SerializeObject(re)); #endregion #region 添加第二个子任务 B = newDb.Insertable(taskEntity2).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("任务表添加失败"); } #endregion #region agv任务 //下达任务给Agv //LogHelper.DanInfo("处理自管任务", "调用agv接口"); //var Are = TaskProcess.SendTask(taskEntity2); //if (!Are) //{ // AMSBOOL = Are; // newDb.RollbackTran(); // throw new Exception("下达给AGV报错"); //} #endregion if (WCSBOOL) { B = newDb.Updateable().SetColumns(it => it.S_READ_LOCK == "Y").Where(x => x.S_ID == task.S_ID).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("更新主任务 是否已读失败:" + taskEntityYk.S_END_LOC); } newDb.CommitTran(); } else { newDb.RollbackTran(); } #endregion #endregion #endregion } ors.Add(OperateResult.Succeed("生成成功")); } catch (Exception ex) { newDb.RollbackTran(); ors.Add(OperateResult.Error(ex.Message)); } } LogHelper.DanInfo("处理自管任务", JsonConvert.SerializeObject(ors)); } catch (Exception ex) { LogHelper.DanInfo("处理自管任务", " Error:" + ex.Message + ex.StackTrace); } } /// /// 处理自管任务 /// public void SelfManageTaskIn(List TaskList) { try { #region 参数校验1 config List ors = new List(); string msg = ""; // LocationHelper.LocationCode(); 验证货位信息 #endregion var chi = new SqlHelper().GetInstance(); var newDb2 = chi.CopyNew(); foreach (var task in TaskList) { LogHelper.Info("处理自管任务", "入库开始------任务:" + task.S_TASK_NO); try { bool WCSBOOL = false; bool AMSBOOL = true; // 出库主任务是同时下两条子任务 #region 入库 #region 校验参数 //未执行表示第一个任务 if (task.S_B_STATE == Constants.TaskState_NoExecuted && task.S_Subtask == "Y") { CntrItemRel CntItem = newDb2.Queryable().Where(e => e.S_CNTR_CODE == task.S_CNTRS)?.First(); //立库货位 string lkBit = string.Empty; //根据任务类型判断立库货位 if (task.S_TYPE == Constants.In) { lkBit = task.S_END_LOC; } else { throw new Exception("自管任务任务类型不正确"); } var locationBit = LocationHelper.LocationCode(lkBit); if (locationBit == null) throw new Exception("未找到立库货位:" + lkBit); //回库优先缓存位条件 string input = task.S_Jb_Bit; var result = input.Split(',').ToList(); //任务均衡 if (result.Count > 1) { List TaskState = new List() { "取消", "完成" }; var transportTask = newDb2.Queryable().Where(e => !TaskState.Contains(e.S_B_STATE) && result.Contains(e.S_Jb_Bit) && e.S_NOTE == "agv任务" && e.S_TYPE == Constants.In).ToList(); //分组 把任务量最少的 bool df = true; foreach (var item in result) { //查询是否有没任务的接驳位,如果有就下任务到这个接驳位 var gg = transportTask.FindAll(e => e.S_Jb_Bit == item).ToList(); if (gg.Count() > 0) { continue; } else { df = false; task.S_Jb_Bit = item; break; } } if (df) { //初步筛选没有空任务的入库接驳位 需要从中取任务量最少的 var fft = transportTask.GroupBy(e => e.S_Jb_Bit).Select(g => new { Jb_Bit = g.Key, Count = g.Count() }).ToList(); var MinJb_Bit = fft.OrderBy(e => e.Count)?.First(); task.S_Jb_Bit = MinJb_Bit.Jb_Bit; } } var connectBit = LocationHelper.LocationCode(task.S_Jb_Bit); if (connectBit == null) throw new Exception("未找到接驳位 货位:" + task.S_Jb_Bit); #endregion #region 添加第一子任务 传参给WMSTask string taskNo = task.S_TASK_NO + "_1"; //创建第一个任务 WMSTask taskEntity = new WMSTask() { S_TASK_NO = taskNo, S_CNTRS = task.S_CNTRS, S_START_LOC = task.S_START_LOC, S_Jb_Bit = task.S_Jb_Bit, S_Zb_Bit = task.S_Zb_Bit, S_END_LOC = task.S_Jb_Bit, S_B_STATE = Constants.TaskState_NoExecuted, S_TYPE = "入库", N_PRIORITY = task.N_PRIORITY, S_NOTE = Constants.TaskFlag_AGV, S_SRC_SYS = task.S_SRC_SYS, S_READ_LOCK = "N", S_Subtask = "N", S_START_LAREA = task.S_START_LAREA, S_END_LAREA = connectBit.S_AREA_CODE, S_UpstreamNo = task.S_UpstreamNo, N_CNTR_COUNT = 1, S_SRC_NO = task.S_TASK_NO, S_Main_task = "子任务", S_TOOLS_TPYE = task.S_TOOLS_TPYE }; LogHelper.Info("处理自管任务", "2-9---" + JsonConvert.SerializeObject(taskEntity)); #endregion LogHelper.Info("处理自管任务", "15"); #region 添加第一个子任务 add //增加子任务 // var newDb1 = newDb.CopyNew(); newDb2.BeginTran(); var B = newDb2.Insertable(taskEntity).ExecuteCommand(); if (B == 0) { newDb2.RollbackTran(); throw new Exception("任务表添加失败"); } //更新接驳位状态 LogHelper.Info("处理自管任务", "2-10---Update" + taskNo); // 更新主任务状态置为执行中 B = newDb2.Updateable().SetColumns(it => it.S_B_STATE == Constants.TaskState_Executing).Where(e => e.S_ID == task.S_ID).ExecuteCommand(); if (B == 0) { newDb2.RollbackTran(); throw new Exception("更新主任务状态置为执行中并发异常 任务号为:" + task.S_TASK_NO); } #endregion //agv任务 需要调用调度接口 #region 调用接口--调度 //LogHelper.Info("处理自管任务", "调用Agv接口"); //var re = TaskProcess.SendTask(taskEntity); #endregion //LogHelper.Info("处理自管任务", "16"); //if (!re) //{ // LogHelper.Info("处理自管任务", "调用调度接口:" + re); // newDb.RollbackTran(); // throw new Exception("下达AGV调度失败"); //} newDb2.CommitTran(); } else { //执行一半的任务,开始创建第二个任务 if (task.S_B_STATE == Constants.TaskState_CompleteHalf) { #region 第二段子任务 参数校验 CntrItemRel CntItem = newDb2.Queryable().Where(e => e.S_CNTR_CODE == task.S_CNTRS)?.First(); string taskNo = task.S_TASK_NO + "_2"; var portTask = newDb2.Queryable().Where(e => e.S_TASK_NO == task.S_TASK_NO + "_1")?.First(); if (portTask == null) { throw new Exception("未查询到入库的一段agv任务"); } var connectBit = LocationHelper.LocationCode(portTask.S_END_LOC); var S_Jb_Bit = ""; if (task.S_Jb_Bit.Split(',').ToList().Count() > 1) { S_Jb_Bit = portTask.S_END_LOC; } else { S_Jb_Bit = task.S_Jb_Bit; } var conneBit = LocationHelper.LocationCode(task.S_END_LOC); if (connectBit == null) throw new Exception("未找到接驳位:" + S_Jb_Bit); //入库接驳位不再管控货位状态可能会导致竞争,检查该任务的终点是否阻挡了其他任务 bool existCompete = false; Location competeBit = null; string competeTaskNo = string.Empty; LogHelper.Info("处理自管任务", "入库任务双生位竞争 接驳位为:" + S_Jb_Bit); if (conneBit.N_SIDE == 1) { LogHelper.Info("处理自管任务", "入库任务双生位竞争 接驳位为:" + S_Jb_Bit); var Lstloca = Expressionable.Create(); Lstloca.And(it => it.S_WH_CODE == conneBit.S_WH_CODE); Lstloca.And(it => it.S_AREA_CODE == conneBit.S_AREA_CODE); Lstloca.And(it => it.N_ROW == conneBit.N_ROW); Lstloca.And(it => it.N_COL == conneBit.N_COL); Lstloca.And(it => it.N_LAYER == conneBit.N_LAYER); List lstLocation = newDb2.Queryable().Where(Lstloca.ToExpression()).ToList(); competeBit = lstLocation.Where(o => o.S_LOC_CODE != conneBit.S_LOC_CODE).FirstOrDefault(); LogHelper.Info("处理自管任务", "入库任务双生位竞争 置换规则2 :lstLocation里面的拥有的值得大于1 (表示 同行列 排相同的货位数大于1)并且排除现在的货位码后 lstLocation.Count():" + lstLocation.Count() + "::competeBit" + JsonConvert.SerializeObject(competeBit)); if (lstLocation.Count() > 1 && competeBit != null) { LogHelper.Info("处理自管任务", "入库任务双生位竞争3"); //查询内侧货位的任务 List State = new List() { "未执行", "执行中" }; var LstTask = Expressionable.Create(); LstTask.And(it => State.Contains(it.S_B_STATE)); LstTask.And(it => it.S_END_LOC == competeBit.S_LOC_CODE); var Task = newDb2.Queryable().Where(LstTask.ToExpression()).First(); if (Task != null) { if (competeBit.S_LOCK_STATE == "入库锁") { LogHelper.Info("处理自管任务", "入库任务双生位竞争4"); existCompete = true; competeTaskNo = Task.S_ID; } } } } #endregion #region 子任务2 传参给WMSTask //创建第二个任务 //获取mestask表里的标准重量 WMSTask taskEntity = null; if (existCompete) { taskEntity = new WMSTask() { S_TASK_NO = taskNo, S_CNTRS = task.S_CNTRS, S_START_LOC = S_Jb_Bit, S_END_LOC = competeBit.S_LOC_CODE, S_START_LAREA = connectBit.S_AREA_CODE, S_END_LAREA = task.S_END_LAREA, S_Jb_Bit = task.S_Jb_Bit, S_Zb_Bit = task.S_Zb_Bit, S_B_STATE = Constants.TaskState_NoExecuted, S_TYPE = "入库", N_PRIORITY = task.N_PRIORITY, S_SRC_SYS = task.S_SRC_SYS, S_NOTE = Constants.TaskFlag_LG, S_UpstreamNo = task.S_UpstreamNo, S_READ_LOCK = "N", S_Subtask = "N", N_CNTR_COUNT = 1, S_SRC_NO = task.S_TASK_NO, S_InTaskType = task.S_InTaskType, S_Main_task = "子任务", S_TOOLS_TPYE = task.S_TOOLS_TPYE }; } else { taskEntity = new WMSTask() { S_TASK_NO = taskNo, S_CNTRS = task.S_CNTRS, S_START_LOC = S_Jb_Bit, S_END_LOC = task.S_END_LOC, S_START_LAREA = connectBit.S_AREA_CODE, S_END_LAREA = task.S_END_LAREA, S_Jb_Bit = task.S_Jb_Bit, S_Zb_Bit = task.S_Zb_Bit, S_B_STATE = Constants.TaskState_NoExecuted, S_TYPE = "入库", N_PRIORITY = task.N_PRIORITY, S_SRC_SYS = task.S_SRC_SYS, S_NOTE = Constants.TaskFlag_LG, S_UpstreamNo = task.S_UpstreamNo, S_READ_LOCK = "N", S_Subtask = "N", S_InTaskType = task.S_InTaskType, N_CNTR_COUNT = 1, S_SRC_NO = task.S_TASK_NO, S_Main_task = "子任务", S_TOOLS_TPYE = task.S_TOOLS_TPYE }; } LogHelper.Info("处理自管任务", "入库 二段任务:" + JsonConvert.SerializeObject(taskEntity)); #endregion #region 添加第二个子任务 add //增加子任务 newDb2.BeginTran(); var B = newDb2.Insertable(taskEntity).ExecuteCommand(); if (B == 0) { newDb2.RollbackTran(); throw new Exception("任务表添加失败"); } //更新 主任务的 taskNo //入库接驳位不再管控货位状态如果存在竞争 if (existCompete) { // 更新主任务接驳位 状态置为执行中 B = newDb2.Updateable().SetColumns(it => new WMSTask { S_B_STATE = Constants.TaskState_Executing, S_END_LOC = competeBit.S_LOC_CODE }).Where(x => x.S_ID == task.S_ID).ExecuteCommand(); if (B == 0) { newDb2.RollbackTran(); throw new Exception("任务更新终点货位:" + competeBit.S_LOC_CODE); } //将竞争任务的终点任务改为该任务的终点任务号 B = newDb2.Updateable().SetColumns(it => new WMSTask { S_END_LOC = conneBit.S_LOC_CODE }).Where(x => x.S_ID == competeTaskNo).ExecuteCommand(); if (B == 0) { newDb2.RollbackTran(); throw new Exception("任务更新终点货位:" + competeBit.S_LOC_CODE); } } else { // 更新主任务接驳位 状态置为执行中 B = newDb2.Updateable().SetColumns(it => new WMSTask { S_B_STATE = Constants.TaskState_Executing }).Where(e => e.S_ID == task.S_ID).ExecuteCommand(); if (B == 0) { newDb2.RollbackTran(); throw new Exception("更新任务:" + task.S_TASK_NO + "的状态为:" + Constants.TaskState_Executing); } } #endregion #region 调接口 wcs 或ams //立库任务 需要调用wcs接口 #region 待测试 LogHelper.Info("处理自管任务", "调用wcs接口"); OperateResult re = OperateResult.Succeed(); if (task.S_InTaskType != "N") { re = BLLCreator.CreateSingleton().WcsTaskEntity(taskEntity, CntItem); } // re = BLLCreator.CreateSingleton().WcsTaskEntity(taskEntity, CntItem); //成功下达 则主任务改为已读 if (re.Success) { B = newDb2.Updateable().SetColumns(it => new WMSTask { S_READ_LOCK = "Y", }).Where(e => e.S_ID == task.S_ID).ExecuteCommand(); if (B == 0) { newDb2.RollbackTran(); throw new Exception("任务更新读取状态为已读 失败"); } newDb2.CommitTran(); } else { newDb2.RollbackTran(); msg = re.Msg; throw new Exception(re.Msg); } #endregion #endregion } #endregion } ors.Add(OperateResult.Succeed("生成成功")); } catch (Exception ex) { newDb2.RollbackTran(); ors.Add(OperateResult.Error(ex.Message)); } } LogHelper.Info("处理自管任务", JsonConvert.SerializeObject(ors)); } catch (Exception ex) { LogHelper.Info("处理自管任务", " Error:" + ex.Message + ex.StackTrace); } } public OperateResult SedeWcsWtp(List tasL) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { OperateResult re = OperateResult.Succeed(); foreach (var tas in tasL) { CntrItemRel CntItem = newDb.Queryable().Where(e => e.S_CNTR_CODE == tas.S_CNTRS)?.First(); re = BLLCreator.CreateSingleton().WcsTaskEntity(tas, CntItem); if (re.Success) { try { newDb.BeginTran(); var B = newDb.Updateable().SetColumns(it => new WMSTask { S_READ_LOCK = "Y", }).Where(e => e.S_ID == tas.S_ID).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("任务更新读取状态为已读 失败"); } newDb.CommitTran(); } catch (Exception ex) { newDb.RollbackTran(); } } else { throw new Exception(re.Msg); } } return re; } catch (Exception ex) { LogHelper.DanInfo("下发无托盘入库立库任务", " Error:" + ex.Message + ex.StackTrace); return OperateResult.Error(); } } /// /// 更换终点 /// /// public SetChangeDto GetDndLocation(WcsTaskState Vendor) { var Task = Expressionable.Create(); var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); SetChangeDto change = new SetChangeDto(); Task.And(it => it.S_TASK_NO == Vendor.taskNo); var Tasks = newDb.Queryable().Where(Task.ToExpression())?.First() ?? throw new Exception("未查询到该任务 任务号为:" + Vendor.taskNo); //查询这个托盘是否有物料信息 var ggf = newDb.Queryable().Where(e => e.S_BATCH_NO == Tasks.S_CNTRS)?.First(); var endIsCurrentTask = newDb.Queryable().Where(e => e.S_LOC_CODE == Tasks.S_END_LOC)?.First(); List clas = new List() { new areaPriorClass { areaCode=Tasks.S_END_LAREA, Prior=0 } }; if (string.IsNullOrEmpty(Tasks.S_END_LOC_AGO)) { var aEntity = new InAssignEntity() { objectType = InAssignEntity.ObjectType.托盘, objectCode = Tasks.S_CNTRS, lstAreaPrior = clas, projectCode = "", logicAreaCode = Tasks.S_TOOLS_TPYE, stockCode = endIsCurrentTask.S_WH_CODE, S_Roadway = new List() { endIsCurrentTask.N_ROADWAY.ToString() }, itemCode = ggf?.S_ITEM_CODE, IsChangeBit = 1, // callSys = executeInWorkAreaPara.InWorkAreaEntity.sysName, needCalLock = true }; //根据库区获取货位 InAssignResultEntity resultEntity = BLLCreator.Create().InAssign(aEntity); if (!resultEntity.Success) { change.S_LOC_CODE = "101"; try { newDb.BeginTran(); var C = newDb.Updateable().SetColumns(it => new Location { S_LOCK_STATE = "异常锁" }).Where(x => x.S_LOC_CODE == Tasks.S_END_LOC).ExecuteCommand(); if (C == 0) { throw new Exception("起点 改异常锁失败"); } newDb.CommitTran(); } catch (Exception ex) { newDb.RollbackTran(); LogHelper.Info("更换终点", "报错--" + ex.Message); } return change; } newDb.BeginTran(); try { var B = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC_AGO = Tasks.S_END_LOC, S_END_LOC = resultEntity.locationCode }).Where(x => x.S_TASK_NO == Tasks.S_TASK_NO).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("子任务--任务表更新失败"); } if (Tasks.S_TASK_NO.IndexOf('_') > 0) { var navNo = ""; var tno = Tasks.S_TASK_NO; navNo = tno.Substring(0, tno.LastIndexOf("_")); B = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC_AGO = Tasks.S_END_LOC, S_END_LOC = resultEntity.locationCode }).Where(x => x.S_TASK_NO == navNo).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("主任务--任务表更新失败"); } } B = newDb.Updateable().SetColumns(it => new Location { S_LOCK_STATE = "异常锁" }).Where(x => x.S_LOC_CODE == Tasks.S_END_LOC).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("原先的货位解锁失败"); } newDb.CommitTran(); change.S_LOC_CODE = resultEntity.locationCode; } catch (Exception ex) { change.S_LOC_CODE = "101"; newDb.RollbackTran(); LogHelper.Info("更换终点", "报错--" + ex.Message); } } else { change.S_LOC_CODE = Tasks.S_END_LOC; } return change; } /// /// 更换起点 /// /// /// /// public SetChangeDto GetStaLocation(WcsTaskState Vendor) { var Task = Expressionable.Create(); SetChangeDto change = new SetChangeDto(); Task.And(it => it.S_TASK_NO == Vendor.taskNo); var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); var Tasks = newDb.Queryable().Where(Task.ToExpression())?.First() ?? throw new Exception("未查询到该任务 任务号为:" + Vendor.taskNo); var endIsCurrentTask = newDb.Queryable().Where(e => e.S_LOC_CODE == Tasks.S_START_LOC)?.First(); var trayItemMsts = newDb.Queryable().Where(e => e.S_CNTR_CODE == Tasks.S_CNTRS)?.First(); List clas = new List() { new areaPriorClass { areaCode=Tasks.S_START_LAREA, Prior=0 } }; OutAssignEnitty oEntity = new OutAssignEnitty() { stockCode = endIsCurrentTask.S_WH_CODE, S_TASK_NO = Tasks.S_TASK_NO, TrayType = Tasks.S_TOOLS_TPYE, itemCode = trayItemMsts?.S_ITEM_CODE, itemState = trayItemMsts?.S_ITEM_STATE, projectCode = "", S_Roadway = endIsCurrentTask.N_ROADWAY.ToString(), endBit = "", lstAreaPrior = clas }; if (string.IsNullOrEmpty(Tasks.S_END_LOC_AGO)) { //根据库区获取货位 OutAssignResultEntity ire = BLLCreator.Create().OutAssign(oEntity); if (!ire.Success) { change.S_LOC_CODE = "102"; try { newDb.BeginTran(); var C = newDb.Updateable().SetColumns(it => new Location { S_LOCK_STATE = "异常锁" }).Where(x => x.S_LOC_CODE == Tasks.S_START_LOC).ExecuteCommand(); if (C == 0) { throw new Exception("起点 改异常锁失败"); } newDb.CommitTran(); } catch (Exception ex) { newDb.RollbackTran(); LogHelper.Info("更换终点", "报错--" + ex.Message); } return change; } newDb.BeginTran(); try { var B = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC_AGO = Tasks.S_START_LOC, S_CNTRS = ire.trayCode, S_START_LOC = ire.locationCode }).Where(x => x.S_TASK_NO == Tasks.S_TASK_NO).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("子任务(立库)--任务表更新失败"); } if (Tasks.S_TASK_NO.IndexOf('_') > 0) { var navNo = ""; var tno = Tasks.S_TASK_NO; navNo = tno.Substring(0, tno.LastIndexOf("_")); B = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC_AGO = Tasks.S_START_LOC, S_CNTRS = ire.trayCode, S_START_LOC = ire.locationCode }).Where(x => x.S_TASK_NO == navNo).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("主任务--任务表更新失败"); } B = newDb.Updateable().SetColumns(it => new WMSTask { S_CNTRS = ire.trayCode }).Where(x => x.S_TASK_NO == navNo + "_2").ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("子任务(agv)--任务表更新失败"); } } B = newDb.Updateable().SetColumns(it => new Location { S_LOCK_STATE = "异常锁" }).Where(x => x.S_LOC_CODE == Tasks.S_START_LOC).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("原先的货位解锁失败"); } newDb.CommitTran(); change.S_LOC_CODE = ire.locationCode; //查询子任务号 然后重新下达给立库 } catch (Exception ex) { change.S_LOC_CODE = "102"; newDb.RollbackTran(); LogHelper.Info("更换终点", "报错--" + ex.Message); } } else { change.S_LOC_CODE = Tasks.S_START_LOC; } return change; } /// /// 改道--中策 /// /// /// /// /// public OperateResult UpdateTaskEndLocation(WMSTask task, string Endlocation, Location Jb) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { newDb.BeginTran(); //更改住任务终点货位 var B = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC_AGO = task.S_END_LOC, S_END_LOC = Endlocation, S_Jb_Bit = Jb.S_LOC_CODE, S_END_LAREA = task.S_END_LAREA, }).Where(x => x.S_TASK_NO == task.S_TASK_NO).ExecuteCommand(); if (B == 0) { throw new Exception("任务表更新失败"); } //更改子任务终点货位 B = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC = Jb.S_LOC_CODE, S_Jb_Bit = Jb.S_LOC_CODE, S_END_LAREA = Jb.S_AREA_CODE, }).Where(x => x.S_TASK_NO == task.S_TASK_NO + "_1").ExecuteCommand(); if (B == 0) { throw new Exception("任务表更新失败"); } //B = SqlSugarHelper.Db.Updateable().SetColumns(it => new Location //{ // S_LOCK_STATE = "入库锁" //}).Where(x => x.S_LOC_CODE == Endlocation).ExecuteCommand(); //if (B == 0) //{ // throw new Exception("新算的货位锁定失败"); //} B = newDb.Updateable().SetColumns(it => new Location { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == task.S_END_LOC).ExecuteCommand(); if (B == 0) { throw new Exception("原先的货位释放锁定失败"); } newDb.CommitTran(); return OperateResult.Succeed(); } catch (Exception ex) { newDb.RollbackTran(); return OperateResult.Error(ex.Message); } } public OperateResult SaveTask(MesTaskDto task) { OperateResult re = new OperateResult(); var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { task.NeedTrig = Constants.N; // Log.Info("TN_MES_TASK表添加数据", JsonConvert.SerializeObject(task)); newDb.BeginTran(); var B = newDb.Insertable(task).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); } newDb.CommitTran(); LogHelper.Info("任务下发", "--是否成功添加MES_TASK表:" + JsonConvert.SerializeObject(re)); re = BLLCreator.Create().ExecTransferTask(task); return re; } catch (Exception ex) { newDb.RollbackTran(); LogHelper.Info("任务下发", "--发生了错误 错误为:" + ex.Message); return OperateResult.Error(ex.Message); } } /// /// 线边缓存区 存取 /// /// /// public OperateResult BusTask(MesKtTaskDto task) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { var transJson1 = newDb.Queryable().Where(e => e.Autoindex == "堆叠-" + task.TOOLS_TPYE)?.First(); if (transJson1 != null) { if (task.BUSI_TYPE == "3")//入库 { //查询是否有空托任务进行缓存 ,有则送到线边去 ,没有则送到库中-- var transportTask1 = newDb.Queryable().Where(e => e.TOOLS_TPYE == task.TOOLS_TPYE && e.NeedTrig == "Y" && e.Task_State == "智能空桶").ToList(); if (transportTask1.Any()) { transportTask1 = transportTask1.OrderBy(e => e.T_CREATE).ToList(); } var transportTask = transportTask1.FirstOrDefault(); //必须要求终点的货位的当前容量小于总容量 if (transportTask != null) { //查货位的容量是否可以生成到线边的任务 var transJson = newDb.Queryable().Where(e => e.Autoindex == "堆叠-" + task.TOOLS_TPYE)?.First(); List ListString = new List(); if (transJson != null) { ListString = JsonConvert.DeserializeObject>(transJson.TypeJson); } if (ListString.Count() == 0) { LogHelper.Info("任务下发", "线边缓存区 存取 在入空托的时候查询线边缓存区货位配置时为空 配置索引为:" + "堆叠-" + task.TOOLS_TPYE); return OperateResult.Error(); } if (!ListString.Contains(transportTask.Location_To)) { LogHelper.Info("任务下发", $"线边缓存区 存取 在入空托的时候查询线边缓存区货位配置时没有这个终点货位{transportTask.Location_To} 配置索引为:" + "堆叠-" + task.TOOLS_TPYE); return OperateResult.Error(); } //直接送至线边 List outWorkAreas = new List { new OutWorkAreaEntity() { taskNo = task.task_no, startBit = task.Location_From, endBit = transportTask.Location_To, priority = transportTask.Priority, trayCode = task.TOOLS_NO, TaskOrderType = "MES", NoAssist = "Y", S_TransAgv = "Y" } }; var result = BLLCreator.CreateSingleton().OutWorkArea(outWorkAreas); if (result.Success) { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new MesKtTaskDto() { NeedTrig = "N" }).Where(x => x.S_ID == transportTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("影响行数为0"); } newDb.CommitTran(); } catch (Exception ex) { newDb.RollbackTran(); } return OperateResult.Succeed(); } else { return OperateResult.Error(); } } else { //送至库中 return OperateResult.Error(); } } else//出库 { //1插入中间表 先查在插入 //var transportTask = newDb.Queryable().Where(e => e.Location_To == task.Location_To && e.NeedTrig == "Y")?.First(); //if (transportTask == null) //{ try { task.NeedTrig = Constants.Y; newDb.BeginTran(); var B = newDb.Insertable(task).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { newDb.RollbackTran(); } return OperateResult.Succeed(); // } } // return OperateResult.Succeed(); } else { return OperateResult.Error(); } } catch (Exception ex) { return OperateResult.Succeed(); } } private static object lockoIn = new object(); private static object lockoOut = new object(); public OperateResult ExecTransferTask(MesTaskDto req) { OperateResult ors = new OperateResult(); ors.Success = true; string startArea = string.Empty, endArea = string.Empty; var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { InWorkAreaEntity inModel = new InWorkAreaEntity(); inModel.taskNo = req.task_no; inModel.trayCode = req.TOOLS_NO; inModel.priority = req.Priority; inModel.startBit = req.Location_From; inModel.endBit = req.Location_To; inModel.locationGear = req.TOOLS_TPYE; inModel.TrayType = req.TOOLS_TPYE; inModel.remark = "业务类型:" + req.BUSI_TYPE; inModel.PRODUCE_TIME = req.PRODUCE_TIME; inModel.CHECK_INFO = req.CHECK_INFO; inModel.CURRENT_AMOUNT = req.CURRENT_AMOUNT; inModel.funCode = "L"; inModel.mesTaskNo = req.task_no; inModel.TaskOrderType = req.Givewayto; if (req.Task_PDA == "无托盘入库") { inModel.flag = "N"; } else { inModel.flag = "Y"; } if (req.BUSI_TYPE == "12") { inModel.TrayType = "KJZ"; } if (req.TOOLS_NO == "99") { inModel.trayCode = ""; } inModel.takeEffectTime = req.SHELF_LIFE_TIME.AddHours(-req.SHELF_REP); inModel.expireTime = req.EXPIRED_TIME.AddHours(req.EXPIRED_REP); OutWorkAreaEntity outModel = new OutWorkAreaEntity(); outModel.taskNo = req.task_no; outModel.trayCode = req.TOOLS_NO; outModel.priority = req.Priority; outModel.startBit = req.Location_From; outModel.endBit = req.Location_To; outModel.remark = "业务类型:" + req.BUSI_TYPE; outModel.funCode = "L"; outModel.mesTaskNo = req.task_no; outModel.TaskOrderType = req.Givewayto; if (req.BUSI_TYPE == "12") { outModel.TrayType = "KJZ"; } else { outModel.TrayType = req.TOOLS_TPYE; } // 要执行的阶段 bool needCreateTask = true; string direction = ""; if (req.Task_type == "1") { if (!string.IsNullOrEmpty(req.PROD_NO)) { inModel.Data = new List(); CntrItemRel itemE = new CntrItemRel(); itemE.S_ITEM_CODE = req.PROD_NO; itemE.S_ITEM_NAME = req.PROD_BOM; itemE.S_ITEM_STATE = req.CHECK_INFO; itemE.TurnCardNum = req.TurnCardNum; itemE.itemFeature = req.PROD_TECH; itemE.itemModel = req.PROD_SPEC; itemE.Level = req.PROD_BOM; itemE.applyProdSpecList = req.applyProdSpecList; inModel.Data.Add(itemE); } direction = Constants.In; } if (req.Task_type == "2") { // 出库 direction = Constants.Out; // 修改出库任务的终点为空托位 if (inModel.endBit == null) { LogHelper.Info("任务下发", "终点不能为空" + outModel.endBit); return OperateResult.Error("任务下发" + "终点不能为空" + outModel.endBit); } outModel.endBit = inModel.endBit; //outModel.startBit = ""; outModel.Data = new List(); OutWorkDataEntity itemOut = new OutWorkDataEntity(); itemOut.ItemCode = req.PROD_NO; // itemOut.ItemName = req.PROD_NO; itemOut.itemState = req.CHECK_INFO; itemOut.ItemModel = req.PROD_NO; itemOut.ItemCode = req.PROD_NO; outModel.Data.Add(itemOut); direction = Constants.Out; } string taskNo = ""; OperateResult externalRes = new OperateResult(); // 更新MES任务阶段 if (needCreateTask) { if (direction == Constants.In) { //传递参数 List inWorkAreaEntitys = new List { inModel }; try { LogHelper.Info("任务下发", "传参:" + JsonConvert.SerializeObject(inWorkAreaEntitys)); lock (lockoIn) { externalRes = BLLCreator.CreateSingleton().InWorkArea(inWorkAreaEntitys); if (!externalRes.Success) { LogHelper.Info("任务下发", "报错:" + externalRes.Msg); ors.Msg = "入作业区失败:" + externalRes.Msg; ors.Code = externalRes.Code; ors.Success = false; } } taskNo = inModel.taskNo; } catch (Exception ex) { LogHelper.Info("任务下发", "失败,传参:" + JsonConvert.SerializeObject(inWorkAreaEntitys) + ex.ToString()); ors.Msg = "入作业区失败:" + ex.Message; ors.Code = externalRes.Code; ors.Success = false; } } else if (direction == Constants.Out) { //传递参数 List outWorkAreaEntitys = new List(); var transportTask = SqlSugarHelper.Db.Queryable().Where(e => e.Autoindex == "1")?.First(); List ListString = new List(); if (transportTask != null) { ListString = JsonConvert.DeserializeObject>(transportTask.TypeJson); } if (!ListString.Contains(outModel.endBit)) { List state = new List { "完成", "取消" }; var tasks = SqlSugarHelper.Db.Queryable().Where(e => e.S_END_LOC == outModel.endBit && !(state.Contains(e.S_B_STATE))).ToList(); if (tasks.Count > 0) { LogHelper.Info("任务下发", "终点货位" + outModel.endBit + ",最多只能同时存在一条任务 任务" + JsonConvert.SerializeObject(tasks?.FirstOrDefault()?.S_TASK_NO)); throw new Exception("终点货位" + outModel.endBit + ",最多只能同时存在一条任务!" + JsonConvert.SerializeObject(tasks?.FirstOrDefault()?.S_TASK_NO)); } } outWorkAreaEntitys.Add(outModel); try { lock (lockoOut) { externalRes = BLLCreator.CreateSingleton().OutWorkArea(outWorkAreaEntitys); if (!externalRes.Success) { LogHelper.Info("任务下发", "报错:" + externalRes.Msg); ors.Msg = "出作业区失败:" + externalRes.Msg; ors.Success = false; ors.Code = externalRes.Code; } } taskNo = outModel.taskNo; } catch (Exception ex) { LogHelper.Info("任务下发", "失败,传参:" + JsonConvert.SerializeObject(outWorkAreaEntitys) + ex.ToString()); ors.Msg = "出作业区失败:" + ex.Message; ors.Code = externalRes.Code; ors.Success = false; } } else { LogHelper.Info("任务下发", " 任务号为:" + req.task_no + "未知的出入库类型"); ors.Msg = "未知的出入库类型:" + direction; ors.Success = false; return ors; } if (!string.IsNullOrEmpty(externalRes.Msg)) { if (externalRes.Msg.Contains("库存不足") || externalRes.Msg.Contains("空货位不足")) { if (req.Givewayto == "MES") { ZCReceivePriorityEntity task_MES = new ZCReceivePriorityEntity() { taskNo = req.task_no, Data_status = 3, End_big = req.Location_To, TOOLS_NO = req.TOOLS_NO, operattime = DateTime.Now }; // OperateResult qe = new OperateResult(); OperateResult qe = BLLCreator.CreateSingleton().MesTaskEntity(task_MES); LogHelper.Info("任务下发", "失败 通知MES 返回参数:" + JsonConvert.SerializeObject(qe)); } } } } else { // 不需要创建wms任务的执行流程,标识为成功 externalRes.Success = true; externalRes.okList = null; } //查询任务执行情况表是否有记录 var _serviceExec = SqlSugarHelper.Db.Queryable().Where(e => e.CN_S_TASK_NO == req.task_no)?.First(); if (_serviceExec != null) { } else { //如果没有记录--写入数据 _serviceExec = new TN_Service_execEntitys() { CN_S_TASK_NO = req.task_no, CN_S_ITEM_CODE = req.PROD_NO, CN_S_ITEM_NAME = req.PROD_BOM, CN_S_TASK_TYPE = "移送", // CN_S_TRANS_TYPE = req.SECTION, CN_S_TRAY_CODE = req.TOOLS_NO, CN_N_PRIORITY = req.Priority, CN_StartBit = req.Location_From, CN_S_END_LOCATION = req.Location_To, CN_T_CREATE = DateTime.Now, CN_C_COMPLETE = Constants.N, CN_C_SEND_MES = Constants.N, CN_F_QUANTITY = Convert.ToDecimal(req.CURRENT_AMOUNT), CN_N_REQUEST_TYPE = 0, CN_S_MSG = externalRes.Msg, CN_S_TRAY_TYPE = req.TOOLS_TPYE }; try { newDb.BeginTran(); var B = newDb.Insertable(_serviceExec).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.Info("任务下发", "任务执行情况记录 报错 " + ex.Message); newDb.RollbackTran(); } } if (!externalRes.Success)//任务失败 { _serviceExec.CN_C_COMPLETE = Constants.N; _serviceExec.CN_C_SEND_MES = Constants.N; _serviceExec.CN_S_MSG = externalRes.Msg; if (req.BUSI_TYPE == "7") { //如果出库任务是半成品-空托出库 就异步回滚 次数5次 每隔一分钟一次 _serviceExec.CN_C_SEND_MES = Constants.Y; req.NeedTrig = Constants.Y; if (req.frequency > 2) { _serviceExec.CN_C_SEND_MES = Constants.Y; req.NeedTrig = Constants.N; } //出库失败后将回报给mes ZCReceivePriorityEntity Rollmes = new ZCReceivePriorityEntity(); Rollmes.taskNo = req.task_no; Rollmes.operattime = DateTime.Now; Rollmes.remark = externalRes.Msg; LogHelper.Info("任务下发", "半成品空托出库失败回报给MES" + "参数为" + JsonConvert.SerializeObject(req)); OperateResult re = BLLCreator.CreateSingleton().RollMesAllocation(Rollmes); LogHelper.Info("任务下发", "半成品空托出库失败回报给MES" + "执行结果:" + JsonConvert.SerializeObject(re)); try { newDb.BeginTran(); var B = newDb.Updateable(_serviceExec).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.Info("任务下发", "任务执行情况记录 报错 " + ex.Message); newDb.RollbackTran(); } } } else { if (needCreateTask) { var ok = externalRes.okList[0]; _serviceExec.CN_S_TASK_NO = req.task_no; _serviceExec.CN_StartBit = ok.startBit; _serviceExec.CN_S_END_LOCATION = ok.endBit; _serviceExec.CN_S_TRAY_CODE = req.TOOLS_NO ?? ok.trayCode; _serviceExec.CN_S_TRAY_TYPE = req.TOOLS_TPYE; } else { _serviceExec.CN_StartBit = ""; _serviceExec.CN_S_END_LOCATION = ""; } // var ok = externalRes.okList[0]; // _serviceExec.CN_S_START_LOCATION = ok.startBit; // _serviceExec.CN_S_END_LOCATION = ok.endBit; _serviceExec.CN_C_COMPLETE = Constants.Y; _serviceExec.CN_C_SEND_MES = Constants.Y; _serviceExec.CN_S_MSG = externalRes.Msg ?? "下达成功"; try { newDb.BeginTran(); var B = newDb.Updateable(_serviceExec).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } catch (Exception ex) { LogHelper.Info("任务下发", "任务执行情况记录 报错 " + ex.Message); newDb.RollbackTran(); } req.NeedTrig = Constants.N; ors.Msg = "下达成功"; ors.Success = true; } // Log.DomainInfo("移送任务 结果", JsonConvert.SerializeObject(ors)); } catch (Exception ex) { ors.Msg = "移送任务失败:" + ex.Message; ors.Success = false; newDb.RollbackTran(); } LogHelper.Info("任务下发", "移送任务 结果" + JsonConvert.SerializeObject(ors)); return ors; } /// /// 回滚服务 /// /// /// public OperateResult EmptyTaskList(List EmptyList) { try { foreach (var item in EmptyList) { var chi = new SqlHelper().GetInstance(); var newDb2 = chi.CopyNew(); try { LogHelper.Info("回滚任务服务", "出空托"); MesTaskDto MesTask = new MesTaskDto() { task_no = item.requestPk, Task_type = "2", Givewayto = "WCS", Location_To = item.curPos }; MesTask.TOOLS_TPYE = "QB"; var re = BLLCreator.Create().ExecTransferTask(MesTask); LogHelper.Info("回滚任务服务", $"出空托是否成功:{JsonConvert.SerializeObject(re)}"); if (!re.Success) { LogHelper.Info("回滚任务服务", "出KJZ"); MesTask.Task_type = "2"; MesTask.BUSI_TYPE = "12"; MesTask.Givewayto = "WCS"; MesTask.Location_To = item.curPos; re = BLLCreator.Create().ExecTransferTask(MesTask); LogHelper.Info("回滚任务服务", $"出KJZ是否成功:{JsonConvert.SerializeObject(re)}"); } if (re.Success) { newDb2.BeginTran(); var B = newDb2.Updateable().SetColumns(it => new TN_Empty_MiddleEntitys { isread = "Y", }).Where(x => x.requestPk == item.requestPk).ExecuteCommand(); if (B == 0) { newDb2.RollbackTran(); } newDb2.CommitTran(); } LogHelper.Info("回滚任务服务", "移送任务 结果" + JsonConvert.SerializeObject(re)); } catch (Exception ex) { LogHelper.Info("回滚任务服务", "移送任务 报错" + ex.Message); SqlSugarHelper.Db.RollbackTran(); continue; } } return OperateResult.Succeed(); } catch (Exception ex) { return OperateResult.Error(ex.Message); } } /// /// 绑定解绑 /// /// public OperateResult TrayBindLocation(MesItemList sendTaskEntity) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { LogHelper.Info("绑定解绑", "开始"); if (sendTaskEntity.BUSI_TYPE == "100") { LogHelper.Info("绑定解绑", "绑定"); //先判断托盘码是否存在于数据库中 var TrayLocation = SqlSugarHelper.Db.Queryable().Where(e => e.S_CNTR_CODE == sendTaskEntity.TOOLS_NO).ToList(); if (TrayLocation.Count() > 0) { throw new Exception("查询到该工装已经绑定了货位信息"); } var TrayItems = SqlSugarHelper.Db.Queryable().Where(e => e.S_CNTR_CODE == sendTaskEntity.TOOLS_NO).ToList(); if (TrayItems.Count() > 0) { throw new Exception("查询到该工装已经绑定了物料信息"); } var Locations = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == sendTaskEntity.LOCATION_CODE)?.First(); if (Locations == null) { throw new Exception("未查询到需要绑定的货位信息"); } if (Locations.S_LOCK_STATE != "无") { throw new Exception($"需要绑定的货位{Locations.S_LOC_CODE}的状态为{Locations.S_LOCK_STATE} 货位不可用"); } if (Locations.C_ENABLE != "Y") { throw new Exception($"需要绑定的货位{Locations.S_LOC_CODE}的启用状态为{Locations.C_ENABLE} 货位不可用"); } if (Locations.N_CURRENT_NUM > 0) { throw new Exception($"需要绑定的货位{Locations.S_LOC_CODE}的当前容量为{Locations.N_CURRENT_NUM} 货位不可用"); } var LocCnt = new LocCntrRel(); LocCnt.S_CNTR_CODE = sendTaskEntity.TOOLS_NO; LocCnt.S_LOC_CODE = sendTaskEntity.LOCATION_CODE; newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 1 }).Where(x => x.S_LOC_CODE == sendTaskEntity.LOCATION_CODE).ExecuteCommand(); if (I == 0) { throw new Exception("更新货位数量为1失败"); } I = newDb.Insertable(LocCnt).ExecuteCommand(); if (I == 0) { throw new Exception("添加托盘货位表数据失败"); } var trayItemMstGuid = Guid.NewGuid().ToString(); //添加托盘物料关联表 CntrItemRel rel = new CntrItemRel(); rel.S_ITEM_CODE = sendTaskEntity.PROD_NO; rel.S_ITEM_NAME = sendTaskEntity.PROD_BOM; rel.S_CNTR_CODE = sendTaskEntity.TOOLS_NO; rel.S_BATCH_NO = ""; rel.TurnCardNum = sendTaskEntity.TurnCardNum; rel.Level = sendTaskEntity.PROD_BOM; rel.itemModel = sendTaskEntity.PROD_NO; rel.expireTime = sendTaskEntity.EXPIRED_TIME.AddHours(sendTaskEntity.EXPIRED_REP); rel.takeEffectTime = sendTaskEntity.SHELF_LIFE_TIME.AddHours(-sendTaskEntity.SHELF_REP); ; rel.F_QTY = Convert.ToDecimal(sendTaskEntity.CURRENT_AMOUNT); rel.S_ITEM_STATE = sendTaskEntity.CHECK_INFO; rel.productionDate = sendTaskEntity.PRODUCE_TIME; rel.T_INSTOCK = DateTime.Now; if (!string.IsNullOrEmpty(sendTaskEntity.PROD_NO)) { var A = newDb.Insertable(rel).ExecuteCommand(); if (A == 0) { throw new Exception("物料表添加失败"); } } newDb.CommitTran(); LogHelper.Info("绑定解绑", "结束"); return OperateResult.Succeed("绑定成功"); } else { LogHelper.Info("绑定解绑", "解绑"); LogHelper.Info("绑定解绑", "开始"); var ca = Expressionable.Create(); ca.AndIF(!string.IsNullOrEmpty(sendTaskEntity.Location_From), (o, p, t) => o.S_LOC_CODE == sendTaskEntity.Location_From); ca.AndIF(!string.IsNullOrEmpty(sendTaskEntity.TurnCardNum), (o, p, t) => t.TurnCardNum == sendTaskEntity.TurnCardNum); ca.AndIF(!string.IsNullOrEmpty(sendTaskEntity.TOOLS_NO), (o, p, t) => p.S_CNTR_CODE == sendTaskEntity.TOOLS_NO); var Locations = SqlSugarHelper.Db.Queryable().InnerJoin((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).Includes(e => e.LocCntrRel, p => p.CntrItemRel)?.First(); if (Locations == null) { throw new Exception("未查询到需要解绑的货位信息"); } if (Locations.S_LOCK_STATE != "无") { throw new Exception($"需要解绑的货位{Locations.S_LOC_CODE}的状态为{Locations.S_LOCK_STATE} 货位不可解绑"); } newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 0 }).Where(x => x.S_LOC_CODE == Locations.S_LOC_CODE).ExecuteCommand(); if (I == 0) { throw new Exception("更新货位数量为0失败"); } I = newDb.Deleteable().Where(e => e.S_LOC_CODE == Locations.S_LOC_CODE && e.S_CNTR_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand(); if (I == 0) { throw new Exception("删除托盘货位表失败"); } I = newDb.Deleteable().Where(e => e.S_CNTR_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand(); if (I == 0) { throw new Exception("删除托盘物料表失败"); } newDb.CommitTran(); LogHelper.Info("绑定解绑", "结束"); return OperateResult.Succeed("解绑成功"); } } catch (Exception ex) { newDb.RollbackTran(); LogHelper.Info("绑定解绑", ex.Message); return OperateResult.Error(ex.Message); } } /// /// 接驳 /// /// public void UnBing(List aloneWcsList) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); foreach (var item in aloneWcsList) { try { var re = BLLCreator.CreateSingleton().WcsCvstate(item); if (!re.Success) { continue; } } catch (Exception ex) { continue; } try { var ca = Expressionable.Create(); ca.And((o, p, t) => o.S_LOC_CODE == item.JbLocation); var Locations = (newDb.Queryable().InnerJoin((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).LeftJoin((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).Includes(e => e.LocCntrRel, p => p.CntrItemRel)?.First()) ?? throw new Exception("未查询到需要解绑的货位信息"); if (Locations.S_LOCK_STATE != "无") { throw new Exception($"需要解绑的货位{Locations.S_LOC_CODE}的状态为{Locations.S_LOCK_STATE} 货位不可解绑"); } newDb.BeginTran(); var 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 == Locations.S_LOC_CODE).ExecuteCommand(); if (I == 0) { throw new Exception("更新货位数量为0失败"); } I = newDb.Deleteable().Where(e => e.S_LOC_CODE == Locations.S_LOC_CODE && e.S_CNTR_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand(); if (I == 0) { throw new Exception("删除托盘货位表失败"); } if (Locations.LocCntrRel.CntrItemRel != null) { I = newDb.Deleteable().Where(e => e.S_CNTR_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand(); if (I == 0) { throw new Exception("删除托盘物料表失败"); } } I = newDb.Updateable().SetColumns(it => new AloneWcsTaskUnbingEntitys() { IsRead = "Y" }).Where(x => x.JbLocation == item.JbLocation).ExecuteCommand(); if (I == 0) { throw new Exception($"更新点对点接驳位释放表 接驳位为{item.JbLocation} 为已读失败"); } newDb.CommitTran(); } catch (Exception ex) { newDb.RollbackTran(); LogHelper.Info("绑定解绑", "事务触发解绑接驳位-->" + ex.Message); } } } /// /// 自动转运 /// public void AutoTransport() { var Product = SqlSugarHelper.Db.Queryable().Where(e => e.IsEnable == "Y").ToList(); foreach (var item in Product) { try { if (item.TaskState == "空架子出库") { //查询两个库区是否有空托 当没有空托的时候在出空架子 var StaArea = item.S_AreaList.Split(',').ToList(); var Location = SqlSugarHelper.Db.Queryable().Where(e => StaArea.Contains(e.S_AREA_CODE) && e.S_TRAY_TYPE == "KT").ToList(); if (Location.Count() == 0) { MesTaskDto task = new MesTaskDto { Task_type = "2", Location_To = item.S_EndBit, BUSI_TYPE = "12" }; var tta = BLLCreator.Create().ExecTransferTask(task); } } } catch (Exception ex) { throw; } } } /// /// 超过5分钟的空托任务 从立库出库 /// public void MesKtTaskIssued(List dtos) { var chi = new SqlHelper().GetInstance(); var newDb2 = chi.CopyNew(); foreach (var item in dtos) { var properties = typeof(MesKtTaskDto).GetProperties(); MesTaskDto Mestask = new MesTaskDto(); foreach (var property in properties) { var value = property.GetValue(item); if (value != null) { var targetProperty = typeof(MesTaskDto).GetProperty(property.Name); if (targetProperty != null && targetProperty.PropertyType == property.PropertyType) { targetProperty.SetValue(Mestask, value); } } } //将模型为MesKtTaskDto 转为模型MesTaskDto // var value = property.GetValue(item); //查询终点货位的当前容量是否超过最大容量 并且是堆叠式的类型 //查货位的容量是否可以生成到线边的任务 var transJson = newDb2.Queryable().Where(e => e.Autoindex == "堆叠-" + Mestask.TOOLS_TPYE)?.First(); List ListString = new List(); if (transJson != null) { ListString = JsonConvert.DeserializeObject>(transJson.TypeJson); } if (ListString.Contains(Mestask.Location_To)) { var ggf = BLLCreator.Create().ExecTransferTask(Mestask); if (ggf.Success) { try { LogHelper.Info("MES", $"空托任务生成 {Mestask.TOOLS_TPYE} 终点为{Mestask.Location_To}的任务"); newDb2.BeginTran(); var I = newDb2.Updateable().SetColumns(it => new MesKtTaskDto() { NeedTrig = "N" }).Where(x => x.task_no == Mestask.task_no).ExecuteCommand(); if (I == 0) { throw new Exception("影响行数为0"); } newDb2.CommitTran(); } catch (Exception ex) { LogHelper.Info("MES", $"空托任务生成 {Mestask.TOOLS_TPYE} 终点为{Mestask.Location_To}的任务报错:" + ex.Message); newDb2.RollbackTran(); } } } else { try { LogHelper.Info("MES", $"空托任务释放 {Mestask.TOOLS_TPYE} 终点为{Mestask.Location_To}的任务 原因 找不到对应的配置信息对应关系"); newDb2.BeginTran(); var I = newDb2.Updateable().SetColumns(it => new MesKtTaskDto() { NeedTrig = "N" }).Where(x => x.task_no == Mestask.task_no).ExecuteCommand(); if (I == 0) { throw new Exception("影响行数为0"); } newDb2.CommitTran(); } catch (Exception ex) { LogHelper.Info("MES", $"空托任务释放 {Mestask.TOOLS_TPYE} 终点为{Mestask.Location_To}的任务报错:" + ex.Message); newDb2.RollbackTran(); } } } } private bool ContainsAnyChar(string input, List charList) { bool gf = false; foreach (var item in charList) { if (input.Contains(input)) { gf = true; break; } } return gf; } } }