zs
2025-05-06 2fd8242a14241beba63e71c6f4222b702f0e2f30
wwww
已添加3个文件
已修改12个文件
1539 ■■■■■ 文件已修改
CommonDLL/CmsQueryExtensions.dll 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsAreas/WmsAreaDto.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsEnumAppService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsEnumAppService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/CMS.Plugin.HIAWms.Domain.Shared.csproj 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/Enums/YesNoEnum.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/Util/ExportHelper.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsTask/Controllers/WmsTaskDrawer.tsx 665 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HIAWms/web/src/widgets/WmsTask/Views/Pages/WmsTask/WmsTask.tsx 646 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/AppService/AppService模板.txt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/Entity/Dto模板.txt 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/queryExtensions/CmsQueryExtensions/Utils/EnumHelper.cs 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/queryExtensions/CmsQueryExtensions/Utils/ExportHelper.cs 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/queryExtensions/CmsQueryExtensions/Utils/GetEnumDescriptionUtil.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CommonDLL/CmsQueryExtensions.dll
Binary files differ
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsAreas/WmsAreaDto.cs
@@ -1,4 +1,5 @@
using CMS.Plugin.HIAWms.Domain.Shared.Enums;
using CmsQueryExtensions;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Entities;
HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsEnumAppService.cs
@@ -1,6 +1,7 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsEnumDto;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsStores;
using CMS.Plugin.HIAWms.Domain.Shared.Util;
using CmsQueryExtensions;
using System;
using System.Collections.Generic;
using System.Linq;
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsEnumAppService.cs
@@ -1,10 +1,10 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsEnumDto;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsStores;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared.Util;
using CMS.Plugin.HIAWms.Domain.WmsAreas;
using CMS.Plugin.HIAWms.Domain.WmsPlaces;
using CMS.Plugin.HIAWms.Domain.WmsStores;
using CmsQueryExtensions;
using System;
using System.Collections.Generic;
using System.Linq;
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs
@@ -1,21 +1,19 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Domain.Shared;
using CMS.Plugin.HIAWms.Domain.Shared.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Domain.WmsAreas;
using CMS.Plugin.HIAWms.Domain.WmsContainers;
using CMS.Plugin.HIAWms.Domain.WmsMaterials;
using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks;
using CMS.Plugin.HIAWms.Domain.WmsPlaces;
using CmsQueryExtensions;
using Microsoft.Extensions.DependencyInjection;
using System.Text.Json;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
using CMS.Plugin.HIAWms.Domain.Shared.Util;
using CMS.Plugin.HIAWms.Domain.WmsMaterials;
using CMS.Plugin.HIAWms.Domain.WmsContainers;
using CMS.Plugin.HIAWms.Domain.WmsPlaces;
using CMS.Plugin.HIAWms.Domain.WmsAreas;
using Volo.Abp.Uow;
using Microsoft.Extensions.DependencyInjection;
using NPOI.POIFS.Storage;
using System.Text.Json;
namespace CMS.Plugin.HIAWms.Application.Implements;
HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/CMS.Plugin.HIAWms.Domain.Shared.csproj
@@ -21,8 +21,18 @@
    </ItemGroup>
    <ItemGroup>
      <Compile Remove="Util\EnumHelper.cs" />
      <Compile Remove="Util\ExportHelper.cs" />
      <Compile Remove="Util\GetEnumDescriptionUtil.cs" />
    </ItemGroup>
    <ItemGroup>
        <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
        <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="6.0.20" />
    </ItemGroup>
    <ItemGroup>
      <Folder Include="Util\" />
    </ItemGroup>
