From b13d3d2c634df625dcaa74371f1d36a8376851b4 Mon Sep 17 00:00:00 2001
From: heshaofeng <heshaofeng@hnkhzn.com>
Date: 星期二, 06 一月 2026 14:54:16 +0800
Subject: [PATCH] 优化撤销组盘功能

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs |  804 ++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 536 insertions(+), 268 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 d244dd5..586cd82 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"
@@ -1,5 +1,8 @@
 锘縰sing MailKit.Search;
 using Microsoft.Extensions.Logging;
+using Microsoft.IdentityModel.Tokens;
+using Newtonsoft.Json.Serialization;
+using Newtonsoft.Json;
 using SqlSugar;
 using WIDESEA_BasicService;
 using WIDESEA_Common.CommonEnum;
@@ -15,6 +18,7 @@
 using WIDESEA_DTO.Basic;
 using WIDESEA_DTO.Inbound;
 using WIDESEA_DTO.Outbound;
+using WIDESEA_DTO.ReturnMES;
 using WIDESEA_IAllocateService;
 using WIDESEA_IBasicService;
 using WIDESEA_ICheckService;
@@ -26,6 +30,10 @@
 using WIDESEA_Model.Models.Basic;
 using WIDESEA_Model.Models.Check;
 using WIDESEA_Model.Models.Outbound;
+using Org.BouncyCastle.Asn1.Ocsp;
+using WIDESEA_BasicService.MESOperation;
+using WIDESEA_Core.Util;
+using WIDESEA_DTO.Allocate;
 
 namespace WIDESEA_OutboundService
 {
@@ -58,6 +66,10 @@
         private readonly ITask_HtyService _task_HtyService;
         private readonly ILogger<OutboundPickingService> _logger;
         private readonly IRepository<Dt_InterfaceLog> _interfaceLog;
+        private readonly IInboundService _inboundService;
+        private readonly IFeedbackMesService _feedbackMesService;
+        private readonly HttpClientHelper _httpClientHelper;
+        private readonly IRepository<Dt_MesReturnRecord> _mesReturnRecord;
 
         private Dictionary<string, string> stations = new Dictionary<string, string>
         {
@@ -76,7 +88,7 @@
         public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService,
             IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService,
             IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService, IOutboundOrderService outboundOrderService,
-            IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService, IAllocateService allocateService, IRepository<Dt_InboundOrder> inboundOrderRepository, IInboundOrderDetailService inboundOrderDetailService, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IReCheckOrderService reCheckOrderService, ITask_HtyService task_HtyService, IRepository<Dt_InterfaceLog> interfaceLog) : base(BaseDal)
+            IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService, IAllocateService allocateService, IRepository<Dt_InboundOrder> inboundOrderRepository, IInboundOrderDetailService inboundOrderDetailService, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IReCheckOrderService reCheckOrderService, ITask_HtyService task_HtyService, IRepository<Dt_InterfaceLog> interfaceLog, IInboundService inboundService, IFeedbackMesService feedbackMesService, HttpClientHelper httpClientHelper, IRepository<Dt_MesReturnRecord> mesReturnRecord) : base(BaseDal)
         {
             _unitOfWorkManage = unitOfWorkManage;
             _stockInfoService = stockInfoService;
@@ -99,6 +111,11 @@
             _reCheckOrderService = reCheckOrderService;
             _task_HtyService = task_HtyService;
             _interfaceLog = interfaceLog;
+            _inboundService = inboundService;
+            _feedbackMesService = feedbackMesService;
+            _httpClientHelper = httpClientHelper;
+            _mesReturnRecord = mesReturnRecord;
+
         }
 
         #endregion
@@ -2292,12 +2309,21 @@
             return WebResponseContent.Instance.OK("鎴愬姛", data: InOderCodes);
         }
 
-        public WebResponseContent GetAvailablePickingOrders()
+        public WebResponseContent GetAvailablePickingOrders(string outOrder)
         {
-            List<Dt_OutboundOrder> outOders = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).ToList();
-
-            List<string> outOderCodes = outOders.Select(x => x.UpperOrderNo).ToList();
-            return WebResponseContent.Instance.OK("鎴愬姛", data: outOderCodes);
+            Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == outOrder && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).Includes(x=>x.Details).First();
+            if(outboundOrder == null)
+            {
+                return WebResponseContent.Instance.Error("鏈壘鍒版弧瓒冲嚭搴撴潯浠剁殑鍑哄簱鍗�");
+            }
+            //鍏堟竻绌哄崟鎹櫄鎷熷嚭鍏ュ簱鏁伴噺杩涜璁$畻
+            foreach (var item in outboundOrder.Details)
+            {
+                item.NoStockOutQty = 0;
+                item.documentsNO = "";
+            }
+            _outboundOrderDetailService.UpdateData(outboundOrder.Details);
+            return WebResponseContent.Instance.OK("鎴愬姛");
 
         }
         public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut)
