Browse Source

1、设备档案功能,需要支持修改设备档案,并同步至报告与设备基础库中 2、取消默认上一次检验记录的功能 3、记录校核人选择范围需限定为设备任务单中的检测员

xy 16 hours ago
parent
commit
5c455aeb98

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

@@ -504,6 +504,16 @@ export const BoilerTaskOrderApi = {
     return await request.put({ url: `/pressure2/boiler-task-order/syncAllReportData`, data })
   },
 
+  // 同步设备下所有报表数据
+  syncAllReportDataByOrderItemId: async (data: any) => {
+    return await request.put({ url: `/pressure2/boiler-task-order/syncAllReportDataByOrderItemId`, data })
+  },
+
+  //获取校核人清单
+  getRecheckUserList: async (params) => {
+    return await request.get({ url: '/pressure2/boiler-task-order/recheckUser/page', params})
+  },
+
   /**
    * 查询检验通知书列表
    * @param params

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

@@ -528,6 +528,11 @@ export const PipeTaskOrderApi = {
     return await request.put({ url: `/pressure2/pipe-task-order/syncAllReportData`, data })
   },
 
+  // 同步任务单下所有报表数据
+  syncAllReportDataByOrderId: async (data: any) => {
+    return await request.put({ url: `/pressure2/pipe-task-order/syncAllReportDataByOrderId`, data })
+  },
+
   // 通过orderID查询管道设备详情
   getEquipsByOrderId: async (orderId: string) => {
     return await request.get({ url: `/pressure2/pipe-task-order/getEquipsByOrderId?orderId=` + orderId })

+ 11 - 6
yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/components/StatusOperationPanel.vue

@@ -333,7 +333,7 @@
       <AuditUserDialog
         v-if="isShowApprovalDialog"
         v-model="isShowApprovalDialog"
-        :apiFn="getUserList"
+        :apiFn="getRecheckUserList"
         title="请选择审批人"
         selectedAlertText="已选择审批人"
         width="700px"
@@ -371,7 +371,7 @@
       >
         <CustomLargeListSelect
           v-model="form.recheckUser"
-          :fetchFunc="getUserList"
+          :fetchFunc="getRecheckUserList"
           label-key="nickname"
           value-key="id"
           searchKeyProp="nickName"
@@ -407,7 +407,7 @@
           <el-form-item label="校核人" prop="recheckUser">
             <CustomLargeListSelect
               v-model="batchRecheckForm.recheckUser"
-              :fetchFunc="getUserList"
+              :fetchFunc="getRecheckUserList"
               label-key="nickname"
               value-key="id"
               searchKeyProp="nickName"
@@ -431,7 +431,7 @@
       <!-- <AuditUserDialog
         v-if="isShowAuditDialog"
         v-model="isShowAuditDialog"
-        :apiFn="getUserList"
+        :apiFn="getRecheckUserList"
         title="请选择校核人"
         selectedAlertText="已选择校核人"
         width="700px"
@@ -468,7 +468,7 @@
       <AuditUserDialog
         v-if="isShowReportAuditDialog"
         v-model="isShowReportAuditDialog"
-        :apiFn="getUserList"
+        :apiFn="getRecheckUserList"
         title="请选择审核人"
         selectedAlertText="已选择审核人"
         width="700px"
@@ -707,7 +707,6 @@ import InlineEditCheckRecord from './InlineEditCheckRecord.vue'
 import InlinePdfViewer from './InlinePdfViewer.vue'
 import InlineInspectionResultInput from './InlineInspectionResultInput.vue'
 import InlineReportEdit from './InlineReportEdit.vue'
-import { getUserList } from '@/api/common/user'
 import { BoilerTaskOrderApi } from '@/api/pressure2/boilertaskorder'
 import { defineAsyncComponent } from 'vue'
 import UserSelectForm from '@/components/UserSelectForm/index.vue'
@@ -726,6 +725,7 @@ import {DynamicTbInsApi} from "@/api/pressure2/dynamictbins";
 import {SpreadViewer} from "@/components/DynamicReport";
 import {InitParams} from "@/components/DynamicReport/SpreadInterface";
 import { cloneDeep, debounce } from 'lodash-es'
+import {PipeTaskOrderApi} from "@/api/pressure2/pipetaskorder";
 
 interface Props {
   selectedItem: ReportItemVO | null
@@ -1399,6 +1399,11 @@ const handleSubmitAudit = async () => {
   }
 }
 
+const getRecheckUserList = async (params) => {
+  params.orderId = props.taskInfo.id
+  return await BoilerTaskOrderApi.getRecheckUserList(params)
+}
+
 // 上传主报告文件流
 const handleUploadAPIReportPreviewBlob = async (submitApprovalFn) => {
   if(!props.selectedItem || props.selectedItem.taskStatus !== PressureTaskOrderTaskStatus.REPORT_INPUT) return 

+ 44 - 4
yudao-ui-admin-vue3/src/views/pressure2/boilerchecker/taskDetail.vue

@@ -123,7 +123,7 @@
 </template>
 
 <script setup lang="ts">
-import {onMounted, ref} from 'vue'
+import {onMounted, ref, onUnmounted} from 'vue'
 import { useRoute } from 'vue-router'
 import {ElLoading, ElMessage, ElMessageBox} from 'element-plus'
 import {
@@ -143,7 +143,7 @@ import AddOrEditCheckPartForEquipment from '@/views/pressure2/boilertaskorder/co
 import { PressureTaskOrderTaskStatus } from '@/utils/constants'
 import { useTagsViewStore } from '@/store/modules/tagsView'
 import { useEmitt } from '@/hooks/web/useEmitt'
-import EquipBoilerForm from '@/components/EquipBoilerForm/index.vue'
+import EquipBoilerForm from '@/views/pressure2/equipboiler/EquipBoilerForm.vue'
 import {PipeTaskOrderApi, PipeTaskOrderDetailVO} from "@/api/pressure2/pipetaskorder";
 
 defineOptions({ name: 'BoilerCheckerTaskDetail' })
@@ -639,6 +639,30 @@ const handleGenerateReportPdf = async () => {
   })
 }
 
+// 监听设备编辑成功事件
+const handleEquipmentEditSuccess = async () => {
+  console.log('收到设备编辑成功事件,同步报表')
+  try {
+    await BoilerTaskOrderApi.syncAllReportDataByOrderItemId({
+      orderItemId: taskId.value
+    })
+    ElMessage.success('报表数据同步成功')
+    // 同步成功后刷新页面数据
+    await handleRefresh()
+  } catch (error) {
+    console.error('同步报表数据失败:', error)
+    ElMessage.error('同步报表数据失败')
+  }
+}
+
+// 注册事件监听
+emitter.on('equipment-edit-success', handleEquipmentEditSuccess)
+
+// 组件卸载时移除监听器,避免重复调用
+onUnmounted(() => {
+  emitter.off('equipment-edit-success', handleEquipmentEditSuccess)
+})
+
 watch(() => route.path, async () => {
   if (route.path === '/gljy/my-task/boiler/detail') {
     const idFromQuery = route.query.id
@@ -655,8 +679,24 @@ watch(() => route.path, async () => {
 
 // 设备档案弹窗
 const EquipBoilerFormRef = ref<InstanceType<typeof EquipBoilerForm>>()
-const handleViewEquipment = () => {
-  EquipBoilerFormRef.value.open(taskOrderItem.value?.equipId)
+const equipmentList = ref<any[]>([])
+
+const handleViewEquipment = async () => {
+  try {
+    // 获取当前任务关联的设备ID
+    const equipId = taskOrderItem.value?.equipId
+    
+    if (!equipId) {
+      ElMessage.warning('未找到关联的设备信息')
+      return
+    }
+    
+    // 直接打开设备编辑弹窗
+    EquipBoilerFormRef.value?.open('update', equipId)
+  } catch (error) {
+    console.error('打开设备档案失败:', error)
+    ElMessage.error('打开设备档案失败')
+  }
 }
 
 const toTaskOrderDetail = () => {

+ 4 - 0
yudao-ui-admin-vue3/src/views/pressure2/equipboiler/EquipBoilerForm.vue

@@ -808,12 +808,14 @@ import {getUnitList} from "@/api/laboratory/unit";
 import SmartTable from "@/components/SmartTable/SmartTable";
 import dayjs from "dayjs";
 import Copy from "@/views/system/equipcontainer/components/Copy.vue";
+import { useEmitt } from '@/hooks/web/useEmitt'
 
 /** 锅炉设备 表单 */
 defineOptions({ name: 'EquipBoilerForm' })
 
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
+const { emitter } = useEmitt()
 
 const dialogVisible = ref(false) // 弹窗的是否展示
 const dialogTitle = ref('') // 弹窗的标题
