Przeglądaj źródła

红外热成像固定大小

xuzhancheng 1 miesiąc temu
rodzic
commit
b090e347f2

+ 1 - 0
yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/components/StatusOperationPanel.vue

@@ -1876,6 +1876,7 @@ const initPreview=()=>{
 
   initData.value.templateId = templateId;
   initData.value.refId = refId;
+  initData.value.refName =  props.selectedItem?.reportName;
   initData.value.opType = (props.selectedItem.taskStatus == 510 || props.selectedItem.taskStatus >= 600 || (showReportPdfType.value === 'record' && props.selectedItem.taskStatus > 500) ||  props?.selectedItem?.checkUsers?.[0]?.id != userStore?.user?.id) ? 1 : 0;
   if (props.selectedItem.reportType === PressureReportType['INSPECTIONPLAN'] && props.selectedItem.manualUrl){
     initData.value.manualUrl = props.selectedItem.manualUrl;

+ 268 - 268
yudao-ui-admin-vue3/src/views/pressure2/schedule/components/ShiftSchedule.vue

@@ -99,13 +99,10 @@
             <Icon icon="ep:refresh" class="mr-5px"/>
             重置
           </el-button>
-          <el-button type="primary" @click="handleCopy" :disabled="selectedRows.length !== 1">
-            <Icon icon="ep:document-copy" class="mr-5px"/>
-            复制
-          </el-button>
-          <el-button type="success" @click="handleSubmit" :disabled="!hasCopiedRows">
+
+          <el-button type="success" @click="handleSubmit" :disabled="!hasModifiedRows && !hasCopiedRows">
             <Icon icon="ep:upload" class="mr-5px"/>
-            提交
+            提交修改
           </el-button>
           <el-button type="success" @click="handleExport" :loading="exportLoading">
             <Icon icon="ep:download" class="mr-5px"/>
@@ -122,12 +119,12 @@
         @current-change="handleCurrentChange"
         @row-click="handleRowClick"
         @sort-change="handleSortChange"
-        :row-key="getRowKey"
         class="shift-schedule-table"
         ref="tableRef"
         :row-class-name="getRowClassName"
         highlight-current-row
       >
+        <el-table-column type="selection" width="55" fixed="left" />
         <el-table-column label="日期" prop="date" width="170" align="center" fixed="left" sortable>
           <template #default="{ row }">
             <div class="date-cell">
@@ -181,7 +178,7 @@
                   <CheckerSelect
                     :ref="(el) => setCheckerSelectRef(el, row.id)"
                     :dept-id="userStore.getUser.deptId?.toString() || props.relateDepartment"
-                    :model-value="row.checkerItems || []"
+                    v-model="row.teamList"
                     :multiple="true"
                     :has-data="true"
                     @change="(checkers) => handleCheckerSelectChange(checkers, row)"
@@ -205,11 +202,11 @@
         <el-table-column label="电话" prop="contactPhone" width="130" align="center"/>
 
         <!-- 管道介质 -->
-        <el-table-column label="管道介质" prop="medium" width="150" align="center">
+        <el-table-column label="管道介质" prop="pipeMedium" width="150" align="center">
           <template #default="{ row }">
             <div>
               <el-tag
-                v-for="m in row.medium"
+                v-for="m in (row.pipeMedium || [])"
                 :key="m"
                 size="small"
                 class="mr-5px mb-5px"
@@ -217,6 +214,7 @@
               >
                 {{ m }}
               </el-tag>
+              <span v-if="!row.pipeMedium || row.pipeMedium.length === 0">-</span>
             </div>
           </template>
         </el-table-column>
@@ -225,13 +223,19 @@
         <el-table-column label="管线长度 (m)" prop="pipeLengthTotal" width="120" align="center">
           <template #default="{ row }">
             <span class="font-mono font-semibold text-blue-800">
-              {{ row.pipeLengthTotal?.toFixed(2) || '-' }}
+              {{ row.pipeLengthTotal || '-' }}
             </span>
           </template>
         </el-table-column>
 
-        <el-table-column label="区域街道" prop="street" width="120" align="center"/>
-        <el-table-column label="上次报告编号" prop="lastReportNo" width="150" align="center"/>
+        <el-table-column label="区域街道" prop="equipStreetName" width="120" align="center">
+          <template #default="{ row }">
+            <span>
+              {{ row.equipDistrictName + ' ' + row.equipStreetName || '-' }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="上次报告编号" prop="lastLegalPeriodicalInspectionReportNo" width="150" align="center"/>
         <el-table-column label="监督报告编号" prop="lastMaintenanceReportNo" width="150"
                          align="center"/>
 
@@ -261,7 +265,7 @@
               </template>
               <div class="flex items-center justify-center gap-6px cursor-help">
                 <span>状态</span>
-                <Icon icon="ep:question-filled" class="text-gray-400" size="14"/>
+                <Icon icon="ep:question-filled" class="text-gray-400" :size="14"/>
               </div>
             </el-tooltip>
           </template>
@@ -305,22 +309,28 @@ const props = defineProps<{
 // ==================== 数据定义 ====================
 interface ScheduleRow {
   id?: string
+  index?: number // 行索引
+  sourceIndex?: number // 源行索引
   date: string
   week: string
   checkers?: string[] // 检验员ID数组(用于提交)
-  checkerItems?: CheckerItem[] // 检验员对象数组(用于显示和编辑)
   teamList?: any[] // 团队列表(后端返回的完整数据)
   checkType?: string
   unitName?: string
-  address?: string
+  pipeAddress?: string // 管道使用地址
   contact?: string
   contactPhone?: string
-  medium?: string[]
-  pipeLengthTotal?: number
-  street?: string
-  lastReportNo?: string
-  lastMaintenanceReportNo?: string
-  status?: any
+  pipeMedium?: string[] // 管道介质
+  pipeLengthTotal?: string // 管道长度
+  equipDistrictName?: string // 设备所在区域名称
+  equipStreetName?: string // 设备所在街道名称
+  lastLegalPeriodicalInspectionReportNo?: string // 上次定检报告编号
+  confirmOrderId?: string // 确认订单ID
+  modified?: boolean // 是否被修改
+  originalData?: any // 原始数据,用于比较
+  lastYearReportNo?: string // 上次年检报告编号
+  lastMaintenanceReportNo?: string // 监督检验报告编号
+  status?: number // 状态, 100 已排期 200 待约检 300 已受理 400 检测中
   isCopied?: boolean // 是否为复制的行
   submitted?: boolean // 是否已提交
 }
@@ -332,6 +342,11 @@ const tableData = ref<ScheduleRow[]>([])
 const selectedRows = ref<ScheduleRow[]>([])
 const tableRef = ref()
 
+// 处理选择变化
+const handleSelectionChange = (val: ScheduleRow[]) => {
+  selectedRows.value = val
+}
+
 // 用户store
 const userStore = useUserStoreWithOut()
 
@@ -347,29 +362,47 @@ const queryParams = reactive({
   unitName: '',
   status: '',
   orderBy: '',      // 排序字段
-  orderType: ''     // 排序类型:asc-升序,desc-降序
+  orderType: '',     // 排序类型:asc-升序,desc-降序
+  relateDepartment: '' // 关联部门
 })
 
 
 // ==================== 方法 ====================
 
-// 获取行的唯一key(用于table的row-key)
-const getRowKey = (row: ScheduleRow): string => {
-  // 复制的行使用taskId+date作为唯一标识
-  // 避免同一任务的多行有相同的id导致表格渲染异常
-  if (row.id && row.date) {
-    return `${row.id}_${row.date}`
-  }
-  return row.id || Math.random().toString(36)
-}
 
 // 获取检验员昵称列表(用于显示)
 const getCheckerNames = (row: ScheduleRow): string => {
-  if (!row.checkerItems || row.checkerItems.length === 0) {
-    return ''
+  if (row.teamList && row.teamList.length > 0) {
+    // 从 teamList 中获取所有检验员名称,用顿号分隔
+    const allMembers: string[] = [];
+    row.teamList.forEach(team => {
+      // 添加组长
+      if (team.leaders && team.leaders.length > 0) {
+        team.leaders.forEach(leader => {
+          if (leader.nickname) {
+            allMembers.push(leader.nickname);
+          } else if (leader.id) {
+            allMembers.push(leader.id);
+          }
+        });
+      }
+      // 添加成员
+      if (team.members && team.members.length > 0) {
+        team.members.forEach(member => {
+          if (member.nickname) {
+            allMembers.push(member.nickname);
+          } else if (member.id) {
+            allMembers.push(member.id);
+          }
+        });
+      }
+    });
+    return allMembers.join('、') || '';
+  } else if (row.checkers && row.checkers.length > 0) {
+    // 如果只有 checkers ID 列表,直接显示 ID
+    return row.checkers.join('、');
   }
-  // 直接返回所有检验员名称,用顿号分隔
-  return row.checkerItems.map(item => item.member?.nickname).filter(Boolean).join('、')
+  return ''
 }
 
 // 设置 CheckerSelect 引用
@@ -387,39 +420,13 @@ const handlePopoverShow = async (row: ScheduleRow) => {
 
   currentEditingRow.value = row
 
-  // 获取当前行的 CheckerSelect 引用
   const checkerSelectRef = checkerSelectRefs.value[row.id]
-  if (!checkerSelectRef) {
-    console.warn('CheckerSelect ref not found for row:', row.id)
-    return
-  }
 
   // 加载检验员列表
   const deptId = userStore.getUser.deptId?.toString() || props.relateDepartment
-  await nextTick()
   await checkerSelectRef.getCheckerList(deptId)
-
-  // 如果有已选择的检验员,需要从完整列表中匹配出完整信息
-  if (row.checkers && row.checkers.length > 0) {
-    await nextTick()
-    const fullMemberList = checkerSelectRef.getAllMembersFromData?.() || []
-
-    // 将简化的checkerItems转换为完整的checkerItems
-    const completeCheckerItems = row.checkers.map(checkerId => {
-      // 从完整列表中查找匹配的检验员
-      const matchedMember = fullMemberList.find(m => m.memberId.toString() === checkerId.toString())
-      if (matchedMember) {
-        return matchedMember
-      }
-      // 如果没找到,返回原始数据
-      return row.checkerItems?.find(c => c.memberId.toString() === checkerId.toString())
-    }).filter(Boolean)
-
-    // 更新当前行的检验员数据
-    if (completeCheckerItems.length > 0) {
-      row.checkerItems = completeCheckerItems
-    }
-  }
+  console.log(row.teamList)
+  row.teamList = row.teamList || []
 }
 
 // 关闭Popover
@@ -432,10 +439,36 @@ const handleCheckerSelectChange = (selectedCheckers: CheckerItem[], row: Schedul
   if (!row) {
     return
   }
-  // 更新当前行的检验员数据
-  row.checkerItems = [...selectedCheckers]
   // 同步更新checkers数组(用于提交)- 只需要memberId
   row.checkers = selectedCheckers.map(c => c.memberId.toString())
+  
+  // 构建 teamList
+  const teamMap = new Map<string, any>()
+  selectedCheckers.forEach(item => {
+    const groupTeamId = String(item.groupTeamId || '')
+    if (!teamMap.has(groupTeamId)) {
+      teamMap.set(groupTeamId, {
+        groupTeamId: groupTeamId,
+        leaders: [],
+        members: []
+      })
+    }
+    const team = teamMap.get(groupTeamId)
+    if (item.isLeader) {
+      team.leaders.push({
+        id: item.memberId,
+        nickname: item.member?.nickname || ''
+      })
+    } else {
+      team.members.push({
+        id: item.memberId,
+        nickname: item.member?.nickname || ''
+      })
+    }
+  })
+  row.teamList = Array.from(teamMap.values())
+  // 标记为已修改
+  row.modified = true
 }
 
 // 处理日期变更
@@ -446,7 +479,8 @@ const handleDateChange = (row: ScheduleRow) => {
   }
   // 更新星期
   row.week = calculateWeek(row.date)
-
+  // 标记为已修改
+  row.modified = true
 }
 
 // 通过日期计算星期
@@ -457,7 +491,10 @@ const calculateWeek = (dateStr: string): string => {
 }
 
 // 获取状态文本
-const getStatusText = (status: number | string): string => {
+const getStatusText = (status: number | string | null | undefined): string => {
+  if (status === null || status === undefined) {
+    return '未知'
+  }
   const statusMap: Record<number, string> = {
     100: '已排期',
     200: '待约检',
@@ -468,7 +505,10 @@ const getStatusText = (status: number | string): string => {
 }
 
 // 获取状态样式类
-const getStatusClass = (status: number | string): string => {
+const getStatusClass = (status: number | string | null | undefined): string => {
+  if (status === null || status === undefined) {
+    return ''
+  }
   const classMap: Record<number, string> = {
     100: 'dot-scheduled',
     200: 'dot-pending-appointment',
@@ -480,11 +520,11 @@ const getStatusClass = (status: number | string): string => {
 
 // 判断是否可以编辑
 const canEdit = (row: ScheduleRow): boolean => {
-  // 只有刚复制且未提交的行可以编辑
-  if (row.isCopied && !row.submitted) {
+  // 受理前(状态为 100 已排期或 200 待约检)的行可以编辑
+  if (row.status === 100 || row.status === 200) {
     return true
   }
-  // 其他行不可编辑
+  // 其他行不可编辑
   return false
 }
 
@@ -493,150 +533,191 @@ const hasCopiedRows = computed(() => {
   return tableData.value.some(row => row.isCopied && !row.submitted)
 })
 
+// 是否有修改的行
+const hasModifiedRows = computed(() => {
+  return tableData.value.some(row => row.modified)
+})
+
 // 获取行类名
 const getRowClassName = ({row}: { row: ScheduleRow }): string => {
   if (row.isCopied && !row.submitted) {
     return 'copied-row'
   }
+  if (row.modified) {
+    return 'modified-row'
+  }
   return ''
 }
 
 // 复制行
-const handleCopy = () => {
-  if (selectedRows.value.length !== 1) {
-    ElMessage.warning('请选择一行数据进行复制')
+const handleCopy = (row: ScheduleRow) => {
+  // 限制只有有 confirmOrderId 的情况下才能复制
+  if (!row.confirmOrderId) {
+    ElMessage.warning('只有已确认的订单才能复制')
     return
   }
 
-  const sourceRow = selectedRows.value[0]
-
   // 计算下一天的日期
   let nextDate = ''
   let nextWeek = ''
-  if (sourceRow.date) {
-    nextDate = dayjs(sourceRow.date).add(1, 'day').format('YYYY-MM-DD')
+  if (row.date) {
+    nextDate = dayjs(row.date).add(1, 'day').format('YYYY-MM-DD')
     nextWeek = calculateWeek(nextDate)
   }
 
   // 创建新行,复制所有属性
   const newRow: ScheduleRow = {
-    ...sourceRow,
-    sourceIndex: sourceRow.index,
+    ...row,
+    sourceIndex: row.index,
     date: nextDate, // 设置为下一天
     week: nextWeek, // 设置对应的星期
     isCopied: true, // 标记为复制的行
     submitted: false, // 标记为未提交
+    modified: true, // 标记为已修改
     // 清空检验员相关数据
     checkers: [],
-    checkerItems: [],
     teamList: [],
     // 深拷贝其他数组类型字段
-    medium: sourceRow.medium ? [...sourceRow.medium] : []
+    pipeMedium: row.pipeMedium ? [...row.pipeMedium] : []
   }
 
   // 找到源行的索引
-  const sourceIndex = tableData.value.findIndex(row => row.index === sourceRow.index)
+  const sourceIndex = tableData.value.findIndex(r => r.id === row.id)
 
   // 将新行插入到源行后面
   if (sourceIndex !== -1) {
+    // 设置新行的索引为源行索引 + 1
+    newRow.index = sourceIndex + 1
     tableData.value.splice(sourceIndex + 1, 0, newRow)
+    // 更新后续行的索引
+    for (let i = sourceIndex + 2; i < tableData.value.length; i++) {
+      tableData.value[i].index = i
+    }
   } else {
+    // 如果找不到源行,将新行添加到末尾
+    newRow.index = tableData.value.length
     tableData.value.push(newRow)
   }
 
   ElMessage.success('复制成功,日期已自动设为下一天,请修改检验员后提交')
-
-  // 清空选择
-  tableRef.value?.clearSelection()
 }
 // 提交
 const handleSubmit = async () => {
-  // 获取所有复制且未提交的
+  // 获取所有需要提交的行:复制的行和修改的
   const copiedRows = tableData.value.filter(row => row.isCopied && !row.submitted)
-
-  if (copiedRows.length === 0) {
-    ElMessage.warning('没有需要提交的复制行')
+  const modifiedRows = tableData.value.filter(row => row.modified && !row.isCopied)
+  
+  if (copiedRows.length === 0 && modifiedRows.length === 0) {
+    ElMessage.warning('没有需要提交的行')
     return
   }
 
-  // 校验1:检查是否都填写了日期
-  const rowsWithoutDate = copiedRows.filter(row => !row.date || row.date.trim() === '')
-  // 原始日期
-  if (rowsWithoutDate.length > 0) {
-    ElMessage.warning('请为所有复制的行选择日期')
-    return
-  }
-  let isDuplicate = false
-  copiedRows.forEach(row => {
-    let id = row.id
-    let rows = tableData.value.filter(row => row.id === id)
-    // 增加行应该和其他行日期不相同
-    rows.forEach(item => {
-      if (item.date === row.date && row!==item) {
-        isDuplicate = true
-      }
+  // 校验复制的行
+  if (copiedRows.length > 0) {
+    // 校验1:检查是否都填写了日期
+    const rowsWithoutDate = copiedRows.filter(row => !row.date || row.date.trim() === '')
+    if (rowsWithoutDate.length > 0) {
+      ElMessage.warning('请为所有复制的行选择日期')
+      return
+    }
+    
+    // 校验日期是否重复
+    let isDuplicate = false
+    copiedRows.forEach(row => {
+      let id = row.id
+      let rows = tableData.value.filter(row => row.id === id)
+      // 增加行应该和其他行日期不相同
+      rows.forEach(item => {
+        if (item.date === row.date && row!==item) {
+          isDuplicate = true
+        }
+      })
     })
-  })
-  if (isDuplicate) {
-    ElMessage.warning('请为所有复制的行选择不同的日期')
-    return
+    if (isDuplicate) {
+      ElMessage.warning('请为所有复制的行选择不同的日期')
+      return
+    }
+
+    // 校验2:检查是否有检验员
+    const rowsWithoutCheckers = copiedRows.filter(row => !row.checkers || row.checkers.length === 0)
+    if (rowsWithoutCheckers.length > 0) {
+      ElMessage.warning('请为所有复制的行选择检验员')
+      return
+    }
   }
 
-  // 校验2:检查是否有检验员
-  const rowsWithoutCheckers = copiedRows.filter(row => !row.checkers || row.checkers.length === 0)
-  if (rowsWithoutCheckers.length > 0) {
-    ElMessage.warning('请为所有复制的行选择检验员')
-    return
+  // 校验修改的行
+  if (modifiedRows.length > 0) {
+    // 校验1:检查是否都填写了日期
+    const rowsWithoutDate = modifiedRows.filter(row => !row.date || row.date.trim() === '')
+    if (rowsWithoutDate.length > 0) {
+      ElMessage.warning('请为所有修改的行选择日期')
+      return
+    }
+
+    // 校验2:检查是否有检验员
+    const rowsWithoutCheckers = modifiedRows.filter(row => !row.checkers || row.checkers.length === 0)
+    if (rowsWithoutCheckers.length > 0) {
+      ElMessage.warning('请为所有修改的行选择检验员')
+      return
+    }
   }
 
   try {
-    // 转换数据格式,只保留 id、date、teamList
-    const submitData = copiedRows.map(row => {
-      // 从 checkerItems 构建 teamList
-      const teamMap = new Map<string, any>()
-      row.checkerItems?.forEach(item => {
-        const groupTeamId = item.groupTeamId
-
-        if (!teamMap.has(groupTeamId)) {
-          teamMap.set(groupTeamId, {
-            groupTeamId: groupTeamId,
-            leaderId: item.isLeader ? item.memberId : '',
-            memberIdList: []
-          })
-        }
+    ElMessage({ message: '提交中...', type: 'info', duration: 0 })
+    
+    // 处理复制的行
+    const copyPromises = copiedRows.map(async (row) => {
+      // 从 teamList 构建提交数据
+      const teamList = (row.teamList || []).map(team => ({
+        groupTeamId: team.groupTeamId,
+        leaderId: team.leaders?.[0]?.id || '',
+        memberIdList: team.members?.map(member => member.id) || []
+      }))
+
+      const copyData = {
+        sourceId: row.id,
+        newDate: row.date,
+        teamList: teamList
+      }
 
-        const team = teamMap.get(groupTeamId)
-        if (!team.memberIdList.includes(item.memberId) && !item.isLeader) {
-          team.memberIdList.push(item.memberId)
-        }
+      console.log('复制数据:', copyData)
 
-        // 如果是组长,确保 leaderId 正确
-        if (item.isLeader) {
-          team.leaderId = item.memberId
-        }
-      })
+      // 调用复制接口
+      const res = await EquipPipeSchedulingApi.copyEquipPipeScheduling(copyData)
+      return res
+    })
 
-      const teamList = Array.from(teamMap.values())
+    // 处理修改的行
+    const updatePromises = modifiedRows.map(async (row) => {
+      // 从 teamList 构建提交数据
+      const teamList = (row.teamList || []).map(team => ({
+        groupTeamId: team.groupTeamId,
+        leaderId: team.leaders?.[0]?.id || '',
+        memberIdList: team.members?.map(member => member.id) || []
+      }))
 
-      return {
+      const updateData = {
         id: row.id,
         date: row.date,
         teamList: teamList
       }
+
+      console.log('更新数据:', updateData)
+
+      // 调用更新接口
+      const res = await EquipPipeSchedulingApi.setShiftSchedule([updateData])
+      return res
     })
 
-    console.log('提交数据:', submitData)
+    // 执行所有操作
+    await Promise.all([...copyPromises, ...updatePromises])
 
-    const res = await EquipPipeSchedulingApi.setShiftSchedule(submitData)
-    if (res) {
-      ElMessage.success(`成功提交 ${copiedRows.length} 条数据`)
-      // 标记为已提交
-      copiedRows.forEach(row => {
-        row.submitted = true
-      })
-      // 刷新数据
-      await handleQuery()
-    }
+    const totalCount = copiedRows.length + modifiedRows.length
+    ElMessage.success(`成功提交 ${totalCount} 条数据`)
+    
+    // 刷新数据
+    await handleQuery()
   } catch (error) {
     console.error('提交失败:', error)
     ElMessage.error('提交失败')
@@ -647,129 +728,39 @@ const handleSubmit = async () => {
 const handleQuery = async () => {
   loading.value = true
 
-  // 清除表格排序状态
+  // 清除单选状态
   if (tableRef.value) {
-    tableRef.value.clearSort()
-    // 清除单选状态
     tableRef.value.setCurrentRow(null)
   }
 
-  // 清空选中的行
-  selectedRows.value = []
-
   queryParams.relateDepartment = props.relateDepartment
   const res = await EquipPipeSchedulingApi.planSchedulingShiftSchedule(queryParams)
 
-  // 处理数据并按检验员日期分组展开
-  const expandedRows: ScheduleRow[] = []
-  let rowIndex = 0;
-  
-  res.forEach((row) => {
-    const taskItem = row.taskItems[0];
-    const baseDate = formatArrayDate(row.date)
-
-    // 提取所有唯一的日期
-    const dateSet = new Set<string>()
-    dateSet.add(baseDate) // 添加基础日期
-
-    // 从 teamList 中收集所有检验员的日期
-    if (row.teamList && row.teamList.length > 0) {
-      row.teamList.forEach(team => {
-        // 检查组长的日期
-        if (team.leaders && team.leaders.length > 0) {
-          team.leaders.forEach(leader => {
-            if (leader.date && Array.isArray(leader.date)) {
-              dateSet.add(formatArrayDate(leader.date))
-            }
-          })
-        }
-        // 检查组员的日期
-        if (team.members && team.members.length > 0) {
-          team.members.forEach(member => {
-            if (member.date && Array.isArray(member.date)) {
-              dateSet.add(formatArrayDate(member.date))
-            }
-          })
-        }
-      })
-    }
-
-    // 为每个唯一日期创建一行
-    const uniqueDates = Array.from(dateSet).sort()
-    
-    uniqueDates.forEach((dateStr, index) => {
-      const newRow: ScheduleRow = {
-        ...row,
-        date: dateStr,
-        index: rowIndex++,
-        week: calculateWeek(dateStr),
-        unitName: taskItem.unitName,
-        pipeAddress: taskItem.pipeAddress,
-        checkType: taskItem.checkType,
-        medium: row.pipeMedium.filter((medium, idx, self) => self.indexOf(medium) === idx),
-        contact: [...new Set(row.taskItems?.map(item => item.contact).filter(Boolean))].join('/') || '',
-        contactPhone: [...new Set(row.taskItems?.map(item => item.contactPhone).filter(Boolean))].join('/') || '',
-        pipeLengthTotal: row.taskItems?.reduce((acc, cur) => acc + (parseFloat(cur.pipeLengthTotal) || 0), 0),
-        lastReportNo: taskItem.checkType == 100 ? taskItem.lastLegalPeriodicalInspectionReportNo : taskItem.lastYearReportNo,
-        lastMaintenanceReportNo: taskItem.lastMaintenanceReportNo,
-        street: (taskItem.equipDistrictName || '') + (taskItem.equipStreetName || ''),
-        teamList: row.teamList ? JSON.parse(JSON.stringify(row.teamList)) : [],
-        isCopied: false,
-        submitted: false
-      }
-
-      // 初始化检验员数据 - 根据当前行的日期筛选检验员
-      if (newRow.teamList && newRow.teamList.length > 0) {
-        const checkerItems: CheckerItem[] = []
-
-        newRow.teamList.forEach(team => {
-          // 添加组长(如果组长的日期匹配当前行日期或没有指定日期)
-          if (team.leaders && team.leaders.length > 0) {
-            team.leaders.forEach(leader => {
-              const leaderDate = leader.date && Array.isArray(leader.date) ? formatArrayDate(leader.date) : baseDate
-              if (leaderDate === dateStr) {
-                checkerItems.push({
-                  groupTeamId: team.groupTeamId,
-                  memberId: leader.id,
-                  leaderId: leader.id,
-                  member: leader,
-                  isLeader: true
-                })
-              }
-            })
-          }
-
-          // 添加组员(如果组员的日期匹配当前行日期或没有指定日期)
-          if (team.members && team.members.length > 0) {
-            team.members.forEach(member => {
-              const memberDate = member.date && Array.isArray(member.date) ? formatArrayDate(member.date) : baseDate
-              if (memberDate === dateStr) {
-                checkerItems.push({
-                  groupTeamId: team.groupTeamId,
-                  memberId: member.id,
-                  leaderId: team.leaders?.[0]?.id || '',
-                  member: member,
-                  isLeader: false
-                })
-              }
-            })
-          }
-        })
-
-        newRow.checkerItems = checkerItems
-        newRow.checkers = checkerItems.map(c => c.memberId)
-      } else {
-        newRow.checkerItems = []
-        newRow.checkers = []
-      }
-
-      expandedRows.push(newRow)
-    })
-  })
-
-  // 按日期排序
-  expandedRows.sort((a, b) => dayjs(a.date).valueOf() - dayjs(b.date).valueOf())
-  tableData.value = expandedRows
+  // 处理后端返回的null值
+  tableData.value = (res || []).map((item, index) => ({
+    ...item,
+    index,
+    date: item.date ? dayjs(item.date).format('YYYY-MM-DD') : '',
+    week: item.week || '',
+    checkers: item.checkers || [],
+    teamList: item.teamList || [],
+    checkType: item.checkType || '',
+    unitName: item.unitName || '',
+    pipeAddress: item.pipeAddress || '',
+    contact: item.contact || '',
+    contactPhone: item.contactPhone || '',
+    pipeMedium: item.pipeMedium || [],
+    pipeLengthTotal: item.pipeLengthTotal || '',
+    equipDistrictName: item.equipDistrictName || '',
+    equipStreetName: item.equipStreetName || '',
+    lastLegalPeriodicalInspectionReportNo: item.lastLegalPeriodicalInspectionReportNo || '',
+    lastYearReportNo: item.lastYearReportNo || '',
+    lastMaintenanceReportNo: item.lastMaintenanceReportNo || '',
+    confirmOrderId: item.confirmOrderId || '',
+    status: item.status,
+    isCopied: false,
+    submitted: true
+  }))
   loading.value = false
 }
 
@@ -898,6 +889,15 @@ watch(() => props.month, async (newMonth, oldMonth) => {
       }
     }
 
+    // 修改的行高亮显示
+    :deep(.el-table__row.modified-row) {
+      background-color: #e7f3ff !important;
+
+      td {
+        background-color: #e7f3ff !important;
+      }
+    }
+
     :deep(.el-table__row td:first-child) {
       font-weight: 600;
       color: #113355;