heshaofeng
2026-01-13 d741e7a7ad7de5045e5c6b6145d9da1783cadecd
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs
@@ -58,7 +58,7 @@
            //计算库位利用率
            var freeLocation = _locationInfoRepository.Db.Queryable<Dt_LocationInfo>().Where(x => x.LocationStatus == (int)LocationStatusEnum.Free).Count();
            var inStockLocation = _locationInfoRepository.Db.Queryable<Dt_LocationInfo>().Where(x => x.LocationStatus == (int)LocationStatusEnum.InStock || x.LocationStatus == (int)LocationStatusEnum.Pallet).Count();
            var inStockLocation = _locationInfoRepository.Db.Queryable<Dt_LocationInfo>().Where(x => x.LocationStatus != (int)LocationStatusEnum.Free).Count();
            int totalLocation = freeLocation + inStockLocation;
            decimal locationUtilizationRate = totalLocation == 0
                ? 0
@@ -75,7 +75,7 @@
            // 4. èŽ·å–è¿‘7日每日出入库明细(核心修改:调用上面的方法)
            var dailyInOutBoundList = Get7DaysDailyInOutBound();
            var nearExpirationList = GetMaterialsNearExpiration();
            List<StockInfoDetailExtDTO> nearExpirationList = GetMaterialsNearExpiration();
            //获取作业统计
            var completeTask = SimpleStatistics();
            //任务
@@ -239,7 +239,7 @@
            public List<SimpleStatisticsDTO> CompleteTask { get; set; }
            public NearExpirationDTO NearExpirationList { get; set; }
            public List<StockInfoDetailExtDTO> NearExpirationList { get; set; }
        }
        /// <summary>
@@ -270,82 +270,70 @@
            public int Count { get; set; }
        }
        public class NearExpirationDTO
        public class StockInfoDetailExtDTO : Dt_StockInfoDetail
        {
            public int DaysToExpiration { get; set; }
            public List<Dt_StockInfoDetail> Details { get; set; }
            public string LocationCode { get; set; }
            public string PalletCode { get; set; }
            public int DaysToExpiration { get; set; }
        }
        ///<summary>
        ///获取近30天要过期的物料
        /// </summary>
        public NearExpirationDTO GetMaterialsNearExpiration()
        public List<StockInfoDetailExtDTO> GetMaterialsNearExpiration()
        {
            // åˆå§‹åŒ–返回DTO
            var resultDTO = new NearExpirationDTO
            {
                Details = new List<Dt_StockInfoDetail>(),
                LocationCode = string.Empty,
                PalletCode = string.Empty,
                DaysToExpiration = 0 // åˆå§‹åŒ–天数
            };
            List<StockInfoDetailExtDTO> resultDTO = new List<StockInfoDetailExtDTO>();
            DateTime currentTime = DateTime.Now;
            DateTime thirtyDaysLater = currentTime.AddDays(30);
            // ç­›é€‰30天内过期的库存明细
            var nearExpirationList = _stockInfoDetailRepository.Db.Queryable<Dt_StockInfoDetail>()
                .Where(x => (x.ValidDate.Value - x.CreateDate).TotalDays <= 30)
            var nearExpirationList = _stockInfoDetailRepository.QueryData()
                .Join(
                    _stockInfoRepository.QueryData(),
                    detail => detail.StockId,
                    stock => stock.Id,
                    (detail, stock) => new
                    {
                        Detail = detail,
                        LocationCode = stock.LocationCode,
                        PalletCode = stock.PalletCode
                    }
                )
                .Where(x => x.Detail.ValidDate.HasValue
                        && (x.Detail.ValidDate.Value - x.Detail.CreateDate).TotalDays <= 30)
                .ToList();
            // æ— ç¬¦åˆæ¡ä»¶çš„æ˜Žç»†ï¼Œç›´æŽ¥è¿”回
            if (!nearExpirationList.Any())
            {
                return resultDTO;
            }
            
            var firstStockId = nearExpirationList.First().StockId;
            var stock = _stockInfoRepository.Db.Queryable<Dt_StockInfo>()
                .First(x => x.Id == firstStockId);
            if (stock == null)
            foreach (var item in nearExpirationList)
            {
                return resultDTO;
            }
                int daysToExpire = item.Detail.ValidDate.HasValue
                    ? Math.Max(0, (item.Detail.ValidDate.Value - item.Detail.CreateDate).Days)
                    : 0;
            resultDTO.LocationCode = stock.LocationCode;
            resultDTO.PalletCode = stock.PalletCode;
            int minDaysToExpiration = int.MaxValue;
            foreach (var detail in nearExpirationList)
            {
                TimeSpan totalDaysToExpiration = detail.ValidDate.Value - detail.CreateDate;
                double remainingDays = totalDaysToExpiration.TotalDays;
                int daysToExpiration = (int)Math.Ceiling(Math.Max(0, remainingDays));
                var extDetail = new StockInfoDetailExtDTO
                {
                    MaterielCode = item.Detail.MaterielCode,
                    MaterielName = item.Detail.MaterielName,
                    BatchNo = item.Detail.BatchNo,
                    SupplyCode = item.Detail.SupplyCode,
                    StockQuantity = item.Detail.StockQuantity,
                    CreateDate = item.Detail.CreateDate,
                    ValidDate = item.Detail.ValidDate,
                    LocationCode = item.LocationCode,
                    PalletCode = item.PalletCode,
                    Barcode = item.Detail.Barcode,
                    DaysToExpiration = daysToExpire
                };
               
                if (daysToExpiration < minDaysToExpiration)
                {
                    minDaysToExpiration = daysToExpiration;
                }
                resultDTO.Details.Add(detail);
                resultDTO.Add(extDetail);
            }
            resultDTO.DaysToExpiration = minDaysToExpiration;
            resultDTO = resultDTO.OrderBy(d => d.DaysToExpiration).ToList();
            return resultDTO;
        }