using HH.WCS.Mobox3.NFLZ.util; using HH.WCS.Mobox3.NFLZ.wms; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace HH.WCS.Mobox3.NFLZ.core { internal class WMSCore { /// /// 遍历定版的发货单,生产分拣单主表和子表(也可以手动调接口触发) /// internal static void CheckShippingOrder() { //1.0、获取已经定版的发货单,生产分拣单子表和主表,设置【发货单】的业务状态 N_B_STATE = 1(待分拣) //2.0、如果发货单C_AUTO_SORTING=Y,则自动将分拣单状态设置为开始配货 } /// /// 开始配货创建分拣单明细(改成调接口触发) /// internal static void CheckSortingOrder() { //new SortingOrder().N_B_STATE //1.0、获取 N_B_STATE = 1 (开始配货)状态的分拣单 //2.0、遍历分拣单子表,创建分拣单明细,更新分拣单子表的明细汇总F_ACC_S_QTY //3.0、全部分拣单子表的明细创建完毕,子表明细汇总和子表数量一致,更新分拣单状态,N_B_STATE = 2配货完成 //4.0、如果分拣单是自动作业,就直接更新到 N_B_STATE = 3开始作业 //WMSHelper.GetWaitingSortingOrderList(); } /// /// 作业启动,创建子任务 /// internal static void Start() { LogHelper.Info($"作业启动 创建子任务"); var db = new SqlHelper().GetInstance(); List list = WMSHelper.GetWaitingOperationList(); LogHelper.Info($"获取任务数据 数量{list.Count}"); if (list.Count > 0) { //如果是出库的作业锁定托盘的时候已经明确起点了,如果发货单或分拣单指定了终点, //如果没有作业、任务的顺序限制就可以启动,创建子任务了 foreach (var a in list) { try { if (a.N_TYPE == 1) { //查询托盘所在位置 //计算终点 Location end = WMSHelper.GetEnd(a); if (end != null) { LogHelper.Info($"作业{a.S_CODE} 获取终点成功 任务终点{end.S_CODE}"); WMSHelper.UpdateTaskEnd(a); LocationHelper.LockLoc(end.S_CODE, 1); var startinfo = db.Queryable().Where(it => it.S_CODE == a.S_START_LOC).First(); var endinfo = db.Queryable().Where(it => it.S_CODE == end.S_CODE).First(); var wcsTask = new WCSTask { S_OP_CODE = a.S_CODE, S_OP_NAME = "入库", S_CODE = WCSHelper.GenerateTaskNo(), S_TYPE = a.S_OP_DEF_NAME, S_START_LOC = a.S_START_LOC, S_START_AREA = startinfo.S_AREA_CODE, S_START_WH = startinfo.S_WH_CODE, S_END_LOC = end.S_CODE, S_END_AREA = endinfo.S_AREA_CODE, S_END_WH = endinfo.S_WH_CODE, S_SCHEDULE_TYPE = "NDC", S_WORK_MODE = "agv", N_CNTR_COUNT = 1, S_CNTR_CODE = a.S_CNTR_CODE, N_START_LAYER = startinfo.N_CURRENT_NUM, N_END_LAYER = endinfo.N_CURRENT_NUM + 1 }; if (WCSHelper.CreateTask(wcsTask)) { //更新作业状态为执行 a.N_B_STATE = 1; a.S_B_STATE = "执行"; WMSHelper.UpdateTaskState(a); } } else { LogHelper.Info($"作业{a.S_CODE} 获取终点失败"); } } else if (a.N_TYPE == 2) { //通过托盘获取到对应的分拣单 通过分拣单查找发货单上的终点库区 如果是备货出库的话 从配置文件中找一个空闲的点位 //计算终点 Location end = WMSHelper.GetEnd(a); if (end != null) { WMSHelper.UpdateTaskEnd(a); LocationHelper.LockLoc(end.S_CODE, 1); var startinfo = db.Queryable().Where(it => it.S_CODE == a.S_START_LOC).First(); var endinfo = db.Queryable().Where(it => it.S_CODE == end.S_CODE).First(); //创建wcs任务 var wcsTask = new WCSTask { S_OP_CODE = a.S_CODE, S_OP_NAME = "出库", S_CODE = WCSHelper.GenerateTaskNo(), S_TYPE = a.S_OP_DEF_NAME, S_START_LOC = a.S_START_LOC, S_START_AREA = startinfo.S_AREA_CODE, S_START_WH = startinfo.S_WH_CODE, S_END_LOC = end.S_CODE, S_END_AREA = endinfo.S_AREA_CODE, S_END_WH = endinfo.S_WH_CODE, S_SCHEDULE_TYPE = "NDC", S_WORK_MODE = "agv", N_CNTR_COUNT = 1, S_CNTR_CODE = a.S_CNTR_CODE, N_START_LAYER = startinfo.N_CURRENT_NUM, N_END_LAYER = endinfo.N_CURRENT_NUM + 1 }; if (WCSHelper.CreateTask(wcsTask)) { //更新作业状态为执行 a.N_B_STATE = 1; a.S_B_STATE = "执行"; WMSHelper.UpdateTaskState(a); } } else { LogHelper.Info($"作业{a.S_CODE} 获取终点失败"); } } } catch (Exception ex) { LogHelper.Error($"作业启动异常 异常信息={ex.Message}", ex); } } } } } }