From 64840e4e6d97d177b8a765ba8c53888abcf86d16 Mon Sep 17 00:00:00 2001
From: heshaofeng <heshaofeng@hnkhzn.com>
Date: 星期二, 13 一月 2026 18:48:20 +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 |  904 +++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 636 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 1adb870..534a7df 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,4 +1,8 @@
-锘縰sing Microsoft.Extensions.Logging;
+锘縰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;
@@ -14,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;
@@ -25,6 +30,12 @@
 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;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
+using WIDESEA_IRecordService;
 
 namespace WIDESEA_OutboundService
 {
@@ -33,6 +44,7 @@
     /// </summary>
     public class OutboundPickingService : ServiceBase<Dt_PickingRecord, IRepository<Dt_PickingRecord>>, IOutboundPickingService
     {
+        #region 鏋勯�犲嚱鏁�
         private readonly IUnitOfWorkManage _unitOfWorkManage;
         public IRepository<Dt_PickingRecord> Repository => BaseDal;
 
@@ -56,6 +68,12 @@
         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 readonly IStockQuantityChangeRecordService _stockQuantityChangeRecordService;
+        private readonly IInboundOrderService _inboundOrderService;
 
         private Dictionary<string, string> stations = new Dictionary<string, string>
         {
@@ -74,7 +92,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,IStockQuantityChangeRecordService stockQuantityChangeRecordService,IInboundOrderService inboundOrderService) : base(BaseDal)
         {
             _unitOfWorkManage = unitOfWorkManage;
             _stockInfoService = stockInfoService;
@@ -97,8 +115,16 @@
             _reCheckOrderService = reCheckOrderService;
             _task_HtyService = task_HtyService;
             _interfaceLog = interfaceLog;
+            _inboundService = inboundService;
+            _feedbackMesService = feedbackMesService;
+            _httpClientHelper = httpClientHelper;
+            _mesReturnRecord = mesReturnRecord;
+            _stockQuantityChangeRecordService = stockQuantityChangeRecordService;
+            _inboundOrderService = inboundOrderService;
+
         }
 
+        #endregion
 
         #region 鏌ヨ鏂规硶
         // 鑾峰彇鏈嫞閫夊垪琛�
@@ -934,7 +960,7 @@
 
             return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Success((pickingRecord, lockInfo, orderDetail));
         }
- 
+
 
         /// <summary>
         /// 妫�鏌ラ攣瀹氫俊鎭搴旂殑鏉$爜鏄惁宸茬粡鍥炲簱
@@ -1172,7 +1198,7 @@
         #endregion
 
         #region 鍥炲簱鎿嶄綔绉佹湁鏂规硶
- 
+
         /// <summary>
         /// 妫�鏌ユ暣涓墭鐩樻槸鍚﹀凡缁忓洖搴�
         /// </summary>
@@ -1250,7 +1276,7 @@
         }
 
         private async Task<WebResponseContent> HandleNoReturnItems(string orderNo, string palletCode, Dt_Task originalTask, int stockInfoId)
