吉安感知网项目-前端
罗广辉
2026-06-06 df3b6543df709dd02f357798ea2234e24f6f7d9e
feat: 类型多选改造
7 files modified
245 ■■■■■ changed files
applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue 9 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue 8 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue 9 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue 87 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue 43 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue 75 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/taskTypeOptions.js 14 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue
@@ -18,7 +18,7 @@
                    popper-class="gd-select-popper"
                    v-model="searchParams.patrolTaskType"
                    :options="workOrderTypeXT"
                    :props="taskTypeFilterCascaderProps"
                    :props="taskTypeCascaderProps"
                    placeholder="请选择"
                    clearable
                    @change="handleSearch"
@@ -118,7 +118,11 @@
import { getDeptTree } from '@/api/system/dept'
import ViewDiaLog from './ViewDiaLog.vue'
import { useStore } from 'vuex'
import { getTaskTypeLabel, normalizeTaskTypeOptions, taskTypeFilterCascaderProps } from '../taskTypeOptions'
import {
    getTaskTypeLabel,
    normalizeTaskTypeOptions,
    taskTypeCascaderProps,
} from '../taskTypeOptions'
// 初始化查询参数
const initSearchParams = () => ({
@@ -164,6 +168,7 @@
            startTime: range[0],
            endTime: range[1],
            taskStatus: 8,
            patrolTaskType: searchParams?.value?.patrolTaskType?.join?.(','),
        })
        list.value = res?.data?.data?.records ?? []
        total.value = res?.data?.data?.total ?? 0
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
@@ -103,7 +103,7 @@
                                    popper-class="gd-select-popper"
                                    v-model="row.patrolTaskType"
                                    :options="workOrderTypeXT"
                                    :props="taskTypeCascaderProps"
                                    :props="{...taskTypeCascaderProps,multiple:true}"
                                    placeholder="请选择"
                                    collapse-tags
                                    @change="handlePatrolTaskTypeChange($index, $event)"
