Explorar el Código

Merge branch 'stable' of http://39.98.153.250:9080/yudao/yudao-admin-yiqun into stable

yangguanjin hace 1 día
padre
commit
f77078296d
Se han modificado 27 ficheros con 426 adiciones y 108 borrados
  1. 2 2
      yudao-ui-admin-vue3/src/views/pressure/acceptorder/detail.vue
  2. 1 4
      yudao-ui-admin-vue3/src/views/pressure/acceptorder/index.vue
  3. 2 2
      yudao-ui-admin-vue3/src/views/pressure2/acceptorder/boilerDetail.vue
  4. 1 4
      yudao-ui-admin-vue3/src/views/pressure2/acceptorder/index.vue
  5. 1 1
      yudao-ui-admin-vue3/src/views/pressure2/acceptorder/pipeDetail.vue
  6. 1 4
      yudao-ui-admin-vue3/src/views/pressure2/acceptorder/pipeIndex.vue
  7. 13 3
      yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/AuditCheckRecord.vue
  8. 157 13
      yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/components/StatusOperationPanel.vue
  9. 19 2
      yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/recordCheck.vue
  10. 1 0
      yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/taskDetail.vue
  11. 1 1
      yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/components/BoilerTaskOrderDetailViewDialog.vue
  12. 1 1
      yudao-ui-admin-vue3/src/views/pressure2/boilertaskorder/detail.vue
  13. 0 3
      yudao-ui-admin-vue3/src/views/pressure2/equipboilerscheduling/components/BoilerPlanScheduleDialog.vue
  14. 1 1
      yudao-ui-admin-vue3/src/views/pressure2/orderConfirm/boilerDetail.vue
  15. 1 1
      yudao-ui-admin-vue3/src/views/pressure2/orderConfirm/pipeDetail.vue
  16. 140 13
      yudao-ui-admin-vue3/src/views/pressure2/pipechecker/components/StatusOperationPanel.vue
  17. 0 2
      yudao-ui-admin-vue3/src/views/pressure2/pipescheduling/components/PipePlanScheduleDialog.vue
  18. 2 3
      yudao-ui-admin-vue3/src/views/pressure2/pipescheduling/components/PipePlanScheduleEquipDialog.vue
  19. 16 4
      yudao-ui-admin-vue3/src/views/pressure2/pipescheduling/index.vue
  20. 1 1
      yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/components/PipeTaskOrderDetailViewDialog.vue
  21. 1 1
      yudao-ui-admin-vue3/src/views/pressure2/pipetaskorder/detail.vue
  22. 2 3
      yudao-ui-admin-vue3/src/views/pressure2/planNew/components/PlanScheduleEquipBoilerDialog.vue
  23. 2 3
      yudao-ui-admin-vue3/src/views/pressure2/planNew/components/PlanScheduleEquipPipeDialog.vue
  24. 29 1
      yudao-ui-admin-vue3/src/views/pressure2/reportArchivingBoiler/detail.vue
  25. 1 0
      yudao-ui-admin-vue3/src/views/pressure2/reportArchivingBoiler/index.api.ts
  26. 29 35
      yudao-ui-admin-vue3/src/views/pressure2/reportArchivingPipe/detail.vue
  27. 1 0
      yudao-ui-admin-vue3/src/views/pressure2/reportArchivingPipe/index.api.ts

+ 2 - 2
yudao-ui-admin-vue3/src/views/pressure/acceptorder/detail.vue

@@ -291,7 +291,7 @@
             <!-- 收费形式 feeType -->
             <el-form-item label="收费形式" prop="feeType">
               <el-radio-group v-model="formData.feeType">
-                <el-radio v-for="(item, key) in PressureFeeTypeMap" :key="key" :value="key" :label="item" :disabled="key == PressureFeeType.CONTRACT_DEDUCT"/>
+                <el-radio label="100">非合同收费</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -415,7 +415,7 @@
             </el-form-item>
             <el-form-item label="收费类型" prop="feeType">
               <el-select v-model="formData.feeType" class="!w-full">
-                <el-option v-for="(item, key) in PressureFeeTypeMap" :key="key" :label="item" :value="key" />
+                <el-option label="非合同收费" :value="100" />
               </el-select>
             </el-form-item>
             <el-form-item label="实收金额">

+ 1 - 4
yudao-ui-admin-vue3/src/views/pressure/acceptorder/index.vue

@@ -260,10 +260,7 @@ import { PressureEquipMainTypeMap, allCheckTypeMap } from '@/utils/constants'
       width: 120,
       search: {
         type: 'select',
-        options: Object.entries(feeTypeMap).map(([value, label]) => ({
-          label,
-          value: parseInt(value)  // 确保值是数字类型
-        }))
+        options: [{ label: '非合同收费', value: 100 }]
       },
       render: (row, value) => {return !value ? '-' : feeTypeMap[value]}
     },

+ 2 - 2
yudao-ui-admin-vue3/src/views/pressure2/acceptorder/boilerDetail.vue

@@ -282,7 +282,7 @@
             <!-- 收费形式 feeType -->
             <el-form-item label="收费形式" prop="feeType">
               <el-radio-group v-model="formData.feeType">
