WCS
dengjunjie
2024-10-14 966d1fe6077c885db064fcea98bb48cbccb464d6
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_OutOrderService.cs
@@ -2,12 +2,17 @@
public class Dt_OutOrderService : ServiceBase<Dt_OutOrder, IDt_OutOrderRepository>, IDt_OutOrderService
{
    private readonly LogFactory LogFactory = new LogFactory();
    private readonly IUnitOfWorkManage _unitOfWorkManage;
    private readonly IDt_OutOrderProductionService _outOrderProductionService;
    private readonly IDt_OutOrderProductionDetailService _outOrderProductionDetailService;
    private readonly IDt_OutOrderDtailService _outOrderDtailService;
    private readonly IDt_OutOrderTransferRepository _OutOrderTransferRepository;
    private readonly IDt_OutOrderTransferDetailRepository _OutOrderTransferDetailRepository;
    private readonly IDt_MaterielInfoRepository _materielInfoRepository;
    private readonly IDt_BillGroupStockRepository _billGroupStockRepository;
    private readonly IDt_OutOrderAndStockRepository _outOrderAndStockRepository;
    private readonly IDt_TaskRepository _taskRepository;
    public Dt_OutOrderService(IDt_OutOrderRepository BaseDal,
                              IUnitOfWorkManage unitOfWorkManage,
@@ -15,7 +20,11 @@
                              IDt_OutOrderProductionDetailService outOrderProductionDetailService,
                              IDt_OutOrderDtailService outOrderDtailService,
                              IDt_OutOrderTransferDetailRepository outOrderTransferDetailRepository,
                              IDt_OutOrderTransferRepository outOrderTransferRepository) : base(BaseDal)
                              IDt_OutOrderTransferRepository outOrderTransferRepository,
                              IDt_MaterielInfoRepository materielInfoRepository,
                              IDt_BillGroupStockRepository billGroupStockRepository,
                              IDt_OutOrderAndStockRepository outOrderAndStockRepository,
                              IDt_TaskRepository taskRepository) : base(BaseDal)
    {
        _unitOfWorkManage = unitOfWorkManage;
        _outOrderProductionService = outOrderProductionService;
@@ -23,6 +32,10 @@
        _outOrderDtailService = outOrderDtailService;
        _OutOrderTransferDetailRepository = outOrderTransferDetailRepository;
        _OutOrderTransferRepository = outOrderTransferRepository;
        _materielInfoRepository = materielInfoRepository;
        _billGroupStockRepository = billGroupStockRepository;
        _outOrderAndStockRepository = outOrderAndStockRepository;
        _taskRepository = taskRepository;
    }
    /// <summary>
