From f8ec9168ceb7883853381ff0c409e1222b62b634 Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期日, 30 十一月 2025 10:38:28 +0800
Subject: [PATCH] 提交

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs |  168 ++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 145 insertions(+), 23 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/OutboundPickingService.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/OutboundPickingService.cs"
index d9a755c..be0de12 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/OutboundPickingService.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/OutboundPickingService.cs"
@@ -229,14 +229,14 @@
                 }
                 _unitOfWorkManage.BeginTran();
 
-                // 1. 鍓嶇疆楠岃瘉
+                // 鍓嶇疆楠岃瘉
                 var validationResult = await ValidateCancelRequest(orderNo, palletCode, barcode);
                 if (!validationResult.IsValid)
                     return WebResponseContent.Instance.Error(validationResult.ErrorMessage);
 
                 var (pickingRecord, lockInfo, orderDetail) = validationResult.Data;
 
-                // 2. 鎵ц鍙栨秷閫昏緫
+                //鎵ц鍙栨秷閫昏緫
                 await ExecuteCancelLogic(lockInfo, pickingRecord, orderDetail, orderNo);
 
                 _unitOfWorkManage.CommitTran();
@@ -294,6 +294,8 @@
 
                 //鎵ц鍥炲簱鎿嶄綔
                 await ExecuteReturnOperations(orderNo, palletCode, stockInfo, task, statusAnalysis);
+
+                await ReleaseAllLocksForReallocation(orderNo, palletCode, statusAnalysis);
 
                 _unitOfWorkManage.CommitTran();
 
@@ -733,7 +735,15 @@
                 PickQuantity = result.ActualPickedQty,
                 PickTime = DateTime.Now,
                 Operator = App.User.UserName,
-                OutStockLockId = result.FinalLockInfo.Id
+                OutStockLockId = result.FinalLockInfo.Id,
+                BarcodeUnit=result.FinalLockInfo.BarcodeUnit,
+                BarcodeQty=result.FinalLockInfo.BarcodeQty,
+                BatchNo= result.FinalLockInfo.BatchNo,  
+                lineNo= result.FinalLockInfo.lineNo ,
+                SupplyCode= result.FinalLockInfo.SupplyCode ,
+                WarehouseCode = result.FinalLockInfo.WarehouseCode  ,
+                
+
             };
 
             await Db.Insertable(pickingHistory).ExecuteCommandAsync();
