From c1eac732fc3ef407d51b76d288f311d2fa43e618 Mon Sep 17 00:00:00 2001
From: xby-y <2251528873@qq.com>
Date: 星期一, 12 一月 2026 15:18:41 +0800
Subject: [PATCH] 1

---
 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs |  230 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 229 insertions(+), 1 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
index 339d933..be80b25 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
@@ -1,4 +1,6 @@
-锘縰sing 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;
+        }   
     }
 }

--
Gitblit v1.9.3