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 |  532 ++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 384 insertions(+), 148 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 5e8905b..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
@@ -384,121 +384,350 @@
             return greenTireInformation;
         }
 
-        /// <summary>
+        /*/// <summary>
         /// 鏌ヨ鍏ュ簱缁堢偣璐т綅
+        /// 鍏ュ簱绛栫暐锛�+        /// 宸烽亾鍐呭悓瑙勬牸鏁伴噺 灏忎簬 10锛堟殏瀹氾級锛屾寜鐗╂枡鍧囪 璁$畻锛屽鏋滄墍鏈夌殑宸烽亾鍐呭悓瑙勬牸鏁伴噺閮藉ぇ浜�0锛屽垯鎸夌収宸烽亾鍧囪 璁$畻
         /// </summary>
         /// <param name="locNum">1.鍗曡揣浣�2.鍙岃揣浣�/param>
         /// <returns></returns>
-        public static EndLocGroup getInStockEndLoc(int locNum) 
+        public static EndLocGroup getInStockEndLoc(int locNum , string itemCode) 
         {
             var db = new SqlHelper<object>().GetInstance();
             EndLocGroup endLocGroup = new EndLocGroup();
             List<Location> locations = new List<Location>();
-            // 1.鎸夊绉巼浠庡ぇ鍒板皬锛屽宸烽亾杩涜鎺掑簭
-            var roadwayOrderList = 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 ,  num = SqlFunc.AggregateCount(a.S_CODE)})
-                .OrderByDescending(a => a.num)
+
+            List<int> roadwayList = new List<int>();
+
+            // 1.鎸夊贩閬撹繘琛屽垎缁勶紝鏌ヨ姣忎釜宸烽亾鍐呭悓瑙勬牸鐗╂枡鐨勬暟閲忥紝骞朵粠灏忓埌澶ф帓搴�+            var roadwayItemNumOrderGroup = 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" && c.S_ITEM_CODE == itemCode)
+                .GroupBy((a, b, c) => a.N_ROADWAY)
+                .Select((a, b, c) => new { roadway = a.N_ROADWAY, num = SqlFunc.AggregateCount(a.S_CODE) })
+                .OrderBy(a => a.num)
                 .ToList();
 
-            // 鏌ヨ鍗曡揣浣�-            foreach (var order in roadwayOrderList)
+            roadwayList = roadwayItemNumOrderGroup.Where(a => a.num < 10).OrderBy(a => a.num).Select(a => a.roadway).ToList();
+
+            // 2.鎸夊贩閬撹繘琛屽垎缁勶紝鏌ヨ姣忎釜宸烽亾绌鸿揣浣嶆暟閲忥紝骞朵粠澶у埌灏忔帓搴�+            if (roadwayList.Count == 0) 
             {
-                if (locNum == 1) 
+                var roadwayEmptyNumOrderGroup = 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, num = SqlFunc.AggregateCount(a.S_CODE) })
+                    .OrderByDescending(a => a.num)
+                    .ToList();
+                roadwayList = roadwayEmptyNumOrderGroup.Select(a => a.roadway).ToList();
+            }
+
+            if (roadwayList.Count > 0) 
+            {
+                // 鏌ヨ鍗曡揣浣�+                foreach (var roadway in roadwayList)
                 {
-                    /*// 鏌ヨ鎵�湁鐩稿悓鐗╂枡璐т綅
-                    var sameItemLocList = 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_ROADWAY == order.roadway
-                                       && a.N_CURRENT_NUM == 1
-                                       && a.N_LOCK_STATE == 0
-                                       && a.C_ENABLE == "Y"
-                                       && b.S_CNTR_CODE != null
-                                       && c.S_ITEM_CODE == itemCode
-                                       )
-                       .OrderBy((a, b, c) => new { a.N_LAYER, a.N_COL })
-                       .ToList();
-
-                    // 鏌ヨ鐩稿悓鐗╂枡鐨勫乏鍙虫槸鍚︽湁绌鸿揣浣�-                    foreach (var loc in sameItemLocList)
+                    if (locNum == 1)
                     {
-                        var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                        if (leftLoc != null)
+                        // 鏌ヨ绌鸿揣浣�+                        var emptyLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).First();
+                        if (emptyLoc != null)
                         {
-                            locations.Add(leftLoc);
-                            break;
+                            locations.Add(emptyLoc);
+                            endLocGroup.endLocList = locations;
+                            return endLocGroup;
                         }
+                    }
 
