From eb7892b61b050646ad11e7a36942c2a2a16a24f2 Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期四, 03 七月 2025 20:12:58 +0800
Subject: [PATCH] 1

---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs |  328 +++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 213 insertions(+), 115 deletions(-)

diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs"
index 94e8e3b..9ea6759 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs"
@@ -1,5 +1,6 @@
 锘縰sing AutoMapper;
 using Castle.Core.Resource;
+using Org.BouncyCastle.Asn1.Cmp;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -53,7 +54,7 @@
             _invokeERPService = invokeERPService;
         }
         /// <summary>
-        /// 鎺ユ敹ERP鎴愬搧鍑哄簱鍗�
+        /// 鎺ユ敹ERP鎴愬搧鍑哄簱鍗曚俊鎭�(璁㈠崟鍑哄簱/瀵勫敭鍑哄簱)
         /// </summary>
         /// <returns></returns>
         public async Task<WebResponseContent> ProductDeliveryOrder(ErpProOutOrderDTO outOrderDTO)
@@ -131,6 +132,7 @@
                             keyValuePairs.Add(item.SaleOrder, responseContent.Data[0].Endcustomer);
                         }
                     }
+                    proOutOrderDetail.QtyPcs += proOutOrderDetail.SpareQty;
                     proOutOrderDetails.Add(proOutOrderDetail);
                 }
                 Dt_ProOutOrder  proOutOrder= new Dt_ProOutOrder()
@@ -199,6 +201,69 @@
                 content.Error(ex.Message);
             }
             return content;
+        }
+        /// <summary>
+        /// 閿�鍞寚娲�
+        /// </summary>
+        /// <returns></returns>
+        public async Task<WebResponseContent> ProductSpecifyVer(ErpProductSpecifyVerDTO erpProductSpecifyVerDTO)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==erpProductSpecifyVerDTO.WaType);
+                if (warehouse == null)
+                    return await Task.FromResult(content.Error($"鏈壘鍒皗erpProductSpecifyVerDTO.WaType}浠撳簱淇℃伅"));
+                //鏌ヨ鍙寚娲惧簱瀛�
+                List<Dt_ProStockInfo> proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => x.ProStockAttribute == ProStockAttributeEnum.鎴愬搧.ObjToInt())
+                .Includes(x => x.proStockInfoDetails)
+                .Where(x => x.proStockInfoDetails
+                .Any(v =>
+                     v.SaleOrder == erpProductSpecifyVerDTO.OrderNo
+                    && v.ProductCode == erpProductSpecifyVerDTO.PCode
+                    && v.ProductVersion == erpProductSpecifyVerDTO.PVer
+                    && v.LotNumber == erpProductSpecifyVerDTO.PLot
+                    && v.DateCode == erpProductSpecifyVerDTO.DateCode
+                    && (v.SpecifyVer==null||v.SpecifyVer=="")
+                ))
+                .ToList();
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
+                List<Dt_ProStockInfoDetail> specifyVerDetails = new List<Dt_ProStockInfoDetail>();
+                if (proStockInfos==null)
+                    return await Task.FromResult(content.Error("鍙寚娲惧簱瀛樹笉瀛樺湪"));
+                proStockInfos = proStockInfos.OrderBy(x => x.proStockInfoDetails.FirstOrDefault()?.DateCode).ThenBy(x => x.CreateDate).ThenBy(x => x.proStockInfoDetails.Sum(x => x.StockPcsQty)).ToList();
+                foreach (var item in proStockInfos)
+                {
+                    proStockInfoDetails.AddRange(item.proStockInfoDetails);
+                }
+                if (proStockInfoDetails.Sum(x=>x.StockPcsQty)< erpProductSpecifyVerDTO.QtyPcs)
+                    return await Task.FromResult(content.Error($"鍙寚娲惧簱瀛樻暟閲忎笉瓒�,鍙敤:{proStockInfoDetails.Sum(x => x.StockPcsQty)}"));
+                float overQty = 0;
+                foreach (var item in proStockInfoDetails)
+                {
+                    specifyVerDetails.Add(item);
+                    overQty += item.StockPcsQty;
+                    //宸叉弧瓒宠幏鍙栨暟閲忎笉鍐嶆洿鏀�
+                    if (overQty>= erpProductSpecifyVerDTO.QtyPcs)
+                    {
+                        break;
+                    }
+                }
+                specifyVerDetails.ForEach(x =>
+                {
+                    x.SpecifyVer = erpProductSpecifyVerDTO.Ver;
+                });
+                _unitOfWorkManage.BeginTran();
+                _stockRepository.ProStockInfoDetailRepository.UpdateData(specifyVerDetails);
+                _unitOfWorkManage.CommitTran();
+                content.OK("鎸囨淳鎴愬姛");
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                content.Error(ex.Message);
+            }
+            return await Task.FromResult(content);
         }
         /// <summary>
         /// 鎴愬搧鍑哄緟鍙戣揣鍖�(骞冲簱)+鍚屾ERP鍑哄簱(缁戝畾浜嗗嚭搴撳崟搴撳瓨)
