zs
2025-05-15 edba4ede85a3d82a7f0a0a7dccddbc8281862888
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs
@@ -12,6 +12,16 @@
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;
using NPOI.SS.Formula.Functions;
using System.Collections.Generic;
namespace CMS.Plugin.HIAWms.Application.Implements;
@@ -23,16 +33,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> 
@@ -135,6 +169,7 @@
        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);
@@ -165,6 +200,11 @@
        }
        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;
@@ -479,4 +519,250 @@
        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();
    }
    /// <summary>
    /// 修改目标库位
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task ChangeTaskToPlaceAsync(ChangeTaskToPlaceInput input)
    {
        var task = await wmsTaskRepository.FindByNameAsync(input.TaskNo);
        if (task == null)
        {
            throw new UserFriendlyException("任务信息不存在");
        }
        if (task.TaskStatus != WmsTaskStatus.WEIZHIXING)
        {
            throw new UserFriendlyException("已开始或者结束的任务不允许修改");
        }
        var toPlaceInfo = await _wmsPlaceRepository.FindByNameAsync(input.ToPlace);
        if (toPlaceInfo == null)
        {
            throw new UserFriendlyException("目标库位信息不存在");
        }
        if(toPlaceInfo.IsDisabled)
        {
            throw new UserFriendlyException("目标库位已被禁用");
        }
        var toplaceStock = await _wmsMaterialStockRepository.GetStockListAsync(new WmsMaterialStock { PlaceNo = input.ToPlace });
        if (toplaceStock != null && toplaceStock.Count>0)
        {
            var model = toplaceStock.FirstOrDefault();
            if (model.MaterialModel != input.MutableParam1)
            {
                throw new UserFriendlyException("目标库位型号与当前型号不一致不允许修改");
            }
        }
        task.ToPlace = input.ToPlace;
        await wmsTaskRepository.UpdateAsync(task);
    }
    /// <summary>
    /// 获取需要执行的任务
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public async Task<WmsTaskDto> GetToExecuteTaskAsync(QueryTaskTypeInput input)
    {
        var queryInput = new GetWmsTaskInput
        {
            TaskStatus = WmsTaskStatus.WEIZHIXING,
        };
        var whereConditions = DynamicGetQueryParams(queryInput);
        var NoStartTaskList = await wmsTaskRepository.GetTaskListAsync(whereConditions);
        if(NoStartTaskList.Count<=0) return null;
        var executeTask = NoStartTaskList.FirstOrDefault(x=>x.TaskType == input.TaskType);
        if(executeTask == null)
        {
            return ObjectMapper.Map<WmsTask, WmsTaskDto>(NoStartTaskList.FirstOrDefault());
        }
        return ObjectMapper.Map<WmsTask, WmsTaskDto>(executeTask);
    }
}