zs
2025-05-07 086e8d457fb6480f126aedbd2677c7e97bdac193
任务管理修改
已修改19个文件
4571 ■■■■ 文件已修改
HIAWms/project/Wms.cmsproj 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsInOutStockRecord/WmsInOutStockRecordDto.cs 252 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/WmsTaskDto.cs 362 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsInOutStockRecordAppService.cs 616 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs 666 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsTask/IWmsTaskRepository.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsInOutStockRecordRepository.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsTaskRepository.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsInOutStockRecord/Controllers/WmsInOutStockRecordQueryDrawer.tsx 618 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsInOutStockRecord/Views/Pages/Dialog/WmsInOutStockRecordDrawer/WmsInOutStockRecordDrawer.tsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsInOutStockRecord/Views/Pages/Dialog/WmsInOutStockRecordQueryDrawer/WmsInOutStockRecordQueryDrawer.tsx 142 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsInOutStockRecord/Views/Pages/WmsInOutStockRecord/Config.ts 132 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsInOutStockRecord/Views/Pages/WmsInOutStockRecord/WmsInOutStockRecord.tsx 633 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsTask/Controllers/WmsTaskDrawer.tsx 837 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsTask/Controllers/WmsTaskQueryDrawer.tsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsTask/Views/Pages/Dialog/WmsTaskDrawer/WmsTaskDrawer.tsx 122 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsTask/Views/Pages/Dialog/WmsTaskQueryDrawer/WmsTaskQueryDrawer.tsx 142 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsTask/Views/Pages/WmsTask/Config.ts 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsTask/Views/Pages/WmsTask/WmsTask.tsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/project/Wms.cmsproj
Binary files differ
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsInOutStockRecord/WmsInOutStockRecordDto.cs
@@ -1,156 +1,156 @@
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using CmsQueryExtensions;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsInOutStockRecord;
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using CmsQueryExtensions;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsInOutStockRecord;
/// <summary> 
/// 出入库记录数据参数对象 
/// </summary> 
public  class WmsInOutStockRecordDto:  ExtensibleEntityDto<Guid>, IHasConcurrencyStamp
{
            /// <summary>
        /// 单据编号
        /// </summary>
        public string OrderNo { get; set; }
public class WmsInOutStockRecordDto : ExtensibleEntityDto<Guid>, IHasConcurrencyStamp
{
    /// <summary>
    /// 单据编号
    /// </summary>
    public string OrderNo { get; set; }
        /// <summary>
        /// 物料名称
        /// </summary>
        public string? MaterialName { get; set; }
    /// <summary>
    /// 物料名称
    /// </summary>
    public string? MaterialName { get; set; }
        /// <summary>
        /// 物料件号
        /// </summary>
        public string MaterialNo { get; set; }
    /// <summary>
    /// 物料件号
    /// </summary>
    public string MaterialNo { get; set; }
        /// <summary>
        /// 操作类型
        /// </summary>
        public StockTypeEnum StockType { get; set; }
    /// <summary>
    /// 操作类型
    /// </summary>
    public StockTypeEnum StockType { get; set; }
        /// <summary>
        /// 操作类型
        /// </summary>
        public string StockTypeDesc
        {
            get
            {
                return GetEnumDescriptionUtil.GetEnumDescription(StockType);
            }
        }
        /// <summary>
        /// 容器编号
        /// </summary>
        public string? ContainerNo { get; set; }
    /// <summary>
    /// 操作类型
    /// </summary>
    public string StockTypeDesc
    {
        get
        {
            return GetEnumDescriptionUtil.GetEnumDescription(StockType);
        }
    }
    /// <summary>
    /// 容器编号
    /// </summary>
    public string? ContainerNo { get; set; }
        /// <summary>
        /// 机型
        /// </summary>
        public string? MaterialModel { get; set; }
    /// <summary>
    /// 机型
    /// </summary>
    public string? MaterialModel { get; set; }
        /// <summary>
        /// 操作时间
        /// </summary>
        public DateTime? OperateTime { get; set; }
    /// <summary>
    /// 操作时间
    /// </summary>
    public DateTime? OperateTime { get; set; }
        /// <summary>
        /// 备注
        /// </summary>
        public string? Remark { get; set; }
    /// <summary>
    /// 备注
    /// </summary>
    public string? Remark { get; set; }
        /// <summary>
        /// 物料ID
        /// </summary>
        public string MaterialId { get; set; }
    /// <summary>
    /// 物料ID
    /// </summary>
    public string MaterialId { get; set; }
        /// <summary>
        /// 任务号
        /// </summary>
        public string TaskNo { get; set; }
    /// <summary>
    /// 任务号
    /// </summary>
    public string TaskNo { get; set; }
        /// <summary>
        /// 起始库位
        /// </summary>
        public string? SourcePlace { get; set; }
    /// <summary>
    /// 起始库位
    /// </summary>
    public string? SourcePlace { get; set; }
        /// <summary>
        /// 目标库位
        /// </summary>
        public string? ToPlace { get; set; }
    /// <summary>
    /// 目标库位
    /// </summary>
    public string? ToPlace { get; set; }
        /// <summary>
        /// 排序
        /// </summary>
        public int Sort { get; set; }
    /// <summary>
    /// 排序
    /// </summary>
    public int Sort { get; set; }
        /// <summary>
        /// 是否禁用
        /// </summary>
        public bool? IsDisabled { get; set; }
    /// <summary>
    /// 是否禁用
    /// </summary>
    public bool? IsDisabled { get; set; }
        /// <summary>
        ///
        /// </summary>
        public ExtraPropertyDictionary? ExtraProperties { get; set; }
    /// <summary>
    ///
    /// </summary>
    public ExtraPropertyDictionary? ExtraProperties { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string? ConcurrencyStamp { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string? ConcurrencyStamp { get; set; }
        /// <summary>
        ///
        /// </summary>
        public DateTime CreationTime { get; set; }
    /// <summary>
    ///
    /// </summary>
    public DateTime CreationTime { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string? CreatorId { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string? CreatorId { get; set; }
        /// <summary>
        ///
        /// </summary>
        public DateTime? LastModificationTime { get; set; }
    /// <summary>
    ///
    /// </summary>
    public DateTime? LastModificationTime { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string? LastModifierId { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string? LastModifierId { get; set; }
        /// <summary>
        ///
        /// </summary>
        public bool IsDeleted { get; set; }
    /// <summary>
    ///
    /// </summary>
    public bool IsDeleted { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string? DeleterId { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string? DeleterId { get; set; }
        /// <summary>
        ///
        /// </summary>
        public DateTime? DeletionTime { get; set; }
    /// <summary>
    ///
    /// </summary>
    public DateTime? DeletionTime { get; set; }
    /// <summary> 
    /// Gets the export data. 
    /// </summary> 
    /// <returns></returns> 
    public Dictionary<string, object> GetExportData()
    {
        var exportData = new Dictionary<string, object>();
        foreach (var property in this.GetType().GetProperties())
        {
            exportData.Add(property.Name, property.GetValue(this));
        }
        return exportData;
    }
}
    public Dictionary<string, object> GetExportData()
    {
        var exportData = new Dictionary<string, object>();
        foreach (var property in this.GetType().GetProperties())
        {
            exportData.Add(property.Name, property.GetValue(this));
        }
        return exportData;
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsTask/WmsTaskDto.cs
@@ -1,206 +1,228 @@
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using CmsQueryExtensions;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsTask;
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using CmsQueryExtensions;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
namespace CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsTask;
/// <summary> 
/// Wms任务管理数据参数对象 
/// </summary> 
public  class WmsTaskDto:  ExtensibleEntityDto<Guid>, IHasConcurrencyStamp
{
            /// <summary>
        /// 任务号
        /// </summary>
        public string TaskNo { get; set; }
public class WmsTaskDto : ExtensibleEntityDto<Guid>, IHasConcurrencyStamp
{
    /// <summary>
    /// 任务号
    /// </summary>
    public string TaskNo { get; set; }
        /// <summary>
        /// 任务类型
        /// </summary>
        public TaskTypeEnum TaskType { get; set; }
    /// <summary>
    /// 任务类型
    /// </summary>
    public TaskTypeEnum TaskType { get; set; }
        /// <summary>
        /// 任务类型
        /// </summary>
        public string TaskTypeDesc
        {
            get
            {
                return GetEnumDescriptionUtil.GetEnumDescription(TaskType);
            }
        }
        /// <summary>
        /// 任务等级
        /// </summary>
        public int TaskLevel { get; set; }
    /// <summary>
    /// 任务类型
    /// </summary>
    public string TaskTypeDesc
    {
        get
        {
            return GetEnumDescriptionUtil.GetEnumDescription(TaskType);
        }
    }
    /// <summary>
    /// 任务等级
    /// </summary>
    public int TaskLevel { get; set; }
        /// <summary>
        /// 任务状态
        /// </summary>
        public WmsTaskStatus TaskStatus { get; set; }
    /// <summary>
    /// 任务状态
    /// </summary>
    public WmsTaskStatus TaskStatus { get; set; }
        /// <summary>
        /// 任务状态
        /// </summary>
        public string TaskStatusDesc
        {
            get
            {
                return GetEnumDescriptionUtil.GetEnumDescription(TaskStatus);
            }
        }
        /// <summary>
        /// 托盘编号
        /// </summary>
        public string? ContainerNo { get; set; }
    /// <summary>
    /// 任务状态
    /// </summary>
    public string TaskStatusDesc
    {
        get
        {
            return GetEnumDescriptionUtil.GetEnumDescription(TaskStatus);
        }
    }
    /// <summary>
    /// 托盘编号
    /// </summary>
    public string? ContainerNo { get; set; }
        /// <summary>
        /// 起始库位
        /// </summary>
        public string? SourcePlace { get; set; }
    /// <summary>
    /// 起始库位
    /// </summary>
    public string? SourcePlace { get; set; }
        /// <summary>
        /// 目标库位
        /// </summary>
        public string? ToPlace { get; set; }
    /// <summary>
    /// 目标库位
    /// </summary>
    public string? ToPlace { get; set; }
        /// <summary>
        /// 巷道
        /// </summary>
        public int? Aisle { get; set; }
    /// <summary>
    /// 巷道
    /// </summary>
    public int? Aisle { get; set; }
        /// <summary>
        /// 堆垛机ID
        /// </summary>
        public int? DodeviceId { get; set; }
    /// <summary>
    /// 堆垛机ID
    /// </summary>
    public int? DodeviceId { get; set; }
        /// <summary>
        /// 设备类型
        /// </summary>
        public int Dodevicetype { get; set; }
    /// <summary>
    /// 设备类型
    /// </summary>
    public DodevicetypeEnum Dodevicetype { get; set; }
        /// <summary>
        /// 设备任务状态
        /// </summary>
        public int TaskDodeviceStatus { get; set; }
    /// <summary>
    /// 设备类型Desc
    /// </summary>
    public string DodevicetypeDesc
    {
        get
        {
            return GetEnumDescriptionUtil.GetEnumDescription(Dodevicetype);
        }
    }
        /// <summary>
        /// WCS是否可以读取
        /// </summary>
        public bool IsRead { get; set; }
    /// <summary>
    /// 设备任务状态
    /// </summary>
    public TaskDodeviceStatus TaskDodeviceStatus { get; set; }
        /// <summary>
        /// 子任务类型
        /// </summary>
        public SonTaskTypeEnum? SonTaskType { get; set; }
    /// <summary>
    /// 设备类型Desc
    /// </summary>
    public string TaskDodeviceStatusDesc
    {
        get
        {
            return GetEnumDescriptionUtil.GetEnumDescription(TaskDodeviceStatus);
        }
    }
        /// <summary>
        /// 子任务类型
        /// </summary>
        public string? SonTaskTypeDesc
        {
            get
            {
                return GetEnumDescriptionUtil.GetEnumDescription(SonTaskType);
            }
        }
        /// <summary>
        /// 来源单据号
        /// </summary>
        public string? SourceOrderNo { get; set; }
    /// <summary>
    /// WCS是否可以读取
    /// </summary>
    public bool IsRead { get; set; }
        /// <summary>
        /// 下个任务是否生成成功
        /// </summary>
        public int? IsNextTask { get; set; }
    /// <summary>
    /// 子任务类型
    /// </summary>
    public SonTaskTypeEnum? SonTaskType { get; set; }
        /// <summary>
        /// 可变变量1
        /// </summary>
        public string? MutableParam1 { get; set; }
    /// <summary>
    /// 子任务类型
    /// </summary>
    public string? SonTaskTypeDesc
    {
        get
        {
            return GetEnumDescriptionUtil.GetEnumDescription(SonTaskType);
        }
    }
    /// <summary>
    /// 来源单据号
    /// </summary>
    public string? SourceOrderNo { get; set; }
        /// <summary>
        /// 可变变量2
        /// </summary>
        public string? MutableParam2 { get; set; }
    /// <summary>
    /// 下个任务是否生成成功
    /// </summary>
    public int? IsNextTask { get; set; }
        /// <summary>
        /// 可变变量3
        /// </summary>
        public string? MutableParam3 { get; set; }
    /// <summary>
    /// 可变变量1
    /// </summary>
    public string? MutableParam1 { get; set; }
        /// <summary>
        /// 排序
        /// </summary>
        public int Sort { get; set; }
    /// <summary>
    /// 可变变量2
    /// </summary>
    public string? MutableParam2 { get; set; }
        /// <summary>
        /// 是否禁用
        /// </summary>
        public bool? IsDisabled { get; set; }
    /// <summary>
    /// 可变变量3
    /// </summary>
    public string? MutableParam3 { get; set; }
        /// <summary>
        ///
        /// </summary>
        public ExtraPropertyDictionary? ExtraProperties { get; set; }
    /// <summary>
    /// 排序
    /// </summary>
    public int Sort { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string? ConcurrencyStamp { get; set; }
    /// <summary>
    /// 是否禁用
    /// </summary>
    public bool? IsDisabled { get; set; }
        /// <summary>
        ///
        /// </summary>
        public DateTime CreationTime { get; set; }
    /// <summary>
    ///
    /// </summary>
    public ExtraPropertyDictionary? ExtraProperties { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string? CreatorId { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string? ConcurrencyStamp { get; set; }
        /// <summary>
        ///
        /// </summary>
        public DateTime? LastModificationTime { get; set; }
    /// <summary>
    ///
    /// </summary>
    public DateTime CreationTime { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string? LastModifierId { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string? CreatorId { get; set; }
        /// <summary>
        ///
        /// </summary>
        public bool IsDeleted { get; set; }
    /// <summary>
    ///
    /// </summary>
    public DateTime? LastModificationTime { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string? DeleterId { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string? LastModifierId { get; set; }
        /// <summary>
        ///
        /// </summary>
        public DateTime? DeletionTime { get; set; }
    /// <summary>
    ///
    /// </summary>
    public bool IsDeleted { get; set; }
    /// <summary>
    ///
    /// </summary>
    public string? DeleterId { get; set; }
    /// <summary>
    ///
    /// </summary>
    public DateTime? DeletionTime { get; set; }
    /// <summary> 
    /// Gets the export data. 
    /// </summary> 
    /// <returns></returns> 
    public Dictionary<string, object> GetExportData()
    {
        var exportData = new Dictionary<string, object>();
        foreach (var property in this.GetType().GetProperties())
        {
            exportData.Add(property.Name, property.GetValue(this));
        }
        return exportData;
    }
}
    public Dictionary<string, object> GetExportData()
    {
        var exportData = new Dictionary<string, object>();
        foreach (var property in this.GetType().GetProperties())
        {
            exportData.Add(property.Name, property.GetValue(this));
        }
        return exportData;
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsInOutStockRecordAppService.cs
@@ -1,127 +1,127 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsInOutStockRecord;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared;
using CmsQueryExtensions;
using CMS.Plugin.HIAWms.Domain.WmsInOutStockRecord;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
using Volo.Abp.ObjectMapping;
namespace CMS.Plugin.HIAWms.Application.Implements;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsInOutStockRecord;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared;
using CmsQueryExtensions;
using CMS.Plugin.HIAWms.Domain.WmsInOutStockRecord;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
using Volo.Abp.ObjectMapping;
namespace CMS.Plugin.HIAWms.Application.Implements;
/// <summary> 
/// 出入库记录应用服务 
/// </summary> 
public class WmsInOutStockRecordAppService : CMSPluginAppService, IWmsInOutStockRecordAppService
{
    private readonly IWmsInOutStockRecordRepository wmsInOutStockRecordRepository;
public class WmsInOutStockRecordAppService : CMSPluginAppService, IWmsInOutStockRecordAppService
{
    private readonly IWmsInOutStockRecordRepository wmsInOutStockRecordRepository;
    /// <summary> 
    /// Initializes a new instance of the <see cref="WmsInOutStockRecordAppService"/> class. 
    /// </summary> 
    /// <param name="WmsInOutStockRecordRepository">The task job repository.</param> 
    public WmsInOutStockRecordAppService(IWmsInOutStockRecordRepository _WmsInOutStockRecordRepository)
    {
        wmsInOutStockRecordRepository = _WmsInOutStockRecordRepository;
    }
    public WmsInOutStockRecordAppService(IWmsInOutStockRecordRepository _WmsInOutStockRecordRepository)
    {
        wmsInOutStockRecordRepository = _WmsInOutStockRecordRepository;
    }
    /// <summary> 
    /// 获取指定出入库记录 
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public virtual async Task<WmsInOutStockRecordDto> GetAsync(Guid id)
    {
        return ObjectMapper.Map<WmsInOutStockRecord, WmsInOutStockRecordDto>(await wmsInOutStockRecordRepository.GetAsync(id));
    }
    public virtual async Task<WmsInOutStockRecordDto> GetAsync(Guid id)
    {
        return ObjectMapper.Map<WmsInOutStockRecord, WmsInOutStockRecordDto>(await wmsInOutStockRecordRepository.GetAsync(id));
    }
    /// <summary> 
    /// 分页获取出入库记录 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    public virtual async Task<PagedResultDto<WmsInOutStockRecordDto>> GetListAsync(GetWmsInOutStockRecordInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsInOutStockRecord.Sort);
        }
    public virtual async Task<PagedResultDto<WmsInOutStockRecordDto>> GetListAsync(GetWmsInOutStockRecordInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsInOutStockRecord.Sort);
        }
        #region 动态构造查询条件  
        //动态构造查询条件  
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await wmsInOutStockRecordRepository.GetCountAsync(whereConditions);
        var list = await wmsInOutStockRecordRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WmsInOutStockRecordDto>(count, ObjectMapper.Map<List<WmsInOutStockRecord>, List<WmsInOutStockRecordDto>>(list));
    }
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await wmsInOutStockRecordRepository.GetCountAsync(whereConditions);
        var list = await wmsInOutStockRecordRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WmsInOutStockRecordDto>(count, ObjectMapper.Map<List<WmsInOutStockRecord>, List<WmsInOutStockRecordDto>>(list));
    }
    /// <summary>  
    /// 动态构造查询条件  
    /// </summary>  
    /// <param name="input">输入参数</param>  
    /// <returns></returns>  
    private FunReturnResultModel<Expression<Func<WmsInOutStockRecord, bool>>> DynamicGetQueryParams(GetWmsInOutStockRecordInput input)
    {
    private FunReturnResultModel<Expression<Func<WmsInOutStockRecord, bool>>> DynamicGetQueryParams(GetWmsInOutStockRecordInput input)
    {
        //动态构造查询条件  
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WmsInOutStockRecord, GetWmsInOutStockRecordInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WmsInOutStockRecord, GetWmsInOutStockRecordInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        //也可再次自定义构建查询条件  
        Expression<Func<WmsInOutStockRecord, bool>> extendExpression = a => a.IsDeleted == false;
        Expression<Func<WmsInOutStockRecord, bool>> extendExpression = a => a.IsDeleted == false;
        // 使用 System.Linq.PredicateBuilder 的 And 
        var pres = (System.Linq.Expressions.Expression<Func<WmsInOutStockRecord, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
        var pres = (System.Linq.Expressions.Expression<Func<WmsInOutStockRecord, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
    /// <summary> 
    /// 新建出入库记录 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public virtual async Task<WmsInOutStockRecordDto> CreateAsync(WmsInOutStockRecordCreateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var exist = await wmsInOutStockRecordRepository.NameExistAsync(input.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.Id]);
        }
        var maxSort = await wmsInOutStockRecordRepository.GetMaxSortAsync();
        var sort = input.Sort ?? maxSort;
        var insertObj = ObjectMapper.Map<WmsInOutStockRecordCreateDto, WmsInOutStockRecord>(input);
        insertObj.Sort = sort;
        input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
        await wmsInOutStockRecordRepository.InsertAsync(insertObj);
        if (input.Sort.HasValue && insertObj.Sort != maxSort)
        {
            await AdjustSortAsync(insertObj.Id, insertObj.Sort);
        }
        return ObjectMapper.Map<WmsInOutStockRecord, WmsInOutStockRecordDto>(insertObj);
    }
    public virtual async Task<WmsInOutStockRecordDto> CreateAsync(WmsInOutStockRecordCreateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        //var exist = await wmsInOutStockRecordRepository.NameExistAsync(input.MaterialId);
        //if (exist)
        //{
        //    throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialId]);
        //}
        var maxSort = await wmsInOutStockRecordRepository.GetMaxSortAsync();
        var sort = input.Sort ?? maxSort;
        var insertObj = ObjectMapper.Map<WmsInOutStockRecordCreateDto, WmsInOutStockRecord>(input);
        insertObj.Sort = sort;
        input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
        await wmsInOutStockRecordRepository.InsertAsync(insertObj);
        if (input.Sort.HasValue && insertObj.Sort != maxSort)
        {
            await AdjustSortAsync(insertObj.Id, insertObj.Sort);
        }
        return ObjectMapper.Map<WmsInOutStockRecord, WmsInOutStockRecordDto>(insertObj);
    }
    /// <summary> 
    /// 更新出入库记录 
    /// </summary> 
@@ -129,21 +129,21 @@
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public virtual async Task<WmsInOutStockRecordDto> UpdateAsync(Guid id, WmsInOutStockRecordUpdateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await wmsInOutStockRecordRepository.GetAsync(id);
        var exist = await wmsInOutStockRecordRepository.NameExistAsync(input.Id, updateObj.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.Id]);
        }
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
                updateObj.OrderNo = input.OrderNo;
    public virtual async Task<WmsInOutStockRecordDto> UpdateAsync(Guid id, WmsInOutStockRecordUpdateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await wmsInOutStockRecordRepository.GetAsync(id);
        //var exist = await wmsInOutStockRecordRepository.NameExistAsync(input.Id, updateObj.Id);
        //if (exist)
        //{
        //    throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.Id]);
        //}
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
        updateObj.OrderNo = input.OrderNo;
        updateObj.MaterialName = input.MaterialName;
        updateObj.MaterialNo = input.MaterialNo;
        updateObj.StockType = input.StockType;
@@ -156,20 +156,20 @@
        updateObj.SourcePlace = input.SourcePlace;
        updateObj.ToPlace = input.ToPlace;
        updateObj.IsDisabled = input.IsDisabled;
        await wmsInOutStockRecordRepository.UpdateAsync(updateObj);
        return ObjectMapper.Map<WmsInOutStockRecord, WmsInOutStockRecordDto>(updateObj);
    }
        await wmsInOutStockRecordRepository.UpdateAsync(updateObj);
        return ObjectMapper.Map<WmsInOutStockRecord, WmsInOutStockRecordDto>(updateObj);
    }
    /// <summary> 
    /// 克隆出入库记录 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    public async Task<List<WmsInOutStockRecordDto>> CloneAsync(IEnumerable<Guid> ids)
    {
    public async Task<List<WmsInOutStockRecordDto>> CloneAsync(IEnumerable<Guid> ids)
    {
        //var wmsInOutStockRecords = new List<WmsInOutStockRecord>(); 
        //if (ids != null) 
        //{ 
@@ -189,248 +189,248 @@
        //                    name += WmsInOutStockRecordConsts.CloneTag; 
        //                    continue; 
        //                } 
        //                notExist = true; 
        //            } 
        //            //WmsInOutStockRecord = await wmsInOutStockRecordRepository.InsertAsync(WmsInOutStockRecord.Clone(GuidGenerator.Create(), name, sort++)); 
        //            wmsInOutStockRecords.Add(WmsInOutStockRecord); 
        //        } 
        //    } 
        //} 
        //return ObjectMapper.Map<List<WmsInOutStockRecord>, List<WmsInOutStockRecordDto>>(wmsInOutStockRecords); 
        return new List<WmsInOutStockRecordDto>();
    }
        return new List<WmsInOutStockRecordDto>();
    }
    /// <summary> 
    /// 删除单个出入库记录 
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public virtual Task DeleteAsync(Guid id)
    {
        return wmsInOutStockRecordRepository.DeleteAsync(id);
    }
    public virtual Task DeleteAsync(Guid id)
    {
        return wmsInOutStockRecordRepository.DeleteAsync(id);
    }
    /// <summary> 
    /// 删除多个出入库记录 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    public async Task DeleteManyAsync(IEnumerable<Guid> ids)
    {
        foreach (var id in ids)
        {
            await DeleteAsync(id);
        }
    }
    public async Task DeleteManyAsync(IEnumerable<Guid> ids)
    {
        foreach (var id in ids)
        {
            await DeleteAsync(id);
        }
    }
    /// <summary> 
    /// 调整排序出入库记录 
    /// </summary> 
    /// <param name="id"></param> 
    /// <param name="sort"></param> 
    /// <returns></returns> 
    public virtual async Task AdjustSortAsync(Guid id, int sort)
    {
        var list = await wmsInOutStockRecordRepository.GetListAsync(null, nameof(WmsInOutStockRecord.Sort));
        if (list != null && list.Any())
        {
            var initSort = 1;
            list.ForEach(x => x.AdjustSort(initSort++));
            var entity = list.FirstOrDefault(x => x.Id == id);
            if (entity != null)
            {
                if (sort == 1)
                {
                    list.Where(x => x.Id != id).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                }
                else if (entity.Sort > sort)
                {
                    list.Where(x => x.Id != id && x.Sort >= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort < sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                else if (entity.Sort < sort)
                {
                    list.Where(x => x.Id != id && x.Sort > sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort <= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                entity.AdjustSort(sort);
            }
        }
        await wmsInOutStockRecordRepository.UpdateManyAsync(list);
    }
    public virtual async Task AdjustSortAsync(Guid id, int sort)
    {
        var list = await wmsInOutStockRecordRepository.GetListAsync(null, nameof(WmsInOutStockRecord.Sort));
        if (list != null && list.Any())
        {
            var initSort = 1;
            list.ForEach(x => x.AdjustSort(initSort++));
            var entity = list.FirstOrDefault(x => x.Id == id);
            if (entity != null)
            {
                if (sort == 1)
                {
                    list.Where(x => x.Id != id).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                }
                else if (entity.Sort > sort)
                {
                    list.Where(x => x.Id != id && x.Sort >= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort < sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                else if (entity.Sort < sort)
                {
                    list.Where(x => x.Id != id && x.Sort > sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort <= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                entity.AdjustSort(sort);
            }
        }
        await wmsInOutStockRecordRepository.UpdateManyAsync(list);
    }
    /// <summary> 
    /// 导入出入库记录 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public async Task ImportAsync(WmsInOutStockRecordsImportModel input)
    {
        Check.NotNull(input, nameof(input));
        var wmsInOutStockRecordCreateDtos = new List<(int RowIndex, WmsInOutStockRecordCreateDto Item)>();
        var wmsInOutStockRecordUpdateDtos = new List<(int RowIndex, Guid Id, WmsInOutStockRecordUpdateDto Item)>();
        var importItems = input.WmsInOutStockRecords;
        if (importItems != null && importItems.Any())
        {
    public async Task ImportAsync(WmsInOutStockRecordsImportModel input)
    {
        Check.NotNull(input, nameof(input));
        var wmsInOutStockRecordCreateDtos = new List<(int RowIndex, WmsInOutStockRecordCreateDto Item)>();
        var wmsInOutStockRecordUpdateDtos = new List<(int RowIndex, Guid Id, WmsInOutStockRecordUpdateDto Item)>();
        var importItems = input.WmsInOutStockRecords;
        if (importItems != null && importItems.Any())
        {
            #region 导入校验 
            // 判断名称是否重复,并输出第几行重复 
            var duplicateWmsInOutStockRecords = importItems.GroupBy(x => x.Id).Where(x => x.Count() > 1).ToList();
            if (duplicateWmsInOutStockRecords?.Any() == true)
            {
                var duplicateWmsInOutStockRecordMsgs = duplicateWmsInOutStockRecords.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key}  名称重复");
                var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWmsInOutStockRecordMsgs)},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
            #endregion
            foreach (var impItem in importItems)
            {
                if (impItem.Id.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if (impItem.Id.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:WmsInOutStockRecord名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var oldWmsInOutStockRecord = await wmsInOutStockRecordRepository.FindByNameAsync(impItem.Id);
                if (oldWmsInOutStockRecord != null)
                {
                    var wmsInOutStockRecordUpdateDto = new WmsInOutStockRecordUpdateDto
                    {
            var duplicateWmsInOutStockRecords = importItems.GroupBy(x => x.MaterialNo).Where(x => x.Count() > 1).ToList();
            if (duplicateWmsInOutStockRecords?.Any() == true)
            {
                var duplicateWmsInOutStockRecordMsgs = duplicateWmsInOutStockRecords.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key}  名称重复");
                var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWmsInOutStockRecordMsgs)},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
            #endregion
            foreach (var impItem in importItems)
            {
                if (impItem.MaterialNo.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if (impItem.MaterialNo.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:WmsInOutStockRecord名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var oldWmsInOutStockRecord = await wmsInOutStockRecordRepository.FindByNameAsync(impItem.MaterialNo);
                if (oldWmsInOutStockRecord != null)
                {
                    var wmsInOutStockRecordUpdateDto = new WmsInOutStockRecordUpdateDto
                    {
                        OrderNo = impItem.OrderNo,
MaterialName = impItem.MaterialName,
MaterialNo = impItem.MaterialNo,
StockType = impItem.StockType,
ContainerNo = impItem.ContainerNo,
MaterialModel = impItem.MaterialModel,
OperateTime = impItem.OperateTime,
Remark = impItem.Remark,
MaterialId = impItem.MaterialId,
TaskNo = impItem.TaskNo,
SourcePlace = impItem.SourcePlace,
ToPlace = impItem.ToPlace,
IsDisabled = impItem.IsDisabled,
                    };
                    wmsInOutStockRecordUpdateDtos.Add((impItem.RowIndex, oldWmsInOutStockRecord.Id, wmsInOutStockRecordUpdateDto));
                }
                else
                {
                    var wmsInOutStockRecordCreateDto = new WmsInOutStockRecordCreateDto
                    {
                        MaterialName = impItem.MaterialName,
                        MaterialNo = impItem.MaterialNo,
                        StockType = impItem.StockType,
                        ContainerNo = impItem.ContainerNo,
                        MaterialModel = impItem.MaterialModel,
                        OperateTime = impItem.OperateTime,
                        Remark = impItem.Remark,
                        MaterialId = impItem.MaterialId,
                        TaskNo = impItem.TaskNo,
                        SourcePlace = impItem.SourcePlace,
                        ToPlace = impItem.ToPlace,
                        IsDisabled = impItem.IsDisabled,
                    };
                    wmsInOutStockRecordUpdateDtos.Add((impItem.RowIndex, oldWmsInOutStockRecord.Id, wmsInOutStockRecordUpdateDto));
                }
                else
                {
                    var wmsInOutStockRecordCreateDto = new WmsInOutStockRecordCreateDto
                    {
                        OrderNo = impItem.OrderNo,
MaterialName = impItem.MaterialName,
MaterialNo = impItem.MaterialNo,
StockType = impItem.StockType,
ContainerNo = impItem.ContainerNo,
MaterialModel = impItem.MaterialModel,
OperateTime = impItem.OperateTime,
Remark = impItem.Remark,
MaterialId = impItem.MaterialId,
TaskNo = impItem.TaskNo,
SourcePlace = impItem.SourcePlace,
ToPlace = impItem.ToPlace,
IsDisabled = impItem.IsDisabled,
                    };
                    wmsInOutStockRecordCreateDtos.Add((impItem.RowIndex, wmsInOutStockRecordCreateDto));
                }
            }
        }
                        MaterialName = impItem.MaterialName,
                        MaterialNo = impItem.MaterialNo,
                        StockType = impItem.StockType,
                        ContainerNo = impItem.ContainerNo,
                        MaterialModel = impItem.MaterialModel,
                        OperateTime = impItem.OperateTime,
                        Remark = impItem.Remark,
                        MaterialId = impItem.MaterialId,
                        TaskNo = impItem.TaskNo,
                        SourcePlace = impItem.SourcePlace,
                        ToPlace = impItem.ToPlace,
                        IsDisabled = impItem.IsDisabled,
                    };
                    wmsInOutStockRecordCreateDtos.Add((impItem.RowIndex, wmsInOutStockRecordCreateDto));
                }
            }
        }
        // 新增 
        foreach (var wmsInOutStockRecordDto in wmsInOutStockRecordCreateDtos)
        {
            try
            {
                await CreateAsync(wmsInOutStockRecordDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsInOutStockRecordDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
        foreach (var wmsInOutStockRecordDto in wmsInOutStockRecordCreateDtos)
        {
            try
            {
                await CreateAsync(wmsInOutStockRecordDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsInOutStockRecordDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
        // 更新 
        foreach (var wmsInOutStockRecordDto in wmsInOutStockRecordUpdateDtos)
        {
            try
            {
                await UpdateAsync(wmsInOutStockRecordDto.Id, wmsInOutStockRecordDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsInOutStockRecordDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
    }
        foreach (var wmsInOutStockRecordDto in wmsInOutStockRecordUpdateDtos)
        {
            try
            {
                await UpdateAsync(wmsInOutStockRecordDto.Id, wmsInOutStockRecordDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsInOutStockRecordDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
    }
    /// <summary> 
    /// 导出出入库记录 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsInOutStockRecordInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsInOutStockRecord.Sort);
        }
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsInOutStockRecordInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsInOutStockRecord.Sort);
        }
        #region 动态构造查询条件  
        //动态构造查询条件  
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await wmsInOutStockRecordRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<WmsInOutStockRecord>, List<WmsInOutStockRecordDto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = result.Count > 1 ? "出入库记录列表" : result.Count == 1 ? result[0]?.Id : "WmsInOutStockRecord模版";
        return (sheets, fileName);
    }
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await wmsInOutStockRecordRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<WmsInOutStockRecord>, List<WmsInOutStockRecordDto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = result.Count > 1 ? "出入库记录列表" : result.Count == 1 ? result[0]?.MaterialNo : "WmsInOutStockRecord模版";
        return (sheets, fileName);
    }
    /// <summary> 
    /// 校验出入库记录,当新建或更新时 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    protected Task CheckCreateOrUpdateDtoAsync(WmsInOutStockRecordCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
                Check.NotNullOrWhiteSpace(input.OrderNo, "单据编号", 50);
    protected Task CheckCreateOrUpdateDtoAsync(WmsInOutStockRecordCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
        Check.NotNullOrWhiteSpace(input.OrderNo, "单据编号", 50);
        Check.NotNullOrWhiteSpace(input.MaterialNo, "物料件号", 50);
        Check.NotNull(input.StockType, "操作类型");
        Check.NotNullOrWhiteSpace(input.MaterialId, "物料ID", 50);
        Check.NotNullOrWhiteSpace(input.TaskNo, "任务号", 50);
        return Task.CompletedTask;
    }
}
        return Task.CompletedTask;
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsTaskAppService.cs
@@ -1,127 +1,151 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsTask;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared;
using CmsQueryExtensions;
using CMS.Plugin.HIAWms.Domain.WmsTask;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
using Volo.Abp.ObjectMapping;
namespace CMS.Plugin.HIAWms.Application.Implements;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsTask;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared;
using CmsQueryExtensions;
using CMS.Plugin.HIAWms.Domain.WmsTask;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
using Volo.Abp.ObjectMapping;
using CMS.Plugin.HIAWms.Domain.WmsContainers;
using CMS.Plugin.HIAWms.Domain.WmsPlaces;
namespace CMS.Plugin.HIAWms.Application.Implements;
/// <summary> 
/// Wms任务管理应用服务 
/// </summary> 
public class WmsTaskAppService : CMSPluginAppService, IWmsTaskAppService
{
    private readonly IWmsTaskRepository wmsTaskRepository;
public class WmsTaskAppService : CMSPluginAppService, IWmsTaskAppService
{
    private readonly IWmsTaskRepository wmsTaskRepository;
    private readonly IWmsContainerRepository _wmsContainerRepository;
    private readonly IWmsPlaceRepository _wmsPlaceRepository;
    /// <summary> 
    /// Initializes a new instance of the <see cref="WmsTaskAppService"/> class. 
    /// </summary> 
    /// <param name="WmsTaskRepository">The task job repository.</param> 
    public WmsTaskAppService(IWmsTaskRepository _WmsTaskRepository)
    {
        wmsTaskRepository = _WmsTaskRepository;
    }
    public WmsTaskAppService(IWmsTaskRepository _WmsTaskRepository, IWmsContainerRepository wmsContainerRepository, IWmsPlaceRepository wmsPlaceRepository)
    {
        wmsTaskRepository = _WmsTaskRepository;
        _wmsContainerRepository = wmsContainerRepository;
        _wmsPlaceRepository = wmsPlaceRepository;
    }
    /// <summary> 
    /// 获取指定Wms任务管理 
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public virtual async Task<WmsTaskDto> GetAsync(Guid id)
    {
        return ObjectMapper.Map<WmsTask, WmsTaskDto>(await wmsTaskRepository.GetAsync(id));
    }
    public virtual async Task<WmsTaskDto> GetAsync(Guid id)
    {
        return ObjectMapper.Map<WmsTask, WmsTaskDto>(await wmsTaskRepository.GetAsync(id));
    }
    /// <summary> 
    /// 分页获取Wms任务管理 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    public virtual async Task<PagedResultDto<WmsTaskDto>> GetListAsync(GetWmsTaskInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsTask.Sort);
        }
    public virtual async Task<PagedResultDto<WmsTaskDto>> GetListAsync(GetWmsTaskInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsTask.Sort);
        }
        #region 动态构造查询条件  
        //动态构造查询条件  
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await wmsTaskRepository.GetCountAsync(whereConditions);
        var list = await wmsTaskRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WmsTaskDto>(count, ObjectMapper.Map<List<WmsTask>, List<WmsTaskDto>>(list));
    }
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await wmsTaskRepository.GetCountAsync(whereConditions);
        var list = await wmsTaskRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WmsTaskDto>(count, ObjectMapper.Map<List<WmsTask>, List<WmsTaskDto>>(list));
    }
    /// <summary>  
    /// 动态构造查询条件  
    /// </summary>  
    /// <param name="input">输入参数</param>  
    /// <returns></returns>  
    private FunReturnResultModel<Expression<Func<WmsTask, bool>>> DynamicGetQueryParams(GetWmsTaskInput input)
    {
    private FunReturnResultModel<Expression<Func<WmsTask, bool>>> DynamicGetQueryParams(GetWmsTaskInput input)
    {
        //动态构造查询条件  
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WmsTask, GetWmsTaskInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WmsTask, GetWmsTaskInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        //也可再次自定义构建查询条件  
        Expression<Func<WmsTask, bool>> extendExpression = a => a.IsDeleted == false;
        Expression<Func<WmsTask, bool>> extendExpression = a => a.IsDeleted == false;
        // 使用 System.Linq.PredicateBuilder 的 And 
        var pres = (System.Linq.Expressions.Expression<Func<WmsTask, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
        var pres = (System.Linq.Expressions.Expression<Func<WmsTask, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
    /// <summary> 
    /// 新建Wms任务管理 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public virtual async Task<WmsTaskDto> CreateAsync(WmsTaskCreateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var exist = await wmsTaskRepository.NameExistAsync(input.TaskNo);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.TaskNo]);
        }
        var maxSort = await wmsTaskRepository.GetMaxSortAsync();
        var sort = input.Sort ?? maxSort;
        var insertObj = ObjectMapper.Map<WmsTaskCreateDto, WmsTask>(input);
        insertObj.Sort = sort;
        input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
        await wmsTaskRepository.InsertAsync(insertObj);
        if (input.Sort.HasValue && insertObj.Sort != maxSort)
        {
            await AdjustSortAsync(insertObj.Id, insertObj.Sort);
        }
        return ObjectMapper.Map<WmsTask, WmsTaskDto>(insertObj);
    }
    public virtual async Task<WmsTaskDto> CreateAsync(WmsTaskCreateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var exist = await wmsTaskRepository.NameExistAsync(input.TaskNo);
        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();
        var sort = input.Sort ?? maxSort;
        var insertObj = ObjectMapper.Map<WmsTaskCreateDto, WmsTask>(input);
        insertObj.Sort = sort;
        input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
        await wmsTaskRepository.InsertAsync(insertObj);
        if (input.Sort.HasValue && insertObj.Sort != maxSort)
        {
            await AdjustSortAsync(insertObj.Id, insertObj.Sort);
        }
        return ObjectMapper.Map<WmsTask, WmsTaskDto>(insertObj);
    }
    /// <summary> 
    /// 更新Wms任务管理 
    /// </summary> 
@@ -129,21 +153,21 @@
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public virtual async Task<WmsTaskDto> UpdateAsync(Guid id, WmsTaskUpdateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await wmsTaskRepository.GetAsync(id);
        var exist = await wmsTaskRepository.NameExistAsync(input.TaskNo, updateObj.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.TaskNo]);
        }
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
                updateObj.TaskNo = input.TaskNo;
    public virtual async Task<WmsTaskDto> UpdateAsync(Guid id, WmsTaskUpdateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await wmsTaskRepository.GetAsync(id);
        var exist = await wmsTaskRepository.NameExistAsync(input.TaskNo, updateObj.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.TaskNo]);
        }
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
        updateObj.TaskNo = input.TaskNo;
        updateObj.TaskType = input.TaskType;
        updateObj.TaskLevel = input.TaskLevel;
        updateObj.TaskStatus = input.TaskStatus;
@@ -162,20 +186,19 @@
        updateObj.MutableParam2 = input.MutableParam2;
        updateObj.MutableParam3 = input.MutableParam3;
        updateObj.IsDisabled = input.IsDisabled;
        await wmsTaskRepository.UpdateAsync(updateObj);
        return ObjectMapper.Map<WmsTask, WmsTaskDto>(updateObj);
    }
        await wmsTaskRepository.UpdateAsync(updateObj);
        return ObjectMapper.Map<WmsTask, WmsTaskDto>(updateObj);
    }
    /// <summary> 
    /// 克隆Wms任务管理 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    public async Task<List<WmsTaskDto>> CloneAsync(IEnumerable<Guid> ids)
    {
    public async Task<List<WmsTaskDto>> CloneAsync(IEnumerable<Guid> ids)
    {
        //var wmsTasks = new List<WmsTask>(); 
        //if (ids != null) 
        //{ 
@@ -195,262 +218,265 @@
        //                    name += WmsTaskConsts.CloneTag; 
        //                    continue; 
        //                } 
        //                notExist = true; 
        //            } 
        //            //WmsTask = await wmsTaskRepository.InsertAsync(WmsTask.Clone(GuidGenerator.Create(), name, sort++)); 
        //            wmsTasks.Add(WmsTask); 
        //        } 
        //    } 
        //} 
        //return ObjectMapper.Map<List<WmsTask>, List<WmsTaskDto>>(wmsTasks); 
        return new List<WmsTaskDto>();
    }
        return new List<WmsTaskDto>();
    }
    /// <summary> 
    /// 删除单个Wms任务管理 
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public virtual Task DeleteAsync(Guid id)
    {
        return wmsTaskRepository.DeleteAsync(id);
    }
    public virtual Task DeleteAsync(Guid id)
    {
        return wmsTaskRepository.DeleteAsync(id);
    }
    /// <summary> 
    /// 删除多个Wms任务管理 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    public async Task DeleteManyAsync(IEnumerable<Guid> ids)
    {
        foreach (var id in ids)
        {
            await DeleteAsync(id);
        }
    }
    public async Task DeleteManyAsync(IEnumerable<Guid> ids)
    {
        foreach (var id in ids)
        {
            await DeleteAsync(id);
        }
    }
    /// <summary> 
    /// 调整排序Wms任务管理 
    /// </summary> 
    /// <param name="id"></param> 
    /// <param name="sort"></param> 
    /// <returns></returns> 
    public virtual async Task AdjustSortAsync(Guid id, int sort)
    {
        var list = await wmsTaskRepository.GetListAsync(null, nameof(WmsTask.Sort));
        if (list != null && list.Any())
        {
            var initSort = 1;
            list.ForEach(x => x.AdjustSort(initSort++));
            var entity = list.FirstOrDefault(x => x.Id == id);
            if (entity != null)
            {
                if (sort == 1)
                {
                    list.Where(x => x.Id != id).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                }
                else if (entity.Sort > sort)
                {
                    list.Where(x => x.Id != id && x.Sort >= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort < sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                else if (entity.Sort < sort)
                {
                    list.Where(x => x.Id != id && x.Sort > sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort <= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                entity.AdjustSort(sort);
            }
        }
        await wmsTaskRepository.UpdateManyAsync(list);
    }
    public virtual async Task AdjustSortAsync(Guid id, int sort)
    {
        var list = await wmsTaskRepository.GetListAsync(null, nameof(WmsTask.Sort));
        if (list != null && list.Any())
        {
            var initSort = 1;
            list.ForEach(x => x.AdjustSort(initSort++));
            var entity = list.FirstOrDefault(x => x.Id == id);
            if (entity != null)
            {
                if (sort == 1)
                {
                    list.Where(x => x.Id != id).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                }
                else if (entity.Sort > sort)
                {
                    list.Where(x => x.Id != id && x.Sort >= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort < sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                else if (entity.Sort < sort)
                {
                    list.Where(x => x.Id != id && x.Sort > sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1));
                    list.Where(x => x.Id != id && x.Sort <= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1));
                }
                entity.AdjustSort(sort);
            }
        }
        await wmsTaskRepository.UpdateManyAsync(list);
    }
    /// <summary> 
    /// 导入Wms任务管理 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public async Task ImportAsync(WmsTasksImportModel input)
    {
        Check.NotNull(input, nameof(input));
        var wmsTaskCreateDtos = new List<(int RowIndex, WmsTaskCreateDto Item)>();
        var wmsTaskUpdateDtos = new List<(int RowIndex, Guid Id, WmsTaskUpdateDto Item)>();
        var importItems = input.WmsTasks;
        if (importItems != null && importItems.Any())
        {
    public async Task ImportAsync(WmsTasksImportModel input)
    {
        Check.NotNull(input, nameof(input));
        var wmsTaskCreateDtos = new List<(int RowIndex, WmsTaskCreateDto Item)>();
        var wmsTaskUpdateDtos = new List<(int RowIndex, Guid Id, WmsTaskUpdateDto Item)>();
        var importItems = input.WmsTasks;
        if (importItems != null && importItems.Any())
        {
            #region 导入校验 
            // 判断名称是否重复,并输出第几行重复 
            var duplicateWmsTasks = importItems.GroupBy(x => x.TaskNo).Where(x => x.Count() > 1).ToList();
            if (duplicateWmsTasks?.Any() == true)
            {
                var duplicateWmsTaskMsgs = duplicateWmsTasks.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key}  名称重复");
                var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWmsTaskMsgs)},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
            #endregion
            foreach (var impItem in importItems)
            {
                if (impItem.TaskNo.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if (impItem.TaskNo.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:WmsTask名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var oldWmsTask = await wmsTaskRepository.FindByNameAsync(impItem.TaskNo);
                if (oldWmsTask != null)
                {
                    var wmsTaskUpdateDto = new WmsTaskUpdateDto
                    {
            var duplicateWmsTasks = importItems.GroupBy(x => x.TaskNo).Where(x => x.Count() > 1).ToList();
            if (duplicateWmsTasks?.Any() == true)
            {
                var duplicateWmsTaskMsgs = duplicateWmsTasks.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key}  名称重复");
                var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWmsTaskMsgs)},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
            #endregion
            foreach (var impItem in importItems)
            {
                if (impItem.TaskNo.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if (impItem.TaskNo.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:WmsTask名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var oldWmsTask = await wmsTaskRepository.FindByNameAsync(impItem.TaskNo);
                if (oldWmsTask != null)
                {
                    var wmsTaskUpdateDto = new WmsTaskUpdateDto
                    {
                        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,
TaskDodeviceStatus = impItem.TaskDodeviceStatus,
IsRead = impItem.IsRead,
SonTaskType = impItem.SonTaskType,
SourceOrderNo = impItem.SourceOrderNo,
IsNextTask = impItem.IsNextTask,
MutableParam1 = impItem.MutableParam1,
MutableParam2 = impItem.MutableParam2,
MutableParam3 = impItem.MutableParam3,
IsDisabled = impItem.IsDisabled,
                    };
                    wmsTaskUpdateDtos.Add((impItem.RowIndex, oldWmsTask.Id, wmsTaskUpdateDto));
                }
                else
                {
                    var wmsTaskCreateDto = new WmsTaskCreateDto
                    {
                        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,
                        TaskDodeviceStatus = impItem.TaskDodeviceStatus,
                        IsRead = impItem.IsRead,
                        SonTaskType = impItem.SonTaskType,
                        SourceOrderNo = impItem.SourceOrderNo,
                        IsNextTask = impItem.IsNextTask,
                        MutableParam1 = impItem.MutableParam1,
                        MutableParam2 = impItem.MutableParam2,
                        MutableParam3 = impItem.MutableParam3,
                        IsDisabled = impItem.IsDisabled,
                    };
                    wmsTaskUpdateDtos.Add((impItem.RowIndex, oldWmsTask.Id, wmsTaskUpdateDto));
                }
                else
                {
                    var wmsTaskCreateDto = new WmsTaskCreateDto
                    {
                        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,
TaskDodeviceStatus = impItem.TaskDodeviceStatus,
IsRead = impItem.IsRead,
SonTaskType = impItem.SonTaskType,
SourceOrderNo = impItem.SourceOrderNo,
IsNextTask = impItem.IsNextTask,
MutableParam1 = impItem.MutableParam1,
MutableParam2 = impItem.MutableParam2,
MutableParam3 = impItem.MutableParam3,
IsDisabled = impItem.IsDisabled,
                    };
                    wmsTaskCreateDtos.Add((impItem.RowIndex, wmsTaskCreateDto));
                }
            }
        }
                        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,
                        TaskDodeviceStatus = impItem.TaskDodeviceStatus,
                        IsRead = impItem.IsRead,
                        SonTaskType = impItem.SonTaskType,
                        SourceOrderNo = impItem.SourceOrderNo,
                        IsNextTask = impItem.IsNextTask,
                        MutableParam1 = impItem.MutableParam1,
                        MutableParam2 = impItem.MutableParam2,
                        MutableParam3 = impItem.MutableParam3,
                        IsDisabled = impItem.IsDisabled,
                    };
                    wmsTaskCreateDtos.Add((impItem.RowIndex, wmsTaskCreateDto));
                }
            }
        }
        // 新增 
        foreach (var wmsTaskDto in wmsTaskCreateDtos)
        {
            try
            {
                await CreateAsync(wmsTaskDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsTaskDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
        foreach (var wmsTaskDto in wmsTaskCreateDtos)
        {
            try
            {
                await CreateAsync(wmsTaskDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsTaskDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
        // 更新 
        foreach (var wmsTaskDto in wmsTaskUpdateDtos)
        {
            try
            {
                await UpdateAsync(wmsTaskDto.Id, wmsTaskDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsTaskDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
    }
        foreach (var wmsTaskDto in wmsTaskUpdateDtos)
        {
            try
            {
                await UpdateAsync(wmsTaskDto.Id, wmsTaskDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsTaskDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
    }
    /// <summary> 
    /// 导出Wms任务管理 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsTaskInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsTask.Sort);
        }
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsTaskInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsTask.Sort);
        }
        #region 动态构造查询条件  
        //动态构造查询条件  
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await wmsTaskRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<WmsTask>, List<WmsTaskDto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = result.Count > 1 ? "Wms任务管理列表" : result.Count == 1 ? result[0]?.TaskNo : "WmsTask模版";
        return (sheets, fileName);
    }
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await wmsTaskRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<WmsTask>, List<WmsTaskDto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = result.Count > 1 ? "Wms任务管理列表" : result.Count == 1 ? result[0]?.TaskNo : "WmsTask模版";
        return (sheets, fileName);
    }
    /// <summary> 
    /// 校验Wms任务管理,当新建或更新时 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    protected Task CheckCreateOrUpdateDtoAsync(WmsTaskCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
                Check.NotNullOrWhiteSpace(input.TaskNo, "任务号", 50);
    protected Task CheckCreateOrUpdateDtoAsync(WmsTaskCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
        Check.NotNullOrWhiteSpace(input.TaskNo, "任务号", 50);
        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;
    }
}
        return Task.CompletedTask;
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsTask/IWmsTaskRepository.cs
@@ -12,18 +12,18 @@
    /// <summary> 
    /// 按照名称查找Wms任务管理 
    /// </summary> 
    /// <param name="name"></param>
    /// <param name="taskNo"></param>
    /// <param name="cancellationToken"></param> 
    /// <returns></returns> 
    Task<WmsTask> FindByNameAsync(string name, CancellationToken cancellationToken = default);
    Task<WmsTask> FindByNameAsync(string taskNo, CancellationToken cancellationToken = default);
 
    /// <summary> 
    /// 验证名称是否存在Wms任务管理 
    /// </summary> 
    /// <param name="name"></param>
    /// <param name="taskNo"></param>
    /// <param name="id"></param> 
    /// <returns></returns> 
    Task<bool> NameExistAsync(string name, Guid? id = null);
    Task<bool> NameExistAsync(string taskNo, Guid? id = null);
 
    /// <summary> 
    /// 获取最大排序Wms任务管理 
HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsInOutStockRecordRepository.cs
@@ -36,7 +36,7 @@
            .IncludeDetails() 
            .Where(x => !x.IsDeleted) 
            .OrderBy(t => t.Sort) 
            .FirstOrDefaultAsync(t => t.Id == name, GetCancellationToken(cancellationToken));
            .FirstOrDefaultAsync(t => t.MaterialNo == name, GetCancellationToken(cancellationToken));
    } 
 
    /// <summary> 
@@ -47,7 +47,7 @@
    /// <returns></returns> 
    public async Task<bool> NameExistAsync(string name, Guid? id = null) 
    { 
        return await (await GetDbSetAsync()).WhereIf(id.HasValue, p => p.Id != id).Where(x => !x.IsDeleted).AnyAsync(x => x.Id == name);
        return await (await GetDbSetAsync()).WhereIf(id.HasValue, p => p.Id != id).Where(x => !x.IsDeleted).AnyAsync(x => x.MaterialNo == name);
    } 
 
    /// <summary> 
HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsTaskRepository.cs
@@ -27,27 +27,27 @@
    /// <summary> 
    /// 按照名称查找Wms任务管理 
    /// </summary> 
    /// <param name="name"></param>
    /// <param name="taskNo"></param>
    /// <param name="cancellationToken"></param> 
    /// <returns></returns> 
    public virtual async Task<WmsTask> FindByNameAsync(string name, CancellationToken cancellationToken = default)
    public virtual async Task<WmsTask> FindByNameAsync(string taskNo, CancellationToken cancellationToken = default)
    { 
        return await (await GetDbSetAsync()) 
            .IncludeDetails() 
            .Where(x => !x.IsDeleted) 
            .OrderBy(t => t.Sort) 
            .FirstOrDefaultAsync(t => t.TaskNo == name, GetCancellationToken(cancellationToken));
            .FirstOrDefaultAsync(t => t.TaskNo == taskNo, GetCancellationToken(cancellationToken));
    } 
 
    /// <summary> 
    /// 验证名称是否存在Wms任务管理 
    /// </summary> 
    /// <param name="name">校验值</param>
    /// <param name="taskNo">校验值</param>
    /// <param name="id"></param> 
    /// <returns></returns> 
    public async Task<bool> NameExistAsync(string name, Guid? id = null)
    public async Task<bool> NameExistAsync(string taskNo, Guid? id = null)
    { 
        return await (await GetDbSetAsync()).WhereIf(id.HasValue, p => p.Id != id).Where(x => !x.IsDeleted).AnyAsync(x => x.TaskNo == name);
        return await (await GetDbSetAsync()).WhereIf(id.HasValue, p => p.Id != id).Where(x => !x.IsDeleted).AnyAsync(x => x.TaskNo == taskNo);
    } 
 
    /// <summary> 
HIAWms/web/src/widgets/WmsInOutStockRecord/Controllers/WmsInOutStockRecordQueryDrawer.tsx
@@ -1,308 +1,310 @@
import {
  ref,
  onMounted,
  reactive,
  computed,
  Ref,
  watch,
  SetupContext,
  h,
} from 'vue'
import { injectModel } from '@/libs/Provider/Provider'
import { WmsInOutStockRecordDrawer } from '../Models/WmsInOutStockRecordDrawer'
import { ElMessage } from 'element-plus'
import isEqual from 'lodash/isEqual'
import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
import { cloneDeep } from 'lodash'
export const useWmsInOutStockRecordQueryDrawer = (props: any, ctx?: any) => {
  const wmsInOutStockRecordDrawer = injectModel<WmsInOutStockRecordDrawer>('WmsInOutStockRecordDrawer')
  /**
   * 用来对比的初始化数据
   */
  const initiateData: Ref<Record<string, any>> = ref({})
  const formData = ref<Record<string, any>>({})
  // ref
  const formRef = ref()
  const disabled = ref(false)
  const current = computed(() => {
    return props.row || null
  })
  const inputNumber = (attrs) => {
    return (
      <el-input-number
        min="1"
        step="1"
        precision="0"
        {...attrs}
      ></el-input-number>
    )
  }
    const datePickerRange = (attrs) => {
    return (
      <el-date-picker
        type="daterange"
        value-format="YYYY-MM-DD HH:mm:ss"
        start-placeholder="开始日期"
        end-placeholder="结束日期"
        {...attrs}
      ></el-date-picker>
    )
  }
  const dateTimePickerRange = (attrs) => {
    return (
      <el-date-picker
        type="datetimerange"
        value-format="YYYY-MM-DD HH:mm:ss"
        start-placeholder="开始日期"
        end-placeholder="结束日期"
        {...attrs}
      ></el-date-picker>
    )
  }
  const visible = computed({
    get() {
      return props.modelValue
    },
    set(val) {
      ctx.emit('update:modelValue', val)
    },
  })
  /**
   * 添加的form字段
   */
  const formItems = reactive([
                    {
                   label: '单据编号',
                   prop: 'orderNo',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入单据编号',
                },
                {
                   label: '物料名称',
                   prop: 'materialName',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入物料名称',
                },
                {
                   label: '物料件号',
                   prop: 'materialNo',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入物料件号',
                },
                {
                   label: '操作类型',
                   prop: 'stockType',
                   el: 'select',
                   //disabled: disabled,
                   placeholder: '请输入操作类型',
                },
                {
                   label: '容器编号',
                   prop: 'containerNo',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入容器编号',
                },
                {
                   label: '机型',
                   prop: 'materialModel',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入机型',
                },
                {
                   label: '操作时间',
                   prop: 'operateTime',
                   el: (props: any, { attrs }: SetupContext) => {
                     return h(dateTimePickerRange, {
                       ...props,
                       clearable: true,
                       ...attrs,
                     })
                   },
                   width: '100%',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入操作时间',
                },
                {
                   label: '备注',
                   prop: 'remark',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入备注',
                },
                {
                   label: '物料ID',
                   prop: 'materialId',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入物料ID',
                },
                {
                   label: '任务号',
                   prop: 'taskNo',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入任务号',
                },
                {
                   label: '起始库位',
                   prop: 'sourcePlace',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入起始库位',
                },
                {
                   label: '目标库位',
                   prop: 'toPlace',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入目标库位',
                },
                {
                   label: '是否禁用',
                   prop: 'isDisabled',
                   el: 'select',
                   //disabled: disabled,
                   placeholder: '请输入是否禁用',
                 options: [{label: '是',value: 'true'}, {label: '否',value: 'false'}]
                },
                {
                   label: '',
                   prop: 'creationTime',
                   el: (props: any, { attrs }: SetupContext) => {
                     return h(dateTimePickerRange, {
                       ...props,
                       clearable: true,
                       ...attrs,
                     })
                   },
                   width: '100%',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入',
                },
  ])
  /**
   * 校验是否有数据变化
   */
  const checkIsEqualObject = () => {
    const data = {
      formData: formData.value,
    }
    const check = isEqual(initiateData.value, data)
    return check
  }
  const commonGetFormData=()=>{
    const data = {
      orderNo: formData.value.orderNo || '',
materialName: formData.value.materialName || '',
materialNo: formData.value.materialNo || '',
stockType: formData.value.stockType || '',
containerNo: formData.value.containerNo || '',
materialModel: formData.value.materialModel || '',
operateTime: formData.value.operateTime || '',
remark: formData.value.remark || '',
materialId: formData.value.materialId || '',
taskNo: formData.value.taskNo || '',
sourcePlace: formData.value.sourcePlace || '',
toPlace: formData.value.toPlace || '',
isDisabled: formData.value.isDisabled || '',
creationTime: formData.value.creationTime || '',
    }
    return data;
  }
  const onClose = (done: () => void) => {
    if (visible.value) {
      visible.value = false
      const data =commonGetFormData();
      ctx.emit('close', data)
    }
  }
  /**
   * 确认查询
   */
  const onConfirmQuery = async () => {
    const data =commonGetFormData();
    ctx.emit('confirmQuery', data)
  }
  /**
   * 重置查询
   */
  const onReset = async () => {
    formData.value = {}
    formData.value.OrderNo = ''
formData.value.MaterialName = ''
formData.value.MaterialNo = ''
formData.value.StockType = ''
formData.value.ContainerNo = ''
formData.value.MaterialModel = ''
formData.value.OperateTime = ''
formData.value.Remark = ''
formData.value.MaterialId = ''
formData.value.TaskNo = ''
formData.value.SourcePlace = ''
formData.value.ToPlace = ''
    //向父组件发送自定义事件
    ctx.emit('restQuery');
  }
  const updateCheckData = () => {
    initiateData.value = {
      formData: {
        ...formData.value,
      },
    }
  }
  const updateFormItemOptions = (propName: string, enumData: any[]) => {
    const item = formItems.find((item) => item.prop === propName)
    if (item && enumData) {
      item.options = enumData.map((item) => ({
        label: item.description,
        value: item.value,
      }))
    }
  }
  /**
   * 通用查询枚举
   */
  const commonQueryEnumForFrom = async () => {
    const stockTypeEnumEnum = await wmsInOutStockRecordDrawer.getWmsEnumData({
 EnumName: 'StockTypeEnum',
})
updateFormItemOptions('stockType', stockTypeEnumEnum)
  }
  commonQueryEnumForFrom()
  /**
   * 弹窗打开获取详情
   */
  const onOpen = async () => {
    disabled.value = false
    updateCheckData()
  }
  watch(() => current.value, onOpen)
  return {
    formItems,
    formData,
    visible,
    formRef,
    onOpen,
    onClose,
    onConfirmQuery,
    onReset,
  }
}
import {
  ref,
  onMounted,
  reactive,
  computed,
  Ref,
  watch,
  SetupContext,
  h,
} from 'vue'
import { injectModel } from '@/libs/Provider/Provider'
import { WmsInOutStockRecordDrawer } from '../Models/WmsInOutStockRecordDrawer'
import { ElMessage } from 'element-plus'
import isEqual from 'lodash/isEqual'
import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
import { cloneDeep } from 'lodash'
export const useWmsInOutStockRecordQueryDrawer = (props: any, ctx?: any) => {
  const wmsInOutStockRecordDrawer = injectModel<WmsInOutStockRecordDrawer>(
    'WmsInOutStockRecordDrawer'
  )
  /**
   * 用来对比的初始化数据
   */
  const initiateData: Ref<Record<string, any>> = ref({})
  const formData = ref<Record<string, any>>({})
  // ref
  const formRef = ref()
  const disabled = ref(false)
  const current = computed(() => {
    return props.row || null
  })
  const inputNumber = (attrs) => {
    return (
      <el-input-number
        min="1"
        step="1"
        precision="0"
        {...attrs}
      ></el-input-number>
    )
  }
  const datePickerRange = (attrs) => {
    return (
      <el-date-picker
        type="daterange"
        value-format="YYYY-MM-DD HH:mm:ss"
        start-placeholder="开始日期"
        end-placeholder="结束日期"
        {...attrs}
      ></el-date-picker>
    )
  }
  const dateTimePickerRange = (attrs) => {
    return (
      <el-date-picker
        type="datetimerange"
        value-format="YYYY-MM-DD HH:mm:ss"
        start-placeholder="开始日期"
        end-placeholder="结束日期"
        {...attrs}
      ></el-date-picker>
    )
  }
  const visible = computed({
    get() {
      return props.modelValue
    },
    set(val) {
      ctx.emit('update:modelValue', val)
    },
  })
  /**
   * 添加的form字段
   */
  const formItems = reactive([
    {
      label: '单据编号',
      prop: 'orderNo',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入单据编号',
    },
    {
      label: '物料名称',
      prop: 'materialName',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入物料名称',
    },
    {
      label: '物料件号',
      prop: 'materialNo',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入物料件号',
    },
    {
      label: '操作类型',
      prop: 'stockType',
      el: 'select',
      //disabled: disabled,
      placeholder: '请输入操作类型',
    },
    {
      label: '容器编号',
      prop: 'containerNo',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入容器编号',
    },
    {
      label: '机型',
      prop: 'materialModel',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入机型',
    },
    {
      label: '操作时间',
      prop: 'operateTime',
      el: (props: any, { attrs }: SetupContext) => {
        return h(dateTimePickerRange, {
          ...props,
          clearable: true,
          ...attrs,
        })
      },
      width: '100%',
      //disabled: disabled,
      placeholder: '请输入操作时间',
    },
    {
      label: '备注',
      prop: 'remark',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入备注',
    },
    {
      label: '物料ID',
      prop: 'materialId',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入物料ID',
    },
    {
      label: '任务号',
      prop: 'taskNo',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入任务号',
    },
    {
      label: '起始库位',
      prop: 'sourcePlace',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入起始库位',
    },
    {
      label: '目标库位',
      prop: 'toPlace',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入目标库位',
    },
    {
      label: '是否禁用',
      prop: 'isDisabled',
      el: 'select',
      //disabled: disabled,
      placeholder: '请输入是否禁用',
      options: [
        { label: '是', value: 'true' },
        { label: '否', value: 'false' },
      ],
    },
    {
      label: '创建时间',
      prop: 'creationTime',
      el: (props: any, { attrs }: SetupContext) => {
        return h(dateTimePickerRange, {
          ...props,
          clearable: true,
          ...attrs,
        })
      },
      width: '100%',
      //disabled: disabled,
      placeholder: '请输入',
    },
  ])
  /**
   * 校验是否有数据变化
   */
  const checkIsEqualObject = () => {
    const data = {
      formData: formData.value,
    }
    const check = isEqual(initiateData.value, data)
    return check
  }
  const commonGetFormData = () => {
    const data = {
      orderNo: formData.value.orderNo || '',
      materialName: formData.value.materialName || '',
      materialNo: formData.value.materialNo || '',
      stockType: formData.value.stockType || '',
      containerNo: formData.value.containerNo || '',
      materialModel: formData.value.materialModel || '',
      operateTime: formData.value.operateTime || '',
      remark: formData.value.remark || '',
      materialId: formData.value.materialId || '',
      taskNo: formData.value.taskNo || '',
      sourcePlace: formData.value.sourcePlace || '',
      toPlace: formData.value.toPlace || '',
      isDisabled: formData.value.isDisabled || '',
      creationTime: formData.value.creationTime || '',
    }
    return data
  }
  const onClose = (done: () => void) => {
    if (visible.value) {
      visible.value = false
      const data = commonGetFormData()
      ctx.emit('close', data)
    }
  }
  /**
   * 确认查询
   */
  const onConfirmQuery = async () => {
    const data = commonGetFormData()
    ctx.emit('confirmQuery', data)
  }
  /**
   * 重置查询
   */
  const onReset = async () => {
    formData.value = {}
    formData.value.OrderNo = ''
    formData.value.MaterialName = ''
    formData.value.MaterialNo = ''
    formData.value.StockType = ''
    formData.value.ContainerNo = ''
    formData.value.MaterialModel = ''
    formData.value.OperateTime = ''
    formData.value.Remark = ''
    formData.value.MaterialId = ''
    formData.value.TaskNo = ''
    formData.value.SourcePlace = ''
    formData.value.ToPlace = ''
    //向父组件发送自定义事件
    ctx.emit('restQuery')
  }
  const updateCheckData = () => {
    initiateData.value = {
      formData: {
        ...formData.value,
      },
    }
  }
  const updateFormItemOptions = (propName: string, enumData: any[]) => {
    const item = formItems.find((item) => item.prop === propName)
    if (item && enumData) {
      item.options = enumData.map((item) => ({
        label: item.description,
        value: item.value,
      }))
    }
  }
  /**
   * 通用查询枚举
   */
  const commonQueryEnumForFrom = async () => {
    const stockTypeEnumEnum = await wmsInOutStockRecordDrawer.getWmsEnumData({
      EnumName: 'StockTypeEnum',
    })
    updateFormItemOptions('stockType', stockTypeEnumEnum)
  }
  commonQueryEnumForFrom()
  /**
   * 弹窗打开获取详情
   */
  const onOpen = async () => {
    disabled.value = false
    updateCheckData()
  }
  watch(() => current.value, onOpen)
  return {
    formItems,
    formData,
    visible,
    formRef,
    onOpen,
    onClose,
    onConfirmQuery,
    onReset,
  }
}
HIAWms/web/src/widgets/WmsInOutStockRecord/Views/Pages/Dialog/WmsInOutStockRecordDrawer/WmsInOutStockRecordDrawer.tsx
@@ -52,7 +52,7 @@
        <DyForm 
          ref={formRef} 
          formData={formData.value} 
          labelWidth="106px"
          labelWidth="150px"
          formItemProps={formItems} 
        ></DyForm> 
      </BaseDrawer> 
HIAWms/web/src/widgets/WmsInOutStockRecord/Views/Pages/Dialog/WmsInOutStockRecordQueryDrawer/WmsInOutStockRecordQueryDrawer.tsx
@@ -1,71 +1,71 @@
/*
 * 物料基础信息查询弹出框
*/
import { SetupContext, defineComponent } from 'vue'
import BaseQueryDrawer from '@/components/BaseQueryDrawer/BaseQueryDrawer'
import styles from './WmsInOutStockRecordQueryDrawer.module.scss'
import { useWmsInOutStockRecordQueryDrawer } from '../../../../Controllers/WmsInOutStockRecordQueryDrawer.tsx'
import DyForm from '@/components/DyForm/DyForm'
// @ts-ignore
export default defineComponent<{
  [key: string]: any
}>({
  name: '弹窗',
  props: {
    //枚举类型字典
    enumListDict:{
      type: Array as () => Array<{ key: string; value: object }>, // 定义数组元素类型
      default: () => [] // 默认值
    },
    modelValue: {
      type: Boolean,
      default: false,
    },
    title: {
      type: String,
      default: '',
    },
    row: {
      type: Object,
    },
    sort: {
      type: Number,
      default: 0,
    },
  },
  emits: ['update:modelValue', 'close', 'submit', 'confirmquery1'],
  setup(props: Record<string, any>, ctx: SetupContext) {
    const {
      onClose,
      onConfirmQuery,
      onOpen,
      onReset,
      formRef,
      visible,
      formItems,
      formData,
    } = useWmsInOutStockRecordQueryDrawer(props, ctx)
    return () => (
      <BaseQueryDrawer
        class={styles.drawer}
        size="800px"
        title={props.title || '高级查询'}
        v-model={visible.value}
        close-on-click-modal={true}
        onReset={onReset}
        onConfirmQueryForBase={onConfirmQuery}
        onOpen={onOpen}
        before-close={onClose}
        onClose={onClose}
      >
        <DyForm
          ref={formRef}
          formData={formData.value}
          labelWidth="106px"
          formItemProps={formItems}
        ></DyForm>
      </BaseQueryDrawer>
    )
  },
})
/*
 * 物料基础信息查询弹出框
 */
import { SetupContext, defineComponent } from 'vue'
import BaseQueryDrawer from '@/components/BaseQueryDrawer/BaseQueryDrawer'
import styles from './WmsInOutStockRecordQueryDrawer.module.scss'
import { useWmsInOutStockRecordQueryDrawer } from '../../../../Controllers/WmsInOutStockRecordQueryDrawer.tsx'
import DyForm from '@/components/DyForm/DyForm'
// @ts-ignore
export default defineComponent<{
  [key: string]: any
}>({
  name: '弹窗',
  props: {
    //枚举类型字典
    enumListDict: {
      type: Array as () => Array<{ key: string; value: object }>, // 定义数组元素类型
      default: () => [], // 默认值
    },
    modelValue: {
      type: Boolean,
      default: false,
    },
    title: {
      type: String,
      default: '',
    },
    row: {
      type: Object,
    },
    sort: {
      type: Number,
      default: 0,
    },
  },
  emits: ['update:modelValue', 'close', 'submit', 'confirmquery1'],
  setup(props: Record<string, any>, ctx: SetupContext) {
    const {
      onClose,
      onConfirmQuery,
      onOpen,
      onReset,
      formRef,
      visible,
      formItems,
      formData,
    } = useWmsInOutStockRecordQueryDrawer(props, ctx)
    return () => (
      <BaseQueryDrawer
        class={styles.drawer}
        size="800px"
        title={props.title || '高级查询'}
        v-model={visible.value}
        close-on-click-modal={true}
        onReset={onReset}
        onConfirmQueryForBase={onConfirmQuery}
        onOpen={onOpen}
        before-close={onClose}
        onClose={onClose}
      >
        <DyForm
          ref={formRef}
          formData={formData.value}
          labelWidth="150px"
          formItemProps={formItems}
        ></DyForm>
      </BaseQueryDrawer>
    )
  },
})
HIAWms/web/src/widgets/WmsInOutStockRecord/Views/Pages/WmsInOutStockRecord/Config.ts
@@ -1,67 +1,65 @@
export const columns = [
  {
    type: 'seq',
    width: 60,
    title: '序号',
  },
  {
  field: 'orderNo',
  title: '单据编号',
},
{
  field: 'materialName',
  title: '物料名称',
},
{
  field: 'materialNo',
  title: '物料件号',
},
{
  field: 'stockTypeDesc',
  title: '操作类型',
},
{
  field: 'containerNo',
  title: '容器编号',
},
{
  field: 'materialModel',
  title: '机型',
},
{
  field: 'operateTime',
  title: '操作时间',
},
{
  field: 'remark',
  title: '备注',
},
{
  field: 'materialId',
  title: '物料ID',
},
{
  field: 'taskNo',
  title: '任务号',
},
{
  field: 'sourcePlace',
  title: '起始库位',
},
{
  field: 'toPlace',
  title: '目标库位',
},
{
  field: 'sort',
  title: '排序',
},
{
  field: 'creationTime',
  title: '',
},
{
  field: 'deletionTime',
  title: '',
},
]
export const columns = [
  {
    type: 'seq',
    width: 60,
    title: '序号',
  },
  {
    field: 'orderNo',
    title: '单据编号',
  },
  {
    field: 'materialName',
    title: '物料名称',
  },
  {
    field: 'materialNo',
    title: '物料件号',
  },
  {
    field: 'materialId',
    title: '物料ID',
  },
  {
    field: 'taskNo',
    title: '任务号',
  },
  {
    field: 'sourcePlace',
    title: '起始库位',
  },
  {
    field: 'toPlace',
    title: '目标库位',
  },
  {
    field: 'stockTypeDesc',
    title: '操作类型',
  },
  {
    field: 'containerNo',
    title: '容器编号',
  },
  {
    field: 'materialModel',
    title: '机型',
  },
  {
    field: 'remark',
    title: '备注',
  },
  // {
  //   field: 'sort',
  //   title: '排序',
  // },
  {
    field: 'operateTime',
    title: '操作时间',
    width: 180,
  },
  {
    field: 'creationTime',
    title: '创建时间',
    width: 180,
  },
]
HIAWms/web/src/widgets/WmsInOutStockRecord/Views/Pages/WmsInOutStockRecord/WmsInOutStockRecord.tsx
@@ -1,308 +1,329 @@
import { computed, defineComponent, onMounted, reactive, ref } from 'vue'
import type { Ref } from 'vue'
import BaseTable from '@/components/Table/Table'
import styles from './WmsInOutStockRecord.module.scss'
import { useWmsInOutStockRecord } from '../../../Controllers/WmsInOutStockRecord'
import IconButton from '@/components/IconButton/IconButton'
import WmsInOutStockRecordDrawer from '../Dialog/WmsInOutStockRecordDrawer/WmsInOutStockRecordDrawer'
import WmsInOutStockRecordQueryDrawer from '../Dialog/WmsInOutStockRecordQueryDrawer/WmsInOutStockRecordQueryDrawer'
import Search from '@/components/Search/Search'
import { columns } from './Config'
import TdButton from '@/components/TdButton/TdButton'
import { vPermission } from '@/libs/Permission/Permission'
import {
  getWmsEnumData
} from '@/widgets/WmsInOutStockRecord/Models/Service/WmsInOutStockRecordDrawer'
import {
  ElInput,
  ElSelect,
  ElOption,
  ElDatePicker,
  ElForm,
  ElFormItem,
} from 'element-plus'
import { injectModel } from '@/libs/Provider/Provider'
interface RenderTableType {
  url?: string
  dataSource: Ref<any[]>
  isDrag?: boolean
  isChecked?: boolean
  isHidePagination?: boolean
  params?: Record<string, any>
  autoHeight?: boolean
}
export default defineComponent({
  name: 'WmsInOutStockRecord',
  directives: {
    permission: vPermission,
  },
  setup(props, ctx) {
    const {
      dataSource,
      contextMenu,
      dialogConfig,
      dialogConfigForQuery,
      tableRef,
      current,
      search,
      sort,
      headers,
      onError,
      onSearch,
      onRowClick,
      onConfirmWmsInOutStockRecord,
      onCheck,
      onAddWmsInOutStockRecord,
      onAdvancedQuery,
      onExport,
      openDetail,
      onSuccess,
      onBeforeUpload,
    } = useWmsInOutStockRecord(props, ctx)
    //定义高级查询引用
   const wmsInOutStockRecordQueryDrawerRef=ref(null);
    // 新增的查询条件
    const queryForm = ref({
      searchVal: '',
      str_searchFormInputAttrs:[]
    })
    //定义整体模糊查询的列数组(注意:必须大小写跟后端的实体类属性名一致,否则会导致匹配不对的问题)
    const _searchFormInputAttrs = ref([
     'MaterialNo', 'ContainerNo'
    ]);
    const searchFormInputAttrs_Placeholder = ref('请输入物料编码/托盘');
    // 动态枚举选项
    const enumOptions = reactive({
      stockType: [] as Array<{label: string; value: any }>,
    })
    // 获取枚举数据
    const fetchEnumData = async () => {
      try {
        const stockTypeEnumData = await getWmsEnumData({
 EnumName: 'StockTypeEnum',
})
enumOptions.stockType = stockTypeEnumData.map((item) => ({
  label: item.description,
  value: item.value,
}))
      } catch (error) {
        console.error('获取枚举数据失败:', error)
      }
    }
    // 组件挂载时获取枚举数据
    onMounted(() => {
      fetchEnumData()
    })
    // 定义响应式查询数据
    const _curHighQueryData = ref({ searchVal: '',str_searchFormInputAttrs:[] });
    // 新版的查询方法(主页面中的按钮【查询】)
    const handleQueryForMain = async () => {
      _curHighQueryData.value.searchVal = queryForm.value.searchVal;
      _curHighQueryData.value.str_searchFormInputAttrs = _searchFormInputAttrs.value;
      tableRef.value.getList(_curHighQueryData.value)
    }
    // 新版的查询方法(高级查询中的按钮【查询】)
    const handleQuery = async (extraParams = {}) => {
      let filteredData = commonGetHighQueryForm(extraParams);
      commonSaveCurHighQueryData(filteredData);
      tableRef.value.getList(filteredData)
    }
    // 新版的查询重置
    const resetQuery = () => {
      queryForm.value.searchVal = ''
      queryForm.value.str_searchFormInputAttrs=_searchFormInputAttrs.value;
    }
     //新版的导出方法
     const handleExport=()=>{
      onExport(_curHighQueryData.value);
    }
    // 新版的查询弹出框关闭方法
    const closeQuery = (extraParams={}) => {
      let filteredData = commonGetHighQueryForm(extraParams);
      console.log("closeQuery方法");
      console.log(filteredData);
      commonSaveCurHighQueryData(filteredData);
    }
    //保存查询值
    const commonSaveCurHighQueryData=(filteredData={})=>{
      _curHighQueryData.value = { ..._curHighQueryData.value, ...filteredData };
      _curHighQueryData.value.searchVal = queryForm.value.searchVal
      _curHighQueryData.value.str_searchFormInputAttrs =_searchFormInputAttrs.value;
    }
     //获取高级查询弹出框的查询值
     const commonGetHighQueryForm=(extraParams={})=>{
      // 过滤掉 undefined 的值
      let filteredData = Object.assign(
        {},
        ...Object.entries(extraParams).map(([key, value]) =>
          value !== undefined ? { [key]: value } : {}
        )
      )
      //组合模糊查询
      filteredData.searchVal = queryForm.value.searchVal
      filteredData.str_searchFormInputAttrs =_searchFormInputAttrs.value;
      return filteredData;
    }
    /**
     * @returns 表格
     */
    const RenderBaseTable = (props: RenderTableType) => {
      const {
        url,
        dataSource,
        isDrag,
        isChecked,
        isHidePagination,
        params,
        autoHeight,
      } = props
      return (
        <div
          class={{
            [styles.wmsInOutStockRecordList]: true,
          }}
        >
          <BaseTable
            ref={tableRef}
            url={url}
            sortUrlTpl="/api/v1/HIAWms/wmsInOutStockRecord/{id}/adjustsort/{sort}"
            v-model:dataSource={dataSource.value}
            columns={columns}
            contextMenu={contextMenu}
            params={params}
            isDrag={isDrag}
            isChecked={isChecked}
            autoHeight={autoHeight}
            onCheck={onCheck}
            onRowClick={onRowClick}
            isHidePagination={isHidePagination}
            pageSize={20}
            v-slots={{
              name: ({ row }: any) => {
                return row?.name ? (
                  <TdButton
                    onClick={() => openDetail(row)}
                    text={<span style="color:#5a84ff">详情</span>}
                    icon="scale"
                    tip={row?.name}
                    hover
                  >
                    {row?.name}
                  </TdButton>
                ) : (
                  '-'
                )
              },
            }}
          ></BaseTable>
        </div>
      )
    }
    return () => {
      return (
        <div class={styles.wmsInOutStockRecordContent}>
          {/* 添加/编辑 */}
          <WmsInOutStockRecordDrawer
            v-model={dialogConfig.visible}
            title={dialogConfig.title}
            row={current.value}
            sort={sort.value}
            onConfirm={onConfirmWmsInOutStockRecord}
          />
          {/* 高级查询 */}
          <WmsInOutStockRecordQueryDrawer
            ref="wmsInOutStockRecordQueryDrawerRef"
            v-model={dialogConfigForQuery.visible}
            title={dialogConfigForQuery.title}
            row={current.value}
            sort={sort.value}
            onConfirmQuery={handleQuery}
            onRestQuery={resetQuery}
            onClose={closeQuery}
          />
          <div class={styles.headerContent}>
            <div class={styles.header}>
              <IconButton
                v-permission="wmsInOutStockRecord-add"
                icon="add-p"
                onClick={onAddWmsInOutStockRecord}
                type="primary"
              >
                添加
              </IconButton>
              <el-divider direction="vertical" />
              <el-divider direction="vertical" />
              <el-upload
                v-permission="wmsInOutStockRecord-import"
                name="file"
                accept=".xlsx,.xls,.csv"
                show-file-list={false}
                onError={onError}
                onSuccess={onSuccess}
                before-upload={onBeforeUpload}
                headers={headers.value}
                action="/api/v1/HIAWms/wmsInOutStockRecord/import"
              >
                <IconButton icon="in">导入</IconButton>
              </el-upload>
              <IconButton
                v-permission="wmsInOutStockRecord-output"
                icon="out"
                onClick={handleExport}
              >
                导出
              </IconButton>
            </div>
            <ElFormItem style={{ marginTop: '15px' }}>
              <ElFormItem label="关键字">
                <ElInput
                  v-model={queryForm.value.searchVal}
                  placeholder={searchFormInputAttrs_Placeholder.value}
                  clearable
                  class={styles.formItem}
                />
              </ElFormItem>
              <IconButton type="primary" icon="search" onClick={handleQueryForMain}>
                查询
              </IconButton>
import { computed, defineComponent, onMounted, reactive, ref } from 'vue'
import type { Ref } from 'vue'
import BaseTable from '@/components/Table/Table'
import styles from './WmsInOutStockRecord.module.scss'
import { useWmsInOutStockRecord } from '../../../Controllers/WmsInOutStockRecord'
import IconButton from '@/components/IconButton/IconButton'
import WmsInOutStockRecordDrawer from '../Dialog/WmsInOutStockRecordDrawer/WmsInOutStockRecordDrawer'
import WmsInOutStockRecordQueryDrawer from '../Dialog/WmsInOutStockRecordQueryDrawer/WmsInOutStockRecordQueryDrawer'
import Search from '@/components/Search/Search'
import { columns } from './Config'
import TdButton from '@/components/TdButton/TdButton'
import { vPermission } from '@/libs/Permission/Permission'
import { getWmsEnumData } from '@/widgets/WmsInOutStockRecord/Models/Service/WmsInOutStockRecordDrawer'
import dayjs from 'dayjs'
import {
  ElInput,
  ElSelect,
  ElOption,
  ElDatePicker,
  ElForm,
  ElFormItem,
} from 'element-plus'
import { injectModel } from '@/libs/Provider/Provider'
interface RenderTableType {
  url?: string
  dataSource: Ref<any[]>
  isDrag?: boolean
  isChecked?: boolean
  isHidePagination?: boolean
  params?: Record<string, any>
  autoHeight?: boolean
}
export default defineComponent({
  name: 'WmsInOutStockRecord',
  directives: {
    permission: vPermission,
  },
  setup(props, ctx) {
    const {
      dataSource,
      contextMenu,
      dialogConfig,
      dialogConfigForQuery,
      tableRef,
      current,
      search,
      sort,
      headers,
      onError,
      onSearch,
      onRowClick,
      onConfirmWmsInOutStockRecord,
      onCheck,
      onAddWmsInOutStockRecord,
      onAdvancedQuery,
      onExport,
      openDetail,
      onSuccess,
      onBeforeUpload,
    } = useWmsInOutStockRecord(props, ctx)
    //定义高级查询引用
    const wmsInOutStockRecordQueryDrawerRef = ref(null)
    // 新增的查询条件
    const queryForm = ref({
      searchVal: '',
      str_searchFormInputAttrs: [],
    })
    //定义整体模糊查询的列数组(注意:必须大小写跟后端的实体类属性名一致,否则会导致匹配不对的问题)
    const _searchFormInputAttrs = ref(['MaterialNo', 'ContainerNo'])
    const searchFormInputAttrs_Placeholder = ref('请输入物料编码/托盘')
    // 动态枚举选项
    const enumOptions = reactive({
      stockType: [] as Array<{ label: string; value: any }>,
    })
    // 获取枚举数据
    const fetchEnumData = async () => {
      try {
        const stockTypeEnumData = await getWmsEnumData({
          EnumName: 'StockTypeEnum',
        })
        enumOptions.stockType = stockTypeEnumData.map((item) => ({
          label: item.description,
          value: item.value,
        }))
      } catch (error) {
        console.error('获取枚举数据失败:', error)
      }
    }
    // 组件挂载时获取枚举数据
    onMounted(() => {
      fetchEnumData()
    })
    // 定义响应式查询数据
    const _curHighQueryData = ref({
      searchVal: '',
      str_searchFormInputAttrs: [],
    })
    // 新版的查询方法(主页面中的按钮【查询】)
    const handleQueryForMain = async () => {
      _curHighQueryData.value.searchVal = queryForm.value.searchVal
      _curHighQueryData.value.str_searchFormInputAttrs =
        _searchFormInputAttrs.value
      tableRef.value.getList(_curHighQueryData.value)
    }
    // 新版的查询方法(高级查询中的按钮【查询】)
    const handleQuery = async (extraParams = {}) => {
      let filteredData = commonGetHighQueryForm(extraParams)
      commonSaveCurHighQueryData(filteredData)
      tableRef.value.getList(filteredData)
    }
    // 新版的查询重置
    const resetQuery = () => {
      queryForm.value.searchVal = ''
      queryForm.value.str_searchFormInputAttrs = _searchFormInputAttrs.value
    }
    //新版的导出方法
    const handleExport = () => {
      onExport(_curHighQueryData.value)
    }
    // 新版的查询弹出框关闭方法
    const closeQuery = (extraParams = {}) => {
      let filteredData = commonGetHighQueryForm(extraParams)
      console.log('closeQuery方法')
      console.log(filteredData)
      commonSaveCurHighQueryData(filteredData)
    }
    //保存查询值
    const commonSaveCurHighQueryData = (filteredData = {}) => {
      _curHighQueryData.value = { ..._curHighQueryData.value, ...filteredData }
      _curHighQueryData.value.searchVal = queryForm.value.searchVal
      _curHighQueryData.value.str_searchFormInputAttrs =
        _searchFormInputAttrs.value
    }
    //获取高级查询弹出框的查询值
    const commonGetHighQueryForm = (extraParams = {}) => {
      // 过滤掉 undefined 的值
      let filteredData = Object.assign(
        {},
        ...Object.entries(extraParams).map(([key, value]) =>
          value !== undefined ? { [key]: value } : {}
        )
      )
      //组合模糊查询
      filteredData.searchVal = queryForm.value.searchVal
      filteredData.str_searchFormInputAttrs = _searchFormInputAttrs.value
      return filteredData
    }
    /**
     * @returns 表格
     */
    const RenderBaseTable = (props: RenderTableType) => {
      const {
        url,
        dataSource,
        isDrag,
        isChecked,
        isHidePagination,
        params,
        autoHeight,
      } = props
      return (
        <div
          class={{
            [styles.wmsInOutStockRecordList]: true,
          }}
        >
          <BaseTable
            ref={tableRef}
            url={url}
            sortUrlTpl="/api/v1/HIAWms/wmsInOutStockRecord/{id}/adjustsort/{sort}"
            v-model:dataSource={dataSource.value}
            columns={columns}
            contextMenu={contextMenu}
            params={params}
            isDrag={isDrag}
            isChecked={isChecked}
            autoHeight={autoHeight}
            onCheck={onCheck}
            onRowClick={onRowClick}
            isHidePagination={isHidePagination}
            pageSize={20}
            v-slots={{
              creationTime: ({ row }: any) => {
                return (
                  <div>
                    {row.creationTime != null
                      ? dayjs(row.creationTime).format('YYYY-MM-DD HH:mm:ss')
                      : '-'}
                  </div>
                )
              },
              operateTime: ({ row }: any) => {
                return (
                  <div>
                    {row.operateTime != null
                      ? dayjs(row.operateTime).format('YYYY-MM-DD HH:mm:ss')
                      : '-'}
                  </div>
                )
              },
              name: ({ row }: any) => {
                return row?.name ? (
                  <TdButton
                    onClick={() => openDetail(row)}
                    text={<span style="color:#5a84ff">详情</span>}
                    icon="scale"
                    tip={row?.name}
                    hover
                  >
                    {row?.name}
                  </TdButton>
                ) : (
                  '-'
                )
              },
            }}
          ></BaseTable>
        </div>
      )
    }
    return () => {
      return (
        <div class={styles.wmsInOutStockRecordContent}>
          {/* 添加/编辑 */}
          <WmsInOutStockRecordDrawer
            v-model={dialogConfig.visible}
            title={dialogConfig.title}
            row={current.value}
            sort={sort.value}
            onConfirm={onConfirmWmsInOutStockRecord}
          />
          {/* 高级查询 */}
          <WmsInOutStockRecordQueryDrawer
            ref="wmsInOutStockRecordQueryDrawerRef"
            v-model={dialogConfigForQuery.visible}
            title={dialogConfigForQuery.title}
            row={current.value}
            sort={sort.value}
            onConfirmQuery={handleQuery}
            onRestQuery={resetQuery}
            onClose={closeQuery}
          />
          <div class={styles.headerContent}>
            <div class={styles.header}>
              <IconButton
                v-permission="wmsInOutStockRecord-add"
                icon="add-p"
                onClick={onAddWmsInOutStockRecord}
                type="primary"
              >
                添加
              </IconButton>
              <el-divider direction="vertical" />
              <el-divider direction="vertical" />
              {/* <el-upload
                v-permission="wmsInOutStockRecord-import"
                name="file"
                accept=".xlsx,.xls,.csv"
                show-file-list={false}
                onError={onError}
                onSuccess={onSuccess}
                before-upload={onBeforeUpload}
                headers={headers.value}
                action="/api/v1/HIAWms/wmsInOutStockRecord/import"
              >
                <IconButton icon="in">导入</IconButton>
              </el-upload> */}
              <IconButton
                v-permission="wmsInOutStockRecord-output"
                icon="out"
                onClick={handleExport}
              >
                导出
              </IconButton>
            </div>
            <ElFormItem style={{ marginTop: '15px' }}>
              <ElFormItem label="关键字">
                <ElInput
                  v-model={queryForm.value.searchVal}
                  placeholder={searchFormInputAttrs_Placeholder.value}
                  clearable
                  class={styles.formItem}
                />
              </ElFormItem>
              <IconButton
                type="primary"
                icon="search"
                onClick={handleQueryForMain}
              >
                查询
              </IconButton>
              {/* <IconButton style="" icon="refresh" onClick={resetQuery}> 
                重置 
              </IconButton> */}
              <IconButton
                v-permission="wmsInOutStockRecord-add"
                icon="search"
                onClick={onAdvancedQuery}
                type="primary"
              >
                高级查询
              </IconButton>
            </ElFormItem>
          </div>
          <RenderBaseTable
            url="/api/v1/HIAWms/wmsInOutStockRecord/page"
            dataSource={dataSource}
            isChecked={true}
            isDrag={true}
          />
        </div>
      )
    }
  },
})
              </IconButton> */}
              <IconButton
                v-permission="wmsInOutStockRecord-add"
                icon="search"
                onClick={onAdvancedQuery}
                type="primary"
              >
                高级查询
              </IconButton>
            </ElFormItem>
          </div>
          <RenderBaseTable
            url="/api/v1/HIAWms/wmsInOutStockRecord/page"
            dataSource={dataSource}
            isChecked={true}
            isDrag={true}
          />
        </div>
      )
    }
  },
})
HIAWms/web/src/widgets/WmsTask/Controllers/WmsTaskDrawer.tsx
@@ -1,412 +1,425 @@
import {
  ref,
  onMounted,
  reactive,
  computed,
  Ref,
  watch,
  SetupContext,
  h,
} from 'vue'
import { injectModel } from '@/libs/Provider/Provider'
import { WmsTaskDrawer } from '../Models/WmsTaskDrawer'
import { ElMessage } from 'element-plus'
import isEqual from 'lodash/isEqual'
import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
import { cloneDeep } from 'lodash'
export const useWmsTaskDrawer = (props: any, ctx?: any) => {
  const wmsTaskDrawer = injectModel<WmsTaskDrawer>('wmsTaskDrawer')
  /**
   * 用来对比的初始化数据
   */
  const initiateData: Ref<Record<string, any>> = ref({})
  const formData = ref<Record<string, any>>({})
  // ref
  const formRef = ref()
  const disabled = ref(false)
  const current = computed(() => {
    return props.row || null
  })
  const inputNumber = (attrs) => {
    return (
      <el-input-number
        min="1"
        step="1"
        precision="0"
        {...attrs}
      ></el-input-number>
    )
  }
    const datePicker = (attrs) => {
    return (
      <el-date-picker
        type="datetime"
        format="YYYY-MM-DD"
        {...attrs}
      ></el-date-picker>
    )
  }
   const dateTimePicker = (attrs) => {
    return (
      <el-date-picker
        type="datetime"
        format="YYYY-MM-DD HH:mm:ss"
        {...attrs}
      ></el-date-picker>
    )
  }
  const visible = computed({
    get() {
      return props.modelValue
    },
    set(val) {
      ctx.emit('update:modelValue', val)
    },
  })
  /**
   * 添加的form字段
   */
  const formItems = reactive([
                    {
                   label: '任务号',
                   prop: 'taskNo',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入任务号',
              rules: [{required: true, message: '任务号不能为空', trigger: 'blur' }],
                },
                {
                   label: '任务类型',
                   prop: 'taskType',
                   el: 'select',
                   //disabled: disabled,
                   placeholder: '请输入任务类型',
              rules: [{required: true, message: '任务类型不能为空', trigger: 'blur' }],
                },
                {
                   label: '任务等级',
                   prop: 'taskLevel',
                   el: (props: any, { attrs }: SetupContext) => {
                     return h(inputNumber, {
                       ...props,
                       clearable: true,
                       ...attrs,
                     })
                   },
                   width: '100%',
                   step: 1,
                   precision: 0,
                   //disabled: disabled,
                   placeholder: '请输入任务等级',
              rules: [{required: true, message: '任务等级不能为空', trigger: 'blur' }],
                },
                {
                   label: '任务状态',
                   prop: 'taskStatus',
                   el: 'select',
                   //disabled: disabled,
                   placeholder: '请输入任务状态',
              rules: [{required: true, message: '任务状态不能为空', trigger: 'blur' }],
                },
                {
                   label: '托盘编号',
                   prop: 'containerNo',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入托盘编号',
                },
                {
                   label: '起始库位',
                   prop: 'sourcePlace',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入起始库位',
                },
                {
                   label: '目标库位',
                   prop: 'toPlace',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入目标库位',
                },
                {
                   label: '巷道',
                   prop: 'aisle',
                   el: (props: any, { attrs }: SetupContext) => {
                     return h(inputNumber, {
                       ...props,
                       clearable: true,
                       ...attrs,
                     })
                   },
                   width: '100%',
                   step: 1,
                   precision: 0,
                   //disabled: disabled,
                   placeholder: '请输入巷道',
                },
                {
                   label: '堆垛机ID',
                   prop: 'dodeviceId',
                   el: (props: any, { attrs }: SetupContext) => {
                     return h(inputNumber, {
                       ...props,
                       clearable: true,
                       ...attrs,
                     })
                   },
                   width: '100%',
                   step: 1,
                   precision: 0,
                   //disabled: disabled,
                   placeholder: '请输入堆垛机ID',
                },
                {
                   label: '设备类型',
                   prop: 'dodevicetype',
                   el: (props: any, { attrs }: SetupContext) => {
                     return h(inputNumber, {
                       ...props,
                       clearable: true,
                       ...attrs,
                     })
                   },
                   width: '100%',
                   step: 1,
                   precision: 0,
                   //disabled: disabled,
                   placeholder: '请输入设备类型',
              rules: [{required: true, message: '设备类型不能为空', trigger: 'blur' }],
                },
                {
                   label: '设备任务状态',
                   prop: 'taskDodeviceStatus',
                   el: (props: any, { attrs }: SetupContext) => {
                     return h(inputNumber, {
                       ...props,
                       clearable: true,
                       ...attrs,
                     })
                   },
                   width: '100%',
                   step: 1,
                   precision: 0,
                   //disabled: disabled,
                   placeholder: '请输入设备任务状态',
              rules: [{required: true, message: '设备任务状态不能为空', trigger: 'blur' }],
                },
                {
                   label: 'WCS是否可以读取',
                   prop: 'isRead',
                   el: 'select',
                   //disabled: disabled,
                   placeholder: '请输入WCS是否可以读取',
              rules: [{required: true, message: 'WCS是否可以读取不能为空', trigger: 'blur' }],
                 options: [{label: '是',value: 'true'}, {label: '否',value: 'false'}]
                },
                {
                   label: '子任务类型',
                   prop: 'sonTaskType',
                   el: 'select',
                   //disabled: disabled,
                   placeholder: '请输入子任务类型',
                },
                {
                   label: '来源单据号',
                   prop: 'sourceOrderNo',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入来源单据号',
                },
                {
                   label: '下个任务是否生成成功',
                   prop: 'isNextTask',
                   el: (props: any, { attrs }: SetupContext) => {
                     return h(inputNumber, {
                       ...props,
                       clearable: true,
                       ...attrs,
                     })
                   },
                   width: '100%',
                   step: 1,
                   precision: 0,
                   //disabled: disabled,
                   placeholder: '请输入下个任务是否生成成功',
                },
                {
                   label: '可变变量1',
                   prop: 'mutableParam1',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入可变变量1',
                },
                {
                   label: '可变变量2',
                   prop: 'mutableParam2',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入可变变量2',
                },
                {
                   label: '可变变量3',
                   prop: 'mutableParam3',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入可变变量3',
                },
  ])
  /**
   * 校验是否有数据变化
   */
  const checkIsEqualObject = () => {
    const data = {
      formData: formData.value,
    }
    const check = isEqual(initiateData.value, data)
    return check
  }
  const onClose = (done: () => void) => {
    if (visible.value) {
      if (checkIsEqualObject()) {
        visible.value = false
        done && done()
      } else {
        ConfirmBox('是否保存设置?')
          .then(() => {
            onConfirm()
          })
          .catch(() => {
            visible.value = false
            done && done()
          })
      }
    }
  }
  /**
   * 保存
   */
  const onConfirm = async () => {
    await formRef.value?.validate()
    const data = {
      taskNo: formData.value.taskNo,
taskType: formData.value.taskType,
taskLevel: formData.value.taskLevel,
taskStatus: formData.value.taskStatus,
containerNo: formData.value.containerNo,
sourcePlace: formData.value.sourcePlace,
toPlace: formData.value.toPlace,
aisle: formData.value.aisle,
dodeviceId: formData.value.dodeviceId,
dodevicetype: formData.value.dodevicetype,
taskDodeviceStatus: formData.value.taskDodeviceStatus,
isRead: formData.value.isRead,
sonTaskType: formData.value.sonTaskType,
sourceOrderNo: formData.value.sourceOrderNo,
isNextTask: formData.value.isNextTask,
mutableParam1: formData.value.mutableParam1,
mutableParam2: formData.value.mutableParam2,
mutableParam3: formData.value.mutableParam3,
    }
    if (!current.value) {
      await wmsTaskDrawer.addWmsTask(data)
    } else {
      const id = current.value.id
      await wmsTaskDrawer.updateWmsTask(id, data)
    }
    ElMessage.success('保存成功')
    ctx.emit('confirm')
  }
  const updateCheckData = () => {
    initiateData.value = {
      formData: {
        ...formData.value,
      },
    }
  }
  const updateFormItemOptions = (propName: string, enumData: any[]) => {
    const item = formItems.find((item) => item.prop === propName)
    if (item && enumData) {
      item.options = enumData.map((item) => ({
        label: item.description,
        value: item.value,
      }))
    }
  }
  /**
   * 通用查询枚举
   */
  const commonQueryEnumForFrom = async () => {
    const taskTypeEnumEnum = await wmsTaskDrawer.getWmsEnumData({
 EnumName: 'TaskTypeEnum',
})
updateFormItemOptions('taskType', taskTypeEnumEnum)
const wmsTaskStatusEnum = await wmsTaskDrawer.getWmsEnumData({
 EnumName: 'WmsTaskStatus',
})
updateFormItemOptions('taskStatus', wmsTaskStatusEnum)
const sonTaskTypeEnumEnum = await wmsTaskDrawer.getWmsEnumData({
 EnumName: 'SonTaskTypeEnum',
})
updateFormItemOptions('sonTaskType', sonTaskTypeEnumEnum)
  }
  commonQueryEnumForFrom()
  /**
   * 弹窗打开获取详情
   */
  const onOpen = async () => {
    if (current.value) {
      const res = await wmsTaskDrawer.getWmsTaskDetail(current.value)
      formData.value = {
        taskNo: res.taskNo,
taskType: res.taskType,
taskLevel: res.taskLevel,
taskStatus: res.taskStatus,
containerNo: res.containerNo,
sourcePlace: res.sourcePlace,
toPlace: res.toPlace,
aisle: res.aisle,
dodeviceId: res.dodeviceId,
dodevicetype: res.dodevicetype,
taskDodeviceStatus: res.taskDodeviceStatus,
isRead: res.isRead,
sonTaskType: res.sonTaskType,
sourceOrderNo: res.sourceOrderNo,
isNextTask: res.isNextTask,
mutableParam1: res.mutableParam1,
mutableParam2: res.mutableParam2,
mutableParam3: res.mutableParam3,
        id: res.id,
      }
      disabled.value = true
      updateCheckData()
    } else {
      formData.value = {}
      disabled.value = false
      updateCheckData()
    }
  }
  watch(() => current.value, onOpen)
  return {
    formItems,
    formData,
    visible,
    formRef,
    onOpen,
    onClose,
    onConfirm,
  }
}
import {
  ref,
  onMounted,
  reactive,
  computed,
  Ref,
  watch,
  SetupContext,
  h,
} from 'vue'
import { injectModel } from '@/libs/Provider/Provider'
import { WmsTaskDrawer } from '../Models/WmsTaskDrawer'
import { ElMessage } from 'element-plus'
import isEqual from 'lodash/isEqual'
import { ConfirmBox } from '@/components/ConfirmBox/ConfirmBox'
import { cloneDeep } from 'lodash'
export const useWmsTaskDrawer = (props: any, ctx?: any) => {
  const wmsTaskDrawer = injectModel<WmsTaskDrawer>('wmsTaskDrawer')
  /**
   * 用来对比的初始化数据
   */
  const initiateData: Ref<Record<string, any>> = ref({})
  const formData = ref<Record<string, any>>({})
  // ref
  const formRef = ref()
  const disabled = ref(false)
  const current = computed(() => {
    return props.row || null
  })
  const inputNumber = (attrs) => {
    return (
      <el-input-number
        min="1"
        step="1"
        precision="0"
        {...attrs}
      ></el-input-number>
    )
  }
  const datePicker = (attrs) => {
    return (
      <el-date-picker
        type="datetime"
        format="YYYY-MM-DD"
        {...attrs}
      ></el-date-picker>
    )
  }
  const dateTimePicker = (attrs) => {
    return (
      <el-date-picker
        type="datetime"
        format="YYYY-MM-DD HH:mm:ss"
        {...attrs}
      ></el-date-picker>
    )
  }
  const visible = computed({
    get() {
      return props.modelValue
    },
    set(val) {
      ctx.emit('update:modelValue', val)
    },
  })
  /**
   * 添加的form字段
   */
  const formItems = reactive([
    {
      label: '任务号',
      prop: 'taskNo',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入任务号',
      rules: [{ required: true, message: '任务号不能为空', trigger: 'blur' }],
    },
    {
      label: '任务类型',
      prop: 'taskType',
      el: 'select',
      //disabled: disabled,
      placeholder: '请输入任务类型',
      rules: [{ required: true, message: '任务类型不能为空', trigger: 'blur' }],
    },
    {
      label: '子任务类型',
      prop: 'sonTaskType',
      el: 'select',
      //disabled: disabled,
      placeholder: '请输入子任务类型',
    },
    {
      label: '任务等级',
      prop: 'taskLevel',
      el: (props: any, { attrs }: SetupContext) => {
        return h(inputNumber, {
          ...props,
          clearable: true,
          ...attrs,
        })
      },
      width: '100%',
      step: 1,
      precision: 0,
      //disabled: disabled,
      placeholder: '请输入任务等级',
      rules: [{ required: true, message: '任务等级不能为空', trigger: 'blur' }],
    },
    {
      label: '任务状态',
      prop: 'taskStatus',
      el: 'select',
      options: [],
      //disabled: disabled,
      placeholder: '请输入任务状态',
      rules: [{ required: true, message: '任务状态不能为空', trigger: 'blur' }],
    },
    {
      label: '托盘编号',
      prop: 'containerNo',
      el: 'input',
      rules: [{ required: true, message: '托盘编号不能为空', trigger: 'blur' }],
      //disabled: disabled,
      placeholder: '请输入托盘编号',
    },
    {
      label: '起始库位',
      prop: 'sourcePlace',
      el: 'input',
      //disabled: disabled,
      rules: [{ required: true, message: '起始库位不能为空', trigger: 'blur' }],
      placeholder: '请输入起始库位',
    },
    {
      label: '目标库位',
      prop: 'toPlace',
      el: 'input',
      //disabled: disabled,
      rules: [{ required: true, message: '目标库位不能为空', trigger: 'blur' }],
      placeholder: '请输入目标库位',
    },
    {
      label: '巷道',
      prop: 'aisle',
      el: (props: any, { attrs }: SetupContext) => {
        return h(inputNumber, {
          ...props,
          clearable: true,
          ...attrs,
        })
      },
      width: '100%',
      step: 1,
      precision: 0,
      rules: [{ required: true, message: '巷道不能为空', trigger: 'blur' }],
      //disabled: disabled,
      placeholder: '请输入巷道',
    },
    {
      label: '堆垛机ID',
      prop: 'dodeviceId',
      el: (props: any, { attrs }: SetupContext) => {
        return h(inputNumber, {
          ...props,
          clearable: true,
          ...attrs,
        })
      },
      width: '100%',
      step: 1,
      precision: 0,
      rules: [{ required: true, message: '堆垛机ID不能为空', trigger: 'blur' }],
      //disabled: disabled,
      placeholder: '请输入堆垛机ID',
    },
    {
      label: '设备类型',
      prop: 'dodevicetype',
      el: 'select',
      options: [],
      width: '100%',
      //disabled: disabled,
      placeholder: '请输入设备类型',
      rules: [{ required: true, message: '设备类型不能为空', trigger: 'blur' }],
    },
    {
      label: '设备任务状态',
      prop: 'taskDodeviceStatus',
      el: 'select',
      options: [],
      width: '100%',
      //disabled: disabled,
      placeholder: '请输入设备任务状态',
      rules: [
        { required: true, message: '设备任务状态不能为空', trigger: 'blur' },
      ],
    },
    {
      label: 'WCS是否可以读取',
      prop: 'isRead',
      el: 'select',
      //disabled: disabled,
      placeholder: '请输入WCS是否可以读取',
      rules: [
        { required: true, message: 'WCS是否可以读取不能为空', trigger: 'blur' },
      ],
      options: [
        { label: '是', value: true },
        { label: '否', value: false },
      ],
    },
    {
      label: '来源单据号',
      prop: 'sourceOrderNo',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入来源单据号',
    },
    {
      label: '下个任务是否生成',
      prop: 'isNextTask',
      el: (props: any, { attrs }: SetupContext) => {
        return h(inputNumber, {
          ...props,
          clearable: true,
          ...attrs,
        })
      },
      width: '100%',
      step: 1,
      precision: 0,
      //disabled: disabled,
      placeholder: '请输入下个任务是否生成成功',
    },
    {
      label: '可变变量1',
      prop: 'mutableParam1',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入可变变量1',
    },
    {
      label: '可变变量2',
      prop: 'mutableParam2',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入可变变量2',
    },
    {
      label: '可变变量3',
      prop: 'mutableParam3',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入可变变量3',
    },
  ])
  /**
   * 校验是否有数据变化
   */
  const checkIsEqualObject = () => {
    const data = {
      formData: formData.value,
    }
    const check = isEqual(initiateData.value, data)
    return check
  }
  const onClose = (done: () => void) => {
    if (visible.value) {
      if (checkIsEqualObject()) {
        visible.value = false
        done && done()
      } else {
        ConfirmBox('是否保存设置?')
          .then(() => {
            onConfirm()
          })
          .catch(() => {
            visible.value = false
            done && done()
          })
      }
    }
  }
  /**
   * 保存
   */
  const onConfirm = async () => {
    await formRef.value?.validate()
    const data = {
      taskNo: formData.value.taskNo,
      taskType: formData.value.taskType,
      taskLevel: formData.value.taskLevel,
      taskStatus: formData.value.taskStatus,
      containerNo: formData.value.containerNo,
      sourcePlace: formData.value.sourcePlace,
      toPlace: formData.value.toPlace,
      aisle: formData.value.aisle,
      dodeviceId: formData.value.dodeviceId,
      dodevicetype: formData.value.dodevicetype,
      taskDodeviceStatus: formData.value.taskDodeviceStatus,
      isRead: formData.value.isRead,
      sonTaskType: formData.value.sonTaskType,
      sourceOrderNo: formData.value.sourceOrderNo,
      isNextTask: formData.value.isNextTask,
      mutableParam1: formData.value.mutableParam1,
      mutableParam2: formData.value.mutableParam2,
      mutableParam3: formData.value.mutableParam3,
    }
    if (!current.value) {
      await wmsTaskDrawer.addWmsTask(data)
    } else {
      const id = current.value.id
      await wmsTaskDrawer.updateWmsTask(id, data)
    }
    ElMessage.success('保存成功')
    ctx.emit('confirm')
  }
  const updateCheckData = () => {
    initiateData.value = {
      formData: {
        ...formData.value,
      },
    }
  }
  const updateFormItemOptions = (propName: string, enumData: any[]) => {
    const item = formItems.find((item) => item.prop === propName)
    if (item && enumData) {
      item.options = enumData.map((item) => ({
        label: item.description,
        value: item.value,
      }))
    }
  }
  /**
   * 通用查询枚举
   */
  const commonQueryEnumForFrom = async () => {
    const taskTypeEnumEnum = await wmsTaskDrawer.getWmsEnumData({
      EnumName: 'TaskTypeEnum',
    })
    updateFormItemOptions('taskType', taskTypeEnumEnum)
    const wmsTaskStatusEnum = await wmsTaskDrawer.getWmsEnumData({
      EnumName: 'WmsTaskStatus',
    })
    updateFormItemOptions('taskStatus', wmsTaskStatusEnum)
    const sonTaskTypeEnumEnum = await wmsTaskDrawer.getWmsEnumData({
      EnumName: 'SonTaskTypeEnum',
    })
    updateFormItemOptions('sonTaskType', sonTaskTypeEnumEnum)
    const dodevicetypeEnum = await wmsTaskDrawer.getWmsEnumData({
      EnumName: 'DodevicetypeEnum',
    })
    updateFormItemOptions('dodevicetype', dodevicetypeEnum)
    const taskDodeviceStatus = await wmsTaskDrawer.getWmsEnumData({
      EnumName: 'TaskDodeviceStatus',
    })
    updateFormItemOptions('taskDodeviceStatus', taskDodeviceStatus)
  }
  commonQueryEnumForFrom()
  /**
   * 弹窗打开获取详情
   */
  const onOpen = async () => {
    if (current.value) {
      const res = await wmsTaskDrawer.getWmsTaskDetail(current.value)
      formData.value = {
        taskNo: res.taskNo,
        taskType: res.taskType,
        taskLevel: res.taskLevel,
        taskStatus: res.taskStatus,
        containerNo: res.containerNo,
        sourcePlace: res.sourcePlace,
        toPlace: res.toPlace,
        aisle: res.aisle,
        dodeviceId: res.dodeviceId,
        dodevicetype: res.dodevicetype,
        taskDodeviceStatus: res.taskDodeviceStatus,
        isRead: res.isRead,
        sonTaskType: res.sonTaskType,
        sourceOrderNo: res.sourceOrderNo,
        isNextTask: res.isNextTask,
        mutableParam1: res.mutableParam1,
        mutableParam2: res.mutableParam2,
        mutableParam3: res.mutableParam3,
        id: res.id,
      }
      disabled.value = true
      updateCheckData()
    } else {
      formData.value = {
        taskDodeviceStatus: 1,
        isRead: true,
        isNextTask: 1,
        taskStatus: 1,
      }
      disabled.value = false
      updateCheckData()
    }
  }
  watch(() => current.value, onOpen)
  return {
    formItems,
    formData,
    visible,
    formRef,
    onOpen,
    onClose,
    onConfirm,
  }
}
HIAWms/web/src/widgets/WmsTask/Controllers/WmsTaskQueryDrawer.tsx
@@ -239,7 +239,7 @@
      step: 1,
      precision: 0,
      //disabled: disabled,
      placeholder: '请输入下个任务是否生成成功',
      placeholder: '请输入下个任务是否生成',
    },
    {
      label: '可变变量1',
HIAWms/web/src/widgets/WmsTask/Views/Pages/Dialog/WmsTaskDrawer/WmsTaskDrawer.tsx
@@ -1,61 +1,61 @@
import { SetupContext, defineComponent } from 'vue'
import BaseDrawer from '@/components/BaseDrawer/BaseDrawer'
import styles from './WmsTaskDrawer.module.scss'
import { useWmsTaskDrawer } from '../../../../Controllers/WmsTaskDrawer.tsx'
import DyForm from '@/components/DyForm/DyForm'
// @ts-ignore
export default defineComponent<{
  [key: string]: any
}>({
  name: '弹窗',
  props: {
    modelValue: {
      type: Boolean,
      default: false,
    },
    title: {
      type: String,
      default: '',
    },
    row: {
      type: Object,
    },
    sort: {
      type: Number,
      default: 0,
    },
  },
  emits: ['update:modelValue', 'close', 'submit', 'confirm'],
  setup(props: Record<string, any>, ctx: SetupContext) {
    const {
      onClose,
      onConfirm,
      onOpen,
      formRef,
      visible,
      formItems,
      formData,
    } = useWmsTaskDrawer(props, ctx)
    return () => (
      <BaseDrawer
        class={styles.drawer}
        size="800px"
        title={props.title || '添加'}
        v-model={visible.value}
        close-on-click-modal={true}
        onConfirm={onConfirm}
        onOpen={onOpen}
        before-close={onClose}
        onClose={onClose}
      >
        <DyForm
          ref={formRef}
          formData={formData.value}
          labelWidth="106px"
          formItemProps={formItems}
        ></DyForm>
      </BaseDrawer>
    )
  },
})
import { SetupContext, defineComponent } from 'vue'
import BaseDrawer from '@/components/BaseDrawer/BaseDrawer'
import styles from './WmsTaskDrawer.module.scss'
import { useWmsTaskDrawer } from '../../../../Controllers/WmsTaskDrawer.tsx'
import DyForm from '@/components/DyForm/DyForm'
// @ts-ignore
export default defineComponent<{
  [key: string]: any
}>({
  name: '弹窗',
  props: {
    modelValue: {
      type: Boolean,
      default: false,
    },
    title: {
      type: String,
      default: '',
    },
    row: {
      type: Object,
    },
    sort: {
      type: Number,
      default: 0,
    },
  },
  emits: ['update:modelValue', 'close', 'submit', 'confirm'],
  setup(props: Record<string, any>, ctx: SetupContext) {
    const {
      onClose,
      onConfirm,
      onOpen,
      formRef,
      visible,
      formItems,
      formData,
    } = useWmsTaskDrawer(props, ctx)
    return () => (
      <BaseDrawer
        class={styles.drawer}
        size="800px"
        title={props.title || '添加'}
        v-model={visible.value}
        close-on-click-modal={true}
        onConfirm={onConfirm}
        onOpen={onOpen}
        before-close={onClose}
        onClose={onClose}
      >
        <DyForm
          ref={formRef}
          formData={formData.value}
          labelWidth="150px"
          formItemProps={formItems}
        ></DyForm>
      </BaseDrawer>
    )
  },
})
HIAWms/web/src/widgets/WmsTask/Views/Pages/Dialog/WmsTaskQueryDrawer/WmsTaskQueryDrawer.tsx
@@ -1,71 +1,71 @@
/*
 * 物料基础信息查询弹出框
*/
import { SetupContext, defineComponent } from 'vue'
import BaseQueryDrawer from '@/components/BaseQueryDrawer/BaseQueryDrawer'
import styles from './WmsTaskQueryDrawer.module.scss'
import { useWmsTaskQueryDrawer } from '../../../../Controllers/WmsTaskQueryDrawer.tsx'
import DyForm from '@/components/DyForm/DyForm'
// @ts-ignore
export default defineComponent<{
  [key: string]: any
}>({
  name: '弹窗',
  props: {
    //枚举类型字典
    enumListDict:{
      type: Array as () => Array<{ key: string; value: object }>, // 定义数组元素类型
      default: () => [] // 默认值
    },
    modelValue: {
      type: Boolean,
      default: false,
    },
    title: {
      type: String,
      default: '',
    },
    row: {
      type: Object,
    },
    sort: {
      type: Number,
      default: 0,
    },
  },
  emits: ['update:modelValue', 'close', 'submit', 'confirmquery1'],
  setup(props: Record<string, any>, ctx: SetupContext) {
    const {
      onClose,
      onConfirmQuery,
      onOpen,
      onReset,
      formRef,
      visible,
      formItems,
      formData,
    } = useWmsTaskQueryDrawer(props, ctx)
    return () => (
      <BaseQueryDrawer
        class={styles.drawer}
        size="800px"
        title={props.title || '高级查询'}
        v-model={visible.value}
        close-on-click-modal={true}
        onReset={onReset}
        onConfirmQueryForBase={onConfirmQuery}
        onOpen={onOpen}
        before-close={onClose}
        onClose={onClose}
      >
        <DyForm
          ref={formRef}
          formData={formData.value}
          labelWidth="106px"
          formItemProps={formItems}
        ></DyForm>
      </BaseQueryDrawer>
    )
  },
})
/*
 * 物料基础信息查询弹出框
 */
import { SetupContext, defineComponent } from 'vue'
import BaseQueryDrawer from '@/components/BaseQueryDrawer/BaseQueryDrawer'
import styles from './WmsTaskQueryDrawer.module.scss'
import { useWmsTaskQueryDrawer } from '../../../../Controllers/WmsTaskQueryDrawer.tsx'
import DyForm from '@/components/DyForm/DyForm'
// @ts-ignore
export default defineComponent<{
  [key: string]: any
}>({
  name: '弹窗',
  props: {
    //枚举类型字典
    enumListDict: {
      type: Array as () => Array<{ key: string; value: object }>, // 定义数组元素类型
      default: () => [], // 默认值
    },
    modelValue: {
      type: Boolean,
      default: false,
    },
    title: {
      type: String,
      default: '',
    },
    row: {
      type: Object,
    },
    sort: {
      type: Number,
      default: 0,
    },
  },
  emits: ['update:modelValue', 'close', 'submit', 'confirmquery1'],
  setup(props: Record<string, any>, ctx: SetupContext) {
    const {
      onClose,
      onConfirmQuery,
      onOpen,
      onReset,
      formRef,
      visible,
      formItems,
      formData,
    } = useWmsTaskQueryDrawer(props, ctx)
    return () => (
      <BaseQueryDrawer
        class={styles.drawer}
        size="800px"
        title={props.title || '高级查询'}
        v-model={visible.value}
        close-on-click-modal={true}
        onReset={onReset}
        onConfirmQueryForBase={onConfirmQuery}
        onOpen={onOpen}
        before-close={onClose}
        onClose={onClose}
      >
        <DyForm
          ref={formRef}
          formData={formData.value}
          labelWidth="150px"
          formItemProps={formItems}
        ></DyForm>
      </BaseQueryDrawer>
    )
  },
})
HIAWms/web/src/widgets/WmsTask/Views/Pages/WmsTask/Config.ts
@@ -13,6 +13,10 @@
    title: '任务类型',
  },
  {
    field: 'sonTaskTypeDesc',
    title: '子任务类型',
  },
  {
    field: 'taskStatusDesc',
    title: '任务状态',
  },
@@ -37,20 +41,16 @@
  //   title: '堆垛机ID',
  // },
  {
    field: 'dodevicetype',
    field: 'dodevicetypeDesc',
    title: '设备类型',
  },
  {
    field: 'taskDodeviceStatus',
    field: 'taskDodeviceStatusDesc',
    title: '设备状态',
  },
  {
    field: 'isRead',
    title: 'WCS可读取',
  },
  {
    field: 'sonTaskTypeDesc',
    title: '子任务类型',
  },
  {
    field: 'sourceOrderNo',
@@ -83,5 +83,6 @@
  {
    field: 'creationTime',
    title: '创建时间',
    width: 180,
  },
]
HIAWms/web/src/widgets/WmsTask/Views/Pages/WmsTask/WmsTask.tsx
@@ -278,7 +278,7 @@
              <el-divider direction="vertical" />
              <el-divider direction="vertical" />
              <el-upload
              {/* <el-upload
                v-permission="wmsTask-import"
                name="file"
                accept=".xlsx,.xls,.csv"
@@ -290,15 +290,15 @@
                action="/api/v1/HIAWms/wmsTask/import"
              >
                <IconButton icon="in">导入</IconButton>
              </el-upload>
              </el-upload> */}
              <IconButton
              {/* <IconButton
                v-permission="wmsTask-output"
                icon="out"
                onClick={handleExport}
              >
                导出
              </IconButton>
              </IconButton> */}
            </div>
            <ElFormItem style={{ marginTop: '15px' }}>
              <ElFormItem label="关键字">