-                        var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                        if (rightLoc != null)
-                        {
-                            locations.Add(leftLoc);
-                            break;
-                        }
-                    }*/
-
-                    // 鏌ヨ绌鸿揣浣�-                    var emptyLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).First();
-                    if (emptyLoc != null) 
+                    if (locNum == 2)
                     {
-                        locations.Add(emptyLoc);
-                        endLocGroup.endLocList = locations;
-                        return endLocGroup;
+                        var emptyLocList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).ToList();
+                        if (emptyLocList.Count > 0)
+                        {
+                            // 浼樺厛鏌ヨ鐩搁偦鍙屾嫋绌鸿揣浣�+                            if (locations.Count == 0)
+                            {
+                                foreach (var loc in emptyLocList)
+                                {
+                                    // 鏌ヨ鐩搁偦宸︿晶鏄惁鏈夌┖璐т綅
+                                    var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
+                                    if (leftLoc != null)
+                                    {
+                                        locations.Add(loc);
+                                        locations.Add(leftLoc);
+                                        break;
+                                    }
+
+                                    // 鏌ヨ鐩搁偦鍙充晶鏄惁鏈夌┖璐т綅
+                                    var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
+                                    if (rightLoc != null)
+                                    {
+                                        locations.Add(loc);
+                                        locations.Add(rightLoc);
+                                        break;
+                                    }
+                                }
+                            }
+
+                            if (locations.Count < locNum) 
+                            {
+                                // 鏌ヨ涓嶇浉閭荤殑鍗曟嫋璐т綅
+                                foreach (var loc in emptyLocList)
+                                {
+                                    locations.Add(loc);
+                                    if (locations.Count == locNum)
+                                    {
+                                        break;
+                                    }
+                                }
+                            }
+
+                            if (locations.Count == locNum)
+                            {
+                                endLocGroup.endLocList = locations;
+                                // 鏍¢獙璐т綅鏄惁鏄悓宸烽亾锛屾槸鍒欑敓鎴愪换鍔$粍鍙�+                                var groupNum = locations.GroupBy(a => a.N_ROADWAY).Count();
+                                if (groupNum == 1) 
+                                {
+                                    endLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo();
+                                }
+                                return endLocGroup;
+                            }
+                        }
                     }
                 }
-
-                if (locNum == 2) 
-                {
-                    var emptyLocList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).ToList();
-
-                    if (emptyLocList.Count > 0)
-                    {
-                        // 鏌ヨ鍙屾嫋绌鸿揣浣�-                        if (locations.Count == 0) 
-                        {
-                            foreach (var loc in emptyLocList)
-                            {
-                                var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                                if (leftLoc != null)
-                                {
-                                    locations.Add(loc);
-                                    locations.Add(leftLoc);
-                                    break;
-                                }
-
-                                var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                                if (rightLoc != null)
-                                {
-                                    locations.Add(loc);
-                                    locations.Add(leftLoc);
-                                    break;
-                                }
-                            }
-
-                            if (locations.Count == locNum)
-                            {
-                                endLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo();
-                                endLocGroup.endLocList = locations;
-                                return endLocGroup;
-                            }
-                        }
-
-                        // 鏌ヨ鍗曟嫋璐т綅
-                        foreach (var loc in emptyLocList)
-                        {
-                            locations.Add(loc);
-                            if (locations.Count == locNum)
-                            {
-                                endLocGroup.endLocList = locations;
-                                return endLocGroup;
-                            }
-                        }
-                    }
-                } 
             }
             return endLocGroup;