@@ -654,7 +719,7 @@
         /// <summary>
         /// 鏌ヨERP璁㈠崟鎵i櫎搴撳瓨鏁伴噺
         /// </summary>
-        public async Task<WebResponseContent> OutProErpSync(string outProOrderNo)
+        public WebResponseContent OutProErpSync(string outProOrderNo)
         {
             WebResponseContent content = new WebResponseContent();
             try
@@ -663,66 +728,59 @@
                 Dt_ProOutOrder proOutOrder = BaseDal.Db.Queryable<Dt_ProOutOrder>().Where(x=>x.ProOutOrderNo== outProOrderNo).Includes(x => x.Details).First();
                 if (proOutOrder==null)
                 {
-                    return await Task.FromResult(content.Error($"鏈壘鍒版垚鍝佸嚭搴撹鍗晎outProOrderNo}"));
+                    return content.Error($"鏈壘鍒版垚鍝佸嚭搴撹鍗晎outProOrderNo}");
                 }
                 if (proOutOrder.ProOrderStatus>=OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
                 {
-                    return await Task.FromResult(content.Error($"鍑哄簱璁㈠崟宸插畬鎴愭垨鍏抽棴"));
+                    return content.Error($"鍑哄簱璁㈠崟宸插畬鎴愭垨鍏抽棴");
                 }
                 //璋冪敤erp鍑哄簱璁㈠崟搴撳瓨鏌ヨ鎺ュ彛
                 string response = _invokeERPService.InvokeOutProErpSync(outProOrderNo);
                 ErpOutProSyncResponseContent erpOutProSyncResponse= response.DeserializeObject<ErpOutProSyncResponseContent>();
                 if (erpOutProSyncResponse.Code!=200)
                 {
-                    return await Task.FromResult(content.Error($"ERP鍑哄簱璁㈠崟鏌ヨ鎺ュ彛璋冪敤澶辫触,閿欒淇℃伅:{erpOutProSyncResponse.Msg}"));
+                    return content.Error($"ERP鍑哄簱璁㈠崟鏌ヨ鎺ュ彛璋冪敤澶辫触,閿欒淇℃伅:{erpOutProSyncResponse.Msg}");
                 }
                 List<OutProStock> outProStocks = erpOutProSyncResponse.Data;
                 if (outProStocks.Count<=0 || outProStocks==null)
                 {
-                    return await Task.FromResult(content.Error($"鎴愬搧鍑哄簱璁㈠崟{outProOrderNo}ERP褰撳墠鏈湁鍑哄簱搴撳瓨淇℃伅"));
+                    return content.Error($"鎴愬搧鍑哄簱璁㈠崟{outProOrderNo}ERP褰撳墠鏈湁鍑哄簱搴撳瓨淇℃伅");
+                }
+                // 楠岃瘉鎵�鏈夊嚭搴撳崟鍙锋槸鍚︿竴鑷�
+                OutProStock? outExist = outProStocks.FirstOrDefault(x => x.ShippingNumber != outProOrderNo);
+                if (outExist != null)
+                {
+                    return content.Error($"ERP杩斿洖浜嗗嚭搴撹鍗晎outExist.ShippingNumber}搴撳瓨淇℃伅");
                 }
                 //鑾峰彇骞冲簱搴撳尯
                 Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
                 if (warehouse==null)
                 {
-                    return await Task.FromResult(content.Error("鏈壘鍒板簱鍖轰俊鎭�"));
+                    return content.Error("鏈壘鍒板簱鍖轰俊鎭�");
                 }
+                var productCodes = outProStocks.Select(x => x.Partnum).Distinct().ToList();
                 //鑾峰彇鎵�鏈夊钩搴撳簱瀛�
-                List<Dt_ProStockInfo> proStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId).Includes(x => x.proStockInfoDetails).ToList();
-                List<Dt_ProStockInfoDetail> proStockInfoDetails= new List<Dt_ProStockInfoDetail>();
-                foreach (var item in proStockInfos)
-                {
-                    proStockInfoDetails.AddRange(item.proStockInfoDetails);
-                }
-                proStockInfoDetails = proStockInfoDetails.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ToList() ;
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo, Dt_ProStockInfoDetail>((master, detail) => master.Id == detail.ProStockId)
+                .Where((master, detail) => master.WarehouseId == warehouse.WarehouseId && productCodes.Contains(detail.ProductCode))
+                .Select((master, detail) => detail)
+                .ToList();
+                proStockInfoDetails = proStockInfoDetails.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ToList();
+                List<int> stockIds = proStockInfoDetails.Select(x => x.ProStockId).Distinct().ToList();
+                //鑾峰彇鎵�鏈夊钩搴撲富琛�
+                List<Dt_ProStockInfo> proStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => stockIds.Contains(x.Id)).Includes(x => x.proStockInfoDetails).ToList();
                 List<Dt_ProStockInfo> delProStockInfos = new List<Dt_ProStockInfo>();
                 List<Dt_ProStockInfoDetail> delStockInfoDetails = new List<Dt_ProStockInfoDetail>();
                 foreach (var item in outProStocks)
                 {
-                    //鏌ヨ搴撳瓨璁板綍
-                    if (item.ShippingNumber != outProOrderNo)
-                    {
-                        return await Task.FromResult(content.Error($"ERP杩斿洖浜嗗嚭搴撹鍗晎item.ShippingNumber}搴撳瓨淇℃伅"));
-                    }
-                    //鑾峰彇搴撳瓨
-                    List<Dt_ProStockInfoDetail> outStocks = proStockInfoDetails.Where(x=>x.ProductCode==item.Partnum).ToList();
-                    if (outStocks.Count==0 || outStocks==null)
-                    {
-                        return await Task.FromResult(content.Error($"{item.Partnum}浜у搧鍨嬪彿搴撳瓨涓嶅瓨鍦�"));
-                    }
-                    foreach (var itemOut in outStocks)
+                    foreach (var itemOut in proStockInfoDetails.Where(x => x.ProductCode == item.Partnum).ToList())
                     {
                         if (item.Quantity==0)
                         {
                             break;
                         }
+                        Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.SaleOrder == item.SoNumber && x.PCode == item.Partnum) ?? throw new Exception($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}鏈壘鍒伴攢鍞鍗晎item.SoNumber}鏄庣粏,璇锋鏌�");
                         if (item.Quantity >= itemOut.StockPcsQty)
                         {
-                            Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.SaleOrder == item.SoNumber && x.PCode == item.Partnum);
-                            if (proOutOrderDetail == null)
-                            {
-                                return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}鏈壘鍒伴攢鍞鍗晎item.SoNumber}鏄庣粏,璇锋鏌�"));
-                            }
                             //鏇存柊鍑哄簱鏄庣粏鍗曟暟閲�
                             proOutOrderDetail.OverQtyPcs += itemOut.StockPcsQty;
                             item.Quantity -= (int)itemOut.StockPcsQty;