@@ -2309,53 +2335,148 @@
                 {
                     return WebResponseContent.Instance.Error($"鏈壘鍒伴噰璐崟锛歿noStockOut.inOder}");
                 }
-                var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == noStockOut.barCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
-
-                if (matchedDetail == null)
-                {
-                    return WebResponseContent.Instance.Error($"鍦ㄩ噰璐崟 {noStockOut.inOder} 涓湭鎵惧埌鏉$爜涓� {noStockOut.barCode} 鐨勬槑缁嗐��");
-                }
-                matchedDetail.NoStockOutQty = 0;
-
                 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}");
                 }
-                var matchedCode = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == matchedDetail.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
 
-                if (matchedCode == null)
-                {
-                    return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚腑鐨剓matchedDetail.MaterielCode} 瀵瑰簲鐨勭墿鏂欍��");
-                }
-                matchedCode.NoStockOutQty = 0;
+                //瀛樺偍鍏ュ簱鍗曟嵁鏄庣粏淇℃伅
+                var detailLists = new List<Dt_InboundOrderDetail>();
 
-                //鍓╀綑鍏ュ簱鏁伴噺鍗宠櫄鎷熷嚭鍏ュ簱鍓╀綑鍙嚭鏁伴噺
-                decimal outQuantity = matchedDetail.OrderQuantity - matchedDetail.ReceiptQuantity;
-                if (outQuantity == 0)
-                {
-                    return WebResponseContent.Instance.Error($"璇ラ噰璐崟涓殑鏉$爜瀵瑰簲鐨勫彲鍑烘暟閲忎负0");
-                }
-                if (matchedCode.OrderQuantity < outQuantity)
-                {
-                    return WebResponseContent.Instance.Error($"璇ラ噰璐崟涓殑鏉$爜瀵瑰簲鐨勫彲鍑烘暟閲忚秴鍑哄嚭搴撳崟鍑哄簱鏁伴噺{matchedDetail.OrderQuantity - matchedCode.OrderQuantity},涓嶆弧瓒虫暣鍖呭嚭搴�");
-                }
-                //鍗曟嵁鍑哄簱閿佸畾鏁伴噺
-                matchedDetail.NoStockOutQty += outQuantity;
-                matchedCode.NoStockOutQty += outQuantity;
+                var matchedDetail = inboundOrder.Details.FirstOrDefault(detail =>
+                    detail.Barcode == noStockOut.barCode &&
+                    detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
 
-                if ((matchedCode.LockQuantity + matchedCode.NoStockOutQty) > matchedCode.OrderQuantity)
+                if (matchedDetail == null)
                 {
-                    return WebResponseContent.Instance.Error($"鍑哄簱鍗曟槑缁嗘暟閲忔孩鍑簕matchedCode.LockQuantity - matchedCode.OrderQuantity}");
+                    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))
+                            {
+                                detailLists.Add(detail);
+                            }
+                        }
+                    }
                 }
-                matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
-                matchedCode.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
+                else
+                {
+                    if (!string.IsNullOrEmpty(noStockOut.barCode))
+                    {
+                        detailLists.Add(matchedDetail);
+                    }
+                }
+                
+                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);
+
+                    if (matchedCode == null)
+                    {
+                        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)
+                        {
+                            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)
+                            {
+                                return WebResponseContent.Instance.Error($"浠撳簱涓嶄竴鑷达紒鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚粨搴撲腑鐨剓item.WarehouseCode} 瀵瑰簲鐨勭墿鏂欍��");
+                            }
+                        }
+                    }
+
+                    //鍓╀綑鍏ュ簱鏁伴噺鍗宠櫄鎷熷嚭鍏ュ簱鍓╀綑鍙嚭鏁伴噺
+                    decimal outQuantity = item.OrderQuantity - item.ReceiptQuantity;
+                    if (outQuantity == 0)
+                    {
+                        return WebResponseContent.Instance.Error($"璇ラ噰璐崟涓殑鏉$爜瀵瑰簲鐨勫彲鍑烘暟閲忎负0");
+                    }
+                    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}");
+                    }
+                    item.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
+
+                    outDetails.Add(matchedCode);
+                }
 
                 _unitOfWorkManage.BeginTran();
-                _inboundOrderDetailService.UpdateData(matchedDetail);
-                _outboundOrderDetailService.UpdateData(matchedCode);
+                _inboundOrderDetailService.UpdateData(detailLists);
+                _outboundOrderDetailService.UpdateData(outDetails);
                 _unitOfWorkManage.CommitTran();
-                return WebResponseContent.Instance.OK();
+                return WebResponseContent.Instance.OK("鎴愬姛",data:detailLists);
             }
             catch (Exception ex)
             {
@@ -2392,13 +2513,42 @@
                 {
                     return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撳崟锛歿noStockOut.inOder}");
                 }
-                var matchedCode = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == matchedDetail.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
+
+                // 鎾ら攢鍥炰紶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} 瀵瑰簲鐨勭墿鏂欍��");
                 }
