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基础增删改查方法
}