From 3e420f0a8da362be4ab54406d7bc7c1309e074da Mon Sep 17 00:00:00 2001
From: 如洲 陈 <1278080563@qq.com>
Date: 星期五, 24 十月 2025 10:25:24 +0800
Subject: [PATCH] 修改销售订单接口和销售退货接口

---
 MES.Service/service/Warehouse/MesReturnwareManager.cs |  198 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 198 insertions(+), 0 deletions(-)

diff --git a/MES.Service/service/Warehouse/MesReturnwareManager.cs b/MES.Service/service/Warehouse/MesReturnwareManager.cs
index 7bb85c8..34b1397 100644
--- a/MES.Service/service/Warehouse/MesReturnwareManager.cs
+++ b/MES.Service/service/Warehouse/MesReturnwareManager.cs
@@ -200,6 +200,11 @@
         {
             return UseTransaction(db =>
             {
+                // 鍦ㄥ垹闄ゅ墠锛屽厛鑾峰彇瑕佸垹闄ょ殑閫�璐ч�氱煡鍗曟槑缁嗭紝鐢ㄤ簬鍚庣画閲嶆柊璁$畻閿�鍞鍗曠姸鎬�
+                var returnDetailsToDelete = db.Queryable<MesReturnwareDetails>()
+                    .Where(it => it.ReturnNo == data.FBillNo && it.ReturnType == data.FBillTypeID)
+                    .ToList();
+
                 // 鍏堝垹闄ら��璐ч�氱煡鍗曟槑缁�
                 var detailsDeleted = db.Deleteable<MesReturnwareDetails>()
                       .Where(it => it.ReturnNo == data.FBillNo &&
@@ -216,6 +221,13 @@
                 {
                     // 鍒犻櫎鎴愬姛鍚庯紝璋冪敤瀛樺偍杩囩▼鍒犻櫎瀵瑰簲鐨勬楠屽崟
                     DeleteInspectionOrder(db, data.FBillTypeID, data.FBillNo);
+                    
+                    // 閲嶆柊璁$畻骞舵洿鏂扮浉鍏抽攢鍞鍗曠殑over鐘舵�侊紙涓庣敓鎴愭椂閫昏緫鐩稿悓锛�
+                    if (returnDetailsToDelete.Any())
+                    {
+                        UpdateSalesOrderOverStatusAfterDelete(db, returnDetailsToDelete);
+                    }
+                    
                     return 1;
                 }
                 
@@ -256,6 +268,9 @@
                 else
                 {
                     Console.WriteLine($"鐢熸垚妫�楠屽崟鎴愬姛: {message}");
+                    
+                    // 鐢熸垚妫�楠屽崟鎴愬姛鍚庯紝鏇存柊鐩稿叧閿�鍞鍗曠殑over瀛楁
+                    UpdateSalesOrderOverStatus(db, mesReturnwareDetails);
                 }
             }
             catch (Exception ex)
@@ -266,6 +281,189 @@
         }
 
         /// <summary>
+        /// 鏇存柊閿�鍞鍗曠殑over鐘舵��
+        /// 浣跨敤缁熶竴閫昏緫锛歄RDER_QUANTITY + GIFT_QUANTITY + 閫�璐ф暟閲� = DELIVERED_QUANTITY + DELIVERED_GIFT_QUANTITY + XTCH
+        /// </summary>
+        /// <param name="db">鏁版嵁搴撹繛鎺�</param>
+        /// <param name="mesReturnwareDetails">閫�璐ч�氱煡鍗曟槑缁嗗垪琛�</param>
+        private void UpdateSalesOrderOverStatus(SqlSugarScope db, List<MesReturnwareDetails> mesReturnwareDetails)
+        {
+            try
+            {
+                // 鑾峰彇鎵�鏈夐渶瑕佹洿鏂扮殑璁㈠崟淇℃伅锛堝幓閲嶏級
+                var orderUpdates = mesReturnwareDetails
+                    .Where(detail => !string.IsNullOrEmpty(detail.OrderNo) && !string.IsNullOrEmpty(detail.OrderType))
+                    .Select(detail => new { detail.OrderNo, detail.OrderType })
+                    .Distinct()
+                    .ToList();
+
+                foreach (var orderInfo in orderUpdates)
+                {
+                    // 鑾峰彇璇ヨ鍗曠殑鎵�鏈夋槑缁�
+                    var orderDetails = db.Queryable<MesSalesOrderDetail>()
+                        .Where(it => it.OrderId == orderInfo.OrderNo && it.OrderType == orderInfo.OrderType)
+                        .ToList();
+
+                    if (!orderDetails.Any())
+                    {
+                        Console.WriteLine($"鏈壘鍒伴攢鍞鍗曟槑缁� {orderInfo.OrderType}-{orderInfo.OrderNo}锛岃烦杩囨洿鏂�");
+                        continue;
+                    }
+
+                    // 妫�鏌ユ瘡涓鍗曟槑缁嗘槸鍚﹀畬鎴�
+                    bool allCompleted = true;
+
+                    foreach (var orderDetail in orderDetails)
+                    {
+                        // 鏌ユ壘鍖归厤鐨勯��璐ф槑缁嗭細閫氳繃ORDER_TYPE, ORDER_ID, LINE_NUMBER, PRODUCT_CODE杩涜鍖归厤
+                        var matchingReturnDetails = mesReturnwareDetails
+                            .Where(detail => detail.OrderType == orderDetail.OrderType && 
+                                           detail.OrderNo == orderDetail.OrderId && 
+                                           detail.OrderNumber == orderDetail.OrderNumber && 
+                                           detail.ItemNo == orderDetail.ProductCode)
+                            .ToList();
+
+                        // 璁$畻鍖归厤鐨勯��璐ф暟閲�
+                        var returnQuantity = matchingReturnDetails.Sum(x => (x.Quantity ?? 0) + (x.ActualQuantity ?? 0));
+
+                        // 璁$畻璁㈠崟鎬绘暟閲忥細ORDER_QUANTITY + GIFT_QUANTITY + 閿�鍞��璐ч�氱煡鍗曚腑鐨勬暟閲�
+                        var orderTotal = (orderDetail.OrderQuantity ?? 0) + 
+                                       (orderDetail.GiftQuantity ?? 0) + 
+                                       returnQuantity;
+
+                        // 璁$畻宸蹭氦浠樻�绘暟閲忥細DELIVERED_QUANTITY + DELIVERED_GIFT_QUANTITY + XTCH(閿�閫�鍑鸿揣鏁伴噺)
+                        var deliveredTotal = (orderDetail.DeliveredQuantity ?? 0) + 
+                                           (orderDetail.DeliveredGiftQuantity ?? 0) + 
+                                           (orderDetail.Xtch ?? 0);
+
+                        // 濡傛灉璁㈠崟鎬绘暟閲忎笉绛変簬宸蹭氦浠樻�绘暟閲忥紝鍒欒鏄庣粏鏈畬鎴�
+                        if (orderTotal != deliveredTotal)
+                        {
+                            allCompleted = false;
+                            Console.WriteLine($"璁㈠崟鏄庣粏 {orderDetail.ProductCode} 鏈畬鎴�: 璁㈠崟鎬绘暟閲�={orderTotal}, 宸蹭氦浠樻�绘暟閲�={deliveredTotal} (璁㈠崟:{orderDetail.OrderQuantity ?? 0} + 璧犲搧:{orderDetail.GiftQuantity ?? 0} + 閫�璐�:{returnQuantity} = 宸蹭氦浠�:{orderDetail.DeliveredQuantity ?? 0} + 宸蹭氦浠樿禒鍝�:{orderDetail.DeliveredGiftQuantity ?? 0} + 閿�閫�鍑鸿揣:{orderDetail.Xtch ?? 0})");
+                            break;
+                        }
+                    }
+
+                    // 鏍规嵁鏄惁鍏ㄩ儴瀹屾垚璁剧疆over鍊�
+                    decimal overValue = allCompleted ? 1 : 0;
+
+                    // 鏇存柊MES_SALES_ORDER琛ㄧ殑over瀛楁
+                    var updateCount = db.Updateable<MesSalesOrder>()
+                        .SetColumns(it => it.Over == overValue)
+                        .Where(it => it.OrderId == orderInfo.OrderNo && it.OrderType == orderInfo.OrderType)
+                        .ExecuteCommand();
+
+                    if (updateCount > 0)
+                    {
+                        Console.WriteLine($"鎴愬姛鏇存柊閿�鍞鍗� {orderInfo.OrderType}-{orderInfo.OrderNo} 鐨刼ver鐘舵�佷负{overValue} ({(allCompleted ? "宸插畬鎴�" : "鏈畬鎴�")})");
+                    }
+                    else
+                    {
+                        Console.WriteLine($"鏈壘鍒伴攢鍞鍗� {orderInfo.OrderType}-{orderInfo.OrderNo}锛岃烦杩囨洿鏂�");
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                // 璁板綍閿欒鏃ュ織锛屼絾涓嶅奖鍝嶉��璐ч�氱煡鍗曠殑淇濆瓨
+                Console.WriteLine($"鏇存柊閿�鍞鍗昽ver鐘舵�佹椂鍙戠敓閿欒: {ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 鍒犻櫎閫�璐ч�氱煡鍗曞悗閲嶆柊璁$畻骞舵洿鏂扮浉鍏抽攢鍞鍗曠殑over鐘舵��
+        /// 浣跨敤涓庣敓鎴愭椂鐩稿悓鐨勯�昏緫锛歄RDER_QUANTITY + GIFT_QUANTITY + 閫�璐ф暟閲� = DELIVERED_QUANTITY + DELIVERED_GIFT_QUANTITY + XTCH
+        /// </summary>
+        /// <param name="db">鏁版嵁搴撹繛鎺�</param>
+        /// <param name="deletedReturnDetails">宸插垹闄ょ殑閫�璐ч�氱煡鍗曟槑缁嗗垪琛�</param>
+        private void UpdateSalesOrderOverStatusAfterDelete(SqlSugarScope db, List<MesReturnwareDetails> deletedReturnDetails)
+        {
+            try
+            {
+                // 鑾峰彇鎵�鏈夐渶瑕侀噸鏂拌绠楃殑璁㈠崟淇℃伅锛堝幓閲嶏級
+                var orderUpdates = deletedReturnDetails
+                    .Where(detail => !string.IsNullOrEmpty(detail.OrderNo) && !string.IsNullOrEmpty(detail.OrderType))
+                    .Select(detail => new { detail.OrderNo, detail.OrderType })
+                    .Distinct()
+                    .ToList();
+
+                foreach (var orderInfo in orderUpdates)
+                {
+                    // 鑾峰彇璇ヨ鍗曠殑鎵�鏈夋槑缁�
+                    var orderDetails = db.Queryable<MesSalesOrderDetail>()
+                        .Where(it => it.OrderId == orderInfo.OrderNo && it.OrderType == orderInfo.OrderType)
+                        .ToList();
+
+                    if (!orderDetails.Any())
+                    {
+                        Console.WriteLine($"鏈壘鍒伴攢鍞鍗曟槑缁� {orderInfo.OrderType}-{orderInfo.OrderNo}锛岃烦杩囨洿鏂�");
+                        continue;
+                    }
+
+                    // 妫�鏌ユ瘡涓鍗曟槑缁嗘槸鍚﹀畬鎴�
+                    bool allCompleted = true;
+
+                    foreach (var orderDetail in orderDetails)
+                    {
+                        // 鏌ユ壘鎵�鏈夊尮閰嶇殑閫�璐ф槑缁嗭紙鍖呮嫭鍏朵粬鏈垹闄ょ殑閫�璐ч�氱煡鍗曪級
+                        // 閫氳繃ORDER_TYPE, ORDER_ID, LINE_NUMBER, PRODUCT_CODE杩涜鍖归厤
+                        var matchingReturnDetails = db.Queryable<MesReturnwareDetails>()
+                            .Where(detail => detail.OrderType == orderDetail.OrderType && 
+                                           detail.OrderNo == orderDetail.OrderId && 
+                                           detail.OrderNumber == orderDetail.OrderNumber && 
+                                           detail.ItemNo == orderDetail.ProductCode)
+                            .ToList();
+
+                        // 璁$畻鍖归厤鐨勯��璐ф暟閲�
+                        var returnQuantity = matchingReturnDetails.Sum(x => (x.Quantity ?? 0) + (x.ActualQuantity ?? 0));
+
+                        // 璁$畻璁㈠崟鎬绘暟閲忥細ORDER_QUANTITY + GIFT_QUANTITY + 閿�鍞��璐ч�氱煡鍗曚腑鐨勬暟閲�
+                        var orderTotal = (orderDetail.OrderQuantity ?? 0) + 
+                                       (orderDetail.GiftQuantity ?? 0) + 
+                                       returnQuantity;
+
+                        // 璁$畻宸蹭氦浠樻�绘暟閲忥細DELIVERED_QUANTITY + DELIVERED_GIFT_QUANTITY + XTCH(閿�閫�鍑鸿揣鏁伴噺)
+                        var deliveredTotal = (orderDetail.DeliveredQuantity ?? 0) + 
+                                           (orderDetail.DeliveredGiftQuantity ?? 0) + 
+                                           (orderDetail.Xtch ?? 0);
+
+                        // 濡傛灉璁㈠崟鎬绘暟閲忎笉绛変簬宸蹭氦浠樻�绘暟閲忥紝鍒欒鏄庣粏鏈畬鎴�
+                        if (orderTotal != deliveredTotal)
+                        {
+                            allCompleted = false;
+                            Console.WriteLine($"鍒犻櫎閫�璐ч�氱煡鍗曞悗锛岃鍗曟槑缁� {orderDetail.ProductCode} 鏈畬鎴�: 璁㈠崟鎬绘暟閲�={orderTotal}, 宸蹭氦浠樻�绘暟閲�={deliveredTotal} (璁㈠崟:{orderDetail.OrderQuantity ?? 0} + 璧犲搧:{orderDetail.GiftQuantity ?? 0} + 閫�璐�:{returnQuantity} = 宸蹭氦浠�:{orderDetail.DeliveredQuantity ?? 0} + 宸蹭氦浠樿禒鍝�:{orderDetail.DeliveredGiftQuantity ?? 0} + 閿�閫�鍑鸿揣:{orderDetail.Xtch ?? 0})");
+                            break;
+                        }
+                    }
+
+                    // 鏍规嵁鏄惁鍏ㄩ儴瀹屾垚璁剧疆over鍊�
+                    decimal overValue = allCompleted ? 1 : 0;
+
+                    // 鏇存柊MES_SALES_ORDER琛ㄧ殑over瀛楁
+                    var updateCount = db.Updateable<MesSalesOrder>()
+                        .SetColumns(it => it.Over == overValue)
+                        .Where(it => it.OrderId == orderInfo.OrderNo && it.OrderType == orderInfo.OrderType)
+                        .ExecuteCommand();
+
+                    if (updateCount > 0)
+                    {
+                        Console.WriteLine($"鍒犻櫎閫�璐ч�氱煡鍗曞悗锛屾垚鍔熸洿鏂伴攢鍞鍗� {orderInfo.OrderType}-{orderInfo.OrderNo} 鐨刼ver鐘舵�佷负{overValue} ({(allCompleted ? "宸插畬鎴�" : "鏈畬鎴�")})");
+                    }
+                    else
+                    {
+                        Console.WriteLine($"鍒犻櫎閫�璐ч�氱煡鍗曞悗锛屾湭鎵惧埌閿�鍞鍗� {orderInfo.OrderType}-{orderInfo.OrderNo}锛岃烦杩囨洿鏂�");
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                // 璁板綍閿欒鏃ュ織锛屼絾涓嶅奖鍝嶉��璐ч�氱煡鍗曠殑鍒犻櫎
+                Console.WriteLine($"鍒犻櫎閫�璐ч�氱煡鍗曞悗鏇存柊閿�鍞鍗昽ver鐘舵�佹椂鍙戠敓閿欒: {ex.Message}");
+            }
+        }
+
+        /// <summary>
         /// 璋冪敤瀛樺偍杩囩▼鍒犻櫎妫�楠屽崟
         /// </summary>
         /// <param name="db">鏁版嵁搴撹繛鎺�</param>

--
Gitblit v1.9.3