-                <el-radio v-for="(item, key) in PressureFeeTypeMap" :key="key" :value="key" :label="item"/>
+                <el-radio label="100">非合同收费</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -399,7 +399,7 @@
             </el-form-item>
             <el-form-item label="收费类型" prop="feeType">
               <el-select v-model="formData.feeType" class="!w-full">
-                <el-option v-for="(item, key) in PressureFeeTypeMap" :key="key" :label="item" :value="key" />
+                <el-option label="非合同收费" :value="100" />
               </el-select>
             </el-form-item>
             <el-form-item label="实收金额">

+ 1 - 4
yudao-ui-admin-vue3/src/views/pressure2/acceptorder/index.vue

@@ -230,10 +230,7 @@
       width: 120,
       search: {
         type: 'select',
-        options: Object.entries(feeTypeMap).map(([value, label]) => ({
-          label,
-          value: parseInt(value)  // 确保值是数字类型
-        }))
+        options: [{ label: '非合同收费', value: 100 }]
       },
       render: (row, value) => {return !value ? '-' : feeTypeMap[value]}
     },

+ 1 - 1
yudao-ui-admin-vue3/src/views/pressure2/acceptorder/pipeDetail.vue

@@ -282,7 +282,7 @@
             <!-- 收费形式 feeType -->
             <el-form-item label="收费形式" prop="feeType">
               <el-radio-group v-model="formData.feeType">
-                <el-radio v-for="(item, key) in PressureFeeTypeMap" :key="key" :value="key" :label="item"/>
+                <el-radio label="100">非合同收费</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>

+ 1 - 4
yudao-ui-admin-vue3/src/views/pressure2/acceptorder/pipeIndex.vue

@@ -229,10 +229,7 @@
       width: 120,
       search: {
         type: 'select',
-        options: Object.entries(feeTypeMap).map(([value, label]) => ({
-          label,
-          value: parseInt(value)  // 确保值是数字类型
-        }))
+        options: [{ label: '非合同收费', value: 100 }]
       },
       render: (row, value) => {return !value ? '-' : feeTypeMap[value]}
     },

+ 13 - 3
yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/AuditCheckRecord.vue

@@ -9,7 +9,7 @@
           :key="report.reportId"
           @click="() => handleSelectedReport(report)"
           plain
-        >{{ report.reportName }}</el-button>
+        >{{ getReportDisplayName(report) }}</el-button>
       </div>
       <div class="right">
         <template v-if="pageType === 'check'">
@@ -78,7 +78,7 @@
                     multiple
                     clearable
                   >
-                    <el-option v-for="item in getRecheckList" :key="item.reportId" :value="item.reportId" :label="item.reportName"/>
+                    <el-option v-for="item in getRecheckList" :key="item.reportId" :value="item.reportId" :label="getReportDisplayName(item)"/>
                   </el-select>
                 </el-form-item>
                 <el-form-item label="退回阶段" v-if="showRollbackStage">
@@ -148,7 +148,7 @@
           multiple
           clearable
         >
-          <el-option v-for="item in getRecheckList" :key="item.reportId" :value="item.reportId" :label="item.reportName"/>
+          <el-option v-for="item in getRecheckList" :key="item.reportId" :value="item.reportId" :label="getReportDisplayName(item)"/>
         </el-select>
         <template #footer>
           <el-button type="primary" @click="handlePassConfirm">确 定</el-button>
@@ -230,6 +230,16 @@ import ReportListUploadModal from '@/views/pressure2/boilerchecker/components/re
     'majorIssueCluesNotice': '重大线索通知审核'
   }
   const getRouteName = computed(() => route.name)
+  // 获取检验项目显示名称(电站锅炉内检有部件的项目,名称前加"部件名-")
+  const getReportDisplayName = (report: any): string => {
+    if (!report) return ''
+    const partName = report.partName
+    const reportName = report.reportName || ''
+    if (partName) {
+      return `${partName}-${reportName}`
+    }
+    return reportName
+  }
   // 校核人选择对话框状态
   const isShowAuditDialog = ref(false)
 

+ 157 - 13
yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/components/StatusOperationPanel.vue

@@ -390,24 +390,51 @@
       <!-- 批量提交校核 -->
       <Dialog
         v-model="showBatchSubmitToRecheckDialog"
-        width="400"
+        width="600"
         title="批量提交校核"
       >
         <el-form ref="batchRecheckFormRef" :model="batchRecheckForm" :rules="batchRecheckFormRules" label-width="80px">
           <el-form-item label="提交记录" prop="reportIds">
-            <el-select
-              v-model="batchRecheckForm.reportIds"
-              multiple
-              clearable
-              placeholder="请选择报告"
-            >
-              <el-option
-                v-for="item in getCanSubmitRecheckReport"
-                :key="item.id"
-                :value="item.id"
-                :label="item.reportName"
+            <div class="batch-recheck-report-list">
+              <!-- 查询框 -->
+              <el-input
+                v-model="batchRecheckSearchKey"
+                placeholder="请输入检验项目名称查询"
+                clearable
+                size="small"
+                class="batch-recheck-search"
               />
