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