Bladeren bron

服务单详情

xuzhancheng 1 week geleden
bovenliggende
commit
e790f0dc6e

+ 844 - 0
yudao-ui-admin-vue3/src/views/pressure2/financeOrder/components/equipTableList.vue

@@ -0,0 +1,844 @@
+<template>
+  <ContentWrap title="设备清单">
+    <!-- 锅炉设备展示 -->
+    <template v-if="equipMainType === 200">
+      <el-table
+        ref="orderItemsTableRef"
+        :data="taskOrderDetail.orderItems"
+        border
+        stripe
+        empty-text="暂无设备信息"
+        @selection-change="handleEquipSelectionChange"
+      >
+        <el-table-column type="selection" width="60" fixed="left" />
+        <el-table-column label="操作" fixed="left" align="center" width="100">
+          <template #default="scope">
+            <div class="operation-buttons">
+              <el-button
+                v-if="scope.row.taskStatus === PressureCheckerMyTaskStatus.REPORT_END"
+                link
+                type="primary"
+                size="small"
+                :disabled="isTaskCancelled"
+                @click="handlePreviewReport(scope.row)"
+              >查看报告</el-button>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="区域" align="center" min-width="120">
+          <template #default="scope">
+            <div>{{ scope.row.equipDistrictName || '-' }}</div>
+            <div class="text-gray-400 text-sm">{{ scope.row.equipStreetName || '' }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="设备注册代码" align="center" min-width="190">
+          <template #default="scope">
+            <el-button link type="success" @click="handleEquipCodeFn(scope.row.equipId)">
+              {{ scope.row.equipCode || '-' }}
+            </el-button>
+            <div class="mt-2px mb-2px">
+              <el-tag v-if="scope.row.productNo" type="success">
+                {{ scope.row.productNo }}
+              </el-tag>
+            </div>
+            <el-tag v-if="scope.row.editType === 'reject'" type="danger" size="small" class="ml-1"
+              >拒绝约检</el-tag>
+            <el-tag v-if="scope.row.editType === 'add'" type="success" size="small" class="ml-1"
+              >新增设备</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="是否租借" align="center" prop="isRent" min-width="80">
+          <template #default="scope">
+            {{ scope.row.isRent ? '是' : '否' }}
+          </template>
+        </el-table-column>
+        <el-table-column label="使用证编号" align="center" prop="useRegisterNo" min-width="120" />
+        <el-table-column label="出厂编号" align="center" prop="factoryNo" min-width="120" />
+        <el-table-column label="约检联系人" align="center" prop="contact" min-width="120" />
+        <el-table-column label="约检联系人电话" align="center" prop="contactPhone" min-width="140" />
+        <el-table-column label="蒸发量" align="center" prop="maxContinueEvapor" min-width="80" />
+        <el-table-column label="型号" align="center" prop="boilerModel" min-width="120" />
+        <el-table-column prop="taskStatus" label="主报告状态" width="100" align="center">
+          <template #default="scope">
+            <el-tag :type="getTypeColor(scope.row.taskStatus)">
+              {{ PressureTaskOrderTaskStatusMap[scope.row.taskStatus] || '-' }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="检验结论" align="center" prop="mainConclusion" min-width="120px">
+          <template #default="scope">
+            <div v-if="scope.row.mainConclusion">
+              <el-tag
+                v-if="['符合要求', '基本符合要求'].includes(scope.row.mainConclusion)"
+                type="success"
+              >{{ scope.row.mainConclusion }}</el-tag>
+              <el-tag v-else type="danger">{{ scope.row.mainConclusion }}</el-tag>
+            </div>
+            <div v-else>-</div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+
+    <!-- 管道设备展示 -->
+    <template v-else-if="equipMainType === 300">
+      <el-table
+        ref="orderItemsTableRef"
+        :data="taskOrderDetail.orderItems"
+        border
+        stripe
+        empty-text="暂无设备信息"
+        row-key="id"
+        @selection-change="handleEquipSelectionChange"
+      >
+        <el-table-column type="selection" width="60" fixed="left" />
+        <el-table-column label="操作" fixed="left" align="center" width="100">
+          <template #default="scope">
+            <div class="operation-buttons">
+              <el-button
+                v-if="scope.row.taskStatus === PressureCheckerMyTaskStatus.REPORT_END"
+                link
+                type="primary"
+                size="small"
+                :disabled="isTaskCancelled"
+                @click="handlePreviewReport(scope.row)"
+              >查看报告</el-button>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column type="expand" width="1">
+          <template #default="scope">
+            <div class="ml-15px mr-15px">
+              <el-table :data="scope.row.detailDOS || []" border>
+                <el-table-column label="注册代码" prop="pipeRegCode" min-width="120" show-overflow-tooltip />
+                <el-table-column label="管道名称" prop="pipeName" min-width="120" show-overflow-tooltip />
+                <el-table-column label="管道编号" prop="pipeNo" min-width="120" show-overflow-tooltip />
+                <el-table-column label="管道级别" prop="pipeLevel" min-width="120" show-overflow-tooltip />
+                <el-table-column label="管道品种" prop="pipeType" min-width="120" show-overflow-tooltip />
+                <el-table-column label="长度" prop="pipeLength" min-width="100" show-overflow-tooltip />
+                <el-table-column label="管道材质" prop="pipeMaterial" min-width="120" show-overflow-tooltip />
+                <el-table-column label="材料标准" prop="materialStandard" min-width="120" show-overflow-tooltip />
+              </el-table>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="工程号" align="center" prop="projectNo" min-width="120" />
+        <el-table-column label="使用证编号" align="center" prop="useNo" min-width="120" show-overflow-tooltip />
+        <el-table-column label="工程名称" align="center" prop="projectName" min-width="120" show-overflow-tooltip />
+        <el-table-column label="区域/街道" align="center" min-width="120" show-overflow-tooltip>
+          <template #default="scope">
+            <span class="text-xs">{{ scope.row.equipStreetName ?? scope.row.equipDistrictName }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="约检联系人" align="center" prop="contact" min-width="120" show-overflow-tooltip />
+        <el-table-column label="约检联系人电话" align="center" prop="contactPhone" min-width="140" />
+        <el-table-column prop="taskStatus" label="主报告状态" width="100" align="center">
+          <template #default="scope">
+            <el-tag :type="getTypeColor(scope.row.taskStatus)">
+              {{ PressureTaskOrderTaskStatusMap[scope.row.taskStatus] || '-' }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="检验结论" align="center" prop="mainConclusion" min-width="120px">
+          <template #default="scope">
+            <div v-if="scope.row.mainConclusion">
+              <el-tag
+                v-if="['符合要求', '基本符合要求'].includes(scope.row.mainConclusion)"
+                type="success"
+              >{{ scope.row.mainConclusion }}</el-tag>
+              <el-tag v-else type="danger">{{ scope.row.mainConclusion }}</el-tag>
+            </div>
+            <div v-else>-</div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+
+    <!-- 默认展示 -->
+    <template v-else>
+      <el-table
+        ref="orderItemsTableRef"
+        :data="taskOrderDetail.orderItems"
+        border
+        stripe
+        empty-text="暂无设备信息"
+        @selection-change="handleEquipSelectionChange"
+      >
+        <el-table-column type="selection" width="60" fixed="left" />
+        <el-table-column label="操作" fixed="left" align="center" width="100">
+          <template #default="scope">
+            <div class="operation-buttons">
+              <el-button
+                v-if="scope.row.taskStatus === PressureCheckerMyTaskStatus.REPORT_END"
+                link
+                type="primary"
+                size="small"
+                :disabled="isTaskCancelled"
+                @click="handlePreviewReport(scope.row)"
+              >查看报告</el-button>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="equipName" label="设备名称" width="100" align="center" />
+        <el-table-column prop="fee" label="收费金额" width="100" align="center" />
+        <el-table-column prop="equipCode" label="设备注册代码" width="195" align="center">
+          <template #default="scope">
+            <el-button link type="success" @click="handleEquipCodeFn(scope.row.equipId)">{{
+              scope.row.equipCode
+            }}</el-button>
+            <div class="mt-2px mb-2px">
+              <el-tag v-if="scope.row.productNo" type="success">
+                {{ scope.row.productNo }}
+              </el-tag>
+            </div>
+            <el-tag v-if="scope.row.editType === 'reject'" type="danger" size="small" class="ml-1"
+              >拒绝约检</el-tag>
+            <el-tag v-if="scope.row.editType === 'add'" type="success" size="small" class="ml-1"
+              >新增设备</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="reportRespVOList" label="记录编号" width="100" align="center">
+          <template #default="{ row }">
+            {{ Array.isArray(row.reportRespVOList) ? row.reportRespVOList[0]?.reportNo || '-' : '-' }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="checkType" label="检验性质" width="100" align="center">
+          <template #default>
+            {{ PressureCheckTypeMap[taskOrderDetail.checkType] || '-' }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="reportRespVOList"
+          label="检验项目"
+          min-width="550"
+          header-align="center"
+        >
+          <template #default="{ row }">
+            <span v-for="item in getRowReportVOList(row)" :key="item?.templateId">
+              <el-button
+                :disabled="
+                  taskOrder?.taskStatus === PressureTaskOrderTaskStatus['REPORT_END'] ||
+                  canAddReportItem(row.taskStatus) ||
+                  taskOrder?.taskStatus === PressureTaskOrderTaskStatus['AUDITING_CANCEL']
+                "
+                link
+                type="primary"
+                class="!whitespace-normal !m-[0px]"
+              >{{ item?.reportName }}</el-button>
+              <el-button
+                :disabled="
+                  taskOrder?.taskStatus === PressureTaskOrderTaskStatus['REPORT_END'] ||
+                  taskOrder?.taskStatus === PressureTaskOrderTaskStatus['AUDITING_CANCEL']
+                "
+                link
+                type="primary"
+                class="!m-[0px]"
+              >({{ getCheckItemFeeType(item) }})</el-button>
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="reportRespVOList" label="操作指导书名称" width="180" align="center">
+          <template #default="{ row }">
+            <template
+              v-if="
+                filterReportType(row.reportRespVOList, PressureReportType['WORKINSTRUCTION']).length
+              "
+            >
+              <template
+                v-if="
+                  filterReportType(row.reportRespVOList, PressureReportType['WORKINSTRUCTION'])
+                    .length <= 2
+                "
+              >
+                <el-button
+                  class="!whitespace-normal !m-[0px] w-full"
+                  link
+                  v-for="(item, index) in filterReportType(
+                    row.reportRespVOList,
+                    PressureReportType['WORKINSTRUCTION']
+                  )"
+                  :type="item?.taskStatus != 800 ? 'danger' : 'success'"
+                  :key="index"
+                  @click="handlePreviewDownload(item)"
+                >{{ item?.reportName ? `${item?.reportName}` : '-' }}</el-button>
+              </template>
+              <!-- 弹窗 -->
+              <el-popover v-else placement="top-start" :width="200" trigger="hover">
+                <el-button
+                  class="!whitespace-normal !m-[0px] w-full"
+                  link
+                  v-for="(item, index) in filterReportType(
+                    row.reportRespVOList,
+                    PressureReportType['WORKINSTRUCTION']
+                  )"
+                  :type="item?.taskStatus != 800 ? 'danger' : 'success'"
+                  :key="index"
+                  @click="handlePreviewDownload(item)"
+                >{{ item?.reportName ? `${item?.reportName}` : '-' }}</el-button>
+                <template #reference>
+                  <div>
+                    <el-button
+                      class="!whitespace-normal !m-[0px] w-full"
+                      link
+                      v-for="(item, index) in filterReportType(
+                        row.reportRespVOList,
+                        PressureReportType['WORKINSTRUCTION']
+                      ).slice(0, 2)"
+                      :type="item?.taskStatus != 800 ? 'danger' : 'success'"
+                      :key="index"
+                      @click="handlePreviewDownload(item)"
+                    >{{ item?.reportName ? `${item?.reportName}` : '-' }}</el-button>
+                  </div>
+                </template>
+              </el-popover>
+            </template>
+            <span v-else>-</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="reportRespVOList" label="检验方案" min-width="180" align="center">
+          <template #default="{ row }">
+            <template
+              v-if="
+                filterReportType(
+                  row.reportRespVOList,
+                  PressureReportType['INSPECTIONPLAN'],
+                  row.majorIssuesList
+                ).length
+              "
+            >
+              <template
+                v-if="
+                  filterReportType(
+                    row.reportRespVOList,
+                    PressureReportType['INSPECTIONPLAN'],
+                    row.majorIssuesList
+                  ).length <= 2
+                "
+              >
+                <el-button
+                  class="!whitespace-normal !m-[0px] w-full"
+                  link
+                  v-for="(item, index) in filterReportType(
+                    row.reportRespVOList,
+                    PressureReportType['INSPECTIONPLAN'],
+                    row.majorIssuesList
+                  )"
+                  :type="item?.taskStatus != 800 ? 'danger' : 'success'"
+                  :key="index"
+                  @click="handlePreviewDownload(item)"
+                >{{
+                  item?.reportName ? `${item?.reportName}(${item.currentIndex})` : '-'
+                }}</el-button>
+              </template>
+              <!-- 弹窗 -->
+              <el-popover v-else placement="top-start" :width="200" trigger="hover">
+                <el-button
+                  class="!whitespace-normal !m-[0px] w-full"
+                  link
+                  v-for="(item, index) in filterReportType(
+                    row.reportRespVOList,
+                    PressureReportType['INSPECTIONPLAN'],
+                    row.majorIssuesList
+                  )"
+                  :type="item?.taskStatus != 800 ? 'danger' : 'success'"
+                  :key="index"
+                  @click="handlePreviewDownload(item)"
+                >{{
+                  item?.reportName ? `${item?.reportName}(${item.currentIndex})` : '-'
+                }}</el-button>
+                <template #reference>
+                  <div>
+                    <el-button
+                      class="!whitespace-normal !m-[0px] w-full"
+                      link
+                      v-for="(item, index) in filterReportType(
+                        row.reportRespVOList,
+                        PressureReportType['INSPECTIONPLAN'],
+                        row.majorIssuesList
+                      ).slice(0, 2)"
+                      :type="item?.taskStatus != 800 ? 'danger' : 'success'"
+                      :key="index"
+                      @click="handlePreviewDownload(item)"
+                    >{{
+                      item?.reportName ? `${item?.reportName}(${item.currentIndex})` : '-'
+                    }}</el-button>
+                  </div>
+                </template>
+              </el-popover>
+            </template>
+            <span v-else>-</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="taskStatus" label="主报告状态" width="100" align="center">
+          <template #default="scope">
+            <el-tag :type="getTypeColor(scope.row.taskStatus)">
+              {{ PressureTaskOrderTaskStatusMap[scope.row.taskStatus] || '-' }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="检验结论" align="center" prop="mainConclusion" min-width="120px">
+          <template #default="scope">
+            <div v-if="scope.row.mainConclusion">
+              <el-tag
+                v-if="['符合要求', '基本符合要求'].includes(scope.row.mainConclusion)"
+                type="success"
+              >{{ scope.row.mainConclusion }}</el-tag>
+              <el-tag v-else type="danger">{{ scope.row.mainConclusion }}</el-tag>
+            </div>
+            <div v-else>-</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="equipDistrictName" align="center" label="区域" width="100">
+          <template #default="scope">
+            <div>{{ scope.row.equipDistrictName }}</div>
+            <div class="text-gray-400 text-sm">{{ scope.row.equipStreetName }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="useRegisterNo" label="使用证编号" width="135" align="center" />
+        <el-table-column prop="equipVolume" label="容积" width="60" align="center" />
+        <el-table-column label="下次年度检查" width="110" align="center">
+          <template #default="scope">
+            {{ !scope.row.nextYearCheckDate ? '-' : formatArrayDate(scope.row.nextYearCheckDate) }}
+          </template>
+        </el-table-column>
+        <el-table-column label="下次定期检验" width="110" align="center">
+          <template #default="scope">
+            {{ formatArrayDate(scope.row.nextCheckDate) }}
+          </template>
+        </el-table-column>
+        <el-table-column label="超年限检验" width="110" align="center">
+          <template #default="scope">
+            {{
+              scope.row.nextExpiredCheckDate ? formatArrayDate(scope.row.nextExpiredCheckDate) : '-'
+            }}
+          </template>
+        </el-table-column>
+        <el-table-column label="超年限时间" width="110" align="center">
+          <template #default="scope">
+            {{ scope.row.overdueDate ? formatArrayDate(scope.row.overdueDate) : '-' }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="约检联系人"
+          prop="contact"
+          width="110"
+          align="center"
+          show-overflow-tooltip
+        />
+        <el-table-column label="约检联系人电话" prop="contactPhone" width="135" align="center" />
+        <el-table-column label="主检人" width="110" align="center">
+          <template #default="scope">
+            <div>{{ scope.row.mainCheckerUser?.nickname || '-' }}</div>
+            <div class="text-gray-400 text-sm">{{ scope.row.mainCheckerUser?.employeeNo || '' }}</div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+  </ContentWrap>
+  <!-- 打印记录 -->
+  <Dialog
+    v-model="nprintRecordDialogVisible"
+    :dialogAttrs="{
+      zIndex: 10006
+    }"
+    :title="'打印项目'"
+  >
+    <SmartTable
+      ref="nprintRecordTableRef"
+      v-model:columns="nprintRecordColumns"
+      :isPagination="false"
+      :maxHeight="600"
+      :data="nprintRecordTableList"
+      :buttons="[]"
+      :showSettingTools="false"
+      :showSearch="false"
+      :showRefresh="false"
+      :tableProps="{
+        onRowClick: handleRowClick
+      }"
+    />
+    <template #footer>
+      <el-button :loading="nprintRecordLoading" type="primary" @click="handlePrintFn"
+        >打 印</el-button>
+      <el-button :loading="nprintRecordLoading" type="primary" @click="handlePrintFnDownload"
+        >下 载</el-button>
+      <el-button :loading="nprintRecordLoading" @click="nprintRecordDialogVisible = false"
+        >取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+
+<script setup lang="tsx">
+import {
+  PressureCheckTypeMap,
+  PressureTaskOrderTaskStatus,
+  PressureTaskOrderTaskStatusMap,
+  PressureCheckerMyTaskStatusMap,
+  PressureCheckerMyTaskStatus,
+  PressureReportType
+} from '@/utils/constants'
+import SmartTable from '@/components/SmartTable/SmartTable'
+import { SmartTableColumn } from '@/types/table'
+import { is } from '@/utils/is'
+import { formatArrayDate } from '@/utils/formatTime'
+import { TableInstance } from 'element-plus'
+import { TaskOrderApi } from '@/api/pressure/taskorder'
+import { BoilerTaskOrderApi } from '@/api/pressure2/boilertaskorder'
+import { PipeTaskOrderApi } from '@/api/pressure2/pipetaskorder'
+import { buildFileUrl } from '@/utils'
+import { getJCP } from '@/utils/jcp/jcp-vue'
+
+const props = defineProps({
+  taskOrder: {
+    type: Object as () => Record<string, any>,
+    required: true
+  },
+  taskOrderDetail: {
+    type: Object as () => Record<string, any>,
+    required: true
+  },
+  supportingDocsAuditDataList: {
+    type: Array as () => Record<string, any>[],
+    required: true
+  }
+})
+
+// 设备类型 200-锅炉 300-管道
+const equipMainType = computed(() => {
+  return props.taskOrderDetail?.equipMainType || null
+})
+
+// 根据 equipMainType 获取对应的 API
+const getCurrentApi = () => {
+  if (equipMainType.value === 200) {
+    return BoilerTaskOrderApi
+  } else if (equipMainType.value === 300) {
+    return PipeTaskOrderApi
+  }
+  return TaskOrderApi // 默认
+}
+
+const InformationModificationVisible = ref(false) // 弹窗的是否展示
+const formLoading = ref(false)
+const formData = ref({
+  safeManager: '', //安全管理员姓名
+  safeManagerPhone: '', //安全管理员电话
+  safeManagerIdNumber: '', //安全管理员证号
+  operatorIdNumber: '' //操作人证号
+})
+const formRules = reactive({})
+const formRef = ref() // 表单 Ref
+const nprintRecordLoading = ref(false)
+const nprintRecordTableRef = ref()
+const nprintRecordDialogVisible = ref(false)
+const nprintRecordTableList = ref<any[]>([])
+const nprintRecordColumns = ref<SmartTableColumn[]>([
+  {
+    type: 'selection',
+    width: '50px'
+  },
+  {
+    label: '检验项目',
+    prop: 'reportName'
+  },
+  {
+    label: '状态',
+    prop: 'taskStatus',
+    render: (row) => {
+      return row.taskStatus ? (
+        <div>
+          <el-tag key={row.id} type={getTypeColor2(row.taskStatus)}>
+            {PressureCheckerMyTaskStatusMap[row.taskStatus]}
+          </el-tag>
+        </div>
+      ) : (
+        '-'
+      )
+    }
+  }
+])
+
+const emit = defineEmits([
+  'refresh-detail',
+  'handle-add-checker-items',
+  'handle-mainquestion-add-report',
+  'handle-add-inspectionplan-report',
+  'handle-batch-edit-fn',
+  'handle-abort-task',
+  'handle-equip-selection-change',
+  'handle-equip-code-fn',
+  'handle-input-calc-field',
+  'handle-preview-download',
+  'handle-add-report',
+  'handle-view-mainquestion-report',
+  'handle-set-main-checker',
+  'handle-preview-report',
+  'handle-add-finite-space-report'
+])
+
+const rowData = ref<any>({})
+const selectedEquips = ref<Array<Record<string, any>>>([])
+const handlePrintFnDownload = async () => {
+  const selectRows = nprintRecordTableRef.value.getTableRef().getSelectionRows()
+  if (selectRows.length == 0) {
+    return ElMessage.error('请选择打印项目')
+  } else {
+    const params = selectRows.map((item) => item.id)
+    const currentApi = getCurrentApi()
+    const result = await currentApi.downloadReport({ ids: params })
+    const downloadUrl = window.URL.createObjectURL(result)
+    const a = document.createElement('a')
+    a.href = downloadUrl
+    const fileName = `${rowData.value.equipCode}` + '项目'
+    a.download = fileName
+    document.body.appendChild(a)
+    a.click()
+    // 下载文件
+    window.URL.revokeObjectURL(downloadUrl)
+    document.body.removeChild(a)
+  }
+}
+
+const handleRowClick = (row) => {
+  nprintRecordTableRef.value?.getTableRef()?.toggleRowSelection(row)
+}
+
+const handlePrintFn = async () => {
+  const selectRows = nprintRecordTableRef.value.getTableRef().getSelectionRows()
+  if (selectRows.length == 0) {
+    return ElMessage.error('请选择打印项目')
+  }
+
+  const ids = selectRows.map((item) => item.id)
+  const queryString = ids.map((id) => `ids=${id}`).join('&')
+  nprintRecordLoading.value = true
+
+  try {
+    const currentApi = getCurrentApi()
+    const result = await currentApi.getBatchUploadPdfApi(queryString)
+
+    if (!result || result.length === 0) {
+      nprintRecordLoading.value = false
+      return ElMessage.error('未获取到打印文件')
+    }
+
+    const jcp = getJCP()
+
+    // 检测JCP是否可用
+    if (!jcp) {
+      nprintRecordLoading.value = false
+      return ElMessage.error('打印组件未初始化,请安装打印插件')
+    }
+
+    let completedCount = 0
+    let failedCount = 0
+
+    // 循环打印每个PDF
+    for (let i = 0; i < result.length; i++) {
+      const url = buildFileUrl(result[i])
+      const encodedUrl = url
+        .split('/')
+        .map((part) => {
+          return /[\u4e00-\u9fa5]/.test(part) ? encodeURIComponent(part) : part
+        })
+        .join('/')
+
+      // 为每个打印任务添加超时处理
+      await new Promise((resolve) => {
+        let isResolved = false
+
+        // 设置10秒超时
+        const timeout = setTimeout(() => {
+          if (!isResolved) {
+            isResolved = true
+            failedCount++
+            console.error(`第 ${i + 1} 个文件打印超时(可能用户取消了打印)`)
+            resolve(false)
+          }
+        }, 5000) // 5秒超时,可根据实际情况调整
+
+        jcp.printPDF(encodedUrl, {
+          settings: {
+            paperName: 'A4',
+            orientation: 'portrait',
+            marginTop: 0,
+            marginBottom: 0,
+            marginLeft: 0,
+            marginRight: 0,
+            shrink: false
+          },
+          printer: '',
+          preview: false,
+          fileType: 'pdf',
+          done: function () {
+            if (!isResolved) {
+              isResolved = true
+              clearTimeout(timeout)
+              completedCount++
+              console.log(`第 ${i + 1} 个文件打印完成`)
+              resolve(true)
+            }
+          },
+          fail: function (error) {
+            if (!isResolved) {
+              isResolved = true
+              clearTimeout(timeout)
+              failedCount++
+              console.error(`第 ${i + 1} 个文件打印失败:`, error)
+              resolve(false)
+            }
+          }
+        })
+      })
+    }
+
+    // 显示最终结果
+    if (failedCount === 0) {
+      ElMessage.success(`全部打印完成,共 ${completedCount} 个文件`)
+    } else if (completedCount === 0) {
+      ElMessage.error(`打印失败,共 ${failedCount} 个文件未能打印`)
+    } else {
+      ElMessage.warning(`打印完成 ${completedCount} 个,失败 ${failedCount} 个`)
+    }
+  } catch (error) {
+    console.error('打印过程出错:', error)
+    ElMessage.error('打印过程出错: ' + (error.message || '未知错误'))
+  } finally {
+    // 确保无论如何都会关闭loading
+    nprintRecordLoading.value = false
+  }
+}
+
+// 作废报告项
+const submitForm = async () => {
+  if (!formRef) return
+  const valid = await formRef.value.validate()
+  if (!valid) return
+  // 提交请求
+  formLoading.value = true
+  try {
+    const selectRows = getSelectionRows()
+    const data = {
+      ...formData.value,
+      ids: selectRows.map((item) => item.equipId)
+    }
+    const logId = await TaskOrderApi.updateEquipJobInfoApi(data)
+    if (logId) {
+      ElMessage.success('修改成功')
+    }
+    InformationModificationVisible.value = false
+  } finally {
+    formLoading.value = false
+  }
+}
+
+const orderItemsTableRef = ref<TableInstance>()
+const handleEquipSelectionChange = (selection) => {
+  // 实现设备选择逻辑
+  selectedEquips.value = selection
+  emit('handle-equip-selection-change', selection)
+}
+
+const isTaskCancelled = computed(() => {
+  return props.taskOrderDetail?.taskStatus === PressureTaskOrderTaskStatus.CANCELLED
+})
+
+const handlePreviewReport = (row: any) => {
+  emit('handle-preview-report', row)
+}
+
+const handleEquipCodeFn = (id?: string) => {
+  emit('handle-equip-code-fn', id)
+}
+
+const getRowReportVOList = (row) => {
+  return (row.reportRespVOList || []).filter(
+    (item) =>
+      ![PressureReportType['WORKINSTRUCTION'], PressureReportType['INSPECTIONPLAN']].includes(
+        item.reportType
+      )
+  )
+}
+
+const canAddReportItem = (taskStatus) => {
+  const { REPORT_AUDIT, REPORT_APPROVE, REPORT_END } = PressureCheckerMyTaskStatus
+  return [REPORT_AUDIT, REPORT_APPROVE, REPORT_END].includes(taskStatus)
+}
+
+const getCheckItemFeeType = computed(() => {
+  return ({ isAutoAmount, fee }) => {
+    if (is(fee, 'Number')) return fee
+    else if (is(fee, 'Null') && isAutoAmount === '1') return '录入计算'
+    else return '0'
+  }
+})
+
+const filterReportType = (list: any[], reportType: number, majorIssuesList?: any[]) => {
+  const reportList = list.filter((item) => item.reportType === reportType)
+  const majorIssuesListValue = majorIssuesList?.map((item) => item) || []
+  const newList = [...reportList, ...majorIssuesListValue]
+
+  const sortedList = newList.sort((a, b) => {
+    const timeA = a.createTime || 0
+    const timeB = b.createTime || 0
+    return timeB - timeA // 倒序排列
+  })
+
+  const total = sortedList.length
+
+  return sortedList.map((item, index) => {
+    return {
+      ...item,
+      currentIndex: total - index // 倒序编号:第一个显示的是最大数字
+    }
+  })
+}
+
+const handlePreviewDownload = (row) => {
+  emit('handle-preview-download', row)
+}
+
+const getTypeColor = (status: string | number) => {
+  const statusMap = {
+    [PressureTaskOrderTaskStatus.WAIT_CONFIRM]: 'primary',
+    [PressureTaskOrderTaskStatus.CANCELLED]: 'info',
+    [PressureTaskOrderTaskStatus.AUDITING_EDIT]: 'warning',
+    [PressureTaskOrderTaskStatus.AUDITING_CANCEL]: 'warning',
+    [PressureTaskOrderTaskStatus.AUDITING_TIME]: 'warning',
+    [PressureTaskOrderTaskStatus.CONFIRMED]: 'success',
+    [PressureTaskOrderTaskStatus.RECORD_INPUT]: 'warning',
+    [PressureTaskOrderTaskStatus.RECORD_CHECK]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_INPUT]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_AUDIT]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_APPROVE]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_END]: 'primary'
+  }
+  return statusMap[status] || 'info'
+}
+
+const getTypeColor2 = (status: string | number) => {
+  const statusMap = {
+    [PressureTaskOrderTaskStatus.WAIT_CONFIRM]: 'primary',
+    [PressureTaskOrderTaskStatus.CANCELLED]: 'info',
+    [PressureTaskOrderTaskStatus.AUDITING_EDIT]: 'warning',
+    [PressureTaskOrderTaskStatus.AUDITING_CANCEL]: 'warning',
+    [PressureTaskOrderTaskStatus.AUDITING_TIME]: 'warning',
+    [PressureTaskOrderTaskStatus.CONFIRMED]: 'success',
+    [PressureTaskOrderTaskStatus.RECORD_INPUT]: 'warning',
+    [PressureTaskOrderTaskStatus.RECORD_CHECK]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_INPUT]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_AUDIT]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_APPROVE]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_END]: 'success'
+  }
+  return statusMap[status] || 'info'
+}
+
+const getSelectionRows = () => {
+  return orderItemsTableRef.value?.getSelectionRows() || []
+}
+
+defineExpose({
+  getSelectionRows
+})
+</script>

