From b1a419c2886666934da6499ee552516d0769562e Mon Sep 17 00:00:00 2001
From: heshaofeng <heshaofeng@hnkhzn.com>
Date: 星期四, 16 四月 2026 13:40:56 +0800
Subject: [PATCH] Merge branch 'htq20251215' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu into htq20251215

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs |  591 ++++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 385 insertions(+), 206 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
index 5507932..96e47b5 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
@@ -36,6 +36,8 @@
 using WIDESEA_DTO.Allocate;
 using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
 using WIDESEA_IRecordService;
+using Microsoft.AspNetCore.Http;
+using MailKit.Net.Smtp;
 
 namespace WIDESEA_OutboundService
 {
@@ -2322,6 +2324,10 @@
             {
                 return WebResponseContent.Instance.Error("鏈壘鍒版弧瓒冲嚭搴撴潯浠剁殑鍑哄簱鍗�");
             }
+            if(outboundOrder.IsBatch == 0)
+            {
+                return WebResponseContent.Instance.Error("璇ュ崟鎹笉灞炰簬鍒嗘壒鍥炰紶鍗曟嵁锛屼笉鍏佽铏氭嫙鍑哄叆搴�");
+            }
             //鍏堟竻绌哄崟鎹櫄鎷熷嚭鍏ュ簱鏁伴噺杩涜璁$畻
             foreach (var item in outboundOrder.Details)
             {
@@ -2332,258 +2338,374 @@
             return WebResponseContent.Instance.OK("鎴愬姛");
 
         }
-        public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut)
+
+    public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut)
+    {
+        try
         {
-            try
+            Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>()
+                .Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
+                .Includes(x => x.Details)
+                .First();
+            if (inboundOrder == null)
             {
-                Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
-                if (inboundOrder == null)
-                {
-                    return WebResponseContent.Instance.Error($"鏈壘鍒伴噰璐崟锛歿noStockOut.inOder}");
-                }
-                Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
-                if (outboundOrder == null)
-                {
-                    return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撳崟锛歿noStockOut.inOder}");
-                }
+                return WebResponseContent.Instance.Error($"鏈壘鍒伴噰璐崟锛歿noStockOut.inOder}");
+            }
 
-                //瀛樺偍鍏ュ簱鍗曟嵁鏄庣粏淇℃伅
-                var detailLists = new List<Dt_InboundOrderDetail>();
+            Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>()
+                .Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+                .Includes(x => x.Details)
+                .First();
+            if (outboundOrder == null)
+            {
+                return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撳崟锛歿noStockOut.outOder}");
+            }
 
