From 753361f589444455fe1b20476c658201ccd92c38 Mon Sep 17 00:00:00 2001
From: helongyang <647556386@qq.com>
Date: 星期三, 30 七月 2025 09:53:19 +0800
Subject: [PATCH] 更新优化

---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs |  198 ++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 144 insertions(+), 54 deletions(-)

diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs"
index 3db069b..9321114 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs"
@@ -109,9 +109,15 @@
         public List<Dt_ProStockInfo> GetUseableStocks(Dt_MesRworkOutboundOrder mesRworkOutboundOrder)
         {
             //杞崲鎴� 鎴愬搧浠撲粨搴撲俊鎭幏鍙栧熬鏁板睘鎬х殑璐т綅
-            Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==WarehouseEnum.HA71.ToString());
+            Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseId== mesRworkOutboundOrder.WarehouseId);
             List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehouse.WarehouseId);
             return BaseDal.GetProStocks(mesRworkOutboundOrder, locationCodes);
+        }
+        //鏌ユ壘鍙敤鎶ュ簾搴撳瓨
+        public List<Dt_ProStockInfo> GetUseableStocks(int warehoseId, Dt_ErpProScrapSheetDetail erpProScrapSheetDetail)
+        {
+            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId);
+            return BaseDal.GetProStocks(erpProScrapSheetDetail, locationCodes);
         }
         /// <summary>
         /// 鑾峰彇鍑哄簱搴撳瓨
@@ -119,10 +125,14 @@
         public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_ProOutOrderDetail outOrderDetail, float needQuantity, out float residueQuantity)
         {
             List<Dt_ProStockInfo> assignOutStocks =new List<Dt_ProStockInfo>();
-            float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x);
-            //stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
             bool isCanLot = string.IsNullOrEmpty(outOrderDetail.PLot);
             bool isCanDate = string.IsNullOrEmpty(outOrderDetail.DateCode);
+            float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Where(x => x.ProductCode == outOrderDetail.PCode && x.ProductVersion.StartsWith(outOrderDetail.PVer.Substring(0, 1))
+                            && (isCanLot ? isCanLot : x.ProductCode == outOrderDetail.PLot)
+                            && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode))
+                        .Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x);
+            //stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
+            
             if (stockTotalQuantity >= needQuantity)//搴撳瓨澶�
             {
                 int index = 0;
@@ -131,13 +141,13 @@
                     Dt_ProStockInfo stockInfo = stockInfos[index];
                     float useableStockQuantity = stockInfo.proStockInfoDetails
                         .Where(x => x.ProductCode == outOrderDetail.PCode && x.ProductVersion.StartsWith(outOrderDetail.PVer.Substring(0,1))
-                            && (isCanLot ? isCanLot : x.BagNo == outOrderDetail.PLot)
+                            && (isCanLot ? isCanLot : x.ProductCode == outOrderDetail.PLot)
                             && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode))
                         .Sum(x => x.StockPcsQty - x.OutboundQuantity);
                     if (useableStockQuantity < needQuantity && useableStockQuantity >0)
                     {
                         stockInfo.proStockInfoDetails.Where(x => x.ProductCode == outOrderDetail.PCode && x.ProductVersion.StartsWith(outOrderDetail.PVer.Substring(0, 1))
-                            && (isCanLot ? isCanLot : x.BagNo == outOrderDetail.PLot)
+                            && (isCanLot ? isCanLot : x.ProductCode == outOrderDetail.PLot)
                             && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode)).ToList().ForEach(x => x.OutboundQuantity = x.StockPcsQty);
                         needQuantity -= useableStockQuantity;
                     }
@@ -148,7 +158,7 @@
                             //婊¤冻鏉′欢杩涜鍒嗛厤
                             if ((x.StockPcsQty > x.OutboundQuantity)
                                 && x.ProductCode == outOrderDetail.PCode && x.ProductVersion.StartsWith(outOrderDetail.PVer.Substring(0, 1)) 
-                                && (isCanLot ? isCanLot : x.BagNo == outOrderDetail.PLot)
+                                && (isCanLot ? isCanLot : x.ProductCode == outOrderDetail.PLot)
                                 && (isCanDate ? isCanDate : x.DateCode == outOrderDetail.DateCode))
                             {
                                 if (x.StockPcsQty - x.OutboundQuantity >= needQuantity)
@@ -222,14 +232,16 @@
             return assignOutStocks;
         }
         /// <summary>
-        /// 鑾峰彇MES鎻愬簱搴撳瓨
+        /// 鑾峰彇鎶ュ簾搴撳瓨
         /// </summary>
