using System.Globalization; using MES.Service.DB; using MES.Service.Dto.webApi; using MES.Service.Modes; using SqlSugar; namespace MES.Service.service; /// /// 出货计划出货服务管理类 /// public class ShipmentPlanDeliveryManager : Repository { private readonly ShipmentPlanDeliveryDetailManager _detailManager = new(); /// /// 保存出货计划出货数据 /// public bool Save(ErpShipmentPlanDelivery data) { var headerDto = data.OrderDto; var header = ConvertDtoToHeader(data.OrderDto); var details = ConvertDtoToDetails(data.Items); return UseTransaction(db => { switch (headerDto.Type) { case "3": return UpdateData(db, header, details) ? 1 : 0; case "2": case "4": return SaveOrUpdateData(db, header, details) ? 1 : 0; default: throw new NotImplementedException($"不支持的接口类型: {headerDto.Type}"); } }) > 0; } /// /// 更新数据 /// private bool UpdateData(SqlSugarScope db, ShipmentPlanDelivery header, List details) { // 检查是否已生成出库单 var outCount = Db.Ado.SqlQuery( "SELECT COUNT(*) FROM MES_INV_ITEM_OUTS A WHERE A.WORK_NO = :billNo AND A.BILL_TYPE_ID = 200 AND A.TRANSACTION_NO = 250", new { billNo = header.BillNo }).First(); if (outCount > 0) { throw new NotImplementedException("该出货单已生成出库单,不能修改!"); } // 删除原有数据 var deleteHeader = base.DeleteById(header.Id); var detailIds = details.Select(d => d.Id).ToArray(); var deleteDetails = db.Deleteable().In(detailIds).ExecuteCommand() > 0; if (deleteHeader && deleteDetails) { return true; } throw new NotImplementedException("更新失败"); } /// /// 插入或更新数据 /// private bool SaveOrUpdateData(SqlSugarScope db, ShipmentPlanDelivery header, List details) { // 检查是否已生成出库单 var outCount = Db.Ado.SqlQuery( "SELECT COUNT(*) FROM MES_INV_ITEM_OUTS A WHERE A.WORK_NO = :billNo AND A.BILL_TYPE_ID = 200 AND A.TRANSACTION_NO = 250", new { billNo = header.BillNo }).First(); if (outCount > 0) { throw new NotImplementedException("该出货单已生成出库单,不能修改!"); } // 如果存在则删除旧数据 if (header.Id != null) { base.DeleteById(header.Id); } if (details.Count > 0) { db.Deleteable() .Where(s => s.ErpHeadId == header.ErpHeadId) .ExecuteCommand(); } // 插入新数据并获取主表ID var headerId = base.InsertReturnIdentity(header); // 插入明细数据,关联主表ID if (headerId > 0) { foreach (var detail in details) { detail.HeadId = headerId; _detailManager.Insert(detail); } } return headerId > 0; } /// /// 批量保存 /// public bool SaveList(List dataList) { var result = dataList.Select(Save).ToList(); return result.All(b => b); } /// /// 转换DTO为主表实体 /// private ShipmentPlanDelivery ConvertDtoToHeader(ErpShipmentPlanDeliveryDto dto) { DateTime? ParseDateTime(string? dateStr) { if (string.IsNullOrEmpty(dateStr)) return null; if (DateTime.TryParseExact(dateStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsedDate)) { return parsedDate; } return null; } var entity = new ShipmentPlanDelivery { BillType = dto.BillType, BillNo = dto.BillNo, Customer = dto.Customer, FDate = ParseDateTime(dto.FDate), InterfaceStatus = dto.InterfaceStatus, Salesperson = dto.Salesperson, Department = dto.Department, SourceDocCategory = dto.SourceDocCategory, SourceDocument = dto.SourceDocument, Status = dto.Status, CreatedBy = dto.CreatedBy, CreatedDate = ParseDateTime(dto.CreatedDate), ApprovedBy = dto.ApprovedBy, ApprovedDate = ParseDateTime(dto.ApprovedDate), HeaderNote = dto.HeaderNote, Remark = dto.Remark, AsnNo = dto.AsnNo, Project = dto.Project, CustomerPo = dto.CustomerPo, ShippingPolicy = dto.ShippingPolicy, ShippingMethod = dto.ShippingMethod, DemandCategory = dto.DemandCategory, ShippingPort = dto.ShippingPort, DestinationPort = dto.DestinationPort, ErpHeadId = dto.ErpHeadId }; // 根据ErpHeadId查找是否已存在 var existing = base.GetSingle(it => it.ErpHeadId == dto.ErpHeadId); if (existing != null) { entity.Id = existing.Id; } // 验证必填项 if (string.IsNullOrEmpty(entity.ErpHeadId)) { throw new NotImplementedException("表头ErpHeadId不能为空"); } return entity; } /// /// 转换DTO为明细表实体列表 /// private List ConvertDtoToDetails(List dtoList) { var detailList = new List(); foreach (var dto in dtoList) { var detail = new ShipmentPlanDeliveryDetail { LineNo = dto.LineNo, Project = dto.Project, CustomerItemNo = dto.CustomerItemNo, CustomerItemName = dto.CustomerItemName, MaterialId = dto.MaterialId, MaterialName = dto.MaterialName, Specification = dto.Specification, StorageLocation = dto.StorageLocation, Unit = dto.Unit, Quantity = string.IsNullOrEmpty(dto.Quantity) ? null : Convert.ToDecimal(dto.Quantity), FreeItemType = dto.FreeItemType, DeliveryDate = dto.DeliveryDate, BodyNote = dto.BodyNote, AsnLineNo = dto.AsnLineNo, AvailableStock = dto.AvailableStock, InventoryQueryTime = dto.InventoryQueryTime, LineStatus = dto.LineStatus, ReceiverLocation = dto.ReceiverLocation, ReceiverAddress = dto.ReceiverAddress, ReceiverAddressFull = dto.ReceiverAddressFull, ReceiverContact = dto.ReceiverContact, Returnable = dto.Returnable, AvailableDate = dto.AvailableDate, CommitmentDate = dto.CommitmentDate, PlanShipDate = dto.PlanShipDate, CustomerConfirmDate = dto.CustomerConfirmDate, PlanOrg = dto.PlanOrg, VendorDirectShip = dto.VendorDirectShip, SupplySource = dto.SupplySource, SupplyType = dto.SupplyType, SupplyOrg = dto.SupplyOrg, Supplier = dto.Supplier, DetailShippingMethod = dto.DetailShippingMethod, OwnerOrg = dto.OwnerOrg, DetailDemandCategory = dto.DetailDemandCategory, InventoryPlanning = dto.InventoryPlanning, LineRemark = dto.LineRemark, SourceDocCategory = dto.SourceDocCategory, SourceDocNo = dto.SourceDocNo, SourceLineNo = dto.SourceLineNo, ErpLineId = dto.ErpLineId, ErpHeadId = dto.ErpHeadId }; // 验证必填项 if (string.IsNullOrEmpty(detail.ErpLineId)) { throw new NotImplementedException("明细行ErpLineId不能为空"); } if (string.IsNullOrEmpty(detail.ErpHeadId)) { throw new NotImplementedException("明细行ErpHeadId不能为空"); } // 根据ErpLineId查找是否已存在 var existing = _detailManager.GetSingle(it => it.ErpLineId == detail.ErpLineId); if (existing != null) { detail.Id = existing.Id; } // 物料ID映射转换(如果需要) if (!string.IsNullOrEmpty(dto.MaterialId) && !string.IsNullOrEmpty(dto.SupplyOrg)) { var materialLink = Db.Queryable() .Where(x => x.U9Id == dto.MaterialId && x.OrgId == dto.SupplyOrg && x.TableType == "MES_ITEMS") .First(); if (materialLink != null) { detail.MaterialId = materialLink.MesId; } } // 项目映射转换(如果需要) if (!string.IsNullOrEmpty(dto.Project) && !string.IsNullOrEmpty(dto.SupplyOrg)) { var projectLink = Db.Queryable() .Where(x => x.U9Id == dto.Project && x.OrgId == dto.SupplyOrg && x.TableType == "MES_PROJECT") .First(); if (projectLink != null) { detail.Project = projectLink.MesId; } } detailList.Add(detail); } return detailList; } } /// /// 出货计划出货明细管理类 /// public class ShipmentPlanDeliveryDetailManager : Repository { // 继承Repository基础增删改查方法 }