吉安感知网项目-前端
罗广辉
2026-06-03 d04ecbb2aa47d93e05d28bb551e7bad83d97d60f
feat: 类型多选改造
6 files modified
1 files added
273 ■■■■ changed files
applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue 20 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue 62 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue 27 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue 15 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue 29 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue 15 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/taskTypeOptions.js 105 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue
@@ -13,21 +13,16 @@
            </el-form-item>
            <el-form-item label="巡查任务类型" prop="patrolTaskType">
                <el-select
                <el-cascader
                    class="gd-select gray"
                    popper-class="gd-select-popper"
                    v-model="searchParams.patrolTaskType"
                    :options="workOrderTypeXT"
                    :props="taskTypeFilterCascaderProps"
                    placeholder="请选择"
                    clearable
                    @change="handleSearch"
                >
                    <el-option
                        v-for="item in workOrderTypeXT"
                        :key="item.dictValue"
                        :label="item.dictLabel"
                        :value="item.dictValue"
                    />
                </el-select>
                />
            </el-form-item>
            <!-- <el-form-item label="任务状态" prop="taskStatus">
@@ -76,7 +71,7 @@
                    <el-table-column prop="taskNo" show-overflow-tooltip label="巡查任务编号" />
                    <el-table-column prop="patrolTaskType" show-overflow-tooltip label="巡查任务类型">
                        <template v-slot="{ row }">
                            {{ getDictLabelXT(row.patrolTaskType, workOrderTypeXT) }}
                            {{ getTaskTypeLabel(row.patrolTaskType, workOrderTypeXT) }}
                        </template>
                    </el-table-column>
                    <el-table-column prop="taskStatus" show-overflow-tooltip label="巡查任务状态">
@@ -117,12 +112,13 @@
import { Search, RefreshRight } from '@element-plus/icons-vue'
import { computed, onMounted, ref } from 'vue'
import { getDictionaryByCode } from '@/api/system/dictbiz'
import { dateRangeFormat, getDictLabel, getDictLabelXT } from '@ztzf/utils'
import { dateRangeFormat, getDictLabel } from '@ztzf/utils'
import { getDictListApi } from '@/api/zkxt'
import { gdPatrolTaskPageApi } from '../inspectionRequest/inspectionRequestApi'
import { getDeptTree } from '@/api/system/dept'
import ViewDiaLog from './ViewDiaLog.vue'
import { useStore } from 'vuex'
import { getTaskTypeLabel, normalizeTaskTypeOptions, taskTypeFilterCascaderProps } from '../taskTypeOptions'
// 初始化查询参数
const initSearchParams = () => ({
@@ -204,7 +200,7 @@
        dictObj.value = res.data.data
    })
    getDictListApi('task_inspection_type').then(res => {
        workOrderTypeXT.value = res.data.data || []
        workOrderTypeXT.value = normalizeTaskTypeOptions(res.data.data || [])
    })
}
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
@@ -33,7 +33,7 @@
                        <div class="info-item">
                            <span class="label">工单类型</span>
                            <span class="val" v-if="selectedWorkOrder">
                                {{ getDictLabelXT(selectedWorkOrder.workOrderType, workOrderTypeXT) }}
                                {{ getTaskTypeLabel(selectedWorkOrder.workOrderType, workOrderTypeXT) }}
                            </span>
                            <span class="val grayText" v-else>选择工单后自动带出</span>
                        </div>
@@ -98,20 +98,15 @@
                                巡查任务类型
                            </template>
                            <template v-slot="{ row, $index }">
                                <el-select
                                <el-cascader
                                    class="gd-select"
                                    popper-class="gd-select-popper"
                                    v-model="row.patrolTaskType"
                                    :options="workOrderTypeXT"
                                    :props="taskTypeCascaderProps"
                                    placeholder="请选择"
                                    @change="handlePatrolTaskTypeChange($index, $event)"
                                >
                                    <el-option
                                        v-for="item in workOrderTypeXT"
                                        :key="item.dictValue"
                                        :label="item.dictLabel"
                                        :value="item.dictValue"
                                    />
                                </el-select>
                                />
                            </template>
                        </el-table-column>
                        <el-table-column prop="executeTime" width="200">