@@ -273,7 +273,6 @@
import { airlineListApi, algorithmGroupedApi } from '@/api/zkxt'
import {
    getTaskTypeLabel,
    getTaskTypeLeafValues,
    taskTypeCascaderProps,
    toTaskTypeCascaderValue,
    toTaskTypeRequestValue,
@@ -441,8 +440,7 @@
// 获取飞手列表
async function getFlyerList(index, skilledTaskType) {
    const leafValues = getTaskTypeLeafValues(skilledTaskType)
    if (!leafValues.length) {
    if (!skilledTaskType.length) {
        flyerListMap.value[index] = []
        return
    }
@@ -450,7 +448,7 @@
    const res = await gdFlyerPageApi({
        size: 999,
        current: 1,
        skilledTaskType: leafValues.join(','),
        skilledTaskType: skilledTaskType.map(item => item[1])?.join?.(','),
        // longitude: obj.longitude || '',
        // latitude: obj.latitude || '',
    })
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue
@@ -116,8 +116,9 @@
                                    popper-class="gd-select-popper"
                                    v-model="formData.patrolTaskType"
                                    :options="workOrderTypeXT"
                                    :props="taskTypeCascaderProps"
                                    :props="{...taskTypeCascaderProps,multiple:true}"
                                    placeholder="请选择"
                                    collapse-tags
                                    clearable
                                />
                            </el-form-item>
@@ -489,11 +490,7 @@
    if (!isValid) return
    submitting.value = true
    try {
        const payload = {
            ...formData.value,
            patrolTaskType: toTaskTypeRequestValue(formData.value.patrolTaskType),
        }
        await gdPatrolTaskRepublish(payload)
        await gdPatrolTaskRepublish(formData.value)
        ElMessage.success('更新成功')
        visible.value = false
        emit('success')
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
@@ -6,28 +6,58 @@
        </el-tabs>
        <el-form ref="queryParamsRef" :model="searchParams" class="gd-search-form">
            <el-form-item label="任务名称" prop="patrolTaskName">
                <el-input class="gd-input gray" v-model="searchParams.patrolTaskName" placeholder="请输入" clearable
                    @clear="handleSearch" />
                <el-input
                    class="gd-input gray"
                    v-model="searchParams.patrolTaskName"
                    placeholder="请输入"
                    clearable
                    @clear="handleSearch"
                />
            </el-form-item>
            <el-form-item label="任务类型" prop="patrolTaskType">
                <el-cascader class="gd-cascader gray" popper-class="gd-cascader-popper" v-model="searchParams.patrolTaskType"
                    :options="workOrderTypeXT" :props="taskTypeFilterCascaderProps" placeholder="请选择" clearable
                    @change="handleSearch" />
                <el-cascader
                    class="gd-cascader gray"
                    popper-class="gd-cascader-popper"
                    v-model="searchParams.patrolTaskType"
                    :options="workOrderTypeXT"
                    :props="taskTypeCascaderProps"
                    placeholder="请选择"
                    clearable
                    @change="handleSearch"
                />
            </el-form-item>
            <el-form-item label="任务状态" prop="taskStatus">
                <el-select class="gd-select gray" popper-class="gd-select-popper" v-model="searchParams.taskStatus"
                    placeholder="请选择" clearable @change="handleSearch">
                    <el-option v-for="item in dictObj.taskStatus" :key="item.dictKey" :label="item.dictValue"
                        :value="item.dictKey" />
                <el-select
                    class="gd-select gray"
                    popper-class="gd-select-popper"
                    v-model="searchParams.taskStatus"
                    placeholder="请选择"
                    clearable
                    @change="handleSearch"
                >
                    <el-option
                        v-for="item in dictObj.taskStatus"
                        :key="item.dictKey"
                        :label="item.dictValue"
                        :value="item.dictKey"
                    />
                </el-select>
            </el-form-item>
            <el-form-item label="执行时间" prop="executeTime">
                <el-date-picker class="gd-date-picker gray" popper-class="gd-date-picker-popper" v-model="dateRange"
                    type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
                    value-format="YYYY-MM-DD HH:mm:ss" @change="handleSearch" />
                <el-date-picker
                    class="gd-date-picker gray"
                    popper-class="gd-date-picker-popper"
                    v-model="dateRange"
                    type="daterange"
                    range-separator="-"
                    start-placeholder="开始日期"
                    end-placeholder="结束日期"
                    value-format="YYYY-MM-DD HH:mm:ss"
                    @change="handleSearch"
                />
            </el-form-item>
            <el-form-item class="gd-search-actions">
@@ -38,8 +68,7 @@
        <div class="gd-table-container" v-loading="loading">
            <div class="gd-table-toolbar">
                <el-button v-if="permission.flyOrder_add" :icon="Plus" color="#4C34FF" type="primary"
                    @click="openForm('add')">
                <el-button v-if="permission.flyOrder_add" :icon="Plus" color="#4C34FF" type="primary" @click="openForm('add')">
                    拆分工单
                </el-button>
            </div>
@@ -75,15 +104,25 @@
            </div>
            <div class="gd-pagination-parent">
                <el-pagination popper-class="gd-select-popper" v-model:current-page="searchParams.current"
                    v-model:page-size="searchParams.size" layout="total, prev, pager, next, sizes" :total="total"
                    @change="getList" />
                <el-pagination
                    popper-class="gd-select-popper"
                    v-model:current-page="searchParams.current"
                    v-model:page-size="searchParams.size"
                    layout="total, prev, pager, next, sizes"
                    :total="total"
                    @change="getList"
                />
            </div>
        </div>
        <FormDiaLog ref="dialogRef" @success="getList" v-if="dialogVisible" v-model="dialogVisible" />
        <ViewDiaLog ref="viewDiaLogRef" @success="getList" @refusalAccept="refusalAccept" v-if="viewDiaLogVisible"
            v-model="viewDiaLogVisible" />
        <ViewDiaLog
            ref="viewDiaLogRef"
            @success="getList"
            @refusalAccept="refusalAccept"
            v-if="viewDiaLogVisible"
            v-model="viewDiaLogVisible"
        />
    </basic-container>
</template>
<script setup>
@@ -97,7 +136,11 @@
import { gdPatrolTaskPageApi, gdPatrolTaskRemoveApi } from './inspectionRequestApi'
import ViewDiaLog from '@/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue'
import { useStore } from 'vuex'
import { getTaskTypeLabel, normalizeTaskTypeOptions, taskTypeFilterCascaderProps } from '../taskTypeOptions'
import {
    getTaskTypeLabel,
    normalizeTaskTypeOptions,
    taskTypeCascaderProps,
} from '../taskTypeOptions'
const store = useStore()
const permission = computed(() => store.state.user.permission)
@@ -147,7 +190,6 @@
    8: '#019612',//8验收通过
}
// 获取列表
async function getList () {
    const range = dateRangeFormat(dateRange.value)
@@ -156,8 +198,8 @@
        const res = await gdPatrolTaskPageApi({
            ...searchParams.value,
            startTime: range[0],
            endTime: range[1],
            createUser: activeName.value === 'my' ? store.state.user.userInfo.user_id : '',
            patrolTaskType: searchParams?.value?.patrolTaskType?.join?.(','),
        })
        list.value = res?.data?.data?.records ?? []
        total.value = res?.data?.data?.total ?? 0
@@ -208,7 +250,6 @@
function handleSelectionChange (rows) {
    selectedIds.value = rows.map(item => item.id)
}
// 获取字典
function getDictList () {
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
@@ -8,7 +8,12 @@
        destroy-on-close
        :close-on-click-modal="false"
    >
    <el-tabs class="gd-tabs"  v-model="activeName" @tab-click="tabsClick" v-if="dialogReadonly && formData.workOrderStatus >= '30'">
        <el-tabs
            class="gd-tabs"
            v-model="activeName"
            @tab-click="tabsClick"
            v-if="dialogReadonly && formData.workOrderStatus >= '30'"
        >
            <el-tab-pane label="基础信息" name="basic"></el-tab-pane>
            <el-tab-pane label="成果数据" name="result">
                <OutcomeData :workOrderId="formData.id" />
@@ -94,17 +99,16 @@
                        </el-col>
                        <el-col :span="12">
                            <el-form-item label="工单类型" prop="workOrderType">
                                <!-- <el-cascader
                                <el-cascader
                                    class="gd-cascader"
                                    popper-class="gd-cascader-popper"
                                    v-model="formData.workOrderType"
                                    :options="workOrderTypeXT"
                                    :props="taskTypeCascaderProps"
                                    collapse-tags
                                    :props="{...taskTypeCascaderProps,multiple:true }"
                                    placeholder="请选择"
                                    clearable
                                /> -->
                                <el-cascader class="gd-cascader" popper-class="gd-cascader-popper" v-model="formData.workOrderType"
                    :options="workOrderTypeXT" :props="taskTypeCascaderProps" placeholder="请选择" clearable collapse-tags />
                                    collapse-tags
                                />
                            </el-form-item>
                        </el-col>
                        <el-col :span="12">
@@ -130,12 +134,7 @@
                                    clearable
                                    @change="loadDemandChange"
                                >
                                    <el-option
                                        v-for="item in payloadList"
                                        :key="item.name"
                                        :label="item.name"
                                        :value="item.name"
                                    />
                                    <el-option v-for="item in payloadList" :key="item.name" :label="item.name" :value="item.name" />
                                </el-select>
                            </el-form-item>
                        </el-col>
@@ -176,9 +175,7 @@
                </div>
                <el-table
                    class="separateTable"
                    :empty-text="
                        pointList.length ? '暂无数据' : '请先在地图上绘制工单范围'
                    "
                    :empty-text="pointList.length ? '暂无数据' : '请先在地图上绘制工单范围'"
                    ref="deviceTableRef"
                    :data="pointList.length ? deviceList : []"
                    row-key="id"
@@ -284,7 +281,12 @@
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'
import {
    getTaskTypeLabel,
    taskTypeCascaderProps,
    toTaskTypeCascaderValue,
    toTaskTypeRequestValue,
} from '../taskTypeOptions'
const store = useStore()
const permission = computed(() => store.state.user.permission)
const activeName = ref('basic')
@@ -455,11 +457,7 @@
        if (!formData.value.id) {
            formData.value.workOrderStatus = '10'
        }
        const payload = {
            ...formData.value,
            workOrderType: toTaskTypeRequestValue(formData.value.workOrderType),
        }
        await gdWorkOrderSaveApi(payload)
        await gdWorkOrderSaveApi(formData.value)
        ElMessage.success(dialogMode.value === 'add' ? '新增成功' : '更新成功')
        visible.value = false
        emit('success')
@@ -725,7 +723,6 @@
        }
    }
}
.content {
    display: flex;
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
@@ -6,28 +6,58 @@
        </el-tabs>
        <el-form ref="queryParamsRef" :model="searchParams" class="gd-search-form">
            <el-form-item label="工单名称" prop="workOrderName">
                <el-input class="gd-input gray" v-model="searchParams.workOrderName" placeholder="请输入" clearable
                    @clear="handleSearch" />
                <el-input
                    class="gd-input gray"
                    v-model="searchParams.workOrderName"
                    placeholder="请输入"
                    clearable
                    @clear="handleSearch"
                />
            </el-form-item>
            <el-form-item label="工单类型" prop="workOrderType">
                <el-cascader class="gd-cascader gray" popper-class="gd-cascader-popper" v-model="searchParams.workOrderType"
                    :options="workOrderTypeXT" :props="taskTypeFilterCascaderProps" placeholder="请选择" clearable
                    @change="handleSearch" />
                <el-cascader
                    class="gd-cascader gray"
                    popper-class="gd-cascader-popper"
                    v-model="searchParams.workOrderType"
                    :options="workOrderTypeXT"
                    :props="taskTypeCascaderProps"
                    placeholder="请选择"
                    clearable
                    @change="handleSearch"
                />
            </el-form-item>
            <el-form-item label="工单状态" prop="workOrderStatus">
                <el-select class="gd-select gray" popper-class="gd-select-popper" v-model="searchParams.workOrderStatus"
                    placeholder="请选择" clearable @change="handleSearch">
                    <el-option v-for="item in dictObj.workOrderStatus" :key="item.dictKey"
                        :label="item.dictValue.split('_')[1]" :value="item.dictKey" />
                <el-select
                    class="gd-select gray"
                    popper-class="gd-select-popper"
                    v-model="searchParams.workOrderStatus"
                    placeholder="请选择"
                    clearable
                    @change="handleSearch"
                >
                    <el-option
                        v-for="item in dictObj.workOrderStatus"
                        :key="item.dictKey"
                        :label="item.dictValue.split('_')[1]"
                        :value="item.dictKey"
                    />
                </el-select>
            </el-form-item>
            <el-form-item label="执行时间" prop="executeTime">
                <el-date-picker class="gd-date-picker gray" popper-class="gd-date-picker-popper" v-model="dateRange"
                    type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
                    value-format="YYYY-MM-DD HH:mm:ss" @change="handleSearch" />
                <el-date-picker
                    class="gd-date-picker gray"
                    popper-class="gd-date-picker-popper"
                    v-model="dateRange"
                    type="daterange"
                    range-separator="-"
                    start-placeholder="开始日期"
                    end-placeholder="结束日期"
                    value-format="YYYY-MM-DD HH:mm:ss"
                    @change="handleSearch"
                />
            </el-form-item>
            <el-form-item class="gd-search-actions">
@@ -38,8 +68,7 @@
        <div class="gd-table-container" v-loading="loading">
            <div class="gd-table-toolbar">
                <el-button v-if="permission.order_release" :icon="Plus" color="#4C34FF" type="primary"
                    @click="openForm('add')">
                <el-button v-if="permission.order_release" :icon="Plus" color="#4C34FF" type="primary" @click="openForm('add')">
                    新增工单
                </el-button>
            </div>
@@ -85,9 +114,14 @@
            </div>
            <div class="gd-pagination-parent">
                <el-pagination popper-class="gd-select-popper" v-model:current-page="searchParams.current"
                    v-model:page-size="searchParams.size" layout="total, prev, pager, next, sizes" :total="total"
                    @change="getList" />
                <el-pagination
                    popper-class="gd-select-popper"
                    v-model:current-page="searchParams.current"
                    v-model:page-size="searchParams.size"
                    layout="total, prev, pager, next, sizes"
                    :total="total"
                    @change="getList"
                />
            </div>
        </div>
@@ -109,7 +143,11 @@
import testDock from '@/assets/docx/testDocx.docx'
import testPdf from '@/assets/pdf/testPdf.pdf'
import { useStore } from 'vuex'
import { getTaskTypeLabel, normalizeTaskTypeOptions, taskTypeFilterCascaderProps } from '../taskTypeOptions'
import {
    getTaskTypeLabel,
    normalizeTaskTypeOptions,
    taskTypeCascaderProps,
} from '../taskTypeOptions'
const store = useStore()
const activeName = ref('all')
@@ -157,6 +195,7 @@
            startTime: range[0],
            endTime: range[1],
            createUser: activeName.value === 'my' ? store.state.user.userInfo.user_id : '',
            workOrderType: searchParams?.value?.workOrderType?.join?.(','),
        })
        list.value = res?.data?.data?.records ?? []
        total.value = res?.data?.data?.total ?? 0
applications/task-work-order/src/views/orderView/orderManage/taskTypeOptions.js
@@ -61,11 +61,9 @@
    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 = []) {
    if (!value?.length) return ''
    const paths = toTaskTypeCascaderValue(value)
    if (paths.length) {
        return paths
@@ -91,15 +89,5 @@
    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,
}