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