using HH.WCS.DaYang.util; using HH.WCS.DaYang.wms; using Opc.Ua; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace HH.WCS.DaYang.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() { List list = WMSHelper.GetWaitingOperationList(); if (list.Count > 0) { var db = new SqlHelper().GetInstance(); //空托回库任务创建 list.ForEach(a => { //空托回库 if (a.N_TYPE == 1) { if (!string.IsNullOrEmpty(a.S_END_LOC)) { string JbwLoc = ""; //创建agv搬运任务 var wcsTask1 = new WCSTask { S_OP_CODE = a.S_CODE, S_OP_NAME = "入库", S_CODE = WCSHelper.GenerateTaskNo(), S_TYPE = "空托回库", S_START_LOC = a.S_START_LOC, S_END_LOC = JbwLoc, N_SCHEDULE_TYPE = 1, N_CNTR_COUNT = 1, S_CNTR_CODE = a.S_CNTR_CODE, }; //创建wcs回库任务 var wcsTask2 = new WCSTask { S_OP_CODE = a.S_CODE, S_OP_NAME = "入库", S_CODE = WCSHelper.GenerateTaskNo(), S_TYPE = "空托回库", S_START_LOC = JbwLoc, S_END_LOC = a.S_END_LOC, N_SCHEDULE_TYPE = 2, N_CNTR_COUNT = 1, S_CNTR_CODE = a.S_CNTR_CODE, }; if (WCSHelper.CreateTask(wcsTask1) && WCSHelper.CreateTask(wcsTask2)) { //更新作业状态为执行 a.N_B_STATE = 1; a.S_B_STATE = "执行"; LocationHelper.LockLoc(a.S_START_LOC, 2); LocationHelper.LockLoc(a.S_END_LOC, 1); WMSHelper.UpdateTaskState(a); } } } else if (a.N_TYPE == 2) { #region MyRegion //判断外侧有没有托盘,需不需要移库 var StartLoc = db.Queryable().Where(b => b.S_AREA_CODE == a.S_START_AREA && b.S_CODE == a.S_START_LOC).First(); var OutLoc = db.Queryable().Where(b => b.S_AREA_CODE == StartLoc.S_AREA_CODE && b.N_LAYER == StartLoc.N_LAYER && b.N_POS == 1 && b.N_CURRENT_NUM == 1 && b.N_LOCK_STATE == 0).First(); if (OutLoc != null) { //根据起点获取托盘和托盘物料绑定关系 string itemCode = ""; var cntrLoc = LocationHelper.GetLocCntr(OutLoc.S_CODE).FirstOrDefault(); if (cntrLoc != null) { //获取托盘物料绑定关系 var cntrItem = db.Queryable().Where(b => b.S_CNTR_CODE == cntrLoc.S_CNTR_CODE).First(); if (cntrItem != null) { itemCode = cntrItem.S_ITEM_CODE; } } var YiKuLoc = LocationHelper.InStorage(itemCode); if (YiKuLoc != null) { var wcsTask = new WCSTask { S_OP_CODE = a.S_CODE, S_OP_NAME = "出库", S_CODE = WCSHelper.GenerateTaskNo(), S_TYPE = "移库", S_START_LOC = OutLoc.S_CODE, S_END_LOC = YiKuLoc.S_CODE, N_SCHEDULE_TYPE = 2, N_CNTR_COUNT = 1, S_CNTR_CODE = a.S_CNTR_CODE, }; if (WCSHelper.CreateTask(wcsTask) ) { //更新作业状态为执行 LocationHelper.LockLoc(OutLoc.S_CODE, 2); LocationHelper.LockLoc(YiKuLoc.S_CODE, 1); } } else { LogHelper.Info($"作业:{a.S_CODE}外侧货位{OutLoc.S_CODE},未计算到移库货位,作业不启动"); return; } ; } #endregion string JbwLoc = ""; //创建wcs任务 var wcsTask1 = new WCSTask { S_OP_CODE = a.S_CODE, S_OP_NAME = "出库", S_CODE = WCSHelper.GenerateTaskNo(), S_TYPE = "出库", S_START_LOC = a.S_START_LOC, S_END_LOC = JbwLoc, N_SCHEDULE_TYPE = 2, N_CNTR_COUNT = 1, S_CNTR_CODE = a.S_CNTR_CODE, }; //创建wcs回库任务 var wcsTask2 = new WCSTask { S_OP_CODE = a.S_CODE, S_OP_NAME = "出库", S_CODE = WCSHelper.GenerateTaskNo(), S_TYPE = "出库", S_START_LOC = JbwLoc, S_END_LOC = a.S_END_LOC, N_SCHEDULE_TYPE = 1, N_CNTR_COUNT = 1, S_CNTR_CODE = a.S_CNTR_CODE, }; if (WCSHelper.CreateTask(wcsTask1) && WCSHelper.CreateTask(wcsTask2)) { //更新作业状态为执行 a.N_B_STATE = 1; a.S_B_STATE = "执行"; LocationHelper.LockLoc(a.S_START_LOC, 2); LocationHelper.LockLoc(a.S_END_LOC, 1); WMSHelper.UpdateTaskState(a); } } }); } } } }