From 458dea79f2b5045620bc85134baeb87b31081e5c Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期日, 30 十一月 2025 18:14:08 +0800
Subject: [PATCH] 提交

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs |  164 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 153 insertions(+), 11 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 38f0812..0fb6e2d 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"
@@ -684,9 +684,7 @@
 
             if (newOverOutQuantity > currentOrderDetail.NeedOutQuantity)
             {
-
                 _logger.LogError($"闃茶秴鎷f鏌ュけ璐� - OrderDetailId: {orderDetailId}, 宸插嚭搴�: {newOverOutQuantity}, 闇�姹�: {currentOrderDetail.NeedOutQuantity}, 鏈鍒嗘嫞: {pickedQty}");
-
 
                 decimal adjustedQty = currentOrderDetail.NeedOutQuantity - currentOrderDetail.OverOutQuantity;
 
@@ -695,6 +693,7 @@
                     _logger.LogWarning($"鑷姩璋冩暣鍒嗘嫞鏁伴噺闃叉瓒呮嫞锛氫粠{pickedQty}璋冩暣涓簕adjustedQty}");
                     newOverOutQuantity = currentOrderDetail.NeedOutQuantity;
                     newPickedQty = currentOrderDetail.PickedQty + adjustedQty;
+                    pickedQty = adjustedQty; // 鏇存柊瀹為檯鎷i�夋暟閲�
                 }
                 else
                 {
@@ -702,15 +701,21 @@
                 }
             }
 
-            // 鏇存柊璁㈠崟鏄庣粏
+            // 鏇存柊璁㈠崟鏄庣粏鏁伴噺鍜岀姸鎬�
             await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                 .SetColumns(it => new Dt_OutboundOrderDetail
                 {
                     PickedQty = newPickedQty,
                     OverOutQuantity = newOverOutQuantity,
+                    OrderDetailStatus = newOverOutQuantity >= currentOrderDetail.NeedOutQuantity ?
+                        OrderDetailStatusEnum.Over.ObjToInt() :
+                        OrderDetailStatusEnum.Outbound.ObjToInt()
                 })
                 .Where(it => it.Id == orderDetailId)
                 .ExecuteCommandAsync();
+
+            // 鏇存柊閿佸畾鏁伴噺
+            await UpdateOrderDetailLockQuantity(orderDetailId);
 
             // 妫�鏌ュ苟鏇存柊璁㈠崟鐘舵��
             await CheckAndUpdateOrderStatus(orderNo);
@@ -1112,12 +1117,28 @@
             if (newPickedQty < 0)
                 throw new Exception($"鍙栨秷鍒嗘嫞灏嗗鑷村凡鎷i�夋暟閲�({newPickedQty})涓鸿礋鏁�");
 
+            // 纭畾鏂扮殑鐘舵��
+            int newStatus;
+            if (newOverOutQuantity >= currentOrderDetail.NeedOutQuantity)
+            {
+                newStatus = OrderDetailStatusEnum.Over.ObjToInt();
+            }
+            else if (newOverOutQuantity > 0)
+            {
+                newStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+            }
+            else
+            {
+                newStatus = OrderDetailStatusEnum.New.ObjToInt();
+            }
+
             // 鏇存柊璁㈠崟鏄庣粏
             var updateResult = await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                 .SetColumns(it => new Dt_OutboundOrderDetail
                 {
                     PickedQty = newPickedQty,
-                    OverOutQuantity = newOverOutQuantity
+                    OverOutQuantity = newOverOutQuantity,
+                    OrderDetailStatus = newStatus
                 })
                 .Where(it => it.Id == orderDetailId)
                 .ExecuteCommandAsync();
@@ -1125,9 +1146,13 @@
             if (updateResult <= 0)
                 throw new Exception("鏇存柊璁㈠崟鏄庣粏澶辫触");
 
