namespace WIDESEA_StorageOutOrderServices; 
 | 
  
 | 
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 IStockInfoRepository _stockInfoRepository; 
 | 
    private readonly IDt_OutOrderAndStockRepository _outOrderAndStockRepository; 
 | 
    private readonly IDt_TaskRepository _taskRepository; 
 | 
  
 | 
    public Dt_OutOrderService(IDt_OutOrderRepository BaseDal, 
 | 
                              IUnitOfWorkManage unitOfWorkManage, 
 | 
                              IDt_OutOrderProductionService outOrderProductionService, 
 | 
                              IDt_OutOrderProductionDetailService outOrderProductionDetailService, 
 | 
                              IDt_OutOrderDtailService outOrderDtailService, 
 | 
                              IDt_OutOrderTransferDetailRepository outOrderTransferDetailRepository, 
 | 
                              IDt_OutOrderTransferRepository outOrderTransferRepository, 
 | 
                              IDt_MaterielInfoRepository materielInfoRepository, 
 | 
                              IStockInfoRepository stockInfoRepository, 
 | 
                              IDt_OutOrderAndStockRepository outOrderAndStockRepository, 
 | 
                              IDt_TaskRepository taskRepository) : base(BaseDal) 
 | 
    { 
 | 
        _unitOfWorkManage = unitOfWorkManage; 
 | 
        _outOrderProductionService = outOrderProductionService; 
 | 
        _outOrderProductionDetailService = outOrderProductionDetailService; 
 | 
        _outOrderDtailService = outOrderDtailService; 
 | 
        _OutOrderTransferDetailRepository = outOrderTransferDetailRepository; 
 | 
        _OutOrderTransferRepository = outOrderTransferRepository; 
 | 
        _materielInfoRepository = materielInfoRepository; 
 | 
        _stockInfoRepository = stockInfoRepository; 
 | 
        _outOrderAndStockRepository = outOrderAndStockRepository; 
 | 
        _taskRepository = taskRepository; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 添加生产出库单 
 | 
    /// </summary> 
 | 
    /// <param name="model">出库数据</param> 
 | 
    /// <returns>成功或失败</returns> 
 | 
    public WebResponseContent AddOutOrderProduction(SaveModel model) 
 | 
    { 
 | 
        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 
 | 
            { 
 | 
                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)); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 添加调拨出库单 
 | 
    /// </summary> 
 | 
    /// <param name="model">出库数据</param> 
 | 
    /// <returns>成功或失败</returns> 
 | 
    public WebResponseContent AddOutOrderTransfer(SaveModel model) 
 | 
    { 
 | 
        WebResponseContent content = new WebResponseContent(); 
 | 
        try 
 | 
        { 
 | 
            // 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 
 | 
            { 
 | 
                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); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 根据出库单号查询出库订单 
 | 
    /// </summary> 
 | 
    /// <param name="orderNumber">出库单号</param> 
 | 
    /// <returns>出库订单</returns> 
 | 
    public WebResponseContent GetOutOrderByNumber(string orderNumber) 
 | 
    { 
 | 
        WebResponseContent content = new WebResponseContent(); 
 | 
        var order = Db.Queryable<Dt_OutOrder>() 
 | 
             .Includes(x => x.OrderDetailList) 
 | 
             .Where(x => x.OrderNumber == orderNumber).First(); 
 | 
        if (order == null) 
 | 
            content.Error($"订单编号{orderNumber}查询为空"); 
 | 
        else 
 | 
            content.OK("查询成功", order); 
 | 
        return content; 
 | 
    } 
 | 
  
 | 
    /// <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 = await _stockInfoRepository.QueryDataAsync(x => true); 
 | 
            filteredStocks.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 = _stockInfoRepository.UpdateData(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> OutOrderUpdatedAsync(Dt_OutOrder outOrder) 
 | 
    { 
 | 
        return await BaseDal.OutOrderUpdatedAsync(outOrder); 
 | 
    } 
 | 
  
 | 
    #region 内部调用 
 | 
  
 | 
    /// <summary> 
 | 
    /// 一深位优先查找 
 | 
    /// </summary> 
 | 
    /// <param name="filteredStocks">可出库库存</param> 
 | 
    /// <returns>排序好的出库库存</returns> 
 | 
    public List<DtStockInfo> PickStocks(List<DtStockInfo> filteredStocks) 
 | 
    { 
 | 
        var oneDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == 1).ToList(); 
 | 
        var twoDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == 2).ToList(); 
 | 
  
 | 
        var results = new List<DtStockInfo>(); 
 | 
        foreach (var oneDepth in oneDepthList) 
 | 
        { 
 | 
            // 将 Line 字符串转换为整数 
 | 
            int oneDepthLine = oneDepth.LocationInfo.Row; 
 | 
  
 | 
            // 计算相对行 
 | 
            int relativeLine = oneDepthLine % 2 == 1 ? oneDepthLine + 1 : oneDepthLine - 1; 
 | 
  
 | 
            // 查找最接近的二深位记录 
 | 
            var closestTwoDepth = twoDepthList 
 | 
                .Where(t => t.LocationInfo.Row == relativeLine) 
 | 
                .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 私有方法 
 | 
  
 | 
    #region 生产出库单 
 | 
  
 | 
    /// <summary> 
 | 
    /// 根据主数据构建生产出库单对象。 
 | 
    /// </summary> 
 | 
    private Dt_OutOrderProduction CreateProductionOrder(Dictionary<string, object> mainData) 
 | 
    { 
 | 
        return new Dt_OutOrderProduction 
 | 
        { 
 | 
            OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(), 
 | 
            WarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0, 
 | 
            Status = (int)OutOrderTypeEnum.Issue, 
 | 
            Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(), 
 | 
            Creater = mainData.GetValueOrDefault("Creater")?.ToString(), 
 | 
            CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now, 
 | 
            OrderDate = mainData.GetValueOrDefault("OrderDate")?.ObjToDate() ?? DateTime.Now, 
 | 
        }; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 根据明细数据和生产出库单ID构建生产出库单明细列表。 
 | 
    /// </summary> 
 | 
    private List<Dt_OutOrderProductionDetail> CreateProductionDetails(List<Dictionary<string, object>> detailData) 
 | 
    { 
 | 
        var details = new List<Dt_OutOrderProductionDetail>(); 
 | 
        foreach (var item in detailData) 
 | 
        { 
 | 
            var detail = new Dt_OutOrderProductionDetail 
 | 
            { 
 | 
                MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0, 
 | 
                Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0, 
 | 
                Remarks = item.GetValueOrDefault("Remarks")?.ToString(), 
 | 
                CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now, 
 | 
                Creater = item.GetValueOrDefault("Creater")?.ToString(), 
 | 
                BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(), 
 | 
            }; 
 | 
            details.Add(detail); 
 | 
        } 
 | 
        return details; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 根据生产出库单对象和生产出库单ID构建系统出库单对象。 
 | 
    /// </summary> 
 | 
    private Dt_OutOrder CreateSystemOrder(Dt_OutOrderProduction production) 
 | 
    { 
 | 
        return new Dt_OutOrder 
 | 
        { 
 | 
            Status = production.Status, 
 | 
            CreateDate = DateTime.Now, 
 | 
            Creater = production.Creater, 
 | 
            OrderDate = DateTime.Now, 
 | 
            OrderNumber = production.OrderNumber, 
 | 
            Remarks = production.Remarks, 
 | 
            WarehouseId = production.WarehouseId, 
 | 
        }; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 根据生产出库单明细列表和系统出库单ID构建系统出库单明细列表。 
 | 
    /// </summary> 
 | 
    private List<Dt_OutOrderDetail> CreateSystemOrderDetails(List<Dt_OutOrderProductionDetail> productionDetails) 
 | 
    { 
 | 
        var orderDetails = new List<Dt_OutOrderDetail>(); 
 | 
        foreach (var item in productionDetails) 
 | 
        { 
 | 
            var detail = new Dt_OutOrderDetail 
 | 
            { 
 | 
                AllocatedQuantity = 0, 
 | 
                BatchNumber = item.BatchNumber, 
 | 
                CompletedQuantity = 0, 
 | 
                CreateDate = item.CreateDate, 
 | 
                Creater = item.Creater, 
 | 
                MaterialId = item.MaterialId, 
 | 
                OutboundQuantity = item.Quantity, 
 | 
                Remarks = item.Remarks, 
 | 
                MaterialName = item.Remarks // 物料名称 
 | 
            }; 
 | 
            orderDetails.Add(detail); 
 | 
        } 
 | 
        return orderDetails; 
 | 
    } 
 | 
  
 | 
    #endregion 生产出库单 
 | 
  
 | 
    #region 调拨出库单 
 | 
  
 | 
    /// <summary> 
 | 
    /// 根据主数据构建调拨出库单对象。 
 | 
    /// </summary> 
 | 
    private Dt_OutOrderTransfer CreateTransferOrder(Dictionary<string, object> mainData) 
 | 
    { 
 | 
        return new Dt_OutOrderTransfer 
 | 
        { 
 | 
            OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(), 
 | 
            SourceWarehouseId = mainData.GetValueOrDefault("SourceWarehouseId")?.ObjToInt() ?? 0, 
 | 
            DestinationWarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0, 
 | 
            Status = (int)OutOrderTypeEnum.Allocate, 
 | 
            Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(), 
 | 
            Creater = mainData.GetValueOrDefault("Creater")?.ToString(), 
 | 
            CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now, 
 | 
            OrderDate = mainData.GetValueOrDefault("OrderDate")?.ObjToDate() ?? DateTime.Now, 
 | 
        }; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 根据明细数据和调拨出库单ID构建调拨出库单明细列表。 
 | 
    /// </summary> 
 | 
    private List<Dt_OutOrderTransferDetail> CreateTransferDetails(List<Dictionary<string, object>> detailData) 
 | 
    { 
 | 
        var details = new List<Dt_OutOrderTransferDetail>(); 
 | 
        foreach (var item in detailData) 
 | 
        { 
 | 
            var detail = new Dt_OutOrderTransferDetail 
 | 
            { 
 | 
                MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0, 
 | 
                Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0, 
 | 
                Remarks = item.GetValueOrDefault("Remarks")?.ToString(), 
 | 
                CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now, 
 | 
                Creater = item.GetValueOrDefault("Creater")?.ToString(), 
 | 
                BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(), 
 | 
            }; 
 | 
            details.Add(detail); 
 | 
        } 
 | 
        return details; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 根据生产出库单对象和生产出库单ID构建系统出库单对象。 
 | 
    /// </summary> 
 | 
    private Dt_OutOrder CreateSystemOrder(Dt_OutOrderTransfer transfer) 
 | 
    { 
 | 
        return new Dt_OutOrder 
 | 
        { 
 | 
            Status = transfer.Status, 
 | 
            CreateDate = DateTime.Now, 
 | 
            Creater = transfer.Creater, 
 | 
            OrderDate = DateTime.Now, 
 | 
            OrderNumber = transfer.OrderNumber, 
 | 
            Remarks = transfer.Remarks, 
 | 
            WarehouseId = transfer.SourceWarehouseId, 
 | 
        }; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 根据生产出库单明细列表和系统出库单ID构建系统出库单明细列表。 
 | 
    /// </summary> 
 | 
    private List<Dt_OutOrderDetail> CreateSystemOrderDetails(List<Dt_OutOrderTransferDetail> transferDetails) 
 | 
    { 
 | 
        var orderDetails = new List<Dt_OutOrderDetail>(); 
 | 
        foreach (var item in transferDetails) 
 | 
        { 
 | 
            var detail = new Dt_OutOrderDetail 
 | 
            { 
 | 
                AllocatedQuantity = 0, 
 | 
                BatchNumber = item.BatchNumber, 
 | 
                CompletedQuantity = 0, 
 | 
                CreateDate = item.CreateDate, 
 | 
                Creater = item.Creater, 
 | 
                MaterialId = item.MaterialId, 
 | 
                OutboundQuantity = item.Quantity, 
 | 
                Remarks = item.Remarks, 
 | 
                MaterialName = item.Remarks // 物料名称 
 | 
            }; 
 | 
            orderDetails.Add(detail); 
 | 
        } 
 | 
        return orderDetails; 
 | 
    } 
 | 
  
 | 
    #endregion 调拨出库单 
 | 
  
 | 
    #region 出库分配 
 | 
  
 | 
    /// <summary> 
 | 
    /// 创建任务列表 
 | 
    /// </summary> 
 | 
    /// <param name="order">订单对象</param> 
 | 
    /// <param name="filteredStocks">筛选后的库存列表</param> 
 | 
    /// <returns>【任务列表,更新分配数量订单,创建任务的库存】</returns> 
 | 
    private (List<Dt_Task>, Dt_OutOrder, List<DtStockInfo>) CreateTasks(Dt_OutOrder order, List<DtStockInfo> filteredStocks) 
 | 
    { 
 | 
        var tasks = new List<Dt_Task>(); 
 | 
        var stocks = new List<DtStockInfo>(); 
 | 
  
 | 
        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, // 等级 
 | 
                MaterialNo = stock.StockInfoDetails[0].MaterielCode, // 物料号 
 | 
                NextAddress = stock.LocationCode, // 下一位置 
 | 
                PalletCode = stock.PalletCode, //托盘号 
 | 
                Remark = stock.Remark, //备注 
 | 
                Roadway = stock.LocationInfo.RoadwayNo, //巷道 
 | 
                SourceAddress = stock.LocationCode, //来源位置 
 | 
                TargetAddress = order.OrderDetailList.Remarks, //目标地址 
 | 
                TaskNum = _taskRepository.GetTaskNo().Result, //任务号 
 | 
                TaskState = (int)TaskOutStatusEnum.OutNew, //任务状态 
 | 
                TaskType = (int)TaskTypeEnum.Outbound, //任务类型 
 | 
            }); 
 | 
  
 | 
            // 更新已分配数量 
 | 
            order.OrderDetailList.AllocatedQuantity += stock.StockInfoDetails.Sum(x => x.StockQuantity); 
 | 
            stocks.Add(stock); 
 | 
        } 
 | 
  
 | 
        return (tasks, order, stocks); 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 更新库存状态 
 | 
    /// </summary> 
 | 
    /// <param name="filteredStocks">筛选后的库存列表</param> 
 | 
    /// <returns>更新后的库存列表</returns> 
 | 
    private List<DtStockInfo> UpdateStocks(List<DtStockInfo> filteredStocks) 
 | 
    { 
 | 
        var updatedStocks = new List<DtStockInfo>(); 
 | 
  
 | 
        foreach (var stock in filteredStocks) 
 | 
        { 
 | 
            // 更新库存状态 
 | 
            stock.LocationInfo.LocationStatus = (int)LocationEnum.Lock; 
 | 
            stock.StockInfoDetails.ForEach(x => 
 | 
            { 
 | 
                x.Status = (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<DtStockInfo> 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.StockInfoDetails[0].MaterielCode, 
 | 
                MaterialName = order.OrderDetailList.MaterialName, 
 | 
                OrderNumber = order.OrderNumber, 
 | 
                OutboundQuantity = order.OrderDetailList.OutboundQuantity, 
 | 
                PalletCode = item.PalletCode, 
 | 
                PalletQuantity = item.StockInfoDetails.Sum(x => x.StockQuantity), 
 | 
                State = item.StockInfoDetails[0].Status, 
 | 
                BatchNumber = order.OrderDetailList.BatchNumber, 
 | 
                CompletedQuantity = order.OrderDetailList.CompletedQuantity, 
 | 
                Creater = App.User.UserName, 
 | 
                CreateDate = DateTime.Now, 
 | 
                GroupId = item.Id, 
 | 
                LocationCode = item.LocationInfo.LocationCode, 
 | 
                OutOrderId = order.Id, 
 | 
            }); 
 | 
        } 
 | 
  
 | 
        return orderStocks; 
 | 
    } 
 | 
  
 | 
    #endregion 出库分配 
 | 
  
 | 
    #endregion 私有方法 
 | 
} 
 |