From bd327b1c240ed2aca48ab6e427285dcb12235f72 Mon Sep 17 00:00:00 2001 From: pengmn <pmn@HanInfo> Date: 星期三, 02 七月 2025 17:38:11 +0800 Subject: [PATCH] 1 --- HH.WCS.Mobox3.HangYang/process/TaskProcess.cs | 977 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 753 insertions(+), 224 deletions(-) diff --git a/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs b/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs index b5b0ab4..6694491 100644 --- a/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs +++ b/HH.WCS.Mobox3.HangYang/process/TaskProcess.cs @@ -12,6 +12,7 @@ using Swashbuckle.Swagger; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Reflection; using System.Security.Cryptography; @@ -373,9 +374,9 @@ } /// <summary> - /// 鍏ュ簱鍗曟柊澧�+ /// 鏉哀鐗╂枡涓绘暟鎹柊澧炴帴鍙� /// </summary> - /// <param name="model">鍏ュ簱鍗�/param> + /// <param name="model">鐗╂枡涓绘暟鎹�/param> /// <returns></returns> public static Result GetMaterialData(List<MES_Material> model) { @@ -384,44 +385,25 @@ { if (model == null) { - result.errMsg = "鍏ュ簱鍗曚笉鍙负绌哄�锛�; + result.errMsg = "鐗╂枡涓绘暟鎹笉鍙负绌哄�锛�; return result; } + var materialList = new List<TN_Material>(); - //foreach (var item in model.InOrderDetail) - //{ - // var itemType = WMSHelper.GetItemType(item.S_ITEM_CODE); - // if (itemType == null) - // { - // result.errMsg = $"鏈煡璇㈠埌鐗╂枡{item.S_ITEM_CODE}鐨勭墿鏂欏睘鎬э紒"; - // return result; - // } - // item.S_EXT_ATTR1 = itemType.S_ITEM_TYPE; - //} - - //var groupedInOrders = model.InOrderDetail - // .GroupBy(detail => detail.S_EXT_ATTR1) // 鎸夌墿鏂欏睘鎬у垎缁�- // .Select((group, index) => new InOrder - // { - // S_NO = $"{model.S_BS_NO}_{index + 1}", // 鎷兼帴鏉ユ簮鍗曞彿 - // S_BS_NO = model.S_BS_NO, - // S_OP_TYPE = model.S_OP_TYPE, - // S_BS_TYPE = model.S_BS_TYPE, - // S_NOTE = model.S_NOTE, - // InOrderDetail = group.Select(detail => - // { - // // 淇敼 group 涓殑 S_IO_NO 瀛楁涓�S_NO 鐨勫� - // detail.S_IO_NO = $"{model.S_BS_NO}_{index + 1}"; - // detail.S_BS_NO = model.S_BS_NO; - // return detail; - // }).ToList() // 鍒嗙粍鍚庣殑鏄庣粏 - // }) - // .ToList(); - //var res = WMSHelper.CreateOrderIn(groupedInOrders); - //if (res) - //{ - // result.success = true; - //} + foreach (var item in model) + { + materialList.Add(new TN_Material + { + S_ITEM_CODE = item.S_ITEM_CODE, + S_ITEM_NAME = item.S_ITEM_NAME, + S_ITEM_TYPE = item.S_AREA_CODE, + S_ITEM_SPEC = item.S_MATERIAL_SPEC, + S_MATERIAL = item.S_MATERIAL, + S_UOM = item.S_UOM, + C_CLEAN = item.C_CLEAN, + }); + } + WMSHelper.CreateMaterialData(materialList); return result; } catch (Exception ex) @@ -432,7 +414,7 @@ var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚 if (frame != null) { - LogHelper.Error($"GetInboundOrder鍏ュ簱鍗曟柊澧炲嚭鐜伴敊璇紒锛�, ex); + LogHelper.Error($"GetMaterialData鐗╂枡涓绘暟鎹柊澧炲嚭鐜伴敊璇紒锛�, ex); LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex); LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex); LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex); @@ -443,7 +425,7 @@ } /// <summary> - /// 鍏ュ簱鍗曟柊澧�+ /// 鍏ュ簱鍗曟柊澧炰互鍙婁慨鏀� /// </summary> /// <param name="model">鍏ュ簱鍗�/param> /// <returns></returns> @@ -517,9 +499,9 @@ } /// <summary> - /// 鍑哄簱鍗曟柊澧�+ /// 鍑哄簱鍗曟柊澧炰互鍙婁慨鏀� /// </summary> - /// <param name="model">鍏ュ簱鍗�/param> + /// <param name="model">鍑哄簱鍗�/param> /// <returns></returns> public static Result GetOutboundOrder(OutOrder model) { @@ -598,6 +580,85 @@ return result; } } + + /// <summary> + /// 鍏ュ簱鍗曞彇娑�+ /// </summary> + /// <param name="model">鍏ュ簱鍗�/param> + /// <returns></returns> + public static Result CancelInboundOrder(InOrder model) + { + Result result = new Result() { success = false, }; + try + { + if (model == null || !model.InOrderDetail.Any()) + { + result.errMsg = "鍏ュ簱鍗曞彇娑堜笉鍙负绌哄�锛�; + return result; + } + var res = WMSHelper.CancelOrderIn(model); + if (res) + { + result.success = true; + } + return result; + } + catch (Exception ex) + { + result.success = false; + result.errMsg = ex.Message; + var st = new System.Diagnostics.StackTrace(ex, true); + var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚 + if (frame != null) + { + LogHelper.Error($"CancelInboundOrder鍏ュ簱鍗曞彇娑堝嚭鐜伴敊璇紒锛�, ex); + LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex); + LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex); + LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex); + } + return result; + } + } + + /// <summary> + /// 鍑哄簱鍗曞彇娑�+ /// </summary> + /// <param name="model">鍑哄簱鍗�/param> + /// <returns></returns> + public static Result CancelOutboundOrder(OutOrder model) + { + Result result = new Result() { success = false }; + try + { + if (model == null || !model.OutOrderDetail.Any()) + { + result.errMsg = "鍑哄簱鍗曚笉鍙负绌哄�锛�; + return result; + } + var res = WMSHelper.CancelOrderOut(model); + if (res) + { + result.success = true; + } + return result; + } + catch (Exception ex) + { + result.success = false; + result.errMsg = ex.Message; + var st = new System.Diagnostics.StackTrace(ex, true); + var frame = st.GetFrame(0); + if (frame != null) + { + LogHelper.Error($"CancelOutboundOrder鍑哄簱鍗曞彇娑堝嚭鐜伴敊璇紒", ex); + LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex); + LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex); + LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex); + } + return result; + } + } + ///// <summary> ///// 鑾峰彇浣滀笟鍒涘缓鍏ュ簱浠诲姟 @@ -924,12 +985,12 @@ /// </summary> /// <param name="mst"></param> /// <returns></returns> - internal static bool CreateInTask(WMSTask mst) + internal static async Task<bool> CreateInTask(WMSTask mst) { try { if (mst.S_B_STATE.Trim() != "绛夊緟") return true; - if (string.IsNullOrEmpty(mst.S_START_LOC)) return false; + //if (string.IsNullOrEmpty(mst.S_START_LOC)) return false; var reservoirs = Settings.ReservoirAreas?.ToList(); if (reservoirs == null || !reservoirs.Any()) @@ -947,7 +1008,13 @@ case "鍚堟墭鍥炲簱": return HandleMergeReturn(mst, reservoirs); case "鍒嗘嫞鍥炲簱": - return HandleMergeReturn(mst, reservoirs); + return await SortingReturn(mst, reservoirs); + case "瑙g粦鍥炲簱": + return await UnbindReturn(mst, reservoirs); + case "绌烘墭鍥炲簱": + return await EmptyPalletReturn(mst, reservoirs); + case "绌烘墭鍑哄簱": + return EmptyPalletOutbound(mst); case "鏂欑鍑哄簱": return HandleBoxOutbound(mst, reservoirs); case "鍙戣揣鏆傚瓨": @@ -1135,7 +1202,7 @@ } /// <summary> - /// 鍚堟墭鍥炲簱 || 鍒嗘嫞鍥炲簱 + /// 鍚堟墭鍥炲簱 /// </summary> /// <param name="mst"></param> /// <param name="reservoirs"></param> @@ -1237,6 +1304,218 @@ } } return true; + } + + /// <summary> + /// 鍒嗘嫞鍥炲簱 + /// </summary> + /// <param name="mst"></param> + /// <param name="reservoirs"></param> + /// <returns></returns> + private static async Task<bool> SortingReturn(WMSTask mst, List<ReservoirArea> reservoirs) + { + var trayLst = ContainerHelper.GetCntr(mst.S_CNTR_CODE); + if (trayLst != null && trayLst.S_TYPE.Equals("鎵樼洏")) + { + //鎵樼洏鍒嗘嫞鍥炲簱 + var area = reservoirs.Where(s => s.areaName == "鍏ュ簱鎺ラ┏浣�).FirstOrDefault(); + if (area == null) + { + LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍏ュ簱鎺ラ┏浣嶏紒", "鏉哀"); + return false; + } + //(2.1)鍏堟煡璇㈠叆搴撴帴椹充綅鏄惁涓虹┖锛屽鏋滀负绌虹洿鎺ョ敓鎴愬埌鍏ュ簱鐨勪换鍔�+ var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); + if (anyLoc.Any()) + { + //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+ var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "鎵樼洏鍒嗘嫞鍥炲簱", mst.S_CNTR_CODE, mst.S_CODE); + if (!res) + { + LogHelper.Info("鎵樼洏鍒嗘嫞鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀"); + return false; + } + WMSHelper.UpdateStatus(mst, 1); + } + } + else + { + //鏂欑鍥炲簱 + var inbound = new Inbound() + { + areaCode = "LXLKQ" + }; + var wh = new Warehouse(inbound); + var stored = await wh.StoreItemAsync(); + if (stored == null) + { + LogHelper.Info($"鏈煡璇㈠埌{inbound.areaCode}鍙敤璐т綅锛�, "鏉哀"); + return false; + } + + var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, stored.loationCode, "鏂欑鍒嗘嫞鍥炲簱" , mst.S_CNTR_CODE, mst.S_CODE); + if (!res) + { + LogHelper.Info("鏂欑鍒嗘嫞鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀"); + return false; + } + WMSHelper.UpdateStatus(mst, 1); + } + return true; + } + + /// <summary> + /// 瑙g粦鍥炲簱 + /// </summary> + /// <param name="mst"></param> + /// <param name="reservoirs"></param> + /// <returns></returns> + private static async Task<bool> UnbindReturn(WMSTask mst, List<ReservoirArea> reservoirs) + { + var trayLst = ContainerHelper.GetCntr(mst.S_CNTR_CODE); + if (trayLst != null && trayLst.S_TYPE.Equals("鎵樼洏")) + { + //鎵樼洏鍒嗘嫞鍥炲簱 + var area = reservoirs.Where(s => s.areaName == "鍏ュ簱鎺ラ┏浣�).FirstOrDefault(); + if (area == null) + { + LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍏ュ簱鎺ラ┏浣嶏紒", "鏉哀"); + return false; + } + //(2.1)鍏堟煡璇㈠叆搴撴帴椹充綅鏄惁涓虹┖锛屽鏋滀负绌虹洿鎺ョ敓鎴愬埌鍏ュ簱鐨勪换鍔�+ var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); + if (anyLoc.Any()) + { + //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+ var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "鎵樼洏瑙g粦鍥炲簱", mst.S_CNTR_CODE, mst.S_CODE); + if (!res) + { + LogHelper.Info("鎵樼洏瑙g粦鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀"); + return false; + } + WMSHelper.UpdateStatus(mst, 1); + } + } + else + { + //鏂欑鍥炲簱 + var inbound = new Inbound() + { + areaCode = "LXLKQ" + }; + var wh = new Warehouse(inbound); + var stored = await wh.StoreItemAsync(); + if (stored == null) + { + LogHelper.Info($"鏈煡璇㈠埌{inbound.areaCode}鍙敤璐т綅锛�, "鏉哀"); + return false; + } + + var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, stored.loationCode, "鏂欑瑙g粦鍥炲簱", mst.S_CNTR_CODE, mst.S_CODE); + if (!res) + { + LogHelper.Info("鏂欑瑙g粦鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀"); + return false; + } + WMSHelper.UpdateStatus(mst, 1); + } + return true; + } + + /// <summary> + /// 绌烘墭鍥炲簱 + /// </summary> + /// <param name="mst"></param> + /// <param name="reservoirs"></param> + /// <returns></returns> + private static async Task<bool> EmptyPalletReturn(WMSTask mst, List<ReservoirArea> reservoirs) + { + var trayLst = ContainerHelper.GetCntr(mst.S_CNTR_CODE); + if (trayLst != null && trayLst.S_TYPE.Equals("鎵樼洏")) + { + //鎵樼洏绌烘墭鍥炲簱 + var area = reservoirs.Where(s => s.areaName == "鍏ュ簱鎺ラ┏浣�).FirstOrDefault(); + if (area == null) + { + LogHelper.Info("Settings鍑虹幇閿欒鏈煡璇㈠埌鍏ュ簱鎺ラ┏浣嶏紒", "鏉哀"); + return false; + } + //(2.1)鍏堟煡璇㈠叆搴撴帴椹充綅鏄惁涓虹┖锛屽鏋滀负绌虹洿鎺ョ敓鎴愬埌鍏ュ簱鐨勪换鍔�+ var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); + if (anyLoc.Any()) + { + //鐢熸垚鍒版帴椹充綅鐨勪换鍔�+ var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "鎵樼洏绌烘墭鍥炲簱", mst.S_CNTR_CODE, mst.S_CODE); + if (!res) + { + LogHelper.Info("鎵樼洏绌烘墭鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀"); + return false; + } + WMSHelper.UpdateStatus(mst, 1); + } + } + else + { + //鏂欑绌烘墭鍥炲簱 + var inbound = new Inbound() + { + areaCode = "LXLKQ" + }; + var wh = new Warehouse(inbound); + var stored = await wh.StoreItemAsync(); + if (stored == null) + { + LogHelper.Info($"鏈煡璇㈠埌{inbound.areaCode}鍙敤璐т綅锛�, "鏉哀"); + return false; + } + + var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, stored.loationCode, "鏂欑绌烘墭鍥炲簱", mst.S_CNTR_CODE, mst.S_CODE); + if (!res) + { + LogHelper.Info("鏂欑绌烘墭鍥炲簱浠诲姟鍒涘缓澶辫触锛�, "鏉哀"); + return false; + } + WMSHelper.UpdateStatus(mst, 1); + } + return true; + } + + /// <summary> + /// 绌烘墭鍑哄簱 + /// </summary> + /// <param name="mst"></param> + /// <param name="reservoirs"></param> + /// <returns></returns> + private static bool EmptyPalletOutbound(WMSTask mst) + { + var result = true; + var scheduler = new EmptyPalletOutboundScheduler(mst.S_START_AREA); + + var outbound = new Outbound + { + endArea = mst.S_END_AREA, + endBit = mst.S_END_LOC, + requiredCount = 1, + taskType = "绌烘墭鍑哄簱" + }; + // 璇锋眰鍑哄簱 + var tasks = scheduler.GenerateEmptyPalletTasks(outbound); + + foreach (var item in tasks) + { + // 鍒涘缓鍑哄簱浠诲姟 + var res = TaskProcess.HYCreateTransport(item.S_START_LOC, item.S_END_LOC, item.S_TYPE, item.S_CNTR_CODE, mst.S_CODE); + mst.S_START_LOC = item.S_START_LOC; + mst.S_CNTR_CODE = item.S_CNTR_CODE; + //淇敼绌烘墭鍑哄簱璧风偣鍜屾墭鐩樼爜 + UpdateTask(mst,1); + if (!res) + { + LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�); + return false; + } + } + return result; } /// <summary> @@ -1370,18 +1649,262 @@ if (locList.Any()) { var startLoc = WMSHelper.GetCntrLoc(mst.S_CNTR_CODE); - // 鍒涘缓鍑哄簱浠诲姟 - var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, locList.FirstOrDefault().S_CODE, mst.S_TYPE, mst.S_CNTR_CODE, mst.S_CODE); - if (!res) + if (startLoc != null) { - LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�); - return false; + // 鍒涘缓鍑哄簱浠诲姟 + var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, locList.FirstOrDefault().S_CODE, mst.S_TYPE, mst.S_CNTR_CODE, mst.S_CODE); + if (!res) + { + LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�); + return false; + } } + } return true; } + #endregion + + #region WCS璋冪敤鎺ュ彛 + + /// <summary> + /// WCS璋冪敤璁惧淇″彿鍙嶉 + /// </summary> + /// <param name="model">璇锋眰鍙傛暟</param> + /// <returns></returns> + public static async Task<WcsResult> notifyDeviceSignal(List<WcsModel> model) + { + WcsResult result = new WcsResult() { code = 1, }; + try + { + foreach (var item in model) + { + if (string.IsNullOrEmpty(item.cntrNo)) + { + result.msg = "鎵樼洏鍙蜂负绌猴紒"; + return result; + } + var list = WMSHelper.GetWmsTaskList("绛夊緟", item.cntrNo); + if (list == null) + { + list = WMSHelper.GetWmsTaskList("鎵ц", item.cntrNo); + if (list != null && list.S_TYPE.Contains("鍥炲簱")) + { + list.S_END_AREA = "TPLKQ"; + } + } + if (list == null) + { + result.msg = "鏈煡璇㈠埌鍦ㄧ瓑寰呬腑鐨勪綔涓氾紒"; + return result; + } + + var inbound = new Inbound() + { + areaCode = list.S_END_AREA + }; + var wh = new Warehouse(inbound); + var stored = await wh.StoreItemAsync(); + if (stored == null) + { + result.msg = "绔嬪簱鍖烘湭鏌ヨ鍒板彲鐢ㄨ揣浣嶏紒"; + return result; + } + + var startLoc = ContainerHelper.GetCntrLoc(list.S_CNTR_CODE); + if (startLoc == null) + { + result.msg = $"鏈煡璇㈠埌鎵樼洏{list.S_CNTR_CODE}鎵�湪鐨勮揣浣嶏紒"; + return result; + } + var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, stored.loationCode, list.S_B_STATE == "绛夊緟" ? "鏂欑鍏ュ簱" : "鎵樼洏鍏ュ簱", list.S_CNTR_CODE, list.S_CODE); + if (!res) + { + result.msg = "鍏ュ簱浠诲姟鍒涘缓澶辫触锛�; + return result; + } + WMSHelper.UpdateTaskStatus(list.S_CODE, 1); + ContainerHelper.UpdateCntrAbouts(list.S_CNTR_CODE, ""); + } + result.code = 0; + return result; + } + catch (Exception ex) + { + result.code = 2; + result.msg = ex.Message; + var st = new System.Diagnostics.StackTrace(ex, true); + var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚 + if (frame != null) + { + LogHelper.Error($"notifyDeviceSignal璁惧淇″彿鍙嶉鍑虹幇閿欒锛侊紒", ex); + LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex); + LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex); + LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex); + } + return result; + } + } + + /// <summary> + /// WCS璋冪敤浠诲姟鐘舵�鍙嶉 + /// </summary> + /// <param name="model">璇锋眰鍙傛暟</param> + /// <returns></returns> + public static async Task<WcsResult> notifyTaskStatus(WcsTaskModel model) + { + WcsResult result = new WcsResult() { code = 1, }; + try + { + if (model == null) + { + result.msg = "璇锋眰鍙傛暟涓虹┖"; + return result; + } + + var task = WCSHelper.GetTask(model.taskNo); + if (task == null) + { + result.msg = "鏈煡璇㈠埌浠诲姟鍙�; + return result; + } + + // 鐘舵�涓庢搷浣滅殑鏄犲皠瀛楀吀 + var stateActions = new Dictionary<int, Action> + { + [1] = () => WCSHelper.Begin(task), + [2] = () => HandleTaskCompletion(task), + [3] = () => WCSHelper.UpdateStatus(task, "寮�鍙栬揣"), + [4] = () => HandlePickCompletion(task), + [5] = () => WCSHelper.UpdateStatus(task, "寮�鍗歌揣"), + [6] = () => HandleUnloadCompletion(task), + [7] = () => HandleTaskFailure(task), + [8] = () => HandleTaskCompletion(task) + }; + result.code = 0; + return result; + } + catch (Exception ex) + { + result.code = 2; + result.msg = ex.Message; + var st = new System.Diagnostics.StackTrace(ex, true); + var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚 + if (frame != null) + { + LogHelper.Error($"notifyTaskStatus浠诲姟鐘舵�鍙嶉鍑虹幇閿欒锛侊紒", ex); + LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex); + LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex); + LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex); + } + return result; + } + } + + // 澶勭悊浠诲姟瀹屾垚閫昏緫 + private static void HandleTaskCompletion(WCSTask task) + { + WCSHelper.End(task); + + // 鏍规嵁浠诲姟绫诲瀷澶勭悊涓嶅悓鐨勫畬鎴愰�杈�+ if (Settings.CompleteTasks.taskType.Contains(task.S_TYPE)) + { + WMSHelper.UpdateWmsTask(task, 2); + WMSHelper.UpdateDistributionCntrState(2, 3, task.S_CNTR_CODE); + } + + if (new List<string> { "鏂欑鍏ュ簱", "鎵樼洏鍏ュ簱" }.Contains(task.S_TYPE)) + { + ContainerHelper.UpdateCntrItem(task.S_CNTR_CODE); + } + + // 澶勭悊鍖哄煙鍙樻洿 + HandleAreaChange(task); + } + + // 澶勭悊鍙栬揣瀹屾垚閫昏緫 + private static void HandlePickCompletion(WCSTask task) + { + WCSHelper.UpdateStatus(task, "鍙栬揣瀹屾垚"); + TaskProcess.OperateStatus(task, 4); + } + + // 澶勭悊鍗歌揣瀹屾垚閫昏緫 + private static void HandleUnloadCompletion(WCSTask task) + { + WCSHelper.UpdateStatus(task, "鍗歌揣瀹屾垚"); + TaskProcess.OperateStatus(task, 6); + } + + // 澶勭悊浠诲姟澶辫触閫昏緫 + private static void HandleTaskFailure(WCSTask task) + { + TaskProcess.OperateStatus(task, 7); + WCSHelper.Fail(task); + } + + // 澶勭悊鍖哄煙鍙樻洿閫昏緫 + private static void HandleAreaChange(WCSTask task) + { + var areas = new List<string> { "TPLKQ", "LXLKQ" }; + var area = new List<string> { "閰嶇洏鍑哄簱", "閰嶇洏缂撳瓨" }; + + if (areas.Contains(task.S_START_AREA) && !area.Contains(task.S_TYPE)) + { + WMSHelper.DeleteChange(task); + } + + if (areas.Contains(task.S_END_AREA)) + { + WMSHelper.AddChange(task); + } + } + + /// <summary> + /// WCS璋冪敤鐢宠缁堢偣 + /// </summary> + /// <param name="model">璇锋眰鍙傛暟</param> + /// <returns></returns> + public static async Task<WcsResult> applyDest(WcsTaskEnd model) + { + WcsResult result = new WcsResult() { code = 1, }; + try + { + if (model == null) + { + result.msg = "璇锋眰鍙傛暟涓虹┖"; + return result; + } + + var task = WCSHelper.GetTask(model.taskNo); + if (task == null) + { + result.msg = "鏈煡璇㈠埌浠诲姟鍙�; + return result; + } + + result.code = 0; + result.data.Add(new DataModel { taskNo = task.S_CODE, cntrCode = task.S_CNTR_CODE, end = task.S_END_LOC }); + return result; + } + catch (Exception ex) + { + result.code = 2; + result.msg = ex.Message; + var st = new System.Diagnostics.StackTrace(ex, true); + var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚 + if (frame != null) + { + LogHelper.Error($"applyDest鐢宠缁堢偣鍑虹幇閿欒锛侊紒", ex); + LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex); + LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex); + LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex); + } + return result; + } + } #endregion @@ -1406,10 +1929,6 @@ LogHelper.Error("CreateInTask鑾峰彇浣滀笟鍒涘缓鍏ュ簱浠诲姟鍑虹幇閿欒锛� + errorDetails, ex); } - - - - /// <summary> /// 寰幆鍏ュ簱缂撳瓨鍖烘煡璇㈠悎鎵樺伐浣嶅拰鍏ュ簱鎺ラ┏浣嶆槸鍚︽湁绌鸿揣浣嶏紙鍒涘缓浠诲姟锛�@@ -1575,202 +2094,212 @@ } /// <summary> - /// WCS璋冪敤璁惧淇″彿鍙嶉 + /// 鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔� /// </summary> - /// <param name="model">璇锋眰鍙傛暟</param> + /// <param name="distributionCntrs">閰嶇洏鍗�/param> /// <returns></returns> - public static async Task<Result> notifyDeviceSignal(List<Wcsmodel> model) + internal static bool GenerateFromPicking(List<DistributionCntr> distributionCntrs) { - Result result = new Result() { success = false, }; try { - foreach (var item in model) - { - if (string.IsNullOrEmpty(item.cntrNo)) - { - result.errMsg = "鎵樼洏鍙蜂负绌猴紒"; - return result; - } - var list = WMSHelper.GetWmsTaskList("绛夊緟", item.cntrNo); - if (list == null) - { - list = WMSHelper.GetWmsTaskList("鎵ц", item.cntrNo); - } - if (list == null) - { - result.errMsg = "鏈煡璇㈠埌鍦ㄧ瓑寰呬腑鐨勪綔涓氾紒"; - return result; - } + // 1. 鍒濆鍖栬皟搴﹀櫒鍜屽嚭搴撲换鍔″垪琛�+ var scheduler = new DoubleDeepOutboundScheduler(distributionCntrs); + var outboundTasks = CreateOutboundTasks(distributionCntrs); - var inbound = new Inbound() - { - areaCode = list.S_END_AREA - }; - var wh = new Warehouse(inbound); - var stored = await wh.StoreItemAsync(); - if (stored == null) - { - result.errMsg = "绔嬪簱鍖烘湭鏌ヨ鍒板彲鐢ㄨ揣浣嶏紒"; - return result; - } + // 2. 璁$畻璐т綅鐢熸垚浠诲姟鏁版嵁 + var tasks = scheduler.GenerateOutboundTasks(outboundTasks); + if (!tasks.Any()) return false; - var startLoc = ContainerHelper.GetCntrLoc(list.S_CNTR_CODE); - if (startLoc == null) - { - result.errMsg = $"鏈煡璇㈠埌鎵樼洏{list.S_CNTR_CODE}鎵�湪鐨勮揣浣嶏紒"; - return result; - } - var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, stored.loationCode, list.S_B_STATE == "绛夊緟" ? "鏂欑鍏ュ簱" : "鎵樼洏鍏ュ簱", list.S_CNTR_CODE, list.S_CODE); - if (!res) - { - result.errMsg = "鍏ュ簱浠诲姟鍒涘缓澶辫触锛�; - return result; - } - WMSHelper.UpdateTaskStatus(list.S_CODE, 1); - ContainerHelper.UpdateCntrAbouts(list.S_CNTR_CODE, ""); - } + // 3. 鍒涘缓WMS浣滀笟 + var mainTask = CreateMainWmsTask(tasks.Where(s=>s.S_TYPE == "閰嶇洏鍑哄簱").First()); + if (!WMSHelper.CreateWmsTask(mainTask)) return false; - - result.success = true; - return result; + // 4. 鐢熸垚WMS涓讳换鍔�+ return ProcessAllTransportTasks(tasks, mainTask.S_CODE); } catch (Exception ex) { - result.success = false; - result.errMsg = ex.Message; - var st = new System.Diagnostics.StackTrace(ex, true); - var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚 - if (frame != null) - { - LogHelper.Error($"notifyDeviceSignalWCS璋冪敤璁惧淇″彿鍙嶉鍑虹幇閿欒锛侊紒", ex); - LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex); - LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex); - LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex); - } - return result; + LogErrorWithStackTrace("鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″け璐�, ex); + return false; } } - /// <summary> - /// 鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔�- /// </summary> - /// <param name="distributionCntr">閰嶇洏鍗�/param> - /// <returns></returns> - internal static bool GenerateFromPicking(List<DistributionCntr> distributionCntr) + // --------------------- 杈呭姪鏂规硶 --------------------- + + private static List<Outbound> CreateOutboundTasks(List<DistributionCntr> distributionCntrs) { - try + return distributionCntrs.Select(item => new Outbound { - // 鍒涘缓璋冨害鍣�- var scheduler = new DoubleDeepOutboundScheduler(distributionCntr); + locCode = item.S_LOC_CODE, + areaCode = item.S_AREA_CODE, + endArea = item.S_EXIT_AREA_CODE, + endBit = item.S_EXIT_LOC_CODE, + trayCode = item.S_CNTR_CODE, + taskType = "閰嶇洏鍑哄簱" + }).ToList(); + } - var listOut = new List<Outbound>(); - foreach (var item in distributionCntr) + private static WMSTask CreateMainWmsTask(WCSTask firstTask) + { + return new WMSTask + { + S_CNTR_CODE = firstTask.S_CNTR_CODE, + S_CODE = WMSHelper.GenerateTaskNo(), + S_START_LOC = firstTask.S_START_LOC, + S_START_AREA = firstTask.S_START_AREA, + S_END_LOC = firstTask.S_END_LOC, + S_END_AREA = firstTask.S_END_AREA, + S_START_WH = "CK001", + S_END_WH = "CK001", + N_B_STATE = 1, + S_B_STATE = "鎵ц", + N_TYPE = 2, + S_TYPE = "閰嶇洏鍑哄簱" + }; + } + + private static bool ProcessAllTransportTasks(List<WCSTask> tasks, string wmsTaskCode) + { + foreach (var task in tasks.OrderBy(t => t.N_PRIORITY)) + { + if (IsLxLkqOrRelocationTask(task)) { - listOut.Add(new Outbound - { - locCode = item.S_LOC_CODE, - areaCode = item.S_AREA_CODE, - endArea = item.S_EXIT_AREA_CODE, - endBit = item.S_EXIT_LOC_CODE, - trayCode = item.S_CNTR_CODE, - taskType = "閰嶇洏鍑哄簱" - }); + if (!ProcessLxLkqTransportTask(task, wmsTaskCode)) + return false; } - // 璇锋眰鍑哄簱 - var tasks = scheduler.GenerateOutboundTasks(listOut); - - foreach (var item in tasks) + else { - var wmsTask = new WMSTask(); - if (string.IsNullOrEmpty(item.S_OP_CODE)) - { - wmsTask = new WMSTask - { - S_CNTR_CODE = item.S_CNTR_CODE, - S_CODE = WMSHelper.GenerateTaskNo(), - S_START_LOC = item.S_START_LOC, - S_START_AREA = item.S_START_AREA, - S_END_LOC = item.S_END_LOC, - S_END_AREA = item.S_END_AREA, - S_START_WH = "CK001", - S_END_WH = "CK001", - N_B_STATE = 1, - S_B_STATE = "鎵ц", - N_TYPE = 2, - S_TYPE = "閰嶇洏鍑哄簱" - }; - if (!WMSHelper.CreateWmsTask(wmsTask)) - { - return false; - } - } - - if (item.S_END_AREA == "LXLKQ") - { - // 鍒涘缓鍑哄簱浠诲姟 - var res = TaskProcess.HYCreateTransport(item.S_START_LOC, item.S_END_LOC, item.S_TYPE, item.S_CNTR_CODE, wmsTask.S_CODE); - UpdateDistributionCntrState(1, 2, item.S_CNTR_CODE); - if (!res) - { - LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�); - return false; - } - } - else - { - //鏍规嵁鍒嗘嫞璐т綅鍘绘煡璇㈤厤缃紝濡傛灉鍒嗘嫞鍖烘病鏈夌┖璐т綅灏卞幓鍑哄簱鍒嗘嫞鏆傚瓨鍖�- var relevancys = Settings.OutRelevancys.Where(s => s.conLoc == item.S_END_LOC).FirstOrDefault(); - if (relevancys == null) - { - LogHelper.Info($"Settings鏈煡璇㈠埌闆嗚揣浣峽item.S_END_LOC}瀵瑰簲鐨勫垎鎷d綅锛�, "鏉哀"); - break; - } - var locList = LocationHelper.GetLocListEmptyFree(relevancys.sorLoc.ToList()); - if (locList.Any()) - { - // 鍒涘缓鍑哄簱浠诲姟 - var res = TaskProcess.HYCreateTransport(item.S_START_LOC, locList.FirstOrDefault().S_CODE, item.S_TYPE, item.S_CNTR_CODE, wmsTask.S_CODE); - UpdateDistributionCntrState(1, 2, item.S_CNTR_CODE); - if (!res) - { - LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�); - return false; - } - } - else - { - var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "鎷i�缂撳瓨鍖�).FirstOrDefault(); - var lxLocations = LocationHelper.GetLocAreaList(reservoirs.areaCode); - if (lxLocations.Any()) - { - // 鍒涘缓鍑哄簱浠诲姟 - var res = TaskProcess.HYCreateTransport(item.S_START_LOC, lxLocations.FirstOrDefault().S_CODE, "閰嶇洏缂撳瓨", item.S_CNTR_CODE, wmsTask.S_CODE); - UpdateDistributionCntrState(1, 2, item.S_CNTR_CODE); - if (!res) - { - LogHelper.Info($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�); - return false; - } - } - } - } + if (!ProcessNormalTransportTask(task, wmsTaskCode)) + return false; } - return true; } - catch (Exception ex) + return true; + } + + private static bool IsLxLkqOrRelocationTask(WCSTask task) + { + return task.S_START_AREA == "LXLKQ" || task.S_TYPE == "娣变綅绉诲簱"; + } + + /// <summary> + /// 鐢熸垚LXLKQ || 娣变綅绉诲簱鐨勯厤鐩樹换鍔�+ /// </summary> + /// <param name="task"></param> + /// <param name="wmsTaskCode"></param> + /// <returns></returns> + private static bool ProcessLxLkqTransportTask(WCSTask task, string wmsTaskCode) + { + bool success = false; + if (task.S_TYPE == "娣变綅绉诲簱") { - var st = new System.Diagnostics.StackTrace(ex, true); - var frame = st.GetFrame(0); // 鑾峰彇绗竴涓爢鏍堝抚 - if (frame != null) - { - LogHelper.Error($"鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″け璐ex.Message}锛侊紒", ex); - LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex); - LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex); - LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex); - } + success = TaskProcess.HYCreateTransport( + task.S_START_LOC, + task.S_END_LOC, + task.S_TYPE, + task.S_CNTR_CODE, + wmsTaskCode, + task.N_PRIORITY); + return success; + } + var relevancy = Settings.OutRelevancys.FirstOrDefault(s => s.conLoc == task.S_END_LOC); + if (relevancy == null) + { + LogHelper.Info($"Settings鏈煡璇㈠埌闆嗚揣浣峽task.S_END_LOC}瀵瑰簲鐨勫垎鎷d綅锛�, "鏉哀"); return false; } + + // 灏濊瘯浣跨敤鍒嗘嫞浣�+ var emptyLoc = LocationHelper.GetLocListEmptyFree(relevancy.sorLoc.ToList()).FirstOrDefault(); + if (emptyLoc != null) + { + success = TaskProcess.HYCreateTransport( + task.S_START_LOC, + emptyLoc.S_CODE, + task.S_TYPE, + task.S_CNTR_CODE, + wmsTaskCode, + task.N_PRIORITY); + if (success && task.S_TYPE != "娣变綅绉诲簱") + { + UpdateDistributionCntrState(1, 2, task.S_CNTR_CODE); + } + } + return success; + } + + /// <summary> + /// 鐢熸垚TPLKQ鐨勯厤鐩樹换鍔�+ /// </summary> + /// <param name="task"></param> + /// <param name="wmsTaskCode"></param> + /// <returns></returns> + private static bool ProcessNormalTransportTask(WCSTask task, string wmsTaskCode) + { + var relevancy = Settings.OutRelevancys.FirstOrDefault(s => s.conLoc == task.S_END_LOC); + if (relevancy == null) + { + LogHelper.Info($"Settings鏈煡璇㈠埌闆嗚揣浣峽task.S_END_LOC}瀵瑰簲鐨勫垎鎷d綅锛�, "鏉哀"); + return false; + } + + // 灏濊瘯浣跨敤鍒嗘嫞浣�+ var emptyLoc = LocationHelper.GetLocListEmptyFree(relevancy.sorLoc.ToList()).FirstOrDefault(); + if (emptyLoc != null) + { + return CreateAndLogTransport( + task.S_START_LOC, + emptyLoc.S_CODE, + task.S_TYPE, + task.S_CNTR_CODE, + wmsTaskCode, + task.N_PRIORITY); + } + + // 灏濊瘯浣跨敤鎷i�缂撳瓨鍖�+ var reservoir = Settings.ReservoirAreas.FirstOrDefault(s => s.areaName == "鎷i�缂撳瓨鍖�); + if (reservoir == null) return false; + + var lxLocation = LocationHelper.GetLocAreaList(reservoir.areaCode).FirstOrDefault(); + if (lxLocation == null) return false; + + return CreateAndLogTransport( + task.S_START_LOC, + lxLocation.S_CODE, + "閰嶇洏缂撳瓨", + task.S_CNTR_CODE, + wmsTaskCode, + task.N_PRIORITY); + } + + private static bool CreateAndLogTransport(string startLoc, string endLoc, string taskType, + string cntrCode, string wmsTaskCode, int priority) + { + var success = TaskProcess.HYCreateTransport( + startLoc, endLoc, taskType, cntrCode, wmsTaskCode, priority); + + if (success) + { + UpdateDistributionCntrState(1, 2, cntrCode); + } + else + { + LogHelper.Info("鏍规嵁閰嶇洏鍗曠敓鎴愬嚭搴撲换鍔″垱寤哄嚭搴撲换鍔″け璐ワ紒锛�); + } + + return success; + } + + private static void LogErrorWithStackTrace(string message, Exception ex) + { + var st = new StackTrace(ex, true); + var frame = st.GetFrame(0); + if (frame == null) return; + + LogHelper.Error($"{message}{ex.Message}锛侊紒", ex); + LogHelper.Error($"鏂囦欢鍚� {frame.GetFileName()}", ex); + LogHelper.Error($"琛屽彿: {frame.GetFileLineNumber()}", ex); + LogHelper.Error($"鍒楀彿: {frame.GetFileColumnNumber()}", ex); } #endregion -- Gitblit v1.9.1