pan
2025-11-15 4476740c214edb7ab667c48fcab00488fbdd9879
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/SplitPackageService.cs
@@ -1,4 +1,5 @@
using System;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -34,40 +35,31 @@
        /// <summary>
        /// æ‹†åŒ…拆箱操作
        /// </summary>
        public async Task<WebResponseContent> SplitPackage(SplitPackageRequest request)
        public async Task<WebResponseContent> SplitPackage(SplitPackageDto request)
        {
            try
            {
                _unitOfWorkManage.BeginTran();
                // 1. éªŒè¯å‡ºåº“锁定信息
                var lockInfo = await Db.Queryable<Dt_OutStockLockInfo>()
                    .Where(x => x.Id == request.OutStockLockInfoId &&
                               x.Status == (int)OutLockStockStatusEnum.出库中)
                var lockInfo = await _stockInfoDetailService.Db.Queryable<Dt_OutStockLockInfo>()
                          .Where(x => x.OrderNo == request.OrderNo &&
                           x.PalletCode == request.PalletCode &&
                           x.CurrentBarcode == request.OriginalBarcode &&
                           x.Status == 0)
                    .FirstAsync();
                if (lockInfo == null)
                    return WebResponseContent.Instance.Error("未找到有效的出库锁定信息");
                //// 2. éªŒè¯å½“前条码的可用数量
                //var currentStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
                //    .Where(x => x.Barcode == lockInfo.CurrentBarcode &&
                //               x.MaterielCode == request.MaterielCode &&
                //               x.StockId == lockInfo.StockId)
                //    .FirstAsync();
                //if (currentStockDetail == null)
                //    return WebResponseContent.Instance.Error("当前条码在库存中不存在");
                //// 3. æ£€æŸ¥å¯ç”¨æ•°é‡
                //decimal availableQuantity = currentStockDetail.StockQuantity - currentStockDetail.OutboundQuantity;
                //if (request.SplitQuantity > availableQuantity)
                //    return WebResponseContent.Instance.Error($"拆包数量不能大于可用数量,可用数量:{availableQuantity}");
                // 2. æ£€æŸ¥å‰©ä½™é”å®šæ•°é‡
                decimal remainingLockQuantity = lockInfo.AssignQuantity - lockInfo.PickedQty;
                if (request.SplitQuantity > remainingLockQuantity)
                    return WebResponseContent.Instance.Error($"拆包数量不能大于剩余锁定数量,剩余:{remainingLockQuantity}");
                var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
               .Where(x => x.Barcode == request.OriginalBarcode)
               .FirstAsync();
                // 3. ç”Ÿæˆæ–°æ¡ç 
                string newBarcode = "";
@@ -109,9 +101,11 @@
                    OriginalBarcode = lockInfo.CurrentBarcode,
                    NewBarcode = newBarcode,
                    SplitQty = request.SplitQuantity,
                    MaterielCode = request.MaterielCode,
                    RemainQuantity = lockInfo.RemainQuantity - request.SplitQuantity,
                    MaterielCode = lockInfo.MaterielCode,
                    SplitTime = DateTime.Now,
                    Operator = request.Operator,
                    OrderNo = request.OrderNo,
                    PalletCode = request.PalletCode,
                    Status = (int)SplitPackageStatusEnum.已拆包
                };
                await Db.Insertable(splitHistory).ExecuteCommandAsync();
@@ -134,6 +128,80 @@
            }
        }
        // æ’¤é”€æ‹†åŒ…
        public async Task<WebResponseContent> RevertSplitPackage(string originalBarcode)
        {
            try
            {
                _unitOfWorkManage.BeginTran();
                // æŸ¥æ‰¾æœ€è¿‘的未撤销拆包记录
                var splitPackage = await Db.Queryable<Dt_SplitPackageRecord>()
                        .Where(x => x.OriginalBarcode == originalBarcode && !x.IsReverted)
                        .OrderByDescending(x => x.CreateDate)
                        .FirstAsync();
                    if (splitPackage == null)
                        return  WebResponseContent.Instance.Error("未找到拆包记录");
                    // æ£€æŸ¥æ–°æ¡ç æ˜¯å¦å·²æ‹£é€‰
                    var newOutStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                        .Where(x => x.CurrentBarcode == splitPackage.NewBarcode)
                        .FirstAsync();
                    if (newOutStockInfo.Status == 1)
                        return  WebResponseContent.Instance.Error("新条码已拣选,无法撤销拆包");
                    // è¿˜åŽŸåŽŸå‡ºåº“è¯¦æƒ…æ•°é‡
                    var originalOutStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                        .Where(x => x.CurrentBarcode == originalBarcode)
                        .FirstAsync();
                    originalOutStockInfo.AssignQuantity += splitPackage.SplitQty;
                    await _outStockLockInfoService.Db.Updateable(originalOutStockInfo).ExecuteCommandAsync();
                    // åˆ é™¤æ–°å‡ºåº“详情记录
                    await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
                        .Where(x => x.CurrentBarcode == splitPackage.NewBarcode)
                        .ExecuteCommandAsync();
                    // æ ‡è®°æ‹†åŒ…记录为已撤销
                    splitPackage.IsReverted = true;
                    await Db.Updateable(splitPackage).ExecuteCommandAsync();
                _unitOfWorkManage.CommitTran();
                    return  WebResponseContent.Instance.OK("撤销拆包成功");
            }
            catch (Exception ex)
            {
                return  WebResponseContent.Instance.Error($"撤销拆包失败:{ex.Message}");
            }
        }
        // èŽ·å–æ‹†åŒ…ä¿¡æ¯
        public async Task< WebResponseContent > GetSplitPackageInfo(string orderNo, string palletCode, string barcode)
        {
            var outStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                .Where(x => x.OrderNo == orderNo &&
                           x.PalletCode == palletCode &&
                           x.CurrentBarcode == barcode &&
                           x.Status == 0)
                .FirstAsync();
            if (outStockInfo == null)
                return  WebResponseContent.Instance .Error("未找到对应的出库信息");
            var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
                .Where(x => x.Barcode == barcode)
                .FirstAsync();
            return  WebResponseContent.Instance .OK("",new
            {
                MaterielCode = outStockInfo.MaterielCode,
                RemainQuantity = outStockInfo.RemainQuantity,
                Unit = "个" // æ ¹æ®å®žé™…情况获取单位
            });
        }
        /// <summary>
        /// èŽ·å–å¯æ‹†åŒ…çš„å‡ºåº“é”å®šä¿¡æ¯
        /// </summary>