1
xby-y
2026-01-12 c1eac732fc3ef407d51b76d288f311d2fa43e618
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
@@ -1,4 +1,6 @@
using AutoMapper;
using AutoMapper;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_IStockService;
@@ -17,5 +19,231 @@
            _mapper = mapper;
        }
        /// <summary>
        /// èŽ·å–åº“å­˜ç»Ÿè®¡æ•°æ®
        /// </summary>
        /// <returns></returns>
        public WebResponseContent GetStockStatistics()
        {
            var response = new WebResponseContent();
            try
            {
                // å®šä¹‰åº“存状态常量
                const int STOCK_STATUS_INBOUND_COMPLETE = 6; // å…¥åº“完成状态
                const int STOCK_STATUS_OUTBOUND_COMPLETE = 8; // å‡ºåº“完成状态
                // èŽ·å–å½“å‰æ—¥æœŸæ—¶é—´
                var now = DateTime.Now;
                // èŽ·å–ä»Šæ—¥æ—¥æœŸèŒƒå›´
                var todayStart = now.Date;
                var todayEnd = now.Date.AddDays(1);
                // èŽ·å–æœ¬å‘¨æ—¥æœŸèŒƒå›´
                // è®¡ç®—本周一的日期:如果今天是周日(0),减去6天;否则减去当前星期几减1天
                var daysToSubtract = (int)now.DayOfWeek == 0 ? 6 : (int)now.DayOfWeek - 1;
                var weekStart = now.Date.AddDays(-daysToSubtract);
                var weekEnd = weekStart.AddDays(7);
                // èŽ·å–æœ¬æœˆæ—¥æœŸèŒƒå›´
                var monthStart = new DateTime(now.Year, now.Month, 1);
                var monthEnd = monthStart.AddMonths(1);
                // èŽ·å–æ‰€æœ‰åº“å­˜æ•°æ®ï¼Œç”¨äºŽåŽç»­ç»Ÿè®¡
                var allStockData = Repository.Db.Queryable<Dt_StockInfo>().ToList();
                // è°ƒè¯•信息:打印日期范围和库存数据总数
                var debugInfo = new
                {
                    CurrentDateTime = now,
                    TodayRange = $"{todayStart:yyyy-MM-dd HH:mm:ss} ~ {todayEnd:yyyy-MM-dd HH:mm:ss}",
                    WeekRange = $"{weekStart:yyyy-MM-dd HH:mm:ss} ~ {weekEnd:yyyy-MM-dd HH:mm:ss}",
                    MonthRange = $"{monthStart:yyyy-MM-dd HH:mm:ss} ~ {monthEnd:yyyy-MM-dd HH:mm:ss}",
                    TotalStockCount = allStockData.Count,
                    AllStockStatus = allStockData.Select(it => new { it.Id, it.StockStatus, it.CreateDate }).ToList()
                };
                // æ€»åº“存数量:库存状态为入库完成的记录数量
                var totalStock = allStockData.Count(it => it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE);
                // ä»Šæ—¥å…¥åº“数量:今天创建且库存状态为入库完成的记录数量
                var todayInbound = allStockData.Count(it =>
                    it.CreateDate >= todayStart && it.CreateDate < todayEnd &&
                    it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE);
                // ä»Šæ—¥å‡ºåº“数量:今天创建且库存状态为出库完成的记录数量
                var todayOutbound = allStockData.Count(it =>
                    it.CreateDate >= todayStart && it.CreateDate < todayEnd &&
                    it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE);
                // æœ¬å‘¨å…¥åº“数量:本周创建且库存状态为入库完成的记录数量
                var weekInbound = allStockData.Count(it =>
                    it.CreateDate >= weekStart && it.CreateDate < weekEnd &&
                    it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE);
                // æœ¬å‘¨å‡ºåº“数量:本周创建且库存状态为出库完成的记录数量
                var weekOutbound = allStockData.Count(it =>
                    it.CreateDate >= weekStart && it.CreateDate < weekEnd &&
                    it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE);
                // æœ¬æœˆå…¥åº“数量:本月创建且库存状态为入库完成的记录数量
                var monthInbound = allStockData.Count(it =>
                    it.CreateDate >= monthStart && it.CreateDate < monthEnd &&
                    it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE);
                // æœ¬æœˆå‡ºåº“数量:本月创建且库存状态为出库完成的记录数量
                var monthOutbound = allStockData.Count(it =>
                    it.CreateDate >= monthStart && it.CreateDate < monthEnd &&
                    it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE);
                // å¾…处理订单数量:由于只有Dt_StockInfo表,暂时返回0
                var pendingOrders = 0;
                // åº“存状态分布:统计不同库存状态的数量
                var stockStatusDistribution = allStockData
                    .GroupBy(it => it.StockStatus)
                    .Select(g => new { Status = g.Key, Count = g.Count() })
                    .ToList();
                // è´§ä½åˆ†å¸ƒï¼šç»Ÿè®¡ä¸åŒè´§ä½çš„库存数量
                var locationDistribution = allStockData
                    .Where(it => !string.IsNullOrEmpty(it.LocationCode))
                    .GroupBy(it => it.LocationCode)
                    .Select(g => new { Location = g.Key, Count = g.Count() })
                    .OrderByDescending(g => g.Count)
                    .Take(10) // åªå–前10个货位
                    .ToList();
                // è´§ä½åˆ©ç”¨çŽ‡ï¼šä»Žæ•°æ®åº“èŽ·å–è´§ä½ä¿¡æ¯
                // èŽ·å–æ‰€æœ‰è´§ä½
                var allLocations = Repository.Db.Queryable<Dt_LocationInfo>().ToList();
                var totalLocations = allLocations.Count;
                // ç»Ÿè®¡ä¸åŒçŠ¶æ€çš„è´§ä½æ•°
                var freeLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.Free);
                var inStockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.InStock);
                var inStockLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.InStockLock);
                var lockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.Lock);
                var freeLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.FreeLock);
                var palletLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.PalletLock);
                // è®¡ç®—已使用和未使用的货位数
                // å·²ä½¿ç”¨ï¼šæœ‰è´§ã€æœ‰è´§é”å®š
                var usedLocations = inStockLocations + inStockLockLocations;
                // æœªä½¿ç”¨ï¼šç©ºé—²ã€ç©ºé—²é”å®š
                var unusedLocations = freeLocations + freeLockLocations;
                // åº“存变化趋势:模拟最近7天的数据
                // å®žé™…应根据数据库中的历史记录生成
                var stockTrend = Enumerable.Range(0, 7)
                    .Select(i => {
                        var date = now.AddDays(-6 + i).Date;
                        var count = allStockData.Count(it =>
                            it.CreateDate.Date <= date &&
                            it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE &&
                            (it.StockStatus != STOCK_STATUS_OUTBOUND_COMPLETE || it.CreateDate.Date > date));
                        return new { Date = date.ToString("MM-dd"), Count = count };
                    })
                    .ToList();
                // æ—¥å‡ºå…¥åº“明细:按小时统计
                var dailyInout = new {
                    inbound = Enumerable.Range(8, 10).Select(hour =>
                        allStockData.Count(it =>
                            it.CreateDate >= todayStart.AddHours(hour) &&
                            it.CreateDate < todayStart.AddHours(hour + 1) &&
                            it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE))
                        .ToList(),
                    outbound = Enumerable.Range(8, 10).Select(hour =>
                        allStockData.Count(it =>
                            it.CreateDate >= todayStart.AddHours(hour) &&
                            it.CreateDate < todayStart.AddHours(hour + 1) &&
                            it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE))
                        .ToList()
                };
                // å‘¨å‡ºå…¥åº“统计:按天统计
                var weekInout = new {
                    inbound = Enumerable.Range(0, 7).Select(day =>
                        allStockData.Count(it =>
                            it.CreateDate >= weekStart.AddDays(day) &&
                            it.CreateDate < weekStart.AddDays(day + 1) &&
                            it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE))
                        .ToList(),
                    outbound = Enumerable.Range(0, 7).Select(day =>
                        allStockData.Count(it =>
                            it.CreateDate >= weekStart.AddDays(day) &&
                            it.CreateDate < weekStart.AddDays(day + 1) &&
                            it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE))
                        .ToList()
                };
                // æœˆå‡ºå…¥åº“趋势:按5天统计
                var monthInout = new {
                    inbound = Enumerable.Range(0, 7).Select(i =>
                        allStockData.Count(it =>
                            it.CreateDate >= monthStart.AddDays(i * 5) &&
                            it.CreateDate < monthStart.AddDays((i + 1) * 5) &&
                            it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE))
                        .ToList(),
                    outbound = Enumerable.Range(0, 7).Select(i =>
                        allStockData.Count(it =>
                            it.CreateDate >= monthStart.AddDays(i * 5) &&
                            it.CreateDate < monthStart.AddDays((i + 1) * 5) &&
                            it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE))
                        .ToList()
                };
                // ç»„装返回数据,包含调试信息和图表数据
                var data = new
                {
                    totalLocations,
                    todayInbound,
                    todayOutbound,
                    weekInbound,
                    weekOutbound,
                    monthInbound,
                    monthOutbound,
                    pendingOrders,
                    // å›¾è¡¨æ•°æ®
                    stockStatus = stockStatusDistribution.Select(item => new { name = $"状态{item.Status}", value = item.Count }).ToList(),
                    locationDistribution = locationDistribution.Select(item => new { name = item.Location, value = item.Count }).ToList(),
                    // è´§ä½åˆ©ç”¨çŽ‡ï¼šåŒ…å«ä¸åŒçŠ¶æ€çš„è´§ä½æ•°é‡
                    warehouseUtilization = new {
                        total = totalLocations,
                        free = freeLocations,
                        inStock = inStockLocations,
                        inStockLock = inStockLockLocations,
                        lockLocations = lockLocations,
                        freeLock = freeLockLocations,
                        palletLock = palletLockLocations,
                        used = usedLocations,
                        unused = unusedLocations
                    },
                    stockTrend = stockTrend.Select(item => item.Count).ToList(),
                    dailyInout,
                    weekInout,
                    monthInout,
                    debugInfo
                };
                response.Status = true;
                response.Data = data;
                response.Message = "获取成功";
            }
            catch (Exception ex)
            {
                response.Status = false;
                response.Message = ex.Message;
                response.Data = new
                {
                    Exception = ex.ToString(),
                    StackTrace = ex.StackTrace
                };
            }
            return response;
        }
    }
}