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/OutboundBatchPickingService.cs |  258 +++++++++++++++++++++++++++------------------------
 1 files changed, 137 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/OutboundBatchPickingService.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/OutboundBatchPickingService.cs"
index bbd2251..c7b468a 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/OutboundBatchPickingService.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/OutboundBatchPickingService.cs"
@@ -242,6 +242,8 @@
 
         #region 鍙栬蛋绌虹閫昏緫
 
+        
+
         /// <summary>
         /// 鍙栬蛋绌虹 - 娓呯悊宸插畬鎴愭嫞閫夌殑鎵樼洏鏁版嵁
         /// </summary>
@@ -251,7 +253,7 @@
             {
                 _unitOfWorkManage.BeginTran();
 
-                //  楠岃瘉鎵樼洏鏄惁鍙互鍙栬蛋锛堝繀椤诲叏閮ㄥ畬鎴愭嫞閫夛級
+                // 楠岃瘉鎵樼洏鏄惁鍙互鍙栬蛋锛堝繀椤诲叏閮ㄥ畬鎴愭嫞閫夛級
                 var validationResult = await ValidateEmptyPalletRemoval(orderNo, palletCode);
                 if (!validationResult.IsValid)
                     return WebResponseContent.Instance.Error(validationResult.ErrorMessage);
@@ -264,8 +266,8 @@
                 // 鏇存柊鐩稿叧璁㈠崟鐘舵��
                 await UpdateOrderStatusAfterPalletRemoval(orderNo);
 
-                //  璁板綍鎿嶄綔鍘嗗彶
-                // await RecordEmptyPalletRemoval(orderNo, palletCode, completedLocks);
+                // 璁板綍鎿嶄綔鍘嗗彶
+                await RecordEmptyPalletRemoval(orderNo, palletCode, completedLocks);
 
                 _unitOfWorkManage.CommitTran();
 
@@ -322,13 +324,12 @@
         {
             foreach (var lockInfo in completedLocks)
             {
-                // 鏍囪閿佸畾璁板綍涓哄凡鍙栬蛋锛堝彲浠ユ柊澧炵姸鎬佹垨鐩存帴鍒犻櫎锛屾牴鎹笟鍔¢渶姹傦級
-                // 杩欓噷鎴戜滑灏嗗叾鐘舵�佹洿鏂颁负"宸插彇璧�"锛屽苟璁板綍鍙栬蛋鏃堕棿
+                // 鏍囪閿佸畾璁板綍涓哄凡鍙栬蛋
                 lockInfo.Status = (int)OutLockStockStatusEnum.宸插彇璧�;
                 lockInfo.Operator = App.User.UserName;
                 await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
 
-                // 鍚屾椂娓呯悊瀵瑰簲鐨勫簱瀛樿褰曠姸鎬�
+                // 娓呯悊瀵瑰簲鐨勫簱瀛樿褰曠姸鎬�
                 await CleanupStockInfo(lockInfo);
             }
         }
@@ -341,16 +342,13 @@
             var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
                 .FirstAsync(x => x.Barcode == lockInfo.CurrentBarcode && x.StockId == lockInfo.StockId);
 
-            if (stockDetail != null)
+            if (stockDetail != null && stockDetail.Status == (int)StockStatusEmun.鍑哄簱瀹屾垚)
             {
-                // 濡傛灉搴撳瓨宸茬粡鍑哄簱瀹屾垚锛屾爣璁颁负宸叉竻鐞�
-                if (stockDetail.Status == (int)StockStatusEmun.鍑哄簱瀹屾垚)
-                {
-                    stockDetail.Status = (int)StockStatusEmun.宸叉竻鐞�;
-                    await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-                }
+                stockDetail.Status = (int)StockStatusEmun.宸叉竻鐞�;
+                await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
             }
         }
+ 
 
         /// <summary>
         /// 鏇存柊璁㈠崟鐘舵��
@@ -401,21 +399,7 @@
 
         #endregion
 
-        #region 杈呭姪鏂规硶
-
-        private string GetPalletStatusText(PalletStatusEnum status)
-        {
-            return status switch
-            {
-                PalletStatusEnum.鏈紑濮� => "鏈紑濮�",
-                PalletStatusEnum.鎷i�変腑 => "鎷i�変腑",
-                PalletStatusEnum.宸插畬鎴� => "宸插畬鎴�",
-                PalletStatusEnum.鏃犱换鍔� => "鏃犱换鍔�",
-                _ => "鏈煡"
-            };
-        }
-
-        #endregion
+  
         #region 鍒嗘壒鍒嗘嫞
 
         /// <summary>