+ 701 - 0
yudao-ui-admin-vue3/src/views/pressure2/financeOrder/view.vue

@@ -0,0 +1,701 @@
+<template>
+  <section v-show="!serviceRecordListVisible">
+    <ContentWrap class="mb-4" title="任务单详情">
+      <div class="check-info-label-title">单位信息</div>
+      <el-descriptions :column="3" border>
+        <el-descriptions-item label="任务单号">
+          {{ taskOrderDetail.orderNo }}
+        </el-descriptions-item>
+        <el-descriptions-item label="检验类别">
+          {{ PressureCheckTypeMap[taskOrderDetail.checkType] || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="检验设备数量">
+          {{ taskOrderDetail.equipNum || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="申请单位名称">
+          {{ taskOrderDetail.unitName || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="使用单位名称">
+          {{ taskOrderDetail.useUnitName || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="检验日期">
+          {{
+            Array.isArray(taskOrderDetail.checkDate)
+              ? formatArrayDate(taskOrderDetail.checkDate)
+              : taskOrderDetail.checkDate || '-'
+          }}
+        </el-descriptions-item>
+        <el-descriptions-item label="申请单位地址">
+          {{ taskOrderDetail.unitAddress || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="使用单位地址">
+          {{ taskOrderDetail.useUnitAddress || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item
+          label="收费性质"
+          v-if="taskOrderDetail.checkType == PressureCheckType.REGULAR"
+        >
+          {{ PressureFeeNatureMap[taskOrderDetail.feeNature] || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="收费形式">
+          {{ PressureFeeTypeMap[taskOrderDetail.feeType] || '-' }}
+        </el-descriptions-item>
+
+        <el-descriptions-item label="总费用">
+          {{ taskOrderDetail.serviceAmount }}
+        </el-descriptions-item>
+        <el-descriptions-item
+          label="减免比例"
+          v-if="
+            taskOrderDetail.checkType == PressureCheckType.REGULAR &&
+            taskOrderDetail.feeNature != PressureFeeNature.SMZFC
+          "
+        >
+          {{
+            taskOrderDetail.reductionRadio
+              ? Big(taskOrderDetail.reductionRadio).times(100).toString()
+              : 0
+          }}%
+        </el-descriptions-item>
+        <el-descriptions-item label="实际收费">
+          {{ taskOrderDetail.actualAmount }}
+        </el-descriptions-item>
+        <el-descriptions-item label="结算状态">
+          {{ taskOrderDetail.paymentStatus === 1 ? '已结算' : '未结算' }}
+        </el-descriptions-item>
+        <el-descriptions-item label="业务受理人">
+          <el-tag v-if="taskOrderDetail.acceptUser" effect="light" :closable="false">
+            {{
+              taskOrderDetail.acceptUser
+                ? `${taskOrderDetail.acceptUser.nickname} (${taskOrderDetail.acceptUser.employeeNo})`
+                : '-'
+            }}
+          </el-tag>
+          <span v-else>-</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="项目负责人">
+          {{
+            taskOrderDetail.manager
+              ? `${taskOrderDetail.manager.nickname} (${taskOrderDetail.manager.employeeNo})`
+              : '-'
+          }}
+        </el-descriptions-item>
+        <el-descriptions-item label="检验人员">
+          <div v-if="taskOrderDetail.teamItemList && taskOrderDetail.teamItemList.length > 0">
+            <div
+              v-for="(team, teamIndex) in taskOrderDetail.teamItemList"
+              :key="team.groupTeamId || 'team-' + teamIndex"
+              style="margin-bottom: 8px"
+            >
+              <div
+                v-if="taskOrderDetail.teamItemList.length > 1"
+                style="margin-bottom: 4px; font-weight: bold"
+                >团队 {{ +teamIndex + 1 }}:</div
+              >
+              <div style="display: flex; flex-wrap: wrap; align-items: center; gap: 6px">
+                <template
+                  v-for="leader in team.leaders"
+                  :key="leader.id ? 'leader-' + leader.id : 'leader-idx-' + '-' + teamIndex"
+                >
+                  <el-tag effect="light" :closable="false">
+                    <span class="leader-tag">组</span>
+                    {{ leader.nickname }}
+                  </el-tag>
+                </template>
+                <template
+                  v-for="member in team.members"
+                  :key="member.id ? 'member-' + member.id : 'member-idx-' + '-' + teamIndex"
+                >
+                  <el-tag effect="light" :closable="false"
+                    >{{ member.nickname }}({{ member.employeeNo }})</el-tag
+                  >
+                </template>
+                <span
+                  v-if="
+                    (!team.leaders || team.leaders.length === 0) &&
+                    (!team.members || team.members.length === 0)
+                  "
+                  style="margin-left: 4px"
+                  >-</span
+                >
+              </div>
+            </div>
+          </div>
+          <span v-else>-</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="计划编制人">
+          <el-tag v-if="taskOrderDetail.scheduleUser" effect="light" :closable="false">
+            {{
+              taskOrderDetail.scheduleUser
+                ? `${taskOrderDetail.scheduleUser.nickname} (${taskOrderDetail.scheduleUser.employeeNo})`
+                : '-'
+            }}
+          </el-tag>
+          <span v-else>-</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="中止检验" :span="1">
+          <el-button link type="primary" @click="handleViewSuspendCount">{{
+            taskOrderDetail.suspendCount
+          }}</el-button>
+        </el-descriptions-item>
+        <el-descriptions-item label="安全检查记录" :span="1">
+          <el-button link type="primary">{{ taskOrderDetail.securityCheckCount }}</el-button>
+        </el-descriptions-item>
+        <el-descriptions-item label="备注" :span="3">
+          {{ taskOrderDetail.remark || '-' }}
+        </el-descriptions-item>
+        <el-descriptions-item
+          label="任务单状态信息"
+          :span="3"
+          v-if="taskOrderDetail.taskStatus === PressureTaskOrderTaskStatus.CANCELLED"
+        >
+          <el-tag :type="getTypeColor(taskOrderDetail.taskStatus)">
+            {{ PressureTaskOrderTaskStatusMap[taskOrderDetail.taskStatus] || '已作废' }}
+          </el-tag>
+          <br />
+          作废人: {{ taskOrderDetail.cancelUser?.nickname || '-' }}
+          <br />
+          作废日期:
+          {{ taskOrderDetail.cancelDate ? formatDate(taskOrderDetail.cancelDate) : '-' }}
+          <br />
+          作废原因: {{ taskOrderDetail.changeReason || '-' }}
+        </el-descriptions-item>
+      </el-descriptions>
+      <div class="check-info-label-title">联系人信息</div>
+      <el-descriptions :column="3" border>
+        <el-descriptions-item label="约检联系人">
+          <span class="editable-contact">
+            {{ taskOrderDetail.unitContact || '-' }}
+          </span>
+        </el-descriptions-item>
+
+        <el-descriptions-item label="约检联系人电话">
+          <span class="editable-contact">
+            {{ taskOrderDetail.unitPhone || '-' }}
+          </span>
+        </el-descriptions-item>
+        <el-descriptions-item label="约检联系人邮箱">
+          <span class="editable-contact">
+            {{ taskOrderDetail.email || '-' }}
+          </span>
+        </el-descriptions-item>
+        <el-descriptions-item label="电子报告接收人">
+          <span class="editable-contact">
+            {{ taskOrderDetail.recipient || '-' }}
+          </span>
+        </el-descriptions-item>
+        <el-descriptions-item label="报告接收人电话">
+          <span class="editable-contact">
+            {{ taskOrderDetail.recipientPhone || '-' }}
+          </span>
+        </el-descriptions-item>
+        <el-descriptions-item label="接收人邮箱">
+          <span class="editable-contact">
+            {{ taskOrderDetail.recipientEmail || '-' }}
+          </span>
+        </el-descriptions-item>
+        <el-descriptions-item label="缴费联系人">
+          <span class="editable-contact">
+            {{ taskOrderDetail.payerContactName || '-' }}
+          </span>
+        </el-descriptions-item>
+        <el-descriptions-item label="缴费人电话">
+          <span class="editable-contact">
+            {{ taskOrderDetail.payerContact || '-' }}
+          </span>
+        </el-descriptions-item>
+        <el-descriptions-item label="缴费人邮箱">
+          <span class="editable-contact">
+            {{ taskOrderDetail.payerMail || '-' }}
+          </span>
+        </el-descriptions-item>
+      </el-descriptions>
+    </ContentWrap>
+    <ContentWrap v-if="exceptionInfo.id" title="异常信息">
+      <el-form
+        v-if="exceptionInfo.id"
+        disabled
+        :model="exceptionInfo"
+        ref="formRef"
+        label-width="130px"
+        class="p-3"
+      >
+        <el-row v-if="exceptionInfo.id" class="form-group" :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="有效日期调整原因" prop="effectiveDateAdjustReason">
+              <el-input
+                v-model="exceptionInfo.effectiveDateAdjustReason"
+                placeholder="请输入有效日期调整原因"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="受理建议" prop="acceptSuggeston">
+              <el-input v-model="exceptionInfo.acceptSuggeston" placeholder="请输入受理建议" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="调整有效日期" prop="adjustEffectiveDate">
+              <el-date-picker
+                v-model="exceptionInfo.adjustEffectiveDate"
+                type="date"
+                value-format="YYYY-MM-DD"
+                placeholder="请选择调整有效日期"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="情况说明" prop="descrition">
+              <component :is="getExceptionItem('descrition', 'descritionAttach')" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="重启表" prop="restartTable">
+              <component :is="getExceptionItem('restartTable', 'restartTableAttach')" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="指令书" prop="instrustionBook">
+              <component :is="getExceptionItem('instrustionBook', 'instrustionBookAttach')" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="受理回执" prop="acceptReceipt">
+              <component :is="getExceptionItem('acceptReceipt', 'acceptReceiptAttach')" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="其他" prop="other">
+              <component :is="getExceptionItem('other', 'otherAttach')" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="提前检验申请函" prop="earlyCheckApply">
+              <component :is="getExceptionItem('earlyCheckApply', 'earlyCheckApplyAttach')" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </ContentWrap>
+    <ContentWrap title="审核" v-if="supportingDocsAuditDataList.length > 0">
+      <SmartTable
+        v-model:columns="auditColumns"
+        :data="supportingDocsAuditDataList"
+        :total="operationReportTotal"
+        :isPagination="false"
+        @refresh="() => handleGetOperationReportAuditList()"
+      />
+    </ContentWrap>
+    <EquipTableList
+      v-if="taskOrderDetail"
+      ref="equipTableListRef"
+      :task-order="taskOrderDetail"
+      :task-order-detail="taskOrderDetail"
+      :supporting-docs-audit-data-list="supportingDocsAuditDataList"
+    />
+    <section class="flex justify-center mt-4">
+      <el-button @click="handleClosePage">关闭</el-button>
+    </section>
+  </section>
+</template>
+
+<script setup lang="tsx">
+import SmartTable from '@/components/SmartTable/SmartTable'
+import { TaskOrderApi } from '@/api/pressure/taskorder'
+import { BoilerTaskOrderApi } from '@/api/pressure2/boilertaskorder'
+import { PipeTaskOrderApi } from '@/api/pressure2/pipetaskorder'
+import {
+  PressureCheckType,
+  PressureFeeNature,
+  PressureCheckTypeMap,
+  PressureFeeTypeMap,
+  PressureTaskOrderTaskStatus,
+  PressureTaskOrderStatus,
+  PressureTaskOrderStatusMap,
+  PressureTaskOrderTaskStatusMap,
+  PressureCheckerMyTaskStatus,
+  PressureFeeNatureMap,
+  PressureReportType,
+  PressureReportTypeMap
+} from '@/utils/constants'
+import { formatArrayDate, formatDate } from '@/utils/formatTime'
+import { ElMessageBox, dayjs } from 'element-plus'
+import { useRouter, useRoute } from 'vue-router'
+import { useTagsViewStore } from '@/store/modules/tagsView'
+import { buildFileUrl } from '@/utils'
+import EquipTableList from './components/equipTableList.vue'
+import Big from 'big.js'
+import { useEmitt } from '@/hooks/web/useEmitt'
+import { usePageLoading } from '@/hooks/web/usePageLoading'
+
+defineOptions({ name: 'TaskOrderUpdateReportDetail' })
+
+const { loadStart, loadDone } = usePageLoading()
+const router = useRouter()
+const route = useRoute()
+const tagsViewStore = useTagsViewStore()
+
+const { emitter } = useEmitt()
+
+const taskOrderDetail = ref<Record<string, any>>({})
+// 设备类型 200-锅炉 300-管道
+const equipMainType = ref<number | null>(null)
+
+const serviceOrderDialogFormData = ref<Record<string, any>>({
+  serviceFormReceiver: '',
+  serviceFormReceiverPhone: '',
+  confirmStatus: ''
+})
+
+// 编辑修改受理单报告
+const serviceRecordListVisible = ref(false)
+
+// 异常信息
+const exceptionInfo = ref<Record<string, any>>({})
+
+// 根据 equipMainType 获取对应的 API
+const getCurrentApi = () => {
+  if (equipMainType.value === 200) {
+    return BoilerTaskOrderApi
+  } else if (equipMainType.value === 300) {
+    return PipeTaskOrderApi
+  }
+  return TaskOrderApi // 默认
+}
+
+const getTypeColor = (status: string | number) => {
+  const statusMap = {
+    [PressureTaskOrderTaskStatus.WAIT_CONFIRM]: 'primary',
+    [PressureTaskOrderTaskStatus.CANCELLED]: 'info',
+    [PressureTaskOrderTaskStatus.AUDITING_EDIT]: 'warning',
+    [PressureTaskOrderTaskStatus.AUDITING_CANCEL]: 'warning',
+    [PressureTaskOrderTaskStatus.AUDITING_TIME]: 'warning',
+    [PressureTaskOrderTaskStatus.CONFIRMED]: 'success',
+    [PressureTaskOrderTaskStatus.RECORD_INPUT]: 'warning',
+    [PressureTaskOrderTaskStatus.RECORD_CHECK]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_INPUT]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_AUDIT]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_APPROVE]: 'warning',
+    [PressureTaskOrderTaskStatus.REPORT_END]: 'primary'
+  }
+  return statusMap[status] || 'info'
+}
+
+const handleClosePage = () => {
+  tagsViewStore.closeSelectedTag(route)
+}
+
+/*****  重大问题线索&检验方案&操作指导书  *****/
+const supportingDocsAuditDataList = ref<Recordable[]>([])
+const supportingDocsAuditColumns = ref([
+  {
+    label: '设备注册代码',
+    prop: 'equipCode'
+  },
+  {
+    label: '项目名称',
+    prop: 'reportName'
+  },
+  {
+    label: '类型',
+    prop: 'reportType',
+    render: (_row, reportType) => {
+      return PressureReportTypeMap[reportType] || '-'
+    }
+  },
+  {
+    label: '状态',
+    prop: 'status',
+    render: (_row, status) => (!status ? '-' : PressureTaskOrderStatusMap[status])
+  },
+  {
+    label: '当前流程',
+    prop: 'currentNode',
+    render: (row) => {
+      switch (row.status) {
+        case PressureTaskOrderStatus['CANCELLED']:
+          return '-'
+        case PressureTaskOrderStatus['APPROVED']:
+          return '审核通过'
+        case PressureTaskOrderStatus['AUDITING']:
+        case PressureTaskOrderStatus['REJECTED']:
+          return (
+            <div>
+              <p>当前流程:{row?.currentNode || '-'}</p>
+              <p>
+                状态:
+                {row.status === PressureTaskOrderStatus['AUDITING']
+                  ? '审核中'
+                  : `${row?.currentAuditor?.nickname}(${row?.currentAuditor?.employeeNo})拒绝`}
+              </p>
+            </div>
+          )
+        default:
+          return '-'
+      }
+    }
+  },
+  {
+    label: '退回原因',
+    prop: 'returnReason',
+    render: (_row, returnReason) => {
+      return returnReason || '-'
+    }
+  },
+  {
+    label: '提交人',
+    prop: 'submitUser',
+    render: (_row, submitUser) => {
+      return submitUser?.nickname || '-'
+    }
+  },
+  {
+    label: '提交时间',
+    prop: 'submitTime',
+    render: (_row, submitTime) => {
+      return !submitTime ? '-' : dayjs(submitTime).format('YYYY-MM-DD')
+    }
+  }
+])
+const auditColumns = computed(() => {
+  return supportingDocsAuditColumns.value
+})
+
+// 获取审核列表
+const operationReportTotal = ref(0)
+const handleGetOperationReportAuditList = async () => {
+  console.log('taskOrderDetail.value?.id :log', taskOrderDetail.value)
+  const currentApi = getCurrentApi()
+  const auditListResult = await currentApi.getMajorIssuesAuditList({
+    pageNo: 1,
+    pageSize: 99999,
+    orderId: taskOrderDetail.value?.id || route.query.id
+    // notStatusList: 200,
+  })
+
+  supportingDocsAuditDataList.value = auditListResult.list.filter((item) => {
+    if (
+      [PressureReportType.INSPECTIONPLAN, PressureReportType.WORKINSTRUCTION].includes(
+        item.reportType
+      )
+    ) {
+      if (PressureReportType.WORKINSTRUCTION === item.reportType) return item.status !== 200
+      if (PressureReportType.INSPECTIONPLAN === item.reportType) {
+        if (item.secondStatus) {
+          item.status = item.secondStatus
+          item.currentNode = item.secondCurrentNode
+          item.currentAuditor = item.secondCurrentAuditor
+        }
+        return item.status !== 200
+      }
+    } else {
+      return item
+    }
+  })
+  operationReportTotal.value = auditListResult.total
+}
+
+const getExceptionItem = (field: string, fieldAttr: string) => {
+  const fileUrl = exceptionInfo.value[fieldAttr] && buildFileUrl(exceptionInfo.value[fieldAttr])
+  const fileName = exceptionInfo.value[field]
+  if (fileUrl) {
+    return (
+      <>
+        <div class="flex items-center w-full p-l-10px p-r-10px hover:bg-gray-100 rounded-6px">
+          <span class="flex-1 text-ellipsis overflow-hidden whitespace-nowrap">{fileName}</span>
+          <div class="ml-10px">
+            <el-link href={fileUrl} underline={false} download target="_blank" type="primary">
+              下载
+            </el-link>
+          </div>
+        </div>
+      </>
+    )
+  } else {
+    return <span class="text-red-500">---</span>
+  }
+}
+
+// 查看中止检验历史记录
+const handleViewSuspendCount = () => {
+  router.push({ name: 'TerminationInspectionTaskOrder' })
+}
+
+const fetchTaskDetail = async (taskId) => {
+  loadStart()
+  // 先使用通用接口获取任务单信息,确定 equipMainType
+  TaskOrderApi.getTaskOrder(taskId)
+    .then((response) => {
+      if (response) {
+        // 确定设备类型
+        equipMainType.value = response.equipMainType || null
+        
+        // 如果是锅炉或管道类型,再使用对应的接口重新获取更详细的信息
+        if (equipMainType.value === 200 || equipMainType.value === 300) {
+          const currentApi = getCurrentApi()
+          return currentApi.getTaskOrder(taskId)
+        }
+        
+        return response
+      }
+      return null
+    })
+    .then((response) => {
+      if (response) {
+        // 更新异常信息
+        if (response.orderExceptionRespVO) {
+          const orderExceptionRespVO = response.orderExceptionRespVO
+          exceptionInfo.value = {
+            ...orderExceptionRespVO,
+            adjustEffectiveDate: orderExceptionRespVO.adjustEffectiveDate
+              ? dayjs(orderExceptionRespVO.adjustEffectiveDate.join('-')).format('YYYY-MM-DD')
+              : ''
+          }
+        }
+        // 处理设备列表检验项目数据--过滤需要的数据[]  PressureReportType['WORKINSTRUCTION']
+        const typeList = [PressureReportType['INSPECTIONPLAN']]
+        const orderItems = (response.orderItems || []).map((item) => {
+          const reportRespVOList = (item.reportRespVOList || [])
+            .filter((i) => i.taskStatus !== 200)
+            .filter((v) => {
+              return (
+                !typeList.includes(v.reportType) ||
+                v.taskStatus === PressureCheckerMyTaskStatus.REPORT_END
+              )
+            })
+          return { ...item, reportRespVOList }
+        })
+        response.orderItems = orderItems
+
+        // 初始化服务单/受理单表单数据
+        serviceOrderDialogFormData.value = {
+          serviceFormReceiver: response?.recipient,
+          serviceFormReceiverPhone: response?.recipientPhone
+        }
+        console.log('response :log', response)
+        taskOrderDetail.value = response
+
+        handleGetOperationReportAuditList()
+      }
+    })
+    .finally(() => {
+      loadDone()
+    })
+}
+
+// 组件挂载时获取数据
+onMounted(async () => {
+  loadStart()
+  if (!route.query?.id) {
+    const confirm = await ElMessageBox.alert('任务单不存在,请检查!', '提示', {
+      confirmButtonText: '确定',
+      type: 'warning'
+    }).catch(() => true)
+    if (confirm) {
+      handleClosePage()
+    }
+    loadDone()
+    return
+  }
+  await fetchTaskDetail(route.query.id)
+  // await handleGetOperationReportAuditList()
+})
+</script>
+
+<style lang="scss" scoped>
+.editable-contact {
+  display: inline-block;
+  min-width: 50px;
+  padding: 2px 4px;
+  color: #015293;
+  cursor: pointer;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  transition: background-color 0.2s;
+}
+
+.editable-contact:hover {
+  background-color: #f0f9ff;
+  border-color: #e1f5fe;
+}
+
+.loading-text {
+  padding: 20px;
+  color: #909399;
+  text-align: center;
+}
+
+:deep(.el-descriptions__label) {
+  width: 10%;
+}
+
+:deep(.el-descriptions__content) {
+  width: 20%;
+  word-break: break-all;
+}
+
+.leader-tag {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  margin-right: 4px;
+  font-size: 12px;
+  line-height: 14px;
+  color: #4475d6;
+  text-align: center;
+  border: 1px solid #4475d6;
+}
+
+.app-container {
+  // Ensure this class is defined if not globally available
+  padding: 20px; // Example padding
+}
+
+// 操作按钮对齐样式
+.operation-buttons {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  gap: 8px;
+  flex-wrap: wrap;
+}
+
+.check-info-label-title {
+  display: flex;
+  width: 100%;
+  // margin-bottom: 12px;
+  margin: 12px 0;
+  line-height: 32px;
+  align-items: center;
+
+  &::before {
+    display: inline-block;
+    width: 4px;
+    height: 16px;
+    margin-right: 8px;
+    background: var(--el-color-primary);
+    content: '';
+  }
+}
+
+.his-dialog {
+  --his-table-border: 1px solid #ebeef5;
+  overflow-y: auto;
+  border: var(--his-table-border);
+
+  .his-table {
+    width: 100%;
+    table-layout: fixed;
+    border-collapse: collapse;
+
+    &__cell {
+      padding: 0 10px;
+      border-right: var(--his-table-border);
+      border-bottom: var(--his-table-border);
+      text-align: center;
+      word-break: break-word;
+      height: 50px;
+    }
+  }
+}
+</style>