using System; using System.Collections.Generic; using System.Linq; using HH.WCS.Mobox3.DSZSH.Consts; using HH.WCS.Mobox3.DSZSH.Helpers; using HH.WCS.Mobox3.DSZSH.Helpers.Model; using HH.WCS.Mobox3.DSZSH.Models; using Newtonsoft.Json; namespace HH.WCS.Mobox3.DSZSH.ServiceCore { /// /// 定时轮询任务:出库业务核心 /// public class OutboundCore { /// /// 后台轮询出库单/出库明细单,生成出库任务表 /// public static void CheckOutboundOrder() { var db = DbHelper.GetDbClient(); try { // 查找所有的 等待出库 的 出库单,按 先创建先处理 排序 var orders = db.Queryable() .Where(o => o.N_B_STATE == 0) .OrderBy(o => o.T_CREATE) .Mapper( o => o.Details, // 将子表数据映射到主表的 Details 属性 o => o.S_NO, // 主表关联字段 d => d.S_NO // 子表关联字段 ) .ToList(); if (orders.Count == 0) { LogHelper.Info("轮询 | 当前没有等待执行的出库单"); return; } using (var tran = db.Ado.UseTran()) { foreach (var o in orders) { foreach (var d in o.Details) { for (int i = 0; i < d.N_QTY; i++) { var task = new TN_Outbound_Task { S_CG_ID = d.S_CG_ID, S_END_AREA = d.S_END_AREA, N_FORCE = o.N_FORCE, S_BATCH_NO = d.S_BATCH_NO, N_STATE = 0 }; if (db.Insertable(task).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info("插入任务出错"); return; } } d.N_B_STATE = 1; if (db.Updateable(d).UpdateColumns(c => c.N_B_STATE).ExecuteCommand() > 0) { LogHelper.Info("更新 N_B_STATE 成功"); } else { tran.RollbackTran(); LogHelper.Info("更新 N_B_STATE 失败"); return; } } o.N_B_STATE = 1; if (db.Updateable(o).UpdateColumns(c => c.N_B_STATE).ExecuteCommand() > 0) { LogHelper.Info("更新 N_B_STATE 成功"); } else { tran.RollbackTran(); LogHelper.Info("更新 N_B_STATE 失败"); return; } } tran.CommitTran(); } } catch (Exception ex) { LogHelper.InfoEx(ex); throw; } } /// /// 轮询出库 /// public static void CheckOutboundTask() { var db = DbHelper.GetDbClient(); try { var task = db.Queryable() .Where(t => t.N_STATE == 0).First(); if (task == null) { LogHelper.Info("轮询 | 出库任务队列 暂无待执行的任务"); return; } var headTask = task; if (headTask.N_STATE != 0) { LogHelper.Info("轮询 | 出库任务队列 队头任务尚未完成"); return; } var locCntr = db.Queryable ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE) // 筛选要求的物料编码和批次号 .Where((l, c, d) => d.S_CG_ID == headTask.S_CG_ID && d.S_BATCH_NO == headTask.S_BATCH_NO) // 如果不是强制出库,物料状态必须必须合格 // 否则,只要不是正在检验的物料即可 .Where((l, c, d) => (headTask.N_FORCE == 0 && d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "合格") || (headTask.N_FORCE != 0 && d.N_ITEM_STATE != 3 && d.S_ITEM_STATE != "正在检验")) // 物料状态对应的数字,越小越优先 .OrderBy((l, c, d) => d.N_ITEM_STATE) .OrderBy(l => l.N_LAYER) .Select((l, c) => new { Location = l, Container = c }).First(); if (locCntr == null) { LogHelper.Info("轮询 | 不存在符合条件的物料货位"); return; } var endLoc = db.Queryable() .Where(l => l.S_AREA_CODE == headTask.S_END_AREA) .Where(ExprHelper.LocIsFree) .Where(ExprHelper.LocIsEmpty) .OrderBy(l => l.S_CODE) .First(); if (endLoc == null) { LogHelper.Info("轮询 | 不存在符合条件的出库终点库位"); return; } using (var tran = db.Ado.UseTran()) { if (TaskHelper.LogCreateTask(locCntr.Location.S_CODE, locCntr.Container.S_CNTR_CODE, endLoc.S_CODE, TaskName.成品胶出库)) { task.N_STATE = 1; if (db.Updateable(task).UpdateColumns(c => c.N_STATE).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info("修改出库任务状态错误"); } else { tran.CommitTran(); LogHelper.Info("修改出库任务状态成功"); } } } } catch (Exception ex) { LogHelper.InfoEx(ex); } } /// /// /// /// public static void UpdateTaskState(int state = 2) { } } }