From cf83e0828b286b61b69a15005e6247d8b03f4cd8 Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期日, 16 十一月 2025 19:14:03 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs |  125 +----------------------------------------
 1 files changed, 4 insertions(+), 121 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 826d45a..fb068ec 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"
@@ -70,7 +70,7 @@
                     MaterielCode = x.Key.MaterielCode,
                     BatchNo = x.Key.BatchNo,
                     Details = x.ToList(),
-                    TotalNeedQuantity = x.Sum(v => v.OrderQuantity - v.OverOutQuantity - v.LockQuantity)
+                    TotalNeedQuantity = x.Sum(v => v.OrderQuantity - v.OverOutQuantity - v.LockQuantity-v.MoveQty)
                 })
                 .Where(x => x.TotalNeedQuantity > 0)
                 .ToList();
@@ -107,7 +107,7 @@
         }
 
         /// <summary>
-        /// 鎸夊厛杩涘厛鍑哄師鍒欏垎閰嶉攣瀹氭暟閲忓埌鍚勪釜鏄庣粏 - 淇鐗堟湰
+        /// 鎸夊厛杩涘厛鍑哄師鍒欏垎閰嶉攣瀹氭暟閲忓埌鍚勪釜鏄庣粏  
         /// </summary>
         private void DistributeLockQuantityByFIFO(
             List<Dt_OutboundOrderDetail> details,
@@ -118,7 +118,7 @@
         {
             // 鎸夊厛杩涘厛鍑烘帓搴忓嚭搴撳崟鏄庣粏锛堝亣璁惧厛鍒涘缓鐨勬槑缁嗛渶瑕佷紭鍏堟弧瓒筹級
             var sortedDetails = details
-                .Where(d => d.OrderQuantity - d.OverOutQuantity - d.LockQuantity > 0) // 鍙鐞嗚繕闇�瑕佸垎閰嶇殑鏁伴噺
+                .Where(d => d.OrderQuantity - d.OverOutQuantity - d.LockQuantity -d.MoveQty> 0) // 鍙鐞嗚繕闇�瑕佸垎閰嶇殑鏁伴噺
                 .OrderBy(x => x.Id)
                 .ToList();
 
@@ -128,7 +128,7 @@
             var allocatedStockDetails = assignStocks
                 .SelectMany(x => x.Details)
                 .Where(x => stockAllocations.ContainsKey(x.Id))
-                .OrderBy(x => x.ProductionDate)
+                .OrderBy(x => x.CreateDate)
                 .ThenBy(x => x.StockId)
                 .ToList();
 
@@ -201,123 +201,6 @@
             }
         }
 
