From ca4a0e7ffc11dc6f4c19b75f625444b06768ea15 Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期三, 12 十一月 2025 08:51:30 +0800
Subject: [PATCH] 提交
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs | 79 +++++++++++++++++++++++++++------------
1 files changed, 55 insertions(+), 24 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/WIDESEA_OutboundService/OutboundOrderDetailService.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/WIDESEA_OutboundService/OutboundOrderDetailService.cs"
index fdf2e9c..826d45a 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/WIDESEA_OutboundService/OutboundOrderDetailService.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/WIDESEA_OutboundService/OutboundOrderDetailService.cs"
@@ -1,4 +1,5 @@
-锘縰sing WIDESEA_Common.LocationEnum;
+锘縰sing Microsoft.Extensions.Logging;
+using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
@@ -24,8 +25,8 @@
private readonly IRecordService _recordService;
private readonly IOutboundOrderService _outboundOrderService;
private readonly ILocationStatusChangeRecordService _locationStatusChangeRecordService;
-
- public OutboundOrderDetailService(IRepository<Dt_OutboundOrderDetail> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IBasicService basicService, IRecordService recordService, ILocationInfoService locationInfoService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IOutboundOrderService outboundOrderService) : base(BaseDal)
+ private readonly ILogger<OutboundOrderDetailService> _logger;
+ public OutboundOrderDetailService(IRepository<Dt_OutboundOrderDetail> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IBasicService basicService, IRecordService recordService, ILocationInfoService locationInfoService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IOutboundOrderService outboundOrderService, ILogger<OutboundOrderDetailService> logger) : base(BaseDal)
{
_unitOfWorkManage = unitOfWorkManage;
_stockService = stockService;
@@ -35,6 +36,7 @@
_locationInfoService = locationInfoService;
_locationStatusChangeRecordService = locationStatusChangeRecordService;
_outboundOrderService = outboundOrderService;
+ _logger = logger;
}
@@ -85,10 +87,10 @@
}
// 鍒嗛厤搴撳瓨锛堟寜鍏堣繘鍏堝嚭锛�
- List<Dt_StockInfo> autoAssignStocks = _stockService.StockInfoService.GetOutboundStocks(
+ var (autoAssignStocks, stockAllocations) = _stockService.StockInfoService.GetOutboundStocks(
stockInfos, item.MaterielCode, needQuantity, out decimal residueQuantity);
- if (residueQuantity > 0)
+ if (residueQuantity > 0 && residueQuantity == needQuantity)
{
throw new Exception($"鐗╂枡[{item.MaterielCode}]搴撳瓨涓嶈冻锛岄渶瑕亄needQuantity}锛屽彲鐢▄needQuantity - residueQuantity}");
}
@@ -96,7 +98,7 @@
outStocks.AddRange(autoAssignStocks);
// 鎸夊厛杩涘厛鍑哄師鍒欏垎閰嶉攣瀹氭暟閲忓埌鍚勪釜鏄庣粏
- DistributeLockQuantityByFIFO(item.Details, autoAssignStocks, outStockLockInfos, outboundOrder);
+ DistributeLockQuantityByFIFO(item.Details, autoAssignStocks, stockAllocations, outStockLockInfos, outboundOrder);
}
locationInfos.AddRange(_locationInfoService.GetLocationInfos(outStocks.Select(x => x.LocationCode).Distinct().ToList()));
@@ -105,52 +107,59 @@
}
/// <summary>
- /// 鎸夊厛杩涘厛鍑哄師鍒欏垎閰嶉攣瀹氭暟閲忓埌鍚勪釜鏄庣粏
+ /// 鎸夊厛杩涘厛鍑哄師鍒欏垎閰嶉攣瀹氭暟閲忓埌鍚勪釜鏄庣粏 - 淇鐗堟湰
/// </summary>
private void DistributeLockQuantityByFIFO(
List<Dt_OutboundOrderDetail> details,
List<Dt_StockInfo> assignStocks,
+ Dictionary<int, decimal> stockAllocations,
List<Dt_OutStockLockInfo> outStockLockInfos,
Dt_OutboundOrder outboundOrder)
{
// 鎸夊厛杩涘厛鍑烘帓搴忓嚭搴撳崟鏄庣粏锛堝亣璁惧厛鍒涘缓鐨勬槑缁嗛渶瑕佷紭鍏堟弧瓒筹級
var sortedDetails = details
- .OrderBy(x => x.Id) // 鎸塈D鎺掑簭锛屽亣璁惧厛鍒涘缓鐨処D灏�
+ .Where(d => d.OrderQuantity - d.OverOutQuantity - d.LockQuantity > 0) // 鍙鐞嗚繕闇�瑕佸垎閰嶇殑鏁伴噺
+ .OrderBy(x => x.Id)
.ToList();
- // 鎸夊厛杩涘厛鍑烘帓搴忓簱瀛橈紙鐢熶骇鏃ユ湡鏈�鏃╃殑浼樺厛锛�
- var sortedStockDetails = assignStocks
+ if (!sortedDetails.Any()) return;
+
+ // 鑾峰彇鎵�鏈夊垎閰嶄簡搴撳瓨鐨勬槑缁嗭紝鎸夊厛杩涘厛鍑烘帓搴�
+ var allocatedStockDetails = assignStocks
.SelectMany(x => x.Details)
- .Where(x => details.Any(d => d.MaterielCode == x.MaterielCode))
+ .Where(x => stockAllocations.ContainsKey(x.Id))
.OrderBy(x => x.ProductionDate)
+ .ThenBy(x => x.StockId)
.ToList();
// 涓烘瘡涓簱瀛樻槑缁嗗垱寤哄垎閰嶈褰�
- foreach (var stockDetail in sortedStockDetails)
+ foreach (var stockDetail in allocatedStockDetails)
{
- var stockInfo = assignStocks.First(x => x.Id == stockDetail.StockId);
- var allocatedQuantity = stockDetail.OutboundQuantity; // 杩欎釜搴撳瓨鏄庣粏鍒嗛厤鐨勬暟閲�
+ if (!stockAllocations.TryGetValue(stockDetail.Id, out decimal allocatedQuantity))
+ continue;
if (allocatedQuantity <= 0) continue;
- // 鎸夐『搴忓垎閰嶇粰鍚勪釜鍑哄簱鍗曟槑缁�
+ var stockInfo = assignStocks.First(x => x.Id == stockDetail.StockId);
decimal remainingAllocate = allocatedQuantity;
+ // 鎸夐『搴忓垎閰嶇粰鍚勪釜鍑哄簱鍗曟槑缁�
foreach (var detail in sortedDetails)
{
if (remainingAllocate <= 0) break;
// 璁$畻杩欎釜鏄庣粏杩橀渶瑕佸垎閰嶇殑鏁伴噺
- var alreadyAssigned = outStockLockInfos
- .Where(x => x.OrderDetailId == detail.Id && x.StockId == stockInfo.Id)
- .Sum(x => x.AssignQuantity);
-
- var detailNeed = detail.OrderQuantity - detail.OverOutQuantity - detail.LockQuantity - alreadyAssigned;
-
+ var detailNeed = detail.OrderQuantity - detail.OverOutQuantity - detail.LockQuantity;
if (detailNeed <= 0) continue;
// 鍒嗛厤鏁伴噺
var assignQuantity = Math.Min(remainingAllocate, detailNeed);
+
+ // 楠岃瘉鏉$爜鏄惁瀛樺湪
+ if (string.IsNullOrEmpty(stockDetail.Barcode))
+ {
+ throw new Exception($"搴撳瓨鏄庣粏ID[{stockDetail.Id}]鐨勬潯鐮佷负绌�");
+ }
// 鍒涘缓鍑哄簱閿佸畾淇℃伅
var lockInfo = _outStockLockInfoService.GetOutStockLockInfo(
@@ -162,10 +171,32 @@
remainingAllocate -= assignQuantity;
}
- // 濡傛灉杩樻湁鍓╀綑鍒嗛厤鏁伴噺锛岃鏄庨�昏緫鏈夎
+ // 濡傛灉杩樻湁鍓╀綑鍒嗛厤鏁伴噺锛岄噸鏂板垎閰嶆垨璁板綍璀﹀憡
if (remainingAllocate > 0)
{
- throw new Exception($"搴撳瓨鍒嗛厤閫昏緫閿欒锛屽墿浣欐湭鍒嗛厤鏁伴噺锛歿remainingAllocate}");
+ // 閲嶆柊鍒嗛厤缁欏叾浠栭渶瑕佸垎閰嶇殑鏄庣粏
+ foreach (var detail in sortedDetails)
+ {
+ if (remainingAllocate <= 0) break;
+
+ var detailNeed = detail.OrderQuantity - detail.OverOutQuantity - detail.LockQuantity;
+ if (detailNeed <= 0) continue;
+
+ var assignQuantity = Math.Min(remainingAllocate, detailNeed);
+
+ var lockInfo = _outStockLockInfoService.GetOutStockLockInfo(
+ outboundOrder, detail, stockInfo, assignQuantity, stockDetail.Barcode);
+ outStockLockInfos.Add(lockInfo);
+
+ detail.LockQuantity += assignQuantity;
+ remainingAllocate -= assignQuantity;
+ }
+
+ // 濡傛灉杩樻湁鍓╀綑锛岃褰曡鍛婁絾涓嶆姏鍑哄紓甯�
+ if (remainingAllocate > 0)
+ {
+ _logger.LogWarning($"搴撳瓨鍒嗛厤鍚庝粛鏈夊墿浣欐暟閲忔湭鍒嗛厤: {remainingAllocate}, 鏉$爜: {stockDetail.Barcode}");
+ }
}
}
}
@@ -219,7 +250,7 @@
var (barcode, barcodeQuantity) = GetBarcodeForAllocation(barcodeAllocation, canAssign);
var lockInfo = _outStockLockInfoService.GetOutStockLockInfo(
- outboundOrder, detail, stock, canAssign, barcode,null);
+ outboundOrder, detail, stock, canAssign, barcode);
outStockLockInfos.Add(lockInfo);
availableAssign -= canAssign;
--
Gitblit v1.9.3