@@ -484,10 +468,10 @@
                     return WebResponseContent.Instance.Error("鏈壘鍒板垎鎷h褰�");
 
                 // 鎭㈠閿佸畾淇℃伅鍜屽簱瀛�
-                await RevertPickingData(pickingRecord);
+                var revertResult = await RevertPickingData(pickingRecord);
 
-                //鏇存柊鎵规鍜岃鍗曟暟鎹�
-                await RevertBatchAndOrderData(pickingRecord);
+                // 鏇存柊鎵规鍜岃鍗曟暟鎹�
+                await RevertBatchAndOrderData(pickingRecord, revertResult);
 
                 // 鏍囪鍒嗘嫞璁板綍涓哄凡鍙栨秷
                 pickingRecord.IsCancelled = true;
@@ -506,7 +490,6 @@
                 return WebResponseContent.Instance.Error($"鍙栨秷鍒嗘嫞澶辫触锛歿ex.Message}");
             }
         }
-
         #endregion
 
         #region 鎵嬪姩鎷嗗寘
@@ -549,12 +532,12 @@
 
         #endregion
 
-        #region 鍙栨秷鎷嗗寘
+ 
 
-        #region 鍙栨秷鎷嗗寘 - 淇鐗堟湰
+        #region 鍙栨秷鎷嗗寘 
 
         /// <summary>
-        /// 鍙栨秷鎷嗗寘 - 鏀寔澶氭鎷嗗寘鐨勬儏鍐�
+        /// 鍙栨秷鎷嗗寘 
         /// </summary>
         public async Task<WebResponseContent> CancelSplitPackage(string orderNo, string palletCode, string newBarcode)
         {
@@ -599,7 +582,7 @@
         }
 
         /// <summary>
-        /// 鎵ц鍙栨秷鎷嗗寘閫昏緫 - 淇鐗堟湰
+        /// 鎵ц鍙栨秷鎷嗗寘閫昏緫 
         /// </summary>
         private async Task ExecuteCancelSplitLogic(Dt_SplitPackageRecord splitRecord,
             Dt_OutStockLockInfo originalLockInfo, Dt_OutStockLockInfo newLockInfo,
@@ -618,7 +601,7 @@
 
             await _outStockLockInfoService.Db.Updateable(originalLockInfo).ExecuteCommandAsync();
 
-            // 2. 鎭㈠鍘熷簱瀛樻槑缁�
+            // 鎭㈠鍘熷簱瀛樻槑缁�
             var originalStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
                 .FirstAsync(x => x.Barcode == splitRecord.OriginalBarcode && x.StockId == splitRecord.StockId);
 
@@ -632,29 +615,29 @@
 
             await _stockInfoDetailService.Db.Updateable(originalStock).ExecuteCommandAsync();
 
-            // 3. 鍒犻櫎鏂伴攣瀹氫俊鎭�
+            // 鍒犻櫎鏂伴攣瀹氫俊鎭�
             await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
                 .Where(x => x.Id == newLockInfo.Id)
                 .ExecuteCommandAsync();
 
-            // 4. 鍒犻櫎鏂板簱瀛樻槑缁�
+            // 鍒犻櫎鏂板簱瀛樻槑缁�
             await _stockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
                 .Where(x => x.Barcode == newLockInfo.CurrentBarcode)
                 .ExecuteCommandAsync();
 
-            // 5. 鏍囪鎷嗗寘璁板綍涓哄凡鎾ら攢
+            //鏍囪鎷嗗寘璁板綍涓哄凡鎾ら攢
             splitRecord.IsReverted = true;
             splitRecord.RevertTime = DateTime.Now;
             splitRecord.RevertOperator = App.User.UserName;
             await _splitPackageService.Db.Updateable(splitRecord).ExecuteCommandAsync();
 
-            // 6. 妫�鏌ュ苟鏇存柊鎵规鍜岃鍗曠姸鎬�
+            // 妫�鏌ュ苟鏇存柊鎵规鍜岃鍗曠姸鎬�
             await CheckAndUpdateBatchStatus(originalLockInfo.BatchNo);
             await CheckAndUpdateOrderStatus(originalLockInfo.OrderNo);
         }
 
         /// <summary>