-                matchedCode.NoStockOutQty = 0;
+
+                if (!string.IsNullOrEmpty(matchedCode.documentsNO))
+                {
+                    barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>();
+                }
+                barcodesList.RemoveAll(b =>
+                    string.Equals(b.Barcode, barcodes.Barcode, StringComparison.OrdinalIgnoreCase)
+                );
+
+                JsonSerializerSettings settings = new JsonSerializerSettings
+                {
+                    ContractResolver = new CamelCasePropertyNamesContractResolver()
+                };
+                matchedCode.documentsNO = JsonConvert.SerializeObject(barcodesList, settings);
+
+                matchedCode.NoStockOutQty -= matchedDetail.OrderQuantity;
                 if (matchedCode.LockQuantity == 0 && matchedCode.OverOutQuantity == 0)
                 {
                     matchedCode.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt();
@@ -2421,256 +2571,154 @@
         {
             try
             {
-                Dt_InboundOrder inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOutSubmit.InOderSubmit && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
-                if (inboundOrder == null)
-                {
-                    return WebResponseContent.Instance.Error($"鏈壘鍒伴噰璐崟锛歿noStockOutSubmit.InOderSubmit}");
-                }
                 Dt_OutboundOrder outboundOrder = _inboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOutSubmit.OutOderSubmit && x.OrderStatus != OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()).Includes(x => x.Details).First();
                 if (outboundOrder == null)
                 {
                     return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撳崟锛歿noStockOutSubmit.OutOderSubmit}");
                 }
-                List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>();
+                
                 List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>();
-                foreach (var BarCode in noStockOutSubmit.BarCodeSubmit)
+
+                Dictionary<int, List<string>> orderIdBarCodeDict = new Dictionary<int, List<string>>();
+
+                List<Dt_InboundOrderDetail> updateInboundDetails = new List<Dt_InboundOrderDetail>();
+
+                Dictionary<int, Dt_InboundOrder> updateInboundOrders = new Dictionary<int, Dt_InboundOrder>();
+
+                _unitOfWorkManage.BeginTran();
+
+                List<Dt_InboundOrderDetail> allInboundDetails = _inboundOrderDetailService.Db
+                    .Queryable<Dt_InboundOrderDetail>()
+                    .Where(detail => noStockOutSubmit.BarCodeSubmit.Contains(detail.Barcode)
+                        && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt())
+                    .ToList();
+
+                var detailGroupByOrderId = allInboundDetails.GroupBy(d => d.OrderId).ToList();
+                foreach (var group in detailGroupByOrderId)
                 {
-                    var inboundOrderDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == BarCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
+                    int orderId = group.Key;
+                    List<Dt_InboundOrderDetail> groupDetails = group.ToList();
+                    List<string> groupBarCodes = groupDetails.Select(d => d.Barcode).ToList();
 
-                    if (inboundOrderDetail == null)
+
+                    orderIdBarCodeDict[orderId] = groupBarCodes;
+
+                    foreach (var detail in groupDetails)
                     {
-                        return WebResponseContent.Instance.Error($"鍦ㄩ噰璐崟 {noStockOutSubmit.InOderSubmit} 涓湭鎵惧埌鏉$爜涓� {BarCode} 鐨勬槑缁嗐��");
+                        detail.ReceiptQuantity = detail.NoStockOutQty;
+                        detail.OverInQuantity = detail.NoStockOutQty;
+
+                        if (detail.OrderQuantity == detail.OverInQuantity)
+                        {
+                            detail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+                        }
+                        updateInboundDetails.Add(detail);
                     }
-                    var outboundOrderDetail = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == inboundOrderDetail.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
 
-                    if (outboundOrderDetail == null)
+                    if (!updateInboundOrders.ContainsKey(orderId))
                     {
-                        return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚腑鐨剓inboundOrderDetail.MaterielCode} 瀵瑰簲鐨勭墿鏂欍��");
+                        Dt_InboundOrder inboundOrder = _inboundOrderRepository.Db
+                            .Queryable<Dt_InboundOrder>()
+                            .Where(x => x.Id == orderId)
+                            .Includes(x => x.Details)
+                            .First();
+
+                        if (inboundOrder == null)
+                        {
+                            _unitOfWorkManage.RollbackTran();
+                            return WebResponseContent.Instance.Error($"鏈壘鍒板叆搴撳崟ID涓� {orderId} 鐨勫崟鎹�");
+                        }
+
+                        // 鍒ゆ柇鏁村崟鏄惁鍏ㄩ儴瀹屾垚
+                        int totalDetailCount = inboundOrder.Details.Count();
+                        int beforeDetailCount = inboundOrder.Details.Where(x => x.OrderId == orderId && x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt())
+                            .Count();
+                        int finishedDetailCount = updateInboundDetails
+                            .Where(x => x.OrderId == orderId && x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt())
+                            .Count();
+
+                        inboundOrder.OrderStatus = totalDetailCount == finishedDetailCount+beforeDetailCount
+                            ? InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()
+                            : InOrderStatusEnum.鍏ュ簱涓�.ObjToInt();
+
+                        updateInboundOrders[orderId] = inboundOrder;
                     }
-                    inboundOrderDetail.ReceiptQuantity += inboundOrderDetail.NoStockOutQty;
-                    inboundOrderDetail.OverInQuantity = inboundOrderDetail.ReceiptQuantity;
-                    inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
-                    inboundOrderDetails.Add(inboundOrderDetail);
+                }
 
