| | |
| | | |
| | | return BaseDal.GetStockInfos(materielCode, locationCodes); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åæå®ç©æåºåä¿¡æ¯ |
| | | /// </summary> |
| | |
| | | |
| | | 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; |
| | | } |
| | | } |