-                var matchedDetail = inboundOrder.Details.FirstOrDefault(detail =>
-                    detail.Barcode == noStockOut.barCode &&
-                    detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
+            var detailLists = new List<Dt_InboundOrderDetail>();
+            var matchedDetail = inboundOrder.Details.FirstOrDefault(detail =>
+                detail.Barcode == noStockOut.barCode &&
+                detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()&& detail.ReceiptQuantity == 0);
+
+            if (matchedDetail == null)
+            {
+                matchedDetail = inboundOrder.Details.FirstOrDefault(detail =>
+                    detail.OutBoxbarcodes == noStockOut.barCode &&
+                    detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && detail.ReceiptQuantity == 0);
 
                 if (matchedDetail == null)
                 {
-                    matchedDetail = inboundOrder.Details.FirstOrDefault(detail =>
-                        detail.OutBoxbarcodes == noStockOut.barCode &&
-                        detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
-
-                    if (matchedDetail == null)
-                    {
-                        return WebResponseContent.Instance.Error($"鍦ㄩ噰璐崟 {noStockOut.inOder} 涓湭鎵惧埌鏉$爜涓� {noStockOut.barCode} 鐨勬槑缁嗐��");
-                    }
-                    else
-                    {
-
-                        // 娣诲姞鎵�鏈夐潪瀹屾垚鐘舵�佺殑鏄庣粏鏉$爜
-                        foreach (var detail in inboundOrder.Details)
-                        {
-                            if (detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() &&
-                                !string.IsNullOrEmpty(detail.Barcode)&& detail.OutBoxbarcodes == noStockOut.barCode)
-                            {
-                                detailLists.Add(detail);
-                            }
-                        }
-                    }
+                    return WebResponseContent.Instance.Error($"鍦ㄩ噰璐崟 {noStockOut.inOder} 涓湭鎵惧埌鏉$爜涓� {noStockOut.barCode} 鐨勫彲鍑哄簱鏄庣粏銆�");
                 }
                 else
                 {
-                    if (!string.IsNullOrEmpty(noStockOut.barCode))
+                    // 娣诲姞鎵�鏈夊尮閰嶅绠辩爜涓旈潪瀹屾垚鐘舵�佺殑鏄庣粏
+                    foreach (var detail in inboundOrder.Details)
                     {
-                        detailLists.Add(matchedDetail);
+                        if (detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() &&
+                            !string.IsNullOrEmpty(detail.Barcode) &&
+                            detail.OutBoxbarcodes == noStockOut.barCode && detail.OrderQuantity > detail.NoStockOutQty)
+                        {
+                            detailLists.Add(detail);
+                        }
                     }
                 }
-                
+            }
+            else
+            {
+                if (!string.IsNullOrEmpty(noStockOut.barCode))
+                {
+                    detailLists.Add(matchedDetail);
+                }
+            }
+                if (!detailLists.Any())
+                {
+                    return WebResponseContent.Instance.Error("璇ユ潯鐮佸凡缁忔病鏈夊彲鍑哄簱鏁伴噺");
+                }
                 var outDetails = new List<Dt_OutboundOrderDetail>();
-
+                // 閬嶅巻姣忎釜鍏ュ簱鏄庣粏
                 foreach (var item in detailLists)
                 {
+                    // 閲嶇疆褰撳墠鍏ュ簱鏄庣粏鐨勬棤搴撳瓨鍑哄簱鏁伴噺
                     item.NoStockOutQty = 0;
 
-                    var matchedCode = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == item.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()&& detail.OrderQuantity - detail.LockQuantity - detail.MoveQty - detail.NoStockOutQty > 0);
+                    // 褰撳墠鏉$爜闇�瑕佸嚭搴撶殑鎬绘暟閲忥紙鍏ュ簱鍗曞墿浣欏彲鍑烘暟閲忥級
+                    decimal remainingBarcodeQty = item.OrderQuantity - item.ReceiptQuantity;
+                    if (remainingBarcodeQty <= 0)
+                    {
+                        return WebResponseContent.Instance.Error($"璇ラ噰璐崟涓殑鏉$爜{item.Barcode}瀵瑰簲鐨勫彲鍑烘暟閲忎负0");
+                    }
 
-                    if (matchedCode != null)
+                    // 绛涢�夊嚭搴撳崟涓鍚堟潯浠剁殑鏄庣粏锛堝悓鐗╂枡銆侀潪瀹屾垚銆佹湁鍓╀綑鍙嚭鏁伴噺锛�
+                    var eligibleOutDetails = outboundOrder.Details.Where(detail =>
+                        detail.MaterielCode == item.MaterielCode &&
+                        detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() &&
+                        (detail.OrderQuantity - detail.LockQuantity - detail.MoveQty - detail.NoStockOutQty) > 0).ToList();
+
+                    if (!eligibleOutDetails.Any())
                     {
-                        if(matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty - matchedCode.NoStockOutQty < 0)
-                        {
-                            return WebResponseContent.Instance.Error($"鐗╂枡{item.MaterielCode}鍙嚭鏁伴噺婧㈠嚭{(matchedCode.LockQuantity + matchedCode.MoveQty + matchedCode.NoStockOutQty) - matchedCode.OrderQuantity}");
-                        }
+                        return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟涓湭鎵惧埌鐗╂枡{item.MaterielCode}鐨勫彲鍑哄簱鏄庣粏");
                     }
-                    else
+
+                    // 閬嶅巻绗﹀悎鏉′欢鐨勫嚭搴撴槑缁嗭紝閫愯鍒嗛厤鏁伴噺
+                    foreach (var outDetail in eligibleOutDetails)
                     {
-                        return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚腑鐨剓item.MaterielCode} 瀵瑰簲鐨勭墿鏂�");
-                    }
-                    if (!matchedCode.BatchNo.IsNullOrEmpty() && matchedCode.BatchNo != "")
-                    {
-                        var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.BatchNo == item.BatchNo);
-                        if (matcheBatch == null)
+                        // 璁$畻褰撳墠鍑哄簱琛岀殑鍓╀綑鍙嚭鏁伴噺
+                        decimal rowRemainingQty = outDetail.OrderQuantity - outDetail.LockQuantity - outDetail.MoveQty - outDetail.NoStockOutQty;
+                        if (rowRemainingQty <= 0) continue;
+
+                        if (!outDetail.BatchNo.IsNullOrEmpty())
                         {
-                            return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曟壒娆′腑鐨剓item.BatchNo} 瀵瑰簲鐨勭墿鏂欍��");
-                        }
-                    }
-                    if (!matchedCode.SupplyCode.IsNullOrEmpty() && matchedCode.SupplyCode != "")
-                    {
-                        var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.SupplyCode == item.SupplyCode);
-                        if (matcheBatch == null)
-                        {
-                            return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚緵搴斿晢涓殑{item.SupplyCode} 瀵瑰簲鐨勭墿鏂欍��");
-                        }
-                    }
-                    if (!outboundOrder.FactoryArea.IsNullOrEmpty() && outboundOrder.FactoryArea != "" && !inboundOrder.FactoryArea.IsNullOrEmpty() && inboundOrder.FactoryArea != "")
-                    {
-                        if (inboundOrder.FactoryArea != outboundOrder.FactoryArea)
-                        {
-                            return WebResponseContent.Instance.Error($"璇ユ潯鐮亄item.Barcode}瀵瑰簲鐨勫崟鎹巶鍖轰笌鍑哄簱鍗曟嵁涓嶄竴鑷达紒涓嶅厑璁稿嚭搴撱��");
-                        }
-                    }
-                    if(inboundOrder.BusinessType != "11")
-                    {
-                        if (!matchedCode.WarehouseCode.IsNullOrEmpty() && matchedCode.WarehouseCode != "")
-                        {
-                            var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.WarehouseCode == item.WarehouseCode);
-                            if (matcheBatch == null)
+                            if (outDetail.BatchNo != item.BatchNo)
                             {
-                                return WebResponseContent.Instance.Error($"浠撳簱涓嶄竴鑷达紒鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚粨搴撲腑鐨剓item.WarehouseCode} 瀵瑰簲鐨勭墿鏂欍��");
+                                return WebResponseContent.Instance.Error($"鍑哄簱鍗曡鎵规{outDetail.BatchNo}涓庨噰璐崟鎵规{item.BatchNo}涓嶅尮閰�");
                             }
                         }
