schangxiang@126.com
2025-05-12 3aedad63dd01f1fc5154cb520af32edab967d6e0
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs
@@ -1,8 +1,8 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsTask;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared;
using CMS.Plugin.HIAWms.Domain.WmsTask;
using CmsQueryExtensions;
using CMS.Plugin.HIAWms.Domain.WmsTask;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp;
@@ -10,27 +10,65 @@
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
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;
/// <summary> 
/// Wms任务管理表应用服务
/// Wms任务管理应用服务
/// </summary> 
public class WmsTaskAppService : CMSPluginAppService, IWmsTaskAppService
{
    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)
    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> 
    /// 获取指定Wms任务管理表
    /// 获取指定Wms任务管理
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
@@ -40,7 +78,7 @@
    }
    /// <summary> 
    /// 分页获取Wms任务管理表
    /// 分页获取Wms任务管理
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
@@ -90,7 +128,7 @@
    }
    /// <summary> 
    /// 新建Wms任务管理表
    /// 新建Wms任务管理
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
@@ -103,6 +141,24 @@
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.TaskNo]);
        }
        // 校验托盘是否存在
        var existContainer = await _wmsContainerRepository.NameExistAsync(input.ContainerNo);
        if (existContainer)
        {
            throw new UserFriendlyException("托盘不存在,请先添加托盘");
        }
        // 校验物料是否存在
        var existSourcePlace = await _wmsPlaceRepository.NameExistAsync(input.SourcePlace);
        if (existSourcePlace)
        {
            throw new UserFriendlyException("起始库位不存在,请先添加库位");
        }
        //校验库位是否存在
        var existToPlace = await _wmsPlaceRepository.NameExistAsync(input.ToPlace);
        if (existToPlace)
        {
            throw new UserFriendlyException("目标库位不存在,请先添加库位");
        }
        var maxSort = await wmsTaskRepository.GetMaxSortAsync();
@@ -123,7 +179,7 @@
    }
    /// <summary> 
    /// 更新Wms任务管理表
    /// 更新Wms任务管理
    /// </summary> 
    /// <param name="id"></param> 
    /// <param name="input"></param> 
@@ -141,28 +197,32 @@
        }
        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.Aisle = input.Aisle;
        updateObj.TaskNo = input.TaskNo;
        updateObj.TaskType = input.TaskType;
        updateObj.TaskLevel = input.TaskLevel;
        updateObj.TaskStatus = input.TaskStatus;
        updateObj.ContainerNo = input.ContainerNo;
        updateObj.SourcePlace = input.SourcePlace;
        updateObj.ToPlace = input.ToPlace;
        updateObj.Aisle = input.Aisle;
        updateObj.DodeviceId = input.DodeviceId;
        updateObj.Dodevicetype = input.Dodevicetype;
        updateObj.IsDisabled = input.IsDisabled;
        updateObj.IsNextTask = input.IsNextTask;
        updateObj.TaskDodeviceStatus = input.TaskDodeviceStatus;
        updateObj.IsRead = input.IsRead;
        updateObj.SonTaskType = input.SonTaskType;
        updateObj.SourceOrderNo = input.SourceOrderNo;
        updateObj.IsNextTask = input.IsNextTask;
        updateObj.MutableParam1 = input.MutableParam1;
        updateObj.MutableParam2 = input.MutableParam2;
        updateObj.MutableParam3 = input.MutableParam3;
        updateObj.SonTaskType = input.SonTaskType;
        updateObj.SourceOrderNo = input.SourceOrderNo;
        updateObj.SourcePlace = input.SourcePlace;
        updateObj.TaskDodeviceStatus = input.TaskDodeviceStatus;
        updateObj.TaskLevel = input.TaskLevel;
        updateObj.TaskNo = input.TaskNo;
        updateObj.TaskStatus = input.TaskStatus;
        updateObj.TaskType = input.TaskType;
        updateObj.ToPlace = input.ToPlace;
        updateObj.IsDisabled = input.IsDisabled;
        await wmsTaskRepository.UpdateAsync(updateObj);
@@ -170,7 +230,7 @@
    }
    /// <summary> 
    /// 克隆Wms任务管理表
    /// 克隆Wms任务管理
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
@@ -210,7 +270,7 @@
    }
    /// <summary> 
    /// 删除单个Wms任务管理表
    /// 删除单个Wms任务管理
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
@@ -220,7 +280,7 @@
    }
    /// <summary> 
    /// 删除多个Wms任务管理表
    /// 删除多个Wms任务管理
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
@@ -233,7 +293,7 @@
    }
    /// <summary> 
    /// 调整排序Wms任务管理表
    /// 调整排序Wms任务管理
    /// </summary> 
    /// <param name="id"></param> 
    /// <param name="sort"></param> 