-            </el-select>
+              <!-- 全选 + 当前数量 -->
+              <div class="batch-recheck-header">
+                <el-checkbox
+                  :model-value="batchRecheckCheckAll"
+                  :indeterminate="batchRecheckIndeterminate"
+                  @change="handleBatchRecheckCheckAll"
+                >
+                  全选
+                </el-checkbox>
+                <span class="batch-recheck-count">
+                  已选 {{ batchRecheckForm.reportIds.length }} / {{ getCanSubmitRecheckReport.length }} 项
+                </span>
+              </div>
+              <!-- 检验项目勾选列表 -->
+              <div class="batch-recheck-checkbox-group">
+                <el-checkbox
+                  v-for="item in filteredBatchRecheckReports"
+                  :key="item.id"
+                  :model-value="batchRecheckForm.reportIds.includes(item.id)"
+                  @change="(val) => handleBatchRecheckItemCheck(item.id, val)"
+                  class="batch-recheck-checkbox-item"
+                >
+                  {{ getBatchRecheckReportDisplayName(item) }}
+                </el-checkbox>
+                <el-empty
+                  v-if="filteredBatchRecheckReports.length === 0"
+                  description="暂无匹配的检验项目"
+                  :image-size="60"
+                />
+              </div>
+            </div>
           </el-form-item>
           <el-form-item label="校核人" prop="recheckUser">
             <CustomLargeListSelect
@@ -878,6 +905,7 @@ interface Props {
   taskId: string
   teleportBtnRef: Ref<HTMLDivElement | null>
   isFullscreen?: boolean
+  partList?: any[]
 }
 
 interface Emits {
@@ -914,6 +942,69 @@ const batchRecheckFormRules = {
   recheckUser: [{required: true, message: '请选择校核人', trigger: 'change'}]
 }
 const batchRecheckFormRef = ref()
+
+// 批量提交校核弹窗的查询和全选逻辑
+const batchRecheckSearchKey = ref('')
+// 过滤后的可提交校核报告(根据查询关键字,同时匹配部件名)
+const filteredBatchRecheckReports = computed(() => {
+  const keyword = (batchRecheckSearchKey.value || '').trim().toLowerCase()
+  if (!keyword) return getCanSubmitRecheckReport.value
+  return getCanSubmitRecheckReport.value.filter((item: any) => {
+    const name = (item.reportName || '').toLowerCase()
+    const partName = (getPartNameById(item.itemPartId) || '').toLowerCase()
+    return name.includes(keyword) || partName.includes(keyword)
+  })
+})
+// 当前过滤列表是否全部选中
+const batchRecheckCheckAll = computed(() => {
+  const list = filteredBatchRecheckReports.value
+  if (!list.length) return false
+  return list.every((item: any) => batchRecheckForm.value.reportIds.includes(item.id))
+})
+// 当前过滤列表是否部分选中(用于 indeterminate 状态)
+const batchRecheckIndeterminate = computed(() => {
+  const list = filteredBatchRecheckReports.value
+  if (!list.length) return false
+  const checkedCount = list.filter((item: any) => batchRecheckForm.value.reportIds.includes(item.id)).length
+  return checkedCount > 0 && checkedCount < list.length
+})
+// 全选/取消全选当前过滤列表
+const handleBatchRecheckCheckAll = (val: any) => {
+  const checked = !!val
+  const list = filteredBatchRecheckReports.value
+  const listIds = list.map((item: any) => item.id)
+  if (checked) {
+    // 合并去重
+    const set = new Set([...batchRecheckForm.value.reportIds, ...listIds])
+    batchRecheckForm.value.reportIds = Array.from(set)
+  } else {
+    batchRecheckForm.value.reportIds = batchRecheckForm.value.reportIds.filter((id: any) => !listIds.includes(id))
+  }
+}
+// 单个检验项目勾选/取消勾选
+const handleBatchRecheckItemCheck = (id: string, val: any) => {
+  const checked = !!val
+  const ids = batchRecheckForm.value.reportIds
+  if (checked) {
+    if (!ids.includes(id)) ids.push(id)
+  } else {
+    batchRecheckForm.value.reportIds = ids.filter((x: string) => x !== id)
+  }
+}
+// 根据部件ID获取部件名称
+const getPartNameById = (partId: string): string => {
+  if (!partId || partId === '0') return ''
+  const part = (props.partList || []).find((item: any) => item.id === partId)
+  return part?.partName || ''
+}
+// 获取批量提交校核弹窗中检验项目的显示名称(电站锅炉内检有部件的,项目名前加"部件名-")
+const getBatchRecheckReportDisplayName = (item: any): string => {
+  const partName = getPartNameById(item.itemPartId)
+  if (partName) {
+    return `${partName}-${item.reportName || ''}`
+  }
+  return item.reportName || ''
+}
 // const isShowReportPdf = ref([PressureCheckerMyTaskStatus.REPORT_INPUT,PressureCheckerMyTaskStatus.REPORT_AUDIT,PressureCheckerMyTaskStatus.REPORT_APPROVE,PressureCheckerMyTaskStatus.REPORT_END].includes(props.selectedItem.taskStatus)
 //   && ![400,500,600,700].includes(props.selectedItem.reportType))
 const showReportPdfType = ref('record')
@@ -1093,6 +1184,7 @@ const handleSelectVerfiyer = async () => {
       }
     }
     batchRecheckForm.value.reportIds = getCanSubmitRecheckReport.value.map(x => x?.id)
