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