pan
2025-11-24 44e934d78d8906424b09c86e627a4974b93a1455
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs
@@ -187,10 +187,10 @@
                    return WebResponseContent.Instance.Error(overPickingValidation.ErrorMessage);
                }
                //  æ‰§è¡Œåˆ†æ‹£é€»è¾‘
                // æ‰§è¡Œåˆ†æ‹£é€»è¾‘(只处理库存和锁定,不处理订单)
                var pickingResult = await ExecutePickingLogic(lockInfo, orderDetail, stockDetail, orderNo, palletCode, barcode, actualQty);
                // æ›´æ–°ç›¸å…³æ•°æ®
                // ç»Ÿä¸€æ›´æ–°è®¢å•数据(所有分支都在这里更新)
                await UpdateOrderRelatedData(orderDetail.Id, pickingResult.ActualPickedQty, orderNo);
                // è®°å½•操作历史
@@ -207,6 +207,7 @@
                return WebResponseContent.Instance.Error($"拣选确认失败:{ex.Message}");
            }
        }
        /// <summary>
        /// å–消拣选
        /// </summary>
@@ -552,8 +553,8 @@
        private async Task<PickingResult> ExecutePickingLogic(
    Dt_OutStockLockInfo lockInfo, Dt_OutboundOrderDetail orderDetail, Dt_StockInfoDetail stockDetail,
    string orderNo, string palletCode, string barcode, decimal actualQty)
         Dt_OutStockLockInfo lockInfo, Dt_OutboundOrderDetail orderDetail, Dt_StockInfoDetail stockDetail,
         string orderNo, string palletCode, string barcode, decimal actualQty)
        {
            decimal stockQuantity = stockDetail.StockQuantity;
            var result = new PickingResult
@@ -564,35 +565,29 @@
                ActualPickedQty = actualQty
            };
            decimal finalPickedQty = actualQty;
            if (actualQty < stockQuantity)
            {
                // æ‹†åŒ…场景
                await HandleSplitPacking(lockInfo, stockDetail, actualQty, stockQuantity, result);
                finalPickedQty = actualQty;
                // æ‹†åŒ…场景返回实际拣选数量
                result.ActualPickedQty = actualQty;
            }
            else if (actualQty == stockQuantity)
            {
                // æ•´åŒ…拣选
                await HandleFullPicking(lockInfo, stockDetail, actualQty, result);
                finalPickedQty = actualQty;
                // æ•´åŒ…拣选返回实际拣选数量
                result.ActualPickedQty = actualQty;
            }
            else
            {
                // éƒ¨åˆ†æ‹£é€‰ï¼ˆåº“存不足)
                await HandlePartialPicking(lockInfo, stockDetail, actualQty, stockQuantity, result);
                finalPickedQty = result.ActualPickedQty; // å¯èƒ½è¢«è°ƒæ•´
                // éƒ¨åˆ†æ‹£é€‰è¿”回调整后的数量
                result.ActualPickedQty = result.ActualPickedQty; // å·²ç»åœ¨æ–¹æ³•内调整
            }
            // ç»Ÿä¸€æ›´æ–°è®¢å•数据(所有分支都从这里更新)
            await UpdateOrderRelatedData(lockInfo.OrderDetailId, finalPickedQty, orderNo);
            return result;
        }
        private async Task HandleSplitPacking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
            decimal actualQty, decimal stockQuantity, PickingResult result)
       decimal actualQty, decimal stockQuantity, PickingResult result)
        {
            decimal remainingStockQty = stockQuantity - actualQty;
@@ -601,10 +596,10 @@
            stockDetail.OutboundQuantity = remainingStockQty;
            await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
            //生成新条码
            // ç”Ÿæˆæ–°æ¡ç 
            string newBarcode = await GenerateNewBarcode();
            //创建新锁定信息
            // åˆ›å»ºæ–°é”å®šä¿¡æ¯
            var newLockInfo = await CreateSplitLockInfo(lockInfo, actualQty, newBarcode);
            // è®°å½•拆包历史
@@ -621,10 +616,10 @@
            result.FinalBarcode = newBarcode;
            result.SplitResults.AddRange(CreateSplitResults(lockInfo, actualQty, remainingStockQty, newBarcode, stockDetail.Barcode));
            _logger.LogInformation($"拆包分拣更新订单明细 - OrderDetailId: {lockInfo.OrderDetailId}, åˆ†æ‹£æ•°é‡: {actualQty}");
        }
            _logger.LogInformation($"拆包分拣完成 - OrderDetailId: {lockInfo.OrderDetailId}, åˆ†æ‹£æ•°é‡: {actualQty}");
        }
        private async Task HandleFullPicking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
            decimal actualQty, PickingResult result)
        {