| | |
| | | using CMS.Plugin.HIAWms.Application.Contracts.Dtos.CommonDto; |
| | | using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; |
| | | using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsPlaces; |
| | | using CMS.Plugin.HIAWms.Application.Contracts.Services; |
| | | using CMS.Plugin.HIAWms.Domain.WmsMaterials; |
| | |
| | | /// <param name="requiredNum"></param> |
| | | /// <param name="materialNo"></param> |
| | | /// <returns></returns> |
| | | public async Task<Dictionary<string, int>> FindStockAsync(string materialModel, int requiredNum, string materialNo = "") |
| | | public async Task<Dictionary<WmsMaterialStockDto, int>> FindStockAsync(string materialModel, int requiredNum, string materialNo = "") |
| | | { |
| | | // 1. 获取所有库存(排除锁定库存) |
| | | var stockList = (await _wmsMaterialStockRepository.GetListAsync(new WmsMaterialStock())) |
| | |
| | | .ToList(); |
| | | |
| | | // 2. 筛选匹配物料 |
| | | var availableStocks = stockList |
| | | var availableStocklist = stockList |
| | | .Where(x => x.MaterialModel == materialModel) |
| | | .WhereIf(!string.IsNullOrEmpty(materialNo), x => x.MaterialNo == materialNo) |
| | | .OrderBy(x => x.StockNumber) // 优先从库存少的库位出 |
| | | .ToList(); |
| | | |
| | | var availableStocks = ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(availableStocklist); |
| | | |
| | | // 3. 检查总库存是否足够 |
| | | int totalAvailable = availableStocks.Sum(x => x.StockNumber); |
| | |
| | | } |
| | | |
| | | // 4. 计算各库位出库数量 |
| | | var allocation = new Dictionary<string, int>(); // <库位号, 出库数> |
| | | var allocation = new Dictionary<WmsMaterialStockDto, int>(); // <库位号, 出库数> |
| | | int remaining = requiredNum; |
| | | |
| | | foreach (var stock in availableStocks) |
| | |
| | | if (remaining <= 0) break; |
| | | |
| | | int deductAmount = Math.Min(stock.StockNumber, remaining); |
| | | allocation.Add(stock.PlaceNo, deductAmount); |
| | | allocation.Add(stock, deductAmount); |
| | | remaining -= deductAmount; |
| | | } |
| | | |