schangxiang@126.com
2025-05-11 17c0c88cb5419351e4f0bf498e4b9535c5b39197
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs
@@ -12,6 +12,14 @@
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;
@@ -23,16 +31,40 @@
    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> 
@@ -484,4 +516,161 @@
        return Task.CompletedTask;
    }
    /// <summary>
    /// 任务强制完成
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task FinishTaskAsync(WmsTaskUpdateDto 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;
        // 更新库存
        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.ContainerNo = "TP" + task.ToPlace;
        var container = await _wmsContainerRepository.FindByNameAsync(stock.ContainerNo);
        if(container == null)
        {
            await _wmsContainerRepository.InsertAsync(new WmsContainer
            {
                ContainerNo = stock.ContainerNo,
                ContainerStatus = ContainerStatusEnum.KUWEI,
                ContainerType = ContainerTypeEnum.XUNI,
            });
        }
        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(WmsTaskUpdateDto 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();
    }
}