-                    }
-                    else
-                    {
-                        item.WarehouseCode = matchedCode.WarehouseCode;
+                        if (!outDetail.SupplyCode.IsNullOrEmpty())
+                        {
+                            if (outDetail.SupplyCode != item.SupplyCode)
+                            {
+                                return WebResponseContent.Instance.Error($"鍑哄簱鍗曡渚涘簲鍟唟outDetail.SupplyCode}涓庨噰璐崟渚涘簲鍟唟item.SupplyCode}涓嶅尮閰�");
+                            }
+                        }
+                        if (!string.IsNullOrEmpty(outboundOrder.FactoryArea) && !string.IsNullOrEmpty(inboundOrder.FactoryArea))
+                        {
+                            if (inboundOrder.FactoryArea != outboundOrder.FactoryArea)
+                            {
+                                return WebResponseContent.Instance.Error($"璇ユ潯鐮亄item.Barcode}瀵瑰簲鐨勫崟鎹巶鍖轰笌鍑哄簱鍗曟嵁涓嶄竴鑷达紒涓嶅厑璁稿嚭搴撱��");
+                            }
+                        }
+                        if (inboundOrder.BusinessType != "11" && !outDetail.WarehouseCode.IsNullOrEmpty())
+                        {
+                            if (outDetail.WarehouseCode != item.WarehouseCode)
+                            {
+                                return WebResponseContent.Instance.Error($"浠撳簱涓嶄竴鑷达紒鍑哄簱鍗曡浠撳簱{outDetail.WarehouseCode}涓庨噰璐崟浠撳簱{item.WarehouseCode}涓嶅尮閰�");
+                            }
+                        }
+                        else
+                        {
+                            item.WarehouseCode = outDetail.WarehouseCode;
+                        }
+
+                        // 璁$畻鏈鍒嗛厤鐨勬暟閲忥紙鍙栧墿浣欐潯鐮佹暟閲忓拰褰撳墠琛屽墿浣欐暟閲忕殑杈冨皬鍊硷級
+                        decimal assignQty = Math.Min(remainingBarcodeQty, rowRemainingQty);
+
+                        // 鏇存柊鍏ュ簱鏄庣粏鍜屽嚭搴撴槑缁嗙殑鏃犲簱瀛樺嚭搴撴暟閲�
+                        item.NoStockOutQty += assignQty;
+                        outDetail.NoStockOutQty += assignQty;
+
+                        // 鏇存柊鍓╀綑闇�瑕佸垎閰嶇殑鏉$爜鏁伴噺
+                        remainingBarcodeQty -= assignQty;
+
+                        // 璁板綍宸叉洿鏂扮殑鍑哄簱鏄庣粏锛堝幓閲嶏級
+                        if (!outDetails.Contains(outDetail))
+                        {
+                            outDetails.Add(outDetail);
+                        }
+
+                        // 楠岃瘉褰撳墠琛屾槸鍚︽孩鍑�
+                        if ((outDetail.LockQuantity + outDetail.NoStockOutQty + outDetail.MoveQty) > outDetail.OrderQuantity)
+                        {
+                            return WebResponseContent.Instance.Error($"鍑哄簱鍗曟槑缁唟outDetail.Id}鏁伴噺婧㈠嚭锛岃秴鍑烘暟閲忥細{(outDetail.LockQuantity + outDetail.NoStockOutQty + outDetail.MoveQty) - outDetail.OrderQuantity}");
+                        }
+
+                        // 澶勭悊MES鍙傛暟鍥炰紶锛氳褰曞綋鍓嶆潯鐮佸垎閰嶅埌璇ヨ鐨勫疄闄呮暟閲�
+                        List<Barcodes> barcodesList = new List<Barcodes>();
+                        Barcodes barcodes = new Barcodes
+                        {
+                            Barcode = item.Barcode,
+                            Qty = assignQty,
+                            SupplyCode = item?.SupplyCode ?? "",
+                            BatchNo = item?.BatchNo ?? "",
+                            Unit = item?.Unit ?? ""
+                        };
+                        // 鍙嶅簭鍒楀寲璇ヨ宸叉湁鐨勬潯鐮佽褰�
+                        if (!string.IsNullOrEmpty(outDetail.documentsNO))
+                        {
+                            try
+                            {
+                                barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(outDetail.documentsNO) ?? new List<Barcodes>();
+                            }
+                            catch (JsonException ex)
+                            {
+                                return WebResponseContent.Instance.Error($"鍑哄簱鍗曟槑缁唟outDetail.Id}鐨刣ocumentsNO瀛楁鏍煎紡閿欒锛歿ex.Message}");
+                            }
+                        }
+                        // 娣诲姞鏈鍒嗛厤鐨勮褰�
+                        barcodesList.Add(barcodes);
+                        // 搴忓垪鍖栧洖瀛�
+                        JsonSerializerSettings settings = new JsonSerializerSettings
+                        {
+                            ContractResolver = new CamelCasePropertyNamesContractResolver()
+                        };
+                        outDetail.documentsNO = JsonConvert.SerializeObject(barcodesList, settings);
+
+                        // 鏉$爜鏁伴噺鍒嗛厤瀹屾瘯锛岄��鍑哄綋鍓嶈寰幆
+                        if (remainingBarcodeQty <= 0)
+                        {
+                            break;
+                        }
                     }
 
