heshaofeng
3 天以前 cd44f1223ccf40a2b6f0788dbcd24ff7cd8f0eef
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundBatchPickingService.cs
@@ -339,17 +339,7 @@
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK("分拣成功", new
                {
                    PickedQuantity = actualPickedQty,
                    Barcode = barcode,
                    MaterialCode = lockInfo.MaterielCode,
                    AutoSplitted = autoSplitResult != null,
                    RemainingStock = stockDetail.StockQuantity,
                    CurrentOutbound = stockDetail.OutboundQuantity,
                    // å¦‚果是自动拆包,返回相关信息
                    UnallocatedCreated = autoSplitResult != null ? "是" : "否"
                });
                return WebResponseContent.Instance.OK("分拣成功", autoSplitResult);
            }
            catch (Exception ex)
            {
@@ -953,7 +943,7 @@
        /// <summary>
        /// æ‰§è¡Œæ‰‹åŠ¨æ‹†åŒ…é€»è¾‘ - ä¿®å¤ç‰ˆæœ¬
        /// æ‰§è¡Œæ‰‹åŠ¨æ‹†åŒ…é€»è¾‘
        /// </summary>
        private async Task<List<SplitResult>> ExecuteManualSplitLogic(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
            decimal splitQuantity, string palletCode)
@@ -1011,8 +1001,8 @@
                    MaterielCode = stockDetail.MaterielCode,
                    OrderNo = stockDetail.OrderNo,
                    BatchNo = stockDetail.BatchNo,
                    StockQuantity = newStockQuantity,  // ä¿®å¤ï¼šä½¿ç”¨æ­£ç¡®çš„æ‹†åŒ…数量
                    OutboundQuantity = 0,  // æ–°æ¡ç åˆå§‹å‡ºåº“数量为0
                    StockQuantity = newStockQuantity,
                    OutboundQuantity = 0,
                    Barcode = newBarcode,
                    Status = (int)StockStatusEmun.出库锁定,
                    SupplyCode = stockDetail.SupplyCode,
@@ -1021,6 +1011,8 @@
                    BarcodeUnit = stockDetail.BarcodeUnit,
                    BusinessType = stockDetail.BusinessType,
                    InboundOrderRowNo = stockDetail.InboundOrderRowNo,
                    FactoryArea = stockDetail.FactoryArea,
                    WarehouseCode = stockDetail.WarehouseCode,
                };
                await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
@@ -1852,8 +1844,8 @@
                    catch (Exception ex)
                    {
                        _unitOfWorkManage.RollbackTran();
                        _logger.LogError($"空箱回库失败: {ex.Message}");
                        return WebResponseContent.Instance.Error($"空箱回库失败:{ex.Message}");
                        _logger.LogError($"空箱回库ExecutePalletReturn失败: {ex.Message}");
                        return WebResponseContent.Instance.Error($"空箱回库ExecutePalletReturn失败:{ex.Message}");
                    }
                }
@@ -1883,7 +1875,7 @@
                }
                catch (Exception taskEx)
                {
                    _logger.LogError($"回库任务创建失败: {taskEx.Message}");
                    _logger.LogError($"回库任务CreateReturnTaskWithoutESS创建失败: {taskEx.Message}");
                    // ä»»åŠ¡åˆ›å»ºå¤±è´¥ä¸å½±å“æ•°æ®å›žåº“
                }
                _unitOfWorkManage.CommitTran();
@@ -1908,8 +1900,8 @@
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                _logger.LogError($"回库失败: {ex.Message}");
                return WebResponseContent.Instance.Error($"回库失败:{ex.Message}");
                _logger.LogError($"ExecutePalletReturn å›žåº“失败: {ex.Message}");
                return WebResponseContent.Instance.Error($"ExecutePalletReturn å›žåº“失败:{ex.Message}");
            }
        }
@@ -2687,12 +2679,12 @@
                // åˆ›å»ºå›žåº“任务(不发送ESS命令)
                var returnTaskInfo = await CreateEmptyPalletReturnTask(orderNo, palletCode, emptyStockInfo, currentTask);
                return WebResponseContent.Instance.OK("空托盘回库成功");
                return WebResponseContent.Instance.OK("空托盘回库成功", returnTaskInfo);
            }
            catch (Exception ex)
            {
                _logger.LogError($"空托盘回库失败: {ex.Message}");
                return WebResponseContent.Instance.Error($"空托盘回库失败: {ex.Message}");
                _logger.LogError($"空托盘回库失败 HandleEmptyPalletReturn: {ex.Message}");
                return WebResponseContent.Instance.Error($"空托盘回库失败 HandleEmptyPalletReturn: {ex.Message}");
            }
        }
