using JSMachine.WMS.App.Dto; using JSMachine.WMS.App.Dto.Enum; using JSMachine.WMS.Infrastructure.Helper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JSMachine.WMS.Business.StockIn.ServiceImpl.ResponsibilityChain { /// /// 和其他不同批次的货物混合放置 /// public class StockInByMixing : StockInHandler { public override async Task CalculateWarehouse( TransportEnum startArea, FloorEnum floor, string materialBatch, List storageRacks) { if (storageRacks.IsNullOrEmpty()) { storageRacks = await base.GetStorageRackExceptStockout(floor); } if (storageRacks.IsNullOrEmpty()) { LogHelper.Info("没有可用库位"); return null; } List wareHousesSorted = storageRacks.OrderBy(p => p.AreaNumSort).ToList(); IEnumerable> groupByColumn = wareHousesSorted.GroupBy(p => p.ReservoirAreaColumnId); StorageRackDto destStorageRack = null; foreach (var columnGroup in groupByColumn) { bool unlockedColumn = columnGroup.All(p => !p.IsLock); if (unlockedColumn) { destStorageRack = columnGroup .Where(p => string.IsNullOrEmpty(p.BarCode)) .OrderByDescending(p => p.NumSort) .FirstOrDefault(); if (destStorageRack != null) break; } } if (destStorageRack == null && startArea != TransportEnum.TransitArea) { destStorageRack = await _storageRackService.GetUsableTransferStorageRack(); if (destStorageRack == null) { LogHelper.Warn($"存储区和中转区均无可用的库位"); } } return destStorageRack; } } }