From 787d745b9c721dbfdf61c80942916b1db3bb4211 Mon Sep 17 00:00:00 2001 From: kyy <3283105747@qq.com> Date: 星期六, 26 七月 2025 10:45:22 +0800 Subject: [PATCH] 采购仓退接口优化 --- MES.Service/service/BasicData/MesCgthSqManager.cs | 245 +++++++++++++++++++++++++++++------------------- 1 files changed, 147 insertions(+), 98 deletions(-) diff --git a/MES.Service/service/BasicData/MesCgthSqManager.cs b/MES.Service/service/BasicData/MesCgthSqManager.cs index 3ffd500..8626786 100644 --- a/MES.Service/service/BasicData/MesCgthSqManager.cs +++ b/MES.Service/service/BasicData/MesCgthSqManager.cs @@ -3,19 +3,23 @@ using MES.Service.Modes; using MES.Service.util; using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; namespace MES.Service.service; public class MesCgthSqManager : Repository<MesCgthSq> { - // 鏄庣粏琛ㄧ鐞嗗櫒锛堢敤浜庡鐞嗘槑缁嗘暟鎹級 - //private readonly MesCgthSqDetailManager _detailManager = new(); /// <summary> /// 鎵归噺淇濆瓨閲囪喘閫�璐у崟锛堜富琛�+鏄庣粏锛� /// </summary> public bool SaveList(List<ErpCgth> erpCgthList) { - // 閫愭潯澶勭悊锛屽叏閮ㄦ垚鍔熸墠杩斿洖true + if (erpCgthList == null || !erpCgthList.Any()) + throw new ArgumentNullException(nameof(erpCgthList), "寰呬繚瀛樼殑閫�璐у崟鍒楄〃涓嶈兘涓虹┖"); + + // 閫愭潯澶勭悊锛屽叏閮ㄦ垚鍔熸墠杩斿洖true锛堜簨鍔″唴鎵归噺澶勭悊鏇翠紭锛屾澶勪繚鎸佸師鏈夐�昏緫锛� var result = erpCgthList.Select(Save).ToList(); return result.All(b => b); } @@ -25,166 +29,211 @@ /// </summary> public bool Save(ErpCgth erpCgth) { - // 浠嶦RP鏁版嵁涓彁鍙栦富琛ㄥ拰鏄庣粏琛―TO + if (erpCgth == null) + throw new ArgumentNullException(nameof(erpCgth), "閫�璐у崟鏁版嵁涓嶈兘涓虹┖"); + if (erpCgth.ErpCgtha == null) + throw new ArgumentNullException(nameof(erpCgth.ErpCgtha), "閫�璐у崟涓昏〃鏁版嵁涓嶈兘涓虹┖"); + + // 鎻愬彇涓昏〃鍜屾槑缁嗚〃DTO var erpMain = erpCgth.ErpCgtha; - var erpDetails = erpCgth.ErpCgthB; + var erpDetails = erpCgth.ErpCgthB ?? new List<ErpCgthB>(); // 閬垮厤鏄庣粏涓簄ull - // 鏄犲皠涓昏〃鍜屾槑缁嗚〃瀹炰綋 + // 姝ラ1锛氭槧灏勪富琛ㄥ熀纭�鏁版嵁锛堟殏涓嶅鐞咺d锛� var mesMain = MapErpCgthaToMesCgthSq(erpMain); - var mesDetails = MapErpCgthBToMesCgthSqDetail(erpDetails, mesMain.Id); // 鍏宠仈涓昏〃ID - // 浣跨敤浜嬪姟澶勭悊涓讳粠琛ㄨ仈鍔ㄦ搷浣� + // 姝ラ2锛氭彁鍓嶇‘瀹氫富琛↖d锛堟牳蹇冧慨姝o細鍦ㄦ槧灏勬槑缁嗚〃鍓嶈幏鍙�/鐢熸垚Id锛� + Guid mainId = GetOrCreateMainId(mesMain); + + // 姝ラ3锛氱敤纭畾鐨刴ainId鏄犲皠鏄庣粏琛紙纭繚Mid=mainId锛� + var mesDetails = MapErpCgthBToMesCgthSqDetail(erpDetails, mainId); + + // 姝ラ4锛氫簨鍔″唴澶勭悊涓讳粠琛ㄤ繚瀛� return UseTransaction(db => { - // 鏍规嵁鎿嶄綔绫诲瀷锛圱YPE锛夋墽琛屼笉鍚岄�昏緫锛堝亣璁綯YPE=1鏂板锛�2鏇存柊锛�3鍒犻櫎锛� switch (erpMain.TYPE) { case "1": // 鏂板 - case "2": // 鏇存柊锛堢粺涓�璧版柊澧炴垨鏇存柊閫昏緫锛� - case "4": - return SaveOrUpdateData(db, mesMain, mesDetails) ? 1 : 0; + case "2": // 鏇存柊 + case "4": // 鍏朵粬鏂板/鏇存柊绫诲瀷 + return SaveOrUpdateData(db, mesMain, mesDetails, mainId) ? 1 : 0; case "3": // 鍒犻櫎 - return DeleteData(db, mesMain, mesDetails) ? 1 : 0; + return DeleteData(db, mesMain, mesDetails, mainId) ? 1 : 0; default: - throw new NotImplementedException($"鎿嶄綔绫诲瀷[{erpMain.TYPE}]鏈疄鐜�"); + throw new NotImplementedException($"鏈疄鐜扮殑鎿嶄綔绫诲瀷锛歿erpMain.TYPE}"); } }) > 0; } /// <summary> + /// 鎻愬墠鑾峰彇鎴栫敓鎴愪富琛↖d锛堢‘淇濆湪鏄犲皠鏄庣粏琛ㄥ墠纭畾锛� + /// </summary> + private Guid GetOrCreateMainId(MesCgthSq mesMain) + { + // 浼樺厛閫氳繃鍗曟嵁鍙锋煡璇㈠凡鏈変富琛紙鏇存柊鍦烘櫙锛� + var existingMain = Context.Queryable<MesCgthSq>() + .Where(m => m.BillNo == mesMain.BillNo) + .First(); + + if (existingMain != null) + { + // 宸插瓨鍦細杩斿洖鏁版嵁搴撲腑鐨処d + return existingMain.Id; + } + else + { + // 涓嶅瓨鍦細鐢熸垚鏂癐d锛堟柊澧炲満鏅級 + return Guid.NewGuid(); + } + } + + /// <summary> /// 鏂板鎴栨洿鏂版暟鎹紙涓昏〃+鏄庣粏锛� /// </summary> - private bool SaveOrUpdateData(SqlSugarScope db, MesCgthSq mesMain, List<MesCgthSqDetail> mesDetails) + private bool SaveOrUpdateData(SqlSugarScope db, MesCgthSq mesMain, List<MesCgthSqDetail> mesDetails, Guid mainId) { - // 1. 澶勭悊涓昏〃锛氳嫢宸插瓨鍦ㄥ垯鏇存柊锛屼笉瀛樺湪鍒欐柊澧� - bool isMainExist = db.Queryable<MesCgthSq>().Where(m => m.BillNo == mesMain.BillNo).Any(); + // 缁戝畾涓昏〃Id锛堜娇鐢ㄦ彁鍓嶇‘瀹氱殑mainId锛� + mesMain.Id = mainId; + + // 澶勭悊涓昏〃锛氭柊澧炴垨鏇存柊 + bool isExist = db.Queryable<MesCgthSq>().Where(m => m.BillNo == mesMain.BillNo).Any(); int mainResult; - if (isMainExist) + + if (isExist) { - // 鏇存柊涓昏〃锛堝拷鐣ョ┖瀛楁锛� + // 鏇存柊锛氭寜Id鍖归厤锛堥伩鍏嶅崟鎹彿閲嶅瀵艰嚧閿欒锛� mainResult = db.Updateable(mesMain) - .IgnoreColumns(m => m.Id) // 涓嶆洿鏂颁富閿� - .Where(m => m.BillNo == mesMain.BillNo) + .IgnoreColumns(m => new { m.CreateDate }) // 涓嶆洿鏂板垱寤烘椂闂� + .Where(m => m.Id == mainId) .ExecuteCommand(); } else { - // 鏂板涓昏〃锛堢敓鎴愪富閿級 - mesMain.Id = Guid.NewGuid(); + // 鏂板锛氫娇鐢ㄦ彁鍓嶇敓鎴愮殑Id mainResult = db.Insertable(mesMain).ExecuteCommand(); } - // 2. 澶勭悊鏄庣粏琛細鍏堝垹闄ゆ棫鏄庣粏锛屽啀鎻掑叆鏂版槑缁嗭紙纭繚鏁版嵁鍚屾锛� - // 锛堥�氳繃涓昏〃ERPID鍏宠仈鏃ф槑缁嗭級 - int oldDetailCount = db.Deleteable<MesCgthSqDetail>() - .Where(d => d.Mid == mesMain.Id) + // 澶勭悊鏄庣粏琛細鍏堝垹鏃ф暟鎹紝鍐嶆彃鏂版暟鎹紙纭繚鏁版嵁鍚屾锛� + // 1. 鍒犻櫎褰撳墠涓昏〃鍏宠仈鐨勬棫鏄庣粏 + int deleteOldDetailResult = db.Deleteable<MesCgthSqDetail>() + .Where(d => d.Mid == mainId) .ExecuteCommand(); - // 鎻掑叆鏂版槑缁嗭紙鍏宠仈涓昏〃ID锛� - int detailResult = mesDetails.Count > 0 + // 2. 鎻掑叆鏂版槑缁嗭紙Mid宸�=mainId锛� + int insertDetailResult = mesDetails.Count > 0 ? db.Insertable(mesDetails).ExecuteCommand() - : 1; // 鏃犳槑缁嗘椂榛樿鎴愬姛 + : 1; // 鏃犳槑缁嗘椂瑙嗕负鎴愬姛 - // 3. 鏍¢獙缁撴灉 - if (mainResult > 0 && detailResult > 0) - { - return true; - } - - throw new NotImplementedException("涓昏〃鎴栨槑缁嗕繚瀛樺け璐�"); + // 鏍¢獙缁撴灉锛堜富琛ㄥ繀椤绘垚鍔燂紝鏄庣粏鍒犻櫎/鎻掑叆鑷冲皯鏈変竴涓垚鍔燂級 + return mainResult > 0 && (deleteOldDetailResult >= 0 && insertDetailResult > 0); } /// <summary> /// 鍒犻櫎鏁版嵁锛堜富琛�+鏄庣粏锛� /// </summary> - private bool DeleteData(SqlSugarScope db, MesCgthSq mesMain, List<MesCgthSqDetail> mesDetails) + private bool DeleteData(SqlSugarScope db, MesCgthSq mesMain, List<MesCgthSqDetail> mesDetails, Guid mainId) { - // 澶勭悊ERPID涓虹┖鐨勬儏鍐碉紝杞崲涓虹粺涓�鐨勭┖瀛楃涓茶繘琛屾瘮杈� - string mainErpId = mesMain.ErpId?.ToString() ?? string.Empty; - - // 1. 鍒犻櫎鏄庣粏锛堥�氳繃涓昏〃ERPID鍏宠仈锛� + // 1. 鍒犻櫎鏄庣粏锛堟寜涓昏〃Id鍒犻櫎锛� int detailResult = db.Deleteable<MesCgthSqDetail>() - .Where(d => (d.Eid.ToString() ?? string.Empty) == mainErpId) + .Where(d => d.Mid == mainId) .ExecuteCommand(); - // 2. 鍒犻櫎涓昏〃锛堥�氳繃ERPID鍏宠仈锛� + // 2. 鍒犻櫎涓昏〃锛堟寜Id鍒犻櫎锛� int mainResult = db.Deleteable<MesCgthSq>() - .Where(m => (m.ErpId.ToString() ?? string.Empty) == mainErpId) + .Where(m => m.Id == mainId) .ExecuteCommand(); - return mainResult > 0 && detailResult >= 0; // 鍏佽鏄庣粏鍘熸湰涓嶅瓨鍦紙>=0锛� + // 鍏佽鏄庣粏鍘熸湰涓嶅瓨鍦紙detailResult=0锛夛紝浣嗕富琛ㄥ繀椤诲垹闄ゆ垚鍔� + return mainResult > 0; } /// <summary> - /// ErpCgtha 鏄犲皠鍒� MesCgthSq锛堜粎鏄犲皠ErpCgtha涓瓨鍦ㄧ殑瀛楁锛� + /// 涓昏〃鏄犲皠锛堜粎澶勭悊鍩虹瀛楁锛孖d鐢盙etOrCreateMainId纭畾锛� /// </summary> private MesCgthSq MapErpCgthaToMesCgthSq(ErpCgtha erpMain) { return new MesCgthSq { - // 涓昏〃鏍稿績瀛楁锛堜粎浠嶦rpCgtha鍙栧�硷級 + // Id鏆備笉璧嬪�硷紙鐢盙etOrCreateMainId鍚庣画纭畾锛� ErpId = erpMain.ERPID, // ERP涓昏〃ID - BillNo = erpMain.billNo, // 鍗曟嵁缂栧彿 - Type = erpMain.TYPE, // 鎿嶄綔绫诲瀷 - FDate = erpMain.FDate, // 閫�鏂欐棩鏈� - FDocumentStatus = erpMain.FDocumentStatus, // 鍗曟嵁鐘舵�� - FSupplierId = erpMain.FSupplierID, // 渚涘簲鍟咺D - FBillTypeId = erpMain.FBillTypeID, // 鍗曟嵁绫诲瀷 - FBusinessType = erpMain.FBusinessType, // 涓氬姟绫诲瀷 - ReturnType = erpMain.FMRTYPE, // 閫�鏂欑被鍨嬶紙瀵瑰簲ErpCgtha鐨勯��鏂欑被鍨嬶級 - ReturnMethod = erpMain.FMRMODE, // 閫�鏂欐柟寮忥紙瀵瑰簲ErpCgtha鐨勯��鏂欐柟寮忥級 - CreateBy = erpMain.FCreatorId, // 鍒涘缓浜� - FPurchaseOrgId = erpMain.FPurchaseOrgId, // 閲囪喘缁勭粐 - ThOrgId = erpMain.FStockOrgId, // 閫�鏂欑粍缁� - FRequireOrgId = erpMain.FRequireOrgId, // 闇�姹傜粍缁� - FMRDeptId = erpMain.FMRDeptId, // 閫�鏂欓儴闂� - FStockerId = erpMain.FSTOCKERID, // 浠撶鍛� - FPurchaserId = erpMain.FPURCHASERID, // 閲囪喘鍛� - FMRReason = erpMain.FMRREASON, // 閫�鏂欏師鍥� - FPurchaseDeptId = erpMain.FPURCHASEDEPTID, // 閲囪喘閮ㄩ棬 - FPurchaserGroupId = erpMain.FPURCHASERGROUPID, // 閲囪喘缁� - FACCTYPE = erpMain.FACCTYPE, // 楠屾敹鏂瑰紡 - FCreateDate = erpMain.FCreateDate, // 鍒涘缓鏃ユ湡 - FWPVTINTEGERL6W = erpMain.F_WPVT_INTEGER_L6W, // 鎵爜鏍囪瘑 - // DepotId = string.IsNullOrEmpty(erpMain.FSTOCKID) - // ? null - // : Convert.ToInt32(erpMain.FSTOCKID), // 浠撳簱ID锛堣浆鎹负int锛� - SuppId = string.IsNullOrEmpty(erpMain.FSupplierID) - ? null - : Convert.ToInt32(erpMain.FSupplierID), // 渚涘簲鍟咺D锛堣浆鎹负int锛� - // 绯荤粺鑷姩璧嬪�煎瓧娈� + BillNo = erpMain.billNo ?? throw new ArgumentNullException(nameof(erpMain.billNo), "鍗曟嵁缂栧彿涓嶈兘涓虹┖"), + Type = erpMain.TYPE, + FDate = erpMain.FDate, + FDocumentStatus = erpMain.FDocumentStatus, + FSupplierId = erpMain.FSupplierID, + FBillTypeId = erpMain.FBillTypeID, + FBusinessType = erpMain.FBusinessType, + ReturnType = erpMain.FMRTYPE, + ReturnMethod = erpMain.FMRMODE, + CreateBy = erpMain.FCreatorId, + FPurchaseOrgId = erpMain.FPurchaseOrgId, + ThOrgId = erpMain.FStockOrgId, + FRequireOrgId = erpMain.FRequireOrgId, + FMRDeptId = erpMain.FMRDeptId, + FStockerId = erpMain.FSTOCKERID, + FPurchaserId = erpMain.FPURCHASERID, + FMRReason = erpMain.FMRREASON, + FPurchaseDeptId = erpMain.FPURCHASEDEPTID, + FPurchaserGroupId = erpMain.FPURCHASERGROUPID, + FACCTYPE = erpMain.FACCTYPE, + FCreateDate = erpMain.FCreateDate, + FWPVTINTEGERL6W = erpMain.F_WPVT_INTEGER_L6W, + + // 渚涘簲鍟咺D锛堝畨鍏ㄨ浆鎹級 + SuppId = !string.IsNullOrEmpty(erpMain.FSupplierID) + && int.TryParse(erpMain.FSupplierID, out int suppId) + ? suppId + : null, + + // 绯荤粺瀛楁锛堝垱寤烘椂闂翠粎鏂板鏃惰祴鍊硷紝鏇存柊鏃朵笉瑕嗙洊锛� CreateDate = DateTime.Now, LastUpdateTime = DateTime.Now }; } /// <summary> - /// ErpCgthB 鏄犲皠鍒� MesCgthSqDetail锛堜粎鏄犲皠ErpCgthB涓瓨鍦ㄧ殑瀛楁锛� + /// 鏄庣粏琛ㄦ槧灏勶紙浣跨敤鎻愬墠纭畾鐨刴ainId浣滀负Mid锛� /// </summary> private List<MesCgthSqDetail> MapErpCgthBToMesCgthSqDetail(List<ErpCgthB> erpDetails, Guid mainId) { return erpDetails.Select(erpDetail => new MesCgthSqDetail { - // 鍏宠仈涓昏〃ID - Mid= mainId, // 涓昏〃ID锛圡esCgthSq鐨処d锛� - // 鏄庣粏鏍稿績瀛楁锛堜粎浠嶦rpCgthB鍙栧�硷級 - ErpId = string.IsNullOrEmpty(erpDetail.ERPID) ? null : Convert.ToInt32(erpDetail.ERPID), // ERP鏄庣粏ID - Eid = string.IsNullOrEmpty(erpDetail.EID) ? null : Convert.ToInt32(erpDetail.EID), // 澶栭儴绯荤粺ID - FsrcBillNo = erpDetail.FSRCBillNo, // 婧愬崟鍗曞彿 - FsrcBillTypeId = erpDetail.FSRCBillTypeId, // 婧愬崟绫诲瀷 - ItemId = string.IsNullOrEmpty(erpDetail.FMATERIALID) - ? null - : Convert.ToInt32(erpDetail.FMATERIALID), // 鐗╂枡ID - FUnitId = erpDetail.FUnitID, // 搴撳瓨鍗曚綅 - DepotId = string.IsNullOrEmpty(erpDetail.FSTOCKID) ? null : Convert.ToInt64(erpDetail.FSTOCKID), // 浠撳簱ID - FstockLocId = erpDetail.FSTOCKLOCID, // 浠撲綅 - FLot = erpDetail.FLot, // 鎵瑰彿 - SqNum = erpDetail.FRMREALQTY, // 瀹為��鏁伴噺 - Remark = erpDetail.FNOTE, // 澶囨敞 - FMtoNo = erpDetail.FMtoNo, // 璁″垝璺熻釜鍙� - // 绯荤粺鑷姩璧嬪�煎瓧娈� + Mid = mainId, // 鐩存帴浣跨敤鎻愬墠纭畾鐨刴ainId锛堢‘淇濋潪鍏ㄩ浂锛� + + // ERP鏄庣粏ID锛堝畨鍏ㄨ浆鎹級 + ErpId = !string.IsNullOrEmpty(erpDetail.ERPID) + && int.TryParse(erpDetail.ERPID, out int erpId) + ? erpId + : null, + + // 澶栭儴绯荤粺ID锛堝畨鍏ㄨ浆鎹級 + Eid = !string.IsNullOrEmpty(erpDetail.EID) + && int.TryParse(erpDetail.EID, out int eid) + ? eid + : null, + + FsrcBillNo = erpDetail.FSRCBillNo, + FsrcBillTypeId = erpDetail.FSRCBillTypeId, + + // 鐗╂枡ID锛堝畨鍏ㄨ浆鎹級 + ItemId = !string.IsNullOrEmpty(erpDetail.FMATERIALID) + && int.TryParse(erpDetail.FMATERIALID, out int itemId) + ? itemId + : null, + + FUnitId = erpDetail.FUnitID, + + // 浠撳簱ID锛堝畨鍏ㄨ浆鎹級 + DepotId = !string.IsNullOrEmpty(erpDetail.FSTOCKID) + && long.TryParse(erpDetail.FSTOCKID, out long depotId) + ? depotId + : null, + + FstockLocId = erpDetail.FSTOCKLOCID, + FLot = erpDetail.FLot, + SqNum = erpDetail.FRMREALQTY, // 鍋囪FRMREALQTY鏄暟鍊肩被鍨嬶紙濡俤ecimal锛� + Remark = erpDetail.FNOTE, + FMtoNo = erpDetail.FMtoNo, IsFinish = false // 鍒濆鏈畬鎴� }).ToList(); } - - } \ No newline at end of file +} \ No newline at end of file -- Gitblit v1.9.3