-                    //鍓╀綑鍏ュ簱鏁伴噺鍗宠櫄鎷熷嚭鍏ュ簱鍓╀綑鍙嚭鏁伴噺
-                    decimal outQuantity = item.OrderQuantity - item.ReceiptQuantity;
-                    if (outQuantity == 0)
+                    // 鎵�鏈夌鍚堟潯浠剁殑鍑哄簱琛岄亶鍘嗗畬鍚庯紝鏉$爜鏁伴噺浠嶆湁鍓╀綑
+                    if (remainingBarcodeQty > 0)
                     {
-                        return WebResponseContent.Instance.Error($"璇ラ噰璐崟涓殑鏉$爜瀵瑰簲鐨勫彲鍑烘暟閲忎负0");
+                        return WebResponseContent.Instance.Error($"鏉$爜{item.Barcode}闇�鍑哄簱鏁伴噺{item.OrderQuantity - item.ReceiptQuantity}锛屼絾鍑哄簱鍗曚腑鐗╂枡{item.MaterielCode}鍓╀綑鍙嚭鎬婚噺涓嶈冻锛屼粛鍓╀綑{remainingBarcodeQty}鏁伴噺鏈垎閰�");
                     }
-                    if (matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty - matchedCode.NoStockOutQty < outQuantity)
-                    {
-                        return WebResponseContent.Instance.Error($"璇ラ噰璐崟涓殑鏉$爜瀵瑰簲鐨勫彲鍑烘暟閲忚秴鍑哄嚭搴撳崟鍑哄簱鏁伴噺{item.OrderQuantity - (matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty)},涓嶆弧瓒虫暣鍖呭嚭搴�");
-                    }
-                    //鍗曟嵁鍑哄簱閿佸畾鏁伴噺
-                    item.NoStockOutQty += outQuantity;
-                    matchedCode.NoStockOutQty += outQuantity;
-
-                    //鍥炰紶MES鍙傛暟
-                    List<Barcodes> barcodesList = new List<Barcodes>();
-                    Barcodes barcodes = new Barcodes
-                    {
-                        Barcode = item.Barcode,
-                        Qty = item.BarcodeQty,
-                        SupplyCode = item?.SupplyCode ?? "",
-                        BatchNo = item?.BatchNo ?? "",
-                        Unit = item?.Unit ?? ""
-                    };
-                    if (!string.IsNullOrEmpty(matchedCode.documentsNO))
-                    {
-                        barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>();
-                    }
-                    barcodesList.Add(barcodes);
-                    JsonSerializerSettings settings = new JsonSerializerSettings
-                    {
-                        ContractResolver = new CamelCasePropertyNamesContractResolver()
-                    };
-                    matchedCode.documentsNO = JsonConvert.SerializeObject(barcodesList, settings);
-
-
-                    if ((matchedCode.LockQuantity + matchedCode.NoStockOutQty+matchedCode.MoveQty) > matchedCode.OrderQuantity)
-                    {
-                        return WebResponseContent.Instance.Error($"鍑哄簱鍗曟槑缁嗘暟閲忔孩鍑簕matchedCode.OrderQuantity - matchedCode.LockQuantity-matchedCode.NoStockOutQty-matchedCode.MoveQty}");
-                    }
-
-                    outDetails.Add(matchedCode);
                 }
 
                 _unitOfWorkManage.BeginTran();
