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<MesDeliveryNotice>
|
{
|
private readonly MesDeliveryNoteDetailManager deliveryNoteDetailManager = new();
|
|
/// <summary>
|
/// 保存送货单数据
|
/// </summary>
|
/// <param name="deliveryNoteWrapper">送货单包装类(包含主表和明细数据)</param>
|
/// <returns>是否保存成功</returns>
|
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;
|
}
|
|
/// <summary>
|
/// 更新送货单数据
|
/// </summary>
|
private bool UpdateData(SqlSugarScope db, MesDeliveryNotice mesDeliveryNote, List<MesDeliveryNoticeDetail> mesDeliveryNoteDetails)
|
{
|
var detailIds = mesDeliveryNoteDetails.Select(s => s.Guid).ToArray();
|
|
// 删除主表数据
|
var deleteMain = db.Deleteable<MesDeliveryNotice>().Where(a => a.DeliveryNo == mesDeliveryNote.DeliveryNo).ExecuteCommand() > 0;
|
|
// 删除明细数据
|
var deleteDetails = db.Deleteable<MesDeliveryNoticeDetail>().Where(s => detailIds.Contains(s.Guid)).ExecuteCommand() > 0;
|
|
if (deleteMain && deleteDetails)
|
{
|
return true;
|
}
|
throw new NotImplementedException("送货单更新失败");
|
}
|
|
/// <summary>
|
/// 保存或更新送货单数据
|
/// </summary>
|
private bool SaveOrUpdateData(SqlSugarScope db, MesDeliveryNotice mesDeliveryNote, List<MesDeliveryNoticeDetail> mesDeliveryNoteDetails)
|
{
|
// 若存在则先删除主表数据
|
if (!mesDeliveryNote.DeliveryNo.IsNullOrEmpty())
|
{
|
db.Deleteable<MesDeliveryNotice>().Where(s => s.DeliveryNo == mesDeliveryNote.DeliveryNo).ExecuteCommand();
|
}
|
|
// 删除关联的明细数据
|
if (mesDeliveryNoteDetails.Count > 0)
|
{
|
db.Deleteable<MesDeliveryNoticeDetail>().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("送货单保存失败");
|
}
|
|
/// <summary>
|
/// 批量保存送货单
|
/// </summary>
|
public bool SaveList(List<DeliveryNoteWrapper> deliveryNoteWrappers)
|
{
|
var results = deliveryNoteWrappers.Select(Save).ToList();
|
return results.All(b => b);
|
}
|
|
/// <summary>
|
/// 转换送货单主表数据
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 转换送货单明细数据
|
/// </summary>
|
private List<MesDeliveryNoticeDetail> GetMesDeliveryNoticeDetails(
|
List<deliveryNoteDetail> 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();
|
}
|
}
|