-        {            
+        {
             try
             {
                 var locationtype = 0;
@@ -1537,7 +1563,7 @@
 
 
         }
-          
+
 
         private async Task HandlePalletStockGoodsReturn(List<Dt_StockInfoDetail> palletStockGoods)
         {
@@ -1675,29 +1701,29 @@
                 //if (moveResult)
                 //{
                 //  鍒涘缓鍥炲簱浠诲姟
-                var essTask = new TaskModel()
-                {
-                    taskType = "putaway",
-                    taskGroupCode = "",
-                    groupPriority = 0,
-                    tasks = new List<TasksType>{  new() {
-                            taskCode = returnTask.TaskNum.ToString(),
-                            taskPriority = 0,
-                            taskDescribe = new TaskDescribeType
-                            {
-                                containerCode = palletCode,
-                                containerType = "CT_KUBOT_STANDARD",
-                                fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "",
-                                toStationCode = "",
-                                toLocationCode = returnTask.TargetAddress,
-                                deadline = 0,
-                                storageTag = ""
-                            }
-                        } }
-                };
+                //var essTask = new TaskModel()
+                //{
+                //    taskType = "putaway",
+                //    taskGroupCode = "",
+                //    groupPriority = 0,
+                //    tasks = new List<TasksType>{  new() {
+                //            taskCode = returnTask.TaskNum.ToString(),
+                //            taskPriority = 0,
+                //            taskDescribe = new TaskDescribeType
+                //            {
+                //                containerCode = palletCode,
+                //                containerType = "CT_KUBOT_STANDARD",
+                //                fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "",
+                //                toStationCode = "",
+                //                toLocationCode = returnTask.TargetAddress,
+                //                deadline = 0,
+                //                storageTag = ""
+                //            }
+                //        } }
+                //};
 
-                var resultTask = await _eSSApiService.CreateTaskAsync(essTask);
-                _logger.LogInformation($"ReturnRemaining 鍒涘缓浠诲姟鎴愬姛: {resultTask}");
+                //var resultTask = await _eSSApiService.CreateTaskAsync(essTask);
+                //_logger.LogInformation($"ReturnRemaining 鍒涘缓浠诲姟鎴愬姛: {resultTask}");
                 //}
             }
             catch (Exception ex)
@@ -1894,7 +1920,7 @@
                 _logger.LogError($"UpdateOrderStatusForReturn澶辫触 - OrderNo: {orderNo}, Error: {ex.Message}");
             }
         }
-          
+
         #endregion
 
         #region 绌烘墭鐩�
@@ -2054,8 +2080,6 @@
         }
         #endregion
 
-
-
         #region 杈呭姪鏂规硶
         /// <summary>
         /// 缁熶竴鍒嗘瀽鎵樼洏鐘舵�� - 杩斿洖鎵樼洏鐨勫畬鏁寸姸鎬佷俊鎭�
@@ -2143,7 +2167,6 @@
 
             return result;
         }
-          
 
         private async Task<string> GenerateNewBarcode()
         {
@@ -2281,7 +2304,7 @@
             }
             return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔�", new { SplitResults = new List<SplitResult>() });
         }
-
+        #endregion
 
 
         #region 铏氭嫙鍑哄叆搴�
@@ -2292,12 +2315,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 +2341,158 @@
                 {
                     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)&& detail.OutBoxbarcodes == noStockOut.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)