</Project>
HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/Enums/YesNoEnum.cs
@@ -14,15 +14,16 @@
    public enum YesNoEnum
    {
        /// <summary>
        /// å¦
        /// </summary>
        [Description("否")]
        N = 0,
        /// <summary>
        /// æ˜¯
        /// </summary>
        [Description("是")]
        Y = 1,
        /// <summary>
        /// å¦
        /// </summary>
        [Description("否")]
        N = 2
    }
}
HIAWms/server/src/CMS.Plugin.HIAWms.Domain.Shared/Util/ExportHelper.cs
@@ -12,6 +12,14 @@
    /// </summary>
    public static class ExportHelper
    {
        // æ‰¹é‡è½¬æ¢æ–¹æ³•
        public static List<Dictionary<string, object>> ConvertListToExportData<T>(IEnumerable<T> list)
        {
            return list.Select(ConvertToExportData).ToList();
        }
        // é€šç”¨è½¬æ¢æ–¹æ³•(兼容 Func<T, Dictionary<string, object>>)
        public static Dictionary<string, object> ConvertToExportData<T>(T entity)
        {
@@ -24,12 +32,6 @@
                dict[prop.Name] = FormatValue(value);
            }
            return dict;
        }
        // æ‰¹é‡è½¬æ¢æ–¹æ³•
        public static List<Dictionary<string, object>> ConvertListToExportData<T>(IEnumerable<T> list)
        {
            return list.Select(ConvertToExportData).ToList();
        }
        private static object FormatValue(object value)