@@ -2893,7 +2885,7 @@
      
        /// <summary>
        /// å–走空箱 - ä¿®æ­£ç‰ˆï¼Œæ­£ç¡®å¤„理未分配锁定记录
        /// å–走空箱 -正确处理未分配锁定记录
        /// </summary>
        public async Task<WebResponseContent> RemoveEmptyPallet(string orderNo, string palletCode)
        {
@@ -3166,17 +3158,7 @@
            _logger.LogInformation($"需要自动拆包 - åº“å­˜: {stockDetail.StockQuantity}, åˆ†é…: {lockInfo.AssignQuantity}, æ‹†åŒ…数量: {splitQuantity}");
            // æ‰§è¡Œè‡ªåŠ¨æ‹†åŒ…
            var splitResult = await ExecuteAutoSplitLogic(lockInfo, stockDetail, splitQuantity, palletCode);
            // å°†æ‹†åŒ…数量传递给调用方,用于验证
            if (splitResult != null && splitResult.Any())
            {
                // åœ¨è¿”回结果中携带拆包数量信息
                foreach (var result in splitResult)
                {
                    result.quantityTotal = splitQuantity.ToString("F2");
                }
            }
            var splitResult = await ExecuteAutoSplitLogic(lockInfo, stockDetail, splitQuantity,  palletCode);
            return splitResult;
        }
@@ -3186,7 +3168,7 @@
        /// åŽŸåˆ™ï¼šåªåˆ†ç¦»ç‰©ç†åº“å­˜ï¼Œä¸æ”¹å˜åŽŸè®¢å•çš„ä»»ä½•åˆ†é…å’Œå‡ºåº“æ•°é‡
        /// </summary>
        private async Task<List<SplitResult>> ExecuteAutoSplitLogic(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
            decimal splitQuantity, string palletCode)
            decimal splitQuantity,string palletCode)
        {
            _logger.LogInformation($"开始执行自动拆包逻辑 - åŽŸæ¡ç : {stockDetail.Barcode}, æ‹†åŒ…数量: {splitQuantity}");
@@ -3228,6 +3210,8 @@
                    BarcodeUnit = stockDetail.BarcodeUnit,
                    BusinessType = stockDetail.BusinessType,
                    InboundOrderRowNo = stockDetail.InboundOrderRowNo,
                    FactoryArea=stockDetail.FactoryArea,
                    WarehouseCode = stockDetail.WarehouseCode,
                };
                await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
@@ -3275,7 +3259,7 @@
                await RecordSplitHistory(lockInfo, stockDetail, splitQuantity, newBarcode, true, originalStockQty);
                // åˆ›å»ºæ‹†åŒ…结果列表
                var splitResults = CreateSplitResults(lockInfo, splitQuantity, lockInfo.AssignQuantity, newBarcode, stockDetail.Barcode);
                var splitResults = CreateSplitResults(lockInfo, splitQuantity, stockDetail.StockQuantity, newBarcode, stockDetail.Barcode);
                _logger.LogInformation($"自动拆包逻辑执行完成 - åˆ›å»ºäº†æœªåˆ†é…çš„库存和锁定记录");
@@ -3725,20 +3709,29 @@
        {
            var splitHistory = new Dt_SplitPackageRecord
            {
                OrderNo = lockInfo.OrderNo,
                FactoryArea = lockInfo.FactoryArea,
                TaskNum = lockInfo.TaskNum,
                OutStockLockInfoId = lockInfo.Id,
                StockId = stockDetail.StockId,
                Operator = App.User.UserName,
                IsReverted = false,
                OriginalBarcode = stockDetail.Barcode,
                NewBarcode = newBarcode,
                SplitQty = splitQty,
               // RemainQuantity = remainQty,
                MaterielCode = lockInfo.MaterielCode,
                SplitTime = DateTime.Now,
                OrderNo = lockInfo.OrderNo,
                PalletCode = lockInfo.PalletCode,
                Status = (int)SplitPackageStatusEnum.已拆包,
                IsAutoSplit = isAutoSplit,
                // SplitType = isAutoSplit ? "自动拆包" : "手动拆包"
                OriginalStockQuantity = originalStockQuantity ?? stockDetail.StockQuantity,
                //RemainingStockQuantity = stockDetail.StockQuantity - splitQty
                TaskNum = lockInfo.TaskNum
            };
            await _splitPackageService.Db.Insertable(splitHistory).ExecuteCommandAsync();