Переглянути джерело

Merge remote-tracking branch 'origin/stable' into stable

# Conflicts:
#	yudao-ui-admin-vue3/src/api/pressure2/boilertaskorder/index.ts
#	yudao-ui-admin-vue3/src/api/pressure2/pipetaskorder/index.ts
xuzhancheng 2 тижнів тому
батько
коміт
200dc3e3aa
19 змінених файлів з 1072 додано та 86 видалено
  1. 4 4
      yudao-ui-admin-vue3/src/api/pressure2/boilertaskorder/index.ts
  2. 5 1
      yudao-ui-admin-vue3/src/api/pressure2/pipetaskorder/index.ts
  3. 3 4
      yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/myTask.vue
  4. 440 0
      yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/components/BoilerTaskOrderDetailViewDialog.vue
  5. 5 5
      yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/components/ServiceRecordList.vue
  6. 68 3
      yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/components/TaskOrderDetailDialog.vue
  7. 2 0
      yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/detail.vue
  8. 8 23
      yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/review.vue
  9. 3 3
      yudao-ui-admin-vue3/src/views/pressure2/equipmentArchiving/indexPipe.vue
  10. 1 1
      yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/certificate.vue
  11. 2 2
      yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/components/IssuePrintReportDialog.vue
  12. 2 2
      yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/components/IssueReportDialog.vue
  13. 439 0
      yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/components/PipeTaskOrderDetailViewDialog.vue
  14. 4 4
      yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/components/ServiceRecordList.vue
  15. 69 3
      yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/components/TaskOrderDetailDialog.vue
  16. 2 0
      yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/detail.vue
  17. 9 25
      yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/review.vue
  18. 3 3
      yudao-ui-admin-vue3/src/views/pressure2/reportArchivingPipe/index.vue
  19. 3 3
      yudao-ui-admin-vue3/src/views/pressure2/unqualifiedRecord/indexPipe.vue

+ 4 - 4
yudao-ui-admin-vue3/src/api/pressure2/boilertaskorder/index.ts

