| | |
| | | using CMS.Plugin.HIAWms.Application.Contracts.Dtos.OutStockDto; |
| | | 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; |
| | |
| | | private readonly IWmsTaskRepository _wmsTaskRepository; |
| | | private readonly IWmsInOutStockOrderRepository _wmsInOutStockOrderRepository; |
| | | private readonly IServiceProvider _serviceProvider; |
| | | public WmsOutStockAppService(IWmsMaterialStockRepository wmsMaterialStockRepository, |
| | | IWmsCommonAppService wmsCommonAppService, IWmsTaskRepository wmsTaskRepository, |
| | | public WmsOutStockAppService(IWmsMaterialStockRepository wmsMaterialStockRepository, |
| | | IWmsCommonAppService wmsCommonAppService, IWmsTaskRepository wmsTaskRepository, |
| | | IWmsInOutStockOrderRepository wmsInOutStockOrderRepository, IServiceProvider serviceProvider |
| | | ) |
| | | { |
| | |
| | | _serviceProvider = serviceProvider; |
| | | } |
| | | |
| | | public async Task CallMaterial(CallMaterialInput input) |
| | | public async Task<List<CallMaterialOutput>> CallMaterialAsync(List<CallMaterialInput> input) |
| | | { |
| | | using var scope = _serviceProvider.CreateScope(); |
| | | var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>(); |
| | | using var uow = unitOfWorkManager.Begin(requiresNew: true); |
| | | |
| | | var order = await _wmsInOutStockOrderRepository.FindByNameAsync(input.OrderNo); |
| | | if(order == null) |
| | | var distinctModels = input.Select(x => x.MaterialModel).Distinct().ToList(); |
| | | if (distinctModels.Count > 1) |
| | | { |
| | | throw new UserFriendlyException("出库单据不存在"); |
| | | throw new UserFriendlyException("一次叫料只能针对同一型号的物料!"); |
| | | } |
| | | if(input.MaterialNumber <=0) |
| | | var callOutput = new List<CallMaterialOutput>(); |
| | | foreach (var inputItem in input) |
| | | { |
| | | 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<WmsTask>(); |
| | | foreach (var kvp in stockresult) |
| | | { |
| | | var stock = kvp.Key; // WmsPlace对象 |
| | | var quantity = kvp.Value; // 分配数量 |
| | | |
| | | for (int i = 0; i < quantity; i++) |
| | | if (inputItem.MaterialNumber <= 0) |
| | | { |
| | | 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); |
| | | 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<WmsTask>(); |
| | | 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<WmsMaterialStockDto, CallMaterialOutput>(stock); |
| | | output.TaskNo = task.TaskNo; |
| | | output.PlcTaskId = task.PlcTaskId; |
| | | output.SourceOrderNo = task.SourceOrderNo; |
| | | callOutput.Add(output); |
| | | } |
| | | } |
| | | await _wmsTaskRepository.InsertManyAsync(taskList); |
| | | } |
| | | await _wmsTaskRepository.InsertManyAsync(taskList); |
| | | |
| | | await uow.SaveChangesAsync(); |
| | | await uow.CompleteAsync(); |
| | | |
| | | return callOutput; |
| | | } |
| | | } |
| | | } |