-                    outboundOrderDetail.LockQuantity += outboundOrderDetail.NoStockOutQty;
-                    outboundOrderDetail.OverOutQuantity = outboundOrderDetail.LockQuantity;
-                    if (outboundOrderDetail.OrderQuantity == outboundOrderDetail.OverOutQuantity)
-                    {
-                        outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+                // 6. 鎵归噺鏇存柊鏄庣粏鍜屼富鍗曪紙鎵归噺鎿嶄綔鎻愬崌鎬ц兘锛�
+                if (updateInboundDetails.Any())
+                {
+                    foreach (var detail in updateInboundDetails) 
+                    { 
+                        _inboundOrderDetailService.UpdateData(detail);
                     }
-                    outboundOrderDetails.Add(outboundOrderDetail);
 
-                    var newLockInfo = new Dt_OutStockLockInfo
+                }
+                if (updateInboundOrders.Any())
+                {
+                    foreach (var order in updateInboundOrders.Values)
                     {
-                        OrderNo = outboundOrder.UpperOrderNo,
-                        OrderDetailId = outboundOrderDetail.Id,
-                        OutboundBatchNo = outboundOrderDetail.BatchNo,
-                        MaterielCode = outboundOrderDetail.MaterielCode,
-                        MaterielName = outboundOrderDetail.MaterielName,
-                        StockId = 0,
-                        OrderQuantity = outboundOrderDetail.OrderQuantity,
-                        AssignQuantity = outboundOrderDetail.OverOutQuantity,
-                        PickedQty = outboundOrderDetail.NoStockOutQty,
-                        LocationCode = "绌�",
-                        PalletCode = "绌�",
-                        TaskNum = 0,
-                        Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�,
-                        Unit = outboundOrderDetail.Unit,
-                        SupplyCode = outboundOrderDetail.SupplyCode ?? "鏃�",
-                        OrderType = outboundOrder.OrderType,
-                        CurrentBarcode = inboundOrderDetail.Barcode,
-                        IsSplitted = 1,
-                        Operator = App.User.UserName,
-                        lineNo = outboundOrderDetail.lineNo,
-                        WarehouseCode = outboundOrderDetail.WarehouseCode ?? "鏃�",
-                        BarcodeQty = outboundOrderDetail.BarcodeQty,
-                        BarcodeUnit = outboundOrderDetail.BarcodeUnit,
-                        BatchNo = outboundOrderDetail.BatchNo
+                        _inboundOrderRepository.UpdateData(order);
+                    }
+                }
+
+                // 7. 寰幆鍒嗙粍缁撴灉锛岃皟鐢∕ES鍥炰紶鏂规硶锛堟寜鍏ュ簱鍗曞垎缁勫洖浼狅級
+                foreach (var kvp in orderIdBarCodeDict)
+                {
+                    int orderId = kvp.Key;
+                    List<string> barCodeList = kvp.Value;
+                    //鍏ュ簱鍥炰紶MES
+                    NoStockOutBatchInOrderFeedbackToMes(orderId, barCodeList);
+
+                }
+
+                //鍙鍑哄簱鏉$爜鐨勫嚭搴撳崟鏄庣粏杩涜璁$畻鍥炰紶
+                List<Dt_OutboundOrderDetail> outboundOrderDetail = outboundOrder.Details
+    .Where(x => !string.IsNullOrWhiteSpace(x.documentsNO)
+        && noStockOutSubmit.BarCodeSubmit.Any(barcode =>
+            x.documentsNO.IndexOf(barcode, StringComparison.OrdinalIgnoreCase) >= 0))
+    .ToList();
+
+                foreach (var item in outboundOrderDetail)
+                {
+                    item.LockQuantity = item.NoStockOutQty;
+                    item.OverOutQuantity = 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>();
+                    }
+                    if (!string.IsNullOrEmpty(item.documentsNO) && item.documentsNO!="")
+                    {
+                        documentsNOList = JsonConvert.DeserializeObject<List<Barcodes>>(item.documentsNO) ?? new List<Barcodes>();
+                    }
+                    foreach (var documentsNO in documentsNOList)
+                    {
+                        barcodesList.Add(documentsNO);
+                    }
+                    JsonSerializerSettings settings = new JsonSerializerSettings
+                    {
+                        ContractResolver = new CamelCasePropertyNamesContractResolver()
                     };
-                    _outStockLockInfoService.AddData(newLockInfo);
+                    item.ReturnJsonData = JsonConvert.SerializeObject(barcodesList, settings);
+
+                    outboundOrderDetails.Add(item);
                 }