@@ -1032,6 +1034,8 @@ const submitForm = async () => {
     } else {
       await EquipBoilerApi.updateEquipBoiler(data)
       message.success(t('common.updateSuccess'))
+      // 发送设备编辑成功事件,通知任务详情页面刷新数据
+      emitter.emit('equipment-edit-success')
     }
     dialogVisible.value = false
     // 发送操作成功的事件

+ 117 - 3
yudao-ui-admin-vue3/src/views/pressure2/pipechecker/taskDetail.vue

@@ -137,10 +137,33 @@
 
   <!-- 设备档案弹窗 -->
    <EquipPipeForm ref="EquipPipeFormRef" :selectedItem="selectedItem" :allReportList="allReportList" />
+
+  <!-- 设备选择弹窗 -->
+  <el-dialog
+    v-model="equipmentSelectDialogVisible"
+    title="选择设备"
+    width="600px"
+  >
+    <div class="equipment-list">
+      <div 
+        v-for="equip in equipmentList" 
+        :key="equip.id"
+        class="equipment-item"
+        @click="handleEquipmentClick(equip)"
+      >
+        {{ equip.projectNo }} - {{ equip.projectName }}
+      </div>
+    </div>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="equipmentSelectDialogVisible = false">取消</el-button>
+      </div>
+    </template>
+  </el-dialog>
 </template>
 
 <script setup lang="ts">