@@ -47,13 +49,5 @@
            return value;
        }
        private static string GetEnumDescription(Enum value)
        {
            var fieldInfo = value.GetType().GetField(value.ToString());
            var description = fieldInfo?
                .GetCustomAttributes(typeof(DescriptionAttribute), false)
                .FirstOrDefault() as DescriptionAttribute;
            return description?.Description ?? value.ToString();
        }
    }
}
HIAWms/web/src/widgets/WmsTask/Controllers/WmsTaskDrawer.tsx
@@ -1,332 +1,333 @@
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 visible = computed({
    get() {
      return props.modelValue
    },
    set(val) {
      ctx.emit('update:modelValue', val)
    },
  })
  /**
   * æ·»åŠ çš„form字段
   */
  const formItems = reactive([
                    {
                   label: '巷道',
                   prop: 'aisle',
                   //disabled: disabled,
                   placeholder: '请输入巷道',
                },
                {
                   label: '托盘编号',
                   prop: 'containerNo',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入托盘编号',
                },
                {
                   label: '堆垛机ID',
                   prop: 'dodeviceId',
                   //disabled: disabled,
                   placeholder: '请输入堆垛机ID',
                },
                {
                   label: '设备类型',
                   prop: 'dodevicetype',
                   //disabled: disabled,
                   placeholder: '请输入设备类型',
              rules: [{required: true, message: '设备类型不能为空', trigger: 'blur' }],
                },
                {
                   label: '下个任务是否生成成功',
                   prop: 'isNextTask',
                   //disabled: disabled,
                   placeholder: '请输入下个任务是否生成成功',
                },
                {
                   label: 'WCS是否可以读取',
                   prop: 'isRead',
                   el: 'select',
                   //disabled: disabled,
                   placeholder: '请输入WCS是否可以读取',
              rules: [{required: true, message: 'WCS是否可以读取不能为空', trigger: 'blur' }],
                },
                {
                   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',
                },
                {
                   label: '子任务类型',
                   prop: 'sonTaskType',
                   el: 'select',
                   //disabled: disabled,
                   placeholder: '请输入子任务类型',
                },
                {
                   label: '来源单据号',
                   prop: 'sourceOrderNo',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入来源单据号',
                },
                {
                   label: '起始库位',
                   prop: 'sourcePlace',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入起始库位',
                },
                {
                   label: '设备任务状态',
                   prop: 'taskDodeviceStatus',
                   //disabled: disabled,
                   placeholder: '请输入设备任务状态',
              rules: [{required: true, message: '设备任务状态不能为空', trigger: 'blur' }],
                },
                {
                   label: '任务等级',
                   prop: 'taskLevel',
                   //disabled: disabled,
                   placeholder: '请输入任务等级',
              rules: [{required: true, message: '任务等级不能为空', trigger: 'blur' }],
                },
                {
                   label: '任务号',
                   prop: 'taskNo',
                   el: 'input',
                   //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: 'taskType',
                   el: 'select',
                   //disabled: disabled,
                   placeholder: '请输入任务类型',
              rules: [{required: true, message: '任务类型不能为空', trigger: 'blur' }],
                },
                {
                   label: '目标库位',
                   prop: 'toPlace',
                   el: 'input',
                   //disabled: disabled,
                   placeholder: '请输入目标库位',
                },
  ])
  /**
   * æ ¡éªŒæ˜¯å¦æœ‰æ•°æ®å˜åŒ–
   */
  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 = {
      aisle: formData.value.aisle,
containerNo: formData.value.containerNo,
dodeviceId: formData.value.dodeviceId,
dodevicetype: formData.value.dodevicetype,
isNextTask: formData.value.isNextTask,
isRead: formData.value.isRead,
mutableParam1: formData.value.mutableParam1,
mutableParam2: formData.value.mutableParam2,
mutableParam3: formData.value.mutableParam3,
sonTaskType: formData.value.sonTaskType,
sourceOrderNo: formData.value.sourceOrderNo,
sourcePlace: formData.value.sourcePlace,
taskDodeviceStatus: formData.value.taskDodeviceStatus,
taskLevel: formData.value.taskLevel,
taskNo: formData.value.taskNo,
taskStatus: formData.value.taskStatus,
taskType: formData.value.taskType,
toPlace: formData.value.toPlace,
    }
    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 = {
        aisle: res.aisle,
containerNo: res.containerNo,
dodeviceId: res.dodeviceId,
dodevicetype: res.dodevicetype,
isNextTask: res.isNextTask,
isRead: res.isRead,
mutableParam1: res.mutableParam1,
mutableParam2: res.mutableParam2,
mutableParam3: res.mutableParam3,
sonTaskType: res.sonTaskType,
sourceOrderNo: res.sourceOrderNo,
sourcePlace: res.sourcePlace,
taskDodeviceStatus: res.taskDodeviceStatus,
taskLevel: res.taskLevel,
taskNo: res.taskNo,
taskStatus: res.taskStatus,
taskType: res.taskType,
toPlace: res.toPlace,
        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 visible = computed({
    get() {
      return props.modelValue
    },
    set(val) {
      ctx.emit('update:modelValue', val)
    },
  })
  /**
   * æ·»åŠ çš„form字段
   */
  const formItems = reactive([
    {
      label: '巷道',
      prop: 'aisle',
      //disabled: disabled,
      placeholder: '请输入巷道',
    },
    {
      label: '托盘编号',
      prop: 'containerNo',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入托盘编号',
    },
    {
      label: '堆垛机ID',
      prop: 'dodeviceId',
      //disabled: disabled,
      placeholder: '请输入堆垛机ID',
    },
    {
      label: '设备类型',
      prop: 'dodevicetype',
      //disabled: disabled,
      placeholder: '请输入设备类型',
      rules: [{ required: true, message: '设备类型不能为空', trigger: 'blur' }],
    },
    {
      label: '下个任务是否生成成功',
      prop: 'isNextTask',
      //disabled: disabled,
      placeholder: '请输入下个任务是否生成成功',
    },
    //   {
    //      label: 'WCS是否可以读取',
    //      prop: 'isRead',
    //      el: 'select',
    //      //disabled: disabled,
    //      placeholder: '请输入WCS是否可以读取',
    // rules: [{required: true, message: 'WCS是否可以读取不能为空', trigger: 'blur' }],
    //   },
    {
      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',
    },
    {
      label: '子任务类型',
      prop: 'sonTaskType',
      el: 'select',
      //disabled: disabled,
      placeholder: '请输入子任务类型',
    },
    {
      label: '来源单据号',
      prop: 'sourceOrderNo',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入来源单据号',
    },
    {
      label: '起始库位',
      prop: 'sourcePlace',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入起始库位',
    },
    {
      label: '设备任务状态',
      prop: 'taskDodeviceStatus',
      //disabled: disabled,
      placeholder: '请输入设备任务状态',
      rules: [
        { required: true, message: '设备任务状态不能为空', trigger: 'blur' },
      ],
    },
    {
      label: '任务等级',
      prop: 'taskLevel',
      //disabled: disabled,
      placeholder: '请输入任务等级',
      rules: [{ required: true, message: '任务等级不能为空', trigger: 'blur' }],
    },
    {
      label: '任务号',
      prop: 'taskNo',
      el: 'input',
      //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: 'taskType',
      el: 'select',
      //disabled: disabled,
      placeholder: '请输入任务类型',
      rules: [{ required: true, message: '任务类型不能为空', trigger: 'blur' }],
    },
    {
      label: '目标库位',
      prop: 'toPlace',
      el: 'input',
      //disabled: disabled,
      placeholder: '请输入目标库位',
    },
  ])
  /**
   * æ ¡éªŒæ˜¯å¦æœ‰æ•°æ®å˜åŒ–
   */
  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 = {
      aisle: formData.value.aisle,
      containerNo: formData.value.containerNo,
      dodeviceId: formData.value.dodeviceId,
      dodevicetype: formData.value.dodevicetype,
      isNextTask: formData.value.isNextTask,
      isRead: formData.value.isRead,
      mutableParam1: formData.value.mutableParam1,
      mutableParam2: formData.value.mutableParam2,
      mutableParam3: formData.value.mutableParam3,
      sonTaskType: formData.value.sonTaskType,
      sourceOrderNo: formData.value.sourceOrderNo,
      sourcePlace: formData.value.sourcePlace,
      taskDodeviceStatus: formData.value.taskDodeviceStatus,
      taskLevel: formData.value.taskLevel,
      taskNo: formData.value.taskNo,
      taskStatus: formData.value.taskStatus,
      taskType: formData.value.taskType,
      toPlace: formData.value.toPlace,
    }
    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 = {
        aisle: res.aisle,
        containerNo: res.containerNo,
        dodeviceId: res.dodeviceId,
        dodevicetype: res.dodevicetype,
        isNextTask: res.isNextTask,
        isRead: res.isRead,
        mutableParam1: res.mutableParam1,
        mutableParam2: res.mutableParam2,
        mutableParam3: res.mutableParam3,
        sonTaskType: res.sonTaskType,
        sourceOrderNo: res.sourceOrderNo,
        sourcePlace: res.sourcePlace,
        taskDodeviceStatus: res.taskDodeviceStatus,
        taskLevel: res.taskLevel,
        taskNo: res.taskNo,
        taskStatus: res.taskStatus,
        taskType: res.taskType,
        toPlace: res.toPlace,
        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,
  }
}
HIAWms/web/src/widgets/WmsTask/Views/Pages/WmsTask/WmsTask.tsx
@@ -1,324 +1,326 @@
import { computed, defineComponent, onMounted, reactive, ref } from 'vue'
import type { Ref } from 'vue'
import BaseTable from '@/components/Table/Table'
import styles from './WmsTask.module.scss'
import { useWmsTask } from '../../../Controllers/WmsTask'
import IconButton from '@/components/IconButton/IconButton'
import WmsTaskDrawer from '../Dialog/WmsTaskDrawer/WmsTaskDrawer'
import WmsTaskQueryDrawer from '../Dialog/WmsTaskQueryDrawer/WmsTaskQueryDrawer'
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/WmsTask/Models/Service/WmsTaskDrawer'
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: 'WmsTask',
  directives: {
    permission: vPermission,
  },
  setup(props, ctx) {
    const {
      dataSource,
      contextMenu,
      dialogConfig,
      dialogConfigForQuery,
      tableRef,
      current,
      search,
      sort,
      headers,
      onError,
      onSearch,
      onRowClick,
      onConfirmWmsTask,
      onCheck,
      onAddWmsTask,
      onAdvancedQuery,
      onExport,
      openDetail,
      onSuccess,
      onBeforeUpload,
    } = useWmsTask(props, ctx)
    //定义高级查询引用
   const wmsTaskQueryDrawerRef=ref(null);
    // æ–°å¢žçš„æŸ¥è¯¢æ¡ä»¶
    const queryForm = ref({
      searchVal: '',
      str_searchFormInputAttrs:[]
    })
    //定义整体模糊查询的列数组(注意:必须大小写跟后端的实体类属性名一致,否则会导致匹配不对的问题)
    const _searchFormInputAttrs = ref([
     'TaskNo', 'ContainerNo'
    ]);
    const searchFormInputAttrs_Placeholder = ref('请输入任务编码/托盘编码');
    // åŠ¨æ€æžšä¸¾é€‰é¡¹
    const enumOptions = reactive({
      taskType: [] as Array<{label: string; value: any }>,
taskStatus: [] as Array<{label: string; value: any }>,
sonTaskType: [] as Array<{label: string; value: any }>,
    })
    // èŽ·å–æžšä¸¾æ•°æ®
    const fetchEnumData = async () => {
      try {
        const taskTypeEnumData = await getWmsEnumData({
 EnumName: 'TaskTypeEnum',
})
enumOptions.taskType = taskTypeEnumData.map((item) => ({
  label: item.description,
  value: item.value,
}))
const wmsTaskStatusData = await getWmsEnumData({
 EnumName: 'WmsTaskStatus',
})
enumOptions.taskStatus = wmsTaskStatusData.map((item) => ({
  label: item.description,
  value: item.value,
}))
const sonTaskTypeEnumData = await getWmsEnumData({
 EnumName: 'SonTaskTypeEnum',
})
enumOptions.sonTaskType = sonTaskTypeEnumData.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.wmsTaskList]: true,
          }}
        >
          <BaseTable
            ref={tableRef}
            url={url}
            sortUrlTpl="/api/v1/HIAWms/wmsTask/{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.wmsTaskContent}>
          {/* æ·»åŠ /编辑 */}
          <WmsTaskDrawer
            v-model={dialogConfig.visible}
            title={dialogConfig.title}
            row={current.value}
            sort={sort.value}
            onConfirm={onConfirmWmsTask}
          />
          {/* é«˜çº§æŸ¥è¯¢ */}
          <WmsTaskQueryDrawer
            ref="wmsTaskQueryDrawerRef"
            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="wmsTask-add"
                icon="add-p"
                onClick={onAddWmsTask}
                type="primary"
              >
                æ·»åŠ 
              </IconButton>
              <el-divider direction="vertical" />
              <el-divider direction="vertical" />
              <el-upload
                v-permission="wmsTask-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/wmsTask/import"
              >
                <IconButton icon="in">导入</IconButton>
              </el-upload>
              <IconButton
                v-permission="wmsTask-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 './WmsTask.module.scss'
