From f2518583da4cc3d3737986e112b92154535aea4d Mon Sep 17 00:00:00 2001 From: pengmn <pmn@HanInfo> Date: 星期四, 29 五月 2025 17:32:48 +0800 Subject: [PATCH] 1 --- HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs | 313 +++++++++++++++++++++++++++++++++++----------------- 1 files changed, 211 insertions(+), 102 deletions(-) diff --git a/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs b/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs index 5270858..724875c 100644 --- a/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs +++ b/HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs @@ -42,63 +42,10 @@ var date = DateTime.Now.ToString("yyMMdd"); return $"SO{date}{id.ToString().PadLeft(4, '0')}"; } - internal static List<WMSTask> GetOperationListByState(string state) - { - var db = new SqlHelper<object>().GetInstance(); - return db.Queryable<WMSTask>().Where(a => a.S_B_STATE == state).ToList(); - } - internal static List<WMSTask> GetOperationListByState(int state) - { - var db = new SqlHelper<object>().GetInstance(); - return db.Queryable<WMSTask>().Where(a => a.N_B_STATE == state).ToList(); - } internal static List<WMSTask> GetWaitingOperationList() { var db = new SqlHelper<object>().GetInstance(); return db.Queryable<WMSTask>().Where(a => a.N_B_STATE == 0 || a.N_B_STATE == 3).ToList(); - } - internal static PutawayOrder GetPutawayOrder(string no) - { - var db = new SqlHelper<object>().GetInstance(); - return db.Queryable<PutawayOrder>().Where(a => a.S_NO == no).First(); - } - internal static bool CreatePutawayOrder(PutawayOrder model) - { - var db = new SqlHelper<object>().GetInstance(); - var result = db.Insertable<PutawayOrder>(model).ExecuteCommand() > 0; - db.Insertable<PutawayDetail>(model.Details).ExecuteCommand(); - return result; - } - - internal static PutawayDetail GetPutawayOrderDetail(string no, string item_code) - { - var db = new SqlHelper<object>().GetInstance(); - return db.Queryable<PutawayDetail>().Where(a => a.S_PUTAWAY_NO == no && a.S_ITEM_CODE == item_code).First(); - } - internal static PutawayDetail GetPutawayOrderDetail(string item_code) - { - var db = new SqlHelper<object>().GetInstance(); - return db.Queryable<PutawayDetail>().Where(a => a.S_ITEM_CODE == item_code && a.F_QTY - a.F_ACC_B_QTY > 0).OrderByDescending(a => a.T_CREATE).First(); - } - - internal static void UpdatePutawayOrderDetailQty(PutawayDetail model) - { - var db = new SqlHelper<object>().GetInstance(); - db.Updateable(model).UpdateColumns(it => new { it.F_ACC_B_QTY }).ExecuteCommand(); - } - - - internal static ShippingOrder GetShippingOrder(string no) - { - var db = new SqlHelper<object>().GetInstance(); - return db.Queryable<ShippingOrder>().Includes(a => a.Details).Where(a => a.S_NO == no).First(); - } - internal static bool CreateShippingOrder(ShippingOrder model) - { - var db = new SqlHelper<object>().GetInstance(); - var result = db.Insertable<ShippingOrder>(model).ExecuteCommand() > 0; - db.Insertable<ShippingDetail>(model.Details).ExecuteCommand(); - return result; } internal static bool CreateSortingOrder(List<string> list) @@ -273,11 +220,6 @@ throw new NotImplementedException(); } - internal static Location GetStart(WMSTask a) - { - throw new NotImplementedException(); - } - internal static void UpdateTaskState(WMSTask task) { var db = new SqlHelper<object>().GetInstance(); @@ -293,11 +235,8 @@ return db.Updateable<WMSTask>(a).UpdateColumns(it => new { it.S_END_LOC, it.T_MODIFY }).ExecuteCommand() > 0; } - internal static WMSTask GetWmsTask(string code) - { - var db = new SqlHelper<object>().GetInstance(); - return db.Queryable<WMSTask>().Where(a => a.S_CODE == code).First(); - } + + internal static void CreateSortingOrderDetail(string so_no) { @@ -372,15 +311,6 @@ } } - /// <summary> - /// 鑾峰彇寮�閰嶈揣鐨勫垎鎷e崟锛屼竴娆℃�鐢熸垚鍒嗘嫞鏄庣粏锛岄伩鍏嶇敓鎴愪竴鍗婂啀鐢熸垚锛屾墍浠ュ垱寤哄垎鎷f槑缁嗙殑鏃跺�鍔犱笂浜嬪姟 - /// </summary> - /// <returns></returns> - internal static List<SortingOrder> GetWaitingSortingOrderList() - { - var db = new SqlHelper<object>().GetInstance(); - return db.Queryable<SortingOrder>().Includes(a => a.Composes).Where(a => a.N_B_STATE == 1 || a.N_B_STATE == 20).ToList(); - } /// <summary> /// 鑾峰彇閰嶈揣瀹屾垚鐨勫垎鎷e崟锛屾瘡涓垎鎷e崟鍗曠嫭鍒涘缓鍒嗘嫞浣滀笟 /// </summary> @@ -746,10 +676,10 @@ internal static LocCntrRel GetCntrLoc(string trayCode) { var db = new SqlHelper<object>().GetInstance(); - + var locCntr = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE.Trim() == trayCode).First(); - var locList = db.Queryable<Location>().Where(p => p.S_CODE == locCntr.S_LOC_CODE - && p.N_CURRENT_NUM == p.N_CAPACITY + var locList = db.Queryable<Location>().Where(p => p.S_CODE == locCntr.S_LOC_CODE + && p.N_CURRENT_NUM == p.N_CAPACITY && p.S_LOCK_STATE.Trim() == "鏃� && p.S_AREA_CODE == "JXHCQ").First(); if (locList == null) @@ -820,10 +750,10 @@ /// <param name="state">鐘舵�</param> /// <param name="trayCode">鎵樼洏鍙�/param> /// <returns></returns> - internal static bool UpdateDistributionCntrState(int taskState,int state,string trayCode) + internal static bool UpdateDistributionCntrState(int taskState, int state, string trayCode) { var db = new SqlHelper<object>().GetInstance(); - var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.N_B_STATE == taskState && a.S_CNTR_CODE == trayCode ).First(); + var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.N_B_STATE == taskState && a.S_CNTR_CODE == trayCode).First(); if (distributionCntr != null) { distributionCntr.N_B_STATE = state; @@ -917,11 +847,19 @@ return res; } + internal static bool UpdateTask(WMSTask a, int state) + { + var db = new SqlHelper<object>().GetInstance(); + a.T_MODIFY = DateTime.Now; + a.N_B_STATE = state; + a.S_B_STATE = GetStateStr(state); + return db.Updateable<WMSTask>(a).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.S_CNTR_CODE, it.S_START_LOC, it.T_MODIFY }).ExecuteCommand() > 0; + } #endregion #region 鏉哀绔嬪簱鍑哄叆搴撻�杈戠畻娉�- + /// <summary> /// 绔嬪簱鍏ュ簱灏佽绠楁硶 /// </summary> @@ -939,7 +877,7 @@ { var db = new SqlHelper<object>().GetInstance(); var locations = db.Queryable<Location>().Where(a => a.S_AREA_CODE == inbound.areaCode).ToList(); - if(inbound.roadWay != 0) + if (inbound.roadWay != 0) { locations.RemoveAll(s => s.N_ROADWAY != inbound.roadWay); } @@ -1061,7 +999,7 @@ return null; // 鏃犲彲鐢ㄤ綅缃� } private readonly ConcurrentDictionary<string, SemaphoreSlim> _locationLocks = new ConcurrentDictionary<string, SemaphoreSlim>(); - + public async Task<LocationParams> StoreItemAsync() { LocationParams location = null; @@ -1099,7 +1037,7 @@ } /// <summary> - /// 绔嬪簱鍑哄簱灏佽绠楁硶 + /// 閰嶇洏鍑哄簱灏佽绠楁硶 /// </summary> public class DoubleDeepOutboundScheduler { @@ -1117,7 +1055,7 @@ // 鐢熸垚鍑哄簱浠诲姟闃熷垪锛堝惈绉诲簱浠诲姟锛� /// <summary> - /// 绔嬪簱WMS璐т綅鍑哄簱绠楁硶锛堣繍鐢ㄤ簬閰嶇洏鍗曞嚭搴撱�绌烘墭鍑哄簱锛�+ /// 绔嬪簱WMS璐т綅鍑哄簱绠楁硶锛堣繍鐢ㄤ簬閰嶇洏鍗曞嚭搴擄級 /// </summary> /// <param name="outbound">鍑哄簱鍙傛暟</param> /// <returns></returns> @@ -1134,7 +1072,7 @@ var wmsTask = WMSHelper.GetWmsTaskList("鎵ц", outboundItem.trayCode); if (wmsTask == null) { - LogHelper.Info($"鏈煡璇㈠埌鍦ㄦ墽琛屼腑鐨勪綔涓�{outboundItem.trayCode}锛�, "鏉哀"); + //LogHelper.Info($"鏈煡璇㈠埌鍦ㄦ墽琛屼腑鐨勪綔涓�{outboundItem.trayCode}锛�, "鏉哀"); outboundItem.opCode = ""; } @@ -1158,6 +1096,7 @@ .Where(x => x.S_CODE == outerLoc.S_CODE) .ToList() .ForEach(x => x.N_LOCK_STATE = 3); + var trayCode = ContainerHelper.GetLocCntr(outerLoc.S_CODE); tasks.Add(new WCSTask { S_CODE = GenerateTaskNo(), @@ -1171,20 +1110,14 @@ N_SCHEDULE_TYPE = 1, N_B_STATE = 0, S_B_STATE = WCSTask.GetStateStr(0), - S_CNTR_CODE = outboundItem.trayCode, + S_CNTR_CODE = trayCode.S_CNTR_CODE, N_START_LAYER = 1, N_END_LAYER = 1, N_CNTR_COUNT = 1 }); } else continue; - } - //else - //{ - // //璐т綅涓虹┖鐩存帴鐢熸垚鍑哄簱浠诲姟 - // tasks.Add(CreateOutboundTask(targetLoc, outboundItem)); - //} } else { @@ -1223,19 +1156,19 @@ private Location FindBestRelocationTarget(Location outerLoc) { - return _allLocations - .Where(loc => - loc.N_ROADWAY == outerLoc.N_ROADWAY && - loc.N_LOCK_STATE == 0 && - loc.N_CURRENT_NUM == 0 && - loc.S_CODE != outerLoc.S_CODE) - .OrderBy(loc => loc.N_ROW == outerLoc.N_ROW ? 1 : 0) - .ThenBy(loc => loc.N_COL) - .ThenBy(loc => Math.Abs(loc.N_LAYER - outerLoc.N_LAYER)) - .FirstOrDefault(); + return _allLocations + .Where(loc => + loc.N_ROADWAY == outerLoc.N_ROADWAY && + loc.N_LOCK_STATE == 0 && + loc.N_CURRENT_NUM == 0 && + loc.S_CODE != outerLoc.S_CODE) + .OrderBy(loc => loc.N_ROW == outerLoc.N_ROW ? 1 : 0) + .ThenBy(loc => loc.N_COL) + .ThenBy(loc => Math.Abs(loc.N_LAYER - outerLoc.N_LAYER)) + .FirstOrDefault(); } - private WCSTask CreateOutboundTask(Location loc,Outbound outbound) => + private WCSTask CreateOutboundTask(Location loc, Outbound outbound) => new WCSTask { S_CODE = GenerateTaskNo(), @@ -1245,7 +1178,7 @@ S_END_LOC = outbound.endBit, S_TYPE = outbound.taskType, S_OP_CODE = outbound.opCode, - N_PRIORITY = 1, + N_PRIORITY = 0, N_SCHEDULE_TYPE = 1, N_B_STATE = 0, S_B_STATE = WCSTask.GetStateStr(0), @@ -1294,6 +1227,182 @@ } } + + public class EmptyPalletOutboundScheduler + { + private readonly List<Location> _allLocations; + + public EmptyPalletOutboundScheduler(string areaCode) + { + var db = new SqlHelper<object>().GetInstance(); + _allLocations = db.Queryable<Location>() + .Where(a => a.S_AREA_CODE == areaCode) + .ToList(); + } + + /// <summary> + /// 绌烘墭鐩樺嚭搴撶畻娉曪紙鑷姩瀵绘壘鍙敤绌烘墭骞剁敓鎴愪换鍔★級 + /// </summary> + public List<WCSTask> GenerateEmptyPalletTasks(Outbound outbound) + { + var tasks = new List<WCSTask>(); + var foundPallets = 0; + + if (foundPallets < outbound.requiredCount) + { + var doubleDeepPallets = FindDoubleDeepEmptyPallets(); + foreach (var palletLoc in doubleDeepPallets) + { + if (IsDoubleDeepRow(palletLoc.N_ROW)) + { + var outerLoc = FindOuterLocation(palletLoc); + if (outerLoc != null) + { + if (outerLoc.N_CURRENT_NUM == outerLoc.N_CAPACITY) + { + // 浼樺厛绉诲埌娣变綅锛屽叾娆″渚�+ var bestTarget = FindBestRelocationTarget(outerLoc); + if (bestTarget != null) + { + //璁$畻鍒颁簡澶栦晶鎶婂渚х殑璐т綅閿佸畾 + _allLocations + .Where(x => x.S_CODE == outerLoc.S_CODE) + .ToList() + .ForEach(x => x.N_LOCK_STATE = 3); + var trayCode = ContainerHelper.GetLocCntr(outerLoc.S_CODE); + + tasks.Add(new WCSTask + { + S_CODE = GenerateTaskNo(), + S_START_AREA = outerLoc.S_AREA_CODE, + S_END_AREA = bestTarget.S_AREA_CODE, + S_START_LOC = outerLoc.S_CODE, + S_END_LOC = bestTarget.S_CODE, + S_TYPE = "娣变綅绉诲簱", + S_OP_CODE = outbound.opCode, + N_PRIORITY = 1, + N_SCHEDULE_TYPE = 1, + N_B_STATE = 0, + S_B_STATE = WCSTask.GetStateStr(0), + S_CNTR_CODE = trayCode.S_CNTR_CODE, + N_START_LAYER = 1, + N_END_LAYER = 1, + N_CNTR_COUNT = 1 + }); + } + else continue; + } + } + } + var tray = ContainerHelper.GetLocCntr(palletLoc.S_CODE); + outbound.trayCode = tray.S_CNTR_CODE; + tasks.Add(CreateEmptyPalletTask(palletLoc, outbound)); + foundPallets++; + + if (foundPallets >= outbound.requiredCount) break; + } + } + return tasks; + } + + // 鍏抽敭杈呭姪鏂规硶 + + private List<Location> FindDoubleDeepEmptyPallets() => + _allLocations.Where(loc => + loc.N_LOCK_STATE == 0 && + loc.N_CURRENT_NUM == loc.N_CAPACITY && + ContainerHelper.GetLocItemRel(loc.S_CODE) + ).OrderBy(loc => loc.N_ROW) // 鎸夋帓鎺掑簭 + .ThenBy(loc => loc.N_COL) + .ToList(); + + private WCSTask CreateEmptyPalletTask(Location loc, Outbound outbound) => + new WCSTask + { + S_CODE = GenerateTaskNo(), + S_START_AREA = loc.S_AREA_CODE, + S_END_AREA = outbound.endArea, + S_START_LOC = loc.S_CODE, + S_END_LOC = outbound.endBit, + S_TYPE = outbound.taskType, + S_OP_CODE = outbound.opCode, + N_PRIORITY = 0, + N_SCHEDULE_TYPE = 1, + N_B_STATE = 0, + S_B_STATE = WCSTask.GetStateStr(0), + S_CNTR_CODE = outbound.trayCode, + N_START_LAYER = 1, + N_END_LAYER = 1, + N_CNTR_COUNT = 1 + }; + + // 澶嶇敤鍘熸湁鍙屾繁浣嶆柟娉�+ private bool IsDoubleDeepRow(int row) => row == 1 || row == 4; + + private Location FindTargetLocation(string code) => + _allLocations.FirstOrDefault(loc => + loc.S_CODE == code && loc.N_LOCK_STATE == 0); + + //鏌ヨ娣变綅澶栦晶鐨勮揣浣�+ private Location FindOuterLocation(Location deepLoc) => + _allLocations.FirstOrDefault(loc => + loc.N_ROW != deepLoc.N_ROW && + loc.N_ROADWAY == deepLoc.N_ROADWAY && + loc.N_COL == deepLoc.N_COL && + loc.N_LAYER == deepLoc.N_LAYER && + loc.N_LOCK_STATE == 0 || loc.N_LOCK_STATE == 5 + ); + private Location FindBestRelocationTarget(Location outerLoc) + { + return _allLocations + .Where(loc => + loc.N_ROADWAY == outerLoc.N_ROADWAY && + loc.N_LOCK_STATE == 0 && + loc.N_CURRENT_NUM == 0 && + loc.S_CODE != outerLoc.S_CODE) + .OrderBy(loc => loc.N_ROW == outerLoc.N_ROW ? 1 : 0) + .ThenBy(loc => loc.N_COL) + .ThenBy(loc => Math.Abs(loc.N_LAYER - outerLoc.N_LAYER)) + .FirstOrDefault(); + } + private void MarkReservedLocations(List<Outbound> outbound) + { + //鏌ヨ宸茬粡琚攣浣忕殑璐т綅 + var lockLoc = _allLocations + .Where(loc => loc.N_LOCK_STATE != 0) + .ToList(); + //鎶婇攣浣忕殑璐т綅鏍囪涓哄崰鐢�+ foreach (var item in lockLoc) + { + if (IsDoubleDeepRow(item.N_ROW)) + { + _allLocations + .Where(x => x.S_CODE == item.S_CODE) + .ToList() + .ForEach(x => x.N_LOCK_STATE = 3); + } + } + foreach (var item in outbound) + { + var loc = FindTargetLocation(item.locCode); + if (loc != null && IsDoubleDeepRow(loc.N_ROW)) + { + // 鏍囪璇ユ繁浣嶅搴旂殑澶栦晶璐т綅锛堝鏋滃瓨鍦級 + var outerLoc = FindOuterLocation(loc); + if (outerLoc != null) + { + // 鏍囪娣变綅鐨勫渚ц揣浣嶏紙閬垮厤琚Щ搴撳崰鐢級 + _allLocations + .Where(x => x.S_CODE == outerLoc.S_CODE) + .ToList() + .ForEach(x => x.N_LOCK_STATE = 5); + //鏍囪娣变綅鐨勫渚ц揣浣嶄负5 + } + } + } + + } + } #endregion #region 鏉哀鍗囬檷閲忚〃甯姪鏂规硶 -- Gitblit v1.9.1