From a93b0e99036c24b9bd58c79bf5e7364b1ba28bae Mon Sep 17 00:00:00 2001 From: 杨前锦 <1010338399@qq.com> Date: 星期二, 01 七月 2025 16:02:33 +0800 Subject: [PATCH] 福建佳通-流程优化 --- HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs | 173 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 129 insertions(+), 44 deletions(-) diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs index da0078c..69a9200 100644 --- a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs +++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs @@ -507,15 +507,31 @@ /// </summary> /// <param name="locNum"></param> /// <param name="itemCode"></param> + /// <param name="roadway"></param> + /// <param name="excludeRoadway"></param> /// <returns></returns> - public static EndLocGroup getInStockEndLoc(int locNum, string itemCode) + public static EndLocGroup getInStockEndLoc(int locNum, string itemCode , int roadway = 0 ,int excludeRoadway = 0) { var db = new SqlHelper<object>().GetInstance(); EndLocGroup endLocGroup = new EndLocGroup { endLocList = new List<Location>() }; // 1. 鑾峰彇鍊欓�宸烽亾鍒楄〃锛堢墿鏂欏潎琛℃垨宸烽亾鍧囪 锛�- var candidateRoadways = GetCandidateRoadways(db, itemCode); - if (candidateRoadways.Count == 0) return endLocGroup; + List<int> candidateRoadways = new List<int>(); + if (roadway == 0) + { + candidateRoadways = GetCandidateRoadways(db, itemCode); + if (candidateRoadways.Count == 0) return endLocGroup; + + if (excludeRoadway != 0) + { + candidateRoadways.Remove(excludeRoadway); + } + } + else + { + candidateRoadways.Add(roadway); + } + // 2. 澶勭悊鍗曡揣浣嶅叆搴� if (locNum == 1) @@ -532,38 +548,62 @@ /// </summary> private static List<int> GetCandidateRoadways(SqlSugarClient db, string itemCode) { + var list = new List<int>(); // 绛栫暐1锛氬贩閬撳唴鍚岃鏍肩墿鏂�< 10 鐨勫贩閬擄紙鎸夋暟閲忓崌搴忥級 - var materialRoadways = db.Queryable<Location>() - .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE) - .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE) - .Where((a, b, c) => - a.S_AREA_CODE == Settings.stockArea && - a.N_CURRENT_NUM == 1 && - a.N_LOCK_STATE == 0 && - a.C_ENABLE == "Y" && - b.S_CNTR_CODE != null && - c.S_ITEM_CODE == itemCode) - .GroupBy(a => a.N_ROADWAY) - .Having(a => SqlFunc.AggregateCount(a.S_CODE) < 10) - .Select(a => new { Roadway = a.N_ROADWAY, Count = SqlFunc.AggregateCount(a.S_CODE) }) - .OrderBy(a => a.Count) - .Select(a => a.Roadway) - .ToList(); + var materialRoadwayGroup = db.Queryable<Location>() + // 琛ㄥ埆鍚嶏細a = Location, b = LocCntrRel, c = CntrItemRel + .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE) + .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE) - if (materialRoadways.Count > 0) return materialRoadways; + // 鍩虹绛涢�鏉′欢锛堟墍鏈変綅缃級 + .Where((a, b, c) => + a.S_AREA_CODE == Settings.stockArea && // 鎸囧畾鍖哄煙 + a.N_LOCK_STATE == 0 && // 鏈攣瀹�+ a.C_ENABLE == "Y") // 鍚敤鐘舵� - // 绛栫暐2锛氭墍鏈夊贩閬撴寜绌鸿揣浣嶆暟闄嶅簭鎺掑簭 - return db.Queryable<Location>() - .Where(a => - a.S_AREA_CODE == Settings.stockArea && - a.N_CURRENT_NUM == 0 && - a.N_LOCK_STATE == 0 && - a.C_ENABLE == "Y") - .GroupBy(a => a.N_ROADWAY) - .Select(a => new { Roadway = a.N_ROADWAY, Count = SqlFunc.AggregateCount(a.S_CODE) }) - .OrderByDescending(a => a.Count) - .Select(a => a.Roadway) - .ToList(); + // 鎸夊贩閬撳垎缁勶紙浣跨敤鍘熷琛ㄥ瓧娈碉級 + .GroupBy((a, b, c) => a.N_ROADWAY) + + // 閫夋嫨鍒嗙粍缁撴灉锛堝寘鍚仛鍚堣绠楋級 + .Select((a, b, c) => new + { + Roadway = a.N_ROADWAY, // 宸烽亾缂栧彿 + + // 缁熻婊¤冻鐗瑰畾鏉′欢鐨勬暟閲忥細 + // 1. 褰撳墠鏁伴噺=1 (a.N_CURRENT_NUM == 1) + // 2. 鐗╂枡鍖归厤 (c.S_ITEM_CODE == itemCode) + // 3. 瀹瑰櫒鍏宠仈瀛樺湪 (b.S_CNTR_CODE != null) + validCount = SqlFunc.AggregateSum(SqlFunc.IIF( + a.N_CURRENT_NUM == 1 && + c.S_ITEM_CODE == itemCode && + b.S_CNTR_CODE != null, + 1, 0)) + }) + .ToList(); + + + + if (materialRoadwayGroup.Count > 0) + { + list = materialRoadwayGroup.Where(a => a.validCount < 10).OrderBy(a => a.validCount).Select(a => a.Roadway).ToList(); + } + + if (list.Count == 0) + { + // 绛栫暐2锛氭墍鏈夊贩閬撴寜绌鸿揣浣嶆暟闄嶅簭鎺掑簭 + materialRoadwayGroup = db.Queryable<Location>() + .Where(a => + a.S_AREA_CODE == Settings.stockArea && + a.N_CURRENT_NUM == 0 && + a.N_LOCK_STATE == 0 && + a.C_ENABLE == "Y") + .GroupBy(a => a.N_ROADWAY) + .Select(a => new { Roadway = a.N_ROADWAY, validCount = SqlFunc.AggregateCount(a.S_CODE) }) + .ToList(); + + list = materialRoadwayGroup.OrderByDescending(a => a.validCount).Select(a => a.Roadway).ToList(); + } + return list; } /// <summary> @@ -657,6 +697,7 @@ // 鎸夊眰->鍒楁帓搴忥紝渚夸簬鏌ユ壘鐩搁偦 var sorted = locations .OrderBy(l => l.N_LAYER) + .ThenBy(l => l.N_ROW) .ThenBy(l => l.N_COL) .ToList(); @@ -733,6 +774,7 @@ { query = query.Where((a, b, c) => c.S_ITEM_CODE == itemCode); } + query = query.OrderByDescending((a, b, c) => a.N_ROADWAY == prevLoc.N_ROADWAY); var outLocList = query.ToList(); if (outLocList.Count > 0) @@ -740,13 +782,17 @@ foreach (var loc in outLocList) { // 鏌ヨ宸烽亾鏄惁姝e父锛屽紓甯歌烦杩�- var stackerStates = WCSDispatch.getStackerState(loc.N_ROADWAY); - if (stackerStates.Count == 0 || stackerStates[0].roadway_state == "0" || stackerStates[0].roadway_state == "3") + var deviceConfig = Settings.deviceConfigList.Where(a => a.roadway == loc.N_ROADWAY).First(); + if (deviceConfig != null) { - continue; + var stackerStates = WCSDispatch.getDeviceStatus(new List<string>() { deviceConfig.deviceNo } ); + if ( stackerStates.Count == 0 || stackerStates[0].workStatus != 1 || stackerStates[0].manualStatus == 1 ) + { + continue; + } } - startLoc = loc; + break; } } return startLoc; @@ -775,25 +821,32 @@ /// 鏌ヨ宸烽亾浠诲姟鏈�皯鐨勬帴椹充綅 /// </summary> /// <returns></returns> - public static Location getMinTaskMiddleLoc(int type) + public static Location getMinTaskMiddleLoc(int type , int roadway = 0 , int excludeRoadway = 0) { Location location = new Location(); var db = new SqlHelper<object>().GetInstance(); - var roadwayGroup = db.Queryable<Location>() + var query = db.Queryable<Location>() .LeftJoin<WCSTask>((a, b) => a.S_CODE == b.S_END_LOC && b.N_B_STATE < 3) - .Where((a, b) => a.S_AREA_CODE == Settings.stockArea) - .GroupBy((a, b) => a.N_ROADWAY) + .Where((a, b) => a.S_AREA_CODE == Settings.stockArea); + + if (roadway != 0) + { + query = query.Where((a, b) => a.N_ROADWAY == roadway); + } + if (excludeRoadway != 0) + { + query = query.Where((a, b) => a.N_ROADWAY != excludeRoadway); + } + + var roadwayGroup = query.GroupBy((a, b) => a.N_ROADWAY) .Select((a, b) => new { roadway = a.N_ROADWAY, num = SqlFunc.AggregateDistinctCount(b.S_CODE != null) }) .OrderBy(a => a.num) .ToList(); foreach (var item in roadwayGroup) { - // 1.鏌ヨ宸烽亾鍐呯殑鍫嗗灈鏈虹姸鎬佹槸鍚︽甯�- - // 2.鏌ヨ鎺ラ┏浣�- var connectLoc = Settings.connectLocList.Where(a => a.type == type && a.roadway == item.roadway).FirstOrDefault(); + var connectLoc = Settings.connectLocList.Where(a => a.roadway == item.roadway).FirstOrDefault(); if (connectLoc != null) { location = LocationHelper.GetLoc(connectLoc.locCode); @@ -804,6 +857,38 @@ } /// <summary> + /// 鏌ヨ涓婄嚎璐т綅 + /// </summary> + /// <param name="type"></param> + /// <returns></returns> + public static Location getOnlneLoc(int type) + { + Location location = null; + var connectLoc = Settings.onLineLocList.Where(a => a.type == type).FirstOrDefault(); + if (connectLoc != null) + { + location = LocationHelper.GetLoc(connectLoc.locCode); + } + return location; + } + + /// <summary> + /// 鏌ヨ鍙枡寮傚父鎺掑嚭浣�+ /// </summary> + /// <param name="row"></param> + /// <returns></returns> + public static Location getCallOutLoc(int row) + { + Location location = null; + var connectLoc = Settings.callOutLocList.Where(a => a.row == row).FirstOrDefault(); + if (connectLoc != null) + { + location = LocationHelper.GetLoc(connectLoc.locCode); + } + return location; + } + + /// <summary> /// 鏌ヨ鐗╂枡瀛樻斁鏃堕棿閰嶇疆淇℃伅 /// </summary> /// <param name="bc_entried"></param> -- Gitblit v1.9.1