From c827fe7b0c5b3b444d76ba0d96a2649c764630dd Mon Sep 17 00:00:00 2001
From: dengjunjie <dengjunjie@hnkhzn.com>
Date: 星期四, 14 十一月 2024 16:36:08 +0800
Subject: [PATCH] 修改WCS、WMS出入库逻辑

---
 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs |  211 +++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 142 insertions(+), 69 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs"
index 3a4315c..6a69746 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs"
@@ -99,7 +99,6 @@
 
             return BaseDal.GetStockInfos(materielCode, locationCodes);
         }
-
         /// <summary>
         /// 鑾峰彇鎸囧畾鐗╂枡搴撳瓨淇℃伅
         /// </summary>
@@ -115,97 +114,171 @@
 
             List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(roadways, areaIds);
 
-            return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO
+            #region 鎸夌墿鏂欐暟閲忔煡璇�
+            //var StockSelectViewDTOs = BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO
+            //{
+            //    LocationCode = a.LocationCode,
+            //    MaterielCode = b.MaterielCode,
+            //    MaterielName = b.MaterielName,
+            //    PalletCode = a.PalletCode,
+            //    UseableQuantity = b.StockQuantity - b.OutboundQuantity
+            //}, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.Status == StockStatusEmun.宸插叆搴�.ObjToInt() && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new StockSelectViewDTO
+            //{
+            //    LocationCode = x.FirstOrDefault()?.LocationCode ?? "",
+            //    MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "",
+            //    MaterielName = x.FirstOrDefault()?.MaterielName ?? "",
+            //    PalletCode = x.Key,
+            //    UseableQuantity = x.Sum(x => x.UseableQuantity)
+            //}).ToList();
+            #endregion
+
+            #region 鎸夋壒鍙峰拰鎵樼洏鏁伴噺鏌ヨ
+            //StockSelectViewDTOs = BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO
+            //{
+            //    LocationCode = a.LocationCode,
+            //    MaterielCode = b.MaterielCode,
+            //    MaterielName = b.MaterielName,
+            //    PalletCode = a.PalletCode,
+            //    BatchNo = b.BatchNo,
+            //    UseableQuantity = 1
+            //}, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.Status == StockStatusEmun.宸插叆搴�.ObjToInt() && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new StockSelectViewDTO
+            //{
+            //    LocationCode = x.FirstOrDefault()?.LocationCode ?? "",
+            //    MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "",
+            //    MaterielName = x.FirstOrDefault()?.MaterielName ?? "",
+            //    BatchNo = x.FirstOrDefault()?.BatchNo ?? "",
+            //    PalletCode = x.Key,
+            //    UseableQuantity = x.Sum(x => x.UseableQuantity)
+            //}).ToList();
+            #endregion
+
+            #region 鏌ヨ鐗╂枡搴撳瓨鎸夋壒鍙峰垎缁�
+            var StockSelectViewDTOs = BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO
             {
-                LocationCode = a.LocationCode,
                 MaterielCode = b.MaterielCode,
                 MaterielName = b.MaterielName,
-                PalletCode = a.PalletCode,
-                UseableQuantity = b.StockQuantity - b.OutboundQuantity
-            }, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new StockSelectViewDTO
+                BatchNo = b.BatchNo,
+            }, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.Status == StockStatusEmun.宸插叆搴�.ObjToInt() && b.MaterielCode == materielCode, x => true).GroupBy(x => x.BatchNo).Select(x => new StockSelectViewDTO
             {
-                LocationCode = x.FirstOrDefault()?.LocationCode ?? "",
                 MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "",
                 MaterielName = x.FirstOrDefault()?.MaterielName ?? "",
-                PalletCode = x.Key,
-                UseableQuantity = x.Sum(x => x.UseableQuantity)
+                BatchNo = x.Key,
+                UseableQuantity = x.Count()
             }).ToList();
+            #endregion
+            return StockSelectViewDTOs;
         }