@@ -195,7 +195,7 @@ export interface BoilerBatchIssueReportItem {
 
 // 批量出具电子报告请求 VO
 export interface BoilerBatchIssueReportRequest {
-  list: BatchIssueReportItem[] // 批量出具列表
+  list: BoilerBatchIssueReportItem[] // 批量出具列表
 }
 
 // 锅炉检验任务确认 API
@@ -730,9 +730,9 @@ export const BoilerTaskOrderApi = {
     return await request.post({ url: `/pressure2/external-oa/cancleflow/${summaryId}` })
   },
 
-  // 退回OA流程
-  returnOAFlow: async (data: any) => {
-    return await request.post({ url: `/pressure2/external-oa/returnFlow`, data })
+  // 回收审核中的 操作指导书 - 检验方案
+  majorIssuesRecovery: async (data) => {
+    return await request.post({ url: '/pressure2/boiler-task-order/order-item/major-issues/recovery', data })
   },
 
 }

+ 5 - 1
yudao-ui-admin-vue3/src/api/pressure2/pipetaskorder/index.ts

@@ -165,7 +165,7 @@ export interface PipeBatchIssueReportItem {
 
 // 批量出具电子报告请求 VO
 export interface PipeBatchIssueReportRequest {
-  list: BatchIssueReportItem[] // 批量出具列表
+  list: PipeBatchIssueReportItem[] // 批量出具列表
 }
 
 // 报告出具记录 VO
@@ -716,5 +716,9 @@ export const PipeTaskOrderApi = {
     return await request.post({ url: `/pressure2/external-oa/cancleflow/${summaryId}` })
   },
 
+  // 回收审核中的 操作指导书 - 检验方案
+  majorIssuesRecovery: async (data) => {
+    return await request.post({ url: '/pressure2/pipe-task-order/order-item/major-issues/recovery', data })
+  },
 
 }

+ 3 - 4
yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/myTask.vue

@@ -382,10 +382,9 @@
 
       <el-table-column label="任务状态" align="center" prop="isClaim" min-width="150px">
         <template #default="scope">
-          <el-tag :type="getTypeColor(scope.row.isClaim ? 400 : 100)">{{
-              PressureTaskOrderTaskStatusMap[scope.row.isClaim ? 400 : 100]
-            }}
-          </el-tag>
+          <el-tag :type="scope.row.isClaim ? 'success' : 'default'">{{
+              scope.row.isClaim ? '已认领' : '待认领'
+            }}</el-tag>
         </template>
       </el-table-column>
       <el-table-column label="主报告状态" align="center" prop="taskStatus" min-width="150px">

+ 440 - 0
yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/components/BoilerTaskOrderDetailViewDialog.vue

@@ -0,0 +1,440 @@
+<template>
+  <el-dialog
+    v-model="dialogVisible"
+    title="修改后任务单详情"
+    width="80%"
+    draggable
+    :close-on-click-modal="false"
+    :before-close="handleClose"
+    top="5vh"
+  >
+    <div v-if="!taskOrderData" class="loading-text">无法加载任务单详情。</div>
+    <div v-else class="dialog-body">
+      <!-- 受检信息 -->
+      <ContentWrap title="受检信息">
+        <el-form :model="formData" label-width="90px" disabled class="p-3">
+          <div class="check-info-label-title">申请单位</div>
+          <el-row class="form-group" :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="申请单位名称" prop="unitName">
+                <el-input v-model="formData.unitName" placeholder="请输入单位名称" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="统一社会信用代码" prop="socialCreditCode" label-width="120px">
+                <el-input v-model="formData.socialCreditCode" placeholder="请输入统一社会信用代码" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="申请单位地址" prop="unitAddress" label-width="120px">
+                <el-input v-model="formData.unitAddress" placeholder="请输入申请单位地址" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="邮政编码" prop="zipCode">
+                <el-input v-model="formData.zipCode" placeholder="请输入邮政编码" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="约检联系人" prop="unitContact">
+                <el-input v-model="formData.unitContact" placeholder="请输入约检联系人" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="约检联系人电话" prop="unitPhone" label-width="120px">
+                <el-input v-model="formData.unitPhone" placeholder="请输入约检联系人电话" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="电子报告接收人" prop="recipient" label-width="120px">
+                <el-input v-model="formData.recipient" placeholder="请输入电子报告接收人" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="接收人电话" prop="recipientPhone">
+                <el-input v-model="formData.recipientPhone" placeholder="请输入接收人电话" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="接收人邮箱" prop="recipientEmail">
+                <el-input v-model="formData.recipientEmail" placeholder="请输入接收人邮箱" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <div class="check-info-label-title">使用单位</div>
+          <el-row class="form-group" :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="使用单位名称" prop="useUnitName">
+                <el-input v-model="formData.useUnitName" placeholder="请输入使用单位名称" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="统一社会信用代码" prop="useUnitSocialCreditCode" label-width="120px">
+                <el-input v-model="formData.useUnitSocialCreditCode" placeholder="请输入统一社会信用代码" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="使用单位地址" prop="useUnitAddress" label-width="120px">
+                <el-input v-model="formData.useUnitAddress" placeholder="请输入使用单位地址" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="邮政编码" prop="useUnitZipcode">
+                <el-input v-model="formData.useUnitZipcode" placeholder="请输入邮政编码" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="单位联系人" prop="useUnitContact" label-width="120px">
+                <el-input v-model="formData.useUnitContact" placeholder="请输入单位联系人" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="联系人电话" prop="useUnitPhone" label-width="120px">
+                <el-input v-model="formData.useUnitPhone" placeholder="请输入联系人电话" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <div class="check-info-label-title">受理信息</div>
+          <el-row class="form-group" :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="检验部门" prop="deptId">
+                <el-input v-model="formData.deptName" placeholder="检验部门" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="联系电话" prop="deptPhone" label-width="120px">
+                <el-input v-model="formData.deptPhone" placeholder="请输入联系电话" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="约检时间" prop="checkDate" label-width="120px">
+                <el-input v-model="formData.checkDate" placeholder="请选择约检时间" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="检验员" prop="teamList">
+                <div v-if="formattedCheckers.length > 0" class="selected-checkers">
+                  <el-tag
+                    v-for="checker in formattedCheckers"
+                    :key="checker.id"
+                    effect="plain"
+                  >
+                    {{ checker.label }}
+                  </el-tag>
+                </div>
+                <span v-else>-</span>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <div class="check-info-label-title">检验收费</div>
+          <el-row class="form-group" :gutter="24">
+            <el-col :span="24">
+              <el-form-item label="检验性质" prop="checkType" label-width="120px">
+                <el-input :value="checkTypeLabel" disabled class="!w-120px" />
+              </el-form-item>
+              <el-form-item prop="feeNature" label-width="120px">
+                <template #label>
+                  <div class="flex flex-col text-right">
+                    <span>收费性质</span>
+                    <span>(行政事业收费)</span>
+                  </div>
+                </template>
+                <el-radio-group v-model="formData.feeNature" disabled>
+                  <el-radio v-for="(item, key) in PressureFeeNatureMap" :key="key" :value="key" :label="item" />
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="收费形式" prop="feeType" label-width="120px">
+                <el-radio-group v-model="formData.feeType" disabled>
+                  <el-radio v-for="(item, key) in PressureFeeTypeMap" :key="key" :value="key" :label="item" />
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <div class="flex items-center gap-32 ml-40px text-14px">
+                <span>应收法定金额: {{ formData.shouldAmount }}</span>
+                <span>服务收费金额: {{ formData.serviceAmount }}</span>
+                <span>免征费用: {{ formData.reduceFee }}</span>
+              </div>
+            </el-col>
+          </el-row>
+        </el-form>
+      </ContentWrap>
+
+      <!-- 设备清单 -->
+      <div class="plan-section mt-4">
+        <div class="section-title">
+          <span>设备信息</span>
+        </div>
+        <ContentWrap>
+          <el-table
+            :data="taskOrderData.orderItems || []"
+            border
+            stripe
+            empty-text="暂无设备信息"
+          >
+            <el-table-column label="区域" align="center" min-width="120">
+              <template #default="{ row }">
+                <div>{{ row.equipDistrictName || '-' }}</div>
+                <div class="text-gray-400 text-sm">{{ row.equipStreetName || '' }}</div>
+              </template>
+            </el-table-column>
+            <el-table-column label="设备注册代码" align="center" min-width="190">
+              <template #default="{ row }">
+                <el-tag type="primary" size="small">{{ row.equipCode || '-' }}</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="是否租借" align="center" prop="isRent" min-width="80">
+              <template #default="{ row }">
+                {{ row.isRent ? '是' : '否' }}
+              </template>
+            </el-table-column>
+            <el-table-column label="使用证编号" align="center" prop="useRegisterNo" min-width="120" />
+            <el-table-column label="出厂编号" align="center" prop="factoryCode" 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>
+        </ContentWrap>
+      </div>
+
+      <!-- 备注 -->
+      <ContentWrap title="备注" class="mt-4">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item class="!mb-0" label="上次退回原因" prop="reason">
+              <el-input type="textarea" :rows="4" v-model="formData.reason" readonly disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </ContentWrap>
+    </div>
+
+    <template #footer>
+      <div class="flex justify-center">
+        <el-button @click="handleClose">关闭</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, computed, watch } from 'vue'
+import { formatArrayDate } from '@/utils/formatTime'
+import {
+  PressureFeeNatureMap,
+  PressureFeeTypeMap,
+  PressureBoilerCheckTypeMap
+} from '@/utils/constants'
+
+defineOptions({ name: 'BoilerTaskOrderDetailViewDialog' })
+
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    default: false
+  },
+  taskOrder: {
+    type: Object as () => Record<string, any>,
+    default: () => ({})
+  }
+})
+
+const emit = defineEmits<{
+  'update:visible': [value: boolean]
+}>()
+
+const dialogVisible = ref(props.visible)
+
+watch(() => props.visible, (val) => {
+  dialogVisible.value = val
+})
+
+watch(dialogVisible, (val) => {
+  emit('update:visible', val)
+})
+
+const taskOrderData = computed(() => props.taskOrder)
+
+const checkStatusMap: Record<number, string> = {
+  100: '内检',
+  200: '外检',
+  300: '耐压检'
+}
+
+const checkTypeLabel = computed(() => {
+  const ct = formData.value.checkType
+  if (!ct) return '-'
+  return PressureBoilerCheckTypeMap[ct] || checkStatusMap[ct] || ct
+})
+
+const formData = ref({
+  unitName: '',
+  socialCreditCode: '',
+  unitAddress: '',
+  zipCode: '',
+  unitContact: '',
+  unitPhone: '',
+  recipient: '',
+  recipientPhone: '',
+  recipientEmail: '',
+  useUnitName: '',
+  useUnitSocialCreditCode: '',
+  useUnitAddress: '',
+  useUnitZipcode: '',
+  useUnitContact: '',
+  useUnitPhone: '',
+  deptName: '',
+  deptPhone: '',
+  checkDate: '',
+  feeNature: '',
+  feeType: '',
+  shouldAmount: 0,
+  serviceAmount: 0,
+  reduceFee: 0,
+  checkType: undefined as number | undefined,
+  reason: ''
+})
+
+const formattedCheckers = computed(() => {
+  const teamList = taskOrderData.value?.teamInfoList
+  console.log("teamList",teamList)
+  if (!teamList || !Array.isArray(teamList) || teamList.length === 0) return []
+
+  const result: { id: string; label: string }[] = []
+  teamList.forEach((team: any, teamIndex: number) => {
+    if (team.isLeader) {
+      result.push({
+        id: `leader-${team.member.id || teamIndex}`,
+        label: `组长: ${team.member.nickname || ''}`
+      })
+    }else{
+      result.push({
+        id: `member-${team.member.id || teamIndex}`,
+        label: `${team.member.nickname || ''}`
+      })
+    }
+  })
+  return result
+})
+
+const initFormData = () => {
+  const data = taskOrderData.value
+  if (!data) return
+
+  const dateVal = data.checkDate
+    ? Array.isArray(data.checkDate)
+      ? formatArrayDate(data.checkDate)
+      : data.checkDate
+    : ''
+
+  formData.value = {
+    unitName: data.unitName || '',
+    socialCreditCode: data.socialCreditCode || '',
+    unitAddress: data.unitAddress || '',
+    zipCode: data.zipCode || '',
+    unitContact: data.unitContact || '',
+    unitPhone: data.unitPhone || '',
+    recipient: data.recipient || '',
+    recipientPhone: data.recipientPhone || '',
+    recipientEmail: data.recipientEmail || '',
+    useUnitName: typeof data.useUnitName === 'object' ? data.useUnitName?.name || '' : data.useUnitName || '',
+    useUnitSocialCreditCode: data.useUnitSocialCreditCode || '',
+    useUnitAddress: data.useUnitAddress || '',
+    useUnitZipcode: data.useUnitZipcode || '',
+    useUnitContact: data.useUnitContact || '',
+    useUnitPhone: data.useUnitPhone || '',
+    deptName: data.deptName || '',
+    deptPhone: data.deptPhone || '',
+    checkDate: dateVal,
+    feeNature: String(data.feeNature || ''),
+    feeType: String(data.feeType || ''),
+    shouldAmount: data.shouldAmount ?? data.payAmount ?? 0,
+    serviceAmount: data.serviceAmount ?? 0,
+    reduceFee: data.reduceFee ?? 0,
+    checkType: data.checkType,
+    reason: data.reason || ''
+  }
+}
+
+watch(() => props.taskOrder, () => {
+  initFormData()
+}, { immediate: true, deep: true })
+
+const handleClose = () => {
+  dialogVisible.value = false
+}
+</script>
+
+<style lang="scss" scoped>
+.loading-text {
+  text-align: center;
+  padding: 40px;
+  color: #909399;
+}
+
+.dialog-body {
+  max-height: 70vh;
+  overflow-y: auto;
+}
+
+.check-info-label-title {
+  width: 100%;
+  line-height: 32px;
+  display: flex;
+  align-items: center;
+  margin-bottom: 12px;
+  &::before {
+    content: '';
+    display: inline-block;
+    width: 4px;
+    height: 16px;
+    background: var(--el-color-primary);
+    margin-right: 8px;
+  }
+}
+
+.section-title {
+  font-size: 16px;
+  font-weight: 600;
+  color: #303133;
+  padding: 16px 0 8px;
+  display: flex;
+  align-items: center;
+  &::before {
+    content: '';
+    display: inline-block;
+    width: 4px;
+    height: 16px;
+    background: var(--el-color-primary);
+    margin-right: 8px;
+  }
+}
+
+:deep(.el-form) {
+  .el-form-item {
+    margin-bottom: 12px;
+    align-items: center;
+    &__label {
+      height: auto;
+      font-size: 13px;
+      line-height: 20px;
+      color: #606266;
+      padding-right: 8px;
+    }
+  }
+}
+
+.selected-checkers {
+  display: inline-flex;
+  flex-wrap: wrap;
+  gap: 8px;
+  min-height: 32px;
+  padding: 4px 8px;
+}
+</style>