@@ -730,7 +788,7 @@
                             proStockInfoDetails.Remove(itemOut);
                             if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
                             {
-                                return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}閿�鍞鍗晎item.SoNumber}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}"));
+                                return content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}閿�鍞鍗晎item.SoNumber}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}");
                             }
                             if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                             {
@@ -743,20 +801,26 @@
                         }
                         else if (item.Quantity < itemOut.StockPcsQty)
                         {
-                            Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.SaleOrder == item.SoNumber && x.PCode == item.Partnum);
-                            if (proOutOrderDetail == null)
-                            {
-                                return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}鏈壘鍒伴攢鍞鍗晎item.SoNumber}鏄庣粏,璇锋鏌�"));
-                            }
+                            
                             //鏇存柊鍑哄簱鏄庣粏鍗曟暟閲�
                             proOutOrderDetail.OverQtyPcs += item.Quantity;
                             item.Quantity -= item.Quantity;
                             float Range = itemOut.StockPcsQty / itemOut.SETQty;
-                            itemOut.SETQty = item.Quantity / Range;
+                            if (Range == 0)
+                            {
+                                return content.Error($"{itemOut.BagNo}鍗曞厓鏁伴噺杞崲澶辫触,璇锋鏌�");
+                            }
+                            int outSet = (int)(item.Quantity / Range);
+                            if (outSet == 0)
+                            {
+                                return content.Error($"{itemOut.BagNo}鍗曞厓鏁伴噺杞崲澶辫触,璇锋鏌�");
+                            }
+                            itemOut.SETQty -= outSet;
+                            
                             itemOut.StockPcsQty -= item.Quantity;
                             if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
                             {
-                                return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}閿�鍞鍗晎item.SoNumber}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}"));
+                                return content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}閿�鍞鍗晎item.SoNumber}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}");
                             }
                             if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                             {
@@ -768,6 +832,10 @@
                             }
                         }
                     }