-        public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_MesRworkOutboundOrder mesRworkOutboundOrder, float needQuantity, out float residueQuantity)
+        public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_ErpProScrapSheetDetail outOrderDetail, float needQuantity, out float residueQuantity)
         {
             List<Dt_ProStockInfo> assignOutStocks = new List<Dt_ProStockInfo>();
-            float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x);
+            float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Where(x =>
+                            x.ProductCode == outOrderDetail.ScrapProCode
+                            && x.ProductVersion == outOrderDetail.ScrapProVersion
+                            && x.LotNumber == outOrderDetail.ScrapProLotNo).Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x);
             //stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
-            bool isCanDate = string.IsNullOrEmpty(mesRworkOutboundOrder.DateCode);
             if (stockTotalQuantity >= needQuantity)//搴撳瓨澶�
             {
                 int index = 0;
@@ -237,8 +249,71 @@
                 {
                     Dt_ProStockInfo stockInfo = stockInfos[index];
                     float useableStockQuantity = stockInfo.proStockInfoDetails
-                        .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder 
-                            && x.ProductCode == mesRworkOutboundOrder.ProductCode 
+                        .Where(x => 
+                            x.ProductCode == outOrderDetail.ScrapProCode 
+                            && x.ProductVersion==outOrderDetail.ScrapProVersion
+                            && x.LotNumber == outOrderDetail.ScrapProLotNo)
+                        .Sum(x => x.StockPcsQty - x.OutboundQuantity);
+                    if (useableStockQuantity < needQuantity && useableStockQuantity > 0)
+                    {
+                        stockInfo.proStockInfoDetails.Where(x => 
+                            x.ProductCode == outOrderDetail.ScrapProCode
+                            && x.ProductVersion == outOrderDetail.ScrapProVersion
+                            && x.LotNumber == outOrderDetail.ScrapProLotNo).ToList().ForEach(x => x.OutboundQuantity = x.StockPcsQty);
+                        needQuantity -= useableStockQuantity;
+                    }
+                    else
+                    {
+                        stockInfo.proStockInfoDetails.ForEach(x =>
+                        {
+                            //婊¤冻鏉′欢杩涜鍒嗛厤
+                            if ((x.StockPcsQty > x.OutboundQuantity)
+                            && x.ProductCode == outOrderDetail.ScrapProCode
+                            && x.ProductVersion == outOrderDetail.ScrapProVersion
+                            && x.LotNumber == outOrderDetail.ScrapProLotNo)
+                            {
+                                if (x.StockPcsQty - x.OutboundQuantity >= needQuantity)
+                                {
+                                    x.OutboundQuantity += needQuantity;
+                                    needQuantity = 0;
+                                    x.OutDetailId = outOrderDetail.Id;
+                                }
+                                else
+                                {
+                                    needQuantity -= (x.StockPcsQty - x.OutboundQuantity);
+                                    x.OutboundQuantity = x.StockPcsQty;
+                                    x.OutDetailId = outOrderDetail.Id;
+                                }
+                            }
+                        });
+                    }
+                    assignOutStocks.Add(stockInfo);
+                    index++;
+                }
+            }
+            residueQuantity = needQuantity;
+            return assignOutStocks;
+        }
+        /// <summary>
+        /// 鑾峰彇MES鎻愬簱搴撳瓨
+        /// </summary>
+        public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_MesRworkOutboundOrder mesRworkOutboundOrder, float needQuantity, out float residueQuantity)
+        {
+            List<Dt_ProStockInfo> assignOutStocks = new List<Dt_ProStockInfo>();
+            bool isCanDate = string.IsNullOrEmpty(mesRworkOutboundOrder.DateCode);
+            float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Where(x => x.ProductCode == mesRworkOutboundOrder.ProductCode
+                            && x.ProductVersion == mesRworkOutboundOrder.ProductVersion
+                            && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode))
+                        .Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x);
+            //stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
+            if (stockTotalQuantity >= needQuantity)//搴撳瓨澶�
+            {
+                int index = 0;
+                while (needQuantity > 0)
+                {
+                    Dt_ProStockInfo stockInfo = stockInfos[index];
+                    float useableStockQuantity = stockInfo.proStockInfoDetails
+                        .Where(x => x.ProductCode == mesRworkOutboundOrder.ProductCode 
                             && x.ProductVersion == mesRworkOutboundOrder.ProductVersion
                             && (isCanDate? isCanDate: x.DateCode == mesRworkOutboundOrder.DateCode))
                         .Sum(x => x.StockPcsQty - x.OutboundQuantity);
@@ -251,7 +326,7 @@
                     {
                         stockInfo.proStockInfoDetails.ForEach(x =>
                         {
-                            if ((x.StockPcsQty > x.OutboundQuantity) && x.SaleOrder == mesRworkOutboundOrder.SaleOrder 
+                            if ((x.StockPcsQty > x.OutboundQuantity) 
                                 && x.ProductCode == mesRworkOutboundOrder.ProductCode 
                                 && x.ProductVersion == mesRworkOutboundOrder.ProductVersion
                                 && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode))
@@ -271,47 +346,6 @@
                     }
                     assignOutStocks.Add(stockInfo);
                     index++;
-                }
-            }
-            else
-            {
-                for (int i = 0; i < stockInfos.Count; i++)
-                {
-                    Dt_ProStockInfo stockInfo = stockInfos[i];
-                    float useableStockQuantity = stockInfo.proStockInfoDetails
-                        .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder
-                            && x.ProductCode == mesRworkOutboundOrder.ProductCode
-                            && x.ProductVersion == mesRworkOutboundOrder.ProductVersion
-                            && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode))
-                        .Sum(x => x.StockPcsQty - x.OutboundQuantity);
-                    if (useableStockQuantity < needQuantity)
-                    {
-                        stockInfo.proStockInfoDetails.ForEach(x => x.OutboundQuantity = x.StockPcsQty);
-                        needQuantity -= useableStockQuantity;
-                    }
-                    else
-                    {
-                        stockInfo.proStockInfoDetails.ForEach(x =>
-                        {
-                            if (x.StockPcsQty > x.OutboundQuantity && x.SaleOrder == mesRworkOutboundOrder.SaleOrder 
-                                && x.ProductCode == mesRworkOutboundOrder.ProductCode 
-                                && x.ProductVersion == mesRworkOutboundOrder.ProductVersion
-                                && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode))
-                            {
-                                if (x.StockPcsQty - x.OutboundQuantity >= needQuantity)
-                                {
-                                    x.OutboundQuantity += needQuantity;
-                                    needQuantity = 0;
-                                }
-                                else
-                                {
-                                    needQuantity -= (x.StockPcsQty - x.OutboundQuantity);
-                                    x.OutboundQuantity = x.StockPcsQty;
-                                }
-                            }
-                        });
-                    }
-                    assignOutStocks.Add(stockInfo);
                 }
             }
             residueQuantity = needQuantity;
