using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Helper; using WIDESEA_IRepository; using WIDESEA_IServices; using WIDESEA_Model.Models; namespace WIDESEA_Services { public class Dt_OutOrderService : ServiceBase, 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; } /// /// 添加生产出库单 /// /// 出库数据 /// 成功或失败 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); } } /// /// 添加调拨出库单 /// /// 出库数据 /// 成功或失败 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); } } /// /// 根据出库单号查询出库订单 /// /// 出库单号 /// 出库订单 public WebResponseContent GetOutOrderByNumber(string orderNumber) { WebResponseContent content = new WebResponseContent(); var order = Db.Queryable() .Includes(x => x.OrderDetailList) .Where(x => x.OrderNumber == orderNumber).First(); if (order == null) content.Error($"订单编号{orderNumber}查询为空"); else content.OK("查询成功", order); return content; } /// /// 修改出库订单(导航修改) /// /// /// 是否成功 public async Task OutOrderUpdated(Dt_OutOrder outOrder) { return await BaseDal.OutOrderUpdated(outOrder); } #region 私有方法 #region 生产出库单 /// /// 根据主数据构建生产出库单对象。 /// private Dt_OutOrderProduction CreateProductionOrder(Dictionary 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, }; } /// /// 根据明细数据和生产出库单ID构建生产出库单明细列表。 /// private List CreateProductionDetails(List> detailData) { var details = new List(); 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; } /// /// 根据生产出库单对象和生产出库单ID构建系统出库单对象。 /// 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, }; } /// /// 根据生产出库单明细列表和系统出库单ID构建系统出库单明细列表。 /// private List CreateSystemOrderDetails(List productionDetails) { var orderDetails = new List(); 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 调拨出库单 /// /// 根据主数据构建生产出库单对象。 /// private Dt_OutOrderTransfer CreateTransferOrder(Dictionary 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, }; } /// /// 根据明细数据和生产出库单ID构建生产出库单明细列表。 /// private List CreateTransferDetails(List> detailData) { var details = new List(); 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; } /// /// 根据生产出库单对象和生产出库单ID构建系统出库单对象。 /// 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, }; } /// /// 根据生产出库单明细列表和系统出库单ID构建系统出库单明细列表。 /// private List CreateSystemOrderDetails(List transferDetails) { var orderDetails = new List(); 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 私有方法 } }