pan
2025-11-11 c4e1a656954799267cbd61d3de3a040e8dc8e46a
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs
@@ -46,6 +46,7 @@
                OrderDetailId = outboundOrderDetail.Id,
                OrderNo = outboundOrder.OrderNo,
                OrderType = outboundOrder.OrderType,
                OriginalQuantity = outStock.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).Sum(x => x.StockQuantity),
                Status = taskNum == null ? OutLockStockStatusEnum.已分配.ObjToInt() : OutLockStockStatusEnum.出库中.ObjToInt(),
                StockId = outStock.Id,
@@ -58,5 +59,137 @@
            return outStockLockInfo;
        }
        /// <summary>
        /// åˆ›å»ºå‡ºåº“锁定信息
        /// </summary>
        public Dt_OutStockLockInfo GetOutStockLockInfo(Dt_OutboundOrder outboundOrder, Dt_OutboundOrderDetail outboundOrderDetail, Dt_StockInfo outStock, decimal assignQuantity, string barcode = null, int? taskNum = null)
        {
            // èŽ·å–åº“å­˜æ˜Žç»†ä¸­çš„æ¡ç ä¿¡æ¯ï¼ˆå¦‚æžœæœªæŒ‡å®šæ¡ç ï¼Œä½¿ç”¨ç¬¬ä¸€ä¸ªå¯ç”¨æ¡ç ï¼‰
            var stockDetails = outStock.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode && x.StockQuantity > x.OutboundQuantity)
                .OrderBy(x => x.ProductionDate).ToList();
            if (!stockDetails.Any())
            {
                throw new Exception($"未找到物料[{outboundOrderDetail.MaterielCode}]的可用库存明细");
            }
            // ç¡®å®šæ¡ç ï¼ˆå¦‚果未指定,使用最早入库的条码)
            var targetBarcode = barcode;
            if (string.IsNullOrEmpty(targetBarcode))
            {
                targetBarcode = stockDetails.First().Barcode;
            }
            // èŽ·å–è¯¥æ¡ç çš„å¯ç”¨æ•°é‡
            var barcodeDetail = stockDetails.FirstOrDefault(x => x.Barcode == targetBarcode);
            if (barcodeDetail == null)
            {
                throw new Exception($"条码[{targetBarcode}]在库存中不存在");
            }
            return new Dt_OutStockLockInfo()
            {
                PalletCode = outStock.PalletCode,
                AssignQuantity = assignQuantity,
                MaterielCode = outboundOrderDetail.MaterielCode,
                BatchNo = outboundOrderDetail.BatchNo ?? outStock.Details.FirstOrDefault()?.BatchNo,
                LocationCode = outStock.LocationCode,
                MaterielName = outboundOrderDetail.MaterielName,
                OrderDetailId = outboundOrderDetail.Id,
                OrderNo = outboundOrder.OrderNo,
                OrderQuantity = outboundOrderDetail.OrderQuantity,
                OriginalQuantity = outStock.Details
                    .Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode)
                    .Sum(x => x.StockQuantity),
                Status = taskNum == null ? (int)OutLockStockStatusEnum.已分配 : (int)OutLockStockStatusEnum.出库中,
                StockId = outStock.Id,
                TaskNum = taskNum,
                Unit = outboundOrderDetail.Unit,
                // æ–°å¢žå­—段赋值
                CurrentBarcode = targetBarcode, // å½“前分配的条码
                OriginalLockQuantity = assignQuantity, // åŽŸå§‹é”å®šæ•°é‡
                IsSplitted = 0 // åˆå§‹æœªæ‹†åŒ…
            };
        }
        /// <summary>
        /// æ ¹æ®è®¢å•明细ID获取出库锁定信息
        /// </summary>
        public async Task<List<Dt_OutStockLockInfo>> GetByOrderDetailId(int orderDetailId)
        {
            return await Db.Queryable<Dt_OutStockLockInfo>()
                .Where(x => x.OrderDetailId == orderDetailId)
                .OrderBy(x => x.Id)
                .ToListAsync();
        }
        /// <summary>
        /// æ ¹æ®æ‰˜ç›˜ç¼–号获取出库锁定信息
        /// </summary>
        public async Task<List<Dt_OutStockLockInfo>> GetByPalletCode(string palletCode, int? status = null)
        {
            var query = Db.Queryable<Dt_OutStockLockInfo>()
                .Where(x => x.PalletCode == palletCode);
            if (status.HasValue)
            {
                query = query.Where(x => x.Status == status.Value);
            }
            return await query.OrderBy(x => x.Id).ToListAsync();
        }
        /// <summary>
        /// èŽ·å–æ‰˜ç›˜çš„é”å®šä¿¡æ¯
        /// </summary>
        public async Task<List<Dt_OutStockLockInfo>> GetPalletLockInfos(string palletCode)
        {
            return await Db.Queryable<Dt_OutStockLockInfo>()
                .Where(x => x.PalletCode == palletCode && x.Status == (int)OutLockStockStatusEnum.出库中)
                .ToListAsync();
        }
        /// <summary>
        /// æ›´æ–°å‡ºåº“锁定信息的条码(用于拆包操作)
        /// </summary>
        public async Task<WebResponseContent> UpdateLockInfoBarcode(int lockInfoId, string newBarcode)
        {
            try
            {
                var lockInfo = await Db.Queryable<Dt_OutStockLockInfo>()
                    .Where(x => x.Id == lockInfoId)
                    .FirstAsync();
                if (lockInfo == null)
                    return WebResponseContent.Instance.Error("未找到出库锁定信息");
                // éªŒè¯æ–°æ¡ç æ˜¯å¦å­˜åœ¨
                var stockDetail = await Db.Queryable<Dt_StockInfoDetail>()
                    .Where(x => x.Barcode == newBarcode &&
                               x.StockId == lockInfo.StockId &&
                               x.MaterielCode == lockInfo.MaterielCode)
                    .FirstAsync();
                if (stockDetail == null)
                    return WebResponseContent.Instance.Error("新条码在库存中不存在");
                // æ›´æ–°æ¡ç å’Œæ‹†åŒ…状态
                lockInfo.CurrentBarcode = newBarcode;
                lockInfo.IsSplitted = 1;
                await Db.Updateable(lockInfo).ExecuteCommandAsync();
                return WebResponseContent.Instance.OK("更新条码成功");
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error($"更新条码失败: {ex.Message}");
            }
        }
    }
}