-                _inboundOrderDetailService.UpdateData(detailLists);
-                _outboundOrderDetailService.UpdateData(outDetails);
-                _unitOfWorkManage.CommitTran();
-                return WebResponseContent.Instance.OK("鎴愬姛",data:detailLists);
-            }
-            catch (Exception ex)
-            {
-                _unitOfWorkManage.RollbackTran();
-                return WebResponseContent.Instance.Error(ex.Message);
-            }
+            _inboundOrderDetailService.UpdateData(detailLists);
+            _outboundOrderDetailService.UpdateData(outDetails);
+            _unitOfWorkManage.CommitTran();
+
+            return WebResponseContent.Instance.OK("鎴愬姛", data: detailLists);
         }
-
-
-        public WebResponseContent DeleteBarcode(NoStockOutModel noStockOut)
+        catch (Exception ex)
         {
-            try
+            _unitOfWorkManage.RollbackTran();
+            return WebResponseContent.Instance.Error(ex.Message);
+        }
+    }
+
+
+    public WebResponseContent DeleteBarcode(NoStockOutModel noStockOut)
+    {
+        try
+        {
+            Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>()
+                .Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
+                .Includes(x => x.Details)
+                .First();
+            if (inboundOrder == null)
             {
-                Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
-                if (inboundOrder == null)
-                {
-                    return WebResponseContent.Instance.Error($"鏈壘鍒伴噰璐崟锛歿noStockOut.inOder}");
-                }
-                var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == noStockOut.barCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
+                return WebResponseContent.Instance.Error($"鏈壘鍒伴噰璐崟锛歿noStockOut.inOder}");
+            }
 
-                if (matchedDetail == null)
-                {
-                    return WebResponseContent.Instance.Error($"鍦ㄩ噰璐崟 {noStockOut.inOder} 涓湭鎵惧埌鏉$爜涓� {noStockOut.barCode} 鐨勬槑缁嗐��");
-                }
-                matchedDetail.NoStockOutQty = 0;
+            var matchedDetail = inboundOrder.Details.FirstOrDefault(detail =>
+                detail.Barcode == noStockOut.barCode &&
+                detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
 
-                if (matchedDetail.ReceiptQuantity == 0 && matchedDetail.OverInQuantity == 0)
-                {
-                    matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt();
-                }
+            if (matchedDetail == null)
+            {
+                return WebResponseContent.Instance.Error($"鍦ㄩ噰璐崟 {noStockOut.inOder} 涓湭鎵惧埌鏉$爜涓� {noStockOut.barCode} 鐨勬槑缁嗐��");
+            }
 
-                Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
-                if (outboundOrder == null)
-                {
-                    return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撳崟锛歿noStockOut.inOder}");
-                }
+            // 閲嶇疆鍏ュ簱鏄庣粏鐨勬棤搴撳瓨鍑哄簱鏁伴噺
+            decimal revokedTotalQty = matchedDetail.NoStockOutQty; // 璁板綍闇�瑕佹挙閿�鐨勬�绘暟閲忥紙鍏ュ簱鍗曚腑宸插垎閰嶇殑鏁伴噺锛�
+            matchedDetail.NoStockOutQty = 0;
+            if(inboundOrder.BusinessType == "11")
+            {
+                matchedDetail.WarehouseCode ="";
+            }
 
-                // 鎾ら攢鍥炰紶MES鍙傛暟
+            // 閲嶇疆鍏ュ簱鏄庣粏鐘舵��
+            if (matchedDetail.ReceiptQuantity == 0 && matchedDetail.OverInQuantity == 0)
+            {
+                matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt();
+            }
+
+            Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>()
+                .Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+                .Includes(x => x.Details)
+                .First();
+            if (outboundOrder == null)
+            {
+                return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撳崟锛歿noStockOut.outOder}");
+            }
+
+            // 鎵惧埌鎵�鏈夊叧鑱旇鏉$爜鐨勫嚭搴撴槑缁嗚
+            // 鍚岀墿鏂欍�侀潪瀹屾垚鐘舵�併�乨ocumentsNO鍖呭惈璇ユ潯鐮�
+            var matchedCodeList = outboundOrder.Details.Where(detail =>
+                detail.MaterielCode == matchedDetail.MaterielCode && // 纭繚鐗╂枡鍖归厤
+                detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() &&
+                !string.IsNullOrEmpty(detail.documentsNO) &&
+                detail.documentsNO.Contains(noStockOut.barCode) // 鍖呭惈褰撳墠鏉$爜
+            ).ToList();
+
+            if (!matchedCodeList.Any())
+            {
+                return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟涓湭鎵惧埌鍏宠仈鏉$爜{noStockOut.barCode}鐨勭墿鏂檣matchedDetail.MaterielCode}鏄庣粏銆�");
+            }
+
+            //閫愯澶勭悊鍑哄簱鏄庣粏鐨勬挙閿�閫昏緫
+            decimal remainingRevokeQty = revokedTotalQty; // 鍓╀綑闇�瑕佹挙閿�鐨勬暟閲�
+            foreach (var matchedCode in matchedCodeList)
+            {
+                if (remainingRevokeQty <= 0) break; // 鎵�鏈夋暟閲忓凡鎾ら攢锛岄��鍑哄惊鐜�
+
+                // 澶勭悊MES鍙傛暟鎾ら攢
                 List<Barcodes> barcodesList = new List<Barcodes>();
-                Barcodes barcodes = new Barcodes
-                {
-                    Barcode = matchedDetail.Barcode,
-                    Qty = matchedDetail.BarcodeQty,
-                    SupplyCode = matchedDetail?.SupplyCode ?? "",
-                    BatchNo = matchedDetail?.BatchNo ?? "",
-                    Unit = matchedDetail?.Unit ?? ""
-                };
-                var matchedCode = outboundOrder.Details.FirstOrDefault(detail =>
-                    detail.documentsNO.Contains(barcodes.Barcode) &&
-                    detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()
-                );
-
-                if (matchedCode == null)
-                {
-                    return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚腑鐨剓matchedDetail.MaterielCode} 瀵瑰簲鐨勭墿鏂欍��");
-                }
-
                 if (!string.IsNullOrEmpty(matchedCode.documentsNO))
                 {
-                    barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>();
+                    try
+                    {
+                        barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>();
+                    }
+                    catch (JsonException ex)
+                    {
+                        return WebResponseContent.Instance.Error($"鍑哄簱鍗曟槑缁唟matchedCode.Id}鐨刣ocumentsNO瀛楁鏍煎紡閿欒锛歿ex.Message}");
+                    }
                 }
