xiazhengtongxue
2026-04-07 b0b5deb5825684bca5b3fa7c2ab59f60ce0e799f
ÏîÄ¿´úÂë/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);