-        /// 楠岃瘉鍙栨秷鎷嗗寘璇锋眰 - 澧炲己鐗堟湰
+        /// 楠岃瘉鍙栨秷鎷嗗寘璇锋眰 
         /// </summary>
         private async Task<ValidationResult<(Dt_SplitPackageRecord, Dt_OutStockLockInfo, Dt_StockInfoDetail)>> ValidateCancelSplitRequest(
             string orderNo, string palletCode, string newBarcode)
@@ -916,32 +899,8 @@
 
         #endregion
 
-        #region DTO绫�
 
-      
 
-        public class SplitPackageChainInfoDto
-        {
-            public string OriginalBarcode { get; set; }
-            public string RootBarcode { get; set; } // 鏂板锛氭牴鏉$爜
-            public int TotalSplitTimes { get; set; }
-            public string ChainType { get; set; } // "root" 鎴� "branch"
-            public List<SplitChainItemDto> SplitChain { get; set; }
-        }
-
-        public class SplitChainItemDto
-        {
-            public DateTime SplitTime { get; set; }
-            public string OriginalBarcode { get; set; }
-            public string NewBarcode { get; set; }
-            public decimal SplitQuantity { get; set; }
-            public string Operator { get; set; }
-            public bool IsReverted { get; set; }
-        }
-
-        #endregion
-
-        #endregion
 
         #region 鍒嗘壒鍥炲簱
 
@@ -954,7 +913,7 @@
             {
                 _unitOfWorkManage.BeginTran();
 
-                //  鏌ユ壘鎵樼洏涓婃湭瀹屾垚鐨勯攣瀹氳褰�
+                // 鏌ユ壘鎵樼洏涓婃湭瀹屾垚鐨勯攣瀹氳褰曪紙鍙鐞嗗嚭搴撲腑鐨勮褰曪級
                 var unfinishedLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                     .Where(x => x.OrderNo == orderNo &&
                                x.PalletCode == palletCode &&
@@ -964,12 +923,12 @@
                 if (!unfinishedLocks.Any())
                     return WebResponseContent.Instance.Error("璇ユ墭鐩樻病鏈夋湭瀹屾垚鐨勯攣瀹氳褰�");
 
-                // 鎸夋壒娆″垎缁勫鐞�
-                var batchGroups = unfinishedLocks.GroupBy(x => x.BatchNo);
+                // 鎸夊嚭搴撴壒娆″垎缁勫鐞�
+                var batchGroups = unfinishedLocks.GroupBy(x => x.OutboundBatchNo); // 浣跨敤 OutboundBatchNo
 
                 foreach (var batchGroup in batchGroups)
                 {
-                    var batchNo = batchGroup.Key;
+                    var outboundBatchNo = batchGroup.Key;
                     var batchLocks = batchGroup.ToList();
 
                     // 閲婃斁搴撳瓨鍜岄攣瀹氳褰�
@@ -979,7 +938,7 @@
                     }
 
                     // 鏇存柊鎵规鐘舵��
-                    await UpdateBatchStatusForReturn(batchNo, batchLocks);
+                    await UpdateBatchStatusForReturn(outboundBatchNo, batchLocks);
 
                     // 鏇存柊璁㈠崟鏄庣粏鐨勫凡鍒嗛厤鏁伴噺
                     await UpdateOrderDetailAfterReturn(batchLocks);
@@ -996,12 +955,11 @@
                 return WebResponseContent.Instance.Error($"鍒嗘壒鍥炲簱澶辫触锛歿ex.Message}");
             }
         }
-
         #endregion
 
         #region 楠岃瘉鏂规硶
         private async Task<ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail, Dt_OutboundBatch)>> ValidatePickingRequest(
-    string orderNo, string palletCode, string barcode)
+       string orderNo, string palletCode, string barcode)
         {
             // 鏌ユ壘閿佸畾淇℃伅
             var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
@@ -1030,12 +988,12 @@
                 return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail, Dt_OutboundBatch)>.Error(
                     $"搴撳瓨鏁伴噺涓嶈冻锛岄渶瑕侊細{lockInfo.AssignQuantity}锛屽疄闄咃細{stockDetail.StockQuantity}");
 
+            // 浣跨敤 OutboundBatchNo 鏌ユ壘鎵规
             var batch = await _outboundBatchRepository.Db.Queryable<Dt_OutboundBatch>()
