pan
2025-11-12 ca4a0e7ffc11dc6f4c19b75f625444b06768ea15
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs
@@ -32,59 +32,52 @@
            _recordService = recordService;
        }
        public Dt_OutStockLockInfo GetOutStockLockInfo(Dt_OutboundOrder outboundOrder, Dt_OutboundOrderDetail outboundOrderDetail, Dt_StockInfo outStock, decimal assignQuantity, int? taskNum = null)
        {
            Dt_OutStockLockInfo outStockLockInfo = 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,
                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,
                TaskNum = taskNum,
                OrderQuantity = outboundOrderDetail.OrderQuantity,
                Unit = outboundOrderDetail.Unit,
                //ProductionDate = outStock.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).FirstOrDefault()?.ProductionDate,
                //EffectiveDate = outStock.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).FirstOrDefault()?.EffectiveDate
            };
            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)
        public Dt_OutStockLockInfo GetOutStockLockInfo(
            Dt_OutboundOrder outboundOrder,
            Dt_OutboundOrderDetail outboundOrderDetail,
            Dt_StockInfo outStock,
            decimal assignQuantity,
            string barcode = null)
        {
            // èŽ·å–åº“å­˜æ˜Žç»†ä¸­çš„æ¡ç ä¿¡æ¯ï¼ˆå¦‚æžœæœªæŒ‡å®šæ¡ç ï¼Œä½¿ç”¨ç¬¬ä¸€ä¸ªå¯ç”¨æ¡ç ï¼‰
            var stockDetails = outStock.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode && x.StockQuantity > x.OutboundQuantity)
                .OrderBy(x => x.ProductionDate).ToList();
            // èŽ·å–åº“å­˜æ˜Žç»†ä¿¡æ¯
            var stockDetails = outStock.Details
                .Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode)
                .ToList();
            if (!stockDetails.Any())
            {
                throw new Exception($"未找到物料[{outboundOrderDetail.MaterielCode}]的可用库存明细");
                throw new Exception($"未找到物料[{outboundOrderDetail.MaterielCode}]的库存明细");
            }
            // ç¡®å®šæ¡ç ï¼ˆå¦‚果未指定,使用最早入库的条码)
            var targetBarcode = barcode;
            if (string.IsNullOrEmpty(targetBarcode))
            // ç¡®å®šæ¡ç 
            string targetBarcode;
            if (!string.IsNullOrEmpty(barcode))
            {
                targetBarcode = stockDetails.First().Barcode;
                // éªŒè¯æŒ‡å®šçš„æ¡ç æ˜¯å¦å­˜åœ¨
                var specifiedBarcodeDetail = stockDetails.FirstOrDefault(x => x.Barcode == barcode);
                if (specifiedBarcodeDetail == null)
                {
                    throw new Exception($"指定的条码[{barcode}]在库存中不存在");
                }
                targetBarcode = barcode;
            }
            // èŽ·å–è¯¥æ¡ç çš„å¯ç”¨æ•°é‡
            var barcodeDetail = stockDetails.FirstOrDefault(x => x.Barcode == targetBarcode);
            if (barcodeDetail == null)
            else
            {
                throw new Exception($"条码[{targetBarcode}]在库存中不存在");
                // ä½¿ç”¨ç¬¬ä¸€ä¸ªå¯ç”¨æ¡ç 
                var firstAvailableDetail = stockDetails
                    .Where(x => x.StockQuantity > x.OutboundQuantity)
                    .OrderBy(x => x.ProductionDate)
                    .FirstOrDefault();
                if (firstAvailableDetail == null)
                {
                    throw new Exception($"物料[{outboundOrderDetail.MaterielCode}]没有可用库存");
                }
                targetBarcode = firstAvailableDetail.Barcode;
            }
            return new Dt_OutStockLockInfo()
@@ -101,19 +94,18 @@
                OriginalQuantity = outStock.Details
                    .Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode)
                    .Sum(x => x.StockQuantity),
                Status = taskNum == null ? (int)OutLockStockStatusEnum.已分配 : (int)OutLockStockStatusEnum.出库中,
                Status = (int)OutLockStockStatusEnum.已分配,
                StockId = outStock.Id,
                TaskNum = taskNum,
                Unit = outboundOrderDetail.Unit,
                // æ–°å¢žå­—段赋值
                CurrentBarcode = targetBarcode, // å½“前分配的条码
                OriginalLockQuantity = assignQuantity, // åŽŸå§‹é”å®šæ•°é‡
                IsSplitted = 0 // åˆå§‹æœªæ‹†åŒ…
                SupplyCode     = outboundOrderDetail.SupplyCode,
                WarehouseCode = outboundOrderDetail.WarehouseCode,
                // æ–°å¢žå­—段
                CurrentBarcode = targetBarcode,
                OriginalLockQuantity = assignQuantity,
                IsSplitted = 0
            };
        }
        /// <summary>
        /// æ ¹æ®è®¢å•明细ID获取出库锁定信息
        /// </summary>