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 | 85 ++++++++++++++++++++++++++++++------------
1 files changed, 61 insertions(+), 24 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 cc91e60..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,38 +161,67 @@
}
- public string AccessingTunnel(int WarehouseId, int LocationType)
+ 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
+
+ // 灏� 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)
{
- RoadwayNo = g.Key,
- LocationCount = g.Count(),
- }).OrderByDescending(g => g.LocationCount).ToList();
+ if (LocationType == 2) minRequired = 2;
- int minRequired = 15;
- if(WarehouseId== (int)WarehouseEnum.YMYL)
- {
- if (LocationType == 2) minRequired = 6;
+ // 杩欓噷閫夋嫨宸烽亾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 = roadwayGroups.FirstOrDefault(g => g.LocationCount >= minRequired);
- if(selectedRoadway!=null) return selectedRoadway.RoadwayNo;
-
+ 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)
@@ -375,15 +405,16 @@
return WebResponseContent.Instance.OK("鎴愬姛", result);
}
-
+ // 缁х画鍒嗭紝WarehouseId =1锛屾湁涓や釜涓嶅悓鐨勮揣鐗╋紝LocationType =1鍜�2
public WebResponseContent GetWarehouseCapacity()
{
- // 鏌ヨ鎵�鏈変粨搴撶殑璐т綅鏁版嵁
+ // 鏌ヨ鎵�鏈変粨搴撶殑璐т綅鏁版嵁锛屽寘鍚揣浣嶇被鍨�
var allLocations = BaseDal.QueryData()
.Select(x => new
{
x.WarehouseId,
- x.LocationStatus
+ x.LocationStatus,
+ x.LocationType // 娣诲姞璐т綅绫诲瀷
})
.ToList();
@@ -393,15 +424,21 @@
return WebResponseContent.Instance.OK("鏈壘鍒颁换浣曡揣浣嶆暟鎹�", new List<object>());
}
- // 璁$畻姣忎釜浠撳簱鐨勫閲忎娇鐢ㄦ儏鍐�
+ // 鎸変粨搴撳拰璐т綅绫诲瀷鍒嗙粍缁熻
var result = allLocations
- .GroupBy(x => x.WarehouseId)
+ .GroupBy(x => new { x.WarehouseId, x.LocationType })
.Select(g => new
{
- WarehouseId = g.Key,
+ WarehouseId = g.Key.WarehouseId,
+ LocationType = g.Key.LocationType,
+ TotalLocations = g.Count(),
FreeLocations = g.Count(x => x.LocationStatus == 0),
+ UsedLocations = g.Count(x => x.LocationStatus == 1),
+ OccupancyRate = (int)Math.Round((double)g.Count(x => x.LocationStatus == 1) / g.Count() * 100),
RemainingCapacityPercentage = (int)Math.Round((double)g.Count(x => x.LocationStatus == 0) / g.Count() * 100)
})
+ .OrderBy(x => x.WarehouseId)
+ .ThenBy(x => x.LocationType)
.ToList();
return WebResponseContent.Instance.OK("鎴愬姛", result);
--
Gitblit v1.9.3