-                .FirstAsync(x => x.BatchNo == lockInfo.OutboundBatchNo);
+                .FirstAsync(x => x.BatchNo == lockInfo.OutboundBatchNo); // 淇涓� OutboundBatchNo
 
             return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail, Dt_OutboundBatch)>.Success((lockInfo, orderDetail, stockDetail, batch));
         }
-
         private async Task<ValidationResult<(Dt_OutStockLockInfo, Dt_StockInfoDetail)>> ValidateSplitRequest(
             string orderNo, string palletCode, string originalBarcode, decimal splitQuantity)
         {
@@ -1101,7 +1059,17 @@
                 .FirstAsync(x => x.Id == pickingRecord.OutStockLockId);
 
             lockInfo.PickedQty -= pickingRecord.PickQuantity;
-            lockInfo.Status = (int)OutLockStockStatusEnum.鍑哄簱涓�;
+
+            // 鏍规嵁鎷i�夋暟閲忓垽鏂姸鎬�
+            if (lockInfo.PickedQty <= 0)
+            {
+                lockInfo.Status = (int)OutLockStockStatusEnum.鍑哄簱涓�;
+            }
+            else if (lockInfo.PickedQty < lockInfo.AssignQuantity)
+            {
+                lockInfo.Status = (int)OutLockStockStatusEnum.鍑哄簱涓�;
+            }
+
             await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
 
             // 鎭㈠搴撳瓨
@@ -1110,7 +1078,13 @@
 
             stockDetail.StockQuantity += pickingRecord.PickQuantity;
             stockDetail.OutboundQuantity -= pickingRecord.PickQuantity;
-            stockDetail.Status = (int)StockStatusEmun.鍑哄簱閿佸畾;
+
+            // 鎭㈠搴撳瓨鐘舵��
+            if (stockDetail.StockQuantity > 0)
+            {
+                stockDetail.Status = (int)StockStatusEmun.鍑哄簱閿佸畾;
+            }
+
             await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
 
             return new RevertPickingResult
@@ -1119,9 +1093,8 @@
                 StockDetail = stockDetail
             };
         }
-
         private async Task<SplitResultDto> ExecuteSplitLogic(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
-            decimal splitQuantity, string palletCode)
+     decimal splitQuantity, string palletCode)
         {
             // 鐢熸垚鏂版潯鐮�
             string newBarcode = await GenerateNewBarcode();
@@ -1132,19 +1105,17 @@
                 StockId = stockDetail.StockId,
                 MaterielCode = stockDetail.MaterielCode,
                 OrderNo = stockDetail.OrderNo,
-                BatchNo = stockDetail.BatchNo,
+                BatchNo = stockDetail.BatchNo, // 鐗╂枡鎵规
                 StockQuantity = splitQuantity,
                 OutboundQuantity = 0,
                 Barcode = newBarcode,
                 Status = (int)StockStatusEmun.鍑哄簱閿佸畾,
                 SupplyCode = stockDetail.SupplyCode,
                 Unit = stockDetail.Unit,
-                BarcodeQty=stockDetail.BarcodeQty,
-                BarcodeUnit=stockDetail.BarcodeUnit,
-                BusinessType=stockDetail.BusinessType,
-                InboundOrderRowNo=stockDetail.InboundOrderRowNo,
-                
-               
+                BarcodeQty = stockDetail.BarcodeQty,
+                BarcodeUnit = stockDetail.BarcodeUnit,
+                BusinessType = stockDetail.BusinessType,
+                InboundOrderRowNo = stockDetail.InboundOrderRowNo,
             };
             await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
 
@@ -1152,17 +1123,16 @@
             stockDetail.StockQuantity -= splitQuantity;
             await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
 