-                barcodesList.RemoveAll(b =>
-                    string.Equals(b.Barcode, barcodes.Barcode, StringComparison.OrdinalIgnoreCase)
-                );
 
+                // 绛涢�夊嚭褰撳墠鏉$爜鐨勬墍鏈夎褰�
+                var barcodeRecords = barcodesList.Where(b =>
+                    string.Equals(b.Barcode, noStockOut.barCode, StringComparison.OrdinalIgnoreCase)).ToList();
+                if (!barcodeRecords.Any()) continue;
+
+                // 璁$畻璇ヨ闇�瑕佹挙閿�鐨勬暟閲忥紙绱姞璇ユ潯鐮佸湪璇ヨ鐨勬墍鏈夊垎閰嶆暟閲忥級
+                decimal rowRevokeQty = barcodeRecords.Sum(b => b.Qty);
+                // 瀹為檯鎾ら攢鏁伴噺锛氬彇璇ヨ鍙挙閿�鏁伴噺鍜屽墿浣欓渶瑕佹挙閿�鏁伴噺鐨勮緝灏忓��
+                decimal actualRevokeQty = Math.Min(rowRevokeQty, remainingRevokeQty);
+
+                // 绉婚櫎璇ヨ涓鏉$爜鐨勮褰曪紙鎴栭儴鍒嗚褰曪紝鑻ュ墿浣欐挙閿�鏁伴噺涓嶈冻锛�
+                if (actualRevokeQty < rowRevokeQty)
+                {
+                    // 鍓╀綑鎾ら攢鏁伴噺涓嶈冻锛屽彧绉婚櫎閮ㄥ垎璁板綍锛堟寜鏁伴噺鎵e噺锛�
+                    decimal tempQty = actualRevokeQty;
+                    var removeList = new List<Barcodes>();
+                    foreach (var record in barcodeRecords)
+                    {
+                        if (tempQty <= 0) break;
+                        if (record.Qty <= tempQty)
+                        {
+                            removeList.Add(record);
+                            tempQty -= record.Qty;
+                        }
+                        else
+                        {
+                            // 璁板綍鏁伴噺鎷嗗垎锛屾墸鍑忛儴鍒嗘暟閲�
+                            record.Qty -= tempQty;
+                            tempQty = 0;
+                        }
+                    }
+                    barcodesList.RemoveAll(b => removeList.Contains(b));
+                }
+                else
+                {
+                    // 绉婚櫎璇ヨ涓鏉$爜鐨勬墍鏈夎褰�
+                    barcodesList.RemoveAll(b =>
+                        string.Equals(b.Barcode, noStockOut.barCode, StringComparison.OrdinalIgnoreCase));
+                }
+
+                //閲嶆柊搴忓垪鍖朚ES鍙傛暟
                 JsonSerializerSettings settings = new JsonSerializerSettings
                 {
                     ContractResolver = new CamelCasePropertyNamesContractResolver()
                 };
                 matchedCode.documentsNO = JsonConvert.SerializeObject(barcodesList, settings);
 
