zs
2025-05-18 4b3fd35893972bb05fd7ab89dc624ab805093ff3
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs
@@ -20,6 +20,8 @@
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;
@@ -167,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);
@@ -197,7 +200,7 @@
        }
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        if(input.TaskStatus == Domain.Shared.Enums.WmsTaskStatus.WANCHENG || input.TaskStatus == Domain.Shared.Enums.WmsTaskStatus.QUXIAO)
        if (input.TaskStatus == Domain.Shared.Enums.WmsTaskStatus.WANCHENG || input.TaskStatus == Domain.Shared.Enums.WmsTaskStatus.QUXIAO)
        {
            throw new UserFriendlyException("完成或者取消的任务不允许更改");
        }
@@ -523,9 +526,12 @@
    /// <param name="input"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task FinishTaskAsync(WmsTaskUpdateDto input)
    public async Task<WmsTaskDto> FinishTaskAsync(WmsTaskStatusDto input)
    {
        if (string.IsNullOrEmpty(input.TaskNo))
        {
            throw new UserFriendlyException("任务号不能为空");
        }
        using var scope = _serviceProvider.CreateScope();
        var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
        using var uow = unitOfWorkManager.Begin(requiresNew: true);
@@ -540,19 +546,35 @@
            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)
        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)
        if (container == null)
        {
            await _wmsContainerRepository.InsertAsync(new WmsContainer
            {
@@ -561,9 +583,14 @@
                ContainerType = ContainerTypeEnum.XUNI,
            });
        }
        else
        {
            container.ContainerStatus = ContainerStatusEnum.KUWEI;
            await _wmsContainerRepository.UpdateAsync(container);
        }
        var oldContainer = await _wmsContainerRepository.FindByNameAsync(task.ContainerNo);
        if(oldContainer != null)
        if (oldContainer != null)
        {
            await _wmsContainerRepository.DeleteAsync(oldContainer);
        }
@@ -572,7 +599,7 @@
        {
            // 跟新单据完成数量
            var orderNo = await _wmsInOutStockOrderRepository.FindByNameAsync(task.SourceOrderNo);
            if(orderNo != null)
            if (orderNo != null)
            {
                orderNo.CompleteNumber += 1;
                orderNo.OrderStatus = OrderStatusEnum.Executing;
@@ -605,7 +632,7 @@
            StockType = task.TaskType == TaskTypeEnum.CHUKU ? StockTypeEnum.OutBound : StockTypeEnum.InBound,
            ContainerNo = task.ContainerNo,
            MaterialId = stock.MaterialId,
            MaterialModel= stock.MaterialModel,
            MaterialModel = stock.MaterialModel,
            MaterialName = stock.MaterialName,
            MaterialNo = stock.MaterialNo,
            MaterialBatch = stock.MaterialBatch,
@@ -617,6 +644,8 @@
        await uow.SaveChangesAsync();
        await uow.CompleteAsync();
        return ObjectMapper.Map<WmsTask, WmsTaskDto>(task);
    }
    /// <summary>
@@ -625,9 +654,12 @@
    /// <param name="input"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task CancelTaskAysnc(WmsTaskUpdateDto input)
    public async Task CancelTaskAysnc(WmsTaskStatusDto input)
    {
        if (string.IsNullOrEmpty(input.TaskNo))
        {
            throw new UserFriendlyException("任务号不能为空");
        }
        using var scope = _serviceProvider.CreateScope();
        var unitOfWorkManager = scope.ServiceProvider.GetRequiredService<IUnitOfWorkManager>();
        using var uow = unitOfWorkManager.Begin(requiresNew: true);
@@ -656,21 +688,138 @@
        {
            // 跟新单据完成数量
            var orderNo = await _wmsInOutStockOrderRepository.FindByNameAsync(task.SourceOrderNo);
            if(orderNo != null)
            if (orderNo != null)
            {
                orderNo.CompleteNumber -= 1;
                orderNo.OrderStatus = OrderStatusEnum.NoStart;
            }
            if (orderNo.CompleteNumber>0)
            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)
    {
        if (string.IsNullOrEmpty(input.TaskNo))
        {
            throw new UserFriendlyException("任务号不能为空");
        }
        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 executeTaskList = NoStartTaskList.WhereIf(input.TaskType > 0, x => x.TaskType == input.TaskType).OrderBy(x => x.TaskType).ThenBy(x => x.TaskLevel).ToList();
        var executeTask = executeTaskList.FirstOrDefault();
        if (input.OutStockHasGood)
        {
            executeTask = NoStartTaskList.OrderByDescending(x => x.TaskType == TaskTypeEnum.RUKU).ThenBy(x => x.TaskLevel).FirstOrDefault();
        }
        if (executeTask == null)
        {
            return ObjectMapper.Map<WmsTask, WmsTaskDto>(NoStartTaskList.FirstOrDefault());
        }
        if (executeTask.TaskType == TaskTypeEnum.CHUKU && input.OutStockHasGood)
        {
            return null;
        }
        if(executeTask.TaskType == TaskTypeEnum.RUKU && !input.InStockHasGood)
        {
            return null;
        }
        return ObjectMapper.Map<WmsTask, WmsTaskDto>(executeTask);
    }
    /// <summary>
    /// 更新任务为执行中
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public async Task<WmsTaskDto> StartExecuteTaskAsync(ExcecuteTaskInput input)
    {
        if (string.IsNullOrEmpty(input.TaskNo))
        {
            throw new UserFriendlyException("任务号不能为空");
        }
        var task = await wmsTaskRepository.FindByNameAsync(input.TaskNo);
        if(task == null)
        {
            return null;
        }
        task.TaskStatus = WmsTaskStatus.ZHIXINGZHONG;
        task.TaskDodeviceStatus = TaskDodeviceStatus.SrmProgress;
         await wmsTaskRepository.UpdateAsync(task);
        return ObjectMapper.Map<WmsTask, WmsTaskDto>(task);
    }
}