-import {onMounted, ref} from 'vue'
+import {onMounted, ref, onUnmounted} from 'vue'
 import { useRoute } from 'vue-router'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import {
@@ -598,6 +621,30 @@ const handleVoidItem = async (item: ReportItemVO) => {
   }
 })();
 
+// 监听设备编辑成功事件
+const handleEquipmentEditSuccess = async () => {
+  console.log('收到设备编辑成功事件,同步报表')
+  try {
+    await PipeTaskOrderApi.syncAllReportDataByOrderId({
+      orderId: orderId.value
+    })
+    ElMessage.success('报表数据同步成功')
+    // 同步成功后刷新页面数据
+    await handleRefresh()
+  } catch (error) {
+    console.error('同步报表数据失败:', error)
+    ElMessage.error('同步报表数据失败')
+  }
+}
+
+// 注册事件监听
+emitter.on('equipment-edit-success', handleEquipmentEditSuccess)
+
+// 组件卸载时移除监听器,避免重复调用
+onUnmounted(() => {
+  emitter.off('equipment-edit-success', handleEquipmentEditSuccess)
+})
+
 watch(() => route.path, async () => {
   if (route.path === '/gdjy/my-task/pipe/detail') {
     const idFromQuery = route.query.id
@@ -614,8 +661,51 @@ watch(() => route.path, async () => {
 
 // 设备档案弹窗
 const EquipPipeFormRef = ref<InstanceType<typeof EquipPipeForm>>()
-const handleViewEquipment = () => {
-  EquipPipeFormRef.value.open(orderId.value)
+const equipmentSelectDialogVisible = ref(false)
+const equipmentList = ref<any[]>([])
+
+const handleViewEquipment = async () => {
+  try {
+    // 获取订单关联的所有设备
+    const res = await PipeTaskOrderApi.getEquipsByOrderId(orderId.value)
+    equipmentList.value = res || []
+    
+    if (equipmentList.value.length === 0) {
+      ElMessage.warning('暂无设备信息')
+      return
+    }
+    
+    // 如果只有一个设备,直接跳转到编辑页
+    if (equipmentList.value.length === 1) {
+      router.push({
+        name: 'PipeEquipmentForm',
+        query: {
+          type: 'update',
+          id: equipmentList.value[0].id
+        }
+      })
+    } else {
+      // 如果有多个设备,显示选择弹窗
+      equipmentSelectDialogVisible.value = true
+    }
+  } catch (error) {
+    console.error('获取设备列表失败:', error)
+    ElMessage.error('获取设备列表失败')
+  }
+}
+
+const handleEquipmentClick = (equip: any) => {
+  equipmentSelectDialogVisible.value = false
+  // 延时300ms后再跳转,让弹窗关闭动画完成
+  setTimeout(() => {
+    router.push({
+      name: 'PipeEquipmentForm',
+      query: {
+        type: 'update',
+        id: equip.id
+      }
+    })
+  }, 300)
 }
 
 const toTaskOrderDetail = () => {
@@ -847,4 +937,28 @@ async function fetchTaskDetail(id: string, activeReportId = '') {
   align-items: center;
   gap: 12px;
 }
+
+.equipment-list {
+  max-height: 400px;
+  overflow-y: auto;
+}
+
+.equipment-item {
+  padding: 12px 16px;
+  margin-bottom: 8px;
+  border: 1px solid var(--el-border-color);
+  border-radius: 4px;
+  cursor: pointer;
+  transition: all 0.3s;
+  
+  &:hover {
+    background-color: var(--el-color-primary-light-9);
+    border-color: var(--el-color-primary);
+    color: var(--el-color-primary);
+  }
+  
+  &:last-child {
+    margin-bottom: 0;
+  }
+}
 </style>

+ 4 - 0
yudao-ui-admin-vue3/src/views/pressure2/pipeequipment/PipeEquipmentForm.vue

@@ -423,6 +423,7 @@ import SmartTable from "@/components/SmartTable/SmartTable";
 import {getUnitList} from "@/api/laboratory/unit";
 import {validatePhone} from "@/utils/validateRules";
 import {string} from "vue-types";
+import { useEmitt } from '@/hooks/web/useEmitt'
 
 defineOptions({ name: 'PipeEquipmentForm' })
 
@@ -431,6 +432,7 @@ const message = useMessage() // 消息弹窗
 const router = useRouter()
 const route = useRoute()
 const tagsViewStore = useTagsViewStore()
+const { emitter } = useEmitt()
 
 // 页面标题
 const pageTitle = ref('')
@@ -563,6 +565,8 @@ const submitForm = async () => {
     } else {
       await EquipPipeApi.updateEquipPipe(submitData)
       message.success(t('common.updateSuccess'))
+      // 发送设备编辑成功事件,通知任务详情页面刷新数据
+      emitter.emit('equipment-edit-success')
     }
     tagsViewStore.delView(route)
     router.back()