-           
+            // 鍒涘缓鏂伴攣瀹氫俊鎭� - 浣跨敤姝g‘鐨� OutboundBatchNo
             var newLockInfo = new Dt_OutStockLockInfo
             {
                 OrderNo = lockInfo.OrderNo,
                 OrderDetailId = lockInfo.OrderDetailId,
-                BatchNo = lockInfo.BatchNo,
+                OutboundBatchNo = lockInfo.OutboundBatchNo, // 浣跨敤 OutboundBatchNo
                 MaterielCode = lockInfo.MaterielCode,
                 MaterielName = lockInfo.MaterielName,
                 StockId = lockInfo.StockId,
                 OrderQuantity = splitQuantity,
-                //OriginalQuantity = quantity,
                 AssignQuantity = splitQuantity,
                 PickedQty = 0,
                 LocationCode = lockInfo.LocationCode,
@@ -1173,7 +1143,6 @@
                 SupplyCode = lockInfo.SupplyCode,
                 OrderType = lockInfo.OrderType,
                 CurrentBarcode = newBarcode,
-               // OriginalLockQuantity = quantity,
                 IsSplitted = 1,
                 ParentLockId = lockInfo.Id,
                 Operator = App.User.UserName,
@@ -1182,7 +1151,6 @@
                 WarehouseCode = lockInfo.WarehouseCode,
                 BarcodeQty = lockInfo.BarcodeQty,
                 BarcodeUnit = lockInfo.BarcodeUnit,
-               
             };
 
             await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync();
@@ -1197,7 +1165,6 @@
 
             return new SplitResultDto { NewBarcode = newBarcode };
         }
-
         private async Task ExecuteCancelSplitLogic(Dt_SplitPackageRecord splitRecord, Dt_OutStockLockInfo newLockInfo, Dt_StockInfoDetail newStockDetail)
         {
             // 鎭㈠鍘熷簱瀛�
@@ -1255,15 +1222,28 @@
             await CheckAndUpdateOrderStatus(orderNo);
         }
 
-        private async Task RevertBatchAndOrderData(Dt_PickingRecord pickingRecord)
+        private async Task RevertBatchAndOrderData(Dt_PickingRecord pickingRecord, RevertPickingResult revertResult)
         {
             // 鎭㈠鎵规瀹屾垚鏁伴噺
             var batch = await _outboundBatchRepository.Db.Queryable<Dt_OutboundBatch>()
-                .FirstAsync(x => x.BatchNo == pickingRecord.BatchNo);
+                .FirstAsync(x => x.BatchNo == revertResult.LockInfo.OutboundBatchNo); // 浣跨敤 OutboundBatchNo
 
-            batch.CompletedQuantity -= pickingRecord.PickQuantity;
-            batch.BatchStatus = (int)BatchStatusEnum.鎵ц涓�;
-            await _outboundBatchRepository.Db.Updateable(batch).ExecuteCommandAsync();
+            if (batch != null)
+            {
+                batch.CompletedQuantity -= pickingRecord.PickQuantity;
+
+                // 閲嶆柊璁$畻鎵规鐘舵��
+                if (batch.CompletedQuantity <= 0)
+                {
+                    batch.BatchStatus = (int)BatchStatusEnum.鍒嗛厤涓�;
+                }
+                else if (batch.CompletedQuantity < batch.BatchQuantity)
+                {
+                    batch.BatchStatus = (int)BatchStatusEnum.鎵ц涓�;
+                }
+
+                await _outboundBatchRepository.Db.Updateable(batch).ExecuteCommandAsync();
+            }
 
             // 鎭㈠璁㈠崟鏄庣粏
             var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
@@ -1276,46 +1256,61 @@
             // 閲嶆柊妫�鏌ヨ鍗曠姸鎬�
             await CheckAndUpdateOrderStatus(pickingRecord.OrderNo);
         }
-
         private async Task ReleaseLockAndStock(Dt_OutStockLockInfo lockInfo)
         {
-            // 鎭㈠搴撳瓨鐘舵��
+            // 鎭㈠搴撳瓨鐘舵�� - 鍥炲簱鍚庡簱瀛樺彉涓哄彲鐢ㄧ姸鎬�
             var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
                 .FirstAsync(x => x.Barcode == lockInfo.CurrentBarcode && x.StockId == lockInfo.StockId);
 
             if (stockDetail != null)
             {
+                // 鍥炲簱鍚庡簱瀛樼姸鎬佹仮澶嶄负鍏ュ簱瀹屾垚锛堝彲鐢ㄧ姸鎬侊級
                 stockDetail.Status = (int)StockStatusEmun.鍏ュ簱瀹屾垚;
                 await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
             }
 
-            // 鏇存柊閿佸畾璁板綍鐘舵�佷负鍥炲簱
+            // 鏇存柊閿佸畾璁板綍鐘舵�佷负宸插洖搴�
             lockInfo.Status = (int)OutLockStockStatusEnum.宸插洖搴�;
+            lockInfo.Operator = App.User.UserName;
             await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
         }
 