+                    if (item.Quantity>0)
+                    {
+                        return content.Error($"鏈壘鍒皗item.SoNumber}鍙墸鍑忓簱瀛�");
+                    }
                 }
                 if (proOutOrder.Details.Count == proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count())
                 {
@@ -776,24 +844,34 @@
                 else
                 {
                     Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.ProOrderDetailStatus <= OrderDetailStatusEnum.Over.ObjToInt());
-                    return await Task.FromResult(content.Error($"{proOutOrderDetail?.SaleOrder}閿�鍞鍗曟暟閲忛渶鍑簕proOutOrderDetail?.QtyPcs},鍙嚭{proOutOrderDetail?.OverQtyPcs}"));
+                    return content.Error($"{proOutOrderDetail?.SaleOrder}閿�鍞鍗曟暟閲忛渶鍑簕proOutOrderDetail?.QtyPcs},鍙嚭{proOutOrderDetail?.OverQtyPcs}");
+                }
+                //鑾峰彇鍒犻櫎鐨勫簱瀛樹富琛�
+                List<int> delStockIds = delStockInfoDetails.Select(x => x.ProStockId).Distinct().ToList();
+                List<int> delStockDetailIds = delStockInfoDetails.Select(x => x.Id).ToList();
+                foreach (var item in delStockIds)
+                {
+                    Dt_ProStockInfo proStockInfo = proStockInfos.FirstOrDefault(x => x.Id == item);
+                    Dt_ProStockInfoDetail? proStockInfoDetail = proStockInfo.proStockInfoDetails.FirstOrDefault(x => !delStockDetailIds.Contains(x.Id));
+                    if (proStockInfoDetail == null)
+                    {
+                        delProStockInfos.Add(proStockInfo);
+                    }
                 }
                 //鏇存柊鏁版嵁
                 _unitOfWorkManage.BeginTran();
-                if (delStockInfoDetails.Count > 0)
-                {
-                    _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delStockInfoDetails, OperateTypeEnum.鑷姩鍒犻櫎);
-                }
-                await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(proStockInfoDetails);
-                await BaseDal.UpdateDataAsync(proOutOrder);
-                await _outboundRepository.ProOutOrderDetailRepository.UpdateDataAsync(proOutOrder.Details);
+                _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delStockInfoDetails, OperateTypeEnum.鑷姩鍒犻櫎);
+                _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(delProStockInfos, OperateTypeEnum.鑷姩瀹屾垚);
+                _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
+                BaseDal.UpdateData(proOutOrder);
+                _outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrder.Details);
                 _unitOfWorkManage.CommitTran();
