| | |
| | | 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; |
| | | |
| | | /// <summary> |
| | | /// 采购订单 |
| | | /// </summary> |
| | | public class MesRohInManager : Repository<MesRohIn> |
| | | { |
| | | private readonly MesRohInDataManager rohInDataManager = new(); |
| | |
| | | public bool Save(RohIn rohIn) |
| | | { |
| | | var rohInErpRohIn = rohIn.ErpRohIn; |
| | | |
| | | var mesRohIn = GetMesRohIn(rohInErpRohIn); |
| | | var mesRohInDatas = |
| | | GetMesRohInDatas(rohIn.ErpRohinDatas); |
| | | GetMesRohInDatas(rohIn.ErpRohinDatas, mesRohIn); |
| | | |
| | | //1 | 未实现 | 抛出异常 |
| | | //2 | 审核 | 调用 SaveOrUpdateData,正常插入/更新 |
| | | //3 | 反审核 | 调用 SaveOrUpdateData,BillNo 一定加后缀 |
| | | //4 | 手工同步 | 调用 SaveOrUpdateData,正常插入/更新 |
| | | //5 | 未注释 | 调用 SaveOrUpdateData,正常插入/更新 |
| | | return UseTransaction(db => |
| | | { |
| | | return rohInErpRohIn.Type switch |
| | |
| | | } |
| | | |
| | | // 插入或更新数据的方法 |
| | | private bool SaveOrUpdateData(SqlSugarScope db, MesRohIn mesRohIn, |
| | | List<MesRohInData> mesRohInDatas, string type) |
| | | private bool SaveOrUpdateData(SqlSugarScope db, MesRohIn mesRohIn,List<MesRohInData> mesRohInDatas, string type) |
| | | { |
| | | ////传什么,c就改成什么 |
| | | //if (type == "3" || (mesRohIn.DocumentStatus != null && mesRohIn.DocumentStatus != "C"))//C表示已审核状态 |
| | | //{ |
| | | // mesRohIn.BillNo = mesRohIn.BillNo + "F" + mesRohIn.EbelnK3id.ToString(); |
| | | //} |
| | | |
| | | if (type == "3" || (mesRohIn.DocumentStatus != null && mesRohIn.DocumentStatus != "C")) |
| | | //传什么,c就改成什么 |
| | | if (type == "3" || (mesRohIn.DocumentStatus != null && mesRohIn.DocumentStatus != "F"))//C表示已审核状态 |
| | | { |
| | | mesRohIn.BillNo = mesRohIn.BillNo + "F" + mesRohIn.EbelnK3id.ToString(); |
| | | } |
| | |
| | | // 将 ErpRohIn 对象转换为 MesRohIn 对象的方法 |
| | | private MesRohIn GetMesRohIn(ErpRohIn rohIn) |
| | | { |
| | | //根据单号+单别,获取对应的id |
| | | var singleId = Db.Queryable<MesRohIn>() |
| | | .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(); |
| | | |
| | |
| | | mesRohIn.PurchaseDate = DateTime.ParseExact(rohIn.FDate, |
| | | "yyyy-MM-dd HH:mm:ss", null); |
| | | |
| | | mesRohIn.Supplier = rohIn.FSupplierId; |
| | | //供应商转编码 |
| | | var mesRohInSupplier = Db.Queryable<MesSupplier>() |
| | | .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.PurchaseDept = rohIn.FPurchaseDeptId; |
| | | //mesRohIn.PurchaseOrg = rohIn.FPurchaseOrgId; |
| | | mesRohIn.PurchaseOrg = string.IsNullOrEmpty(rohIn.FPurchaseOrgId) ? "1" : rohIn.FPurchaseOrgId;//采购组织 |
| | | |
| | | //采购部门转编码 |
| | | var mesRohInPurchaseDept = Db.Queryable<SysDepartment>() |
| | | .Where(x => x.Departmentcode == rohIn.FPurchaseDeptId) |
| | | .Select(x => x.Departmentid.ToString()) |
| | | .First(); |
| | | if (!string.IsNullOrWhiteSpace(mesRohInPurchaseDept)) |
| | | { |
| | | mesRohIn.PurchaseDept = mesRohInPurchaseDept; |
| | | } |
| | | else if (!string.IsNullOrWhiteSpace(rohIn.FPurchaseDeptId)) |
| | | { |
| | | mesRohIn.PurchaseDept = rohIn.FPurchaseDeptId; |
| | | } |
| | | else |
| | | { |
| | | mesRohIn.PurchaseDept = "0"; |
| | | } |
| | | //mesRohIn.PurchaseDept = rohIn.FPurchaseDeptId; |
| | | |
| | | mesRohIn.PurchaseGroup = rohIn.FPurchaserGroupId; |
| | | mesRohIn.Purchaser = rohIn.FPurchaserId; |
| | | mesRohIn.SettlementParty = rohIn.FSettleId; |
| | |
| | | mesRohIn.Anred = rohIn.FTContact; |
| | | mesRohIn.Telf1 = rohIn.Fmobilephone; |
| | | mesRohIn.FixedTelephone = rohIn.FixedTelephone; |
| | | mesRohIn.Address = rohIn.Address; |
| | | mesRohIn.Acctype = rohIn.Acctype; |
| | | 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<MesRohInData> GetMesRohInDatas( |
| | | List<ErpRohinData> erpRohinDatas) |
| | | private List<MesRohInData> GetMesRohInDatas(List<ErpRohinData> erpRohinDatas, MesRohIn mesRohIn) |
| | | { |
| | | return erpRohinDatas.Select(s => |
| | | { |
| | | var entity = new MesRohInData |
| | | { |
| | | EbelnK3id = Convert.ToDecimal(s.id), |
| | | ErpId = Convert.ToDecimal(s.Eid), |
| | | ErpId = Convert.ToDecimal(mesRohIn.EbelnK3id),//使用主表的EbelnK3id作为子表的ErpId |
| | | BillNo = s.FBillNo, |
| | | ItemId = s.FMaterialId, |
| | | PurchaseUnit = s.FUnitId, |
| | |
| | | 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, |
| | | 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, |
| | | 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), |
| | |
| | | ReturnableReceivedQty = |
| | | Convert.ToDecimal(s.FCHECKRETQTY), //收料可退数 |
| | | ReturnableStoredQty = Convert.ToDecimal(s.FSTOCKRETQTY), //库存可退数 |
| | | SourceDocumentType = s.FSrcBillTypeId, |
| | | SourceDocumentType = s.FBillTypeID,//采购单别 |
| | | SourceDocumentId = s.FSrcBillNo, |
| | | DemandTrackingId = s.FReqTraceNo, |
| | | PlanTrackingId = s.FMtoNo, |
| | | ChangeFlag = s.FChangeFlag, |
| | | DemandSource = s.FDEMANDTYPE, |
| | | DemandDocumentId = s.FDEMANDBILLNO, |
| | | DemandDocumentLineId = s.FDEMANDBILLENTRYSEQ, |
| | | OrderLineId = s.FDEMANDBILLENTRYSEQ, |
| | | DemandOrg = s.FRequireOrgId, |
| | | ReceivingOrg = s.FReceiveOrgId, |
| | | SettlementOrg = s.FEntrySettleOrgId, |
| | |
| | | Receiving = s.FReceiveOrgId, |
| | | Settlement = s.FSETTLEORGID, |
| | | DemandDepartment = s.FRequireDeptId, |
| | | ReceivingDepartment = s.FReceiveDeptId |
| | | ReceivingDepartment = s.FReceiveDeptId, |
| | | |
| | | Remark5 = s.FUrgent_Material, //急料 |
| | | SalesOrderId = s.F_UNW_Text_xsddh |
| | | }; |
| | | |
| | | //采购单位转编码 |
| | | var entityPurchaseUnit = Db.Queryable<MesUnit>() |
| | | .Where(x => x.Fnumber == s.FUnitId) |
| | | .Select(x => x.Id.ToString()) |
| | | .First(); |
| | | if (!string.IsNullOrWhiteSpace(entityPurchaseUnit)) |
| | | { |
| | | entity.PurchaseUnit = entityPurchaseUnit; |
| | | } |
| | | else if (!string.IsNullOrWhiteSpace(s.FUnitId)) |
| | | { |
| | | entity.PurchaseUnit = s.FUnitId; |
| | | } |
| | | else |
| | | { |
| | | entity.PurchaseUnit = "0"; |
| | | } |
| | | |
| | | //计价单位转编码 |
| | | var entityPricingUnit = Db.Queryable<MesUnit>() |
| | | .Where(x => x.Fnumber == s.FPriceUnitId) |
| | | .Select(x => x.Id.ToString()) |
| | | .First(); |
| | | if (!string.IsNullOrWhiteSpace(entityPricingUnit)) |
| | | { |
| | | entity.PricingUnit = entityPricingUnit; |
| | | } |
| | | else if (!string.IsNullOrWhiteSpace(s.FPriceUnitId)) |
| | | { |
| | | entity.PricingUnit = s.FPriceUnitId; |
| | | } |
| | | else |
| | | { |
| | | entity.PricingUnit = "0"; |
| | | } |
| | | |
| | | if (s.FFreezeDate != null) |
| | | if (!s.FFreezerId.IsNullOrEmpty()) |
| | |
| | | DateTime.ParseExact(s.FTerminateDate, |
| | | "yyyy-MM-dd HH:mm:ss", null); |
| | | |
| | | var single = rohInDataManager.GetSingle(it => |
| | | it.EbelnK3id == entity.EbelnK3id); |
| | | //根据单号+单别+行号,获取对应的id |
| | | var singleId = Db.Queryable<MesRohInData>() |
| | | .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(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 生成新的主表ID,确保不重复 |
| | | /// </summary> |
| | | private decimal GenerateNewId() |
| | | { |
| | | // 处理空表的情况,从1开始 |
| | | var maxId = Db.Queryable<MesRohIn>().Max(x => (decimal?)x.EbelnK3id) ?? 0; |
| | | var newId = maxId + 1; |
| | | |
| | | // 双重检查,确保生成的ID不存在 |
| | | while (Db.Queryable<MesRohIn>().Where(x => x.EbelnK3id == newId).Any()) |
| | | { |
| | | newId++; |
| | | } |
| | | |
| | | return newId; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 生成新的子表ID,通过数据库序列获取唯一ID |
| | | /// </summary> |
| | | private decimal GenerateNewId2() |
| | | { |
| | | try |
| | | { |
| | | // 替换为: |
| | | 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}"); |
| | | } |
| | | |
| | | return sequenceValue; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // 记录异常信息 |
| | | Console.WriteLine($"调用数据库序列 MES_ROH_IN_DATA_seq 失败: {ex.Message}"); |
| | | |
| | | // 向上层抛出明确的异常信息 |
| | | throw new InvalidOperationException($"生成子表ID失败,无法获取数据库序列值: {ex.Message}", ex); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 整单删除,调用存储过程 |
| | | /// </summary> |
| | | /// <param name="billNo">单号</param> |
| | | /// <returns>被删除的单号</returns> |
| | | public (int outSum, string outMsg) Delete(string FBillNo, string FBillTypeID) |
| | | { |
| | | var outMsg = string.Empty; |
| | | var outSum = 0; |
| | | |
| | | var parameters = new List<SugarParameter> |
| | | { |
| | | 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[2].Value) : -1; |
| | | |
| | | return (outSum, outMsg); |
| | | } |
| | | |
| | | |
| | | // 整单删除 |
| | | //private bool Delete(SqlSugarScope db, MesRohIn mesRohIn,List<MesRohInData> mesRohInDatas) |
| | | //{ |
| | | // if (mesRohIn.Guid != null) |
| | | // db.Deleteable<MesRohIn>().Where(s => s.Guid == mesRohIn.Guid) |
| | | // .ExecuteCommand(); |
| | | |
| | | // if (mesRohInDatas.Count > 0) |
| | | // db.Deleteable<MesRohInData>() |
| | | // .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("删除"); |
| | | //} |
| | | } |