@@ -35,51 +48,76 @@
        WebResponseContent content = new WebResponseContent();
        try
        {
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "请求", JsonConvert.SerializeObject(model));
            // 1. æž„建生产出库单对象
            var production = CreateProductionOrder(model.MainData);
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "构建生产出库单对象", JsonConvert.SerializeObject(production));
            // 2. æž„建生产出库单明细列表
            var productionDetails = CreateProductionDetails(model.DetailData);
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "构建生产出库单明细对象", JsonConvert.SerializeObject(productionDetails));
            // 3. æž„建系统出库单对象
            var order = CreateSystemOrder(production);
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "构建系统出库单对象", JsonConvert.SerializeObject(order));
            // 4. æž„建系统出库单明细列表
            var orderDetails = CreateSystemOrderDetails(productionDetails);
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "构建系统出库单明细对象", JsonConvert.SerializeObject(orderDetails));
            // å¼€å¯äº‹åŠ¡
            _unitOfWorkManage.BeginTran();
            // 5. æ·»åŠ ç”Ÿäº§å‡ºåº“å•å¹¶èŽ·å–ä¸»é”®ID
            var productionId = _outOrderProductionService.AddOrderProduction(production);
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "添加生产出库单并获取主键ID", productionId);
            // 6. ç”Ÿäº§å‡ºåº“单明细绑定主表ID
            productionDetails.ForEach(item => { item.ProductionOutOrderId = productionId; });
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "生产出库单明细绑定主表ID", productionId);
            // 7. æ·»åŠ ç”Ÿäº§å‡ºåº“å•æ˜Žç»†
            var detailAddResult = _outOrderProductionDetailService.AddData(productionDetails);
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "添加生产出库单明细", detailAddResult.Status);
            // 8. ç³»ç»Ÿå‡ºåº“单绑定生产出库单ID
            order.UpperOutOrderId = productionId;
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "系统出库单绑定生产出库单ID", productionId);
            // 9. æ·»åŠ ç³»ç»Ÿå‡ºåº“å•å¹¶èŽ·å–ä¸»é”®ID
            var orderId = BaseDal.AddData(order);
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "添加系统出库单并获取主键ID", orderId);
            // 10 . ç³»ç»Ÿå‡ºåº“单明细绑定主表ID
            orderDetails.ForEach(item => { item.OutOrderId = orderId; });
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "系统出库单明细绑定主表ID", orderId);
            // 11. æ·»åŠ ç³»ç»Ÿå‡ºåº“å•æ˜Žç»†å¹¶è¿”å›žç»“æžœ
            content = _outOrderDtailService.AddData(orderDetails);
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "添加系统出库单明细并返回结果", content.Status);
            if (content.Status && productionId > 0 && detailAddResult.Status && orderId > 0)
            {
                LogFactory.GetLog("添加生产出库单").InfoFormat(true, "所有操作执行完成提交事务", "无参数");
                _unitOfWorkManage.CommitTran(); // æäº¤äº‹åŠ¡
            }
            else
                throw new Exception("出库单添加失败");
            {
                LogFactory.GetLog("添加生产出库单").InfoFormat(true, "添加数据库失败,请检查数据是否正确", $"系统出库单明细:{content.Status},添加系统出库单:{orderId > 0},生产出库单:{productionId > 0},生产出库单明细:{detailAddResult.Status}");
                throw new Exception("出库单添加失败" + $"系统出库单明细:{content.Status},添加系统出库单:{orderId > 0},生产出库单:{productionId > 0},生产出库单明细:{detailAddResult.Status}");
            }
            return content;
        }
        catch (Exception ex)
        {
            _unitOfWorkManage.RollbackTran(); // å›žæ»šäº‹åŠ¡
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, $"系统异常,异常信息:{ex.Message}", "无参数");
            return content.Error(ex.Message);
        }
        finally
        {
            LogFactory.GetLog("添加生产出库单").InfoFormat(true, "响应", JsonConvert.SerializeObject(content));
        }
    }
@@ -95,48 +133,67 @@
        {
            // 1. æž„建调拨出库单对象
            var transfer = CreateTransferOrder(model.MainData);
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "构建调拨出库单对象", JsonConvert.SerializeObject(transfer));
            // 2. æž„建调拨出库单明细列表
            var transferDetail = CreateTransferDetails(model.DetailData);
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "构建调拨出库单明细对象", JsonConvert.SerializeObject(transferDetail));
            // 3. æž„建系统出库单对象
            var order = CreateSystemOrder(transfer);
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "构建系统出库单对象", JsonConvert.SerializeObject(order));
            // 4. æž„建系统出库单明细列表
            var orderDetails = CreateSystemOrderDetails(transferDetail);
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "构建系统出库单明细对象", JsonConvert.SerializeObject(orderDetails));
            // æ·»åŠ äº‹åŠ¡
            _unitOfWorkManage.BeginTran();
            // 5. æ·»åŠ è°ƒæ‹¨å‡ºåº“å•å¹¶èŽ·å–ä¸»é”®ID
            var transferId = _OutOrderTransferRepository.AddData(transfer);
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "添加调拨出库单并获取主键ID", transferId);
            // 6. è°ƒæ‹¨å‡ºåº“单明细绑定主表ID
            transferDetail.ForEach(item => { item.TransferOutOrderId = transferId; });
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "调拨出库单明细绑定主表ID", transferId);
            // 7. æ·»åŠ ç”Ÿäº§å‡ºåº“å•æ˜Žç»†
            var detailAddResult = _OutOrderTransferDetailRepository.AddData(transferDetail);
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "添加生产出库单明细", detailAddResult);
            // 8. ç³»ç»Ÿå‡ºåº“单绑定调拨出库单ID
            order.UpperOutOrderId = transferId;
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "系统出库单绑定调拨出库单ID", transferId);
            // 9. æ·»åŠ ç³»ç»Ÿå‡ºåº“å•å¹¶èŽ·å–ä¸»é”®ID
            var orderId = BaseDal.AddData(order);
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "添加系统出库单并获取主键ID", orderId);
            // 10 . ç³»ç»Ÿå‡ºåº“单明细绑定主表ID
            orderDetails.ForEach(item => { item.OutOrderId = orderId; });
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "系统出库单明细绑定主表ID", orderId);
            // 11. æ·»åŠ ç³»ç»Ÿå‡ºåº“å•æ˜Žç»†å¹¶è¿”å›žç»“æžœ
            content = _outOrderDtailService.AddData(orderDetails);
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "添加系统出库单明细并返回结果", content.Status);
            if (content.Status && transferId > 0 && detailAddResult > 0 && orderId > 0)
            {
                LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "所有操作执行完成提交事务", "无参数");
                _unitOfWorkManage.CommitTran(); // æäº¤äº‹åŠ¡
            }
            else
                throw new Exception("出库单添加失败");
            {
                LogFactory.GetLog("添加调拨出库单").InfoFormat(true, "添加数据库失败,请检查数据是否正确", $"系统出库单明细:{content.Status},添加系统出库单:{orderId > 0},生产出库单:{transferId > 0},生产出库单明细:{detailAddResult > 0}");
                throw new Exception("添加调拨出库单");
            }
            return content;
        }
        catch (Exception ex)
        {
            _unitOfWorkManage.RollbackTran(); // å›žæ»šäº‹åŠ¡
            LogFactory.GetLog("添加调拨出库单").InfoFormat(true, $"系统异常,异常信息:{ex.Message}", "无参数");
            return content.Error(ex.Message);
        }
    }