-                return await Task.FromResult(content.OK());
+                return content.OK();
             }
             catch (Exception ex)
             {
                 _unitOfWorkManage.RollbackTran();
-                return await Task.FromResult(content.Error(ex.Message));
+                return content.Error(ex.Message);
             }
         }
         /// <summary>
@@ -842,17 +920,17 @@
                 {
                     return await Task.FromResult(content.Error("鏈壘鍒板簱鍖轰俊鎭�"));
                 }
-                //鑾峰彇鎵�鏈夊钩搴撶殑鏁版嵁
-                List<Dt_ProStockInfo> AllproStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>()
-                    .Where(x => x.WarehouseId == warehouse.WarehouseId)
-                    .Includes(x => x.proStockInfoDetails).ToList();
-                List<Dt_ProStockInfo> proStockInfos = new List<Dt_ProStockInfo>();
-                List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
-                foreach (var item in AllproStockInfos)
-                {
-                    proStockInfoDetails.AddRange(item.proStockInfoDetails);
-                }
+                
+                //鑾峰彇鎵�鏈夊钩搴撳簱瀛�
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo, Dt_ProStockInfoDetail>((master, detail) => master.Id == detail.ProStockId)
+                .Where((master, detail) => master.WarehouseId == warehouse.WarehouseId && outProInfos.Select(x=>x.ProductCode).Contains(detail.ProductCode))
+                .Select((master, detail) => detail)
+                .ToList();
+                List<int> stockIds = proStockInfoDetails.Select(x => x.ProStockId).Distinct().ToList();
+                //鑾峰彇鎵�鏈夊钩搴撲富琛�
+                List<Dt_ProStockInfo> proStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => stockIds.Contains(x.Id)).Includes(x=>x.proStockInfoDetails).ToList();
                 proStockInfoDetails = proStockInfoDetails.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ThenBy(x=>x.StockPcsQty).ToList();
+
                 List<Dt_Warehouse> warehouses = await _basicRepository.WarehouseRepository.QueryDataAsync(x => x.WarehouseType == WarehouseTypEnum.鎴愬搧.ToString());
                 //灏嗗叾鍒嗙粍
                 outProInfos = outProInfos.GroupBy(x => x.ProductCode).Select(x=>new OutProInfoDTO()
@@ -861,6 +939,7 @@
                     OutQtys=x.Sum(x=>x.OutQtys)
                 }).ToList();
                 List<Dt_ProStockInfoDetail> UpStockInfoDetails = new List<Dt_ProStockInfoDetail>();
+                List<Dt_ProStockInfo> DelStocks = new List<Dt_ProStockInfo>();
                 foreach (var item in outProInfos)
                 {
                     //鑾峰彇搴撳瓨
@@ -868,6 +947,10 @@
                     if (outStocks.Count <= 0 || outProInfos==null)
                     {
                         return await Task.FromResult(content.Error($"鏈壘鍒颁骇鍝亄item.ProductCode}搴撳瓨"));
+                    }
+                    if (outStocks.Sum(x=>x.StockPcsQty)< item.OutQtys)
+                    {
+                        return await Task.FromResult(content.Error($"鍙敤骞冲簱鏁伴噺{outStocks.Sum(x => x.StockPcsQty)}涓嶆弧瓒冲嚭搴撴暟閲弡item.OutQtys}"));
                     }
                     foreach (var outStock in outStocks)
                     {
@@ -909,6 +992,10 @@
                                     else
                                     {
                                         outStock.OutSETQty = outStock.OutboundQuantity / Range;
+                                    }
+                                    if (outStock.OutSETQty==0)
+                                    {
+                                        return await Task.FromResult(content.Error($"{outStock.BagNo}鍗曞厓鏁伴噺杞崲澶辫触,璇锋鏌�"));
                                     }
                                     item.OutQtys -= (int)BeyondQtys;
                                     UpStockInfoDetails.Add(outStock);
@@ -963,7 +1050,11 @@
                                     outStock.OutboundQuantity = BeyondQtys;
                                     float Range = outStock.StockPcsQty / outStock.SETQty;
                                     outStock.OutSETQty = outStock.OutboundQuantity / Range;
-                                    item.OutQtys -= (int)BeyondQtys;
+                                    if (outStock.OutSETQty == 0)
+                                    {
+                                        return await Task.FromResult(content.Error($"{outStock.BagNo}鍗曞厓鏁伴噺杞崲澶辫触,璇锋鏌�"));
+                                    }
+                                    item.OutQtys = 0;
                                     UpStockInfoDetails.Add(outStock);
                                     proStockInfoDetails.Remove(outStock);
                                 }
@@ -979,7 +1070,11 @@
                                 outStock.OutboundQuantity = item.OutQtys;
                                 float Range = outStock.StockPcsQty / outStock.SETQty;
                                 outStock.OutSETQty = outStock.OutboundQuantity / Range;
-                                item.OutQtys -= item.OutQtys;
+                                if (outStock.OutSETQty == 0)
+                                {
+                                    return await Task.FromResult(content.Error($"{outStock.BagNo}鍗曞厓鏁伴噺杞崲澶辫触,璇锋鏌�"));
+                                }
+                                item.OutQtys = 0;
                                 UpStockInfoDetails.Add(outStock);
                                 proStockInfoDetails.Remove(outStock);
                             }
