| applications/task-work-order/src/views/orderView/orderManage/clueEvents/DistributeDiaLog.vue | ●●●●● patch | view | raw | blame | history | |
| applications/task-work-order/src/views/orderView/orderManage/clueEvents/ViewDiaLog.vue | ●●●●● patch | view | raw | blame | history | |
| applications/task-work-order/src/views/orderView/orderManage/clueEvents/achievementApi.js | ●●●●● patch | view | raw | blame | history | |
| applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue | ●●●●● patch | view | raw | blame | history | |
| applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue | ●●●●● patch | view | raw | blame | history |
applications/task-work-order/src/views/orderView/orderManage/clueEvents/DistributeDiaLog.vue
New file @@ -0,0 +1,142 @@ <template> <el-dialog class="gd-dialog" v-model="visible" title="转为事件并分发" @closed="handleClosed" width="500px" destroy-on-close :close-on-click-modal="false" > <el-form class="gd-dialog-form" ref="formRef" :model="formData" :rules="rules" label-width="100px"> <el-row> <el-col :span="24"> <el-form-item label="处置部门" prop="disposeDept"> <el-tree-select class="gd-select" popper-class="gd-tree-select-popper" v-model="formData.disposeDept" node-key="id" :data="deptTree" :props="treeProps" check-strictly @change="deptChange" clearable /> </el-form-item> </el-col> <el-col :span="24"> <el-form-item label="工单处置人" prop="disposeUser"> <el-select class="gd-select" popper-class="gd-select-popper" v-model="formData.disposeUser" placeholder="请选择" :disabled="!formData.disposeDept" clearable > <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id" /> </el-select> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <el-button color="#F2F3F5" @click="visible = false">取消</el-button> <el-button class="save-btn" color="#4C34FF" :loading="submitting" :disabled="submitting" @click="handleSubmit"> 保存 </el-button> </template> </el-dialog> </template> <script setup> import { ref, watch } from 'vue' import { ElMessage } from 'element-plus' import { fieldRules } from '@ztzf/utils' import { gdTaskResultDistributeApi, getUserListApi } from './achievementApi' // 初始化表单数据 const initForm = () => ({ disposeDept: '', // 处置部门 disposeUser: '', // 工单处置人 }) const deptTree = inject('deptTree') const treeProps = inject('treeProps') const emit = defineEmits(['success']) const formRef = ref(null) const formData = ref(initForm()) const visible = defineModel() const submitting = ref(false) const userList = ref([]) const currentRow = ref(null) // 当前线索数据 const workOrderId = ref(null) // 工单ID // 校验规则 const rules = { disposeDept: fieldRules(true), disposeUser: fieldRules(true), } // 部门变更时清空人员并重新获取 function deptChange() { formData.value.disposeUser = '' } // 获取用户列表 function getUserList() { if (!formData.value.disposeDept) { userList.value = [] return } getUserListApi(formData.value.disposeDept).then(res => { userList.value = res?.data?.data?.records ?? [] }) } // 监听部门变化获取用户列表 watch(() => formData.value.disposeDept, getUserList) // 提交分发 async function handleSubmit() { const isValid = await formRef.value?.validate().catch(() => false) if (!isValid) return submitting.value = true try { const params = { areaCode: currentRow.value.areaCode || '', disposeDept: formData.value.disposeDept, disposeUser: formData.value.disposeUser, latitude: currentRow.value.latitude || 0, longitude: currentRow.value.longitude || 0, resultId: currentRow.value.id, workOrderId: workOrderId.value, } await gdTaskResultDistributeApi(params) ElMessage.success('分发成功') visible.value = false emit('success') } finally { submitting.value = false } } // 关闭后重置 function handleClosed() { formData.value = initForm() userList.value = [] } // 打开弹框 async function open({ row, workOrderId: orderId } = {}) { currentRow.value = row workOrderId.value = orderId formData.value = initForm() } defineExpose({ open }) </script> <style lang="scss" scoped></style> applications/task-work-order/src/views/orderView/orderManage/clueEvents/ViewDiaLog.vue
New file @@ -0,0 +1,122 @@ <template> <el-dialog class="gd-dialog" v-model="visible" title="查看" @closed="visible = false" width="1000px" destroy-on-close> <div class="gd-table-container" v-loading="loading"> <div class="gd-table-content gd-table-content-bg"> <el-table class="gd-table" :data="list"> <el-table-column label="线索缩略图" width="120"> <template v-slot="{ row }"> <el-image v-if="row.resultUrl" :src="row.resultUrl" :preview-src-list="[row.resultUrl]" fit="cover" style="width: 80px; height: 60px" preview-teleported /> <span v-else>-</span> </template> </el-table-column> <el-table-column prop="resultCode" show-overflow-tooltip label="线索编号" /> <el-table-column prop="shootTime" show-overflow-tooltip label="拍摄时间" /> <el-table-column label="线索位置" show-overflow-tooltip> <template v-slot="{ row }"> {{ formatLocation(row) }} </template> </el-table-column> <el-table-column prop="distributeStatus" show-overflow-tooltip label="线索状态"> <template v-slot="{ row }"> {{ getDistributeStatusLabel(row.distributeStatus) }} </template> </el-table-column> <el-table-column prop="distributeDeptName" show-overflow-tooltip label="分发部门" /> <el-table-column prop="distributeUserName" show-overflow-tooltip label="分发人员" /> <el-table-column label="操作" class-name="operation-btns" width="140"> <template v-slot="{ row }"> <el-link @click="openDistributeDialog(row)" :disabled="row.distributeStatus === 1"> 转为事件并分发 </el-link> </template> </el-table-column> </el-table> </div> </div> <template #footer> <el-button color="#F2F3F5" @click="visible = false">关闭</el-button> </template> <DistributeDiaLog ref="distributeDialogRef" v-if="distributeDialogVisible" v-model="distributeDialogVisible" @success="getList" /> </el-dialog> </template> <script setup> import { ref } from 'vue' import { gdTaskResultListApi } from './achievementApi' import DistributeDiaLog from './DistributeDiaLog.vue' const visible = defineModel() const loading = ref(false) const list = ref([]) const currentRow = ref(null) // 当前行数据 const distributeDialogRef = ref(null) const distributeDialogVisible = ref(false) // 分发状态选项 const distributeStatusOptions = [ { label: '未分发', value: 0 }, { label: '已分发', value: 1 }, { label: '已驳回', value: 2 }, ] // 获取分发状态标签 function getDistributeStatusLabel(value) { const item = distributeStatusOptions.find(item => item.value === value) return item ? item.label : value } // 格式化位置信息 function formatLocation(row) { if (row.longitude && row.latitude) { return `${row.longitude}, ${row.latitude}` } return row.areaCode || '-' } // 获取成果列表 async function getList() { if (!currentRow.value?.id) return loading.value = true try { const res = await gdTaskResultListApi({ patrolTaskId: currentRow.value.id }) list.value = res?.data?.data ?? [] } finally { loading.value = false } } // 打开分发弹框 function openDistributeDialog(row) { distributeDialogVisible.value = true nextTick(() => { distributeDialogRef.value?.open({ row, workOrderId: currentRow.value.workOrderId, }) }) } // 打开弹框 async function open({ row } = {}) { currentRow.value = row await getList() } defineExpose({ open }) </script> <style lang="scss" scoped></style> applications/task-work-order/src/views/orderView/orderManage/clueEvents/achievementApi.js
New file @@ -0,0 +1,32 @@ import request from '@/axios' // 获取成果列表(根据巡查任务ID) export const gdTaskResultListApi = params => { return request({ url: `/drone-gd/workOrder/gdTaskResult/list`, method: 'get', params, }) } // 分发事件 export const gdTaskResultDistributeApi = data => { return request({ url: `/drone-gd/workOrder/gdTaskResult/distribute`, method: 'post', data, }) } // 获取用户列表(根据部门ID) export const getUserListApi = deptId => { return request({ url: '/blade-system/user/page', method: 'get', params: { current: 1, size: 999, deptId, }, }) } applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue
@@ -1,9 +1,209 @@ <template> <basic-container> 基础管理 </basic-container> <basic-container> <el-form ref="queryParamsRef" :model="searchParams" class="gd-search-form"> <el-form-item label="任务名称" prop="patrolTaskName"> <el-input class="gd-input" v-model="searchParams.patrolTaskName" placeholder="请输入" clearable @clear="handleSearch" /> </el-form-item> <el-form-item label="任务类型" prop="patrolTaskType"> <el-select class="gd-select" popper-class="gd-select-popper" v-model="searchParams.patrolTaskType" placeholder="请选择" clearable @change="handleSearch" > <el-option v-for="item in dictObj.patrolTaskType" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" /> </el-select> </el-form-item> <el-form-item label="任务状态" prop="taskStatus"> <el-select class="gd-select" 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" 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"> <el-button :icon="RefreshRight" @click="resetForm"></el-button> <el-button class="search-btn" :icon="Search" @click="handleSearch"></el-button> </el-form-item> </el-form> <div class="gd-table-container" v-loading="loading"> <div class="gd-table-content gd-table-content-bg"> <el-table class="gd-table" :data="list"> <el-table-column type="index" width="64" label="序号" /> <el-table-column prop="patrolTaskName" show-overflow-tooltip label="巡查任务名称" /> <el-table-column prop="taskNo" show-overflow-tooltip label="巡查任务编号" /> <el-table-column prop="patrolTaskType" show-overflow-tooltip label="巡查任务类型"> <template v-slot="{ row }"> {{ getDictLabel(row.patrolTaskType, dictObj.patrolTaskType) }} </template> </el-table-column> <el-table-column prop="taskStatus" show-overflow-tooltip label="巡查任务状态"> <template v-slot="{ row }"> {{ getDictLabel(row.taskStatus, dictObj.taskStatus) }} </template> </el-table-column> <el-table-column prop="executeTime" show-overflow-tooltip label="任务执行时间" /> <el-table-column prop="workOrderName" show-overflow-tooltip label="关联工单" /> <el-table-column prop="createTime" show-overflow-tooltip label="巡查任务创建时间" /> <el-table-column prop="taskDesc" show-overflow-tooltip label="巡查任务描述" /> <el-table-column label="操作" class-name="operation-btns"> <template v-slot="{ row }"> <el-link @click="viewDiaLogView(row)">查看</el-link> </template> </el-table-column> </el-table> </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" /> </div> </div> <ViewDiaLog ref="viewDiaLogRef" v-if="viewDiaLogVisible" v-model="viewDiaLogVisible" /> </basic-container> </template> <script setup> import { Search, RefreshRight } from '@element-plus/icons-vue' import { onMounted, ref } from 'vue' import { getDictionaryByCode } from '@/api/system/dictbiz' import { dateRangeFormat, getDictLabel } from '@ztzf/utils' import { gdPatrolTaskPageApi } from '../inspectionRequest/inspectionRequestApi' import { getDeptTree } from '@/api/system/dept' import ViewDiaLog from './ViewDiaLog.vue' // 初始化查询参数 const initSearchParams = () => ({ patrolTaskName: '', // 任务名称 patrolTaskType: '', // 任务类型 taskStatus: '', // 任务状态 startTime: '', // 开始时间 endTime: '', // 结束时间 current: 1, // 当前页 size: 10, // 每页大小 }) const searchParams = ref(initSearchParams()) // 查询参数 const dateRange = ref([]) // 执行时间范围 const total = ref(0) // 总条数 const loading = ref(true) // 列表加载中 const list = ref([]) // 列表数据 const queryParamsRef = ref(null) // 查询表单实例 const viewDiaLogRef = ref(null) const viewDiaLogVisible = ref(false) const deptTree = ref([]) // 部门树 const treeProps = { label: 'name', children: 'children', } const dictObj = ref({ patrolTaskType: [], // 巡查任务类型 taskStatus: [], // 巡查任务状态 }) provide('dictObj', dictObj) provide('deptTree', deptTree) provide('treeProps', treeProps) // 获取列表 async function getList() { const range = dateRangeFormat(dateRange.value) loading.value = true try { const res = await gdPatrolTaskPageApi({ ...searchParams.value, startTime: range[0], endTime: range[1] }) list.value = res?.data?.data?.records ?? [] total.value = res?.data?.data?.total ?? 0 } finally { loading.value = false } } // 查询 function handleSearch() { searchParams.value.current = 1 getList() } // 重置查询 function resetForm() { queryParamsRef.value?.resetFields() dateRange.value = [] searchParams.value.current = 1 getList() } // 查看弹框 function viewDiaLogView(row) { viewDiaLogVisible.value = true nextTick(() => { viewDiaLogRef.value?.open({ row }) }) } // 获取字典 function getDictList() { getDictionaryByCode('patrolTaskType,taskStatus').then(res => { dictObj.value = res.data.data }) } // 获取部门树 function getDeptTreeFun() { getDeptTree().then(res => { deptTree.value = res.data.data }) } onMounted(() => { getList() getDictList() getDeptTreeFun() }) </script> <style scoped lang="scss"> </style> <style scoped lang="scss"></style> applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
@@ -38,7 +38,12 @@ clearable @change="handleSearch" > <el-option v-for="item in taskStatusOptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in dictObj.taskStatus" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" /> </el-select> </el-form-item> @@ -66,13 +71,13 @@ <el-button color="#F2F3F5" @click="requester = !requester">我是{{ requester ? '需求方' : '服务方' }}</el-button> <el-button :icon="Plus" color="#4C34FF" type="primary" @click="openForm('add')">新增</el-button> <!-- <el-button :icon="Delete" color="#4C34FF" :disabled="!selectedIds.length" @click="handleDelete()">删除</el-button>--> <!-- <el-button :icon="Delete" color="#4C34FF" :disabled="!selectedIds.length" @click="handleDelete()">删除</el-button>--> </div> <div class="gd-table-container" v-loading="loading"> <div class="gd-table-content gd-table-content-bg"> <el-table class="gd-table" :data="list" @selection-change="handleSelectionChange"> <!-- <el-table-column type="selection" width="46" />--> <!-- <el-table-column type="selection" width="46" />--> <el-table-column type="index" width="64" label="序号" /> <el-table-column prop="patrolTaskName" show-overflow-tooltip label="巡查任务名称" /> <el-table-column prop="taskNo" show-overflow-tooltip label="巡查任务编号" /> @@ -83,7 +88,7 @@ </el-table-column> <el-table-column prop="taskStatus" show-overflow-tooltip label="巡查任务状态"> <template v-slot="{ row }"> {{ getTaskStatusLabel(row.taskStatus) }} {{ getDictLabel(row.taskStatus, dictObj.taskStatus) }} </template> </el-table-column> <el-table-column prop="executeTime" show-overflow-tooltip label="任务执行时间" /> @@ -151,30 +156,11 @@ patrolTaskType: [], // 巡查任务类型 workOrderType: [], // 工单类型 deviceLoadDemand: [], // 设备负载需求 taskStatus: [], // 巡查任务状态 }) // 任务状态选项 const taskStatusOptions = [ { label: '待签收', value: '0' }, { label: '拒绝签收', value: '1' }, { label: '已撤回', value: '2' }, { label: '待审核', value: '3' }, { label: '审核驳回', value: '4' }, { label: '审核通过', value: '5' }, { label: '待验收', value: '6' }, { label: '拒绝验收', value: '7' }, { label: '验收通过', value: '8' }, ] provide('dictObj', dictObj) provide('taskStatusOptions', taskStatusOptions) provide('requester', requester) // 获取任务状态标签 function getTaskStatusLabel(value) { const item = taskStatusOptions.find(item => item.value === value) return item ? item.label : value } // 获取列表 async function getList() { @@ -216,7 +202,7 @@ function viewDiaLogView(row) { viewDiaLogVisible.value = true nextTick(() => { let mode = ['1','4',].includes(row.taskStatus) && requester.value ? 'edit' : 'view' let mode = ['1', '4'].includes(row.taskStatus) && requester.value ? 'edit' : 'view' viewDiaLogRef.value?.open({ mode, row }) }) } @@ -244,7 +230,7 @@ // 获取字典 function getDictList() { getDictionaryByCode('patrolTaskType,workOrderType,deviceLoadDemand').then(res => { getDictionaryByCode('patrolTaskType,workOrderType,deviceLoadDemand,taskStatus').then(res => { dictObj.value = res.data.data }) }