@@ -271,7 +331,7 @@
    }
    /// <summary> 
    /// 导入Wms任务管理表
    /// 导入Wms任务管理
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
@@ -317,25 +377,25 @@
                {
                    var wmsTaskUpdateDto = new WmsTaskUpdateDto
                    {
                        Aisle = impItem.Aisle,
                        TaskNo = impItem.TaskNo,
                        TaskType = impItem.TaskType,
                        TaskLevel = impItem.TaskLevel,
                        TaskStatus = impItem.TaskStatus,
                        ContainerNo = impItem.ContainerNo,
                        SourcePlace = impItem.SourcePlace,
                        ToPlace = impItem.ToPlace,
                        Aisle = impItem.Aisle,
                        DodeviceId = impItem.DodeviceId,
                        Dodevicetype = impItem.Dodevicetype,
                        IsDisabled = impItem.IsDisabled,
                        IsNextTask = impItem.IsNextTask,
                        TaskDodeviceStatus = impItem.TaskDodeviceStatus,
                        IsRead = impItem.IsRead,
                        SonTaskType = impItem.SonTaskType,
                        SourceOrderNo = impItem.SourceOrderNo,
                        IsNextTask = impItem.IsNextTask,
                        MutableParam1 = impItem.MutableParam1,
                        MutableParam2 = impItem.MutableParam2,
                        MutableParam3 = impItem.MutableParam3,
                        SonTaskType = impItem.SonTaskType,
                        SourceOrderNo = impItem.SourceOrderNo,
                        SourcePlace = impItem.SourcePlace,
                        TaskDodeviceStatus = impItem.TaskDodeviceStatus,
                        TaskLevel = impItem.TaskLevel,
                        TaskNo = impItem.TaskNo,
                        TaskStatus = impItem.TaskStatus,
                        TaskType = impItem.TaskType,
                        ToPlace = impItem.ToPlace,
                        IsDisabled = impItem.IsDisabled,
                    };
@@ -345,25 +405,25 @@
                {
                    var wmsTaskCreateDto = new WmsTaskCreateDto
                    {
                        Aisle = impItem.Aisle,
                        TaskNo = impItem.TaskNo,
                        TaskType = impItem.TaskType,
                        TaskLevel = impItem.TaskLevel,
                        TaskStatus = impItem.TaskStatus,
                        ContainerNo = impItem.ContainerNo,
                        SourcePlace = impItem.SourcePlace,
                        ToPlace = impItem.ToPlace,
                        Aisle = impItem.Aisle,
                        DodeviceId = impItem.DodeviceId,
                        Dodevicetype = impItem.Dodevicetype,
                        IsDisabled = impItem.IsDisabled,
                        IsNextTask = impItem.IsNextTask,
                        TaskDodeviceStatus = impItem.TaskDodeviceStatus,
                        IsRead = impItem.IsRead,
                        SonTaskType = impItem.SonTaskType,
                        SourceOrderNo = impItem.SourceOrderNo,
                        IsNextTask = impItem.IsNextTask,
                        MutableParam1 = impItem.MutableParam1,
                        MutableParam2 = impItem.MutableParam2,
                        MutableParam3 = impItem.MutableParam3,
                        SonTaskType = impItem.SonTaskType,
                        SourceOrderNo = impItem.SourceOrderNo,
                        SourcePlace = impItem.SourcePlace,
                        TaskDodeviceStatus = impItem.TaskDodeviceStatus,
                        TaskLevel = impItem.TaskLevel,
                        TaskNo = impItem.TaskNo,
                        TaskStatus = impItem.TaskStatus,
                        TaskType = impItem.TaskType,
                        ToPlace = impItem.ToPlace,
                        IsDisabled = impItem.IsDisabled,
                    };
@@ -402,7 +462,7 @@
    }
    /// <summary> 
    /// 导出Wms任务管理表
    /// 导出Wms任务管理
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
@@ -431,26 +491,206 @@
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = result.Count > 1 ? "Wms任务管理表列表" : result.Count == 1 ? result[0]?.TaskNo : "WmsTask模版";
        var fileName = result.Count > 1 ? "Wms任务管理列表" : result.Count == 1 ? result[0]?.TaskNo : "WmsTask模版";
        return (sheets, fileName);
    }
    /// <summary> 
    /// 校验Wms任务管理表,当新建或更新时
    /// 校验Wms任务管理,当新建或更新时
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    protected Task CheckCreateOrUpdateDtoAsync(WmsTaskCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
        Check.NotNull(input.Dodevicetype, "设备类型");
        Check.NotNull(input.IsRead, "WCS是否可以读取");
        Check.NotNull(input.TaskDodeviceStatus, "设备任务状态");
        Check.NotNull(input.TaskLevel, "任务等级");
        Check.NotNullOrWhiteSpace(input.TaskNo, "任务号", 50);
        Check.NotNull(input.TaskStatus, "任务状态");
        Check.NotNull(input.TaskType, "任务类型");
        Check.NotNull(input.TaskLevel, "任务等级");
        Check.NotNull(input.TaskStatus, "任务状态");
        Check.NotNull(input.Dodevicetype, "设备类型");
        Check.NotNull(input.ContainerNo, "托盘号");
        Check.NotNull(input.SourcePlace, "起始位置");
        Check.NotNull(input.ToPlace, "目标未知");
        Check.NotNull(input.TaskDodeviceStatus, "设备任务状态");
        Check.NotNull(input.IsRead, "WCS是否可以读取");
        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();
    }
}