-                //鍒ゆ柇鍏ュ簱鍗曟嵁鏄庣粏鏄惁鍏ㄩ儴鏄畬鎴愮姸鎬�
-                int e = inboundOrder.Details.Count();
-                int w = inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
-                bool inoderOver = inboundOrder.Details.Count() == inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
-                if (inoderOver)
-                {
-                    inboundOrder.OrderStatus = InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt();
-                }
-                else
-                {
-                    inboundOrder.OrderStatus = InOrderStatusEnum.鍏ュ簱涓�.ObjToInt();
-                }
-                //鍒ゆ柇鍑哄簱鍗曟嵁鏄庣粏鏄惁鍏ㄩ儴鏄畬鎴愮姸鎬�
-                bool outOderOver = outboundOrder.Details.Count() == outboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
-                if (outOderOver)
+
+                _outboundOrderDetailService.UpdateData(outboundOrderDetails);
+
+                // 妫�鏌ュ嚭搴撳崟鏄惁瀹屾垚
+                if (CheckOutboundOrderCompleted(outboundOrder.OrderNo))
                 {
                     outboundOrder.OrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
+                    _outboundOrderService.UpdateData(outboundOrder);
                 }
-                else
-                {
-                    outboundOrder.OrderStatus = OutOrderStatusEnum.鍑哄簱涓�.ObjToInt();
-                }
-                //鏁版嵁澶勭悊
-                _unitOfWorkManage.BeginTran();
-                _inboundOrderDetailService.UpdateData(inboundOrderDetails);
-                _outboundOrderDetailService.UpdateData(outboundOrderDetails);
-                _inboundOrderRepository.UpdateData(inboundOrder);
-                _outboundOrderService.UpdateData(outboundOrder);
                 _unitOfWorkManage.CommitTran();
-
-                //鍏ュ簱鍥炰紶MES
-                var infeedmodel = new FeedbackInboundRequestModel
-                {
-                    reqCode = Guid.NewGuid().ToString(),
-                    reqTime = DateTime.Now.ToString(),
-                    business_type = inboundOrder.BusinessType,
-                    factoryArea = inboundOrder.FactoryArea,
-                    operationType = 1,
-                    Operator = App.User.UserName,
-                    orderNo = inboundOrder.UpperOrderNo,
-                    status = inboundOrder.OrderStatus,
-                    details = new List<FeedbackInboundDetailsModel>()
-
-                };
-
-                var groupedData = inboundOrderDetails.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
-                    .Select(group => new FeedbackInboundDetailsModel
-                    {
-                        materialCode = group.Key.MaterielCode,
-                        supplyCode = group.Key.SupplyCode,
-                        batchNo = group.Key.BatchNo,
-                        lineNo = group.Key.lineNo,
-                        warehouseCode = group.Key.WarehouseCode,
-                        qty = group.Sum(x => x.BarcodeQty),
-                        // warehouseCode= "1072",
-                        unit = group.Key.BarcodeUnit,
-                        barcodes = group.Select(row => new FeedbackBarcodesModel
-                        {
-                            barcode = row.Barcode,
-                            qty = row.BarcodeQty
-                        }).ToList()
-                    }).ToList();
-                infeedmodel.details = groupedData;
-
-                var result1 = await _invokeMESService.FeedbackInbound(infeedmodel);
-                if (result1 != null && result1.code == 200)
-                {
-                    var orderIds = inboundOrderDetails.Select(x => x.Id).Distinct().ToList();
-                    if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
-                    {
-                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1, Remark = "" })
-                        .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
-                    }
-                    _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
-                    .Where(it => orderIds.Contains(it.Id)).ExecuteCommand();
-                }
-                else
-                {
-                    _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2, Remark = result1.message })
-                    .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
-                    _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 })
-                   .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
-                }
                 //鍑哄簱鍥炰紶MES
+                _feedbackMesService.OutboundFeedback(outboundOrder.OrderNo);
 
