| | |
| | | using Volo.Abp.ObjectMapping; |
| | | using CMS.Plugin.HIAWms.Domain.WmsContainers; |
| | | using CMS.Plugin.HIAWms.Domain.WmsPlaces; |
| | | using CMS.Plugin.HIAWms.Domain.Shared.Enums; |
| | | using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks; |
| | | using CMS.Plugin.HIAWms.Domain.WmsInOutStockOrder; |
| | | using CMS.Plugin.HIAWms.Domain.WmsInOutStockOrderDetail; |
| | | using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsInOutStockOrderDetail; |
| | | using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsInOutStockRecord; |
| | | using Volo.Abp.Uow; |
| | | using Microsoft.Extensions.DependencyInjection; |
| | | |
| | | namespace CMS.Plugin.HIAWms.Application.Implements; |
| | | |
| | |
| | | private readonly IWmsTaskRepository wmsTaskRepository; |
| | | private readonly IWmsContainerRepository _wmsContainerRepository; |
| | | private readonly IWmsPlaceRepository _wmsPlaceRepository; |
| | | private readonly IWmsMaterialStockRepository _wmsMaterialStockRepository; |
| | | private readonly IWmsInOutStockOrderRepository _wmsInOutStockOrderRepository; |
| | | private readonly IWmsInOutStockOrderDetailRepository _wmsInOutStockOrderDetailRepository; |
| | | private readonly IWmsContainerRepository _wmsContainerRepository1; |
| | | private readonly IWmsInOutStockOrderDetailAppService _wmsInOutStockOrderDetailAppService; |
| | | private readonly IWmsInOutStockRecordAppService _wmsInOutStockRecordAppService; |
| | | private readonly IServiceProvider _serviceProvider; |
| | | |
| | | /// <summary> |
| | | /// Initializes a new instance of the <see cref="WmsTaskAppService"/> class. |
| | | /// </summary> |
| | | /// <param name="WmsTaskRepository">The task job repository.</param> |
| | | public WmsTaskAppService(IWmsTaskRepository _WmsTaskRepository, IWmsContainerRepository wmsContainerRepository, IWmsPlaceRepository wmsPlaceRepository) |
| | | public WmsTaskAppService(IWmsTaskRepository _WmsTaskRepository, |
| | | IWmsContainerRepository wmsContainerRepository, |
| | | IWmsPlaceRepository wmsPlaceRepository, |
| | | IWmsMaterialStockRepository wmsMaterialStockRepository, |
| | | IWmsInOutStockOrderRepository wmsInOutStockOrderRepository, |
| | | IWmsInOutStockOrderDetailRepository wmsInOutStockOrderDetailRepository |
| | | , |
| | | IWmsContainerRepository wmsContainerRepository1, |
| | | IWmsInOutStockOrderDetailAppService wmsInOutStockOrderDetailAppService, |
| | | IWmsInOutStockRecordAppService wmsInOutStockRecordAppService, |
| | | IServiceProvider serviceProvider = null) |
| | | { |
| | | wmsTaskRepository = _WmsTaskRepository; |
| | | _wmsContainerRepository = wmsContainerRepository; |
| | | _wmsPlaceRepository = wmsPlaceRepository; |
| | | _wmsMaterialStockRepository = wmsMaterialStockRepository; |
| | | _wmsInOutStockOrderRepository = wmsInOutStockOrderRepository; |
| | | _wmsInOutStockOrderDetailRepository = wmsInOutStockOrderDetailRepository; |
| | | _wmsContainerRepository1 = wmsContainerRepository1; |
| | | _wmsInOutStockOrderDetailAppService = wmsInOutStockOrderDetailAppService; |
| | | _wmsInOutStockRecordAppService = wmsInOutStockRecordAppService; |
| | | _serviceProvider = serviceProvider; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | var insertObj = ObjectMapper.Map<WmsTaskCreateDto, WmsTask>(input); |
| | | insertObj.Sort = sort; |
| | | input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None); |
| | | insertObj.PlcTaskId = new Random(Guid.NewGuid().GetHashCode()).Next(101, 99999); |
| | | |
| | | await wmsTaskRepository.InsertAsync(insertObj); |
| | | |
| | |
| | | } |
| | | |
| | | updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); |
| | | if (input.TaskStatus == Domain.Shared.Enums.WmsTaskStatus.WANCHENG || input.TaskStatus == Domain.Shared.Enums.WmsTaskStatus.QUXIAO) |
| | | { |
| | | throw new UserFriendlyException("完成或者取消的任务不允许更改"); |
| | | } |
| | | |
| | | input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None); |
| | | |
| | | updateObj.TaskNo = input.TaskNo; |
| | |
| | | |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 任务强制完成 |
| | | /// </summary> |
| | | /// <param name="input"></param> |
| | | /// <returns></returns> |
| | | /// <exception cref="UserFriendlyException"></exception> |
| | | public async Task FinishTaskAsync(WmsTaskStatusDto input) |
| | | { |
| | | using var scope = _serviceProvider.CreateScope(); |
| | | var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>(); |
| | | using var uow = unitOfWorkManager.Begin(requiresNew: true); |
| | | |
| | | var task = await wmsTaskRepository.FindByNameAsync(input.TaskNo); |
| | | if (task == null) |
| | | { |
| | | throw new UserFriendlyException("任务不存在"); |
| | | } |
| | | if (task.TaskStatus == WmsTaskStatus.WANCHENG || task.TaskStatus == WmsTaskStatus.QUXIAO) |
| | | { |
| | | throw new UserFriendlyException("取消或者完成的任务不允许操作"); |
| | | } |
| | | task.TaskStatus = WmsTaskStatus.WANCHENG; |
| | | task.TaskDodeviceStatus = TaskDodeviceStatus.SrmFinish; |
| | | await wmsTaskRepository.UpdateAsync(task); |
| | | |
| | | var place = await _wmsPlaceRepository.FindByNameAsync(task.ToPlace); |
| | | if (place == null) |
| | | { |
| | | throw new UserFriendlyException("目标库位不存在"); |
| | | } |
| | | |
| | | // 更新库存 |
| | | var stockList = await _wmsMaterialStockRepository.GetStockListAsync(new WmsMaterialStock { MaterialModel = task.MutableParam1, PlaceNo = task.SourcePlace }); |
| | | if (stockList == null || stockList.Count <= 0) |
| | | { |
| | | throw new UserFriendlyException("原库位信息不存在"); |
| | | } |
| | | var stock = stockList.FirstOrDefault(); |
| | | stock.PlaceNo = task.ToPlace; |
| | | stock.StorageTypeNo = place.StorageTypeNo; |
| | | stock.InStockTime = DateTime.Now; |
| | | stock.ContainerNo = "TP" + task.ToPlace; |
| | | |
| | | await _wmsMaterialStockRepository.UpdateAsync(stock); |
| | | |
| | | place.PlaceStatus = PlaceStatusEnum.CUNHUO; |
| | | await _wmsPlaceRepository.UpdateAsync(place); |
| | | |
| | | |
| | | var container = await _wmsContainerRepository.FindByNameAsync(stock.ContainerNo); |
| | | if (container == null) |
| | | { |
| | | await _wmsContainerRepository.InsertAsync(new WmsContainer |
| | | { |
| | | ContainerNo = stock.ContainerNo, |
| | | ContainerStatus = ContainerStatusEnum.KUWEI, |
| | | ContainerType = ContainerTypeEnum.XUNI, |
| | | }); |
| | | } |
| | | else |
| | | { |
| | | container.ContainerStatus = ContainerStatusEnum.KUWEI; |
| | | await _wmsContainerRepository.UpdateAsync(container); |
| | | } |
| | | |
| | | var oldContainer = await _wmsContainerRepository.FindByNameAsync(task.ContainerNo); |
| | | if (oldContainer != null) |
| | | { |
| | | await _wmsContainerRepository.DeleteAsync(oldContainer); |
| | | } |
| | | |
| | | if (!string.IsNullOrEmpty(task.SourceOrderNo)) |
| | | { |
| | | // 跟新单据完成数量 |
| | | var orderNo = await _wmsInOutStockOrderRepository.FindByNameAsync(task.SourceOrderNo); |
| | | if (orderNo != null) |
| | | { |
| | | orderNo.CompleteNumber += 1; |
| | | orderNo.OrderStatus = OrderStatusEnum.Executing; |
| | | } |
| | | if (orderNo.MaterialNumber <= orderNo.CompleteNumber) |
| | | { |
| | | orderNo.OrderStatus = OrderStatusEnum.Finish; |
| | | } |
| | | |
| | | await _wmsInOutStockOrderRepository.UpdateAsync(orderNo); |
| | | // 记录一条详情 |
| | | var detail = new WmsInOutStockOrderDetailCreateDto |
| | | { |
| | | OrderNo = orderNo.OrderNo, |
| | | OrderType = orderNo.OrderType, |
| | | MaterialId = stock.MaterialId, |
| | | MaterialBatch = stock.MaterialBatch, |
| | | MaterialModel = stock.MaterialModel, |
| | | MaterialName = stock.MaterialName, |
| | | MaterialNo = stock.MaterialNo, |
| | | }; |
| | | await _wmsInOutStockOrderDetailAppService.CreateAsync(detail); |
| | | } |
| | | |
| | | // 出入库记录 |
| | | var record = new WmsInOutStockRecordCreateDto |
| | | { |
| | | TaskNo = task.TaskNo, |
| | | OrderNo = task.SourceOrderNo, |
| | | StockType = task.TaskType == TaskTypeEnum.CHUKU ? StockTypeEnum.OutBound : StockTypeEnum.InBound, |
| | | ContainerNo = task.ContainerNo, |
| | | MaterialId = stock.MaterialId, |
| | | MaterialModel = stock.MaterialModel, |
| | | MaterialName = stock.MaterialName, |
| | | MaterialNo = stock.MaterialNo, |
| | | MaterialBatch = stock.MaterialBatch, |
| | | SourcePlace = task.SourcePlace, |
| | | ToPlace = task.ToPlace, |
| | | OperateTime = DateTime.Now, |
| | | }; |
| | | await _wmsInOutStockRecordAppService.CreateAsync(record); |
| | | |
| | | await uow.SaveChangesAsync(); |
| | | await uow.CompleteAsync(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 取消任务 |
| | | /// </summary> |
| | | /// <param name="input"></param> |
| | | /// <returns></returns> |
| | | /// <exception cref="UserFriendlyException"></exception> |
| | | public async Task CancelTaskAysnc(WmsTaskStatusDto input) |
| | | { |
| | | |
| | | using var scope = _serviceProvider.CreateScope(); |
| | | var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>(); |
| | | using var uow = unitOfWorkManager.Begin(requiresNew: true); |
| | | |
| | | var task = await wmsTaskRepository.FindByNameAsync(input.TaskNo); |
| | | if (task == null) |
| | | { |
| | | throw new UserFriendlyException("任务不存在"); |
| | | } |
| | | if (task.TaskStatus == WmsTaskStatus.WANCHENG || task.TaskStatus == WmsTaskStatus.QUXIAO) |
| | | { |
| | | throw new UserFriendlyException("取消或者完成的任务不允许操作"); |
| | | } |
| | | task.TaskStatus = WmsTaskStatus.QUXIAO; |
| | | |
| | | // 更新库存 |
| | | var stockList = await _wmsMaterialStockRepository.GetStockListAsync(new WmsMaterialStock { MaterialModel = task.MutableParam1, PlaceNo = task.SourcePlace }); |
| | | if (stockList == null || stockList.Count <= 0) |
| | | { |
| | | throw new UserFriendlyException("原库位信息不存在"); |
| | | } |
| | | var stock = stockList.FirstOrDefault(); |
| | | await _wmsMaterialStockRepository.DeleteAsync(stock); |
| | | |
| | | if (!string.IsNullOrEmpty(task.SourceOrderNo)) |
| | | { |
| | | // 跟新单据完成数量 |
| | | var orderNo = await _wmsInOutStockOrderRepository.FindByNameAsync(task.SourceOrderNo); |
| | | if (orderNo != null) |
| | | { |
| | | orderNo.CompleteNumber -= 1; |
| | | orderNo.OrderStatus = OrderStatusEnum.NoStart; |
| | | } |
| | | if (orderNo.CompleteNumber > 0) |
| | | { |
| | | orderNo.OrderStatus = OrderStatusEnum.Executing; |
| | | } |
| | | |
| | | await _wmsInOutStockOrderRepository.UpdateAsync(orderNo); |
| | | |
| | | } |
| | | |
| | | await uow.SaveChangesAsync(); |
| | | await uow.CompleteAsync(); |
| | | } |
| | | } |