From b0b5deb5825684bca5b3fa7c2ab59f60ce0e799f Mon Sep 17 00:00:00 2001
From: xiazhengtongxue <133085197+xiazhengtongxue@users.noreply.github.com>
Date: 星期二, 07 四月 2026 16:36:57 +0800
Subject: [PATCH] fix: 修复移库任务号重复问题,优化策略优先处理正常任务,避免任务堵塞

---
 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs |   60 +++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 45 insertions(+), 15 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs"
index 25b27c2..81c2bb2 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs"
@@ -22,6 +22,7 @@
 using WIDESEA_Core.Seed;
 using WIDESEA_Core.Utilities;
 using WIDESEA_DTO.Basic;
+using WIDESEA_DTO.Task;
 using WIDESEA_IBasicService;
 using WIDESEA_Model.Models;
 
@@ -160,40 +161,69 @@
         }
 
 
-        public string AccessingTunnel(int WarehouseId, int LocationType, int taskCount)
+        public string AccessingTunnel(int WarehouseId, int LocationType, List<RoadwayTaskCount> roadwayTaskCounts)
         {
             List<Dt_LocationInfo> locationData = BaseDal.QueryData(x => x.WarehouseId == WarehouseId);
-            var roadwayGroups = locationData.Where(x => x.LocationType == LocationType && x.LocationStatus== (int)LocationStatusEnum.Free && x.EnableStatus== (int)EnableStatusEnum.Normal).GroupBy(x => x.RoadwayNo)
-            .Select(g => new
-            {
-                RoadwayNo = g.Key,
-                LocationCount = g.Count() - taskCount,
-            }).OrderByDescending(g => g.LocationCount).ToList();
+
+            // 灏� roadwayTaskCounts 杞崲涓哄瓧鍏革紝渚夸簬蹇�熸煡鎵�
+            var taskCountDict = roadwayTaskCounts?.ToDictionary(x => x.Roadway, x => x.TaskCount) ?? new Dictionary<string, int>();
+
+            var roadwayGroups = locationData.Where(x => x.LocationType == LocationType && x.LocationStatus == (int)LocationStatusEnum.Free && x.EnableStatus == (int)EnableStatusEnum.Normal)
+                .GroupBy(x => x.RoadwayNo)
+                .Select(g => new
+                {
+                    RoadwayNo = g.Key,
+                    FreeCount = g.Count(),
+                    TaskCount = taskCountDict.ContainsKey(g.Key) ? taskCountDict[g.Key] : 0,
+                    AvailableCount = g.Count() - (taskCountDict.ContainsKey(g.Key) ? taskCountDict[g.Key] : 0)
+                })
+                .Where(g => g.AvailableCount > 0)
+                .ToList();
 
             int minRequired = 3;
-            if(WarehouseId== (int)WarehouseEnum.YMYL)
+
+            if (WarehouseId == (int)WarehouseEnum.YMYL)
             {
                 if (LocationType == 2) minRequired = 2;
 
-                var selectedRoadway = roadwayGroups.FirstOrDefault(g => g.LocationCount >= minRequired);
-                if(selectedRoadway!=null) return selectedRoadway.RoadwayNo;
+                // 杩欓噷閫夋嫨宸烽亾1鎴栬��2锛屽厛鎵句换鍔℃渶灏戠殑锛屽鏋滀竴鏍凤紝閫夋嫨搴撳瓨鍦ㄥ鐨�
+                var targetRoadways = roadwayGroups
+                    .Where(g => (g.RoadwayNo == "1" || g.RoadwayNo == "2") && g.AvailableCount >= minRequired)
+                    .OrderBy(g => g.TaskCount)           // 鍏堟寜浠诲姟鏁板崌搴忥紙浠诲姟灏戠殑浼樺厛锛�
+                    .ThenByDescending(g => g.FreeCount)  // 浠诲姟鐩稿悓鏃舵寜绌洪棽鏁伴檷搴忥紙搴撳瓨澶氱殑浼樺厛锛�
+                    .ToList();
 
+                var selectedRoadway = targetRoadways.FirstOrDefault();
+                if (selectedRoadway != null)
+                    return selectedRoadway.RoadwayNo;
             }
             else
             {
-                var selectedRoadway = roadwayGroups.FirstOrDefault(g => g.LocationCount >= minRequired);
-                if(selectedRoadway == null)
-                {
-                    selectedRoadway = roadwayGroups.FirstOrDefault(g => g.RoadwayNo == "5" && g.LocationCount != 0);
+                // 杩欓噷閫夋嫨宸烽亾3鎴栬��4鎴栬��5锛屽厛鎵句换鍔℃渶灏戠殑锛屽鏋滀竴鏍凤紝閫夋嫨搴撳瓨鍦ㄥ鐨�
+                var targetRoadways = roadwayGroups
+                    .Where(g => (g.RoadwayNo == "3" || g.RoadwayNo == "4" || g.RoadwayNo == "5") && g.AvailableCount >= minRequired)
+                    .OrderBy(g => g.TaskCount)           // 鍏堟寜浠诲姟鏁板崌搴忥紙浠诲姟灏戠殑浼樺厛锛�
+                    .ThenByDescending(g => g.FreeCount)  // 浠诲姟鐩稿悓鏃舵寜绌洪棽鏁伴檷搴忥紙搴撳瓨澶氱殑浼樺厛锛�
+                    .ToList();
 
+                var selectedRoadway = targetRoadways.FirstOrDefault();
+                if (selectedRoadway == null)
+                {
+                    // 濡傛灉娌℃湁婊¤冻鏈�浣庤姹傜殑锛屽皾璇曢�夋嫨宸烽亾5锛堝彧瑕佹湁鍙敤搴撲綅灏辫锛�
+                    selectedRoadway = roadwayGroups
+                        .Where(g => g.RoadwayNo == "5" && g.AvailableCount > 0)
+                        .FirstOrDefault();
                 }
-                if(selectedRoadway != null) return selectedRoadway.RoadwayNo;
+
+                if (selectedRoadway != null)
+                    return selectedRoadway.RoadwayNo;
             }
 
             return "0";
         }
 
 
+
         public Dt_LocationInfo? ShallowGetLocation(string roadway, int Locationtype,int row ,int Layer, int Column)
         {
             return BaseDal.QueryData(x => x.RoadwayNo == roadway && x.LocationType == Locationtype && x.Row==row && x.Layer== Layer && x.Column== Column).FirstOrDefault();

--
Gitblit v1.9.3