@@ -160,14 +217,163 @@
    }
    /// <summary>
    /// æ ¹æ®è®¢å•分配出库库存
    /// </summary>
    /// <param name="orderNo">订单编号</param>
    /// <returns></returns>
    public async Task<WebResponseContent> GetOutboundStockAsync(string orderNo)
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            // èŽ·å–è®¢å•
            var order = await BaseDal.GetOutOrderByNumberAsync(orderNo);
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "根据订单编号获取订单数据", JsonConvert.SerializeObject(order));
            // æ£€æŸ¥è®¢å•是否获取成功
            if (order == null)
            {
                return content.Error("获取订单失败");
            }
            // èŽ·å–è®¢å•ä¸­çš„ç¬¬ä¸€ä¸ªç‰©æ–™ç¼–å·
            var materielInfo = await _materielInfoRepository.QueryFirstAsync(x => x.MaterielID == order.OrderDetailList.MaterialId);
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "获取订单物料编号", JsonConvert.SerializeObject(materielInfo));
            #region å…ˆå…¥å…ˆå‡º
            // èŽ·å–è¯¥ç‰©æ–™æ‰€æœ‰å¯å‡ºåº“åº“å­˜
            var filteredStocks = _billGroupStockRepository.GetOutboundStockList(materielInfo.MaterielCode)
                .OrderBy(x => x.CreateDate).ToList();
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "获取该物料所有可出库库存", JsonConvert.SerializeObject(filteredStocks));
            #endregion å…ˆå…¥å…ˆå‡º
            #region æŸ¥æ‰¾é è¿‘出库口库存
            // é»˜è®¤åˆ—越大越靠近出库口
            filteredStocks = filteredStocks.OrderByDescending(x => x.LocationInfo.Column).OrderBy(x => x.CreateDate).ToList();
            #endregion æŸ¥æ‰¾é è¿‘出库口库存
            #region ä¸€æ·±ä½ä¼˜å…ˆæŸ¥æ‰¾ï¼Œå†æŸ¥æ‰¾åŒåˆ—二深位
            filteredStocks = PickStocks(filteredStocks);
            #endregion ä¸€æ·±ä½ä¼˜å…ˆæŸ¥æ‰¾ï¼Œå†æŸ¥æ‰¾åŒåˆ—二深位
            // åˆ›å»ºä»»åŠ¡åˆ—è¡¨
            var (tasks, updateOrder, stock) = CreateTasks(order, filteredStocks);
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "创建任务列表,修改订单分配数量,获取出库分配库存",
                $"任务列表:{JsonConvert.SerializeObject(tasks)},订单列表:{JsonConvert.SerializeObject(updateOrder)},已分配库存:{JsonConvert.SerializeObject(stock)}");
            // æ›´æ–°åº“存状态
            var stockList = UpdateStocks(stock);
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "更新库存状态", JsonConvert.SerializeObject(stockList));
            // åˆ›å»ºè®¢å•库存列表
            List<Dt_OutOrderAndStock>? orderStocks = CreateOrderStock(stock, updateOrder);
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "创建订单库存列表", JsonConvert.SerializeObject(orderStocks));
            // å¼€å§‹äº‹åŠ¡
            _unitOfWorkManage.BeginTran();
            // æ›´æ–°åº“å­˜
            var isStockUpdated = _billGroupStockRepository.UpdateNavStock(stockList);
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务更新库存", isStockUpdated);
            // æ›´æ–°è®¢å•
            var isOrderUpdated = await BaseDal.OutOrderUpdatedAsync(updateOrder);
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务更新订单", isOrderUpdated);
            //添加订单库存
            var isOrderStockCread = await _outOrderAndStockRepository.AddDataAsync(orderStocks) > 0;
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务添加订单库存", isOrderStockCread);
            // åˆ›å»ºä»»åŠ¡
            var isTaskCreated = await _taskRepository.Create(tasks);
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务创建任务", isTaskCreated);
            // æäº¤æˆ–回滚事务
            if (isStockUpdated && isTaskCreated && isOrderUpdated && isOrderStockCread)
            {
                LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "数据处理完成,提交事务", "无参数");
                _unitOfWorkManage.CommitTran();
            }
            else
            {
                LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "添加数据库失败,请检查数据是否正确,数据回滚", $"更新库存:{isStockUpdated},更新订单:{isOrderUpdated},添加订单库存:{isOrderStockCread},创建任务:{isTaskCreated}");
                _unitOfWorkManage.RollbackTran();
                throw new Exception("添加数据库失败,请检查数据是否正确,数据回滚");
            }
            return content.OK(data: orderStocks);
        }
        catch (Exception ex)
        {
            _unitOfWorkManage.RollbackTran();
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, $"系统异常,异常信息:{ex.Message}", "无参数");
            return content.Error(ex.Message);
        }
    }
    /// <summary>
    /// ä¿®æ”¹å‡ºåº“订单(导航修改)
    /// </summary>
    /// <param name="outOrder"></param>
    /// <returns>是否成功</returns>
    public async Task<bool> OutOrderUpdated(Dt_OutOrder outOrder)
    public async Task<bool> OutOrderUpdatedAsync(Dt_OutOrder outOrder)
    {
        return await BaseDal.OutOrderUpdated(outOrder);
        return await BaseDal.OutOrderUpdatedAsync(outOrder);
    }
    #region å†…部调用
    /// <summary>
    /// ä¸€æ·±ä½ä¼˜å…ˆæŸ¥æ‰¾
    /// </summary>
    /// <param name="filteredStocks">可出库库存</param>
    /// <returns>排序好的出库库存</returns>
    public List<Dt_BillGroupStock> PickStocks(List<Dt_BillGroupStock> filteredStocks)
    {
        var oneDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == "一深位").ToList();
        var twoDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == "二深位").ToList();
        var results = new List<Dt_BillGroupStock>();
        foreach (var oneDepth in oneDepthList)
        {
            // å°† Line å­—符串转换为整数
            if (!int.TryParse(oneDepth.LocationInfo.Line, out int oneDepthLine))
            {
                continue; // å¦‚果转换失败,跳过这个记录
            }
            // è®¡ç®—相对行
            int relativeLine = oneDepthLine % 2 == 1 ? oneDepthLine + 1 : oneDepthLine - 1;
            // æŸ¥æ‰¾æœ€æŽ¥è¿‘的二深位记录
            var closestTwoDepth = twoDepthList
                .Where(t => t.LocationInfo.Line == relativeLine.ToString())
                .Where(x => x.LocationInfo.Column == oneDepth.LocationInfo.Column)
                .Where(x => x.LocationInfo.Layer == oneDepth.LocationInfo.Layer)
                .FirstOrDefault();
            // å¦‚果找到了最接近的二深位记录,将其与一深位一起添加到结果列表
            if (closestTwoDepth != null)
            {
                results.Add(oneDepth);
                results.Add(closestTwoDepth);
            }
            else
            {
                // å¦‚果没有找到最接近的二深位记录,将一深位添加到结果列表
                results.Add(oneDepth);
            }
        }
        return results;
    }
    #endregion å†…部调用
    #region ç§æœ‰æ–¹æ³•