-                matchedCode.NoStockOutQty -= matchedDetail.OrderQuantity;
+                //鎵e噺鍑哄簱鏄庣粏鐨勬棤搴撳瓨鍑哄簱鏁伴噺
+                matchedCode.NoStockOutQty = Math.Max(0, matchedCode.NoStockOutQty - actualRevokeQty);
+                remainingRevokeQty -= actualRevokeQty;
+
+                //閲嶇疆鍑哄簱鏄庣粏鐘舵��
                 if (matchedCode.LockQuantity == 0 && matchedCode.OverOutQuantity == 0)
                 {
                     matchedCode.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt();
                 }
-                _unitOfWorkManage.BeginTran();
-                _inboundOrderDetailService.UpdateData(matchedDetail);
-                _outboundOrderDetailService.UpdateData(matchedCode);
-                _unitOfWorkManage.CommitTran();
-                return WebResponseContent.Instance.OK();
-
             }
-            catch (Exception ex)
+
+            //鑻ヤ粛鏈夋湭鎾ら攢鐨勬暟閲忥紝璇存槑鏁版嵁涓嶄竴鑷�
+            if (remainingRevokeQty > 0)
             {
-                _unitOfWorkManage.RollbackTran();
-                return WebResponseContent.Instance.Error(ex.Message);
+                return WebResponseContent.Instance.Error($"鎾ら攢鏉$爜{noStockOut.barCode}鏃讹紝鍑哄簱鍗曚腑鍙挙閿�鏁伴噺涓嶈冻锛屼粛鏈墈remainingRevokeQty}鏁伴噺鏈挙閿�");
             }