- 
-/// <summary>
-    /// 鍒涘缓鍑哄簱閿佸畾淇℃伅
-    /// </summary>
-    private void CreateOutStockLockInfos(Dt_OutboundOrder outboundOrder,List<Dt_OutboundOrderDetail> details,
-        List<Dt_StockInfo> assignStocks,List<Dt_OutStockLockInfo> outStockLockInfos)
-        {
-            foreach (var stock in assignStocks)
-            {
-                // 鑾峰彇璇ュ簱瀛樹腑鐩稿叧鐗╂枡鐨勫彲鐢ㄦ潯鐮佷俊鎭�
-                var stockDetails = stock.Details
-                    .Where(x => details.Any(d => d.MaterielCode == x.MaterielCode) &&
-                               x.StockQuantity > x.OutboundQuantity)
-                    .OrderBy(x => x.ProductionDate) // 鍏堣繘鍏堝嚭
-                    .ToList();
-                if (!stockDetails.Any()) continue;
-
-                var stockAssignQuantity = stockDetails.Sum(x => x.OutboundQuantity);
-
-
-                // 鏌ユ壘杩欎釜搴撳瓨宸茬粡鍒嗛厤鐨勬暟閲�
-                var existingAssign = outStockLockInfos
-                    .Where(x => x.StockId == stock.Id &&
-                               details.Any(d => d.Id == x.OrderDetailId))
-                    .Sum(x => x.AssignQuantity);
-
-                var availableAssign = stockAssignQuantity - existingAssign;
-
-                if (availableAssign <= 0) continue;
-
-                // 鎸夊厛杩涘厛鍑哄師鍒欏垎閰嶆潯鐮�
-                var barcodeAllocation = AllocateBarcodes(stockDetails, availableAssign);
-
-
-                // 鍒嗛厤缁欏悇涓槑缁�
-                foreach (var detail in details.Where(d => d.LockQuantity > 0))
-                {
-                    var alreadyAssigned = outStockLockInfos
-                        .Where(x => x.OrderDetailId == detail.Id && x.StockId == stock.Id)
-                        .Sum(x => x.AssignQuantity);
-
-                    var canAssign = Math.Min(detail.LockQuantity - alreadyAssigned, availableAssign);
-
-                    if (canAssign > 0)
-                    {
-                        // 涓鸿繖涓垎閰嶇‘瀹氭潯鐮�
-                        var (barcode, barcodeQuantity) = GetBarcodeForAllocation(barcodeAllocation, canAssign);
-
-                        var lockInfo = _outStockLockInfoService.GetOutStockLockInfo(
-                            outboundOrder, detail, stock, canAssign, barcode);
-                        outStockLockInfos.Add(lockInfo);
-
-                        availableAssign -= canAssign;
-
-                        // 鏇存柊鏉$爜鍒嗛厤璁板綍
-                        UpdateBarcodeAllocation(barcodeAllocation, barcode, barcodeQuantity);
-                    }
-
-                    if (availableAssign <= 0) break;
-                }
-            }
-        }
-
-        /// <summary>
-        /// 鎸夊厛杩涘厛鍑哄師鍒欏垎閰嶆潯鐮�
-        /// </summary>
-        private Dictionary<string, decimal> AllocateBarcodes(List<Dt_StockInfoDetail> stockDetails, decimal totalQuantity)
-        {
-            var allocation = new Dictionary<string, decimal>();
-            decimal remainingQuantity = totalQuantity;
-
-            foreach (var detail in stockDetails.OrderBy(x => x.ProductionDate))
-            {
-                if (remainingQuantity <= 0) break;
-
-                decimal available = detail.StockQuantity - detail.OutboundQuantity;
-                decimal allocate = Math.Min(available, remainingQuantity);
-
-                allocation[detail.Barcode] = allocate;
-                remainingQuantity -= allocate;
-            }
-
-            return allocation;
-        }
-
-        /// <summary>
-        /// 涓哄垎閰嶈幏鍙栧悎閫傜殑鏉$爜
-        /// </summary>
-        private (string barcode, decimal quantity) GetBarcodeForAllocation(Dictionary<string, decimal> barcodeAllocation, decimal requiredQuantity)
-        {
-            foreach (var (barcode, quantity) in barcodeAllocation)
-            {
-                if (quantity >= requiredQuantity)
-                {
-                    return (barcode, requiredQuantity);
-                }
-            }
-
-            // 濡傛灉鍗曚釜鏉$爜鏁伴噺涓嶈冻锛屼娇鐢ㄧ涓�涓潯鐮�
-            var first = barcodeAllocation.First();
-            return (first.Key, Math.Min(first.Value, requiredQuantity));
-        }
-
-        /// <summary>
-        /// 鏇存柊鏉$爜鍒嗛厤璁板綍
-        /// </summary>
-        private void UpdateBarcodeAllocation(Dictionary<string, decimal> barcodeAllocation, string barcode, decimal usedQuantity)
-        {
-            if (barcodeAllocation.ContainsKey(barcode))
-            {
-                barcodeAllocation[barcode] -= usedQuantity;
-                if (barcodeAllocation[barcode] <= 0)
-                {
-                    barcodeAllocation.Remove(barcode);
-                }
-            }
-        }
         /// <summary>
         /// 鍑哄簱搴撳瓨鍒嗛厤鍚庯紝鏇存柊鏁版嵁搴撴暟鎹�
         /// </summary>

--
Gitblit v1.9.3