using CMS.Plugin.HIAWms.Application.Contracts.Dtos.OutStockDto;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using CMS.Plugin.HIAWms.Domain.WmsInOutStockOrder;
using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Domain.WmsTask;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Uow;
namespace CMS.Plugin.HIAWms.Application.Implements
{
///
/// 出库服务
///
public class WmsOutStockAppService : CMSPluginAppService, IWmsOutStockAppService
{
private readonly IWmsMaterialStockRepository _wmsMaterialStockRepository;
private readonly IWmsCommonAppService _wmsCommonAppService;
private readonly IWmsTaskRepository _wmsTaskRepository;
private readonly IWmsInOutStockOrderRepository _wmsInOutStockOrderRepository;
private readonly IServiceProvider _serviceProvider;
public WmsOutStockAppService(IWmsMaterialStockRepository wmsMaterialStockRepository,
IWmsCommonAppService wmsCommonAppService, IWmsTaskRepository wmsTaskRepository,
IWmsInOutStockOrderRepository wmsInOutStockOrderRepository, IServiceProvider serviceProvider
)
{
_wmsMaterialStockRepository = wmsMaterialStockRepository;
_wmsCommonAppService = wmsCommonAppService;
_wmsTaskRepository = wmsTaskRepository;
_wmsInOutStockOrderRepository = wmsInOutStockOrderRepository;
_serviceProvider = serviceProvider;
}
public async Task CallMaterial(CallMaterialInput input)
{
using var scope = _serviceProvider.CreateScope();
var unitOfWorkManager = scope.ServiceProvider.GetRequiredService();
using var uow = unitOfWorkManager.Begin(requiresNew: true);
var order = await _wmsInOutStockOrderRepository.FindByNameAsync(input.OrderNo);
if(order == null)
{
throw new UserFriendlyException("出库单据不存在");
}
if(input.MaterialNumber <=0)
{
throw new UserFriendlyException("叫料数量必须大于0");
}
if(order.MaterialNumber< input.MaterialNumber)
{
throw new UserFriendlyException("叫料数量不能大于单据数量");
}
order.OrderStatus = OrderStatusEnum.Executing;
order.DistributeNumber = input.MaterialNumber;
await _wmsInOutStockOrderRepository.UpdateAsync(order);
var stockresult = await _wmsCommonAppService.FindStockAsync(input.MaterialModel, input.MaterialNumber);
if(stockresult == null)
{
throw new UserFriendlyException("当前无库存");
}
var taskList = new List();
foreach (var kvp in stockresult)
{
var stock = kvp.Key; // WmsPlace对象
var quantity = kvp.Value; // 分配数量
for (int i = 0; i < quantity; i++)
{
var task = new WmsTask
{
TaskNo = $"CK_{DateTime.Now:yyyyMMddHHmmss}_{Guid.NewGuid().ToString("N").Substring(0, 6)}",
ContainerNo = stock.ContainerNo,
SourcePlace = stock.PlaceNo,
ToPlace = "201",// place.PlaceNo,
TaskType = TaskTypeEnum.CHUKU,
SonTaskType = input.OrderType == OrderTypeEnum.PRODUCTCALL ? SonTaskTypeEnum.ZDCHUKU : SonTaskTypeEnum.RGRUKU,
TaskStatus = WmsTaskStatus.WEIZHIXING,
TaskLevel = 999,
Aisle = 1,
DodeviceId = 0,
TaskDodeviceStatus = TaskDodeviceStatus.SrmNoStart,
IsNextTask = (int)YesNoEnum.Y,
IsRead = true,
SourceOrderNo = input.OrderNo,
MutableParam1 = input.MaterialModel,
};
taskList.Add(task);
}
}
await _wmsTaskRepository.InsertManyAsync(taskList);
await uow.SaveChangesAsync();
await uow.CompleteAsync();
}
}
}