-        }
 
-        public async Task<WebResponseContent> NoStockOutSubmit(NoStockOutSubmit noStockOutSubmit)
+            _unitOfWorkManage.BeginTran();
+            _inboundOrderDetailService.UpdateData(matchedDetail);
+            _outboundOrderDetailService.UpdateData(matchedCodeList);
+            _unitOfWorkManage.CommitTran();
+
+            return WebResponseContent.Instance.OK("鏉$爜鎾ら攢鎴愬姛", data: new { RevokedQty = revokedTotalQty });
+        }
+        catch (Exception ex)
+        {
+            _unitOfWorkManage.RollbackTran();
+            return WebResponseContent.Instance.Error(ex.Message);
+        }
+    }
+
+    public async Task<WebResponseContent> NoStockOutSubmit(NoStockOutSubmit noStockOutSubmit)
         {
             try
             {
@@ -2711,13 +2833,13 @@
                 {
                     item.LockQuantity += item.NoStockOutQty;
                     item.OverOutQuantity += item.NoStockOutQty;
-                    item.CurrentDeliveryQty = item.NoStockOutQty;
+                    item.CurrentDeliveryQty += item.NoStockOutQty;
                     //娣诲姞鍥炰紶MES鍙傛暟
                     List<Barcodes> barcodesList = new List<Barcodes>();
                     List<Barcodes> documentsNOList = new List<Barcodes>();
                     if (!string.IsNullOrEmpty(item.ReturnJsonData))
                     {
-                        barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(item.documentsNO) ?? new List<Barcodes>();
+                        barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(item.ReturnJsonData) ?? new List<Barcodes>();
                     }
                     if (!string.IsNullOrEmpty(item.documentsNO) && item.documentsNO!="")
                     {
@@ -2766,8 +2888,13 @@
                 if (CheckOutboundOrderCompleted(outboundOrder.OrderNo))
                 {
                     outboundOrder.OrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
-                    _outboundOrderService.UpdateData(outboundOrder);
+
                 }
+                else
+                {
+                    outboundOrder.OrderStatus = OutOrderStatusEnum.鍑哄簱涓�.ObjToInt();
+                }
+                _outboundOrderService.UpdateData(outboundOrder);
                 _unitOfWorkManage.CommitTran();
                 //鍑哄簱鍥炰紶MES
                 _feedbackMesService.OutboundFeedback(outboundOrder.OrderNo);
@@ -2841,19 +2968,45 @@
 
                     var response = NoStockOutresponseModel(inboundOrder, 3, null, allocatefeedmodel);
 
-                    if (response != null && response.IsSuccess)
+                    if (response != null && response.IsSuccess && response.Data.Code == "200")
                     {
                         _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
                             .Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand();
-                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
-                            .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
+                        else if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱涓�.ObjToInt())
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 3 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
+                        else
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
                     }
                     else
                     {
                         _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 })
                             .Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand();
-                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus =2})
-                            .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
+                        else if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱涓�.ObjToInt())
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 4 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
+                        else
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
                         return content.Error("鍥炰紶MES澶辫触");
                     }
                 }
@@ -2878,18 +3031,44 @@
                     }
                     var response = NoStockOutresponseModel(inboundOrder, 3, feedmodel);
 
-                    if (response != null && response.IsSuccess)
+                    if (response != null && response.IsSuccess && response.Data.Code == "200")
                     {
                         _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
                             .Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand();
-                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
-                            .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
+                        else if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱涓�.ObjToInt())
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 3 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
+                        else
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
                     }
                     else
                     {
                         _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 }).Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand();
-                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2 })
-                            .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
+                        else if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱涓�.ObjToInt())
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 4 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
+                        else
+                        {
+                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 })
+                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+                        }
                         return content.Error("鍥炰紶MES澶辫触");
                     }
                 }

--
Gitblit v1.9.3