@@ -1004,69 +1099,72 @@
                     return await Task.FromResult(content.Error($"{proOutOrderDetail?.SaleOrder}閿�鍞鍗曟暟閲忛渶鍑簕proOutOrderDetail?.QtyPcs},鍙嚭{proOutOrderDetail?.OverQtyPcs}"));
                 }
                 List<StockOutItemsItem> stockOutItems = new List<StockOutItemsItem>();
-                if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+                //鑾峰彇鎵�鏈夊凡鎵爜寰呭彂璐х殑搴撳瓨
+                List<Dt_ProStockInfoDetail> assOutStocks = _stockRepository.ProStockInfoDetailRepository.Db.Queryable<Dt_ProStockInfoDetail>()
+                .Where(x => x.OutProNo == ProOutNo).ToList();
+                UpStockInfoDetails.AddRange(assOutStocks);
+                foreach (var item in UpStockInfoDetails)
                 {
-                    //鑾峰彇鎵�鏈夊凡鎵爜寰呭彂璐х殑搴撳瓨
-                    List<Dt_ProStockInfoDetail> assOutStocks = _stockRepository.ProStockInfoDetailRepository.Db.Queryable<Dt_ProStockInfoDetail>()
-                    .Where(x => x.OutProNo == ProOutNo).ToList();
-                    UpStockInfoDetails.AddRange(assOutStocks);
-                    foreach (var item in UpStockInfoDetails)
+                    StockOutItemsItem outItemsItem = new StockOutItemsItem()
                     {
-                        StockOutItemsItem outItemsItem = new StockOutItemsItem()
-                        {
-                            PartNum = item.ProductCode,
-                            Rev = item.ProductVersion,
-                            SoNumber = item.OutDetailSaleNo,
-                            BatchNumber = item.ProductCode,
-                            QtyPcs = item.OutboundQuantity,
-                            QtySet = item.OutSETQty
-                        };
-                        stockOutItems.Add(outItemsItem);
-                    }
+                        PartNum = item.ProductCode,
+                        Rev = item.ProductVersion,
+                        SoNumber = item.OutDetailSaleNo,
+                        BatchNumber = item.ProductCode,
+                        QtyPcs = item.OutboundQuantity,
+                        QtySet = item.OutSETQty
+                    };
+                    stockOutItems.Add(outItemsItem);
                 }
                 Dt_Warehouse warehouseOut = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault();