@@ -746,7 +756,7 @@
         {
             try
             {
-                // 1. 楠岃瘉璁㈠崟鏄庣粏鏁版嵁
+                //  楠岃瘉璁㈠崟鏄庣粏鏁版嵁
                 var currentOrderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
                     .FirstAsync(x => x.Id == context.OrderDetail.Id);
 
@@ -756,26 +766,26 @@
                 if (currentOrderDetail.PickedQty < context.PickingRecord.PickQuantity)
                     return ValidationResult<bool>.Error($"璁㈠崟鏄庣粏宸叉嫞閫夋暟閲�({currentOrderDetail.PickedQty})灏忎簬鍙栨秷鏁伴噺({context.PickingRecord.PickQuantity})");
 
-                // 2. 楠岃瘉閿佸畾淇℃伅鏁版嵁
+                //  楠岃瘉閿佸畾淇℃伅鏁版嵁
                 var currentLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                     .FirstAsync(x => x.Id == context.LockInfo.Id);
 
                 if (currentLockInfo.PickedQty < context.PickingRecord.PickQuantity)
                     return ValidationResult<bool>.Error($"閿佸畾淇℃伅宸叉嫞閫夋暟閲�({currentLockInfo.PickedQty})灏忎簬鍙栨秷鏁伴噺({context.PickingRecord.PickQuantity})");
 
-                // 3. 楠岃瘉搴撳瓨鏁版嵁
-                var currentStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
-                    .FirstAsync(x => x.Barcode == context.PickingRecord.Barcode && x.StockId == context.PickingRecord.StockId);
+                ////// 楠岃瘉搴撳瓨鏁版嵁
+                ////var currentStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+                ////    .FirstAsync(x => x.Barcode == context.PickingRecord.Barcode && x.StockId == context.PickingRecord.StockId);
 
-                if (currentStockDetail == null)
-                    return ValidationResult<bool>.Error($"鏈壘鍒板搴旂殑搴撳瓨鏄庣粏璁板綍");
+                ////if (currentStockDetail == null)
+                ////    return ValidationResult<bool>.Error($"鏈壘鍒板搴旂殑搴撳瓨鏄庣粏璁板綍");
 
-                if (currentStockDetail.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
-                    currentStockDetail.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())
-                    return ValidationResult<bool>.Error($"鏉$爜{context.PickingRecord.Barcode}宸茬粡鍥炲簱锛屾棤娉曞彇娑堝垎鎷�");
+                ////if (currentStockDetail.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+                ////    currentStockDetail.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())
+                ////    return ValidationResult<bool>.Error($"鏉$爜{context.PickingRecord.Barcode}宸茬粡鍥炲簱锛屾棤娉曞彇娑堝垎鎷�");
 
-                // 4. 楠岃瘉鐘舵�佹祦杞殑鍚堟硶鎬�
-                if (!await CanCancelPicking(currentLockInfo, currentStockDetail))
+                // 楠岃瘉鐘舵�佹祦杞殑鍚堟硶鎬�
+                if (!await CanCancelPicking(currentLockInfo, null))
                     return ValidationResult<bool>.Error($"褰撳墠鐘舵�佷笉鍏佽鍙栨秷鍒嗘嫞");
 
                 return ValidationResult<bool>.Success(true);
@@ -793,9 +803,9 @@
             if (lockInfo.Status != (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
                 return false;
 
-            // 搴撳瓨鐘舵�佹鏌�
-            if (stockDetail.Status == StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt())
-                return false;
+            ////// 搴撳瓨鐘舵�佹鏌�
+            ////if (stockDetail.Status == StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt())
+            ////    return false;
 
             // 濡傛灉鏄媶鍖呰褰曪紝杩橀渶瑕佹鏌ョ埗閿佸畾淇℃伅鐘舵��
             if (lockInfo.IsSplitted == 1 && lockInfo.ParentLockId.HasValue)
@@ -920,7 +930,7 @@
         {
             decimal cancelQty = pickingRecord.PickQuantity;
 
-            // 1. 鏁版嵁涓�鑷存�ч獙璇�
+            // 鏁版嵁涓�鑷存�ч獙璇�
             var context = new CancelPickingContext
             {
                 LockInfo = lockInfo,
@@ -934,7 +944,7 @@
             if (!validationResult.IsValid)
                 throw new Exception(validationResult.ErrorMessage);
 
-            // 2. 澶勭悊涓嶅悓绫诲瀷鐨勫彇娑�
+            // 澶勭悊涓嶅悓绫诲瀷鐨勫彇娑�
             if (lockInfo.IsSplitted == 1 && lockInfo.ParentLockId.HasValue)
             {
                 await HandleSplitBarcodeCancel(lockInfo, pickingRecord, cancelQty);
@@ -1307,6 +1317,116 @@
             await UpdateStockInfoStatus(stockInfo);
         }
 
+        /// <summary>
+        /// 瀹屽叏閲婃斁閿佸畾锛屽厑璁搁噸鏂板垎閰嶅簱瀛�
+        /// </summary>
+        private async Task ReleaseAllLocksForReallocation(string orderNo, string palletCode, PalletStatusAnalysis analysis)
+        {
+            _logger.LogInformation($"寮�濮嬮噴鏀鹃攣瀹氫互渚块噸鏂板垎閰� - 璁㈠崟: {orderNo}, 鎵樼洏: {palletCode}");
+
+            // 1. 澶勭悊鏈垎鎷g殑鍑哄簱閿佸畾璁板綍 - 瀹屽叏閲婃斁
+            if (analysis.HasRemainingLocks)
+            {
+                await ReleaseRemainingLocks(analysis.RemainingLocks);
+            }
+
+            // 2. 澶勭悊宸插洖搴撶殑閿佸畾璁板綍 - 鍒犻櫎鎴栨爣璁颁负鏃犳晥
+            await CleanupReturnedLocks(orderNo, palletCode);
+
+            // 3. 閲嶇疆璁㈠崟鏄庣粏鐨勯攣瀹氭暟閲�
+            await ResetOrderDetailLockQuantities(analysis);
+
+            _logger.LogInformation($"閿佸畾閲婃斁瀹屾垚 - 璁㈠崟: {orderNo}, 鎵樼洏: {palletCode}");
+        }
+
+        /// <summary>
+        /// 閲婃斁鏈垎鎷g殑閿佸畾璁板綍
+        /// </summary>
+        private async Task ReleaseRemainingLocks(List<Dt_OutStockLockInfo> remainingLocks)
+        {
+            var lockIds = remainingLocks.Select(x => x.Id).ToList();
+
+            // 灏嗛攣瀹氳褰曠姸鎬佹敼涓�"宸查噴鏀�"锛屾垨鑰呯洿鎺ュ垹闄�
+            //  鏍囪涓哄凡閲婃斁 
+            await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>()
+                .SetColumns(it => new Dt_OutStockLockInfo
+                {
+                    Status = (int)OutLockStockStatusEnum.宸查噴鏀�, // 闇�瑕佹柊澧炶繖涓姸鎬�
+                   // ReleaseTime = DateTime.Now,
+                    Operator = App.User.UserName
+                })
+                .Where(it => lockIds.Contains(it.Id))
+                .ExecuteCommandAsync();
+
+            //  鐩存帴鍒犻櫎锛堟洿褰诲簳锛�
+            // await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
+            //     .Where(it => lockIds.Contains(it.Id))
+            //     .ExecuteCommandAsync();
+
+            _logger.LogInformation($"閲婃斁{remainingLocks.Count}鏉℃湭鍒嗘嫞閿佸畾璁板綍");
+        }
+
+        /// <summary>
+        /// 娓呯悊宸插洖搴撶殑閿佸畾璁板綍
+        /// </summary>
+        private async Task CleanupReturnedLocks(string orderNo, string palletCode)
+        {
+            // 鏌ユ壘鎵�鏈夌姸鎬佷负鍥炲簱涓殑閿佸畾璁板綍骞堕噴鏀�
+            var returnedLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+                .Where(it => it.OrderNo == orderNo &&
+                           it.PalletCode == palletCode &&
+                           it.Status == (int)OutLockStockStatusEnum.鍥炲簱涓�)
+                .ToListAsync();
+
+            if (returnedLocks.Any())
+            {
+                var returnedLockIds = returnedLocks.Select(x => x.Id).ToList();
+
+                await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>()
+                    .SetColumns(it => new Dt_OutStockLockInfo
+                    {
+                        Status = (int)OutLockStockStatusEnum.宸查噴鏀�,
+                        //ReleaseTime = DateTime.Now,
+                        Operator = App.User.UserName
+                    })
+                    .Where(it => returnedLockIds.Contains(it.Id))
+                    .ExecuteCommandAsync();
+
+                _logger.LogInformation($"娓呯悊{returnedLocks.Count}鏉″洖搴撲腑閿佸畾璁板綍");
+            }
+        }
+
+        /// <summary>
+        /// 閲嶇疆璁㈠崟鏄庣粏鐨勯攣瀹氭暟閲�
+        /// </summary>
+        private async Task ResetOrderDetailLockQuantities(PalletStatusAnalysis analysis)
+        {
+            // 鏀堕泦鎵�鏈夊彈褰卞搷鐨勮鍗曟槑缁咺D
+            var affectedOrderDetailIds = new HashSet<int>();
+
+            if (analysis.HasRemainingLocks)
+            {
+                foreach (var lockInfo in analysis.RemainingLocks)
+                {
+                    affectedOrderDetailIds.Add(lockInfo.OrderDetailId);
+                }
+            }
+
+            // 閲嶇疆杩欎簺璁㈠崟鏄庣粏鐨勯攣瀹氭暟閲�
+            foreach (var orderDetailId in affectedOrderDetailIds)
+            {
+                await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+                    .SetColumns(it => new Dt_OutboundOrderDetail
+                    {
+                        LockQuantity = 0, // 閲嶇疆閿佸畾鏁伴噺
+                        OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt() // 閲嶇疆鐘舵�佷负鏂板缓
+                    })
+                    .Where(it => it.Id == orderDetailId)
+                    .ExecuteCommandAsync();
+            }
+
+            _logger.LogInformation($"閲嶇疆{affectedOrderDetailIds.Count}涓鍗曟槑缁嗙殑閿佸畾鏁伴噺");
+        }
         private async Task HandleRemainingLocksReturn(List<Dt_OutStockLockInfo> remainingLocks, int stockId)
         {
             var lockIds = remainingLocks.Select(x => x.Id).ToList();
@@ -1661,7 +1781,7 @@
             if (outboundOrder.OrderType == OutOrderTypeEnum.Allocate.ObjToInt())
             {
                 var allocate = _allocateService.Repository.QueryData(x => x.UpperOrderNo == outboundOrder.UpperOrderNo).First();
-                var feedmodel = new AllocateDto
+                var allocatefeedmodel = new AllocateDto
                 {
                     ReqCode = Guid.NewGuid().ToString(),
                     ReqTime = DateTime.Now.ToString(),
@@ -1703,9 +1823,9 @@
 
                   
                    }).ToList();
-                feedmodel.Details = groupedData;
+                allocatefeedmodel.Details = groupedData;
 
-                var result = await _invokeMESService.FeedbackAllocate(feedmodel);
+                var result = await _invokeMESService.FeedbackAllocate(allocatefeedmodel);
                 if (result != null && result.code == 200)
                 {                    
                     await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
@@ -2168,6 +2288,8 @@
                 FactoryArea = originalLock.FactoryArea,
                 lineNo = originalLock.lineNo,
                 WarehouseCode = originalLock.WarehouseCode,
+                BarcodeQty=originalLock.BarcodeQty,
+                BarcodeUnit=originalLock.BarcodeUnit,
 
             };
 

--
Gitblit v1.9.3