@@ -337,5 +371,61 @@
         //    }
         //    return (deleteStockDetails, updateStockDetails);
         //}
+        public WebResponseContent GetProCodeByWarehouse(int warehouseId)
+        {
+            try
+            {
+                //鑾峰彇鎵�鏈夊簱瀛樺瀷鍙�
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo, Dt_ProStockInfoDetail>((master, detail) => master.Id == detail.ProStockId)
+                .Where((master, detail) => master.WarehouseId == warehouseId)
+                .Select((master, detail) => detail)
+                .ToList();
+                //杩囨护閲嶅
+                List<string> proCode = proStockInfoDetails.Select(x => x.ProductCode).Distinct().ToList();
+                return WebResponseContent.Instance.OK("鎴愬姛",data: proCode);
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+
+        public WebResponseContent GetProVersionByCode(string scrapProCode, int warehouseId)
+        {
+            try
+            {
+                //鑾峰彇鎸囧畾浜у搧搴撳瓨鐗堟湰
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo, Dt_ProStockInfoDetail>((master, detail) => master.Id == detail.ProStockId)
+                .Where((master, detail) => master.WarehouseId == warehouseId && detail.ProductCode== scrapProCode)
+                .Select((master, detail) => detail)
+                .ToList();
+                //杩囨护閲嶅
+                List<string> productVersion = proStockInfoDetails.Select(x => x.ProductVersion).Distinct().ToList();
+                return WebResponseContent.Instance.OK("鎴愬姛",data: productVersion);
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+
+        public WebResponseContent GetProLotNoByCode(string scrapProCode, int warehouseId)
+        {
+            try
+            {
+                //鑾峰彇鎸囧畾浜у搧搴撳瓨鎵规
+                List<Dt_ProStockInfoDetail> proStockInfoDetails = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo, Dt_ProStockInfoDetail>((master, detail) => master.Id == detail.ProStockId)
+                .Where((master, detail) => master.WarehouseId == warehouseId && detail.ProductCode == scrapProCode)
+                .Select((master, detail) => detail)
+                .ToList();
+                //杩囨护閲嶅
+                List<string> lotNumber = proStockInfoDetails.Select(x => x.LotNumber).Distinct().ToList();
+                return WebResponseContent.Instance.OK("鎴愬姛", data: lotNumber);
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
     }
 }

--
Gitblit v1.9.3