+            // 鏇存柊閿佸畾鏁伴噺
+            await UpdateOrderDetailLockQuantity(orderDetailId);
+
             _logger.LogInformation($"鏇存柊璁㈠崟鏄庣粏 - OrderDetailId: {orderDetailId}, " +
                                   $"鎵e噺宸插嚭搴�: {cancelQty}, 鏂板凡鍑哄簱: {newOverOutQuantity}, " +
-                                  $"鎵e噺宸叉嫞閫�: {cancelQty}, 鏂板凡鎷i��: {newPickedQty}");
+                                  $"鎵e噺宸叉嫞閫�: {cancelQty}, 鏂板凡鎷i��: {newPickedQty}, " +
+                                  $"鏂扮姸鎬�: {newStatus}");
         }
         #endregion
 
@@ -1464,6 +1489,7 @@
 
                 if (stockDetail != null)
                 {
+                    stockDetail.StockQuantity += returnQty;
                     // 鎭㈠搴撳瓨鐘舵��
                     stockDetail.OutboundQuantity = Math.Max(0, stockDetail.OutboundQuantity - returnQty);
                     stockDetail.Status = StockStatusEmun.鍏ュ簱纭.ObjToInt();
@@ -1471,6 +1497,7 @@
                 }
                 else
                 {
+                    _logger.LogWarning($"鏈壘鍒板搴旂殑搴撳瓨鏄庣粏 - 鏉$爜: {lockInfo.CurrentBarcode}, 搴撳瓨ID: {lockInfo.StockId}");
                     // 鍒涘缓鏂扮殑搴撳瓨璁板綍
                     //var newStockDetail = new Dt_StockInfoDetail
                     //{
@@ -1490,7 +1517,34 @@
                     //};
                     //await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
                 }
+                try
+                {
+                    var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+                        .FirstAsync(x => x.Id == lockInfo.OrderDetailId);
+
+                    if (orderDetail != null)
+                    {
+                        decimal newLockQuantity = Math.Max(0, orderDetail.LockQuantity - returnQty);
+
+                        await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+                            .SetColumns(it => new Dt_OutboundOrderDetail
+                            {
+                                LockQuantity = newLockQuantity
+                            })
+                            .Where(it => it.Id == lockInfo.OrderDetailId)
+                            .ExecuteCommandAsync();
+
+                        _logger.LogInformation($"鏇存柊璁㈠崟鏄庣粏閿佸畾鏁伴噺 - OrderDetailId: {lockInfo.OrderDetailId}, " +
+                                             $"鎵e噺閿佸畾: {returnQty}, 鏂伴攣瀹氭暟閲�: {newLockQuantity}");
+                    }
+                }
+                catch (Exception ex)
+                {
+                    _logger.LogError($"鏇存柊璁㈠崟鏄庣粏閿佸畾鏁伴噺澶辫触 - OrderDetailId: {lockInfo.OrderDetailId}, Error: {ex.Message}");
+                }
             }
+
+
         }
 
         private async Task UpdateOrderDetailsOnReturn(List<Dt_OutStockLockInfo> remainingLocks)
@@ -1692,13 +1746,25 @@
                     .ToListAsync();
 
                 bool allCompleted = true;
+                bool hasPartial = false;
+                bool hasLocked = false;
+
                 foreach (var detail in orderDetails)
                 {
                     if (detail.OverOutQuantity < detail.NeedOutQuantity)
                     {
                         allCompleted = false;
-                        break;
                     }
+
+                    if (detail.OrderDetailStatus == OrderDetailStatusEnum.Outbound.ObjToInt())
+                    {
+                        hasPartial = true;
+                    }
+
+                    //if (detail.OrderDetailStatus == OrderDetailStatusEnum.Locked.ObjToInt())
+                    //{
+                    //    hasLocked = true;
+                    //}
                 }
 
                 var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
@@ -1706,7 +1772,19 @@
 
                 if (outboundOrder == null) return;
 
