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