+                    {
+                        if(matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty - matchedCode.NoStockOutQty < 0)
+                        {
+                            return WebResponseContent.Instance.Error($"鐗╂枡{item.MaterielCode}鍙嚭鏁伴噺婧㈠嚭{(matchedCode.LockQuantity + matchedCode.MoveQty + matchedCode.NoStockOutQty) - matchedCode.OrderQuantity}");
+                        }
+                    }
+                    else
+                    {
+                        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} 瀵瑰簲鐨勭墿鏂欍��");
+                            }
+                        }
+                    }
+                    else
+                    {
+                        item.WarehouseCode = matchedCode.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.OrderQuantity,
+                        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(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 +2529,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.OrderQuantity,
+                    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,226 +2587,196 @@
         {
             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>();
+
+                List<Dt_StockQuantityChangeRecord> changeRecords = new List<Dt_StockQuantityChangeRecord>();
+                _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;
+
+                    Dt_InboundOrder currentInboundOrder = null;
+                    if (!updateInboundOrders.TryGetValue(orderId, out currentInboundOrder))
                     {
-                        return WebResponseContent.Instance.Error($"鍦ㄩ噰璐崟 {noStockOutSubmit.InOderSubmit} 涓湭鎵惧埌鏉$爜涓� {BarCode} 鐨勬槑缁嗐��");
+                        currentInboundOrder = _inboundOrderRepository.Db
+                            .Queryable<Dt_InboundOrder>()
+                            .Where(x => x.Id == orderId)
+                            .Includes(x => x.Details)
+                            .First();
+
+                        if (currentInboundOrder == null)
+                        {
+                            _unitOfWorkManage.RollbackTran();
+                            return WebResponseContent.Instance.Error($"鏈壘鍒板叆搴撳崟ID涓� {orderId} 鐨勫崟鎹�");
+                        }
+                        updateInboundOrders[orderId] = currentInboundOrder;
                     }
-                    var outboundOrderDetail = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == inboundOrderDetail.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
 
-                    if (outboundOrderDetail == null)
+                    foreach (var detail in groupDetails)
                     {
-                        return WebResponseContent.Instance.Error($"鍦ㄥ嚭搴撳崟鐨勭墿鏂欑紪鐮佷腑鏈壘鍒颁笌閲囪喘鍗曚腑鐨剓inboundOrderDetail.MaterielCode} 瀵瑰簲鐨勭墿鏂欍��");
+                        detail.ReceiptQuantity = detail.NoStockOutQty;
+                        detail.OverInQuantity = detail.NoStockOutQty;
+
+                        if (detail.OrderQuantity == detail.OverInQuantity)
+                        {
+                            detail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+                        }
+                        updateInboundDetails.Add(detail);
+
+                        //娣诲姞搴撳瓨鍙樺姩璁板綍
+                        Dt_StockQuantityChangeRecord changeRecord = new Dt_StockQuantityChangeRecord
+                        {
+                            StockDetailId = detail.Id,
+                            PalleCode = DateTime.Now.ToString(),
+                            MaterielCode = detail.MaterielCode,
+                            MaterielName = detail.MaterielName ?? "",
+                            BatchNo = detail.BatchNo ?? "",
+                            OriginalSerilNumber = detail.Barcode,
+                            NewSerilNumber = "",
+                            OrderNo = currentInboundOrder.InboundOrderNo,
+                            TaskNum = 0,
+                            ChangeType = (int)StockChangeTypeEnum.Inbound,
+                            ChangeQuantity = detail.NoStockOutQty,
+                            BeforeQuantity = detail.OverInQuantity - detail.NoStockOutQty,
+                            AfterQuantity = detail.OverInQuantity,
+                            SupplyCode = detail.SupplyCode ?? "",
+                            WarehouseCode = detail.WarehouseCode ?? "",
+                            Remark = $"铏氭嫙鍏ュ簱"
+                        };
+                        changeRecords.Add(changeRecord);
                     }
-                    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)
+                    var inboundOrder = updateInboundOrders[orderId];
+                    int totalDetailCount = inboundOrder.Details.Count;
+
+                    int finishedDetailCount = inboundOrder.Details.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt())
+                                             + groupDetails.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt());
+
+                    inboundOrder.OrderStatus = totalDetailCount == finishedDetailCount
+                        ? InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()
+                        : InOrderStatusEnum.鍏ュ簱涓�.ObjToInt();
+                }
+
+                if (updateInboundDetails.Any())
+                {
+                    _inboundOrderDetailService.Db.Updateable(updateInboundDetails).ExecuteCommand();
+                }
+                if (updateInboundOrders.Any())
+                {
+                    // 鎵归噺鏇存柊鍏ュ簱涓诲崟
+                    _inboundOrderService.Db.Updateable(updateInboundOrders.Values.ToList()).ExecuteCommand();
+                }
+
+                // 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;
+                    item.CurrentDeliveryQty = item.NoStockOutQty;
+                    //娣诲姞鍥炰紶MES鍙傛暟
+                    List<Barcodes> barcodesList = new List<Barcodes>();
+                    List<Barcodes> documentsNOList = new List<Barcodes>();
+                    if (!string.IsNullOrEmpty(item.ReturnJsonData))
                     {
-                        outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
+                        barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(item.documentsNO) ?? new List<Barcodes>();
                     }