-
+        /// <summary>
+        /// 璁$畻搴撳瓨
+        /// </summary>
+        /// <param name="stockInfos"></param>
+        /// <param name="materielCode"></param>
+        /// <param name="needQuantity"></param>
+        /// <param name="residueQuantity"></param>
+        /// <returns></returns>
         public List<Dt_StockInfo> GetOutboundStocks(List<Dt_StockInfo> stockInfos, string materielCode, decimal needQuantity, out decimal residueQuantity)
         {
             List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
-            decimal stockTotalQuantity = stockInfos.Select(x => x.Details.Sum(v => v.StockQuantity - v.OutboundQuantity)).Sum(x => x);
-            stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
-            if (stockTotalQuantity >= needQuantity)//搴撳瓨澶�
+            #region 
+            if (stockInfos.Count >= needQuantity)//搴撳瓨澶�
             {
-                int index = 0;
-                while (needQuantity > 0)
+                foreach (var item in stockInfos.OrderBy(x => x.InDate).ToList().GroupBy(x => x.LocationCode))
                 {
-                    Dt_StockInfo stockInfo = stockInfos[index];
-                    decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity);
-                    if (useableStockQuantity < needQuantity)
+                    if (item.Count() <= needQuantity && needQuantity > 0)
                     {
-                        stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity);
-                        needQuantity -= useableStockQuantity;
+                        outStocks.AddRange(item);
+                        needQuantity -= item.Count();
                     }
-                    else
+                    else if (needQuantity > 0)
                     {
-                        stockInfo.Details.ForEach(x =>
-                        {
-                            if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode)
-                            {
-                                if (x.StockQuantity - x.OutboundQuantity >= needQuantity)
-                                {
-                                    x.OutboundQuantity += needQuantity;
-                                    needQuantity = 0;
-                                }
-                                else
-                                {
-                                    needQuantity -= (x.StockQuantity - x.OutboundQuantity);
-                                    x.OutboundQuantity = x.StockQuantity;
-                                }
-                            }
-                        });
+                        outStocks.Add(item.OrderByDescending(x => x.InDate).First());
+                        needQuantity -= 1;
                     }
-                    outStocks.Add(stockInfo);
-                    index++;
                 }
+
             }
             else
             {
-                for (int i = 0; i < stockInfos.Count; i++)
-                {
-                    Dt_StockInfo stockInfo = stockInfos[i];
-                    decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity);
-                    if (useableStockQuantity < needQuantity)
-                    {
-                        stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity);
-                        needQuantity -= useableStockQuantity;
-                    }
-                    else
-                    {
-                        stockInfo.Details.ForEach(x =>
-                        {
-                            if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode)
-                            {
-                                if (x.StockQuantity - x.OutboundQuantity >= needQuantity)
-                                {
-                                    x.OutboundQuantity += needQuantity;
-                                    needQuantity = 0;
-                                }
-                                else
-                                {
-                                    needQuantity -= (x.StockQuantity - x.OutboundQuantity);
-                                    x.OutboundQuantity = x.StockQuantity;
-                                }
-                            }
-                        });
-                    }
-                    outStocks.Add(stockInfo);
-                }
+                outStocks = stockInfos;
+                needQuantity -= stockInfos.Count();
             }
             residueQuantity = needQuantity;
+            #endregion
+
+            #region 鎸夊簱瀛樹笂鎵樼洏鏁伴噺璁$畻
+            //decimal stockTotalQuantity = stockInfos.Select(x => x.Details.Sum(v => v.StockQuantity - v.OutboundQuantity)).Sum(x => x);
+            //stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
+            //if (stockTotalQuantity >= needQuantity)//搴撳瓨澶�
+            //{
+            //    int index = 0;
+            //    while (needQuantity > 0)
+            //    {
+            //        Dt_StockInfo stockInfo = stockInfos[index];
+            //        decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity);
+            //        if (useableStockQuantity < needQuantity)
+            //        {
+            //            stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity);
+            //            needQuantity -= useableStockQuantity;
+            //        }
+            //        else
+            //        {
+            //            stockInfo.Details.ForEach(x =>
+            //            {
+            //                if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode)
+            //                {
+            //                    if (x.StockQuantity - x.OutboundQuantity >= needQuantity)
+            //                    {
+            //                        x.OutboundQuantity += needQuantity;
+            //                        needQuantity = 0;
+            //                    }
+            //                    else
+            //                    {
+            //                        needQuantity -= (x.StockQuantity - x.OutboundQuantity);
+            //                        x.OutboundQuantity = x.StockQuantity;
+            //                    }
+            //                }
+            //            });
+            //        }
+            //        outStocks.Add(stockInfo);
+            //        index++;
+            //    }
+            //}
+            //else
+            //{
+            //    for (int i = 0; i < stockInfos.Count; i++)
+            //    {
+            //        Dt_StockInfo stockInfo = stockInfos[i];
+            //        decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity);
+            //        if (useableStockQuantity < needQuantity)
+            //        {
+            //            stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity);
+            //            needQuantity -= useableStockQuantity;
+            //        }
+            //        else
+            //        {
+            //            stockInfo.Details.ForEach(x =>
+            //            {
+            //                if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode)
+            //                {
+            //                    if (x.StockQuantity - x.OutboundQuantity >= needQuantity)
+            //                    {
+            //                        x.OutboundQuantity += needQuantity;
+            //                        needQuantity = 0;
+            //                    }
+            //                    else
+            //                    {
+            //                        needQuantity -= (x.StockQuantity - x.OutboundQuantity);
+            //                        x.OutboundQuantity = x.StockQuantity;
+            //                    }
+            //                }
+            //            });
+            //        }
+            //        outStocks.Add(stockInfo);
+            //    }
+            //}
+            //residueQuantity = needQuantity;
+            #endregion
+
             return outStocks;
         }
     }

--
Gitblit v1.9.3