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