-                _unitOfWorkManage.BeginTran();
-                //澶勭悊搴撳瓨鏁版嵁鍜屼笂浼燛RP
-                if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
+                //鑾峰彇鍒犻櫎搴撳瓨
+                List<Dt_ProStockInfoDetail> delDetails = UpStockInfoDetails.Where(x => x.AssignDel == 1).ToList();
+                List<Dt_ProStockInfoDetail> UpDetails = UpStockInfoDetails.Where(x => x.AssignDel != 1).ToList();
+                //鑾峰彇鍒犻櫎鐨勫簱瀛樹富琛�
+                List<int> delStockIds = delDetails.Select(x => x.ProStockId).Distinct().ToList();
+                List<int> delStockDetailIds = delDetails.Select(x => x.Id).ToList();
+                foreach (var item in delStockIds)
                 {
-                    //鎴愬搧搴撳瓨璁板綍鍙樺姩寰呭姞鍏�
-                    ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel()
+                    Dt_ProStockInfo proStockInfo = proStockInfos.FirstOrDefault(x=>x.Id==item);
+                    Dt_ProStockInfoDetail? proStockInfoDetail= proStockInfo.proStockInfoDetails.FirstOrDefault(x=> !delStockDetailIds.Contains(x.Id));
+                    if (proStockInfoDetail==null)
                     {
-                        Way = 1,
-                        StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
-                        ConfirmedUserNo = App.User.UserName,
-                        AssignUserNo = App.User.UserName,
-                        WarehouseCode = warehouseOut.WarehouseCode,
-                        ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
-                        DeliverplanCode = proOutOrder.ProOutOrderNo,
-                        Remark = proOutOrder.Remark,
-                        StockOutItems = stockOutItems
-                    };
-                    //鑾峰彇鍒犻櫎搴撳瓨
-                    List<Dt_ProStockInfoDetail> delDetails = UpStockInfoDetails.Where(x=>x.AssignDel==1).ToList();
-                    List<Dt_ProStockInfoDetail> UpDetails = UpStockInfoDetails.Where(x => x.AssignDel != 1).ToList();
-                    //鏇存柊鏁版嵁
-                    UpDetails.ForEach(x =>
-                    {
-                        x.StockPcsQty -= x.OutboundQuantity;
-                        x.SETQty -= x.OutSETQty;
-                        x.OutDetailId = 0;
-                        x.OutDetailSaleNo = null;
-                        x.OutProNo = null;
-                    });
-                    _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delDetails, OperateTypeEnum.鑷姩瀹屾垚);
-                    await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(UpDetails);
-                    //鍚屾ERP
-                    string response = _invokeERPService.InvokeProOutApi(proOutOrderModel);
-                    ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>();
-                    if (erpRequestContent.res != 1)
-                    {
-                        throw new Exception("鍚屾ERP澶辫触,閿欒淇℃伅:" + erpRequestContent.Data);
+                        DelStocks.Add(proStockInfo);
                     }
                 }
-                else
+                _unitOfWorkManage.BeginTran();
+                //澶勭悊搴撳瓨鏁版嵁鍜屼笂浼燛RP
+                //鎴愬搧搴撳瓨璁板綍鍙樺姩寰呭姞鍏�
+                ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel()
                 {
-                    await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(UpStockInfoDetails);
+                    Way = 1,
+                    StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
+                    ConfirmedUserNo = App.User.UserName,
+                    AssignUserNo = App.User.UserName,
+                    WarehouseCode = warehouseOut.WarehouseCode,
+                    ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+                    DeliverplanCode = proOutOrder.ProOutOrderNo,
+                    Remark = proOutOrder.Remark,
+                    StockOutItems = stockOutItems
+                };
+                //鏇存柊鏁版嵁
+                UpDetails.ForEach(x =>
+                {
+                    x.StockPcsQty -= x.OutboundQuantity;
+                    x.SETQty -= x.OutSETQty;
+                    x.OutDetailId = 0;
+                    x.OutDetailSaleNo = null;
+                    x.OutProNo = null;
+                });
+                _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delDetails, OperateTypeEnum.鑷姩瀹屾垚);
+                _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(DelStocks, OperateTypeEnum.鑷姩瀹屾垚);
+                await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(UpDetails);
+                //鍚屾ERP
+                string response = _invokeERPService.InvokeProOutApi(proOutOrderModel);
+                ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>();
+                if (erpRequestContent.res != 1)
+                {
+                    throw new Exception("鍚屾ERP澶辫触,閿欒淇℃伅:" + erpRequestContent.Data);
                 }
                 await _outboundRepository.ProOutOrderDetailRepository.UpdateDataAsync(proOutOrder.Details);
                 await BaseDal.UpdateDataAsync(proOutOrder);

--
Gitblit v1.9.3