-                    outboundOrderDetails.Add(outboundOrderDetail);
-
-                    var newLockInfo = new Dt_OutStockLockInfo
+                    if (!string.IsNullOrEmpty(item.documentsNO) && item.documentsNO!="")
                     {
-                        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.NoStockOutQty,
-                        BarcodeUnit = outboundOrderDetail.BarcodeUnit,
-                        BatchNo = outboundOrderDetail.BatchNo
+                        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);
+                    //娣诲姞搴撳瓨鍙樺姩璁板綍
+                    Dt_StockQuantityChangeRecord changeRecord = new Dt_StockQuantityChangeRecord
+                    {
+                        StockDetailId = item.Id,
+                        PalleCode = DateTime.Now.ToString(),
+                        MaterielCode = item.MaterielCode,
+                        MaterielName = item.MaterielName ?? "",
+                        BatchNo = item.BatchNo ?? "",
+                        OriginalSerilNumber = item.ReturnJsonData,
+                        NewSerilNumber = "",
+                        OrderNo = outboundOrder.OrderNo,
+                        TaskNum = 0,
+                        ChangeType = (int)StockChangeTypeEnum.Inbound,
+                        ChangeQuantity = -item.NoStockOutQty,
+                        BeforeQuantity = item.OrderQuantity,
+                        AfterQuantity = item.OrderQuantity - item.OverOutQuantity,
+                        SupplyCode = item.SupplyCode ?? "",
+                        WarehouseCode = item.WarehouseCode ?? "",
+                        Remark = $"铏氭嫙鍑哄簱"
+                    };
+                    changeRecords.Add(changeRecord);
+                    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)
+
+                _outboundOrderDetailService.UpdateData(outboundOrderDetails);
+                //鎵归噺娣诲姞搴撳瓨鍙樺姩璁板綍
+                if (changeRecords.Any())
                 {
-                    inboundOrder.OrderStatus = InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt();
+                    _stockQuantityChangeRecordService.Db.Insertable(changeRecords).ExecuteCommand();
                 }
-                else
-                {
-                    inboundOrder.OrderStatus = InOrderStatusEnum.鍏ュ簱涓�.ObjToInt();
-                }
-                //鍒ゆ柇鍑哄簱鍗曟嵁鏄庣粏鏄惁鍏ㄩ儴鏄畬鎴愮姸鎬�
-                bool outOderOver = outboundOrder.Details.Count() == outboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
-                if (outOderOver)
+                // 妫�鏌ュ嚭搴撳崟鏄惁瀹屾垚
+                if (CheckOutboundOrderCompleted(outboundOrder.OrderNo))
                 {
                     outboundOrder.OrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt();
+
                 }
                 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();
-                    _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
-                    .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();
-                }
                 //鍑哄簱鍥炰紶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);
-                }
-                //瀛樺偍鍥炰紶鍙傛暟锛屼繚璇佸紓甯告墜鍔ㄥ洖浼�
-                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(x => x.ReturnToMESStatus == 1)
-                        .Where(x => x.Id == outboundOrder.Id)
-                        .ExecuteCommandAsync();
-
-                    await _interfaceLog.Db.Updateable<Dt_InterfaceLog>()
-                        .SetColumns(x => x.ReturnToMESStatus == 1)
-                        .Where(x => x.DocumentNo == documentNo)
-                        .ExecuteCommandAsync();
-                }
                 return WebResponseContent.Instance.OK();
             }
             catch (Exception ex)
@@ -2650,14 +2786,245 @@
             }
         }
 
+
+        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 = App.User.UserName,
+                        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 })
+                            .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();
+                    }
+                    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();
+                        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 = App.User.UserName,
+                        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 })
+                            .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();
+                    }
+                    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();
+                        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
             {
-                Dt_InboundOrderDetail inboundOrderDetail = _stockInfoDetailService.Db.Queryable<Dt_InboundOrderDetail>().Where(x=>x.Barcode == barcode&& x.OrderDetailStatus !=OrderDetailStatusEnum.Over.ObjToInt()).First();
-                if(inboundOrderDetail == null)
+                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)
@@ -2668,7 +3035,7 @@
 
                 return WebResponseContent.Instance.OK("鏌ヨ閲囪喘鍗曟垚鍔�", data: resultData);
             }
-            catch(Exception ex)
+            catch (Exception ex)
             {
                 return WebResponseContent.Instance.Error(ex.Message);
             }
@@ -2816,7 +3183,8 @@
                         FactoryArea = item.FactoryArea,
                         Status = 0,
                         OrderNo = item.OrderNo,
-                        BusinessType = materielGroupDTO.orderTypes.ToString()
+                        BusinessType = materielGroupDTO.orderTypes.ToString(),
+                        
 
                     });
                     item.WarehouseCode = item.WarehouseCode;
@@ -2905,7 +3273,7 @@
         }
 
 
-        #endregion
+    
     }
 
     #region 鏀寔绫诲畾涔�

--
Gitblit v1.9.3