@@ -182,8 +388,9 @@
        {
            OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(),
            WarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0,
            Status = mainData.GetValueOrDefault("Status")?.ToString(),
            Status = (int)OutOrderTypeEnum.Issue,
            Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(),
            CreateID = 1,
            Creater = mainData.GetValueOrDefault("Creater")?.ToString(),
            CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
            OrderDate = mainData.GetValueOrDefault("OrderDate")?.ObjToDate() ?? DateTime.Now,
@@ -202,11 +409,10 @@
            {
                MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0,
                Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0,
                UnitPrice = item.GetValueOrDefault("UnitPrice")?.ObjToDecimal(),
                TotalPrice = item.GetValueOrDefault("TotalPrice")?.ObjToDecimal(),
                Remarks = item.GetValueOrDefault("Remarks")?.ToString(),
                CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
                Creater = item.GetValueOrDefault("Creater")?.ToString(),
                CreateID = 1,
                BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(),
            };
            details.Add(detail);
@@ -227,6 +433,7 @@
            OrderDate = DateTime.Now,
            OrderNumber = production.OrderNumber,
            Remarks = production.Remarks,
            CreateID = 1,
            WarehouseId = production.WarehouseId,
        };
    }
@@ -249,6 +456,7 @@
                MaterialId = item.MaterialId,
                OutboundQuantity = item.Quantity,
                Remarks = item.Remarks,
                CreateID = 1,
                MaterialName = item.Remarks // ç‰©æ–™åç§°
            };
            orderDetails.Add(detail);
