| | |
| | | else |
| | | { |
| | | var endLoc = db.Queryable<TN_Location>(). |
| | | Where(c => c.S_AREA_CODE == Settings.Areas[1] && c.S_LOCK_STATE == "无" && c.N_LOCK_STATE == 0 && c.N_CURRENT_NUM == 0 && c.C_ENABLE == "Y"). |
| | | OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位,直接判断当前数量为0即可 |
| | | Where(c => c.S_AREA_CODE == Settings.Areas[1] && c.S_LOCK_STATE == "无" |
| | | && c.N_LOCK_STATE == 0 && c.N_CURRENT_NUM == 0 |
| | | && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == c.S_CODE).NotAny()//不能有货 |
| | | && c.C_ENABLE == "Y"). |
| | | OrderBy(o => o.N_LAYER, OrderByType.Asc).First();//查询合适的终点货位,直接判断当前数量为0即可 |
| | | |
| | | if (endLoc != null) |
| | | { |
| | |
| | | |
| | | endLoc.N_LOCK_STATE = 1; |
| | | endLoc.S_LOCK_STATE = "入库锁"; |
| | | startLoc.T_MODIFY = System.DateTime.Now; |
| | | endLoc.T_MODIFY = System.DateTime.Now; |
| | | |
| | | using (var tran = db.Ado.UseTran()) |
| | | { |
| | |
| | | ITEMCODE = woInfo.S_ITEM_CODE, |
| | | LOGINNAME = woInfo.S_LINE_NO, |
| | | SHIFT = "None", |
| | | STARTLOC = startLoc.S_CODE, |
| | | }; |
| | | SpecHelper.InsertInventoryM(target); |
| | | }); |
| | |
| | | return; |
| | | } |
| | | |
| | | var endLoc = db.Queryable<TN_Location>(). |
| | | var endLoc = db.Queryable<TN_Location>().//空托上线的终点不校验是否有货 |
| | | First(a => a.S_CODE == endPoint.PointIn && a.S_LOCK_STATE == "无" && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y"); |
| | | |
| | | if (endLoc == null) |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 线边满托货位自动解绑 |
| | | /// </summary> |
| | | internal static void XBChekcFull() |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | try |
| | | { |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 在复检区检测物品合格,合格的物品自动回库 |
| | | /// </summary> |
| | | internal static void CGOkCheck() |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | try |
| | | { |
| | | var startLoc = db.Queryable<TN_Location>() |
| | | .LeftJoin<TN_Loc_Container>((o, i) => o.S_CODE == i.S_LOC_CODE) |
| | | .LeftJoin<TN_CG_Detail>((o, i, s) => i.S_CNTR_CODE == s.S_CNTR_CODE) |
| | | .Where((o, i, s) => s.N_ITEM_STATE == 0 && s.S_ITEM_STATE == "合格" |
| | | && o.S_AREA_CODE == Settings.Areas[7] && o.N_CURRENT_NUM > 0 |
| | | && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无").First(); |
| | | |
| | | if (startLoc== null) |
| | | { |
| | | LogHelper.Info("复检区没有合格的物品,无需自动返回"); |
| | | return; |
| | | } |
| | | |
| | | var endLoc = db.Queryable<TN_Location>() |
| | | .OrderBy(a => a.N_LAYER, OrderByType.Asc) |
| | | .First(a => a.S_AREA_CODE == Settings.Areas[1] |
| | | && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" |
| | | && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == a.S_CODE).NotAny()//不能有货 |
| | | ); |
| | | |
| | | if (endLoc == null) |
| | | { |
| | | LogHelper.Info("终点库区已满或者已全部锁住"); |
| | | return; |
| | | } |
| | | |
| | | var cginfo = db.Queryable<TN_CG_Detail>() |
| | | .LeftJoin<TN_Loc_Container>((o, i) => o.S_CNTR_CODE == i.S_CNTR_CODE) |
| | | .Where((o, i) => i.S_LOC_CODE == startLoc.S_CODE).First(); |
| | | |
| | | if (WCSHelper.CreateTask(startLoc.S_CODE, endLoc.S_CODE, "复检合格自动回库", 3, cginfo.S_CNTR_CODE, out string taskNo, cginfo.S_SPE))//创建搬送任务,起点终点容器 |
| | | { |
| | | LocationHelper.LockLoc(startLoc.S_CODE, 2);//起点出库锁, |
| | | LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁 |
| | | LogHelper.Info($"生成复检合格自动回库任务成功,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}"); |
| | | |
| | | Task task99 = Task.Run(() => |
| | | { |
| | | WMSHelper.InsertOpInfo("自动轮询", "复检合格自动回库", cginfo.S_CNTR_CODE); |
| | | }); |
| | | |
| | | Task task27 = Task.Run(() => |
| | | { |
| | | var target = new TN_InventoryM() |
| | | { |
| | | S_ID = cginfo.S_ID, |
| | | RFID = cginfo.S_CNTR_CODE, |
| | | SPEC = cginfo.S_SPE, |
| | | WEIGHT = cginfo.F_QTY, |
| | | ITEMSTATE = cginfo.S_ITEM_STATE, |
| | | ITEMCODE = cginfo.S_ITEM_CODE, |
| | | LOGINNAME = "自动轮询", |
| | | SHIFT = "无", |
| | | STARTLOC = startLoc.S_CODE, |
| | | }; |
| | | SpecHelper.InsertInventoryM(target); |
| | | }); |
| | | |
| | | return ; |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"生成复检合格自动回库任务失败,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}"); |
| | | return; |
| | | } |
| | | |
| | | } |
| | | catch(Exception ex) |
| | | { |
| | | LogHelper.Error("CGOkCheck发生了异常", ex); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 满托过期出库 过期合格回库,过期次品回炉 |
| | | /// </summary> |
| | | internal static void FullOutTime() |
| | |
| | | if (startLoc_1 != null) |
| | | { |
| | | var endLoc_1 = db.Queryable<TN_Location>() |
| | | .First(o => o.S_AREA_CODE == Settings.Areas[12] && |
| | | o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"); |
| | | .Where(o => o.S_AREA_CODE == Settings.Areas[12] |
| | | && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()//不能有货 |
| | | && o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无").First(); |
| | | |
| | | if (endLoc_1 != null) |
| | | { |
| | |
| | | LocationHelper.LockLoc(startLoc_1.S_CODE, 2);//起点出库锁, |
| | | LocationHelper.LockLoc(endLoc_1.S_CODE, 1);//终点入库锁 |
| | | LogHelper.Info($"生成满托过期出库任务成功,容器号{outTimeCg.S_CNTR_CODE},起点{startLoc_1.S_CODE},终点{endLoc_1.S_CODE}"); |
| | | |
| | | Task task27 = Task.Run(() => |
| | | { |
| | | SpecHelper.DeleteInventoryM(outTimeCg.S_ID); |
| | | }); |
| | | } |
| | | } |
| | | } |
| | |
| | | if (startLoc_2 != null) |
| | | { |
| | | var endLoc_2 = db.Queryable<TN_Location>() |
| | | .First(o => o.S_AREA_CODE == Settings.Areas[2] && |
| | | o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"); |
| | | .Where(o => o.S_AREA_CODE == Settings.Areas[2] |
| | | && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()//不能有货 |
| | | && o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无") |
| | | .First(); |
| | | |
| | | if (endLoc_2 != null) |
| | | { |
| | |
| | | ITEMCODE = outTimeCg.S_ITEM_CODE, |
| | | LOGINNAME = "过期合格回库轮询", |
| | | SHIFT = "None", |
| | | STARTLOC = startLoc_2.S_CODE, |
| | | }; |
| | | SpecHelper.InsertInventoryM(target); |
| | | }); |
| | |
| | | if (startLoc_3 != null) |
| | | { |
| | | var endLoc_3 = db.Queryable<TN_Location>() |
| | | .First(o => o.S_AREA_CODE == Settings.Areas[11] && |
| | | o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"); |
| | | .Where(o => o.S_AREA_CODE == Settings.Areas[11] |
| | | && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()//不能有货 |
| | | && o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无").First(); |
| | | |
| | | if (endLoc_3 != null) |
| | | { |
| | |
| | | db.Updateable<TN_EquipProDetail>(targetEPD).UpdateColumns(it => new { it.ITEMSTATE }).ExecuteCommand(); |
| | | |
| | | var cginfo = db.Queryable<TN_CG_Detail>().First(a => a.S_ID == targetEPD.S_ID); |
| | | cginfo.S_ITEM_STATE = "过期"; |
| | | cginfo.N_ITEM_STATE = 3; |
| | | db.Updateable<TN_CG_Detail>(cginfo).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand(); |
| | | |
| | | if (cginfo != null) |
| | | { |
| | | cginfo.S_ITEM_STATE = "过期"; |
| | | cginfo.N_ITEM_STATE = 3; |
| | | db.Updateable<TN_CG_Detail>(cginfo).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand(); |
| | | } |
| | | } |
| | | |
| | | // 同步 TN_InventoryM 与 TN_CG_Detail |
| | |
| | | db.Updateable<TN_InventoryM>(targetInM).UpdateColumns(it => new { it.ITEMSTATE }).ExecuteCommand(); |
| | | } |
| | | |
| | | |
| | | targetInM = db.Queryable<TN_InventoryM>().LeftJoin<TN_CG_Detail>((o, i) => o.S_ID == i.S_ID). |
| | | Where((o, i) => System.DateTime.Now >= o.EXPIRATION && i.S_ITEM_STATE == "待检" && i.N_ITEM_STATE == 1).First(); |
| | | Where((o, i) => System.DateTime.Now >= o.EXPIRATION |
| | | && ((i.S_ITEM_STATE == "待检" && i.N_ITEM_STATE == 1) |
| | | || (i.S_ITEM_STATE == "合格" && i.N_ITEM_STATE == 0)) |
| | | ).First(); |
| | | |
| | | if (targetInM != null)//检测出已过期的货品 |
| | | { |
| | | targetInM.ITEMSTATE = "过期"; |
| | | targetInM.EXPIRATION_DAY = 0; |
| | | targetInM.EXPIRATION_DAY = "0"; |
| | | db.Updateable<TN_InventoryM>(targetInM).UpdateColumns(it => new { it.ITEMSTATE }).ExecuteCommand(); |
| | | |
| | | var cginfo = db.Queryable<TN_CG_Detail>().First(a => a.S_ID == targetInM.S_ID); |
| | | cginfo.S_ITEM_STATE = "过期"; |
| | | cginfo.N_ITEM_STATE = 3; |
| | | db.Updateable<TN_CG_Detail>(cginfo).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand(); |
| | | |
| | | if (cginfo != null) |
| | | { |
| | | cginfo.S_ITEM_STATE = "过期"; |
| | | cginfo.N_ITEM_STATE = 3; |
| | | db.Updateable<TN_CG_Detail>(cginfo).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand(); |
| | | } |
| | | } |
| | | |
| | | targetInM = db.Queryable<TN_InventoryM>().LeftJoin<TN_CG_Detail>((o, i) => o.S_ID == i.S_ID). |
| | | Where((o, i) => System.DateTime.Now < o.EXPIRATION && i.S_ITEM_STATE == "待检" && i.N_ITEM_STATE == 1).First(); |
| | | var targetInMList = db.Queryable<TN_InventoryM>().LeftJoin<TN_CG_Detail>((o, i) => o.S_ID == i.S_ID). |
| | | Where((o, i) => System.DateTime.Now < o.EXPIRATION |
| | | && ((i.S_ITEM_STATE == "待检" && i.N_ITEM_STATE == 1) |
| | | || (i.S_ITEM_STATE == "合格" && i.N_ITEM_STATE == 0)) |
| | | ).ToList(); |
| | | |
| | | if (targetInM != null)//检测出快过期的货品 |
| | | if (targetInMList.Count > 0)//检测出快过期的货品 |
| | | { |
| | | targetInM.EXPIRATION_DAY = SpecHelper.CalculateDaysDifference(System.DateTime.Now,targetInM.EXPIRATION); |
| | | foreach (var item in targetInMList) |
| | | { |
| | | item.EXPIRATION_DAY = SpecHelper.CalculateDaysDifference(System.DateTime.Now, item.EXPIRATION).ToString(); |
| | | } |
| | | db.Updateable<TN_InventoryM>(targetInMList).UpdateColumns(it => new { it.EXPIRATION_DAY }).ExecuteCommand(); |
| | | } |
| | | |
| | | targetInM = db.Queryable<TN_InventoryM>().First(a => Convert.ToInt32(a.EXPIRATION_DAY) > 0 && a.ITEMSTATE == "过期"); |
| | | if (targetInM != null)//已过期的货品,剩余天数改为0 |
| | | { |
| | | targetInM.EXPIRATION_DAY = "0"; |
| | | db.Updateable<TN_InventoryM>(targetInM).UpdateColumns(it => new { it.EXPIRATION_DAY }).ExecuteCommand(); |
| | | } |
| | | |
| | | |
| | | // 同步 TN_DayProDetail |
| | | var curDay = System.DateTime.Now.Date; |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LogHelper.Error($"发生了异常,同步TN_EquipProDetail异常,{ex.Message}", ex); |
| | | // 获取最内层异常(通常是实际引发问题的异常) |
| | | Exception innerEx = ex; |
| | | while (innerEx.InnerException != null) |
| | | { |
| | | innerEx = innerEx.InnerException; |
| | | } |
| | | |
| | | // 获取堆栈帧信息 |
| | | var stackTrace = new System.Diagnostics.StackTrace(innerEx, true); |
| | | var stackFrame = stackTrace.GetFrame(0); // 获取最顶层的堆栈帧 |
| | | |
| | | // 获取文件名和行号 |
| | | string fileName = stackFrame.GetFileName(); |
| | | int lineNumber = stackFrame.GetFileLineNumber(); |
| | | |
| | | LogHelper.Error($"发生了异常,同步TN_EquipProDetail异常,文件:{fileName}, 行号:{lineNumber}, 错误:{ex.Message}\r\n{ex.StackTrace}", ex); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | var endLoc = db.Queryable<TN_Location>().First(a => a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.S_AREA_CODE == Settings.Areas[7]); |
| | | var endLoc = db.Queryable<TN_Location>() |
| | | .Where(a => a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" |
| | | && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == a.S_CODE).NotAny()//不能有货 |
| | | && a.S_AREA_CODE == Settings.Areas[7]).First(); |
| | | |
| | | if (endLoc == null) |
| | | { |
| | | LogHelper.Info($"未找到合适的终点货位,要求a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == 无 && a.S_AREA_CODE == Settings.Areas[7]"); |
| | |
| | | LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁 |
| | | |
| | | LogHelper.Info($"生成满托出库复检任务成功,容器:{cntId.S_CNTR_CODE},起点:{startLoc.S_CODE},终点:{endLoc.S_CODE}"); |
| | | |
| | | Task task27 = Task.Run(() => |
| | | { |
| | | SpecHelper.DeleteInventoryM(cgInfo.S_ID); |
| | | }); |
| | | } |
| | | else |
| | | { |
| | |
| | | } |
| | | |
| | | var endLoc = db.Queryable<TN_Location>(). |
| | | Where(a => a.S_AREA_CODE == Settings.Areas[4] && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && a.N_CURRENT_NUM == 0). |
| | | Where(a => a.S_AREA_CODE == Settings.Areas[4] && a.N_LOCK_STATE == 0 |
| | | && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && a.N_CURRENT_NUM == 0 |
| | | && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == a.S_CODE).NotAny() |
| | | ). |
| | | OrderBy(a => a.N_CURRENT_NUM, OrderByType.Asc). |
| | | First(); |
| | | |