From c5751829f3a3dc86a510c90fb5e987d72533a08e Mon Sep 17 00:00:00 2001
From: 如洲 陈 <1278080563@qq.com>
Date: 星期三, 24 九月 2025 09:56:03 +0800
Subject: [PATCH] 退货通知单

---
 MES.Service/service/BasicData/SalesReturnNoticeManager.cs |  267 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 266 insertions(+), 1 deletions(-)

diff --git a/MES.Service/service/BasicData/SalesReturnNoticeManager.cs b/MES.Service/service/BasicData/SalesReturnNoticeManager.cs
index 206f0ea..53e0f51 100644
--- a/MES.Service/service/BasicData/SalesReturnNoticeManager.cs
+++ b/MES.Service/service/BasicData/SalesReturnNoticeManager.cs
@@ -1,4 +1,6 @@
-锘縰sing MES.Service.DB;
+锘縰sing System.Globalization;
+using MES.Service.DB;
+using MES.Service.Dto.webApi;
 using MES.Service.Modes;
 using SqlSugar;
 
@@ -8,6 +10,269 @@
 {
     //褰撳墠绫诲凡缁忕户鎵夸簡 Repository 澧炪�佸垹銆佹煡銆佹敼鐨勬柟娉�
 
+    private readonly SalesReturnNoticeDetailManager _SalesReturnDetailManager =
+        new();
+
+    //ErpSalesReturn
+    public bool Save(ErpSalesReturn SalesReturn)
+    {
+        var erpSalesReturnDto = SalesReturn.OrderDto;
+        var mesSalesReturn = ConvertErpToSalesReturn(SalesReturn.OrderDto);
+        var mesSalesReturnDatas =
+            ConvertErpToSalesReturnDetail(SalesReturn.Items);
+
+        return UseTransaction(db =>
+        {
+            switch (erpSalesReturnDto.Type)
+            {
+                // case "2":
+                //     return InsertData(db, mesSalesReturn, mesSalesReturnDatas,
+                //         rohInErpRohIn.FBILLTYPE)
+                //         ? 1
+                //         : 0;
+                case "3":
+                    return UpdateData(db, mesSalesReturn, mesSalesReturnDatas)
+                        ? 1
+                        : 0;
+                case "2":
+                case "4":
+                    return SaveOrUpdateData(db, mesSalesReturn,
+                        mesSalesReturnDatas, erpSalesReturnDto.Type)
+                        ? 1
+                        : 0;
+                default:
+                    throw new NotImplementedException(
+                        $"type娌℃湁{erpSalesReturnDto.Type}杩欎釜绫诲瀷");
+            }
+        }) > 0;
+    }
+
+    private bool UpdateData(SqlSugarScope db, SalesReturnNotice mesSalesReturn,
+        List<SalesReturnNoticeDetail> mesSalesReturnDatas)
+    {
+        // 鍏堝垹闄や粠琛ㄦ暟鎹紙鏄庣粏琛級
+        var deleteDetails = db.Deleteable<SalesReturnNoticeDetail>()
+            .Where(s => s.ErpHeadId == mesSalesReturn.ErpId)
+            .ExecuteCommand() >= 0; // 浣跨敤>=0锛屽洜涓哄彲鑳芥病鏈夋槑缁嗘暟鎹�
+
+        // 鍐嶅垹闄や富琛ㄦ暟鎹�
+        var deleteMain = base.DeleteById(mesSalesReturn.Id);
+
+        if (deleteMain && deleteDetails) return true;
+        throw new NotImplementedException("鍒犻櫎澶辫触");
+    }
+
+    // 鎻掑叆鎴栨洿鏂版暟鎹殑鏂规硶
+    private bool SaveOrUpdateData(SqlSugarScope db,
+        SalesReturnNotice mesSalesReturn,
+        List<SalesReturnNoticeDetail> mesSalesReturnDatas, string type)
+    {
+        // 濡傛灉瀛樺湪涓昏〃璁板綍锛屽厛鍒犻櫎浠庤〃鏁版嵁锛屽啀鍒犻櫎涓昏〃
+        if (mesSalesReturn.Id != null)
+        {
+            // 鍏堝垹闄や粠琛ㄦ暟鎹紙鏄庣粏琛級
+            db.Deleteable<SalesReturnNoticeDetail>()
+                .Where(s => s.ErpHeadId == mesSalesReturn.ErpId)
+                .ExecuteCommand();
+            
+            // 鍐嶅垹闄や富琛ㄦ暟鎹�
+            base.DeleteById(mesSalesReturn.Id);
+        }
+        else
+        {
+            // 濡傛灉涓昏〃涓嶅瓨鍦紝浣嗗彲鑳芥湁浠庤〃鏁版嵁锛屼篃鍒犻櫎浠庤〃鏁版嵁
+            db.Deleteable<SalesReturnNoticeDetail>()
+                .Where(s => s.ErpHeadId == mesSalesReturn.ErpId)
+                .ExecuteCommand();
+        }
+
+        // 鎻掑叆鏂扮殑涓昏〃鏁版嵁
+        var orUpdate = base.Insert(mesSalesReturn);
+        
+        // 鎻掑叆鏂扮殑浠庤〃鏁版嵁
+        var baOrUpdate = true;
+        if (mesSalesReturnDatas.Count > 0)
+        {
+            baOrUpdate = _SalesReturnDetailManager.InsertRange(mesSalesReturnDatas);
+        }
+        
+        if (orUpdate && baOrUpdate) return true;
+
+        throw new NotImplementedException("鎻掑叆鎴栨洿鏂板け璐�");
+    }
+
+    // 鎵归噺淇濆瓨璁板綍鐨勬柟娉�
+    public bool SaveList(List<ErpSalesReturn> salesOrder)
+    {
+        var result = salesOrder.Select(Save).ToList();
+        return result.All(b => b);
+    }
+
+    // 閲嶅啓DeleteById鏂规硶锛屽疄鐜扮骇鑱斿垹闄�
+    public new bool DeleteById(object id)
+    {
+        return UseTransaction(db =>
+        {
+            // 鍏堣幏鍙栦富琛ㄨ褰曪紝鑾峰彇ErpId鐢ㄤ簬鍒犻櫎浠庤〃
+            var mainRecord = base.GetById(Convert.ToDecimal(id));
+            if (mainRecord != null)
+            {
+                // 鍏堝垹闄や粠琛ㄦ暟鎹紙鏄庣粏琛級
+                db.Deleteable<SalesReturnNoticeDetail>()
+                    .Where(s => s.ErpHeadId == mainRecord.ErpId)
+                    .ExecuteCommand();
+            }
+            
+            // 鍐嶅垹闄や富琛ㄦ暟鎹�
+            return base.DeleteById(id) ? 1 : 0;
+        }) > 0;
+    }
+
+    // 閲嶅啓DeleteByIds鏂规硶锛屽疄鐜扮骇鑱斿垹闄�
+    public new bool DeleteByIds(object[] ids)
+    {
+        return UseTransaction(db =>
+        {
+            var successCount = 0;
+            foreach (var id in ids)
+            {
+                // 鍏堣幏鍙栦富琛ㄨ褰曪紝鑾峰彇ErpId鐢ㄤ簬鍒犻櫎浠庤〃
+                var mainRecord = base.GetById(Convert.ToDecimal(id));
+                if (mainRecord != null)
+                {
+                    // 鍏堝垹闄や粠琛ㄦ暟鎹紙鏄庣粏琛級
+                    db.Deleteable<SalesReturnNoticeDetail>()
+                        .Where(s => s.ErpHeadId == mainRecord.ErpId)
+                        .ExecuteCommand();
+                }
+                
+                // 鍐嶅垹闄や富琛ㄦ暟鎹�
+                if (base.DeleteById(id))
+                {
+                    successCount++;
+                }
+            }
+            return successCount;
+        }) > 0;
+    }
+
+    private SalesReturnNotice ConvertErpToSalesReturn(
+        ErpSalesReturnDto erpDto)
+    {
+        DateTime parsedDate;
+
+        // 鏃堕棿鏍煎紡杞崲鍑芥暟锛孍RP鏃堕棿鏍煎紡涓� "yyyy-MM-dd HH:mm:ss"
+        DateTime? ParseDateTime(string dateStr)
+        {
+            if (DateTime.TryParseExact(dateStr, "yyyy-MM-dd HH:mm:ss",
+                    CultureInfo.InvariantCulture,
+                    DateTimeStyles.None,
+                    out parsedDate))
+                return parsedDate;
+
+            return null; // 濡傛灉杞崲澶辫触锛岃繑鍥瀗ull
+        }
+
+        var salesOrder = new SalesReturnNotice
+        {
+            BillNo = erpDto.FBillNo,
+            ErpId = erpDto.ErpID,
+            FDate = ParseDateTime(erpDto.FDate) ?? null,
+            BillType = erpDto.FBillTypeID, // 鍗曟嵁绫诲瀷
+            Currency = erpDto.FSettleCurrld, // 缁撶畻甯佸埆
+            SalesDept = erpDto.FSaleDeptId, //閿�鍞儴闂�
+            ReturnCustomer = erpDto.FRetcustId, // 閫�璐у鎴�
+            ReturnReason = erpDto.FRetcustReason, // 閫�璐у師鍥�
+            DeliveryLocation = erpDto.FHeadLocId, // 浜よ揣鍦扮偣
+            InventoryDept = erpDto.FRetDeptId, // 搴撳瓨閮ㄩ棬
+            InventoryGroup = erpDto.FStockerGroupId, // 搴撳瓨缁�
+            WarehouseManager = erpDto.FStockerId, // 浠撶鍛�
+            SalesGroup = erpDto.FSaleGroupId, // 閿�鍞粍
+            SalesPerson = erpDto.FSalesManId, //閿�鍞憳
+            Receiver = erpDto.FReceiveCusId, // 鏀惰揣鏂�
+            ReceiverContact = erpDto.FReceiveCusContact, // 鏀惰揣鏂硅仈绯讳汉
+            ReceiverAddress = erpDto.FReceiveAddress, // 鏀惰揣鏂瑰湴鍧�
+            ReceiverName = erpDto.FLinkMan, // 鏀惰揣鏂瑰鍚�
+            SettleParty = erpDto.FSettleCusId, // 缁撶畻鏂�  
+            CreatedBy = erpDto.FCreatorId, // 鍒涘缓浜�
+            CreatedDate = ParseDateTime(erpDto.FCreateDate) ?? null, // 鍒涘缓鏃堕棿
+            ModifiedBy = erpDto.FModifierId, // 淇敼浜�
+            ModifiedDate = ParseDateTime(erpDto.FModifyDate) ?? null, // 淇敼鏃堕棿
+            ClosedBy = erpDto.FCloserId, // 鍏抽棴浜�
+            CloseReason = erpDto.FCloseReason, // 鍏抽棴鍘熷洜
+            CloseDate = ParseDateTime(erpDto.FCloseDate) ?? null, // 鍏抽棴鏃ユ湡
+            ApprovedBy = erpDto.FApproverId, // 瀹℃牳浜�
+            ApprovedDate = ParseDateTime(erpDto.FApproveDate) ?? null, // 瀹℃牳鏃ユ湡
+            CancelStatus = erpDto.FCancelStatus, // 浣滃簾鐘舵��
+            CancelledBy = erpDto.FCancellerId, // 浣滃簾浜�
+            CancelDate = ParseDateTime(erpDto.FCancelDate) ?? null, // 浣滃簾鏃ユ湡
+            CloseStatus = erpDto.FBillCloseStatus, // 鍏抽棴鐘舵��
+            BillStatus = erpDto.FDocumentStatus //鍗曟嵁鐘舵��
+        };
+
+        var single = base.GetSingle(it => it.ErpId == erpDto.ErpID);
+        if (single != null) salesOrder.Id = single.Id;
+
+        return salesOrder;
+    }
+
+    private List<SalesReturnNoticeDetail> ConvertErpToSalesReturnDetail(
+        List<ErpSalesReturnDetailDto> erpDtoList)
+
+    {
+        var salesOrderSubList =
+            new List<SalesReturnNoticeDetail>();
+
+        DateTime parsedDate;
+
+        // 鏃堕棿鏍煎紡杞崲鍑芥暟锛孍RP鏃堕棿鏍煎紡涓� "yyyy-MM-dd HH:mm:ss"
+        DateTime? ParseDateTime(string dateStr)
+        {
+            if (DateTime.TryParseExact(dateStr, "yyyy-MM-dd HH:mm:ss",
+                    CultureInfo.InvariantCulture,
+                    DateTimeStyles.None,
+                    out parsedDate))
+                return parsedDate;
+
+            return null; // 濡傛灉杞崲澶辫触锛岃繑鍥瀗ull
+        }
+
+
+        foreach (var erpDto in erpDtoList)
+        {
+            var salesOrderSub = new SalesReturnNoticeDetail
+            {
+                ErpLineId = erpDto.ErpID, //ERP琛孖D
+                ErpHeadId = erpDto.EHID, //ERP澶碔D
+                MaterialId = erpDto.FMaterialId, //鐗╂枡缂栧彿
+                SalesUnitId = erpDto.FUnitID, //閿�鍞崟浣�
+                SalesQuantity = Convert.ToDecimal(erpDto.FQty), //閿�鍞暟閲�
+                IsFree = erpDto.FIsFree, //鏄惁璧犲搧
+                ReturnDate = ParseDateTime(erpDto.FDeliverydate), //閫�璐ф棩鏈�
+                Warehouse = erpDto.FStockId, //浠撳簱
+                PlanTrackingNumber = erpDto.FMtoNo, //璁″垝璺熻釜鍙�
+                LotNumber = erpDto.FLot, //鎵瑰彿
+                Note = erpDto.FEntryDescription, //澶囨敞
+                ReturnType = erpDto.FRmType, //閫�璐х被鍨�
+                InventoryUnit = erpDto.FStockUnitID, //搴撳瓨鍗曚綅
+                InventoryQuantity = Convert.ToDecimal(erpDto.FStockQty), //搴撳瓨鏁伴噺
+                OwnerTypeId = erpDto.FOwnerTypeID, //璐т富绫诲瀷
+                OwnerId = erpDto.FOwnerId, //璐т富
+                SourceBillType = erpDto.FSrcType,
+                SourceBillNo = erpDto.FSrcBillNo,
+                OrderBillNo = erpDto.FOrderNo
+            };
+
+            var single = _SalesReturnDetailManager.GetSingle(it =>
+                it.ErpLineId == salesOrderSub.ErpLineId);
+            if (single != null) salesOrderSub.Id = single.Id;
+
+            salesOrderSubList.Add(salesOrderSub);
+        }
+
+        return salesOrderSubList;
+    }
+
     //杩欓噷闈㈠啓鐨勪唬鐮佷笉浼氱粰瑕嗙洊,濡傛灉瑕侀噸鏂扮敓鎴愯鍒犻櫎 SalesReturnNoticeManager.cs
 
 

--
Gitblit v1.9.3