-                var documentNo = UniqueValueGenerator.Generate();
-
-                var outfeedmodel = new FeedbackOutboundRequestModel
-                {
-                    reqCode = Guid.NewGuid().ToString(),
-                    reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
-                    business_type = outboundOrder.BusinessType,
-                    factoryArea = outboundOrder.FactoryArea,
-                    operationType = 1,
-                    Operator = App.User.UserName,
-                    orderNo = outboundOrder.UpperOrderNo,
-                    documentsNO = documentNo,
-                    status = outboundOrder.OrderStatus,
-                    details = new List<FeedbackOutboundDetailsModel>()
-                };
-                foreach (var detail in outboundOrderDetails)
-                {
-                    // 鑾峰彇璇ユ槑缁嗗搴旂殑鏉$爜淇℃伅锛堜粠閿佸畾璁板綍锛�
-                    var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                        .Where(x => x.OrderNo == outboundOrder.UpperOrderNo &&
-                                    x.OrderDetailId == detail.Id &&
-                                        (x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴� || x.Status == (int)OutLockStockStatusEnum.宸插洖搴�))
-                        .ToListAsync();
-
-                    var groupdata = detailLocks.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
-                          .Select(group => new FeedbackOutboundDetailsModel
-                          {
-
-                              materialCode = group.Key.MaterielCode,
-                              lineNo = group.Key.lineNo,
-                              warehouseCode = group.Key.WarehouseCode,
-                              qty = group.Sum(x => x.PickedQty),
-                              currentDeliveryQty = group.Sum(x => x.PickedQty),
-                              unit = group.Key.BarcodeUnit,
-                              barcodes = group.Select(lockInfo => new WIDESEA_DTO.Outbound.BarcodesModel
-                              {
-                                  barcode = lockInfo.CurrentBarcode,
-                                  supplyCode = lockInfo.SupplyCode,
-                                  batchNo = lockInfo.BatchNo,
-                                  unit = lockInfo.BarcodeUnit,
-                                  qty = lockInfo.PickedQty
-                              }).ToList()
-                          }).ToList();
-                    outfeedmodel.details.AddRange(groupdata);
-
-                    _outStockLockInfoService.DeleteData(detailLocks);
-                }
-                //瀛樺偍鍥炰紶鍙傛暟锛屼繚璇佸紓甯告墜鍔ㄥ洖浼�
-                Dt_InterfaceLog interfaceLog = new Dt_InterfaceLog
-                {
-                    OrderNo = outboundOrder.UpperOrderNo,
-                    DocumentNo = documentNo,
-                    OrderType = "铏氭嫙鍑哄叆搴�",
-                    Content = outfeedmodel.ToJson(),
-                    ReturnToMESStatus = 0,
-                    IsDeleted = false
-                };
-                _interfaceLog.AddData(interfaceLog);
-
-                var result = await _invokeMESService.FeedbackOutbound(outfeedmodel);
-                if (result != null && result.code == 200)
-                {
-                    var orderIds = outboundOrderDetails.Select(x => x.Id).Distinct().ToList();
-                    await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
-                        .SetColumns(x => x.ReturnToMESStatus == 1)
-                        .Where(x => orderIds.Contains(x.Id))
-                        .ExecuteCommandAsync();
-
-
-                    await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
-                        .SetColumns(it => new Dt_OutboundOrder { ReturnToMESStatus = 1, Remark = "" })
-                        .Where(x => x.Id == outboundOrder.Id)
-                        .ExecuteCommandAsync();
-
-                    await _interfaceLog.Db.Updateable<Dt_InterfaceLog>()
-                        .SetColumns(x => x.ReturnToMESStatus == 1)
-                        .Where(x => x.DocumentNo == documentNo)
-                        .ExecuteCommandAsync();
-                }
-                else
-                {
-                    var uporderIds = outboundOrderDetails.Select(x => x.Id).Distinct().ToList();
-                    await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
-                      .SetColumns(x => x.ReturnToMESStatus == 2)
-                       .Where(x => uporderIds.Contains(x.Id))
-                      .ExecuteCommandAsync();
-
-                    await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
-                        .SetColumns(it => new Dt_OutboundOrder { ReturnToMESStatus = 2, Remark = result.message })
-                         .Where(x => x.Id == outboundOrder.Id)
-                        .ExecuteCommandAsync();
-
-                    await _interfaceLog.Db.Updateable<Dt_InterfaceLog>()
-                        .SetColumns(x => x.ReturnToMESStatus == 2)
-                        .Where(x => x.DocumentNo == documentNo)
-                        .ExecuteCommandAsync();
-                }
                 return WebResponseContent.Instance.OK();
             }
             catch (Exception ex)
@@ -2680,6 +2728,221 @@
             }
         }
 
