From 37454e625df68d40897112b2e8c2e3cf4d7163e3 Mon Sep 17 00:00:00 2001
From: heshaofeng <heshaofeng@hnkhzn.com>
Date: 星期三, 25 三月 2026 11:43:10 +0800
Subject: [PATCH] 1
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs | 193 +++++++++++++++++++++++++++---------------------
1 files changed, 108 insertions(+), 85 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs"
index 2c3797e..dfb1776 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs"
@@ -30,8 +30,9 @@
private readonly IRepository<Dt_Task> _taskRepository;
private readonly IRepository<Dt_StockInfo> _stockInfoRepository;
private readonly IRepository<Dt_MaterialExpirationDate> _materialExpirationDateRepository;
+ private readonly IRepository<Dt_InboundOrder> _inboundRepository;
- public BigGreenService(IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRepository<Dt_OutboundOrder> outBoundOrderRepository, IRepository<Dt_LocationInfo> locationInfoRepository, IRepository<Dt_OutboundOrderDetail> outBoundOrderDetailRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IRepository<Dt_Task_Hty> taskHtyRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_MaterialExpirationDate> materialExpirationDateRepository)
+ public BigGreenService(IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRepository<Dt_OutboundOrder> outBoundOrderRepository, IRepository<Dt_LocationInfo> locationInfoRepository, IRepository<Dt_OutboundOrderDetail> outBoundOrderDetailRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IRepository<Dt_Task_Hty> taskHtyRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_MaterialExpirationDate> materialExpirationDateRepository,IRepository<Dt_InboundOrder> inboundRepository)
{
_stockInfoDetailRepository = stockInfoDetailRepository;
_outBoundOrderRepository = outBoundOrderRepository;
@@ -42,6 +43,7 @@
_taskHtyRepository = taskHtyRepository;
_stockInfoRepository = stockInfoRepository;
_materialExpirationDateRepository = materialExpirationDateRepository;
+ _inboundRepository = inboundRepository;
}
public WebResponseContent GetBigGreenData()
{
@@ -54,12 +56,17 @@
(int)OutOrderStatusEnum.鍑哄簱涓�,
(int)OutOrderStatusEnum.鏈紑濮�
};
- var unOutBound = _outBoundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => targetStatus.Contains(x.OrderStatus)).Count();
+ var targetInStatus = new List<int>
+ {
+ (int)InOrderStatusEnum.鍏ュ簱涓�,
+ (int)InOrderStatusEnum.鏈紑濮�
+ };
+ var unOutBound = _outBoundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => targetStatus.Contains(x.OrderStatus) && x.CreateDate.ToString("MM-dd") == DateTime.Now.ToString("MM-dd")).Count();
+ var unInBound = _inboundRepository.Db.Queryable<Dt_InboundOrder>().Where(x => targetInStatus.Contains(x.OrderStatus) && x.CreateDate.ToString("MM-dd") == DateTime.Now.ToString("MM-dd")).Count();
//璁$畻搴撲綅鍒╃敤鐜�
- 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();
- int totalLocation = freeLocation + inStockLocation;
+ var totalLocation = _locationInfoRepository.Db.Queryable<Dt_LocationInfo>().Select(x=>x.Id).Count();
+ var inStockLocation = _locationInfoRepository.Db.Queryable<Dt_LocationInfo>().Where(x => x.LocationStatus == (int)LocationStatusEnum.InStock).Count();
decimal locationUtilizationRate = totalLocation == 0
? 0
: Math.Round((decimal)inStockLocation / totalLocation, 4) * 100;
@@ -75,7 +82,7 @@
// 4. 鑾峰彇杩�7鏃ユ瘡鏃ュ嚭鍏ュ簱鏄庣粏锛堟牳蹇冧慨鏀癸細璋冪敤涓婇潰鐨勬柟娉曪級
var dailyInOutBoundList = Get7DaysDailyInOutBound();
- var nearExpirationList = GetMaterialsNearExpiration();
+ List<StockInfoDetailExtDTO> nearExpirationList = GetMaterialsNearExpiration();
//鑾峰彇浣滀笟缁熻
var completeTask = SimpleStatistics();
//浠诲姟
@@ -93,7 +100,8 @@
InStockPallet = inStockPallet,
FreeStockPallet = freeStockPallet,
CompleteTask = completeTask,
- NearExpirationList = nearExpirationList
+ NearExpirationList = nearExpirationList,
+ UnInBoundOrderCount = unInBound
};
return WebResponseContent.Instance.OK(data: bigGreenData);
}
@@ -114,33 +122,33 @@
.ToList();
// 2. 鏌ヨ姣忔棩鍑哄簱鏄庣粏锛堟寜鏃ユ湡鍒嗙粍锛�
- var dailyOutboundList = _outBoundOrderDetailRepository.Db
- .Queryable<Dt_OutboundOrderDetail>()
+ var dailyOutboundList = _outBoundOrderRepository.Db
+ .Queryable<Dt_OutboundOrder>()
.Where(x => x.CreateDate >= startDate
&& x.CreateDate < endDate.AddDays(1))
.Select(x => new
{
Date = x.CreateDate.ToString("MM-dd"),
- x.OverOutQuantity
+ x.OrderStatus
})
.ToList()
.GroupBy(x => x.Date)
- .ToDictionary(k => k.Key, g => g.Sum(x => (decimal?)x.OverOutQuantity) ?? 0); // 杞负瀛楀吀鏂逛究鍖归厤
+ .ToDictionary(k => k.Key, g => g.Count(x => x.OrderStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)); // 杞负瀛楀吀鏂逛究鍖归厤
// 3. 鏌ヨ姣忔棩鍏ュ簱鏄庣粏锛堟寜鏃ユ湡鍒嗙粍锛�
- var dailyInboundList = _inboundOrderDetailRepository.Db
- .Queryable<Dt_InboundOrderDetail>()
+ var dailyInboundList = _inboundRepository.Db
+ .Queryable<Dt_InboundOrder>()
.Where(x => x.CreateDate >= startDate
&& x.CreateDate < endDate.AddDays(1))
.Select(x => new
{
Date = x.CreateDate.ToString("MM-dd"),
- x.OverInQuantity
+ x.OrderStatus
})
.ToList()
.GroupBy(x => x.Date)
- .ToDictionary(k => k.Key, g => g.Sum(x => (decimal?)x.OverInQuantity) ?? 0); // 杞负瀛楀吀鏂逛究鍖归厤
+ .ToDictionary(k => k.Key, g => g.Count(x => x.OrderStatus == (int)InOrderStatusEnum.鍏ュ簱瀹屾垚)); // 杞负瀛楀吀鏂逛究鍖归厤
// 4. 鍚堝苟姣忔棩鏁版嵁锛堢‘淇�7澶╂棩鏈熷畬鏁达紝鏃犳暟鎹ˉ0锛�
var dailyInOutBoundList = all7Days.Select(date => new DailyInOutBoundDto
@@ -156,23 +164,46 @@
public List<SimpleStatisticsDTO> SimpleStatistics()
{
- DateTime sevenDaysAgo = DateTime.Now.AddDays(-7);
+ var today = DateTime.Now.Date;
+ var threeDaysAgo = today.AddDays(-3);
- var stats = _taskHtyRepository
- .QueryData(x => x.TaskStatus == (int)TaskStatusEnum.Finish && x.CreateDate >= sevenDaysAgo)
- .GroupBy(t =>
- (int)t.TaskType >= 100 && (int)t.TaskType <= 299 ? "鍑哄簱" :
- (int)t.TaskType >= 500 && (int)t.TaskType <= 699 ? "鍏ュ簱" : "鍏朵粬"
- )
- .Where(g => g.Key == "鍑哄簱" || g.Key == "鍏ュ簱")
- .Select(g => new SimpleStatisticsDTO
- {
- TaskType = g.Key,
- Count = g.Count()
- })
- .ToList();
+ var targetStatuses = new List<int> { (int)InOrderStatusEnum.鍏ュ簱涓�, (int)InOrderStatusEnum.鏈紑濮�,
+ (int)OutOrderStatusEnum.鏈紑濮�, (int)OutOrderStatusEnum.鍑哄簱涓� };
+ var failReturnStatuses = new List<int> {4,2};
- return stats;
+ var inboundToday = QueryInboundOrders(today, today, targetStatuses);
+ var outboundToday = QueryOutboundOrders(today, today, targetStatuses);
+ var inboundFail3Days = QueryInboundOrders(threeDaysAgo, today, failReturnStatuses, isReturnStatus: true);
+ var outboundFail3Days = QueryOutboundOrders(threeDaysAgo, today, failReturnStatuses, isReturnStatus: true);
+
+
+ return new List<SimpleStatisticsDTO> { new()
+ {
+ inboundOrders = inboundToday,
+ outboundOrders = outboundToday,
+ inboundReturnFailOrders = inboundFail3Days,
+ outboundReturnFailOrders = outboundFail3Days
+ }};
+ }
+
+
+ private List<Dt_InboundOrder> QueryInboundOrders(DateTime startDate, DateTime endDate,
+ List<int> statusList, bool isReturnStatus = false)
+ {
+ return _inboundRepository.QueryData(x =>
+ x.CreateDate.Date >= startDate &&
+ x.CreateDate.Date <= endDate &&
+ (isReturnStatus ? statusList.Contains(x.ReturnToMESStatus) : statusList.Contains(x.OrderStatus))).ToList();
+ }
+
+
+ private List<Dt_OutboundOrder> QueryOutboundOrders(DateTime startDate, DateTime endDate,
+ List<int> statusList, bool isReturnStatus = false)
+ {
+ return _outBoundOrderRepository.QueryData(x =>
+ x.CreateDate.Date >= startDate &&
+ x.CreateDate.Date <= endDate &&
+ (isReturnStatus ? statusList.Contains(x.ReturnToMESStatus) : statusList.Contains(x.OrderStatus))).ToList();
}
/// <summary>
@@ -197,6 +228,8 @@
/// 寰呭嚭搴撹鍗曟暟閲忥紙鍑哄簱涓�+鏈紑濮嬶級
/// </summary>
public int UnOutBoundOrderCount { get; set; }
+
+ public int UnInBoundOrderCount { get; set; }
/// <summary>
/// 绌洪棽搴撲綅鏁伴噺
@@ -239,7 +272,7 @@
public List<SimpleStatisticsDTO> CompleteTask { get; set; }
- public NearExpirationDTO NearExpirationList { get; set; }
+ public List<StockInfoDetailExtDTO> NearExpirationList { get; set; }
}
/// <summary>
@@ -266,86 +299,76 @@
public class SimpleStatisticsDTO
{
- public string TaskType { get; set; }
- public int Count { get; set; }
+ public List<Dt_InboundOrder> inboundOrders { get; set; }
+ public List<Dt_OutboundOrder> outboundOrders { get; set; }
+ public List<Dt_InboundOrder> inboundReturnFailOrders { get; set; }
+ public List<Dt_OutboundOrder> outboundReturnFailOrders { 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()
{
- // 鍒濆鍖栬繑鍥濪TO
- 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;
}
--
Gitblit v1.9.3