吉安感知网项目-前端
张含笑
2026-01-30 c67c65b01d5a275cd86b70596f2fa11cb10fe15d
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
@@ -28,30 +28,40 @@
         </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>
@@ -65,7 +75,11 @@
                  <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"
@@ -75,15 +89,18 @@
                        />
                     </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"
@@ -94,7 +111,11 @@
                        </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"
@@ -107,7 +128,11 @@
                        />
                     </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"
@@ -120,7 +145,11 @@
                        </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"
@@ -139,7 +168,11 @@
                        </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"
@@ -234,12 +267,21 @@
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
   }
@@ -247,7 +289,17 @@
// 添加任务行
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)
   }
}
// 删除任务行
@@ -270,7 +322,7 @@
// 获取工单列表
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 ?? []
}
@@ -308,19 +360,41 @@
   }
)
// 判断一行是否已填写(至少填写了任务名称)
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
@@ -348,8 +422,9 @@
   }
   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,
@@ -371,7 +446,7 @@
   if (dialogMode.value === 'add') {
      selectedWorkOrderId.value = null
      selectedWorkOrder.value = null
      taskList.value = [initTaskRow()]
      taskList.value = [initTaskRow(), initTaskRow(), initTaskRow(), initTaskRow(), initTaskRow()]
      flyerListMap.value = {}
   } else {
      // 编辑/查看模式 - 加载已有数据
@@ -386,9 +461,7 @@
   }
}
onMounted(() => {
})
onMounted(() => {})
defineExpose({ open })
</script>
@@ -401,4 +474,12 @@
   display: flex;
   align-items: center;
}
.required-star {
   color: #f56c6c;
   margin-right: 4px;
}
.grayText {
   color: #9f9f9f;
}
</style>