using CMS.Plugin.HIAWms.Application.Contracts.Dtos.CommonDto;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.OutStockDto;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
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> CallMaterialAsync(List input)
{
using var scope = _serviceProvider.CreateScope();
var unitOfWorkManager = scope.ServiceProvider.GetRequiredService();
using var uow = unitOfWorkManager.Begin(requiresNew: true);
var distinctModels = input.Select(x => x.MaterialModel).Distinct().ToList();
if (distinctModels.Count > 1)
{
throw new UserFriendlyException("一次叫料只能针对同一型号的物料!");
}
var callOutput = new List();
foreach (var inputItem in input)
{
if (inputItem.MaterialNumber <= 0)
{
throw new UserFriendlyException("叫料数量必须大于0");
}
if (!inputItem.IgnoreOrder)
{
var order = await _wmsInOutStockOrderRepository.FindByNameAsync(inputItem.OrderNo);
if (order == null)
{
throw new UserFriendlyException("出库单据不存在");
}
if (order.OrderType == OrderTypeEnum.SelfMadeParts || order.OrderType == OrderTypeEnum.PERSONIN)
{
throw new UserFriendlyException("入库单不允许叫料");
}
if (order.OrderStatus == OrderStatusEnum.Finish)
{
throw new UserFriendlyException("已完成单据不允许叫料");
}
if (order.MaterialNumber < inputItem.MaterialNumber + order.DistributeNumber)
{
throw new UserFriendlyException("叫料数量不能大于单据数量");
}
order.OrderStatus = OrderStatusEnum.Executing;
order.DistributeNumber = inputItem.MaterialNumber;
order.OperateTime = DateTime.Now;
await _wmsInOutStockOrderRepository.UpdateAsync(order);
}
var stockresult = await _wmsCommonAppService.FindStockAsync(inputItem.MaterialModel, inputItem.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 = inputItem.OrderType == OrderTypeEnum.PRODUCTCALL ? SonTaskTypeEnum.ZDCHUKU : SonTaskTypeEnum.RGRUKU,
TaskStatus = WmsTaskStatus.WEIZHIXING,
TaskLevel = inputItem.Priority,
Aisle = 1,
DodeviceId = 0,
Dodevicetype = DodevicetypeEnum.Srm,
TaskDodeviceStatus = TaskDodeviceStatus.SrmNoStart,
IsNextTask = (int)YesNoEnum.Y,
IsRead = true,
PlcTaskId = new Random(Guid.NewGuid().GetHashCode()).Next(101, 99999),
SourceOrderNo = inputItem.OrderNo,
MutableParam1 = inputItem.MaterialModel,
MutableParam2 = inputItem.DataIdentifier
};
taskList.Add(task);
var output = ObjectMapper.Map(stock);
output.TaskNo = task.TaskNo;
output.PlcTaskId = task.PlcTaskId;
output.SourceOrderNo = task.SourceOrderNo;
callOutput.Add(output);
}
}
await _wmsTaskRepository.InsertManyAsync(taskList);
}
await uow.SaveChangesAsync();
await uow.CompleteAsync();
return callOutput;
}
}
}