dengjunjie
2024-11-14 c827fe7b0c5b3b444d76ba0d96a2649c764630dd
ÏîÄ¿´úÂë/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;
        }
    }