using Masuit.Tools; using MES.Service.DB; using MES.Service.Dto.webApi; using MES.Service.Modes; using SqlSugar; using System.Globalization; namespace MES.Service.service.BasicData; public class MesDeliveryNoteManager : Repository { private readonly MesDeliveryNoteDetailManager deliveryNoteDetailManager = new(); /// /// 保存送货单数据 /// /// 送货单包装类(包含主表和明细数据) /// 是否保存成功 public bool Save(DeliveryNoteWrapper deliveryNoteWrapper) { var deliveryNote = deliveryNoteWrapper.DeliveryNote; var mesDeliveryNote = GetMesDeliveryNote(deliveryNote); var mesDeliveryNoteDetails = GetMesDeliveryNoticeDetails(deliveryNoteWrapper.DeliveryNoteDetails, mesDeliveryNote.DeliveryNo); return UseTransaction(db => { return deliveryNote.Type switch { "1" => SaveOrUpdateData(db, mesDeliveryNote, mesDeliveryNoteDetails) ? 1 : 0, "2" => UpdateData(db, mesDeliveryNote, mesDeliveryNoteDetails) ? 1 : 0, _ => throw new NotImplementedException($"未实现的类型:{deliveryNote.Type}") }; }) > 0; } /// /// 更新送货单数据 /// private bool UpdateData(SqlSugarScope db, MesDeliveryNotice mesDeliveryNote, List mesDeliveryNoteDetails) { var detailIds = mesDeliveryNoteDetails.Select(s => s.Guid).ToArray(); // 删除主表数据 var deleteMain = db.Deleteable().Where(a => a.DeliveryNo == mesDeliveryNote.DeliveryNo).ExecuteCommand() > 0; // 删除明细数据 var deleteDetails = db.Deleteable().Where(s => detailIds.Contains(s.Guid)).ExecuteCommand() > 0; if (deleteMain && deleteDetails) { return true; } throw new NotImplementedException("送货单更新失败"); } /// /// 保存或更新送货单数据 /// private bool SaveOrUpdateData(SqlSugarScope db, MesDeliveryNotice mesDeliveryNote, List mesDeliveryNoteDetails) { // 若存在则先删除主表数据 if (!mesDeliveryNote.DeliveryNo.IsNullOrEmpty()) { db.Deleteable().Where(s => s.DeliveryNo == mesDeliveryNote.DeliveryNo).ExecuteCommand(); } // 删除关联的明细数据 if (mesDeliveryNoteDetails.Count > 0) { db.Deleteable().Where(s => s.DeliveryNo == mesDeliveryNote.DeliveryNo).ExecuteCommand(); } // 插入主表数据 var insertMain = db.Insertable(mesDeliveryNote).IgnoreColumns(true).ExecuteCommand() > 0; // 插入明细数据 var insertDetails = db.Insertable(mesDeliveryNoteDetails).PageSize(1).IgnoreColumnsNull().ExecuteCommand() > 0; if (insertMain && insertDetails) { return true; } throw new NotImplementedException("送货单保存失败"); } /// /// 批量保存送货单 /// public bool SaveList(List deliveryNoteWrappers) { var results = deliveryNoteWrappers.Select(Save).ToList(); return results.All(b => b); } /// /// 转换送货单主表数据 /// private MesDeliveryNotice GetMesDeliveryNote(deliveryNote deliveryNote) { // 查找已有记录 var existing = base.GetSingle(it => it.DeliveryNo == deliveryNote.DeliveryNo); var mesDeliveryNote = existing ?? new MesDeliveryNotice(); // 主表字段映射 mesDeliveryNote.DeliveryNo = deliveryNote.DeliveryNo; mesDeliveryNote.SupplierId = deliveryNote.SupplierId; // 处理日期字段 // 处理日期字段(数据库存储为字符串类型的时间戳) if (deliveryNote.FDate != null) { // 直接赋值字符串,无需转换为DateTime mesDeliveryNote.DeliveryDate = deliveryNote.FDate; } mesDeliveryNote.Remark = deliveryNote.Remark; mesDeliveryNote.FReceiveOrgId = deliveryNote.FReceiveOrgId; mesDeliveryNote.CreateDate = DateTime.Now; return mesDeliveryNote; } /// /// 转换送货单明细数据 /// private List GetMesDeliveryNoticeDetails( List deliveryNoteDetails, string deliveryNo) { return deliveryNoteDetails.Select(detail => { // 查找已有明细记录 var existingDetail = deliveryNoteDetailManager.GetSingle(it => it.DeliveryNo == deliveryNo && it.LineNo == detail.LineNo); var mesDetail = existingDetail ?? new MesDeliveryNoticeDetail(); // 明细字段映射 mesDetail.DeliveryNo = deliveryNo; mesDetail.ProductCode = detail.ProductCode; mesDetail.PurchaseQty = detail.PurchaseQty.HasValue ? Convert.ToDecimal(detail.PurchaseQty) : 0; mesDetail.DeliveryQty = detail.DeliveryQty.HasValue ? Convert.ToDecimal(detail.DeliveryQty) : 0; mesDetail.IncludeQty = detail.IncludeQty.HasValue ? Convert.ToDecimal(detail.IncludeQty) : 0; mesDetail.PurchaseUnit = detail.PurchaseUnit; mesDetail.InventoryUnit = detail.InventoryUnit; mesDetail.Remark = detail.Remark; mesDetail.PoErpNo = detail.FBillNo; mesDetail.ErplineId = detail.OrderlineId; mesDetail.IsGift = detail.IsGift; mesDetail.LineNo = detail.LineNo; mesDetail.SynchronousDate = DateTime.Now; return mesDetail; }).ToList(); } }