pan
4 天以前 503608c5ad94cbc5ccff0f8806e2d5fa54143875
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/SplitPackageService.cs
@@ -1,4 +1,7 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Org.BouncyCastle.Asn1.Ocsp;
using SqlSugar.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -8,10 +11,13 @@
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.Outbound;
using WIDESEA_IBasicService;
using WIDESEA_IOutboundService;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
using WIDESEA_Model.Models.Basic;
namespace WIDESEA_OutboundService
{
@@ -23,18 +29,22 @@
        private readonly IStockInfoService _stockInfoService;
        private readonly IStockInfoDetailService _stockInfoDetailService;
        private readonly IOutStockLockInfoService _outStockLockInfoService;
        public SplitPackageService(IRepository<Dt_SplitPackageRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService) : base(BaseDal)
        private readonly IDailySequenceService _dailySequenceService;
        private readonly IInvokeMESService _invokeMESService;
        private readonly IMaterielToMesService _materielToMesService;
        private readonly ILogger<SplitPackageService> _logger;
        public SplitPackageService(IRepository<Dt_SplitPackageRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, IDailySequenceService dailySequenceService, IInvokeMESService invokeMESService, ILogger<SplitPackageService> logger, IMaterielToMesService materielToMesService) : base(BaseDal)
        {
            _unitOfWorkManage = unitOfWorkManage;
            _stockInfoService = stockInfoService;
            _outStockLockInfoService = outStockLockInfoService;
            _stockInfoDetailService = stockInfoDetailService;
            _dailySequenceService = dailySequenceService;
            _invokeMESService = invokeMESService;
            _logger = logger;
            _materielToMesService = materielToMesService;
        }
        /// <summary>
        /// æ‹†åŒ…拆箱操作
        /// </summary>
        public async Task<WebResponseContent> SplitPackage(SplitPackageDto request)
        {
            try
@@ -42,29 +52,67 @@
                _unitOfWorkManage.BeginTran();
                // 1. éªŒè¯å‡ºåº“锁定信息
                var lockInfo = await _stockInfoDetailService.Db.Queryable<Dt_OutStockLockInfo>()
                var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                          .Where(x => x.OrderNo == request.OrderNo &&
                           x.PalletCode == request.PalletCode &&
                           x.CurrentBarcode == request.OriginalBarcode &&
                           x.Status == 0)
                           x.Status == 1)
                    .FirstAsync();
                if (lockInfo == null)
                    return WebResponseContent.Instance.Error("未找到有效的出库锁定信息");
                // 2. æ£€æŸ¥å‰©ä½™é”å®šæ•°é‡
                decimal remainingLockQuantity = lockInfo.AssignQuantity - lockInfo.PickedQty;
                decimal remainingLockQuantity = lockInfo.OriginalQuantity - 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. æŸ¥æ‰¾å½“前条码的库存信息
                var baseStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
                    .Where(x => x.Barcode == request.OriginalBarcode && x.StockId == lockInfo.StockId)
                    .FirstAsync();
                // 3. ç”Ÿæˆæ–°æ¡ç 
                string newBarcode = "";
                if (baseStockDetail == null)
                    throw new Exception($"未找到条码{request.OriginalBarcode}对应的库存记录");
                // 4. åˆ›å»ºæ–°çš„出库锁定信息(新条码)
                // 4. è®°å½•拆包前的库存数量和锁定信息
                decimal stockBeforeSplit = baseStockDetail.StockQuantity;
                decimal assignBeforeSplit = lockInfo.AssignQuantity;
                // 5. è®¡ç®—拆分后的剩余数量
                decimal remainingQty = baseStockDetail.StockQuantity - request.SplitQuantity;
                // æ›´æ–°åŸºç¡€æ¡ç çš„库存数量为剩余数量
                baseStockDetail.StockQuantity = remainingQty;
                baseStockDetail.OutboundQuantity = remainingQty;
                await _stockInfoDetailService.Db.Updateable(baseStockDetail).ExecuteCommandAsync();
                // 6. ç”Ÿæˆæ–°æ¡ç 
                var seq = await _dailySequenceService.GetNextSequenceAsync();
                string newBarcode = "WSLOT" + DateTime.Now.ToString("yyyyMMdd") + seq.ToString()?.PadLeft(5, '0');
                // 7. ä¸ºæ–°æ¡ç åˆ›å»ºåº“存记录(拆分出的数量)
                var newStockDetail = new Dt_StockInfoDetail
                {
                    SupplyCode = baseStockDetail.SupplyCode,
                    WarehouseCode = baseStockDetail.WarehouseCode,
                    BarcodeQty = baseStockDetail.BarcodeQty,
                    BarcodeUnit = baseStockDetail.BarcodeUnit,
                    BusinessType = baseStockDetail.BusinessType,
                    Unit = baseStockDetail.Unit,
                    StockId = lockInfo.StockId,
                    MaterielCode = baseStockDetail.MaterielCode,
                    OrderNo = baseStockDetail.OrderNo,
                    BatchNo = baseStockDetail.BatchNo,
                    StockQuantity = request.SplitQuantity,
                    OutboundQuantity = request.SplitQuantity,
                    Barcode = newBarcode,
                    InboundOrderRowNo = baseStockDetail.InboundOrderRowNo,
                    FactoryArea = baseStockDetail.FactoryArea,
                };
                await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
                // 8. åˆ›å»ºæ–°çš„出库锁定信息(新条码)
                var newLockInfo = new Dt_OutStockLockInfo
                {
                    OrderNo = lockInfo.OrderNo,
@@ -73,35 +121,48 @@
                    MaterielCode = lockInfo.MaterielCode,
                    MaterielName = lockInfo.MaterielName,
                    StockId = lockInfo.StockId,
                    OrderQuantity = lockInfo.OrderQuantity,
                    OriginalQuantity = lockInfo.OriginalQuantity,
                    AssignQuantity = request.SplitQuantity, // æ–°æ¡ç åˆ†é…æ•°é‡
                    PickedQty = 0, // æ–°æ¡ç æœªæ‹£é€‰
                    OrderQuantity = request.SplitQuantity,
                    OriginalQuantity = request.SplitQuantity,
                    AssignQuantity = request.SplitQuantity,
                    PickedQty = 0,
                    LocationCode = lockInfo.LocationCode,
                    PalletCode = lockInfo.PalletCode,
                    TaskNum = lockInfo.TaskNum,
                    Status = (int)OutLockStockStatusEnum.出库中,
                    Unit = lockInfo.Unit,
                    CurrentBarcode = newBarcode, // æ–°æ¡ç 
                    SupplyCode = lockInfo.SupplyCode,
                    OrderType = lockInfo.OrderType,
                    CurrentBarcode = newBarcode,
                    OriginalLockQuantity = request.SplitQuantity,
                    IsSplitted = 1,
                    ParentLockId = lockInfo.Id // è®°å½•父级锁定ID
                    ParentLockId = lockInfo.Id,
                     Operator = App.User.UserName,
                    FactoryArea = lockInfo.FactoryArea,
                    lineNo = lockInfo.lineNo,
                    WarehouseCode = lockInfo.WarehouseCode,
                };
                await Db.Insertable(newLockInfo).ExecuteCommandAsync();
                await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync();
                // 5. æ›´æ–°åŽŸé”å®šä¿¡æ¯çš„åˆ†é…æ•°é‡ï¼ˆå‡å°‘æ‹†åŒ…æ•°é‡ï¼‰
                lockInfo.AssignQuantity -= request.SplitQuantity;
                await Db.Updateable(lockInfo).ExecuteCommandAsync();
                // 9. æ›´æ–°åŽŸé”å®šä¿¡æ¯çš„åˆ†é…æ•°é‡ï¼ˆå‡å°‘æ‹†åŒ…æ•°é‡ï¼‰
                lockInfo.AssignQuantity = remainingQty;
                lockInfo.IsSplitted = 1;
                await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
                // 6. è®°å½•拆包历史(用于追踪)
                // 10. è®°å½•拆包历史
                var splitHistory = new Dt_SplitPackageRecord
                {
                    FactoryArea = lockInfo.FactoryArea,
                    TaskNum = lockInfo.TaskNum,
                    OutStockLockInfoId = lockInfo.Id,
                    OriginalBarcode = lockInfo.CurrentBarcode,
                    StockId = baseStockDetail.StockId,
                    Operator = App.User.UserName,
                    IsReverted = false,
                    OriginalBarcode = request.OriginalBarcode,
                    NewBarcode = newBarcode,
                    SplitQty = request.SplitQuantity,
                    RemainQuantity = lockInfo.RemainQuantity - request.SplitQuantity,
                    RemainQuantity = remainingQty,
                    StockBeforeSplit = stockBeforeSplit, // è®°å½•拆包前的库存数量
                    AssignBeforeSplit = assignBeforeSplit, // è®°å½•拆包前的分配数量
                    MaterielCode = lockInfo.MaterielCode,
                    SplitTime = DateTime.Now,
                    OrderNo = request.OrderNo,
@@ -110,96 +171,257 @@
                };
                await Db.Insertable(splitHistory).ExecuteCommandAsync();
                Db.Ado.CommitTran();
                _unitOfWorkManage.CommitTran();
                // 7. å›žä¼ æ–°æ¡ç ç»™MES
               // await SendBarcodeToMES(newBarcode, request.MaterielCode, request.SplitQuantity);
                try
                {
                    var dt_MaterielToMes = new Dt_MaterielToMes
                    {
                        OldMaterialBarCode = request.OriginalBarcode,
                        NewMaterialBarCode = newBarcode,
                        Unit = baseStockDetail.BarcodeUnit,
                        factoryArea = baseStockDetail.FactoryArea,
                        Qty = remainingQty,
                        supplyCode = baseStockDetail.SupplyCode,
                        warehouseCode = baseStockDetail.WarehouseCode,
                        BatchNo = baseStockDetail.BatchNo,
                        MaterielCode = baseStockDetail.MaterielCode,
                return WebResponseContent.Instance.OK("拆包成功", new
                    };
                    _materielToMesService.AddData(dt_MaterielToMes);
                }
                catch (Exception ex)
                {
                    _logger.LogError("SplitPackage å›žä¼ MES:  " + ex.Message);
                }
                return WebResponseContent.Instance.OK("拆包成功", new SplitPackageChainDto
                {
                    NewBarcode = newBarcode,
                    NewLockInfoId = newLockInfo.Id
                    NewLockInfoId = newLockInfo.Id,
                    RemainQuantity = remainingQty
                });
            }
            catch (Exception ex)
            {
                Db.Ado.RollbackTran();
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error($"拆包失败: {ex.Message}");
            }
        }
        // æ’¤é”€æ‹†åŒ…
        public async Task<WebResponseContent> RevertSplitPackage(string originalBarcode)
        {
            try
            {
                _unitOfWorkManage.BeginTran();
                // æŸ¥æ‰¾æœ€è¿‘的未撤销拆包记录
                var splitPackage = await Db.Queryable<Dt_SplitPackageRecord>()
                // 1. æŸ¥æ‰¾è¯¥æ¡ç ä½œä¸ºåŽŸå§‹æ¡ç çš„æ‰€æœ‰æœªæ’¤é”€æ‹†åŒ…è®°å½•ï¼ŒæŒ‰æ—¶é—´å€’åº
                var splitRecords = await Db.Queryable<Dt_SplitPackageRecord>()
                        .Where(x => x.OriginalBarcode == originalBarcode && !x.IsReverted)
                        .OrderByDescending(x => x.CreateDate)
                        .FirstAsync();
                        .OrderByDescending(x => x.SplitTime)
                        .ToListAsync();
                    if (splitPackage == null)
                        return  WebResponseContent.Instance.Error("未找到拆包记录");
                if (splitRecords == null || !splitRecords.Any())
                    return WebResponseContent.Instance.Error("未找到可撤销的拆包记录");
                    // æ£€æŸ¥æ–°æ¡ç æ˜¯å¦å·²æ‹£é€‰
                    var newOutStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                        .Where(x => x.CurrentBarcode == splitPackage.NewBarcode)
                        .FirstAsync();
                // 2. æ£€æŸ¥æ‰€æœ‰æ–°æ¡ç æ˜¯å¦å·²æ‹£é€‰
                var newBarcodes = splitRecords.Select(x => x.NewBarcode).ToList();
                var newLockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                    .Where(x => newBarcodes.Contains(x.CurrentBarcode))
                    .ToListAsync();
                    if (newOutStockInfo.Status == 1)
                        return  WebResponseContent.Instance.Error("新条码已拣选,无法撤销拆包");
                var pickedBarcodes = newLockInfos.Where(x => x.Status == 2).Select(x => x.CurrentBarcode).ToList();
                if (pickedBarcodes.Any())
                    return WebResponseContent.Instance.Error($"以下条码已拣选,无法撤销拆包:{string.Join(",", pickedBarcodes)}");
                    // è¿˜åŽŸåŽŸå‡ºåº“è¯¦æƒ…æ•°é‡
                    var originalOutStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                        .Where(x => x.CurrentBarcode == originalBarcode)
                        .FirstAsync();
                // 3. èŽ·å–åŽŸæ¡ç çš„é”å®šä¿¡æ¯å’Œåº“å­˜ä¿¡æ¯
                var originalLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                    .Where(x => x.CurrentBarcode == originalBarcode)
                    .FirstAsync();
                    originalOutStockInfo.AssignQuantity += splitPackage.SplitQty;
                    await _outStockLockInfoService.Db.Updateable(originalOutStockInfo).ExecuteCommandAsync();
                if (originalLockInfo == null)
                    return WebResponseContent.Instance.Error("未找到原条码锁定信息");
                    // åˆ é™¤æ–°å‡ºåº“详情记录
                    await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
                        .Where(x => x.CurrentBarcode == splitPackage.NewBarcode)
                        .ExecuteCommandAsync();
                var originalStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
                    .Where(x => x.Barcode == originalBarcode && x.StockId == originalLockInfo.StockId)
                    .FirstAsync();
                    // æ ‡è®°æ‹†åŒ…记录为已撤销
                    splitPackage.IsReverted = true;
                    await Db.Updateable(splitPackage).ExecuteCommandAsync();
                if (originalStockDetail == null)
                    return WebResponseContent.Instance.Error("未找到原条码库存信息");
                // 4. æŸ¥æ‰¾ç¬¬ä¸€æ¬¡æ‹†åŒ…记录,获取拆包前的状态
                var firstSplitRecord = splitRecords.OrderBy(x => x.SplitTime).FirstOrDefault();
                if (firstSplitRecord == null)
                    return WebResponseContent.Instance.Error("未找到有效的拆包记录");
                // 5. æ¢å¤åŽŸæ¡ç åˆ°æ‹†åŒ…å‰çš„çŠ¶æ€
                originalStockDetail.StockQuantity = firstSplitRecord.StockBeforeSplit;
                originalStockDetail.OutboundQuantity = firstSplitRecord.StockBeforeSplit;
                await _stockInfoDetailService.Db.Updateable(originalStockDetail).ExecuteCommandAsync();
                // 6. æ¢å¤åŽŸæ¡ç é”å®šä¿¡æ¯åˆ°æ‹†åŒ…å‰çš„çŠ¶æ€
                originalLockInfo.AssignQuantity = firstSplitRecord.AssignBeforeSplit;
                originalLockInfo.OriginalQuantity = firstSplitRecord.AssignBeforeSplit;
                originalLockInfo.OrderQuantity = firstSplitRecord.AssignBeforeSplit;
                originalLockInfo.Status = (int)OutLockStockStatusEnum.出库中;
                originalLockInfo.IsSplitted = 0; // æ¢å¤ä¸ºæœªæ‹†åŒ…状态
                await _outStockLockInfoService.Db.Updateable(originalLockInfo).ExecuteCommandAsync();
                // 7. åˆ é™¤æ‰€æœ‰æ–°æ¡ç çš„锁定信息
                await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
                    .Where(x => newBarcodes.Contains(x.CurrentBarcode))
                    .ExecuteCommandAsync();
                // 8. åˆ é™¤æ‰€æœ‰æ–°æ¡ç çš„库存记录
                await _stockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
                    .Where(x => newBarcodes.Contains(x.Barcode))
                    .ExecuteCommandAsync();
                // 9. æ ‡è®°æ‰€æœ‰æ‹†åŒ…记录为已撤销
                foreach (var record in splitRecords)
                {
                    record.IsReverted = true;
                    record.RevertTime = DateTime.Now;
                    record.Status = (int)SplitPackageStatusEnum.已撤销;
                }
                await Db.Updateable(splitRecords).ExecuteCommandAsync();
                _unitOfWorkManage.CommitTran();
                    return  WebResponseContent.Instance.OK("撤销拆包成功");
                return WebResponseContent.Instance.OK($"撤销拆包成功,共撤销{splitRecords.Count}次拆包,{originalBarcode}恢复为拆包前数量:{firstSplitRecord.StockBeforeSplit}");
            }
            catch (Exception ex)
            {
                return  WebResponseContent.Instance.Error($"撤销拆包失败:{ex.Message}");
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error($"撤销拆包失败:{ex.Message}");
            }
        }
        //public async Task<WebResponseContent> RevertSplitPackage(string originalBarcode)
        //{
        //    try
        //    {
        //        _unitOfWorkManage.BeginTran();
        //        // 1. æŸ¥æ‰¾æœ€è¿‘的未撤销拆包记录
        //        var splitRecord = await Db.Queryable<Dt_SplitPackageRecord>()
        //                .Where(x => x.OriginalBarcode == originalBarcode && !x.IsReverted)
        //                .OrderByDescending(x => x.SplitTime)
        //                .FirstAsync();
        //        if (splitRecord == null)
        //            return WebResponseContent.Instance.Error("未找到可撤销的拆包记录");
        //        // 2. æ£€æŸ¥æ–°æ¡ç æ˜¯å¦å·²æ‹£é€‰
        //        var newLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
        //            .Where(x => x.CurrentBarcode == splitRecord.NewBarcode)
        //            .FirstAsync();
        //        if (newLockInfo?.Status ==6) // å‡è®¾çŠ¶æ€2表示已拣选
        //            return WebResponseContent.Instance.Error("新条码已拣选,无法撤销拆包");
        //        // 3. èŽ·å–åŽŸæ¡ç çš„é”å®šä¿¡æ¯
        //        var originalLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
        //            .Where(x => x.CurrentBarcode == originalBarcode)
        //            .FirstAsync();
        //        if (originalLockInfo == null)
        //            return WebResponseContent.Instance.Error("未找到原条码锁定信息");
        //        originalLockInfo.AssignQuantity  += splitRecord.RemainQuantity;
        //       // originalLockInfo.Status = (int)OutLockStockStatusEnum.出库中;
        //        originalLockInfo.IsSplitted = 0; // æ ‡è®°ä¸ºæœªæ‹†åŒ…
        //        await _outStockLockInfoService.Db.Updateable(originalLockInfo).ExecuteCommandAsync();
        //        // 5. è¿˜åŽŸåŽŸæ¡ç åº“å­˜è®°å½•
        //        var originalStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
        //            .Where(x => x.Barcode == originalBarcode && x.StockId == splitRecord.StockId)
        //            .FirstAsync();
        //        if (originalStockDetail != null)
        //        {
        //            // å°†æ‹†å‡ºçš„æ•°é‡åŠ å›žåˆ°åŽŸæ¡ç åº“å­˜
        //            originalStockDetail.StockQuantity += splitRecord.RemainQuantity;
        //            originalStockDetail.OutboundQuantity += splitRecord.RemainQuantity;
        //            await _stockInfoDetailService.Db.Updateable(originalStockDetail).ExecuteCommandAsync();
        //        }
        //        // 6. åˆ é™¤æ–°æ¡ç çš„锁定信息
        //        if (newLockInfo != null)
        //        {
        //            await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
        //                .Where(x => x.CurrentBarcode == splitRecord.NewBarcode)
        //                .ExecuteCommandAsync();
        //        }
        //        // 7. åˆ é™¤æ–°æ¡ç çš„库存记录
        //        var newStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
        //            .Where(x => x.Barcode == splitRecord.NewBarcode)
        //            .FirstAsync();
        //        if (newStockDetail != null)
        //        {
        //            await _stockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
        //                .Where(x => x.Barcode == splitRecord.NewBarcode)
        //                .ExecuteCommandAsync();
        //        }
        //        // 8. æ›´æ–°æ‹†åŒ…记录为已撤销
        //        splitRecord.IsReverted = true;
        //        await Db.Updateable(splitRecord).ExecuteCommandAsync();
        //        _unitOfWorkManage.CommitTran();
        //        return WebResponseContent.Instance.OK($"撤销拆包成功,还原数量:{splitRecord.SplitQty}");
        //    }
        //    catch (Exception ex)
        //    {
        //        _unitOfWorkManage.RollbackTran();
        //        return WebResponseContent.Instance.Error($"撤销拆包失败:{ex.Message}");
        //    }
        //}
        // èŽ·å–å¯æ’¤é”€çš„æ‹†åŒ…è®°å½•åˆ—è¡¨
        public Dt_SplitPackageRecord GetRevertableSplitRecords(string originalBarcode)
        {
            var revertableRecords = Db.Queryable<Dt_SplitPackageRecord>()
                    .Where(x => x.OriginalBarcode == originalBarcode && !x.IsReverted)
                    .OrderBy(x => x.SplitTime)
                   .First();
            return revertableRecords;
        }
        // èŽ·å–æ‹†åŒ…ä¿¡æ¯
        public async Task< WebResponseContent > GetSplitPackageInfo(string orderNo, string palletCode, string barcode)
        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)
                           x.Status == 1)
                .FirstAsync();
            if (outStockInfo == null)
                return  WebResponseContent.Instance .Error("未找到对应的出库信息");
                return WebResponseContent.Instance.Error("未找到对应的出库信息");
            var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
                .Where(x => x.Barcode == barcode)
                .FirstAsync();
            //var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
            //    .Where(x => x.Barcode == barcode)
            //    .FirstAsync();
            return  WebResponseContent.Instance .OK("",new
            return WebResponseContent.Instance.OK("", new
            {
                MaterielCode = outStockInfo.MaterielCode,
                RemainQuantity = outStockInfo.RemainQuantity,
                Unit = "个" // æ ¹æ®å®žé™…情况获取单位
                Unit = outStockInfo.Unit
            });
        }
        /// <summary>