+
+        public WebResponseContent NoStockOutBatchInOrderFeedbackToMes(int id,List<string> barCodeList)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                var inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>()
+                                    .Where(x => x.Id == id)
+                                    .First();
+
+                List<Dt_MesReturnRecord> returnRecords = _mesReturnRecord.QueryData(x => x.OrderNo == inboundOrder.InboundOrderNo && x.OrderId == inboundOrder.Id && x.ReturnStatus == 2);
+                foreach (var item in returnRecords)
+                {
+                    HttpResponseResult<MesResponseDTO> httpResponse = _httpClientHelper.Post<MesResponseDTO>(item.ApiUrl, item.RequestData);
+                    item.ReturnCount += 1;
+                    bool success = httpResponse.IsSuccess && httpResponse.Data.Code == "200";
+                    item.ReturnStatus = success ? 1 : 2;
+                    item.HttpStatusCode = httpResponse.StatusCode.ObjToInt();
+                    item.LastReturnTime = DateTime.Now;
+                    item.ResponseData = httpResponse.Content;
+                    item.SuccessTime = httpResponse.IsSuccess ? DateTime.Now : null;
+
+                    //List<Dt_InboundOrderDetail> details=new List<Dt_InboundOrderDetail>();
+                    //foreach (var y in item.DetailsId.Split(','))
+                    //{
+                    //    details.Add( _inboundOrderDetailRepository.QueryFirst(x => x.Id == Convert.ToInt32(y)));
+                    //}
+                }
+                _mesReturnRecord.UpdateData(returnRecords);
+
+                var inboundOrderDetail = _inboundOrderRepository.Db.Queryable<Dt_InboundOrderDetail>()
+                                        .Where(x => x.OrderId == inboundOrder.Id && x.OrderDetailStatus == (int)OrderDetailStatusEnum.Over && x.ReturnToMESStatus == 0)
+                                        .ToList();
+
+                var detail = inboundOrderDetail.Where(x => barCodeList.Contains(x.Barcode)).ToList();
+
+                if (inboundOrder.OrderType == (int)InOrderTypeEnum.AllocatInbound)//璋冩嫧鍏ュ簱
+                {
+                    var allocate = _inboundOrderRepository.Db.Queryable<Dt_AllocateOrder>().Where(x => x.OrderNo == inboundOrder.InboundOrderNo).First();
+                    var allocatefeedmodel = new AllocateDto
+                    {
+                        ReqCode = Guid.NewGuid().ToString(),
+                        ReqTime = DateTime.Now.ToString(),
+                        BusinessType = "3",
+                        FactoryArea = inboundOrder.FactoryArea,
+                        OperationType = 1,
+                        Operator = inboundOrder.Operator,
+                        OrderNo = inboundOrder.UpperOrderNo,
+                        fromWarehouse = allocate?.FromWarehouse ?? "",
+                        toWarehouse = allocate?.ToWarehouse ?? "",
+                        Details = NoStockOutGetAllocateDtoDetails(detail)
+                    };
+
+                    if (allocatefeedmodel.Details.Count <= 0)
+                    {
+                        throw new Exception("鏈壘鍒伴渶瑕佸洖浼犵殑鏁版嵁");
+                    }
+
+                    var response = NoStockOutresponseModel(inboundOrder, 3, null, allocatefeedmodel);
+
+                    if (response != null && response.IsSuccess)
+                    {
+                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 });
+                    }
+                    else
+                    {
+                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 });
+                        return content.Error("鍥炰紶MES澶辫触");
+                    }
+                }
+                else
+                {
+                    var feedmodel = new FeedbackInboundRequestModel
+                    {
+                        reqCode = Guid.NewGuid().ToString(),
+                        reqTime = DateTime.Now.ToString(),
+                        business_type = inboundOrder.BusinessType,
+                        factoryArea = inboundOrder.FactoryArea,
+                        operationType = 1,
+                        Operator = inboundOrder.Operator,
+                        orderNo = inboundOrder.UpperOrderNo,
+                        status = inboundOrder.OrderStatus,
+                        details = NoStockOutFeedbackInboundDetailsModelDto(detail)
+                    };
+
+                    if (feedmodel.details.Count <= 0)
+                    {
+                        throw new Exception("鏈壘鍒伴渶瑕佸洖浼犵殑鏁版嵁");
+                    }
+                    var response = NoStockOutresponseModel(inboundOrder, 3, feedmodel);
+
+                    if (response != null && response.IsSuccess)
+                    {
+                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 });
+                    }
+                    else
+                    {
+                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 });
+                        return content.Error("鍥炰紶MES澶辫触");
+                    }
+                }
+
+                return content.OK("鍥炰紶MES鎴愬姛");
+            }
+            catch (Exception ex)
+            {
+                return content.Error(ex.Message);
+            }
+        }
+
+        public List<AllocateDtoDetail> NoStockOutGetAllocateDtoDetails(List<Dt_InboundOrderDetail> inboundOrderDetails)
+        {
+            var groupedData = inboundOrderDetails.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
+               .Select(group => new AllocateDtoDetail
+               {
+                   MaterialCode = group.Key.MaterielCode,
+                   LineNo = group.Key.lineNo,
+                   WarehouseCode = group.Key.WarehouseCode,
+                   Qty = group.Sum(x => x.BarcodeQty),
+                   Unit = group.Key.BarcodeUnit,
+                   Barcodes = group.Select(row => new BarcodeInfo
+                   {
+                       Barcode = row.Barcode,
+                       Qty = row.BarcodeQty,
+                       BatchNo = row.BatchNo,
+                       SupplyCode = row.SupplyCode,
+                       Unit = row.BarcodeUnit
+                   }).ToList()
+               }).ToList();
+            return groupedData;
+        }
+        public List<FeedbackInboundDetailsModel> NoStockOutFeedbackInboundDetailsModelDto(List<Dt_InboundOrderDetail> inboundOrderDetails)
+        {
+            var groupedData = inboundOrderDetails.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
+               .Select(group => new FeedbackInboundDetailsModel
+               {
+                   materialCode = group.Key.MaterielCode,
+                   lineNo = group.Key.lineNo,
+                   warehouseCode = group.Key.WarehouseCode,
+                   qty = group.Sum(x => x.BarcodeQty),
+                   unit = group.Key.BarcodeUnit,
+                   barcodes = group.Select(row => new FeedbackBarcodesModel
+                   {
+                       barcode = row.Barcode,
+                       qty = row.BarcodeQty
+                   }).ToList()
+               }).ToList();
+            return groupedData;
+        }
+
+        public HttpResponseResult<MesResponseDTO> NoStockOutresponseModel(Dt_InboundOrder order, int InterfaceType, FeedbackInboundRequestModel model = null, AllocateDto allocateDto = null)
+        {
+            HttpResponseResult<MesResponseDTO> httpResponseResult = new HttpResponseResult<MesResponseDTO>();
+            string reqCode = Guid.NewGuid().ToString();
+            string reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+            string requestData = string.Empty;
+            string apiUrl = string.Empty;
+            if (model != null)
+            {
+                apiUrl = AppSettings.GetValue("AldMaterialWarehousing");
+                httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, model.Serialize());
+                requestData = model.Serialize();
+            }
+            else
+            {
+                apiUrl = AppSettings.GetValue("AldAllocationOperation");
+                httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, allocateDto.Serialize());
+                requestData = allocateDto.Serialize();
+            }
+            httpResponseResult.ApiUrl = apiUrl;
+            bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data.Code == "200";
+            string message = "鎴愬姛";
+            if (!isSuccess)
+            {
+                if (!httpResponseResult.IsSuccess)
+                {
+                    message = $"MES鎺ュ彛杩斿洖閿欒锛孒TTP浠g爜锛歿httpResponseResult.StatusCode}锛屼俊鎭細{httpResponseResult.ErrorMessage}";
+                }
+                else if (httpResponseResult?.Data?.Code != "200")
+                {
+                    message = $"璋冪敤MES鎺ュ彛澶辫触锛屼唬鐮侊細{httpResponseResult?.Data?.Code}锛屼俊鎭細{httpResponseResult?.Data?.Message}";
+                }
+            }
+            Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord()
+            {
+                ApiUrl = httpResponseResult.ApiUrl,
+                InterfaceType = InterfaceType,
+                OrderId = order.Id,
+                OrderNo = order.InboundOrderNo,
+                RequestCode = reqCode,
+                RequestData = requestData,
+                FailureReason = message,
+                LastReturnTime = DateTime.Now,
+                HttpStatusCode = httpResponseResult.StatusCode.ObjToInt(),
+                ResponseData = httpResponseResult.Content,
+                ReturnType = 0,
+                ReturnCount = 1,
+                ReturnStatus = httpResponseResult.IsSuccess ? 1 : 2,
+                SuccessTime = httpResponseResult.IsSuccess ? DateTime.Now : null
+            };
+            _unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand();
+
+            return httpResponseResult;
+        }
+        public bool CheckOutboundOrderCompleted(string orderNo)
+        {
+            Dt_OutboundOrder outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == orderNo).First();
+            if (outboundOrder == null) return false;
+
+            List<Dt_OutboundOrderDetail> details = _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().Where(x => x.OrderId == outboundOrder.Id).ToList();
+
+            // 妫�鏌ユ墍鏈夋槑缁嗙殑宸插嚭鏁伴噺鏄惁閮界瓑浜庡崟鎹暟閲�
+            return details.All(x => x.OverOutQuantity >= x.OrderQuantity - x.MoveQty);
+        }
+
         public WebResponseContent GetPurchaseOrderByBarcode(string barcode)
         {
             try
@@ -2687,7 +2950,12 @@
                 Dt_InboundOrderDetail inboundOrderDetail = _stockInfoDetailService.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.Barcode == barcode && x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()).First();
                 if (inboundOrderDetail == null)
                 {
-                    return WebResponseContent.Instance.Error($"鏈壘鍒拌鏉$爜{barcode}鐨勫叆搴撴槑缁嗘垨鑰呮槑缁嗙姸鎬佸凡鍏ユ櫤浠撳畬鎴�");
+                    inboundOrderDetail = _stockInfoDetailService.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.OutBoxbarcodes == barcode && x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()).First();
+
+                    if(inboundOrderDetail == null)
+                    {
+                        return WebResponseContent.Instance.Error($"鏈壘鍒拌鏉$爜{barcode}鐨勫叆搴撴槑缁嗘垨鑰呮槑缁嗙姸鎬佸凡鍏ユ櫤浠撳畬鎴�");
+                    }
                 }
                 Dt_InboundOrder inboundOrder = _inboundOrderRepository.QueryFirst(x => x.Id == inboundOrderDetail.OrderId && x.OrderStatus != InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt());
                 if (inboundOrder == null)

--
Gitblit v1.9.3