-                int newStatus = allCompleted ? (int)OutOrderStatusEnum.鍑哄簱瀹屾垚 : (int)OutOrderStatusEnum.鍑哄簱涓�;
+                int newStatus;
+                if (allCompleted)
+                {
+                    newStatus = (int)OutOrderStatusEnum.鍑哄簱瀹屾垚;
+                }
+                else if (hasPartial )
+                {
+                    newStatus = (int)OutOrderStatusEnum.鍑哄簱涓�;
+                }
+                else
+                {
+                    newStatus = (int)OutOrderStatusEnum.鏈紑濮�;
+                }
 
                 if (outboundOrder.OrderStatus != newStatus)
                 {
@@ -1719,11 +1797,13 @@
                         .Where(x => x.OrderNo == orderNo)
                         .ExecuteCommandAsync();
 
+                    _logger.LogInformation($"璁㈠崟鐘舵�佹洿鏂� - OrderNo: {orderNo}, 鏃х姸鎬�: {outboundOrder.OrderStatus}, 鏂扮姸鎬�: {newStatus}");
+
                     // 鍙湁姝e父鍒嗘嫞瀹屾垚鏃舵墠鍚慚ES鍙嶉
-                    //if (allCompleted && newStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
-                    //{
-                    //    await HandleOrderCompletion(outboundOrder, orderNo);
-                    //}
+                    if (allCompleted && newStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
+                    {
+                        await HandleOrderCompletion(outboundOrder, orderNo);
+                    }
                 }
             }
             catch (Exception ex)
@@ -1732,8 +1812,70 @@
             }
         }
 
+        /// <summary>
+        /// 鏇存柊璁㈠崟鏄庣粏鐘舵�侊紙鍩轰簬宸插嚭搴撴暟閲忥級
+        /// </summary>
+        private async Task UpdateOrderDetailStatus(int orderDetailId)
+        {
+            var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+                .FirstAsync(x => x.Id == orderDetailId);
 
+            if (orderDetail == null) return;
 
+            int newStatus = orderDetail.OrderDetailStatus;
+
+            if (orderDetail.OverOutQuantity >= orderDetail.NeedOutQuantity)
+            {
+                // 宸插嚭搴撴暟閲� >= 闇�姹傛暟閲忥紝鏍囪涓哄畬鎴�
+                newStatus = OrderDetailStatusEnum.Over.ObjToInt();
+            }
+            else if (orderDetail.OverOutQuantity > 0)
+            {
+                // 鏈夐儴鍒嗗嚭搴擄紝浣嗘湭瀹屾垚
+                newStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+            }
+            else if (orderDetail.LockQuantity > 0)
+            {
+                // 鏈夐攣瀹氭暟閲忥紝浣嗘湭鍑哄簱
+                //newStatus = OrderDetailStatusEnum.Locked.ObjToInt();
+            }
+            else
+            {
+                // 鏂板缓鐘舵��
+                newStatus = OrderDetailStatusEnum.New.ObjToInt();
+            }
+
+            // 鍙湁鐘舵�佸彂鐢熷彉鍖栨椂鎵嶆洿鏂�
+            if (orderDetail.OrderDetailStatus != newStatus)
+            {
+                await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+                    .SetColumns(it => new Dt_OutboundOrderDetail
+                    {
+                        OrderDetailStatus = newStatus,
+                         
+                    })
+                    .Where(it => it.Id == orderDetailId)
+                    .ExecuteCommandAsync();
+            }
+        }
+        /// <summary>
+        /// 鏇存柊璁㈠崟鏄庣粏閿佸畾鏁伴噺
+        /// </summary>
+        private async Task UpdateOrderDetailLockQuantity(int orderDetailId)
+        {
+            var totalLockedQty = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+                .Where(x => x.OrderDetailId == orderDetailId &&
+                           x.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+                .SumAsync(x => x.AssignQuantity - x.PickedQty);
+
+            await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+                .SetColumns(it => new Dt_OutboundOrderDetail
+                {
+                    LockQuantity = totalLockedQty
+                })
+                .Where(it => it.Id == orderDetailId)
+                .ExecuteCommandAsync();
+        }
         private async Task UpdateOrderStatusForReturn(string orderNo)
         {
             try

--
Gitblit v1.9.3