+        }*/
+
+        /// <summary>
+        /// 鏌ヨ鍏ュ簱缁堢偣璐т綅
+        /// 鍏ュ簱绛栫暐锛�+        /// 宸烽亾鍐呭悓瑙勬牸鏁伴噺 灏忎簬 10锛堟殏瀹氾級锛屾寜鐗╂枡鍧囪 璁$畻锛屽鏋滄墍鏈夌殑宸烽亾鍐呭悓瑙勬牸鏁伴噺閮藉ぇ浜�0锛屽垯鎸夌収宸烽亾鍧囪 璁$畻
+        /// </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 , int roadway = 0 ,int excludeRoadway = 0)
+        {
+            var db = new SqlHelper<object>().GetInstance();
+            EndLocGroup endLocGroup = new EndLocGroup { endLocList = new List<Location>() };
+
+            // 1. 鑾峰彇鍊欓�宸烽亾鍒楄〃锛堢墿鏂欏潎琛℃垨宸烽亾鍧囪 锛�+            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)
+            {
+                return FindSingleLocation(db, candidateRoadways);
+            }
+
+            // 3. 澶勭悊鍙岃揣浣嶅叆搴�+            return FindDoubleLocations(db, candidateRoadways);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍊欓�宸烽亾鍒楄〃锛堟寜绛栫暐鎺掑簭锛�+        /// </summary>
+        private static List<int> GetCandidateRoadways(SqlSugarClient db, string itemCode)
+        {
+            var list = new List<int>();
+            // 绛栫暐1锛氬贩閬撳唴鍚岃鏍肩墿鏂�< 10 鐨勫贩閬擄紙鎸夋暟閲忓崌搴忥級
+            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)
+
+                        // 鍩虹绛涢�鏉′欢锛堟墍鏈変綅缃級
+                        .Where((a, b, c) =>
+                            a.S_AREA_CODE == Settings.stockArea &&  // 鎸囧畾鍖哄煙
+                            a.N_LOCK_STATE == 0 &&                 // 鏈攣瀹�+                            a.C_ENABLE == "Y")                     // 鍚敤鐘舵�
+
+                        // 鎸夊贩閬撳垎缁勶紙浣跨敤鍘熷琛ㄥ瓧娈碉級
+                        .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>
+        /// 鏌ユ壘鍗曡揣浣�+        /// </summary>
+        private static EndLocGroup FindSingleLocation(SqlSugarClient db, List<int> candidateRoadways)
+        {
+            foreach (var roadway in candidateRoadways)
+            {
+                var location = db.Queryable<Location>()
+                    .Where(a =>
+                        a.S_AREA_CODE == Settings.stockArea &&
+                        a.N_ROADWAY == roadway &&
+                        a.N_CURRENT_NUM == 0 &&
+                        a.N_LOCK_STATE == 0 &&
+                        a.C_ENABLE == "Y")
+                    .OrderBy(a => a.N_LAYER)
+                    .OrderBy(a => a.N_COL)
+                    .First();
+
+                if (location != null)
+                {
+                    return new EndLocGroup
+                    {
+                        endLocList = new List<Location> { location }
+                    };
+                }
+            }
+            return new EndLocGroup();
+        }
+
+        /// <summary>
+        /// 鏌ユ壘鍙岃揣浣嶏紙浼樺寲鐩搁偦璐т綅鏌ユ壘锛�+        /// </summary>
+        private static EndLocGroup FindDoubleLocations(SqlSugarClient db, List<int> candidateRoadways)
+        {
+            // 鍏堝皾璇曟壘鐩搁偦璐т綅
+            foreach (var roadway in candidateRoadways)
+            {
+                // 涓�鎬ц幏鍙栧贩閬撴墍鏈夌┖璐т綅锛堝噺灏慏B鏌ヨ锛�+                var emptyLocs = db.Queryable<Location>()
+                    .Where(a =>
+                        a.S_AREA_CODE == Settings.stockArea &&
+                        a.N_ROADWAY == roadway &&
+                        a.N_CURRENT_NUM == 0 &&
+                        a.N_LOCK_STATE == 0 &&
+                        a.C_ENABLE == "Y")
+                    .OrderBy(a => a.N_LAYER)
+                    .OrderBy(a => a.N_COL)
+                    .ToList();
+
+                if (emptyLocs.Count < 2) continue;
+
+                // 鍦ㄥ唴瀛樹腑鏌ユ壘鐩搁偦璐т綅锛堥珮鎬ц兘锛�+                var adjacentPair = FindAdjacentLocations(emptyLocs);
+                if (adjacentPair != null)
+                {
+                    return CreateDoubleLocGroup(adjacentPair);
+                }
+            }
+
+            // 娌℃湁鐩搁偦璐т綅鏃讹紝鍙栦换鎰忎袱涓揣浣�+            foreach (var roadway in candidateRoadways)
+            {
+                var emptyLocs = db.Queryable<Location>()
+                    .Where(a =>
+                        a.S_AREA_CODE == Settings.stockArea &&
+                        a.N_ROADWAY == roadway &&
+                        a.N_CURRENT_NUM == 0 &&
+                        a.N_LOCK_STATE == 0 &&
+                        a.C_ENABLE == "Y")
+                    .OrderBy(a => a.N_LAYER)
+                    .OrderBy(a => a.N_COL)
+                    .Take(2)
+                    .ToList();
+
+                if (emptyLocs.Count == 2)
+                {
+                    return CreateDoubleLocGroup(emptyLocs);
+                }
+            }
+
+            return new EndLocGroup();
+        }
+
+        /// <summary>
+        /// 鍦ㄥ唴瀛樹腑鏌ユ壘鐩搁偦璐т綅锛堥珮鏁堢畻娉曪級
+        /// </summary>
+        private static List<Location> FindAdjacentLocations(List<Location> locations)
+        {
+            // 鎸夊眰->鍒楁帓搴忥紝渚夸簬鏌ユ壘鐩搁偦
+            var sorted = locations
+                .OrderBy(l => l.N_LAYER)
+                .ThenBy(l => l.N_ROW)
+                .ThenBy(l => l.N_COL)
+                .ToList();
+
+            for (int i = 0; i < sorted.Count - 1; i++)
+            {
+                var current = sorted[i];
+                var next = sorted[i + 1];
+
+                // 鍒ゆ柇鏄惁鍚屼竴灞備笖鐩搁偦鍒�+                if (current.N_LAYER == next.N_LAYER &&
+                    current.N_COL + 1 == next.N_COL)
+                {
+                    return new List<Location> { current, next };
+                }
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 鍒涘缓鍙岃揣浣嶈繑鍥炵粨鏋�+        /// </summary>
+        private static EndLocGroup CreateDoubleLocGroup(List<Location> locations)
+        {
+            return new EndLocGroup
+            {
+                endLocList = locations,
+                groupNo = locations.GroupBy(a => a.N_ROADWAY).Count() == 1
+                    ? WMSHelper.GenerateTaskGroupNo()
+                    : null
+            };
         }
 
         public class EndLocGroup
@@ -509,14 +738,15 @@
 
         /// <summary>
         /// 鏌ヨ鍑哄簱寮�璐т綅
-        /// 璁$畻锛�.宸烽亾涓嶆姤璀︺�2.鐗╂枡鐘舵�OK銆�.灏忎簬澶辨晥鏃堕棿 澶т簬绛変簬鐢熸晥鏃堕棿 4.鍔犳�鏂欏厛鍑恒�5.鍏堝叆鍏堝嚭锛堢敓浜ф椂闂达級锛夊嚭搴撶墿鏂�+        /// 1.璁$畻锛�.宸烽亾涓嶆姤璀︺�2.鐗╂枡鐘舵�OK銆�.灏忎簬澶辨晥鏃堕棿 澶т簬绛変簬鐢熸晥鏃堕棿 4.鍔犳�鏂欏厛鍑恒�5.鍏堝叆鍏堝嚭锛堢敓浜ф椂闂达級锛夊嚭搴撶墿鏂�+        /// 2.鍚岀瓑鏉′欢涓嬶紝浼樺厛鍙栧墠涓�墭璐х殑鐩搁偦璐т綅(鏆傛椂涓嶅仛鑰冭檻锛岄渶纭畾鍏堝叆鍏堝嚭锛堢敓浜ф椂闂达級鏄寜澶╃畻锛岃繕鏄簿纭埌鏃跺垎绉�
         /// </summary>
         /// <param name="itemCode"></param>
-        /// <param name="locNum"></param>
-        public static StartLocGroup getOutStockStartLoc(string itemCode, int locNum ) 
+        /// <param name="prevLoc"></param>
+        public static Location getOutStockStartLoc(string itemCode, Location prevLoc = null) 
         {
             var db = new SqlHelper<object>().GetInstance();
-            StartLocGroup startLocGroup = new StartLocGroup();
+            Location startLoc = null;
 
             // 1.鏌ヨ锛堢墿鏂欑姸鎬丱K 锛屼笖灏忎簬澶辨晥鏃堕棿锛屽ぇ浜庣瓑浜庣敓鏁堟椂闂达級鍑哄簱鐗╂枡锛屽苟鎸夊姞鎬ユ枡鍏堝嚭锛屽厛鍏ュ厛鍑猴紙鐢熶骇鏃堕棿锛夌殑鍘熷垯杩涜鎺掑簭
             var query = db.Queryable<Location>()
@@ -544,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)
@@ -551,54 +782,20 @@
                 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 cntrItemRel = db.Queryable<CntrItemRel>().LeftJoin<LocCntrRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE).Where((a, b) => b.S_LOC_CODE == loc.S_CODE).First();
-                    if (cntrItemRel != null) 
-                    {
-                        startLocGroup.startLocList.Add(loc);
-                        if (locNum == startLocGroup.startLocList.Count) 
+                        var stackerStates = WCSDispatch.getDeviceStatus(new List<string>() { deviceConfig.deviceNo } );
+                        if ( stackerStates.Count == 0 || stackerStates[0].workStatus != 1 || stackerStates[0].manualStatus == 1 )
                         {
-                            break;
-                        }
-
-                        var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == loc.N_ROADWAY && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                        if (leftLoc != null)
-                        {
-                            var locCntrRel = db.Queryable<LocCntrRel>()
-                               .LeftJoin<CntrItemRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE)
-                               .Where((a, b) => a.S_LOC_CODE == leftLoc.S_CODE && b.S_ITEM_CODE == itemCode)
-                               .First();
-                            if (locCntrRel != null)
-                            {
-                                startLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo();
-                                startLocGroup.startLocList.Add(leftLoc);
-                                break;
-                            }
-                        }
-
-                        var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == loc.N_ROADWAY && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
-                        if (rightLoc != null && startLocGroup.startLocList.Count == 0)
-                        {
-                            var locCntrRel = db.Queryable<LocCntrRel>()
-                                .LeftJoin<CntrItemRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE)
-                                .Where((a, b) => a.S_LOC_CODE == rightLoc.S_CODE && b.S_ITEM_CODE == itemCode)
-                                .First();
-                            if (locCntrRel != null)
-                            {
-                                startLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo();
-                                startLocGroup.startLocList.Add(rightLoc);
-                                break;
-                            }
+                            continue;
                         }
                     }
+                    startLoc = loc;
+                    break;
                 }
             }
-            return startLocGroup;
+            return startLoc;
 
         }
 
@@ -624,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);
@@ -653,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