-        private async Task UpdateBatchStatusForReturn(string batchNo, List<Dt_OutStockLockInfo> returnedLocks)
+        /// <summary>
+        /// 鏇存柊鎵规鐘舵�侊紙鍥炲簱锛� 
+        /// </summary>
+        private async Task UpdateBatchStatusForReturn(string outboundBatchNo, List<Dt_OutStockLockInfo> returnedLocks)
         {
             var batch = await _outboundBatchRepository.Db.Queryable<Dt_OutboundBatch>()
-                .FirstAsync(x => x.BatchNo == batchNo);
+                .FirstAsync(x => x.BatchNo == outboundBatchNo);
 
-            // 璁$畻鍥炲簱鏁伴噺
-            var returnedQty = returnedLocks.Sum(x => x.AssignQuantity - x.PickedQty);
-            batch.CompletedQuantity -= returnedQty;
-
-            if (batch.CompletedQuantity <= 0)
+            if (batch != null)
             {
-                batch.BatchStatus = (int)BatchStatusEnum.宸插洖搴�;
-            }
-            else
-            {
-                batch.BatchStatus = (int)BatchStatusEnum.鎵ц涓�;
-            }
+                // 璁$畻鍥炲簱鏁伴噺锛堟湭鎷i�夌殑閮ㄥ垎锛�
+                var returnedQty = returnedLocks.Sum(x => x.AssignQuantity - x.PickedQty);
+                batch.CompletedQuantity -= returnedQty;
 
-            batch.Operator = App.User.UserName;
-            await _outboundBatchRepository.Db.Updateable(batch).ExecuteCommandAsync();
+                // 鏇存柊鎵规鐘舵��
+                if (batch.CompletedQuantity <= 0)
+                {
+                    batch.BatchStatus = (int)BatchStatusEnum.宸插洖搴�;
+                }
+                else if (batch.CompletedQuantity < batch.BatchQuantity)
+                {
+                    batch.BatchStatus = (int)BatchStatusEnum.鎵ц涓�;
+                }
+                else
+                {
+                    batch.BatchStatus = (int)BatchStatusEnum.宸插畬鎴�;
+                }
+
+                batch.Operator = App.User.UserName;
+                await _outboundBatchRepository.Db.Updateable(batch).ExecuteCommandAsync();
+            }
         }
 
+        /// <summary>
+        /// 鏇存柊璁㈠崟鏄庣粏锛堝洖搴撳悗锛� 
+        /// </summary>
         private async Task UpdateOrderDetailAfterReturn(List<Dt_OutStockLockInfo> returnedLocks)
         {
             var orderDetailGroups = returnedLocks.GroupBy(x => x.OrderDetailId);
@@ -1325,13 +1320,16 @@
                 var orderDetailId = group.Key;
                 var returnedQty = group.Sum(x => x.AssignQuantity - x.PickedQty);
 
-                await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
-                    .SetColumns(x => x.AllocatedQuantity == x.AllocatedQuantity - returnedQty)
-                    .Where(x => x.Id == orderDetailId)
-                    .ExecuteCommandAsync();
+                var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+                    .FirstAsync(x => x.Id == orderDetailId);
+
+                if (orderDetail != null)
+                {
+                    orderDetail.AllocatedQuantity -= returnedQty;
+                    await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+                }
             }
         }
-
         #endregion
 
         #region 杈呭姪鏂规硶
@@ -1374,6 +1372,13 @@
                 PickTime = DateTime.Now,
                 Operator = App.User.UserName,
                 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,
                 //  IsCancelled = false
             };
 
@@ -1397,8 +1402,19 @@
                 .Where(x => x.OrderNo == orderNo)
                 .ExecuteCommandAsync();
         }
-
+        private string GetPalletStatusText(PalletStatusEnum status)
+        {
+            return status switch
+            {
+                PalletStatusEnum.鏈紑濮� => "鏈紑濮�",
+                PalletStatusEnum.鎷i�変腑 => "鎷i�変腑",
+                PalletStatusEnum.宸插畬鎴� => "宸插畬鎴�",
+                PalletStatusEnum.鏃犱换鍔� => "鏃犱换鍔�",
+                _ => "鏈煡"
+            };
+        }
         #endregion
+ 
 
         #region DTO绫�
 

--
Gitblit v1.9.3