using AngleSharp.Dom;
using Masuit.Tools;
using MES.Service.DB;
using MES.Service.Dto.webApi;
using MES.Service.Modes;
using SqlSugar;
using System.Data;
using System.Globalization;
using System.Security.AccessControl;
namespace MES.Service.service.BasicData;
///
/// 采购订单
///
public class MesRohInManager : Repository
{
private readonly MesRohInDataManager rohInDataManager = new();
// Save 方法用于保存单个 RohIn 记录,根据类型执行不同的操作
public bool Save(RohIn rohIn)
{
var rohInErpRohIn = rohIn.ErpRohIn;
var mesRohIn = GetMesRohIn(rohInErpRohIn);
var mesRohInDatas =
GetMesRohInDatas(rohIn.ErpRohinDatas, mesRohIn);
//1 | 未实现 | 抛出异常
//2 | 审核 | 调用 SaveOrUpdateData,正常插入/更新
//3 | 反审核 | 调用 SaveOrUpdateData,BillNo 一定加后缀
//4 | 手工同步 | 调用 SaveOrUpdateData,正常插入/更新
//5 | 未注释 | 调用 SaveOrUpdateData,正常插入/更新
return UseTransaction(db =>
{
return rohInErpRohIn.Type switch
{
"2" or "4" or "5" => SaveOrUpdateData(db, mesRohIn,
mesRohInDatas, rohInErpRohIn.Type)
? 1
: 0,
"3" => SaveOrUpdateData(db, mesRohIn,
mesRohInDatas, rohInErpRohIn.Type)
? 1
: 0, //UpdateData(db, mesRohIn, mesRohInDatas) ? 1 : 0,//反审核不删除,做update。
_ => throw new NotImplementedException(
$"type没有{rohInErpRohIn.Type}这个类型")
};
}) > 0;
}
// 更新数据的方法
private bool UpdateData(SqlSugarScope db, MesRohIn mesRohIn,
List mesRohInDatas)
{
var decimals = mesRohInDatas.Select(s => s.Guid).ToArray();
var update = db.Deleteable()
.Where(a => a.Guid == mesRohIn.Guid)
.ExecuteCommand() > 0;
var insertOrUpdate = db
.Deleteable()
.Where(s => decimals.Contains(s.Guid))
.ExecuteCommand() > 0;
if (update && insertOrUpdate) return true;
throw new NotImplementedException("更新失败");
}
// 插入或更新数据的方法
private bool SaveOrUpdateData(SqlSugarScope db, MesRohIn mesRohIn,List mesRohInDatas, string type)
{
//传什么,c就改成什么
//if (type == "3" || (mesRohIn.DocumentStatus != null && mesRohIn.DocumentStatus != "C"))//C表示已审核状态
//{
// mesRohIn.BillNo = mesRohIn.BillNo + "F" + mesRohIn.EbelnK3id.ToString();
//}
////传什么,c就改成什么
//if (type == "3" || (mesRohIn.DocumentStatus != null && mesRohIn.DocumentStatus != "Y"))//Y表示已审核状态
//{
// mesRohIn.BillNo = mesRohIn.BillNo + "F" + mesRohIn.EbelnK3id.ToString();
//}
if (mesRohIn.Guid != null)
db.Deleteable().Where(s => s.Guid == mesRohIn.Guid)
.ExecuteCommand();
if (mesRohInDatas.Count > 0)
db.Deleteable()
.Where(s => s.ErpId == mesRohIn.EbelnK3id).ExecuteCommand();
var orUpdate = db.Insertable(mesRohIn)
.IgnoreColumns(true).ExecuteCommand() > 0;
var baOrUpdate = db.Insertable(mesRohInDatas).PageSize(1)
.IgnoreColumnsNull()
.ExecuteCommand() > 0;
if (orUpdate && baOrUpdate) return true;
throw new NotImplementedException("插入或更新失败");
}
// 批量保存记录的方法
public bool SaveList(List rohIns)
{
var result = rohIns.Select(Save).ToList();
return result.All(b => b);
}
// 将 ErpRohIn 对象转换为 MesRohIn 对象的方法
private MesRohIn GetMesRohIn(ErpRohIn rohIn)
{
//根据单号+单别,获取对应的id
var singleId = Db.Queryable()
.Where(x => x.BillNo == rohIn.FBillNo && x.DocumentType == rohIn.FBillTypeID)
.Select(x => x.EbelnK3id)
.First();
//如果没有则生成一个新的id
if (singleId == null || string.IsNullOrWhiteSpace(singleId.ToString()))
{
rohIn.id = GenerateNewId().ToString();
//rohIn.id = GenerateNewId().ToString("0");
}
else//如果有则使用已有的id
{
rohIn.id = singleId.ToString();
}
var eid = long.Parse(rohIn.id);
var mesRohIn = new MesRohIn();
var single = base.GetSingle(it => it.EbelnK3id == eid);
if (single != null) mesRohIn.Guid = single.Guid;
mesRohIn.EbelnK3id = eid;
mesRohIn.BillNo = rohIn.FBillNo;
mesRohIn.DocumentType = rohIn.FBillTypeID;
mesRohIn.BusinessType = rohIn.FBusinessType;
////erp传过来的Y->C,表示审核。N->A。(与金蝶逻辑保持一致)
//mesRohIn.DocumentStatus = rohIn.FDocumentStatus;
//erp传过来的Y->C,表示审核。N->A。(与金蝶逻辑保持一致)
if (string.IsNullOrEmpty(rohIn.FDocumentStatus))
{
mesRohIn.DocumentStatus = "A";
}
else
{
mesRohIn.DocumentStatus = rohIn.FDocumentStatus == "Y" ? "C" : "A";
}
if (rohIn.FDate != null)
mesRohIn.PurchaseDate = DateTime.ParseExact(rohIn.FDate,
"yyyy-MM-dd HH:mm:ss", null);
//供应商编码转ID
var mesRohInSupplier = Db.Queryable()
.Where(x => x.SuppNo == rohIn.FSupplierId)
.Select(x => x.Id.ToString())
.First();
if (!string.IsNullOrWhiteSpace(mesRohInSupplier))
{
mesRohIn.Supplier = mesRohInSupplier;
}
else if (!string.IsNullOrWhiteSpace(rohIn.FSupplierId))
{
mesRohIn.Supplier = rohIn.FSupplierId;
}
else
{
mesRohIn.Supplier = "0";
}
//mesRohIn.Supplier = rohIn.FSupplierId;
mesRohIn.CloseStatus = rohIn.FCloseStatus;
//mesRohIn.PurchaseOrg = rohIn.FPurchaseOrgId;
mesRohIn.PurchaseOrg = string.IsNullOrEmpty(rohIn.FPurchaseOrgId) ? "1" : rohIn.FPurchaseOrgId;//采购组织
//采购部门编码转ID
var mesRohInPurchaseDept = Db.Queryable()
.Where(x => x.Departmentcode == rohIn.FPurchaseDeptId)
.Select(x => x.Departmentid.ToString())
.First();
if (!string.IsNullOrWhiteSpace(mesRohInPurchaseDept))
{
mesRohIn.PurchaseDept = mesRohInPurchaseDept;
}
else
{
mesRohIn.PurchaseDept = "0";
}
//mesRohIn.PurchaseDept = rohIn.FPurchaseDeptId;
mesRohIn.PurchaseGroup = rohIn.FPurchaserGroupId;
mesRohIn.Purchaser = rohIn.FPurchaserId;
mesRohIn.SettlementParty = rohIn.FSettleId;
mesRohIn.PaymentParty = rohIn.FChargeId;
mesRohIn.Email = rohIn.FProviderEMail;
mesRohIn.Remarks = rohIn.Remarks;
mesRohIn.CancellationStatus = rohIn.FCancelStatus;
mesRohIn.CancellationPerson = rohIn.FCancellerId;
if (rohIn.FCancelDate != null)
if (!mesRohIn.CancellationPerson.IsNullOrEmpty())
mesRohIn.CancellationDate =
DateTime.ParseExact(rohIn.FCancelDate,
"yyyy-MM-dd HH:mm:ss", null);
mesRohIn.CreateBy = rohIn.FCreatorId;
if (rohIn.FCreateDate != null)
mesRohIn.CreateDate = DateTime.ParseExact(rohIn.FCreateDate,
"yyyy-MM-dd HH:mm:ss", null);
mesRohIn.LastupdateBy = rohIn.FModifierId;
if (rohIn.FModifyDate != null)
mesRohIn.LastupdateDate = DateTime.ParseExact(rohIn.FModifyDate,
"yyyy-MM-dd HH:mm:ss", null);
mesRohIn.ErpCheckBy = rohIn.FApproverId;
mesRohIn.ErpCheckDate = rohIn.FApproveDate;
mesRohIn.Changereason = rohIn.FChangeReason;
mesRohIn.Prearrivaldate = rohIn.Prearrivaldate != null
? DateTime.ParseExact(rohIn.Prearrivaldate,
"yyyy-MM-dd HH:mm:ss", null)
: null;
mesRohIn.ReceiveOrgId = rohIn.FReceiveOrgId;
mesRohIn.ProviderId = rohIn.FProviderId;
mesRohIn.Anred = rohIn.FTContact;
mesRohIn.Telf1 = rohIn.Fmobilephone;
mesRohIn.FixedTelephone = rohIn.FixedTelephone;
mesRohIn.Address = rohIn.FProviderAddress;//供货方地址
mesRohIn.SynchronousDate = DateTime.Now;
mesRohIn.Remark2= rohIn.F_UNW_GYSLXR;// 供应商联系人
mesRohIn.Remark3= rohIn.F_UNW_LXRDH;// 联系人电话
mesRohIn.Remark4 = rohIn.FProviderJob;// 职务
mesRohIn.Remark5 = rohIn.FProviderPhone;// 手机
mesRohIn.QtyAcceptance = rohIn.FACCTYPE;//验收方式
mesRohIn.QualityReq = rohIn.F_UNW_Remarks_zlyq;//质量要求
mesRohIn.TransportMethod = rohIn.F_UNW_Text_ysfs;//运输方式
mesRohIn.Remarks = rohIn.F_UNW_BZ;//备注
mesRohIn.FixtureMoldProcurement = rohIn.F_UNW_Combo_zjmj;//治具丶模具加工及采购
mesRohIn.urgent_material = rohIn.FUrgent_Material;//急料
return mesRohIn;
}
// 将 ErpRohinData 对象转换为 MesRohInData 对象的方法
private List GetMesRohInDatas(List erpRohinDatas, MesRohIn mesRohIn)
{
return erpRohinDatas.Select(s =>
{
var entity = new MesRohInData
{
EbelnK3id = Convert.ToDecimal(s.id),
ErpId = Convert.ToDecimal(mesRohIn.EbelnK3id),//使用主表的EbelnK3id作为子表的ErpId
BillNo = s.FBillNo,
ItemId = s.FMaterialId,
PurchaseUnit = s.FUnitId,
PurchaseQty = Convert.ToDecimal(s.FQty),
InventoryUnit = s.FStockUnitID,
PricingUnit = s.FPriceUnitId,
PricingQty = Convert.ToDecimal(s.FPriceUnitQty),
DeliveryDate = s.FDeliveryDate != null
? DateTime.ParseExact(s.FDeliveryDate,
"yyyy-MM-dd HH:mm:ss", null)
: null,
EarliestDeliveryDate = s.FDeliveryEarlyDate != null
? DateTime.ParseExact(s.FDeliveryEarlyDate,
"yyyy-MM-dd HH:mm:ss", null)
: null,
LatestDeliveryDate = s.FDeliveryLastDate != null
? DateTime.ParseExact(s.FDeliveryLastDate,
"yyyy-MM-dd HH:mm:ss", null)
: null,
IsGift = s.FGiveAway,
Remarks = s.FEntryNote,
SupplierItemCode = s.FSupMatId,
SupplierItemName = s.FSupMatName,
OutsourcingOrderId = s.FSUBREQBILLNO,
BatchNumber = s.FLot,
BusinessClose = s.FMRPCloseStatus,
BusinessFreeze = s.FMRPFreezeStatus,
Freezer = s.FFreezerId,
FreezeTime = !string.IsNullOrEmpty(s.FFreezeDate)
&& DateTime.TryParseExact(s.FFreezeDate,
new[] { "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd" }, // 支持多种格式
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out var parsedDate)
&& parsedDate > new DateTime(1900, 1, 1)
? parsedDate
: (DateTime?)null,
BusinessTerminate = s.FMRPTerminateStatus,
Terminator = s.FTerminaterId,
TerminateTime = s.FTerminateDate != null
? DateTime.ParseExact(s.FTerminateDate,
"yyyy-MM-dd HH:mm:ss", null)
: null,
TotalReceivedQty = Convert.ToDecimal(s.FReceiveQty), //累计收料数
RemainingReceivedQty =
Convert.ToDecimal(s.FRemainReceiveQty),
TotalStoredQty = Convert.ToDecimal(s.FStockInQty), //累计入库数
RemainingStoredQty = Convert.ToDecimal(s.FRemainStockINQty),
TotalReturnedQty = Convert.ToDecimal(s.FMrbQty),
ReturnableReceivedQty =
Convert.ToDecimal(s.FCHECKRETQTY), //收料可退数
ReturnableStoredQty = Convert.ToDecimal(s.FSTOCKRETQTY), //库存可退数
SourceDocumentType = s.FBillTypeID,//采购单别
SourceDocumentId = s.FSrcBillNo,
DemandTrackingId = s.FReqTraceNo,
PlanTrackingId = s.FMtoNo,
ChangeFlag = s.FChangeFlag,
DemandSource = s.FDEMANDTYPE,
DemandDocumentId = s.FDEMANDBILLNO,
OrderLineId = s.FDEMANDBILLENTRYSEQ,
DemandOrg = s.FRequireOrgId,
ReceivingOrg = s.FReceiveOrgId,
SettlementOrg = s.FEntrySettleOrgId,
PurchaseOrderLineNumber = s.FSEQ,
Demand = s.FRequireOrgId,
Receiving = s.FReceiveOrgId,
Settlement = s.FSETTLEORGID,
DemandDepartment = s.FRequireDeptId,
ReceivingDepartment = s.FReceiveDeptId,
Remark5 = s.FUrgent_Material, //急料
SalesOrderId = s.F_UNW_Text_xsddh
};
//库存单位编码转ID
//InventoryUnit = s.FStockUnitID,
var entityInventoryUnit = Db.Queryable()
.Where(x => x.Fnumber == s.FUnitId)
.Select(x => x.Id.ToString())
.First();
if (!string.IsNullOrWhiteSpace(entityInventoryUnit))
{
entity.InventoryUnit = entityInventoryUnit;
}
else
{
entity.InventoryUnit = "0";
}
//采购单位编码转ID
var entityPurchaseUnit = Db.Queryable()
.Where(x => x.Fnumber == s.FUnitId)
.Select(x => x.Id.ToString())
.First();
if (!string.IsNullOrWhiteSpace(entityPurchaseUnit))
{
entity.PurchaseUnit = entityPurchaseUnit;
}
else
{
entity.PurchaseUnit = "0";
}
//计价单位编码转ID
var entityPricingUnit = Db.Queryable()
.Where(x => x.Fnumber == s.FPriceUnitId)
.Select(x => x.Id.ToString())
.First();
if (!string.IsNullOrWhiteSpace(entityPricingUnit))
{
entity.PricingUnit = entityPricingUnit;
}
else
{
entity.PricingUnit = "0";
}
//物料编码转ID
var entityItemId = Db.Queryable()
.Where(x => x.ItemNo == s.FMaterialId)
.Select(x => x.Id.ToString())
.First();
if (!string.IsNullOrWhiteSpace(entityItemId))
{
entity.ItemId = entityItemId;
}
else
{
entity.ItemId = "0";
}
if (s.FFreezeDate != null)
if (!s.FFreezerId.IsNullOrEmpty())
entity.FreezeTime =
DateTime.ParseExact(s.FFreezeDate,
"yyyy-MM-dd HH:mm:ss", null);
if (s.FTerminateDate != null)
if (!s.FTerminaterId.IsNullOrEmpty())
entity.TerminateTime =
DateTime.ParseExact(s.FTerminateDate,
"yyyy-MM-dd HH:mm:ss", null);
//根据单号+单别+行号,获取对应的id
var singleId = Db.Queryable()
.Where(x => x.BillNo == s.FBillNo && x.SourceDocumentType == s.FBillTypeID && x.OrderLineId == s.FDEMANDBILLENTRYSEQ)
.Select(x => x.EbelnK3id)
.First();
if (singleId == null)//如果没有则生成一个新的id
{
//entity.EbelnK3id = GenerateNewId2().ToString();
entity.EbelnK3id = GenerateNewId2();
}
else//如果有则使用已有的id
{
//entity.EbelnK3id = singleId.EbelnK3id;
entity.EbelnK3id = singleId;
}
//查询EbelnK3id对应的Guid,赋值给entity.Guid。实现主键复用
var single = rohInDataManager.GetSingle(it => it.EbelnK3id == entity.EbelnK3id);
if (single != null) entity.Guid = single.Guid;
return entity;
}).ToList();
}
/////
///// 生成新的主表ID,确保不重复
/////
//private decimal GenerateNewId()
//{
// // 处理空表的情况,从1开始
// var maxId = Db.Queryable().Max(x => (decimal?)x.EbelnK3id) ?? 0;
// var newId = maxId + 1;
// // 双重检查,确保生成的ID不存在
// while (Db.Queryable().Where(x => x.EbelnK3id == newId).Any())
// {
// newId++;
// }
// return newId;
//}
///
/// 生成新的主表ID,通过数据库序列获取唯一ID
///
private decimal GenerateNewId()
{
try
{
// 替换为:
var sequenceValueObj = Db.Ado.GetScalar("SELECT NEXT VALUE FOR MES_ROH_IN_seq");
var sequenceValue = Convert.ToDecimal(sequenceValueObj);
// 验证序列值是否有效
if (sequenceValue <= 0)
{
throw new InvalidOperationException($"数据库序列 MES_ROH_IN_seq 返回了无效的值: {sequenceValue}");
}
return sequenceValue;
}
catch (Exception ex)
{
// 记录异常信息
Console.WriteLine($"调用数据库序列 MES_ROH_IN_seq 失败: {ex.Message}");
// 向上层抛出明确的异常信息
throw new InvalidOperationException($"生成子表ID失败,无法获取数据库序列值: {ex.Message}", ex);
}
}
///
/// 生成新的子表ID,通过数据库序列获取唯一ID
///
private decimal GenerateNewId2()
{
try
{
// 获取当前表中已存在的最大 EBELN_K3ID
//var maxId = Db.Queryable().Max(x => (decimal?)x.EbelnK3id) ?? 0m;
// 先取一个序列值
var sequenceValueObj = Db.Ado.GetScalar("SELECT NEXT VALUE FOR MES_ROH_IN_DATA_seq");
var sequenceValue = Convert.ToDecimal(sequenceValueObj);
if (sequenceValue <= 0)
{
throw new InvalidOperationException($"数据库序列 MES_ROH_IN_DATA_seq 返回了无效的值: {sequenceValue}");
}
//// 如果序列值落后于当前最大ID,持续获取直到超过 maxId
//while (sequenceValue <= maxId || Db.Queryable().Where(x => x.EbelnK3id == sequenceValue).Any())
//{
// sequenceValueObj = Db.Ado.GetScalar("SELECT NEXT VALUE FOR MES_ROH_IN_DATA_seq");
// sequenceValue = Convert.ToDecimal(sequenceValueObj);
// if (sequenceValue <= 0)
// {
// throw new InvalidOperationException($"数据库序列 MES_ROH_IN_DATA_seq 连续返回无效的值: {sequenceValue}");
// }
//}
return sequenceValue;
}
catch (Exception ex)
{
// 记录异常信息
Console.WriteLine($"调用数据库序列 MES_ROH_IN_DATA_seq 失败: {ex.Message}");
// 向上层抛出明确的异常信息
throw new InvalidOperationException($"生成子表ID失败,无法获取数据库序列值: {ex.Message}", ex);
}
}
///
/// 整单删除,调用存储过程
///
/// 单号
/// 被删除的单号
public (int outSum, string outMsg) Delete(string FBillNo, string FBillTypeID)
{
try
{
var outMsg = string.Empty;
var outSum = 0;
var parameters = new List
{
new SugarParameter("@FBillNo", FBillNo),
new SugarParameter("@FBillTypeID", FBillTypeID),
new SugarParameter("@outMsg", outMsg, typeof(string), ParameterDirection.Output, 2500),
new SugarParameter("@outSum", outSum, typeof(int), ParameterDirection.Output)
};
Db.Ado.UseStoredProcedure().ExecuteCommand("ERP_DeleteMesRohInByBillNo", parameters);
outMsg = parameters[2].Value?.ToString() ?? "";
outSum = parameters[3].Value != null ? Convert.ToInt32(parameters[index: 3].Value) : -1;
return (outSum, outMsg);
}
catch (Exception ex)
{
throw new InvalidOperationException($"调用存储过程 ERP_DeleteMesRohInByBillNo 失败: {ex.Message}", ex);
}
}
// 整单删除
//private bool Delete(SqlSugarScope db, MesRohIn mesRohIn,List mesRohInDatas)
//{
// if (mesRohIn.Guid != null)
// db.Deleteable().Where(s => s.Guid == mesRohIn.Guid)
// .ExecuteCommand();
// if (mesRohInDatas.Count > 0)
// db.Deleteable()
// .Where(s => s.ErpId == mesRohIn.EbelnK3id).ExecuteCommand();
// var orUpdate = db.Insertable(mesRohIn)
// .IgnoreColumns(true).ExecuteCommand() > 0;
// var baOrUpdate = db.Insertable(mesRohInDatas).PageSize(1)
// .IgnoreColumnsNull()
// .ExecuteCommand() > 0;
// if (orUpdate && baOrUpdate) return true;
// throw new NotImplementedException("删除");
//}
}