@@ -261,7 +469,7 @@
    #region è°ƒæ‹¨å‡ºåº“单
    /// <summary>
    /// æ ¹æ®ä¸»æ•°æ®æž„建生产出库单对象。
    /// æ ¹æ®ä¸»æ•°æ®æž„建调拨出库单对象。
    /// </summary>
    private Dt_OutOrderTransfer CreateTransferOrder(Dictionary<string, object> mainData)
    {
@@ -270,7 +478,8 @@
            OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(),
            SourceWarehouseId = mainData.GetValueOrDefault("SourceWarehouseId")?.ObjToInt() ?? 0,
            DestinationWarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0,
            Status = mainData.GetValueOrDefault("Status")?.ToString(),
            Status = (int)OutOrderTypeEnum.Allocate,
            CreateID = 1,
            Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(),
            Creater = mainData.GetValueOrDefault("Creater")?.ToString(),
            CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
@@ -279,7 +488,7 @@
    }
    /// <summary>
    /// æ ¹æ®æ˜Žç»†æ•°æ®å’Œç”Ÿäº§å‡ºåº“单ID构建生产出库单明细列表。
    /// æ ¹æ®æ˜Žç»†æ•°æ®å’Œè°ƒæ‹¨å‡ºåº“单ID构建调拨出库单明细列表。
    /// </summary>
    private List<Dt_OutOrderTransferDetail> CreateTransferDetails(List<Dictionary<string, object>> detailData)
    {
@@ -290,11 +499,10 @@
            {
                MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0,
                Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0,
                UnitPrice = item.GetValueOrDefault("UnitPrice")?.ObjToDecimal(),
                TotalPrice = item.GetValueOrDefault("TotalPrice")?.ObjToDecimal(),
                Remarks = item.GetValueOrDefault("Remarks")?.ToString(),
                CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
                Creater = item.GetValueOrDefault("Creater")?.ToString(),
                CreateID = 1,
                BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(),
            };
            details.Add(detail);
@@ -312,6 +520,7 @@
            Status = transfer.Status,
            CreateDate = DateTime.Now,
            Creater = transfer.Creater,
            CreateID = 1,
            OrderDate = DateTime.Now,
            OrderNumber = transfer.OrderNumber,
            Remarks = transfer.Remarks,
@@ -334,6 +543,7 @@
                CompletedQuantity = 0,
                CreateDate = item.CreateDate,
                Creater = item.Creater,
                CreateID = 1,
                MaterialId = item.MaterialId,
                OutboundQuantity = item.Quantity,
                Remarks = item.Remarks,
@@ -346,5 +556,115 @@
    #endregion è°ƒæ‹¨å‡ºåº“单
    #region å‡ºåº“分配
    /// <summary>
    /// åˆ›å»ºä»»åŠ¡åˆ—è¡¨
    /// </summary>
    /// <param name="order">订单对象</param>
    /// <param name="filteredStocks">筛选后的库存列表</param>
    /// <returns>【任务列表,更新分配数量订单,创建任务的库存】</returns>
    private (List<Dt_Task>, Dt_OutOrder, List<Dt_BillGroupStock>) CreateTasks(Dt_OutOrder order, List<Dt_BillGroupStock> filteredStocks)
    {
        var tasks = new List<Dt_Task>();
        var stocks = new List<Dt_BillGroupStock>();
        foreach (var stock in filteredStocks)
        {
            // å¦‚果已分配数量达到出库数量,停止分配
            if (order.OrderDetailList.AllocatedQuantity >= order.OrderDetailList.OutboundQuantity)
                break;
            // å¦‚果托盘任务已存在,跳过
            if (_taskRepository.QueryFirst(x => x.PalletCode == stock.PalletCode) != null)
                continue;
            // åˆ›å»ºä»»åŠ¡
            tasks.Add(new Dt_Task
            {
                CreateDate = DateTime.Now, // åˆ›å»ºæ—¶é—´
                Creater = App.User.UserName, // åˆ›å»ºäºº
                CurrentAddress = stock.LocationCode, //当前位置
                Dispatchertime = DateTime.Now, //调度时间(任务下发时间)
                Grade = 1, // ç­‰çº§
                InboundNo = stock.OrderNo, //单据编号
                MaterialNo = stock.MaterialNo, // ç‰©æ–™å·
                NextAddress = stock.LocationCode, // ä¸‹ä¸€ä½ç½®
                PalletCode = stock.PalletCode, //托盘号
                Remark = stock.Remark, //备注
                Roadway = stock.LocationInfo.Roadway, //巷道
                SourceAddress = stock.LocationCode, //来源位置
                TargetAddress = order.OrderDetailList.Remarks, //目标地址
                TaskNum = _taskRepository.GetTaskNo().Result, //任务号
                TaskState = (int)OutTaskStatusEnum.OutNew, //任务状态
                TaskType = (int)TaskTypeEnum.Outbound, //任务类型
            });
            // æ›´æ–°å·²åˆ†é…æ•°é‡
            order.OrderDetailList.AllocatedQuantity += stock.Dt_BillGroupStockDetailList.Sum(x => x.PalletQuantity).Value;
            stocks.Add(stock);
        }
        return (tasks, order, stocks);
    }
    /// <summary>
    /// æ›´æ–°åº“存状态
    /// </summary>
    /// <param name="filteredStocks">筛选后的库存列表</param>
    /// <returns>更新后的库存列表</returns>
    private List<Dt_BillGroupStock> UpdateStocks(List<Dt_BillGroupStock> filteredStocks)
    {
        var updatedStocks = new List<Dt_BillGroupStock>();
        foreach (var stock in filteredStocks)
        {
            // æ›´æ–°åº“存状态
            stock.LocationInfo.IsLocked = true;
            stock.LocationInfo.Status = (int)LocationEnum.Lock;
            stock.State = (int)StockStateEmun.出库锁定;
            updatedStocks.Add(stock);
        }
        return updatedStocks;
    }
    /// <summary>
    /// åˆ›å»ºè®¢å•库存列表
    /// </summary>
    /// <param name="stock">筛选后的库存列表</param>
    /// <param name="order">订单对象</param>
    /// <returns>订单库存列表</returns>
    private List<Dt_OutOrderAndStock> CreateOrderStock(List<Dt_BillGroupStock> stock, Dt_OutOrder order)
    {
        var orderStocks = new List<Dt_OutOrderAndStock>();
        foreach (var item in stock)
        {
            orderStocks.Add(new Dt_OutOrderAndStock()
            {
                AllocatedQuantity = order.OrderDetailList.AllocatedQuantity,
                MaterialNo = item.MaterialNo,
                MaterialName = order.OrderDetailList.MaterialName,
                OrderNumber = order.OrderNumber,
                OutboundQuantity = order.OrderDetailList.OutboundQuantity,
                PalletCode = item.PalletCode,
                PalletQuantity = item.Dt_BillGroupStockDetailList.Sum(x => x.PalletQuantity),
                State = item.State,
                BatchNumber = order.OrderDetailList.BatchNumber,
                CompletedQuantity = order.OrderDetailList.CompletedQuantity,
                Creater = App.User.UserName,
                CreateDate = DateTime.Now,
                CreateID = App.User.UserId,
                GroupId = item.GroupId,
                LocationCode = item.LocationInfo.LocationCode,
                OutOrderId = order.Id,
            });
        }
        return orderStocks;
    }
    #endregion å‡ºåº“分配
    #endregion ç§æœ‰æ–¹æ³•
}