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 私有方法
|
}
|