| | |
| | | using HH.WCS.DaYang.wms; |
| | | using HH.WCS.DaYang.util; |
| | | using HH.WCS.DaYang.wms; |
| | | using Opc.Ua; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace HH.WCS.DaYang.core { |
| | | internal class WMSCore { |
| | | namespace HH.WCS.DaYang.core |
| | | { |
| | | internal class WMSCore |
| | | { |
| | | /// <summary> |
| | | /// 遍历定版的发货单,生产分拣单主表和子表(也可以手动调接口触发) |
| | | /// </summary> |
| | | internal static void CheckShippingOrder() { |
| | | internal static void CheckShippingOrder() |
| | | { |
| | | //1.0、获取已经定版的发货单,生产分拣单子表和主表,设置【发货单】的业务状态 N_B_STATE = 1(待分拣) |
| | | //2.0、如果发货单C_AUTO_SORTING=Y,则自动将分拣单状态设置为开始配货 |
| | | |
| | |
| | | /// <summary> |
| | | /// 开始配货创建分拣单明细(改成调接口触发) |
| | | /// </summary> |
| | | internal static void CheckSortingOrder() { |
| | | internal static void CheckSortingOrder() |
| | | { |
| | | //new SortingOrder().N_B_STATE |
| | | //1.0、获取 N_B_STATE = 1 (开始配货)状态的分拣单 |
| | | //2.0、遍历分拣单子表,创建分拣单明细,更新分拣单子表的明细汇总F_ACC_S_QTY |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 作业启动,创建子任务 |
| | | /// </summary> |
| | | internal static void Start() { |
| | | internal static void Start() |
| | | { |
| | | |
| | | List<WMSTask> list = WMSHelper.GetWaitingOperationList(); |
| | | if (list.Count > 0) { |
| | | if (list.Count > 0) |
| | | { |
| | | var db = new SqlHelper<WCSTask>().GetInstance(); |
| | | //空托回库任务创建 |
| | | list.ForEach(a => { |
| | | if (a.N_TYPE == 1) { |
| | | if (!string.IsNullOrEmpty(a.S_END_LOC)) |
| | | list.ForEach(a => |
| | | { |
| | | var startLoc = LocationHelper.GetLoc(a.S_START_LOC); |
| | | var endLoc = LocationHelper.GetLoc(a.S_END_LOC); |
| | | //空托回库 |
| | | if (a.N_TYPE == 1) |
| | | { |
| | | if (!string.IsNullOrEmpty(a.S_END_LOC)) |
| | | { |
| | | string JbwLoc = ""; |
| | | var jbwloc = LocationHelper.GetLoc("XTGKW-1-1"); |
| | | if (jbwloc == null) |
| | | { |
| | | LogHelper.Info("创建出库任务未找到接驳位货位编码,请假查接驳位置货位"); |
| | | } |
| | | |
| | | //创建agv搬运任务 |
| | | var wcsTask1 = new WCSTask |
| | | { |
| | | S_OP_CODE = a.S_CODE, |
| | | S_OP_NAME = "入库", |
| | | S_CODE = WCSHelper.GenerateTaskNo(), |
| | | S_TYPE = "空托回库", |
| | | S_TYPE = "AGV空托回库", |
| | | S_START_LOC = a.S_START_LOC, |
| | | S_END_LOC = JbwLoc, |
| | | S_START_AREA = a.S_START_AREA, |
| | | N_START_LANE= startLoc.N_ROADWAY, |
| | | N_END_LANE = endLoc.N_ROADWAY, |
| | | S_END_LOC = jbwloc.S_CODE, |
| | | S_END_AREA = jbwloc.S_AREA_CODE, |
| | | N_SCHEDULE_TYPE = 1, |
| | | N_CNTR_COUNT = 1, |
| | | S_CNTR_CODE = a.S_CNTR_CODE, |
| | | |
| | | N_PRIORITY=1, |
| | | }; |
| | | //创建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_TYPE = "WCS空托回库", |
| | | S_START_LOC = jbwloc.S_CODE, |
| | | S_START_AREA = jbwloc.S_AREA_CODE, |
| | | S_END_LOC = a.S_END_LOC, |
| | | S_END_AREA = a.S_END_AREA, |
| | | N_START_LANE = startLoc.N_ROADWAY, |
| | | N_END_LANE = endLoc.N_ROADWAY, |
| | | N_SCHEDULE_TYPE = 2, |
| | | N_CNTR_COUNT = 1, |
| | | S_CNTR_CODE = a.S_CNTR_CODE, |
| | | |
| | | N_PRIORITY = 1, |
| | | }; |
| | | if (WCSHelper.CreateTask(wcsTask1)&& WCSHelper.CreateTask(wcsTask2)) |
| | | |
| | | 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<Location>().Where(b => b.S_CODE == a.S_START_LOC).First(); |
| | | if (StartLoc.N_POS == 1) |
| | | { |
| | | int row = 0; |
| | | //判断外侧排 |
| | | switch (StartLoc.N_ROW) |
| | | { |
| | | case 1: |
| | | row = 2; |
| | | break; |
| | | case 4: |
| | | row = 3; |
| | | break; |
| | | case 5: |
| | | row = 6; |
| | | break; |
| | | case 8: |
| | | row = 7; |
| | | break; |
| | | } |
| | | var OutLoc = db.Queryable<Location>().Where(b => b.S_AREA_CODE == StartLoc.S_AREA_CODE && b.N_LAYER == StartLoc.N_LAYER && b.N_ROW == row && 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<CntrItemDetail>().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, |
| | | N_PRIORITY = 1, |
| | | }; |
| | | 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 = "XTGKW-1-1"; |
| | | var jbwloc= db.Queryable<Location>().Where(b => b.S_CODE == "XTGKW-1-1").First(); |
| | | if (jbwloc == null) |
| | | { |
| | | LogHelper.Info("创建出库任务未找到接驳位货位编码,请假查接驳位置货位"); |
| | | } |
| | | //创建wcs任务 |
| | | var wcsTask1 = new WCSTask |
| | | { |
| | | S_OP_CODE = a.S_CODE, |
| | | S_OP_NAME = "出库", |
| | | S_CODE = WCSHelper.GenerateTaskNo(), |
| | | S_TYPE = "WCS出库", |
| | | S_START_LOC = a.S_START_LOC, |
| | | S_START_AREA = a.S_START_AREA, |
| | | S_END_LOC = jbwloc.S_CODE, |
| | | S_END_AREA = jbwloc.S_AREA_CODE, |
| | | N_START_LANE = startLoc.N_ROADWAY, |
| | | N_END_LANE = endLoc.N_ROADWAY, |
| | | N_SCHEDULE_TYPE = 2, |
| | | N_CNTR_COUNT = 1, |
| | | S_CNTR_CODE = a.S_CNTR_CODE, |
| | | N_PRIORITY = 1, |
| | | }; |
| | | //创建agv出库任务 |
| | | var wcsTask2 = new WCSTask |
| | | { |
| | | S_OP_CODE = a.S_CODE, |
| | | S_OP_NAME = "出库", |
| | | S_CODE = WCSHelper.GenerateTaskNo(), |
| | | S_TYPE = "AGV出库", |
| | | S_START_LOC = jbwloc.S_CODE, |
| | | S_START_AREA = jbwloc.S_AREA_CODE, |
| | | S_END_LOC = a.S_END_LOC, |
| | | S_END_AREA = a.S_END_AREA, |
| | | N_START_LANE = startLoc.N_ROADWAY, |
| | | N_END_LANE = endLoc.N_ROADWAY, |
| | | N_SCHEDULE_TYPE = 1, |
| | | N_CNTR_COUNT = 1, |
| | | S_CNTR_CODE = a.S_CNTR_CODE, |
| | | N_PRIORITY = 1, |
| | | }; |
| | | |
| | | 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 == 3) //根据作业起点终点生成wcs任务 |
| | | { |
| | | //创建wcs任务 |
| | | var wcsTask = new WCSTask |
| | | { |
| | | S_OP_CODE = a.S_CODE, |
| | | S_OP_NAME = a.S_TYPE, |
| | | S_CODE = WCSHelper.GenerateTaskNo(), |
| | | S_TYPE = a.S_TYPE, |
| | | S_START_LOC = a.S_START_LOC, |
| | | S_START_AREA = a.S_START_AREA, |
| | | S_END_LOC = a.S_END_LOC, |
| | | S_END_AREA = a.S_END_AREA, |
| | | N_START_LANE = startLoc.N_ROADWAY, |
| | | N_END_LANE = endLoc.N_ROADWAY, |
| | | N_SCHEDULE_TYPE = 2, |
| | | N_CNTR_COUNT = 1, |
| | | S_CNTR_CODE = a.S_CNTR_CODE, |
| | | N_PRIORITY = 1, |
| | | }; |
| | | |
| | | if (WCSHelper.CreateTask(wcsTask)) |
| | | { |
| | | //更新作业状态为执行 |
| | | 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); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | } |