namespace WIDESEA_StorageOutOrderServices;
|
|
public class Dt_OutOrderService : ServiceBase<Dt_OutOrder, IDt_OutOrderRepository>, IDt_OutOrderService
|
{
|
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;
|
|
public Dt_OutOrderService(IDt_OutOrderRepository BaseDal,
|
IUnitOfWorkManage unitOfWorkManage,
|
IDt_OutOrderProductionService outOrderProductionService,
|
IDt_OutOrderProductionDetailService outOrderProductionDetailService,
|
IDt_OutOrderDtailService outOrderDtailService,
|
IDt_OutOrderTransferDetailRepository outOrderTransferDetailRepository,
|
IDt_OutOrderTransferRepository outOrderTransferRepository) : base(BaseDal)
|
{
|
_unitOfWorkManage = unitOfWorkManage;
|
_outOrderProductionService = outOrderProductionService;
|
_outOrderProductionDetailService = outOrderProductionDetailService;
|
_outOrderDtailService = outOrderDtailService;
|
_OutOrderTransferDetailRepository = outOrderTransferDetailRepository;
|
_OutOrderTransferRepository = outOrderTransferRepository;
|
}
|
|
/// <summary>
|
/// 添加生产出库单
|
/// </summary>
|
/// <param name="model">出库数据</param>
|
/// <returns>成功或失败</returns>
|
public WebResponseContent AddOutOrderProduction(SaveModel model)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
// 1. 构建生产出库单对象
|
var production = CreateProductionOrder(model.MainData);
|
|
// 2. 构建生产出库单明细列表
|
var productionDetails = CreateProductionDetails(model.DetailData);
|
|
// 3. 构建系统出库单对象
|
var order = CreateSystemOrder(production);
|
|
// 4. 构建系统出库单明细列表
|
var orderDetails = CreateSystemOrderDetails(productionDetails);
|
|
// 开启事务
|
_unitOfWorkManage.BeginTran();
|
// 5. 添加生产出库单并获取主键ID
|
var productionId = _outOrderProductionService.AddOrderProduction(production);
|
|
// 6. 生产出库单明细绑定主表ID
|
productionDetails.ForEach(item => { item.ProductionOutOrderId = productionId; });
|
|
// 7. 添加生产出库单明细
|
var detailAddResult = _outOrderProductionDetailService.AddData(productionDetails);
|
|
// 8. 系统出库单绑定生产出库单ID
|
order.UpperOutOrderId = productionId;
|
|
// 9. 添加系统出库单并获取主键ID
|
var orderId = BaseDal.AddData(order);
|
|
// 10 . 系统出库单明细绑定主表ID
|
orderDetails.ForEach(item => { item.OutOrderId = orderId; });
|
|
// 11. 添加系统出库单明细并返回结果
|
content = _outOrderDtailService.AddData(orderDetails);
|
if (content.Status && productionId > 0 && detailAddResult.Status && orderId > 0)
|
_unitOfWorkManage.CommitTran(); // 提交事务
|
else
|
throw new Exception("出库单添加失败");
|
|
return content;
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran(); // 回滚事务
|
return content.Error(ex.Message);
|
}
|
}
|
|
/// <summary>
|
/// 添加调拨出库单
|
/// </summary>
|
/// <param name="model">出库数据</param>
|
/// <returns>成功或失败</returns>
|
public WebResponseContent AddOutOrderTransfer(SaveModel model)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
// 1. 构建调拨出库单对象
|
var transfer = CreateTransferOrder(model.MainData);
|
|
// 2. 构建调拨出库单明细列表
|
var transferDetail = CreateTransferDetails(model.DetailData);
|
|
// 3. 构建系统出库单对象
|
var order = CreateSystemOrder(transfer);
|
|
// 4. 构建系统出库单明细列表
|
var orderDetails = CreateSystemOrderDetails(transferDetail);
|
|
// 添加事务
|
_unitOfWorkManage.BeginTran();
|
|
// 5. 添加调拨出库单并获取主键ID
|
var transferId = _OutOrderTransferRepository.AddData(transfer);
|
|
// 6. 调拨出库单明细绑定主表ID
|
transferDetail.ForEach(item => { item.TransferOutOrderId = transferId; });
|
|
// 7. 添加生产出库单明细
|
var detailAddResult = _OutOrderTransferDetailRepository.AddData(transferDetail);
|
|
// 8. 系统出库单绑定调拨出库单ID
|
order.UpperOutOrderId = transferId;
|
|
// 9. 添加系统出库单并获取主键ID
|
var orderId = BaseDal.AddData(order);
|
|
// 10 . 系统出库单明细绑定主表ID
|
orderDetails.ForEach(item => { item.OutOrderId = orderId; });
|
|
// 11. 添加系统出库单明细并返回结果
|
content = _outOrderDtailService.AddData(orderDetails);
|
if (content.Status && transferId > 0 && detailAddResult > 0 && orderId > 0)
|
_unitOfWorkManage.CommitTran(); // 提交事务
|
else
|
throw new Exception("出库单添加失败");
|
return content;
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran(); // 回滚事务
|
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="outOrder"></param>
|
/// <returns>是否成功</returns>
|
public async Task<bool> OutOrderUpdated(Dt_OutOrder outOrder)
|
{
|
return await BaseDal.OutOrderUpdated(outOrder);
|
}
|
|
#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 = mainData.GetValueOrDefault("Status")?.ToString(),
|
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,
|
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(),
|
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 = mainData.GetValueOrDefault("Status")?.ToString(),
|
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,
|
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(),
|
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 调拨出库单
|
|
#endregion 私有方法
|
}
|