using System.Globalization;
|
using MES.Service.DB;
|
using MES.Service.Dto.webApi;
|
using MES.Service.Modes;
|
using SqlSugar;
|
|
namespace MES.Service.service;
|
|
/// <summary>
|
/// 出货计划出货服务管理类
|
/// </summary>
|
public class ShipmentPlanDeliveryManager : Repository<ShipmentPlanDelivery>
|
{
|
private readonly ShipmentPlanDeliveryDetailManager _detailManager = new();
|
|
/// <summary>
|
/// 保存出货计划出货数据
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 更新数据
|
/// </summary>
|
private bool UpdateData(SqlSugarScope db, ShipmentPlanDelivery header, List<ShipmentPlanDeliveryDetail> details)
|
{
|
// 检查是否已生成出库单
|
var outCount = Db.Ado.SqlQuery<decimal>(
|
"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<ShipmentPlanDeliveryDetail>().In(detailIds).ExecuteCommand() > 0;
|
|
if (deleteHeader && deleteDetails)
|
{
|
return true;
|
}
|
|
throw new NotImplementedException("更新失败");
|
}
|
|
/// <summary>
|
/// 插入或更新数据
|
/// </summary>
|
private bool SaveOrUpdateData(SqlSugarScope db, ShipmentPlanDelivery header, List<ShipmentPlanDeliveryDetail> details)
|
{
|
// 检查是否已生成出库单
|
var outCount = Db.Ado.SqlQuery<decimal>(
|
"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<ShipmentPlanDeliveryDetail>()
|
.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;
|
}
|
|
/// <summary>
|
/// 批量保存
|
/// </summary>
|
public bool SaveList(List<ErpShipmentPlanDelivery> dataList)
|
{
|
var result = dataList.Select(Save).ToList();
|
return result.All(b => b);
|
}
|
|
/// <summary>
|
/// 转换DTO为主表实体
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 转换DTO为明细表实体列表
|
/// </summary>
|
private List<ShipmentPlanDeliveryDetail> ConvertDtoToDetails(List<ErpShipmentPlanDeliveryDetailDto> dtoList)
|
{
|
var detailList = new List<ShipmentPlanDeliveryDetail>();
|
|
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<MesLinkU9>()
|
.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<MesLinkU9>()
|
.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;
|
}
|
}
|
|
/// <summary>
|
/// 出货计划出货明细管理类
|
/// </summary>
|
public class ShipmentPlanDeliveryDetailManager : Repository<ShipmentPlanDeliveryDetail>
|
{
|
// 继承Repository基础增删改查方法
|
}
|