@@ -165,7 +160,7 @@
                                    v-model="row.deviceFlyerId"
                                    placeholder="请选择"
                                    filterable
                                    :disabled="dialogReadonly || !taskList[$index].patrolTaskType"
                                    :disabled="dialogReadonly || !hasTaskTypeValue(taskList[$index].patrolTaskType)"
                                >
                                    <el-option
@@ -268,18 +263,25 @@
import { computed, ref, onMounted, inject } from 'vue'
import { ElMessage } from 'element-plus'
import { Plus, Delete } from '@element-plus/icons-vue'
import { geomAnalysis, getDictLabel, getDictLabelXT } from '@ztzf/utils'
import { geomAnalysis, getDictLabel } from '@ztzf/utils'
import { gdPatrolTaskSaveApi, gdFlyerPageApi, gdPatrolTaskAuditApi } from './inspectionRequestApi'
import { gdWorkOrderPageApi } from '../orderManage/orderManageApi'
import { gdManageDeviceListApi } from '../orderManage/gdManageDeviceApi'
import { pxToRem } from '@/utils/rem'
import { airlineListApi, algorithmGroupedApi } from '@/api/zkxt'
import {
    getTaskTypeLabel,
    getTaskTypeLeafValues,
    taskTypeCascaderProps,
    toTaskTypeCascaderValue,
    toTaskTypeRequestValue,
} from '../taskTypeOptions'
// 初始化任务行
const initTaskRow = () => ({
    patrolTaskName: '',
    patrolTaskType: '',
    patrolTaskType: [],
    executeTime: '',
    patrolRouteUrl: '',
    deviceFlyerId: '',
@@ -339,13 +341,14 @@
        // 将工单类型赋值给所有子任务行
        const workOrderType = selectedWorkOrder.value?.workOrderType
        if (workOrderType) {
            const patrolTaskType = toTaskTypeCascaderValue(workOrderType)
            taskList.value.forEach((task, index) => {
                taskList.value[index] = {
                    ...initTaskRow(),
                    patrolTaskType: workOrderType,
                    patrolTaskType,
                }
                // 获取对应的飞手列表
                getFlyerList(index, workOrderType)
                getFlyerList(index, patrolTaskType)
            })
        }
    } else {
@@ -373,7 +376,7 @@
    const newTask = initTaskRow()
    // 如果已选择工单,自动填充工单类型
    if (selectedWorkOrder.value?.workOrderType) {
        newTask.patrolTaskType = selectedWorkOrder.value.workOrderType
        newTask.patrolTaskType = toTaskTypeCascaderValue(selectedWorkOrder.value.workOrderType)
    }
    const newIndex = taskList.value.length
    taskList.value.push(newTask)
@@ -437,11 +440,16 @@
// 获取飞手列表
async function getFlyerList(index, skilledTaskType) {
    const leafValues = getTaskTypeLeafValues(skilledTaskType)
    if (!leafValues.length) {
        flyerListMap.value[index] = []
        return
    }
    const obj = getPolygonCenter(geomAnalysis(selectedWorkOrder.value.geom))
    const res = await gdFlyerPageApi({
        size: 999,
        current: 1,
        skilledTaskType,
        skilledTaskType: leafValues.join(','),
        // longitude: obj.longitude || '',
        // latitude: obj.latitude || '',
    })
@@ -466,7 +474,18 @@
// 判断一行是否已填写(至少填写了任务名称)
function isTaskRowFilled(task) {
    return !!(task.patrolTaskName || task.executeTime || task.patrolRouteUrl || task.deviceFlyerId || task.deviceId)
    return !!(
        task.patrolTaskName ||
        hasTaskTypeValue(task.patrolTaskType) ||
        task.executeTime ||
        task.patrolRouteUrl ||
        task.deviceFlyerId ||
        task.deviceId
    )
}
function hasTaskTypeValue(value) {
    return !!toTaskTypeRequestValue(value).length
}
// 提交新增
@@ -491,7 +510,7 @@
            ElMessage.warning(`第${i + 1}行: 请输入巡查任务名称`)
            return
        }
        if (!task.patrolTaskType) {
        if (!hasTaskTypeValue(task.patrolTaskType)) {
            ElMessage.warning(`第${i + 1}行: 请选择巡查任务类型`)
            return
        }
@@ -518,6 +537,7 @@
        // 只提交已填写的任务行
        const dataList = filledTasks.map(item => ({
            ...item,
            patrolTaskType: toTaskTypeRequestValue(item.patrolTaskType),
            workOrderId: selectedWorkOrderId.value,
            id: undefined,
        }))
@@ -546,11 +566,11 @@
        // 编辑/查看模式 - 加载已有数据
        selectedWorkOrderId.value = row?.workOrderId
        handleWorkOrderChange(row?.workOrderId)
        taskList.value = [{ ...row }]
        taskList.value = [{ ...row, patrolTaskType: toTaskTypeCascaderValue(row?.patrolTaskType) }]
        flyerListMap.value = {}
        // 如果有巡查类型,加载对应的飞手列表
        if (row?.patrolTaskType) {
            getFlyerList(0, row.patrolTaskType)
            getFlyerList(0, taskList.value[0].patrolTaskType)
        }
    }
}
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue
@@ -42,7 +42,7 @@
                        </el-col>
                        <el-col :span="12">
                            <div class="label">巡查任务类型</div>
                            <div class="val">{{ getDictLabelXT(formData.patrolTaskType, workOrderTypeXT) }}</div>
                            <div class="val">{{ getTaskTypeLabel(formData.patrolTaskType, workOrderTypeXT) }}</div>
                        </el-col>
                        <el-col :span="12">
                            <div class="label">任务执行时间</div>
@@ -111,20 +111,15 @@
                        </el-col>
                        <el-col :span="12">
                            <el-form-item label="巡查任务类型" prop="patrolTaskType">
                                <el-select
                                <el-cascader
                                    class="gd-select"
                                    popper-class="gd-select-popper"
                                    v-model="formData.patrolTaskType"
                                    :options="workOrderTypeXT"
                                    :props="taskTypeCascaderProps"
                                    placeholder="请选择"
                                    clearable
                                >
                                    <el-option
                                        v-for="item in workOrderTypeXT"
                                        :key="item.dictValue"
                                        :label="item.dictLabel"
                                        :value="item.dictValue"
                                    />
                                </el-select>
                                />
                            </el-form-item>
                        </el-col>
                        <el-col :span="12">
@@ -286,7 +281,7 @@
<script setup>
import { computed, ref, onMounted, inject } from 'vue'
import { ElMessage } from 'element-plus'
import { fieldRules, flyVisual, getDictLabel, getDictLabelXT, geomAnalysis } from '@ztzf/utils'
import { fieldRules, flyVisual, getDictLabel, geomAnalysis } from '@ztzf/utils'
import {
    gdPatrolTaskRepublish,
    gdFlyerPageApi,
@@ -303,12 +298,13 @@
import { queryAirById, airlineListApi, algorithmGroupedApi } from '@/api/zkxt'
import * as Cesium from 'cesium'
import { useStore } from 'vuex'
import { getTaskTypeLabel, taskTypeCascaderProps, toTaskTypeCascaderValue, toTaskTypeRequestValue } from '../taskTypeOptions'
// 初始化表单数据
const initForm = () => ({
    id: null,
    patrolTaskName: '',
    patrolTaskType: '',
    patrolTaskType: [],
    executeTime: '',
    patrolRouteUrl: '',
    deviceFlyerId: null,
@@ -493,7 +489,11 @@
    if (!isValid) return
    submitting.value = true
    try {
        await gdPatrolTaskRepublish(formData.value)
        const payload = {
            ...formData.value,
            patrolTaskType: toTaskTypeRequestValue(formData.value.patrolTaskType),
        }
        await gdPatrolTaskRepublish(payload)
        ElMessage.success('更新成功')
        visible.value = false
        emit('success')
@@ -584,6 +584,7 @@
    const res = await gdPatrolTaskDetailApi({ id: row.id })
    formData.value = { ...initForm(), ...res.data.data }
    formData.value.patrolTaskType = toTaskTypeCascaderValue(formData.value.patrolTaskType)
    // 确保 algorithmIds 是数组
    if (formData.value.algorithmIds && typeof formData.value.algorithmIds === 'string') {
        formData.value.algorithmIds = formData.value.algorithmIds.split(',').filter(Boolean)
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
@@ -11,11 +11,9 @@
            </el-form-item>
            <el-form-item label="任务类型" prop="patrolTaskType">
                <el-select class="gd-select gray" popper-class="gd-select-popper" v-model="searchParams.patrolTaskType"
                    placeholder="请选择" clearable @change="handleSearch">
                    <el-option v-for="item in workOrderTypeXT" :key="item.dictValue" :label="item.dictLabel"
                        :value="item.dictValue" />
                </el-select>
                <el-cascader class="gd-select gray" popper-class="gd-select-popper" v-model="searchParams.patrolTaskType"
                    :options="workOrderTypeXT" :props="taskTypeFilterCascaderProps" placeholder="请选择" clearable
                    @change="handleSearch" />
            </el-form-item>
            <el-form-item label="任务状态" prop="taskStatus">
@@ -55,7 +53,7 @@
                    <el-table-column prop="taskNo" show-overflow-tooltip label="巡查任务编号" />
                    <el-table-column prop="patrolTaskType" show-overflow-tooltip label="巡查任务类型">
                        <template v-slot="{ row }">
                            {{ getDictLabelXT(row.patrolTaskType, workOrderTypeXT) }}
                            {{ getTaskTypeLabel(row.patrolTaskType, workOrderTypeXT) }}
                        </template>
                    </el-table-column>
                    <el-table-column prop="taskStatus" show-overflow-tooltip label="巡查任务状态">
@@ -93,12 +91,13 @@
import { onMounted, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getDictionaryByCode } from '@/api/system/dictbiz'
import { dateRangeFormat, getDictLabel, getDictLabelXT } from '@ztzf/utils'
import { dateRangeFormat, getDictLabel } from '@ztzf/utils'
import { getDictListApi } from '@/api/zkxt'
import FormDiaLog from './FormDiaLog.vue'
import { gdPatrolTaskPageApi, gdPatrolTaskRemoveApi } from './inspectionRequestApi'
import ViewDiaLog from '@/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue'
import { useStore } from 'vuex'
import { getTaskTypeLabel, normalizeTaskTypeOptions, taskTypeFilterCascaderProps } from '../taskTypeOptions'
const store = useStore()
const permission = computed(() => store.state.user.permission)
@@ -217,7 +216,7 @@
        dictObj.value = res.data.data
    })
    getDictListApi('task_inspection_type').then(res => {
        workOrderTypeXT.value = res.data.data || []
        workOrderTypeXT.value = normalizeTaskTypeOptions(res.data.data || [])
    })
}
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
@@ -31,7 +31,7 @@
                        </el-col>
                        <el-col :span="12">
                            <div class="label">工单类型</div>
                            <div class="val">{{ getDictLabelXT(formData.workOrderType, workOrderTypeXT) }}</div>
                            <div class="val">{{ getTaskTypeLabel(formData.workOrderType, workOrderTypeXT) }}</div>
                        </el-col>
                        <el-col :span="12">
                            <div class="label">执行时间范围</div>
@@ -62,7 +62,7 @@
                            <el-table-column prop="patrolTaskName" show-overflow-tooltip label="巡查任务名称" />
                            <el-table-column prop="patrolTaskType" show-overflow-tooltip label="巡查任务类型">
                                <template v-slot="{ row }">
                                    {{ getDictLabelXT(row.patrolTaskType, workOrderTypeXT) }}
                                    {{ getTaskTypeLabel(row.patrolTaskType, workOrderTypeXT) }}
                                </template>
                            </el-table-column>
                            <el-table-column prop="taskStatus" show-overflow-tooltip label="任务状态">
@@ -94,20 +94,15 @@
                        </el-col>
                        <el-col :span="12">
                            <el-form-item label="工单类型" prop="workOrderType">
                                <el-select
                                <el-cascader
                                    class="gd-select"
                                    popper-class="gd-select-popper"
                                    v-model="formData.workOrderType"
                                    :options="workOrderTypeXT"
                                    :props="taskTypeCascaderProps"
                                    placeholder="请选择"
                                    clearable
                                >
                                    <el-option
                                        v-for="item in workOrderTypeXT"
                                        :key="item.dictValue"
                                        :label="item.dictLabel"
                                        :value="item.dictValue"
                                    />
                                </el-select>
                                />
                            </el-form-item>
                        </el-col>
                        <el-col :span="12">
@@ -264,7 +259,7 @@
<script setup>
import { computed, ref, nextTick, inject } from 'vue'
import { ElMessage } from 'element-plus'
import { dateRangeFormat, fieldRules, flyVisual, geomAnalysis, getDictLabel, getDictLabelXT } from '@ztzf/utils'
import { dateRangeFormat, fieldRules, flyVisual, geomAnalysis, getDictLabel } from '@ztzf/utils'
import {
    gdWorkOrderDetailApi,
    gdWorkOrderFlowListApi,
@@ -287,6 +282,7 @@
import OrderStepBar from '@/views/orderView/orderManage/orderManage/OrderStepBar.vue'
import OutcomeData from './outcomeData.vue'
import { getDictListApi } from '@/api/zkxt'
import { getTaskTypeLabel, taskTypeCascaderProps, toTaskTypeCascaderValue, toTaskTypeRequestValue } from '../taskTypeOptions'
const store = useStore()
const permission = computed(() => store.state.user.permission)
const activeName = ref('basic')
@@ -294,7 +290,7 @@
// 初始化表单数据
const initForm = () => ({
    workOrderName: '',
    workOrderType: '',
    workOrderType: [],
    executeStartTime: '',
    executeEndTime: '',
    deviceLoadDemand: '',
@@ -457,7 +453,11 @@
        if (!formData.value.id) {
            formData.value.workOrderStatus = '10'
        }
        await gdWorkOrderSaveApi(formData.value)
        const payload = {
            ...formData.value,
            workOrderType: toTaskTypeRequestValue(formData.value.workOrderType),
        }
        await gdWorkOrderSaveApi(payload)
        ElMessage.success(dialogMode.value === 'add' ? '新增成功' : '更新成功')
        visible.value = false
        emit('success')
@@ -479,6 +479,7 @@
    loadList()
    const res = await gdWorkOrderDetailApi({ id: formData.value.id })
    formData.value = res?.data?.data ?? {}
    formData.value.workOrderType = toTaskTypeCascaderValue(formData.value.workOrderType)
    dateRange.value = [formData.value.executeStartTime, formData.value.executeEndTime]
}
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
@@ -11,11 +11,9 @@
            </el-form-item>
            <el-form-item label="工单类型" prop="workOrderType">
                <el-select class="gd-select gray" popper-class="gd-select-popper" v-model="searchParams.workOrderType"
                    placeholder="请选择" clearable @change="handleSearch">
                    <el-option v-for="item in workOrderTypeXT" :key="item.dictValue" :label="item.dictLabel"
                        :value="item.dictValue" />
                </el-select>
                <el-cascader class="gd-select gray" popper-class="gd-select-popper" v-model="searchParams.workOrderType"
                    :options="workOrderTypeXT" :props="taskTypeFilterCascaderProps" placeholder="请选择" clearable
                    @change="handleSearch" />
            </el-form-item>
            <el-form-item label="工单状态" prop="workOrderStatus">
@@ -53,7 +51,7 @@
                    <el-table-column prop="workOrderCode" show-overflow-tooltip label="工单编号" />
                    <el-table-column prop="workOrderType" show-overflow-tooltip label="工单类型">
                        <template v-slot="{ row }">
                            {{ getDictLabelXT(row.workOrderType, workOrderTypeXT) }}
                            {{ getTaskTypeLabel(row.workOrderType, workOrderTypeXT) }}
                        </template>
                    </el-table-column>
                    <el-table-column prop="status" show-overflow-tooltip label="阶段状态">
@@ -102,7 +100,7 @@
import { onMounted, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getDictionaryByCode } from '@/api/system/dictbiz'
import { dateRangeFormat, getDictLabel, getDictLabelXT } from '@ztzf/utils'
import { dateRangeFormat, getDictLabel } from '@ztzf/utils'
import { getDictListApi } from '@/api/zkxt'
import FormDiaLog from './FormDiaLog.vue'
import { gdWorkOrderPageApi, gdWorkOrderRemoveApi } from './orderManageApi'
@@ -111,6 +109,7 @@
import testDock from '@/assets/docx/testDocx.docx'
import testPdf from '@/assets/pdf/testPdf.pdf'
import { useStore } from 'vuex'
import { getTaskTypeLabel, normalizeTaskTypeOptions, taskTypeFilterCascaderProps } from '../taskTypeOptions'
const store = useStore()
const activeName = ref('all')
@@ -250,7 +249,7 @@
        dictObj.value = res.data.data
    })
    getDictListApi('task_inspection_type').then(res => {
        workOrderTypeXT.value = res.data.data || []
        workOrderTypeXT.value = normalizeTaskTypeOptions(res.data.data || [])
    })
}
applications/task-work-order/src/views/orderView/orderManage/taskTypeOptions.js
New file
@@ -0,0 +1,105 @@
function parseRemarkOptions(remark) {
    if (Array.isArray(remark)) return remark
    if (!remark || typeof remark !== 'string') return []
    try {
        const options = JSON.parse(remark)
        return Array.isArray(options) ? options : []
    } catch (error) {
        return []
    }
}
export function normalizeTaskTypeOptions(list = []) {
    return list.map(item => {
        const remarkOptions = parseRemarkOptions(item.remark)
            .map(option => ({
                ...option,
                dictLabel: option.label,
                dictValue: option.value,
            }))
            .sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0))
        return {
            ...item,
            remarkOptions,
            children: remarkOptions,
        }
    })
}
function isValidPath(value) {
    return (
        Array.isArray(value) &&
        value.length === 2 &&
        value.every(item => item !== undefined && item !== null && item !== '' && !Array.isArray(item) && typeof item !== 'object')
    )
}
function parseTaskTypeValue(value) {
    if (typeof value !== 'string') return value
    try {
        const result = JSON.parse(value)
        return Array.isArray(result) ? result : value
    } catch (error) {
        return value
    }
}
export function toTaskTypeCascaderValue(value) {
    value = parseTaskTypeValue(value)
    if (!value) return []
    if (typeof value === 'string') return []
    if (!Array.isArray(value)) return []
    if (isValidPath(value)) return [value]
    if (value.length === 1 && Array.isArray(value[0]) && !isValidPath(value[0])) {
        value = value[0]
    }
    return value.filter(isValidPath)
}
export function toTaskTypeRequestValue(value) {
    return toTaskTypeCascaderValue(value).map(item => [item[0], item[1]])
}
export function getTaskTypeLeafValues(value) {
    return toTaskTypeRequestValue(value).map(item => item[1])
}
export function getTaskTypeLabel(value, options = []) {
    const paths = toTaskTypeCascaderValue(value)
    if (paths.length) {
        return paths
            .map(path => {
                const parent = options.find(item => item.dictValue === path[0])
                const child = (parent?.children || []).find(item => item.dictValue === path[1])
                return child?.dictLabel || path[1]
            })
            .join('、')
    }
    if (!value) return ''
    for (const item of options) {
        if (item.dictValue === value) return item.dictLabel
        const child = (item.children || []).find(option => option.dictValue === value)
        if (child) return child.dictLabel
    }
    return value
}
export const taskTypeCascaderProps = {
    label: 'dictLabel',
    value: 'dictValue',
    children: 'children',
    multiple: true,
    emitPath: true,
    checkStrictly: false,
}
export const taskTypeFilterCascaderProps = {
    label: 'dictLabel',
    value: 'dictValue',
    children: 'children',
    emitPath: false,
    checkStrictly: false,
}