+    batchRecheckSearchKey.value = ''
     showBatchSubmitToRecheckDialog.value = true
     return
   }
@@ -2689,6 +2781,58 @@ watch(() => props.isFullscreen, () => {
 </script>
 
 <style lang="scss" scoped>
+// 批量提交校核弹窗样式
+.batch-recheck-report-list {
+  width: 100%;
+
+  .batch-recheck-search {
+    margin-bottom: 8px;
+  }
+
+  .batch-recheck-header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 6px 8px;
+    margin-bottom: 6px;
+    background: #f5f7fa;
+    border-radius: 4px;
+
+    .batch-recheck-count {
+      font-size: 12px;
+      color: #909399;
+    }
+  }
+
+  .batch-recheck-checkbox-group {
+    max-height: 260px;
+    overflow-y: auto;
+    padding: 4px 8px;
+    border: 1px solid #e4e7ed;
+    border-radius: 4px;
+
+    .batch-recheck-checkbox-item {
+      display: flex;
+      align-items: center;
+      width: 100%;
+      margin-right: 0;
+      padding: 6px 4px;
+      border-bottom: 1px dashed #ebeef5;
+
+      &:last-child {
+        border-bottom: none;
+      }
+
+      :deep(.el-checkbox__label) {
+        flex: 1;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+    }
+  }
+}
+
 .capsule-tabs {
   display: inline-flex;
   align-items: center;

+ 19 - 2
yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/recordCheck.vue

@@ -203,10 +203,10 @@
       <el-table-column label="检验项目" align="center" prop="reportName" min-width="150px">
         <template #default="{row}">
           <template v-if="!row.recheckList || !row.recheckList?.length">
-            <el-row style="justify-content: center;">{{ row.reportName }}</el-row>
+            <el-row style="justify-content: center;">{{ getReportDisplayName(row, row.reportId, row.reportName) }}</el-row>
           </template>
           <template v-else>
-            <el-row style="justify-content: center;" v-for="item in row.recheckList" :key="JSON.stringify(item)">{{ item.reportName }}</el-row>
+            <el-row style="justify-content: center;" v-for="item in row.recheckList" :key="JSON.stringify(item)">{{ getReportDisplayName(row, item.reportId, item.reportName) }}</el-row>
           </template>
         </template>
       </el-table-column>
@@ -655,6 +655,23 @@ const getReportTypeIcon = (reportType) => {
   }
 }
 
+// 获取检验项目显示名称(电站锅炉内检有部件的项目,名称前加"部件名-")
+const getReportDisplayName = (row: any, reportId: string, reportName: string): string => {
+  // 优先使用子报告自身的 partName,其次使用 row 的 partName
+  let partName = ''
+  if (row?.recheckList && row.recheckList.length) {
+    const item = row.recheckList.find((r: any) => r.reportId === reportId)
+    partName = item?.partName || ''
+  }
+  if (!partName) {
+    partName = row?.partName || ''
+  }
+  if (partName) {
+    return `${partName}-${reportName || ''}`
+  }
+  return reportName || ''
+}
+
 watch(() => route.path, async () => {
   if (route.path === '/gljy/record-check/boiler') {
     await getList()

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

@@ -79,6 +79,7 @@
           :task-info="taskInfo"
           :task-order-item="taskOrderItem"
           :report-list="reportList"
+          :part-list="partList"
           :history-list="historyList"
           :taskId="taskId"
           :teleportBtnRef="teleportBtnRef"

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

@@ -153,7 +153,7 @@
             <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 label="100">非合同收费</el-radio>
                 </el-radio-group>
               </el-form-item>
             </el-col>

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

@@ -195,7 +195,7 @@
             <!-- 收费形式 feeType -->
             <el-form-item label="收费形式" prop="feeType" label-width="120px">
               <el-radio-group v-model="formData.feeType">
-                <el-radio v-for="(item, key) in PressureFeeTypeMap" :key="key" :value="key" :label="item"/>
+                <el-radio label="100">非合同收费</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>

+ 0 - 3
yudao-ui-admin-vue3/src/views/pressure2/equipboilerscheduling/components/BoilerPlanScheduleDialog.vue

@@ -72,7 +72,6 @@
                 <el-select v-model="formData.inChargeType" placeholder="请选择收费形式"
                            class="!w-120px">
                   <el-option label="非合同收费" value="1"/>
-                  <el-option label="合同收费" value="2"/>
                 </el-select>
                 <span class="text-gray-600">是否免征:</span>
                 <el-select v-model="formData.inIsExempt" placeholder="请选择是否免征"
@@ -129,7 +128,6 @@
                 <el-select v-model="formData.outChargeType" placeholder="请选择收费形式"
                            class="!w-120px">
                   <el-option label="非合同收费" value="1"/>
-                  <el-option label="合同收费" value="2"/>
                 </el-select>
                 <span class="text-gray-600">是否免征:</span>
                 <el-select v-model="formData.outIsExempt" placeholder="请选择是否免征"
@@ -187,7 +185,6 @@
                 <el-select v-model="formData.preChargeType" placeholder="请选择收费形式"
                            class="!w-120px">
                   <el-option label="非合同收费" value="1"/>
-                  <el-option label="合同收费" value="2"/>
                 </el-select>
                 <span class="text-gray-600">是否免征:</span>
                 <el-select v-model="formData.preIsExempt" placeholder="请选择是否免征"

+ 1 - 1
yudao-ui-admin-vue3/src/views/pressure2/orderConfirm/boilerDetail.vue

@@ -328,7 +328,7 @@
             <!-- 收费形式 feeType -->
             <el-form-item label="收费形式" prop="feeType">
               <el-radio-group v-model="formData.feeType">
-                <el-radio v-for="(item, key) in PressureFeeTypeMap" :key="key" :value="key" :label="item"/>
+                <el-radio label="100">非合同收费</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>

+ 1 - 1
yudao-ui-admin-vue3/src/views/pressure2/orderConfirm/pipeDetail.vue

@@ -569,7 +569,7 @@
             <!-- 收费形式 feeType -->
             <el-form-item label="收费形式" prop="feeType">
               <el-radio-group v-model="formData.feeType">
-                <el-radio v-for="(item, key) in PressureFeeTypeMap" :key="key" :value="key" :label="item"/>
+                <el-radio label="100">非合同收费</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>

+ 140 - 13
yudao-ui-admin-vue3/src/views/pressure2/pipechecker/components/StatusOperationPanel.vue

@@ -390,24 +390,51 @@
       <!-- 批量提交校核 -->
       <Dialog
         v-model="showBatchSubmitToRecheckDialog"
-        width="400"
+        width="600"
         title="批量提交校核"
       >
         <el-form ref="batchRecheckFormRef" :model="batchRecheckForm" :rules="batchRecheckFormRules" label-width="80px">
           <el-form-item label="提交记录" prop="reportIds">
-            <el-select
-              v-model="batchRecheckForm.reportIds"
-              multiple
-              clearable
-              placeholder="请选择报告"
-            >
-              <el-option
-                v-for="item in getCanSubmitRecheckReport"
-                :key="item.id"
-                :value="item.id"
-                :label="item.reportName"
+            <div class="batch-recheck-report-list">
+              <!-- 查询框 -->
+              <el-input
+                v-model="batchRecheckSearchKey"
+                placeholder="请输入检验项目名称查询"
+                clearable
+                size="small"
+                class="batch-recheck-search"
               />
-            </el-select>
+              <!-- 全选 + 当前数量 -->
+              <div class="batch-recheck-header">
+                <el-checkbox
+                  :model-value="batchRecheckCheckAll"
+                  :indeterminate="batchRecheckIndeterminate"
+                  @change="handleBatchRecheckCheckAll"
+                >
+                  全选
+                </el-checkbox>
+                <span class="batch-recheck-count">
+                  已选 {{ batchRecheckForm.reportIds.length }} / {{ getCanSubmitRecheckReport.length }} 项
+                </span>
+              </div>
+              <!-- 检验项目勾选列表 -->
+              <div class="batch-recheck-checkbox-group">
+                <el-checkbox
+                  v-for="item in filteredBatchRecheckReports"
+                  :key="item.id"
+                  :model-value="batchRecheckForm.reportIds.includes(item.id)"
+                  @change="(val) => handleBatchRecheckItemCheck(item.id, val)"
+                  class="batch-recheck-checkbox-item"
+                >
+                  {{ item.reportName }}
+                </el-checkbox>
+                <el-empty
+                  v-if="filteredBatchRecheckReports.length === 0"
+                  description="暂无匹配的检验项目"
+                  :image-size="60"
+                />
+              </div>
+            </div>
           </el-form-item>
           <el-form-item label="校核人" prop="recheckUser">
             <CustomLargeListSelect
@@ -911,6 +938,53 @@ const batchRecheckFormRules = {
   recheckUser: [{required: true, message: '请选择校核人', trigger: 'change'}]
 }
 
+// 批量提交校核弹窗的查询和全选逻辑
+const batchRecheckSearchKey = ref('')
+// 过滤后的可提交校核报告(根据查询关键字)
+const filteredBatchRecheckReports = computed(() => {
+  const keyword = (batchRecheckSearchKey.value || '').trim().toLowerCase()
+  if (!keyword) return getCanSubmitRecheckReport.value
+  return getCanSubmitRecheckReport.value.filter((item: any) =>
+    (item.reportName || '').toLowerCase().includes(keyword)
+  )
+})
+// 当前过滤列表是否全部选中
+const batchRecheckCheckAll = computed(() => {
+  const list = filteredBatchRecheckReports.value
+  if (!list.length) return false
+  return list.every((item: any) => batchRecheckForm.value.reportIds.includes(item.id))
+})
+// 当前过滤列表是否部分选中(用于 indeterminate 状态)
+const batchRecheckIndeterminate = computed(() => {
+  const list = filteredBatchRecheckReports.value
+  if (!list.length) return false
+  const checkedCount = list.filter((item: any) => batchRecheckForm.value.reportIds.includes(item.id)).length
+  return checkedCount > 0 && checkedCount < list.length
+})
+// 全选/取消全选当前过滤列表
+const handleBatchRecheckCheckAll = (val: any) => {
+  const checked = !!val
+  const list = filteredBatchRecheckReports.value
+  const listIds = list.map((item: any) => item.id)
+  if (checked) {
+    // 合并去重
+    const set = new Set([...batchRecheckForm.value.reportIds, ...listIds])
+    batchRecheckForm.value.reportIds = Array.from(set)
+  } else {
+    batchRecheckForm.value.reportIds = batchRecheckForm.value.reportIds.filter((id: any) => !listIds.includes(id))
+  }
+}
+// 单个检验项目勾选/取消勾选
+const handleBatchRecheckItemCheck = (id: string, val: any) => {
+  const checked = !!val
+  const ids = batchRecheckForm.value.reportIds
+  if (checked) {
+    if (!ids.includes(id)) ids.push(id)
+  } else {
+    batchRecheckForm.value.reportIds = ids.filter((x: string) => x !== id)
+  }
+}
+
 // 格式化记录结果状态显示
 const formatRecordResult = (record) => {
   const resultMap = {
@@ -1077,6 +1151,7 @@ const handleSelectVerfiyer = async () => {
       }
     }
     batchRecheckForm.value.reportIds = getCanSubmitRecheckReport.value.map(x => x?.id)
+    batchRecheckSearchKey.value = ''
     showBatchSubmitToRecheckDialog.value = true
     return
   }
@@ -2579,6 +2654,58 @@ watch(() => props.isFullscreen, () => {
 </script>
 
 <style lang="scss" scoped>
+// 批量提交校核弹窗样式
+.batch-recheck-report-list {
+  width: 100%;
+
+  .batch-recheck-search {
+    margin-bottom: 8px;
+  }
+
+  .batch-recheck-header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 6px 8px;
+    margin-bottom: 6px;
+    background: #f5f7fa;
+    border-radius: 4px;
+
+    .batch-recheck-count {
+      font-size: 12px;
+      color: #909399;
+    }
+  }
+
+  .batch-recheck-checkbox-group {
+    max-height: 260px;
+    overflow-y: auto;
+    padding: 4px 8px;
+    border: 1px solid #e4e7ed;
+    border-radius: 4px;
+
+    .batch-recheck-checkbox-item {
+      display: flex;
+      align-items: center;
+      width: 100%;
+      margin-right: 0;
+      padding: 6px 4px;
+      border-bottom: 1px dashed #ebeef5;
+
+      &:last-child {
+        border-bottom: none;
+      }
+
+      :deep(.el-checkbox__label) {
+        flex: 1;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+    }
+  }
+}
+
 .capsule-tabs {
   display: inline-flex;
   align-items: center;

+ 0 - 2
yudao-ui-admin-vue3/src/views/pressure2/pipescheduling/components/PipePlanScheduleDialog.vue

@@ -69,7 +69,6 @@
                 <el-select v-model="formData.legalChargeType" placeholder="请选择收费形式"
                            class="!w-120px">
                   <el-option label="非合同收费" value="1"/>
-                  <el-option label="合同收费" value="2"/>
                 </el-select>
                 <span class="text-gray-600">是否免征:</span>
                 <el-select v-model="formData.legalIsExempt" placeholder="请选择是否免征"
@@ -124,7 +123,6 @@
                 <el-select v-model="formData.yearChargeType" placeholder="请选择收费形式"
                            class="!w-120px">
                   <el-option label="非合同收费" value="1"/>
-                  <el-option label="合同收费" value="2"/>
                 </el-select>
                 <span class="text-gray-600">应收法定金额: {{ formData.yearShouldAmount }}</span>
                 <span class="text-gray-600">服务收费金额: {{ formData.yearServiceAmount }}</span>

+ 2 - 3
yudao-ui-admin-vue3/src/views/pressure2/pipescheduling/components/PipePlanScheduleEquipDialog.vue

@@ -159,7 +159,6 @@
             <el-form-item label="收费形式" prop="feeType">
               <el-radio-group v-model="formData.feeType">
                 <el-radio label="100">非合同收费</el-radio>
-                <el-radio label="200">合同收费</el-radio>
               </el-radio-group>
             </el-form-item>
 
@@ -368,7 +367,7 @@ const formData = ref({
   // 收费性质
   feeNature: '',
   // 收费形式
-  feeType: '',
+  feeType: '100',
   // 收费总金额
   actualAmount: 0,
 })
@@ -699,7 +698,7 @@ const openDialogVisible = (type = '') => {
       annualCheckTeamList: [],
       feeNature:  '',
       actualAmount:  0,
-      feeType:  ''
+      feeType:  '100'
     }
   })
 }

+ 16 - 4
yudao-ui-admin-vue3/src/views/pressure2/pipescheduling/index.vue

@@ -511,6 +511,20 @@ const containerTypeOptions = getStrDictOptions(DICT_TYPE.PIPE_TYPE)
 const pipeLevelOptions = getStrDictOptions(DICT_TYPE.PRESSURE2_PIPE_LEVEL)
 const selectedTypeList = ref<StringDictDataType[]>([]) // 选中的锅炉归类
 
+/** 应用默认管道过滤:长输管道、公用管道GB1 默认不显示,其余默认显示 */
+const applyDefaultPipeFilter = () => {
+  // 管道归类:排除长输管道
+  const defaultTypes = containerTypeOptions.filter((dict) => !dict.label.includes('长输'))
+  queryParams.value.typeList = defaultTypes.map((dict) => dict.value)
+  selectedTypeList.value = defaultTypes
+  // 管道级别:排除 GA 开头(长输)和 GB1
+  queryParams.value.pipeClassList = pipeLevelOptions
+    .filter((opt) => !opt.value.startsWith('GA') && opt.value !== 'GB1')
+    .map((opt) => opt.value)
+}
+// 初始化默认过滤
+applyDefaultPipeFilter()
+
 /**
  * 管道类型 -> 级别前缀映射
  * GC 开头:工业管道;GB 开头:公用管道;GA 开头:长输管道
@@ -593,10 +607,8 @@ const resetQuery = () => {
   // 重置页码
   queryParams.value.pageNo = 1
 
-  // 清空选中的容器归类对象
-  selectedTypeList.value = []
-  // 重置管道级别选项
-  queryParams.value.pipeClassList = []
+  // 恢复默认管道过滤(长输管道、公用管道GB1 默认不显示)
+  applyDefaultPipeFilter()
 
   // 清除表格排序
   mainTableRef.value?.clearSort()

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

@@ -153,7 +153,7 @@
             <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 label="100">非合同收费</el-radio>
                 </el-radio-group>
               </el-form-item>
             </el-col>

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

@@ -195,7 +195,7 @@
             <!-- 收费形式 feeType -->
             <el-form-item label="收费形式" prop="feeType" label-width="120px">
               <el-radio-group v-model="formData.feeType">
-                <el-radio v-for="(item, key) in PressureFeeTypeMap" :key="key" :value="key" :label="item"/>
+                <el-radio label="100">非合同收费</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>

+ 2 - 3
yudao-ui-admin-vue3/src/views/pressure2/planNew/components/PlanScheduleEquipBoilerDialog.vue

@@ -200,7 +200,6 @@
             <el-form-item label="收费形式" prop="feeType">
               <el-radio-group v-model="formData.feeType">
                 <el-radio label="100">非合同收费</el-radio>
-                <el-radio label="200">合同收费</el-radio>
               </el-radio-group>
             </el-form-item>
 
@@ -393,7 +392,7 @@ const formData = ref({
   // 收费性质
   feeNature: '',
   // 收费形式
-  feeType: '',
+  feeType: '100',
   // 收费总金额
   actualAmount: 0,
 })
@@ -762,7 +761,7 @@ const openDialogVisible = (type = '') => {
       pressureIsOrderConfirm: true,
       feeNature:  '',
       actualAmount:  0,
-      feeType:  ''
+      feeType:  '100'
     }
   })
 }

+ 2 - 3
yudao-ui-admin-vue3/src/views/pressure2/planNew/components/PlanScheduleEquipPipeDialog.vue

@@ -141,7 +141,6 @@
             <el-form-item label="收费形式" prop="feeType">
               <el-radio-group v-model="formData.feeType">
                 <el-radio label="100">非合同收费</el-radio>
-                <el-radio label="200">合同收费</el-radio>
               </el-radio-group>
             </el-form-item>
 
@@ -327,7 +326,7 @@ const formData = ref({
   // 收费性质
   feeNature: '',
   // 收费形式
-  feeType: '',
+  feeType: '100',
   // 收费总金额
   actualAmount: 0,
 })
@@ -584,7 +583,7 @@ const openDialogVisible = (type = '') => {
     annualIsOrderConfirm:true,
     feeNature:  '',
     actualAmount:  0,
-    feeType:  ''
+    feeType:  '100'
   }
 
   // 在重置表单后清除校验状态

+ 29 - 1
yudao-ui-admin-vue3/src/views/pressure2/reportArchivingBoiler/detail.vue

@@ -115,6 +115,26 @@ const fileAttachTypeMap: Record<string, string> = {
   attachment: '文档'
 }
 const detailTableSchema = reactive<TableItem[]>([
+  {
+    title: '完整记录、报告',
+    columns: [
+      { label: '序号', fieldProps: { type: 'index', align: 'center', width: 55 } },
+      { label: '报告编号', prop: 'reportNo', fieldProps: { align: 'center', minWidth: 150 } },
+      { label: '文件名称', prop: 'reportType', fieldProps: { align: 'center', minWidth: 120 },
+        render: (row) => row.reportType === 100 ? '记录' : '报告' },
+      { label: '版本号', prop: 'reportVersion', fieldProps: { align: 'center', minWidth: 100 } },
+      { label: '生效时间', prop: 'createTime', fieldProps: { align: 'center', minWidth: 160 },
+        render: (_row, value) => formatDate(value) || '-' },
+      { label: '操作', prop: 'operation', fieldProps: { align: 'center', minWidth: 150 },
+        render: (row) => (
+          <>
+            <el-button type="primary" link onClick={() => handleViewPdfByUrl(row.issueUrl)}>预览</el-button>
+            <el-button type="primary" link onClick={() => handleAttachmentDownload(row.issueUrl)}>下载</el-button>
+          </>
+        ) }
+    ],
+    dataField: 'issueReportVersionList'
+  },
   {
     title: '任务单相关文件',
     columns: [
@@ -374,7 +394,7 @@ const detailTableSchema = reactive<TableItem[]>([
         ) }
     ],
     dataField: 'fileAttachList'
-  }
+  },
 ])
 
 // 流转记录/历史版本弹窗
@@ -710,6 +730,14 @@ const getPdfSource = async (type: number, data: any,fileName: string) => {
 // PDF预览相关
 const pdfPreviewVisible = ref(false)
 const currentPdfBlob = ref<Blob | null>(null)
+const handleViewPdfByUrl = async (url) => {
+
+  if (url) {
+    docPdfUrls.value = ([url] || []).map((url) => buildFileUrl(url))
+    showDocPdfDialog.value = true
+  }
+
+}
 const handleViewPdf = async (row) => {
 
   if (row.filePdf) {

+ 1 - 0
yudao-ui-admin-vue3/src/views/pressure2/reportArchivingBoiler/index.api.ts

@@ -22,4 +22,5 @@ export interface DetailData {
   imageList?: Recordable[]
   videoList?: Recordable[]
   attachmentList?: Recordable[]
+  issueReportVersionList?: Recordable[]
 }

+ 29 - 35
yudao-ui-admin-vue3/src/views/pressure2/reportArchivingPipe/detail.vue

@@ -115,6 +115,26 @@ const fileAttachTypeMap: Record<string, string> = {
   attachment: '文档'
 }
 const detailTableSchema = reactive<TableItem[]>([
+  {
+    title: '完整记录、报告',
+    columns: [
+      { label: '序号', fieldProps: { type: 'index', align: 'center', width: 55 } },
+      { label: '报告编号', prop: 'reportNo', fieldProps: { align: 'center', minWidth: 150 } },
+      { label: '文件名称', prop: 'reportType', fieldProps: { align: 'center', minWidth: 120 },
+        render: (row) => row.reportType === 100 ? '记录' : '报告' },
+      { label: '版本号', prop: 'reportVersion', fieldProps: { align: 'center', minWidth: 100 } },
+      { label: '生效时间', prop: 'createTime', fieldProps: { align: 'center', minWidth: 160 },
+        render: (_row, value) => formatDate(value) || '-' },
+      { label: '操作', prop: 'operation', fieldProps: { align: 'center', minWidth: 150 },
+        render: (row) => (
+          <>
+            <el-button type="primary" link onClick={() => handleViewPdfByUrl(row.issueUrl)}>预览</el-button>
+            <el-button type="primary" link onClick={() => handleAttachmentDownload(row.issueUrl)}>下载</el-button>
+          </>
+        ) }
+    ],
+    dataField: 'issueReportVersionList'
+  },
   {
     title: '任务单相关文件',
     columns: [
@@ -374,7 +394,7 @@ const detailTableSchema = reactive<TableItem[]>([
         ) }
     ],
     dataField: 'fileAttachList'
-  }
+  },
 ])
 
 // 流转记录/历史版本弹窗
@@ -710,6 +730,14 @@ const getPdfSource = async (type: number, data: any, fileName: string) => {
 // PDF预览相关
 const pdfPreviewVisible = ref(false)
 const currentPdfBlob = ref<Blob | null>(null)
+const handleViewPdfByUrl = async (url) => {
+
+  if (url) {
+    docPdfUrls.value = ([url] || []).map((url) => buildFileUrl(url))
+    showDocPdfDialog.value = true
+  }
+
+}
 const handleViewPdf = async (row) => {
 
   if (row.filePdf) {
@@ -717,40 +745,6 @@ const handleViewPdf = async (row) => {
     showDocPdfDialog.value = true
     return
   }
-  //
-  // let data: any[] = []
-  // data.push({
-  //   taskStatus: row.taskStatus,
-  //   resultTemplateId: '',
-  //   templateId: row.templateId,
-  //   reportTemplateId: row.reportTemplateId,
-  //   reportUrl: '',
-  //   id: row.reportId,
-  // })
-  //
-  // const loadingInstance = ElLoading.service({
-  //   fullscreen: true,
-  //   text: '正在生成...'
-  // })
-  //
-  // try {
-  //   // 调用 API 获取 ZIP blob
-  //   const pdfBlob = await PipeInputApi.handlePrint(data)
-  //
-  //   if (pdfBlob) {
-  //
-  //     currentPdfBlob.value = pdfBlob
-  //     pdfPreviewVisible.value = true
-  //
-  //   } else {
-  //     ElMessage.error('获取文件失败')
-  //   }
-  // } catch (error) {
-  //   console.error('预览失败:', error)
-  //   ElMessage.error('预览失败')
-  // } finally {
-  //   loadingInstance.close()
-  // }
 
 }
 

+ 1 - 0
yudao-ui-admin-vue3/src/views/pressure2/reportArchivingPipe/index.api.ts

@@ -22,4 +22,5 @@ export interface DetailData {
   imageList?: Recordable[]
   videoList?: Recordable[]
   attachmentList?: Recordable[]
+  issueReportVersionList?: Recordable[]
 }