+ 5 - 5
yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/components/ServiceRecordList.vue

@@ -331,7 +331,7 @@ const getTitle = computed(() => {
   switch (props.businessType) {
     case 100:
       return '服务单/受理单'
-    case 200:
+    case 1000:
       return '检验结果告知'
     case 400:
       return '重大问题线索'
@@ -433,7 +433,7 @@ const handleClose = () => {
   serviceOrderDialogVisible.value = false
   serviceOrderDialogFormRef.value?.clearValidate()
 }
-type BusinessType = 100 | 200 | 400
+type BusinessType = 100 | 1000 | 400
 const getSignFilePath = async (type: BusinessType) => {
   const response = await BoilerTaskOrderApi.getTaskOrder(props.taskOrderDetail.id)
   const signFileRespVOList = response.signFileRespVOList || []
@@ -632,8 +632,8 @@ const fetchHisVersionPage = async (bool = false) => {
     handleGetCheckKeyInputs(templateParams.value.dataStr)
   }
   handleGetCheckKeyInputs(templateParams.value.dataStr)
-  // 重大问题线索新增直接打开葡萄城编辑
-  if (props.businessType === 400 && unref(isAddMainquestion) === 'add' && curReportId.value === '') {
+  // 重大问题线索和检验情况告知单新增直接打开葡萄城编辑
+  if ((props.businessType === 400 || props.businessType === 1000) && unref(isAddMainquestion) === 'add' && curReportId.value === '') {
 
     //先生成报表
     const addReportFn = async (paramsData) => {
@@ -657,7 +657,7 @@ const fetchHisVersionPage = async (bool = false) => {
     if (props.businessType === 400) {
       params.orderItemId = props.orderItemId
     }
-    if (props.businessType === 400 && !props.reportId) {
+    if ((props.businessType === 400 || props.businessType === 1000) && !props.reportId) {
       curReportId.value = await addReportFn(params)
     }
 

+ 68 - 3
yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/components/TaskOrderDetailDialog.vue

@@ -55,7 +55,7 @@
           <el-button
             type="primary"
             plain
-            @click="() => handleServiceOrder(200)"
+            @click="() => handleInspectionStatusAddReport(1000)"
             :disabled="isTaskCancelled"
           >检验情况告知</el-button
           >
@@ -1746,6 +1746,9 @@ const supportingDocsAuditColumns = ref([
             {row.reportType === PressureReportType.MAINQUESTION && (
               <el-button link type="primary" onClick={() => handleCancelDocs(row)}>作废</el-button>
             )}
+            {row.reportType == PressureReportType.WORKINSTRUCTION && row.status == PressureTaskOrderStatus['AUDITING'] && <el-button link type="primary" onClick={() => recycleReportFn(row)}>
+              回收
+            </el-button>}
           </div>
         // case PressureTaskOrderStatus['APPROVED']:
         //   return <el-button link type="primary" onClick={() => handleAssociateEquipment(row)}>关联设备</el-button>
@@ -1826,8 +1829,8 @@ const handleFileUploadSuccess = (fileInfo:{fileName: string, fileUrl: string}) =
 }
 /*****   异常信息 end  *****/
 
-// 获取服务单/受理单模板
-type BusinessType = 100 | 200 | 400
+// 获取服务单/受理单模板 1000-检验情况告知 400-重大问题线索
+type BusinessType = 100 | 1000 | 400
 const handleServiceOrder = (type: BusinessType) => {
   console.log(type)
   if (type == 100){
@@ -2168,6 +2171,44 @@ const handleMainquestionAddReport = async (reportType, type: 'add' | 'edit' | 'v
   handleServiceOrder(400)
 }
 
+/*
+* 添加检验情况告知单
+* */
+const handleInspectionStatusAddReport = async (reportType, type: 'add' | 'edit' | 'view') => {
+
+  if (!reportType) return ElMessage.error('未知的报告类型')
+
+  if (taskOrderDetail.value.notificationformReport != null){
+    isAddMainquestion.value = 'view'
+    mainReportId.value = taskOrderDetail.value.notificationformReport.id
+  }else{
+    isAddMainquestion.value = 'add'
+  }
+
+  // mainOrderItemId.value = row ? row.orderItemId : unref(selectedEquips)[0].mainID
+
+  // 校验审核列表是否已经存在
+  // const existingAudit = supportingDocsAuditDataList.value.find(item => item.reportType === reportType && item.orderItemId === curMainquestionEquipmentRow.value.mainID)
+  // if (existingAudit) {
+  //   ElMessage.error('该设备已存在该类型的报告')
+  //   return
+  // }
+
+  if (isAddMainquestion.value == 'add'){
+    const confirmed = await ElMessageBox.confirm('是否确定添加检验情况告知单?', '添加检验情况告知单提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    }).catch(() => false);
+
+    if (!confirmed) {
+      return;
+    }
+  }
+
+  handleServiceOrder(1000)
+}
+
 const handleSuccessInspectionplan = async (info) => {
   const firstOrderItem = unref(taskOrderDetail).orderItems[0] || {}
   const params: Recordable = {
@@ -2547,6 +2588,30 @@ const canPushSettlementSystem = computed(() => {
   // 超级管理员角色 | 项目负责人 才能推送结算系统
   return !(taskOrderDetail.value.managerId == unref(userInfo)?.id || userStore.getRoles.includes('super_admin'))
 })
+
+const recycleReportFn = async (item) => {
+  ElMessageBox.confirm(`确定要回收项目 ${item.reportName} 吗?`, '提示', {
+    confirmButtonText: '确认回收',
+    cancelButtonText: '取 消'
+  })
+    .then(async () => {
+      const res = await BoilerTaskOrderApi.majorIssuesRecovery({
+        businessType: '0',
+        reportId: item.id
+      })
+      if (res) {
+        ElMessage.success('回收成功')
+        refreshDetail()
+      }
+    })
+    .catch(() => console.info('操作取消'))
+}
+
+const refreshDetail = () => {
+  console.log('刷新详情')
+  emit('refresh')
+}
+
 </script>
 
 <style lang="scss" scoped>

+ 2 - 0
yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/detail.vue

@@ -1198,6 +1198,8 @@ const submitAcceptance = async (reason: string) => {
       //   }
       //   return acc
       // }, []),
+      //用于展示修改的检验员
+      teamInfoList: formData.value.teamItemList,
       teamItemList: formData.value.teamItemList.reduce((acc: any[], item: any) => {
         const existingGroup = acc.find(
           group => group.groupTeamId === item.groupTeamId

+ 8 - 23
yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/review.vue

@@ -293,23 +293,12 @@
     :order-id="selectedOrderIdForRecord"
   />
 
-  <!-- 任务单详情对话框 (用于查看修改内容) -->
-  <el-dialog
-    v-model="taskOrderDetailDialogVisible"
-    title="修改后任务单详情"
-    width="80%"
-    draggable
-    :close-on-click-modal="false"
-  >
-    <BoilerTaskOrderModifyContent
-      v-if="parsedTaskOrderData && equipMainType === PressureEquipMainType.BOILER"
-      :task-order="parsedTaskOrderData"
-    />
-    <PipeTaskOrderModifyContent
-      v-if="parsedTaskOrderData && equipMainType === PressureEquipMainType.PIPE"
-      :task-order="parsedTaskOrderData"
-    />
-  </el-dialog>
+  <!-- 任务单详情弹窗 (基于编辑页面只读展示) -->
+  <BoilerTaskOrderDetailViewDialog
+    v-if="parsedTaskOrderData"
+    v-model:visible="taskOrderDetailDialogVisible"
+    :task-order="parsedTaskOrderData"
+  />
 </template>
 
 <script setup lang="ts">
@@ -329,10 +318,8 @@ import {
   allCheckTypeMap,
   PressureBoilerCheckTypeMap, PressureEquipMainType
 } from '@/utils/constants'
-// import TaskOrderDetailDialog from './components/TaskOrderDetailDialog.vue'
-import BoilerTaskOrderModifyContent from './components/BoilerTaskOrderModifyContent.vue'
-import PipeTaskOrderModifyContent from '../../pressure2/pipetaskorder/components/PipeTaskOrderModifyContent.vue'
- import TaskOrderOperationRecordDialog from './components/TaskOrderOperationRecordDialog.vue'
+import BoilerTaskOrderDetailViewDialog from './components/BoilerTaskOrderDetailViewDialog.vue'
+import TaskOrderOperationRecordDialog from './components/TaskOrderOperationRecordDialog.vue'
 import { useUserStore } from '@/store/modules/user'
 import { cloneDeep } from 'lodash-es'
 import CustomUserSelectModal from '@/components/SmartTable/components/selectUserModal.vue'
@@ -516,13 +503,11 @@ const handleReject = async (row) => {
     }
   }
 }
-let equipMainType = ref<number | null>(null)
 /** 查看修改内容 */
 const handleViewModifyContent = (row: any) => {
   if (row.afterJson) {
     try {
       parsedTaskOrderData.value = JSON.parse(row.afterJson)
-      equipMainType.value = parseInt(row.equipMainType)
       taskOrderDetailDialogVisible.value = true
     } catch (error) {
       console.error('解析修改内容失败:', error)

+ 3 - 3
yudao-ui-admin-vue3/src/views/pressure2/equipmentArchiving/indexPipe.vue

@@ -184,7 +184,7 @@ const columns = ref<SmartTableColumn[]>([
     }
   },
   {
-    label: '设备名称',
+    label: '工程名称',
     prop: 'equipName',
     fieldProps: {
       align: 'center',
@@ -193,12 +193,12 @@ const columns = ref<SmartTableColumn[]>([
     }
   },
   {
-    label: '设备注册代码',
+    label: '工程号',
     prop: 'equipCode',
     search: {
       type: 'input',
       fieldProps: {
-        placeholder: '请输入设备注册代码'
+        placeholder: '请输入工程号'
       },
       sort: 2
     },

+ 1 - 1
yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/certificate.vue

@@ -284,7 +284,7 @@
           <span v-else>-</span>
         </template>
       </el-table-column>
-      <el-table-column label="注册代码" align="center" prop="equipCode" min-width="120px" />
+      <el-table-column label="工程号" align="center" prop="equipCode" min-width="120px" />
       <el-table-column label="检验性质" align="center" prop="checkType" min-width="120px">
         <template #default="scope">
           {{ PressurePipeCheckTypeMap[scope.row.checkType] }}

+ 2 - 2
yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/components/IssuePrintReportDialog.vue

@@ -66,7 +66,7 @@
                 <HighlightText :text="scope.row.orderNo" :keyword="searchKeyword" />
               </template>
             </el-table-column>
-           <el-table-column label="设备注册代码" prop="equipCode" min-width="150px" align="center">
+           <el-table-column label="工程号" prop="equipCode" min-width="150px" align="center">
               <template #default="scope">
                 <HighlightText :text="scope.row.equipCode" :keyword="searchKeyword" />
               </template>
@@ -76,7 +76,7 @@
                 <HighlightText :text="scope.row.useRegisterNo" :keyword="searchKeyword" />
               </template>
             </el-table-column>
-            <el-table-column label="设备名称" prop="equipName" min-width="120px" align="center">
+            <el-table-column label="工程名称" prop="equipName" min-width="120px" align="center">
               <template #default="scope">
                 <HighlightText :text="scope.row.equipName" :keyword="searchKeyword" />
               </template>

+ 2 - 2
yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/components/IssueReportDialog.vue

@@ -102,7 +102,7 @@
             @selection-change="handleSelectionChange"
           >
             <el-table-column type="selection" width="50" />
-            <el-table-column label="设备注册代码" prop="equipCode" min-width="150px" align="center">
+            <el-table-column label="工程号" prop="equipCode" min-width="150px" align="center">
               <template #default="scope">
                 <HighlightText :text="scope.row.equipCode" :keyword="searchKeyword" />
               </template>
@@ -112,7 +112,7 @@
                 <HighlightText :text="scope.row.useRegisterNo" :keyword="searchKeyword" />
               </template>
             </el-table-column>
-            <el-table-column label="设备名称" prop="equipName" min-width="120px" align="center">
+            <el-table-column label="工程名称" prop="equipName" min-width="120px" align="center">
               <template #default="scope">
                 <HighlightText :text="scope.row.equipName" :keyword="searchKeyword" />
               </template>

+ 439 - 0
yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/components/PipeTaskOrderDetailViewDialog.vue

@@ -0,0 +1,439 @@
+<template>
+  <el-dialog
+    v-model="dialogVisible"
+    title="修改后任务单详情"
+    width="80%"
+    draggable
+    :close-on-click-modal="false"
+    :before-close="handleClose"
+    top="5vh"
+  >
+    <div v-if="!taskOrderData" class="loading-text">无法加载任务单详情。</div>
+    <div v-else class="dialog-body">
+      <!-- 受检信息 -->
+      <ContentWrap title="受检信息">
+        <el-form :model="formData" label-width="90px" disabled class="p-3">
+          <div class="check-info-label-title">申请单位</div>
+          <el-row class="form-group" :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="申请单位名称" prop="unitName">
+                <el-input v-model="formData.unitName" placeholder="请输入单位名称" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="统一社会信用代码" prop="socialCreditCode" label-width="120px">
+                <el-input v-model="formData.socialCreditCode" placeholder="请输入统一社会信用代码" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="申请单位地址" prop="unitAddress" label-width="120px">
+                <el-input v-model="formData.unitAddress" placeholder="请输入申请单位地址" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="邮政编码" prop="zipCode">
+                <el-input v-model="formData.zipCode" placeholder="请输入邮政编码" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="约检联系人" prop="unitContact">
+                <el-input v-model="formData.unitContact" placeholder="请输入约检联系人" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="约检联系人电话" prop="unitPhone" label-width="120px">
+                <el-input v-model="formData.unitPhone" placeholder="请输入约检联系人电话" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="电子报告接收人" prop="recipient" label-width="120px">
+                <el-input v-model="formData.recipient" placeholder="请输入电子报告接收人" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="接收人电话" prop="recipientPhone">
+                <el-input v-model="formData.recipientPhone" placeholder="请输入接收人电话" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="接收人邮箱" prop="recipientEmail">
+                <el-input v-model="formData.recipientEmail" placeholder="请输入接收人邮箱" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <div class="check-info-label-title">使用单位</div>
+          <el-row class="form-group" :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="使用单位名称" prop="useUnitName">
+                <el-input v-model="formData.useUnitName" placeholder="请输入使用单位名称" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="统一社会信用代码" prop="useUnitSocialCreditCode" label-width="120px">
+                <el-input v-model="formData.useUnitSocialCreditCode" placeholder="请输入统一社会信用代码" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="使用单位地址" prop="useUnitAddress" label-width="120px">
+                <el-input v-model="formData.useUnitAddress" placeholder="请输入使用单位地址" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="邮政编码" prop="useUnitZipcode">
+                <el-input v-model="formData.useUnitZipcode" placeholder="请输入邮政编码" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="单位联系人" prop="useUnitContact" label-width="120px">
+                <el-input v-model="formData.useUnitContact" placeholder="请输入单位联系人" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="联系人电话" prop="useUnitPhone" label-width="120px">
+                <el-input v-model="formData.useUnitPhone" placeholder="请输入联系人电话" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <div class="check-info-label-title">受理信息</div>
+          <el-row class="form-group" :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="检验部门" prop="deptId">
+                <el-input v-model="formData.deptName" placeholder="检验部门" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="联系电话" prop="deptPhone" label-width="120px">
+                <el-input v-model="formData.deptPhone" placeholder="请输入联系电话" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="约检时间" prop="checkDate" label-width="120px">
+                <el-input v-model="formData.checkDate" placeholder="请选择约检时间" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="检验员" prop="teamItemList">
+                <div v-if="formattedCheckers.length > 0" class="selected-checkers">
+                  <el-tag
+                    v-for="checker in formattedCheckers"
+                    :key="checker.id"
+                    effect="plain"
+                  >
+                    {{ checker.label }}
+                  </el-tag>
+                </div>
+                <span v-else>-</span>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <div class="check-info-label-title">检验收费</div>
+          <el-row class="form-group" :gutter="24">
+            <el-col :span="24">
+              <el-form-item label="检验性质" prop="checkType" label-width="120px">
+                <el-input :value="checkTypeLabel" disabled class="!w-120px" />
+              </el-form-item>
+              <el-form-item prop="feeNature" label-width="120px">
+                <template #label>
+                  <div class="flex flex-col text-right">
+                    <span>收费性质</span>
+                    <span>(行政事业收费)</span>
+                  </div>
+                </template>
+                <el-radio-group v-model="formData.feeNature" disabled>
+                  <el-radio v-for="(item, key) in PressureFeeNatureMap" :key="key" :value="key" :label="item" />
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="收费形式" prop="feeType" label-width="120px">
+                <el-radio-group v-model="formData.feeType" disabled>
+                  <el-radio v-for="(item, key) in PressureFeeTypeMap" :key="key" :value="key" :label="item" />
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <div class="flex items-center gap-32 ml-40px text-14px">
+                <span>应收法定金额: {{ formData.shouldAmount }}</span>
+                <span>服务收费金额: {{ formData.serviceAmount }}</span>
+                <span>免征费用: {{ formData.reduceFee }}</span>
+              </div>
+            </el-col>
+          </el-row>
+        </el-form>
+      </ContentWrap>
+
+      <!-- 设备清单 -->
+      <div class="plan-section mt-4">
+        <div class="section-title">
+          <span>设备信息</span>
+        </div>
+        <ContentWrap>
+          <el-table
+            :data="taskOrderData.orderItems || []"
+            border
+            stripe
+            empty-text="暂无设备信息"
+            row-key="id"
+          >
+            <el-table-column type="expand" width="1">
+              <template #default="props">
+                <div class="ml-15px mr-15px">
+                  <el-table :data="props.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="{ row }">
+                <span class="text-xs">{{ row.equipStreetName ?? 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" show-overflow-tooltip />
+          </el-table>
+        </ContentWrap>
+      </div>
+
+      <!-- 备注 -->
+      <ContentWrap title="备注" class="mt-4">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item class="!mb-0" label="上次退回原因" prop="reason">
+              <el-input type="textarea" :rows="4" v-model="formData.reason" readonly disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </ContentWrap>
+    </div>
+
+    <template #footer>
+      <div class="flex justify-center">
+        <el-button @click="handleClose">关闭</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, computed, watch } from 'vue'
+import { formatArrayDate } from '@/utils/formatTime'
+import {
+  PressureFeeNatureMap,
+  PressureFeeTypeMap,
+  PressurePipeCheckTypeMap
+} from '@/utils/constants'
+
+defineOptions({ name: 'PipeTaskOrderDetailViewDialog' })
+
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    default: false
+  },
+  taskOrder: {
+    type: Object as () => Record<string, any>,
+    default: () => ({})
+  }
+})
+
+const emit = defineEmits<{
+  'update:visible': [value: boolean]
+}>()
+
+const dialogVisible = ref(props.visible)
+
+watch(() => props.visible, (val) => {
+  dialogVisible.value = val
+})
+
+watch(dialogVisible, (val) => {
+  emit('update:visible', val)
+})
+
+const taskOrderData = computed(() => props.taskOrder)
+
+const checkTypeLabel = computed(() => {
+  const ct = formData.value.checkType
+  if (!ct) return '-'
+  return PressurePipeCheckTypeMap[ct] || ct
+})
+
+const formData = ref({
+  unitName: '',
+  socialCreditCode: '',
+  unitAddress: '',
+  zipCode: '',
+  unitContact: '',
+  unitPhone: '',
+  recipient: '',
+  recipientPhone: '',
+  recipientEmail: '',
+  useUnitName: '',
+  useUnitSocialCreditCode: '',
+  useUnitAddress: '',
+  useUnitZipcode: '',
+  useUnitContact: '',
+  useUnitPhone: '',
+  deptName: '',
+  deptPhone: '',
+  checkDate: '',
+  feeNature: '',
+  feeType: '',
+  shouldAmount: 0,
+  serviceAmount: 0,
+  reduceFee: 0,
+  checkType: undefined as number | undefined,
+  reason: ''
+})
+
+const formattedCheckers = computed(() => {
+  const teamList = taskOrderData.value?.teamInfoList
+  console.log("teamList",teamList)
+  if (!teamList || !Array.isArray(teamList) || teamList.length === 0) return []
+
+  const result: { id: string; label: string }[] = []
+  teamList.forEach((team: any, teamIndex: number) => {
+    if (team.isLeader) {
+      result.push({
+        id: `leader-${team.member.id || teamIndex}`,
+        label: `组长: ${team.member.nickname || ''}`
+      })
+    }else{
+      result.push({
+        id: `member-${team.member.id || teamIndex}`,
+        label: `${team.member.nickname || ''}`
+      })
+    }
+  })
+  return result
+})
+
+const initFormData = () => {
+  const data = taskOrderData.value
+  if (!data) return
+
+  const dateVal = data.checkDate
+    ? Array.isArray(data.checkDate)
+      ? formatArrayDate(data.checkDate)
+      : data.checkDate
+    : ''
+
+  formData.value = {
+    unitName: data.unitName || '',
+    socialCreditCode: data.socialCreditCode || '',
+    unitAddress: data.unitAddress || '',
+    zipCode: data.zipCode || '',
+    unitContact: data.unitContact || '',
+    unitPhone: data.unitPhone || '',
+    recipient: data.recipient || '',
+    recipientPhone: data.recipientPhone || '',
+    recipientEmail: data.recipientEmail || '',
+    useUnitName: typeof data.useUnitName === 'object' ? data.useUnitName?.name || '' : data.useUnitName || '',
+    useUnitSocialCreditCode: data.useUnitSocialCreditCode || '',
+    useUnitAddress: data.useUnitAddress || '',
+    useUnitZipcode: data.useUnitZipcode || '',
+    useUnitContact: data.useUnitContact || '',
+    useUnitPhone: data.useUnitPhone || '',
+    deptName: data.deptName || '',
+    deptPhone: data.deptPhone || '',
+    checkDate: dateVal,
+    feeNature: String(data.feeNature || ''),
+    feeType: String(data.feeType || ''),
+    shouldAmount: data.shouldAmount ?? data.payAmount ?? 0,
+    serviceAmount: data.serviceAmount ?? 0,
+    reduceFee: data.reduceFee ?? 0,
+    checkType: data.checkType,
+    reason: data.reason || ''
+  }
+}
+
+watch(() => props.taskOrder, () => {
+  initFormData()
+}, { immediate: true, deep: true })
+
+const handleClose = () => {
+  dialogVisible.value = false
+}
+</script>
+
+<style lang="scss" scoped>
+.loading-text {
+  text-align: center;
+  padding: 40px;
+  color: #909399;
+}
+
+.dialog-body {
+  max-height: 70vh;
+  overflow-y: auto;
+}
+
+.check-info-label-title {
+  width: 100%;
+  line-height: 32px;
+  display: flex;
+  align-items: center;
+  margin-bottom: 12px;
+  &::before {
+    content: '';
+    display: inline-block;
+    width: 4px;
+    height: 16px;
+    background: var(--el-color-primary);
+    margin-right: 8px;
+  }
+}
+
+.section-title {
+  font-size: 16px;
+  font-weight: 600;
+  color: #303133;
+  padding: 16px 0 8px;
+  display: flex;
+  align-items: center;
+  &::before {
+    content: '';
+    display: inline-block;
+    width: 4px;
+    height: 16px;
+    background: var(--el-color-primary);
+    margin-right: 8px;
+  }
+}
+
+:deep(.el-form) {
+  .el-form-item {
+    margin-bottom: 12px;
+    align-items: center;
+    &__label {
+      height: auto;
+      font-size: 13px;
+      line-height: 20px;
+      color: #606266;
+      padding-right: 8px;
+    }
+  }
+}
+
+.selected-checkers {
+  display: inline-flex;
+  flex-wrap: wrap;
+  gap: 8px;
+  min-height: 32px;
+  padding: 4px 8px;
+}
+</style>

+ 4 - 4
yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/components/ServiceRecordList.vue

@@ -327,7 +327,7 @@ const getTitle = computed(() => {
   switch (props.businessType) {
     case 100:
       return '服务单/受理单'
-    case 200:
+    case 1000:
       return '检验结果告知'
     case 400:
       return '重大问题线索'
@@ -426,7 +426,7 @@ const handleClose = () => {
   serviceOrderDialogVisible.value = false
   serviceOrderDialogFormRef.value?.clearValidate()
 }
-type BusinessType = 100 | 200 | 400
+type BusinessType = 100 | 1000 | 400
 const getSignFilePath = async (type: BusinessType) => {
   const response = await PipeTaskOrderApi.getTaskOrder(props.taskOrderDetail.id)
   const signFileRespVOList = response.signFileRespVOList || []
@@ -615,7 +615,7 @@ const fetchHisVersionPage = async (bool = false) => {
   }
   handleGetCheckKeyInputs(templateParams.value.dataStr)
   // 重大问题线索新增直接打开葡萄城编辑
-  if (props.businessType === 400 && unref(isAddMainquestion) === 'add' && curReportId.value === '') {
+  if ((props.businessType === 400 || props.businessType === 1000) && unref(isAddMainquestion) === 'add' && curReportId.value === '') {
 
     //先生成报表
     const addReportFn = async (paramsData) => {
@@ -635,7 +635,7 @@ const fetchHisVersionPage = async (bool = false) => {
       businessType: props.businessType,
       modifiedReason: ""
     }
-    if (props.businessType === 400 && !props.reportId) {
+    if ((props.businessType === 400 || props.businessType === 1000) && !props.reportId) {
       curReportId.value = await addReportFn(params)
     }
 

+ 69 - 3
yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/components/TaskOrderDetailDialog.vue

@@ -55,7 +55,7 @@
           <el-button
             type="primary"
             plain
-            @click="() => handleServiceOrder(200)"
+            @click="() => handleInspectionStatusAddReport(1000)"
             :disabled="isTaskCancelled"
           >检验情况告知</el-button
           >
@@ -998,6 +998,7 @@ import OrderDialog from "@/views/pressure2/boilertaskorder/components/OrderDialo
 import calcCheckItemFee from './calcCheckItemFee.vue'
 import {InspectionNatureTypeApi} from "../../../../api/pressure2/inspectionnaturetype";
 import {checkRole} from "@/utils/permission";
+import {BoilerTaskOrderApi} from "@/api/pressure2/boilertaskorder";
 
 
 const userStore = useUserStore()
@@ -1844,6 +1845,9 @@ const supportingDocsAuditColumns = ref([
             {row.reportType === PressureReportType.MAINQUESTION && (
               <el-button link type="primary" onClick={() => handleCancelDocs(row)}>作废</el-button>
             )}
+            {row.reportType == PressureReportType.WORKINSTRUCTION && row.status == PressureTaskOrderStatus['AUDITING'] && <el-button link type="primary" onClick={() => recycleReportFn(row)}>
+              回收
+            </el-button>}
           </div>
         // case PressureTaskOrderStatus['APPROVED']:
         //   return <el-button link type="primary" onClick={() => handleAssociateEquipment(row)}>关联设备</el-button>
@@ -1924,8 +1928,8 @@ const handleFileUploadSuccess = (fileInfo:{fileName: string, fileUrl: string}) =
 }
 /*****   异常信息 end  *****/
 
-// 获取服务单/受理单模板
-type BusinessType = 100 | 200 | 400
+// 获取服务单/受理单模板 1000-检验情况告知 400-重大问题线索
+type BusinessType = 100 | 1000 | 400
 const handleServiceOrder = (type: BusinessType) => {
   console.log(type)
   if (type == 100){
@@ -2238,6 +2242,44 @@ const handleMainquestionAddReport = async (reportType, type: 'add' | 'edit' | 'v
   handleServiceOrder(400)
 }
 
+/*
+* 添加检验情况告知单
+* */
+const handleInspectionStatusAddReport = async (reportType, type: 'add' | 'edit' | 'view') => {
+
+  if (!reportType) return ElMessage.error('未知的报告类型')
+
+  if (taskOrderDetail.value.notificationformReport != null){
+    isAddMainquestion.value = 'view'
+    mainReportId.value = taskOrderDetail.value.notificationformReport.id
+  }else{
+    isAddMainquestion.value = 'add'
+  }
+
+  // mainOrderItemId.value = row ? row.orderItemId : unref(selectedEquips)[0].mainID
+
+  // 校验审核列表是否已经存在
+  // const existingAudit = supportingDocsAuditDataList.value.find(item => item.reportType === reportType && item.orderItemId === curMainquestionEquipmentRow.value.mainID)
+  // if (existingAudit) {
+  //   ElMessage.error('该设备已存在该类型的报告')
+  //   return
+  // }
+
+  if (isAddMainquestion.value == 'add'){
+    const confirmed = await ElMessageBox.confirm('是否确定添加检验情况告知单?', '添加检验情况告知单提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    }).catch(() => false);
+
+    if (!confirmed) {
+      return;
+    }
+  }
+
+  handleServiceOrder(1000)
+}
+
 const handleSuccessInspectionplan = async (info) => {
   const firstOrderItem = unref(taskOrderDetail).orderItems[0] || {}
   const params: Recordable = {
@@ -2682,6 +2724,30 @@ const canPushSettlementSystem = computed(() => {
   // 超级管理员角色 | 项目负责人 才能推送结算系统
   return !(taskOrderDetail.value.managerId == unref(userInfo)?.id || userStore.getRoles.includes('super_admin'))
 })
+
+const recycleReportFn = async (item) => {
+  ElMessageBox.confirm(`确定要回收项目 ${item.reportName} 吗?`, '提示', {
+    confirmButtonText: '确认回收',
+    cancelButtonText: '取 消'
+  })
+    .then(async () => {
+      const res = await PipeTaskOrderApi.majorIssuesRecovery({
+        businessType: '0',
+        reportId: item.id
+      })
+      if (res) {
+        ElMessage.success('回收成功')
+        refreshDetail()
+      }
+    })
+    .catch(() => console.info('操作取消'))
+}
+
+const refreshDetail = () => {
+  console.log('刷新详情')
+  emit('refresh')
+}
+
 </script>
 
 <style lang="scss" scoped>

+ 2 - 0
yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/detail.vue

@@ -1363,6 +1363,8 @@ const submitAcceptance = async (reason: string) => {
         return acc
       }, []),*/
       // userList: selectedCheckers.value.map(checker => checker.member).filter(Boolean),
+      //用于展示修改的检验员
+      teamInfoList: formData.value.teamItemList,
       teamItemList: formData.value.teamItemList.reduce((acc: any[], item: any) => {
         const existingGroup = acc.find(
           group => group.groupTeamId === item.groupTeamId

+ 9 - 25
yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/review.vue

@@ -293,24 +293,12 @@
     :order-id="selectedOrderIdForRecord"
   />
 
-  <!-- 任务单详情对话框 (用于查看修改内容) -->
-  <el-dialog
-    v-model="taskOrderDetailDialogVisible"
-    title="修改后任务单详情"
-    width="80%"
-    draggable
-    :close-on-click-modal="false"
-  >
-    <BoilerTaskOrderDetailDialog
-      v-if="parsedTaskOrderData && equipMainType === PressureEquipMainType.BOILER"
-      :task-order="parsedTaskOrderData"
-      :in-page-mode="false"
-    />
-    <PipeTaskOrderModifyContent
-      v-if="parsedTaskOrderData && equipMainType === PressureEquipMainType.PIPE"
-      :task-order="parsedTaskOrderData"
-    />
-  </el-dialog>
+  <!-- 任务单详情弹窗 (基于编辑页面只读展示) -->
+  <PipeTaskOrderDetailViewDialog
+    v-if="parsedTaskOrderData"
+    v-model:visible="taskOrderDetailDialogVisible"
+    :task-order="parsedTaskOrderData"
+  />
 </template>
 
 <script setup lang="ts">
@@ -328,12 +316,10 @@ import {
   PressureTaskOrderChangeTypeMap,
   PressureEquipMainTypeMap,
   allCheckTypeMap,
-  PressureBoilerCheckTypeMap, PressureEquipMainType
+  PressureEquipMainType
 } from '@/utils/constants'
-// import TaskOrderDetailDialog from './components/TaskOrderDetailDialog.vue'
-import BoilerTaskOrderDetailDialog from '../../pressure2/boilertaskorder/components/TaskOrderDetailDialog.vue'
-import PipeTaskOrderModifyContent from './components/PipeTaskOrderModifyContent.vue'
- import TaskOrderOperationRecordDialog from './components/TaskOrderOperationRecordDialog.vue'
+import PipeTaskOrderDetailViewDialog from './components/PipeTaskOrderDetailViewDialog.vue'
+import TaskOrderOperationRecordDialog from './components/TaskOrderOperationRecordDialog.vue'
 import { useUserStore } from '@/store/modules/user'
 import { cloneDeep } from 'lodash-es'
 import CustomUserSelectModal from '@/components/SmartTable/components/selectUserModal.vue'
@@ -517,13 +503,11 @@ const handleReject = async (row) => {
     }
   }
 }
-let equipMainType = ref<number | null>(null)
 /** 查看修改内容 */
 const handleViewModifyContent = (row: any) => {
   if (row.afterJson) {
     try {
       parsedTaskOrderData.value = JSON.parse(row.afterJson)
-      equipMainType.value = parseInt(row.equipMainType)
       taskOrderDetailDialogVisible.value = true
     } catch (error) {
       console.error('解析修改内容失败:', error)

+ 3 - 3
yudao-ui-admin-vue3/src/views/pressure2/reportArchivingPipe/index.vue

@@ -182,7 +182,7 @@ const columns = ref<SmartTableColumn[]>([
     }
   },
   {
-    label: '设备名称',
+    label: '工程名称',
     prop: 'equipName',
     fieldProps: {
       align: 'center',
@@ -191,12 +191,12 @@ const columns = ref<SmartTableColumn[]>([
     }
   },
   {
-    label: '设备注册代码',
+    label: '工程号',
     prop: 'equipCode',
     search: {
       type: 'input',
       fieldProps: {
-        placeholder: '请输入设备注册代码'
+        placeholder: '请输入工程号'
       },
       sort: 2
     },

+ 3 - 3
yudao-ui-admin-vue3/src/views/pressure2/unqualifiedRecord/indexPipe.vue

@@ -26,10 +26,10 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="设备注册代码" prop="equipCode">
+      <el-form-item label="工程号" prop="equipCode">
         <el-input
           v-model="queryParams.equipCode"
-          placeholder="请输入设备注册代码"
+          placeholder="请输入工程号"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
@@ -90,7 +90,7 @@
     <el-table v-loading="loading" :data="list" :stripe="true">
       <el-table-column label="任务单号" align="center" prop="orderNo" min-width="150px" />
       <el-table-column label="主报告编号" align="center" prop="mainReportNo" min-width="150px" />
-      <el-table-column label="设备注册代码" align="center" prop="equipCode" min-width="150px" />
+      <el-table-column label="工程号" align="center" prop="equipCode" min-width="150px" />
       <el-table-column label="使用单位" align="center" prop="unitName" min-width="150px" />
       <el-table-column label="检验性质" align="center" prop="checkType" min-width="120px">
         <template #default="scope">