import { useWmsTask } from '../../../Controllers/WmsTask'
import IconButton from '@/components/IconButton/IconButton'
import WmsTaskDrawer from '../Dialog/WmsTaskDrawer/WmsTaskDrawer'
import WmsTaskQueryDrawer from '../Dialog/WmsTaskQueryDrawer/WmsTaskQueryDrawer'
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/WmsTask/Models/Service/WmsTaskDrawer'
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: 'WmsTask',
  directives: {
    permission: vPermission,
  },
  setup(props, ctx) {
    const {
      dataSource,
      contextMenu,
      dialogConfig,
      dialogConfigForQuery,
      tableRef,
      current,
      search,
      sort,
      headers,
      onError,
      onSearch,
      onRowClick,
      onConfirmWmsTask,
      onCheck,
      onAddWmsTask,
      onAdvancedQuery,
      onExport,
      openDetail,
      onSuccess,
      onBeforeUpload,
    } = useWmsTask(props, ctx)
    //定义高级查询引用
    const wmsTaskQueryDrawerRef = ref(null)
    // æ–°å¢žçš„æŸ¥è¯¢æ¡ä»¶
    const queryForm = ref({
      searchVal: '',
      str_searchFormInputAttrs: [],
    })
    //定义整体模糊查询的列数组(注意:必须大小写跟后端的实体类属性名一致,否则会导致匹配不对的问题)
    const _searchFormInputAttrs = ref(['TaskNo', 'ContainerNo'])
    const searchFormInputAttrs_Placeholder = ref('请输入任务编码/托盘编码')
    // åŠ¨æ€æžšä¸¾é€‰é¡¹
    const enumOptions = reactive({
      taskType: [] as Array<{ label: string; value: any }>,
      taskStatus: [] as Array<{ label: string; value: any }>,
      sonTaskType: [] as Array<{ label: string; value: any }>,
    })
    // èŽ·å–æžšä¸¾æ•°æ®
    const fetchEnumData = async () => {
      try {
        const taskTypeEnumData = await getWmsEnumData({
          EnumName: 'TaskTypeEnum',
        })
        enumOptions.taskType = taskTypeEnumData.map((item) => ({
          label: item.description,
          value: item.value,
        }))
        const wmsTaskStatusData = await getWmsEnumData({
          EnumName: 'WmsTaskStatus',
        })
        enumOptions.taskStatus = wmsTaskStatusData.map((item) => ({
          label: item.description,
          value: item.value,
        }))
        const sonTaskTypeEnumData = await getWmsEnumData({
          EnumName: 'SonTaskTypeEnum',
        })
        enumOptions.sonTaskType = sonTaskTypeEnumData.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.wmsTaskList]: true,
          }}
        >
          <BaseTable
            ref={tableRef}
            url={url}
            sortUrlTpl="/api/v1/HIAWms/wmsTask/{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.wmsTaskContent}>
          {/* æ·»åŠ /编辑 */}
          <WmsTaskDrawer
            v-model={dialogConfig.visible}
            title={dialogConfig.title}
            row={current.value}
            sort={sort.value}
            onConfirm={onConfirmWmsTask}
          />
          {/* é«˜çº§æŸ¥è¯¢ */}
          <WmsTaskQueryDrawer
            ref="wmsTaskQueryDrawerRef"
            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="wmsTask-add"
                icon="add-p"
                onClick={onAddWmsTask}
                type="primary"
              >
                æ·»åŠ 
              </IconButton>
              <el-divider direction="vertical" />
              <el-divider direction="vertical" />
              <el-upload
                v-permission="wmsTask-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/wmsTask/import"
              >
                <IconButton icon="in">导入</IconButton>
              </el-upload>
              <IconButton
                v-permission="wmsTask-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="wmsTask-add"
                icon="search"
                onClick={onAdvancedQuery}
                type="primary"
              >
                é«˜çº§æŸ¥è¯¢
              </IconButton>
            </ElFormItem>
          </div>
          <RenderBaseTable
            url="/api/v1/HIAWms/wmsTask/page"
            dataSource={dataSource}
            isChecked={true}
            isDrag={true}
          />
        </div>
      )
    }
  },
})
              </IconButton> */}
              <IconButton
                v-permission="wmsTask-add"
                icon="search"
                onClick={onAdvancedQuery}
                type="primary"
              >
                é«˜çº§æŸ¥è¯¢
              </IconButton>
            </ElFormItem>
          </div>
          <RenderBaseTable
            url="/api/v1/HIAWms/wmsTask/page"
            dataSource={dataSource}
            isChecked={true}
            isDrag={true}
          />
        </div>
      )
    }
  },
})
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/AppService/AppServiceÄ£°å.txt
@@ -1,7 +1,7 @@
using CMS.Plugin.$NameSpacePath$.Application.Contracts.Dtos.$EntityName$;
using CMS.Plugin.$NameSpacePath$.Application.Contracts.Services;
using CMS.Plugin.$NameSpacePath$.Domain.Shared;
using CMS.Plugin.$NameSpacePath$.Domain.Shared.Util;
using CmsQueryExtensions;
using CMS.Plugin.$NameSpacePath$.Domain.$EntityName$;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/Entity/DtoÄ£°å.txt
@@ -1,4 +1,5 @@
using CMS.Plugin.$NameSpacePath$.Domain.Shared.Enums;
using CmsQueryExtensions;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Weben_CMS_TemplateDemo/queryExtensions/CmsQueryExtensions/Utils/EnumHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
using System.ComponentModel;
namespace CmsQueryExtensions
{
    /// <summary>
    /// æžšä¸¾å¸®åŠ©ç±».
    /// </summary>
    public static class EnumHelper
    {
        /// <summary>
        /// èŽ·å–æžšä¸¾.
        /// </summary>
        /// <param name="enumName"> </param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public static List<EnumItem> GetEnumItems(string enumName)
        {
            // èŽ·å–å½“å‰ç¨‹åºé›†ä¸­çš„æ‰€æœ‰ç±»åž‹
            var enumType = AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(a => a.GetTypes())
                .FirstOrDefault(t => t.Name == enumName && t.IsEnum);
            if (enumType == null)
            {
                throw new Exception($"枚举类型 {enumName} ä¸å­˜åœ¨");
            }
            return GetEnumItems(enumType);
        }
        /// <summary>
        /// èŽ·å–æžšä¸¾ç±»åž‹.
        /// </summary>
        /// <param name="enumType"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public static List<EnumItem> GetEnumItems(Type enumType)
        {
            if (!enumType.IsEnum)
            {
                throw new Exception("提供的类型不是枚举类型");
            }
            var result = new List<EnumItem>();
            var values = Enum.GetValues(enumType);
            foreach (var value in values)
            {
                var fieldInfo = enumType.GetField(value.ToString());
                var description = fieldInfo?
                    .GetCustomAttributes(typeof(DescriptionAttribute), false)
                    .FirstOrDefault() as DescriptionAttribute;
                result.Add(new EnumItem
                {
                    Value = (int)value,
                    Name = value.ToString(),
                    Description = description?.Description ?? value.ToString(),
                });
            }
            return result;
        }
    }
    /// <summary>
    /// æžšä¸¾æè¿°.
    /// </summary>
    public class EnumItem
    {
        public int Value { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Weben_CMS_TemplateDemo/queryExtensions/CmsQueryExtensions/Utils/ExportHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Threading.Tasks;
namespace CmsQueryExtensions
{
    /// <summary>
    /// å¯¼å‡ºå¸®åŠ©ç±».
    /// </summary>
    public static class ExportHelper
    {
        // æ‰¹é‡è½¬æ¢æ–¹æ³•
        public static List<Dictionary<string, object>> ConvertListToExportData<T>(IEnumerable<T> list)
        {
            return list.Select(ConvertToExportData).ToList();
        }
        // é€šç”¨è½¬æ¢æ–¹æ³•(兼容 Func<T, Dictionary<string, object>>)
        public static Dictionary<string, object> ConvertToExportData<T>(T entity)
        {
            var dict = new Dictionary<string, object>();
            if (entity == null) return dict;
            foreach (var prop in typeof(T).GetProperties())
            {
                var value = prop.GetValue(entity);
                dict[prop.Name] = FormatValue(value);
            }
            return dict;
        }
        private static object FormatValue(object value)
        {
            if (value == null) return string.Empty;
            // å¤„理枚举
            if (value is Enum enumValue)
                return GetEnumDescriptionUtil.GetEnumDescription(enumValue);
            // å¤„理布尔
            if (value is bool boolValue)
                return boolValue ? "是" : "否";
            return value;
        }
    }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Weben_CMS_TemplateDemo/queryExtensions/CmsQueryExtensions/Utils/GetEnumDescriptionUtil.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace CmsQueryExtensions
{
    public class GetEnumDescriptionUtil
    {
        /// <summary>
        /// èŽ·å–æžšä¸¾çš„æè¿°
        /// </summary>
        /// <param name="enumValue"></param>
        /// <returns></returns>
        public static string GetEnumDescription(Enum enumValue)
        {
            string value = enumValue.ToString();
            if (string.IsNullOrWhiteSpace(value) || value == "0") return "";
            FieldInfo field = enumValue.GetType().GetField(value);
            object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false);  //获取描述属性
            if (objs == null || objs.Length == 0)  //当描述属性没有时,直接返回名称
                return value;
            DescriptionAttribute descriptionAttribute = (DescriptionAttribute)objs[0];
            return descriptionAttribute.Description;
        }
    }
}