| | |
| | | </div> |
| | | |
| | | <!-- 工单信息展示 --> |
| | | <div class="work-order-info" v-if="selectedWorkOrder"> |
| | | <div class="work-order-info"> |
| | | <el-row class="detail-row-view"> |
| | | <el-col :span="12"> |
| | | <div class="info-item"> |
| | | <span class="label">工单类型</span> |
| | | <span class="val">{{ getDictLabel(selectedWorkOrder.workOrderType, dictObj.workOrderType) }}</span> |
| | | <span class="val" v-if="selectedWorkOrder"> |
| | | {{ getDictLabel(selectedWorkOrder.workOrderType, dictObj.workOrderType) }} |
| | | </span> |
| | | <span class="val grayText" v-else>选择工单后自动带出</span> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="info-item"> |
| | | <span class="label">执行时间范围</span> |
| | | <span class="val">{{ selectedWorkOrder.executeStartTime }} ~ {{ selectedWorkOrder.executeEndTime }}</span> |
| | | <span class="val" v-if="selectedWorkOrder"> |
| | | {{ selectedWorkOrder.executeStartTime }} ~ {{ selectedWorkOrder.executeEndTime }} |
| | | </span> |
| | | <span class="val grayText" v-else>选择工单后自动带出</span> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="info-item"> |
| | | <span class="label">设备需求</span> |
| | | <span class="val">{{ getDictLabel(selectedWorkOrder.deviceLoadDemand, dictObj.deviceLoadDemand) }}</span> |
| | | <span class="val" v-if="selectedWorkOrder"> |
| | | {{ getDictLabel(selectedWorkOrder.deviceLoadDemand, dictObj.deviceLoadDemand) }} |
| | | </span> |
| | | <span class="val grayText" v-else>选择工单后自动带出</span> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="info-item"> |
| | | <span class="label">工单备注</span> |
| | | <span class="val">{{ selectedWorkOrder.remark }}</span> |
| | | <span class="val" v-if="selectedWorkOrder">{{ selectedWorkOrder.remark }}</span> |
| | | <span class="val grayText" v-else>选择工单后自动带出</span> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | <el-table-column width="50" label=""> |
| | | <template v-slot="{ $index }">{{ $index + 1 }}</template> |
| | | </el-table-column> |
| | | <el-table-column prop="patrolTaskName" label="巡查任务名称" min-width="120"> |
| | | <el-table-column prop="patrolTaskName" min-width="120"> |
| | | <template #header> |
| | | <span class="required-star">*</span> |
| | | 巡查任务名称 |
| | | </template> |
| | | <template v-slot="{ row }"> |
| | | <el-input |
| | | class="gd-input" |
| | |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="patrolTaskType" label="巡查任务类型" min-width="140"> |
| | | <template v-slot="{ row, $index }"> |
| | | <el-table-column prop="patrolTaskType" min-width="140"> |
| | | <template #header> |
| | | <span class="required-star">*</span> |
| | | 巡查任务类型 |
| | | </template> |
| | | <template v-slot="{ row }"> |
| | | <el-select |
| | | class="gd-select" |
| | | popper-class="gd-select-popper" |
| | | v-model="row.patrolTaskType" |
| | | placeholder="请选择" |
| | | :disabled="dialogReadonly" |
| | | @change="handlePatrolTaskTypeChange($index, $event)" |
| | | disabled |
| | | > |
| | | <el-option |
| | | v-for="item in dictObj.workOrderType" |
| | |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="executeTime" label="任务执行时间" min-width="180"> |
| | | <el-table-column prop="executeTime" min-width="180"> |
| | | <template #header> |
| | | <span class="required-star">*</span> |
| | | 任务执行时间 |
| | | </template> |
| | | <template v-slot="{ row }"> |
| | | <el-date-picker |
| | | class="gd-date-picker" |
| | |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="patrolRouteUrl" label="巡查任务航线" min-width="120"> |
| | | <el-table-column prop="patrolRouteUrl" min-width="120"> |
| | | <template #header> |
| | | <span class="required-star">*</span> |
| | | 巡查任务航线 |
| | | </template> |
| | | <template v-slot="{ row }"> |
| | | <el-select |
| | | class="gd-select" |
| | |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="recommendFlyerName" label="推荐飞手" min-width="120"> |
| | | <el-table-column prop="recommendFlyerName" min-width="120"> |
| | | <template #header> |
| | | <span class="required-star">*</span> |
| | | 推荐飞手 |
| | | </template> |
| | | <template v-slot="{ row, $index }"> |
| | | <el-select |
| | | class="gd-select" |
| | |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="deviceId" label="选择设备" min-width="120"> |
| | | <el-table-column prop="deviceId" min-width="120"> |
| | | <template #header> |
| | | <span class="required-star">*</span> |
| | | 选择设备 |
| | | </template> |
| | | <template v-slot="{ row }"> |
| | | <el-select |
| | | class="gd-select" |
| | |
| | | const routeOptions = inject('routeOptions') |
| | | |
| | | // 子任务列表 |
| | | const taskList = ref([initTaskRow()]) |
| | | const taskList = ref([initTaskRow(), initTaskRow(), initTaskRow(), initTaskRow(), initTaskRow()]) |
| | | |
| | | // 处理工单选择变化 |
| | | function handleWorkOrderChange(val) { |
| | | if (val) { |
| | | selectedWorkOrder.value = workOrderList.value.find(item => item.id === val) |
| | | // 将工单类型赋值给所有子任务行 |
| | | const workOrderType = selectedWorkOrder.value?.workOrderType |
| | | if (workOrderType) { |
| | | taskList.value.forEach((task, index) => { |
| | | task.patrolTaskType = workOrderType |
| | | // 获取对应的飞手列表 |
| | | getFlyerList(index, workOrderType) |
| | | }) |
| | | } |
| | | } else { |
| | | selectedWorkOrder.value = null |
| | | } |
| | |
| | | |
| | | // 添加任务行 |
| | | function addTaskRow() { |
| | | taskList.value.push(initTaskRow()) |
| | | const newTask = initTaskRow() |
| | | // 如果已选择工单,自动填充工单类型 |
| | | if (selectedWorkOrder.value?.workOrderType) { |
| | | newTask.patrolTaskType = selectedWorkOrder.value.workOrderType |
| | | } |
| | | const newIndex = taskList.value.length |
| | | taskList.value.push(newTask) |
| | | // 获取对应的飞手列表 |
| | | if (newTask.patrolTaskType) { |
| | | getFlyerList(newIndex, newTask.patrolTaskType) |
| | | } |
| | | } |
| | | |
| | | // 删除任务行 |
| | |
| | | |
| | | // 获取工单列表 |
| | | async function getWorkOrderList() { |
| | | const res = await gdWorkOrderPageApi({ size: 999, workOrderStatus: dialogMode.value ==='add' ? '20' : '' }) |
| | | const res = await gdWorkOrderPageApi({ size: 999, workOrderStatus: dialogMode.value === 'add' ? '20' : '' }) |
| | | workOrderList.value = res?.data?.data?.records ?? [] |
| | | } |
| | | |
| | |
| | | } |
| | | ) |
| | | |
| | | // 判断一行是否已填写(至少填写了任务名称) |
| | | function isTaskRowFilled(task) { |
| | | return !!(task.patrolTaskName || task.executeTime || task.patrolRouteUrl || task.recommendFlyerName || task.deviceId) |
| | | } |
| | | |
| | | // 判断一行是否完整填写(所有必填项都有值) |
| | | function isTaskRowComplete(task) { |
| | | return !!( |
| | | task.patrolTaskName && |
| | | task.patrolTaskType && |
| | | task.executeTime && |
| | | task.patrolRouteUrl && |
| | | task.recommendFlyerName && |
| | | task.deviceId |
| | | ) |
| | | } |
| | | |
| | | // 提交新增 |
| | | async function handleSubmit() { |
| | | if (!selectedWorkOrderId.value) { |
| | | ElMessage.warning('请选择关联工单') |
| | | return |
| | | } |
| | | if (!taskList.value.length) { |
| | | ElMessage.warning('请添加至少一个子任务') |
| | | // 过滤出已填写的任务行 |
| | | const filledTasks = taskList.value.filter(task => isTaskRowFilled(task)) |
| | | if (!filledTasks.length) { |
| | | ElMessage.warning('请至少填写一个子任务') |
| | | return |
| | | } |
| | | // 校验子任务 |
| | | // 只校验已填写的子任务 |
| | | for (let i = 0; i < taskList.value.length; i++) { |
| | | const task = taskList.value[i] |
| | | // 跳过未填写的行 |
| | | if (!isTaskRowFilled(task)) continue |
| | | // 已填写的行需要校验完整性 |
| | | if (!task.patrolTaskName) { |
| | | ElMessage.warning(`第${i + 1}行: 请输入巡查任务名称`) |
| | | return |
| | |
| | | } |
| | | submitting.value = true |
| | | try { |
| | | const preID = taskList.value[0].id |
| | | const dataList = taskList.value.map(item => ({ |
| | | const preID = filledTasks[0]?.id |
| | | // 只提交已填写的任务行 |
| | | const dataList = filledTasks.map(item => ({ |
| | | ...item, |
| | | workOrderId: selectedWorkOrderId.value, |
| | | id: undefined, |
| | |
| | | if (dialogMode.value === 'add') { |
| | | selectedWorkOrderId.value = null |
| | | selectedWorkOrder.value = null |
| | | taskList.value = [initTaskRow()] |
| | | taskList.value = [initTaskRow(), initTaskRow(), initTaskRow(), initTaskRow(), initTaskRow()] |
| | | flyerListMap.value = {} |
| | | } else { |
| | | // 编辑/查看模式 - 加载已有数据 |
| | |
| | | } |
| | | } |
| | | |
| | | onMounted(() => { |
| | | |
| | | }) |
| | | onMounted(() => {}) |
| | | |
| | | defineExpose({ open }) |
| | | </script> |
| | |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | .required-star { |
| | | color: #f56c6c; |
| | | margin-right: 4px; |
| | | } |
| | | |
| | | .grayText { |
| | | color: #9f9f9f; |
| | | } |
| | | </style> |