<!-- Description: 报警管理-详情 Author: 李亚光 Date: 2023-09-11 --> <script lang="ts" setup name="WellDetail"> import dayjs from 'dayjs' import { ElMessage } from 'element-plus' import { alarmProcessNode, detailAlarm } from '@/api/home/alarm/current' import { getAlarmDetail } from '@/api/home/alarm/history' import { toHumpObject } from '@/utils/String' import { getAlarmLevelListPage, getAlarmTypeListPage } from '@/api/home/rule/alarm' import { getDateDiff } from '@/utils/dayjs' import showPosition from '@/views/home/device/device/components/showPosition.vue' const $router = useRouter() const $route = useRoute() // 页面详情数据 const detailInfo = ref<{ [key: string]: string }>({}) // 描述列表数据 const descriptionsList = ref([ { text: '报警编号', value: 'id', align: 'center', }, { text: '报警类别', value: 'alarmCategory', align: 'center', }, { text: '报警类型', value: 'alarmTypeName', align: 'center', }, { text: '报警原因', value: 'alarmMsg', align: 'center', }, { text: '报警等级', value: 'alarmLevelName', align: 'center', }, { text: '报警时间', value: $route.query.type === 'history' ? 'alarmTime' : 'ts', align: 'center', }, { text: '设备类型', value: 'devTypeName', align: 'center', }, { text: '设备编号', value: 'devcode', align: 'center', }, { text: '位置', value: 'tagNumber', align: 'center', }, { text: '详细地址', value: 'position', align: 'center', }, { text: '管理单位', value: 'deptName', align: 'center', }, { text: '负责人', value: '', align: 'center', }, { text: '是否误报', value: 'realAlarmName', align: 'center', }, { text: '解除时间', value: 'cancelTime', align: 'center', }, { text: '处置时长', value: $route.query.type === 'history' ? 'cancelDuration' : 'duration', align: 'center', }, { text: '', value: '', align: '', }, ]) // 报警动态 const alarmDynamics = ref<any[]>([]) // 页面loading const loading = ref(false) const loadingDynamics = ref(false) // 获取闸井详情数据 const fetchDetail = async () => { loading.value = true const res1 = await getAlarmLevelListPage({ offset: 1, limit: 9999 }) const res2 = await getAlarmTypeListPage({ offset: 1, limit: 9999 }); ($route.query.type === 'history' ? getAlarmDetail : detailAlarm)($route.query.id as string).then((res) => { detailInfo.value = toHumpObject(res.data) detailInfo.value.realAlarmName = detailInfo.value.realAlarm === '1' ? '报警' : '误报' detailInfo.value.alarmTypeName = res2.data.rows.filter((item: any) => item.id === detailInfo.value.alarmTypeId)[0]?.alarmType || '' detailInfo.value.alarmLevelName = res1.data.rows.filter((item: any) => item.id === detailInfo.value.alarmLevel)[0]?.alarmLevel || '' detailInfo.value.duration = detailInfo.value.ts && detailInfo.value.cancelTime ? getDateDiff(detailInfo.value.ts, detailInfo.value.cancelTime) : '' loading.value = false }).catch(() => { loading.value = false }) // 获取报警动态 loadingDynamics.value = true const info = JSON.parse($route.query.row as string) alarmProcessNode($route.query.id as string).then((res) => { alarmDynamics.value = res.data.map((item: any) => ({ ...toHumpObject(item) })) alarmDynamics.value.unshift({ approvalTime: info.ts, // 报警生成时间 process_name: '', approvalPerson: '报警生成', dept_name: '', }) loadingDynamics.value = false }).catch(() => { loadingDynamics.value = false }) } // 点击经纬度展示地图 const mapRef = ref() const showMap = (data: any) => { if (data.text !== '详细地址' || !detailInfo.value[data.value]) { return } if (!detailInfo.value.lngGaode || !detailInfo.value.latGaode) { ElMessage.warning('该数据缺少坐标信息') return } mapRef.value.initDialog([detailInfo.value.lngGaode, detailInfo.value.latGaode]) } onMounted(() => { fetchDetail() }) </script> <template> <!-- 布局 --> <app-container v-loading="loading" class="container"> <show-position ref="mapRef" /> <detail-page title="报警详情"> <template #btns> <el-button type="info" @click="$router.back()"> 关闭 </el-button> </template> </detail-page> <detail-block-com> <el-descriptions :column="2" border> <el-descriptions-item v-for="item in descriptionsList" :key="item.text" :align="item.align"> <template #label> <span class="label"> {{ item.text }} </span> </template> <span :class="`${item.text === '详细地址' ? 'pointer' : ''}`" @click="showMap(item)"> {{ detailInfo[item.value] || '' }} </span> </el-descriptions-item> <el-descriptions-item v-loading="loadingDynamics" align="left" label-align="center"> <template #label> <span class="label"> 报警动态 </span> </template> <div style="padding: 25px;"> <el-timeline> <el-timeline-item v-for="(item, index) in alarmDynamics" :key="index" :timestamp="item.approvalTime" type="primary" > {{ `${item.approvalPerson}${item.dept_name ? '(' : ''}${item.dept_name}${item.dept_name ? ')' : ''}${item.process_name}` }} </el-timeline-item> </el-timeline> </div> </el-descriptions-item> </el-descriptions> </detail-block-com> </app-container> </template> <style lang="scss" scoped> ::v-deep(.el-descriptions__label) { width: 15%; } .pointer { &:hover { cursor: pointer; } } .bottom { --el-descriptions-table-border-top: none; ::v-deep(.el-descriptions) { --el-descriptions-table-border-top: none; } } </style>