From db215dc033392d843cec846f0a8f9dbff2578c6a Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期四, 04 十二月 2025 12:57:53 +0800
Subject: [PATCH] 提交
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs | 72 +++++++++++++++++++++++++++++++----
1 files changed, 63 insertions(+), 9 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 f78db64..bf49e91 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"
@@ -636,24 +636,25 @@
if (userSelection == null) continue;
// 璁$畻璇ユ墭鐩樺疄闄呭彲鐢ㄦ暟閲�
- var availableQuantity = CalculateAvailableQuantity(stock, outboundOrderDetail.MaterielCode,
- outboundOrderDetail.BatchNo, outboundOrderDetail.SupplyCode);
+ var availableQuantity = CalculateAvailableQuantityByBarcode(stock, outboundOrderDetail.MaterielCode,
+ outboundOrderDetail.BatchNo, outboundOrderDetail.SupplyCode, userSelection.Barcode);
// 纭畾鍒嗛厤鏁伴噺锛氬彇鐢ㄦ埛閫夋嫨鏁伴噺銆佸彲鐢ㄦ暟閲忓拰鍓╀綑闇�姹傜殑鏈�灏忓��
- var assignQuantity = Math.Min(Math.Min(userSelection.UseableQuantity, availableQuantity),remainingNeedQuantity);
+ var assignQuantity = Math.Min(Math.Min(userSelection.UseableQuantity, availableQuantity), remainingNeedQuantity);
if (assignQuantity <= 0) continue;
- // 鎵ц鍒嗛厤
- var (actualAssigned, barcode) = AssignStockQuantity(stock, outboundOrderDetail, assignQuantity);
+ // 鎵ц鍒嗛厤锛屼娇鐢ㄧ敤鎴烽�夋嫨鐨勬潯鐮�
+ var actualAssigned = AssignStockQuantity(stock, outboundOrderDetail, assignQuantity, userSelection.Barcode);
+
if (actualAssigned > 0)
{
outStocks.Add(stock);
totalAssignedFromUserSelection += actualAssigned;
remainingNeedQuantity -= actualAssigned;
- // 鍒涘缓閿佸畾璁板綍
- var lockInfo = CreateOutStockLockInfo(outboundOrder, outboundOrderDetail, stock, actualAssigned, barcode);
+ // 鍒涘缓閿佸畾璁板綍锛屼娇鐢ㄧ敤鎴烽�夋嫨鐨勬潯鐮�
+ var lockInfo = CreateOutStockLockInfo(outboundOrder, outboundOrderDetail, stock, actualAssigned, userSelection.Barcode);
outStockLockInfos.Add(lockInfo);
}
}
@@ -721,7 +722,25 @@
return (outStocks, outboundOrderDetail, outStockLockInfos, locationInfos);
}
+ private decimal CalculateAvailableQuantityByBarcode(Dt_StockInfo stock, string materielCode, string batchNo, string supplyCode, string barcode)
+ {
+ var query = stock.Details.AsQueryable()
+ .Where(d => d.MaterielCode == materielCode &&
+ (d.StockQuantity - d.OutboundQuantity) > 0 &&
+ d.Barcode == barcode);
+ if (!string.IsNullOrEmpty(batchNo))
+ {
+ query = query.Where(x => x.BatchNo == batchNo);
+ }
+
+ if (!string.IsNullOrEmpty(supplyCode))
+ {
+ query = query.Where(d => d.SupplyCode == supplyCode);
+ }
+
+ return query.Sum(d => d.StockQuantity - d.OutboundQuantity);
+ }
// 杈呭姪鏂规硶
private decimal CalculateAvailableQuantity(Dt_StockInfo stock, string materielCode, string batchNo, string supplyCode)
{
@@ -732,6 +751,41 @@
.ToList();
return relevantDetails.Sum(d => d.StockQuantity - d.OutboundQuantity);
+ }
+
+ private decimal AssignStockQuantity(Dt_StockInfo stock, Dt_OutboundOrderDetail detail, decimal assignQuantity, string barcode)
+ {
+ decimal remainingAssign = assignQuantity;
+
+ // 鎸夊厛杩涘厛鍑哄垎閰嶆寚瀹氭潯鐮佺殑搴撳瓨鏄庣粏
+ var query = stock.Details.AsQueryable()
+ .Where(d => d.MaterielCode == detail.MaterielCode &&
+ (d.StockQuantity - d.OutboundQuantity) > 0 &&
+ d.Barcode == barcode); // 鍙垎閰嶆寚瀹氭潯鐮�
+
+ if (!string.IsNullOrEmpty(detail.BatchNo))
+ {
+ query = query.Where(x => x.BatchNo == detail.BatchNo);
+ }
+ // 濡傛灉鍑哄簱鍗曟湁渚涘簲鍟嗚姹傦紝鎸変緵搴斿晢杩囨护
+ if (!string.IsNullOrEmpty(detail.SupplyCode))
+ {
+ query = query.Where(d => d.SupplyCode == detail.SupplyCode);
+ }
+ var sortedDetails = query.ToList().OrderBy(d => d.CreateDate);
+
+ foreach (var stockDetail in sortedDetails)
+ {
+ if (remainingAssign <= 0) break;
+
+ var available = stockDetail.StockQuantity - stockDetail.OutboundQuantity;
+ var assign = Math.Min(available, remainingAssign);
+
+ stockDetail.OutboundQuantity += assign;
+ remainingAssign -= assign;
+ }
+
+ return assignQuantity - remainingAssign; // 杩斿洖瀹為檯鍒嗛厤鏁伴噺
}
private (decimal assignedQuantity, string barcode) AssignStockQuantity(Dt_StockInfo stock, Dt_OutboundOrderDetail detail, decimal assignQuantity)
@@ -843,8 +897,8 @@
return (false, $"鎵樼洏[{selection.PalletCode}]涓嶅瓨鍦�");
}
- var available = CalculateAvailableQuantity(stock, outboundOrderDetail.MaterielCode,
- outboundOrderDetail.BatchNo, outboundOrderDetail.SupplyCode);
+ var available = CalculateAvailableQuantityByBarcode(stock, outboundOrderDetail.MaterielCode,
+ outboundOrderDetail.BatchNo, outboundOrderDetail.SupplyCode,selection.Barcode);
if (available <= 0)
{
--
Gitblit v1.9.3