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;
}
}
}