|
@@ -1,44 +1,64 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div class="mixed-warn">
|
|
<div class="mixed-warn">
|
|
|
<div class="list-title">
|
|
<div class="list-title">
|
|
|
- <span>报警详情-</span>
|
|
|
|
|
- <span style="margin-left: 5px;">{{ warnData.preset || '-' }}</span>
|
|
|
|
|
|
|
+ <span>报警详情</span>
|
|
|
|
|
+ <!-- <span style="margin-left: 5px;">{{ warnData.devId || '-' }}</span> -->
|
|
|
</div>
|
|
</div>
|
|
|
<div class="list-t">
|
|
<div class="list-t">
|
|
|
<div class="basic-box">
|
|
<div class="basic-box">
|
|
|
<div class="box-btn">
|
|
<div class="box-btn">
|
|
|
- <div v-for="(btn,index) in actionBtns" :key="btn.key"
|
|
|
|
|
- :class="['baisc-btn', { 'baisc-btn-active': activeBtn === btn.key }]" @click="changeStep(btn)">
|
|
|
|
|
|
|
+ <div v-for="(btn, index) in actionBtns" :key="btn.key"
|
|
|
|
|
+ :class="['baisc-btn', { 'baisc-btn-active': activeBtn == btn.key }]" @click="changeStep(btn)">
|
|
|
<div class="btn-item">{{ btn.label }}</div>
|
|
<div class="btn-item">{{ btn.label }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="echart-box">
|
|
<div class="echart-box">
|
|
|
- <img :src="urlStr + '/sys/common/static/' + warnData.picName" />
|
|
|
|
|
|
|
+ <div class="box-img">
|
|
|
|
|
+ <img
|
|
|
|
|
+ v-if="picUrl1"
|
|
|
|
|
+ :src="picUrl1"
|
|
|
|
|
+ title="双击放大预览"
|
|
|
|
|
+ @dblclick="openPreview(picUrl1)"
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="box-img">
|
|
|
|
|
+ <img
|
|
|
|
|
+ v-if="picUrl2"
|
|
|
|
|
+ :src="picUrl2"
|
|
|
|
|
+ title="双击放大预览"
|
|
|
|
|
+ @dblclick="openPreview(picUrl2)"
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="basic-box">
|
|
<div class="basic-box">
|
|
|
<basicBorder title="报警详情">
|
|
<basicBorder title="报警详情">
|
|
|
<div class="warn-detail">
|
|
<div class="warn-detail">
|
|
|
|
|
+ <div class="warn-item">
|
|
|
|
|
+ <div class="item-label">设备编号 : </div>
|
|
|
|
|
+ <div class="item-val text-val1">{{ warnData.devId || '-' }}</div>
|
|
|
|
|
+ </div>
|
|
|
<div class="warn-item">
|
|
<div class="warn-item">
|
|
|
<div class="item-label">报警设备 : </div>
|
|
<div class="item-label">报警设备 : </div>
|
|
|
<div class="item-val text-val1">{{ warnData.deviceName || '-' }}</div>
|
|
<div class="item-val text-val1">{{ warnData.deviceName || '-' }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="warn-item">
|
|
|
|
|
- <div class="item-label">报警位置 : </div>
|
|
|
|
|
- <div class="item-val text-val1"> {{ warnData.devicePos || '-' }}</div>
|
|
|
|
|
- </div>
|
|
|
|
|
<div class="warn-item">
|
|
<div class="warn-item">
|
|
|
<div class="item-label">报警类型 : </div>
|
|
<div class="item-label">报警类型 : </div>
|
|
|
- <div class="item-val text-val"> {{ warnData.eventType=='10001' ? '热源报警' : warnData.eventType=='10002' ? '闯入报警' : '-' }}</div>
|
|
|
|
|
|
|
+ <div class="item-val text-val"> {{ warnData.eventType == '10001' ? '热源报警' : warnData.eventType == '10002'
|
|
|
|
|
+ ?
|
|
|
|
|
+ '闯入报警' : '-' }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="warn-item">
|
|
<div class="warn-item">
|
|
|
|
|
+ <div class="item-label">报警时间 : </div>
|
|
|
|
|
+ <div class="item-val text-val1"> {{ warnData.createTime || '-' }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <!-- <div class="warn-item">
|
|
|
<div class="item-label">红外类型 : </div>
|
|
<div class="item-label">红外类型 : </div>
|
|
|
<div class="item-val text-val"> {{ warnData.irModel || '-' }}</div>
|
|
<div class="item-val text-val"> {{ warnData.irModel || '-' }}</div>
|
|
|
- </div>
|
|
|
|
|
|
|
+ </div> -->
|
|
|
<div class="warn-item">
|
|
<div class="warn-item">
|
|
|
<div class="item-label ">模式 : </div>
|
|
<div class="item-label ">模式 : </div>
|
|
|
- <!-- <div class="item-val text-val"> {{ `${warnDatas.temp}℃` || '-' }}</div> -->
|
|
|
|
|
- <div class="item-val text-val"> {{ warnData.mode || '-' }}</div>
|
|
|
|
|
|
|
+ <div class="item-val text-val"> {{ warnData.mode=='1' ? '预置位' : warnData.mode=='2' ? '角度位下标号' : '-' }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="warn-item">
|
|
<div class="warn-item">
|
|
|
<div class="item-label">红外水平像素数量 : </div>
|
|
<div class="item-label">红外水平像素数量 : </div>
|
|
@@ -56,10 +76,11 @@
|
|
|
<div class="item-label">云台垂直角 : </div>
|
|
<div class="item-label">云台垂直角 : </div>
|
|
|
<div class="item-val text-val1"> {{ warnData.ptzVerAngle || '-' }}</div>
|
|
<div class="item-val text-val1"> {{ warnData.ptzVerAngle || '-' }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="warn-item">
|
|
|
|
|
|
|
+ <!-- <div class="warn-item">
|
|
|
<div class="item-label">测温标记 : </div>
|
|
<div class="item-label">测温标记 : </div>
|
|
|
<div class="item-val text-val1"> {{ warnData.tempFlag || '-' }}</div>
|
|
<div class="item-val text-val1"> {{ warnData.tempFlag || '-' }}</div>
|
|
|
- </div>
|
|
|
|
|
|
|
+ </div> -->
|
|
|
|
|
+
|
|
|
</div>
|
|
</div>
|
|
|
</basicBorder>
|
|
</basicBorder>
|
|
|
</div>
|
|
</div>
|
|
@@ -88,11 +109,26 @@
|
|
|
</div>
|
|
</div>
|
|
|
</basicBorder>
|
|
</basicBorder>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 图片双击放大预览 -->
|
|
|
|
|
+ <Teleport to="body">
|
|
|
|
|
+ <div v-if="previewVisible" class="img-preview-mask" @click.self="closePreview">
|
|
|
|
|
+ <div class="img-preview-panel">
|
|
|
|
|
+ <div class="img-preview-header">
|
|
|
|
|
+ <span>图片预览</span>
|
|
|
|
|
+ <div class="img-preview-close" @click="closePreview">×</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="img-preview-body">
|
|
|
|
|
+ <img :src="previewSrc" alt="预览图片" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </Teleport>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
-import { ref } from 'vue'
|
|
|
|
|
|
|
+import { computed, ref, watch } from 'vue'
|
|
|
import basicBorder from './basicBorder.vue'
|
|
import basicBorder from './basicBorder.vue'
|
|
|
import { picList, actionBtns } from '../hsqHome.data'
|
|
import { picList, actionBtns } from '../hsqHome.data'
|
|
|
import { useGlobSetting } from '/@/hooks/setting';
|
|
import { useGlobSetting } from '/@/hooks/setting';
|
|
@@ -114,27 +150,70 @@ const globSetting = useGlobSetting();
|
|
|
const baseUploadUrl = globSetting.uploadUrl;
|
|
const baseUploadUrl = globSetting.uploadUrl;
|
|
|
const { createMessage } = useMessage();
|
|
const { createMessage } = useMessage();
|
|
|
let urlStr = '';
|
|
let urlStr = '';
|
|
|
- if (import.meta.env.PROD) {
|
|
|
|
|
- urlStr = VUE_APP_URL.baseUrl;
|
|
|
|
|
- } else {
|
|
|
|
|
- urlStr = baseUploadUrl || '';
|
|
|
|
|
- }
|
|
|
|
|
|
|
+if (import.meta.env.PROD) {
|
|
|
|
|
+ urlStr = VUE_APP_URL.baseUrl;
|
|
|
|
|
+} else {
|
|
|
|
|
+ urlStr = baseUploadUrl || '';
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- /** 切换步骤 */
|
|
|
|
|
- function changeStep(btn: any) {
|
|
|
|
|
- currentStep.value = btn.key -1
|
|
|
|
|
- activeBtn.value = btn.key
|
|
|
|
|
- getUpdateWarnStatus()
|
|
|
|
|
- }
|
|
|
|
|
|
|
+/** 预览弹窗显隐与图片地址 */
|
|
|
|
|
+const previewVisible = ref(false)
|
|
|
|
|
+const previewSrc = ref('')
|
|
|
|
|
+
|
|
|
|
|
+/** 重置处理流程 UI 状态(不调用接口) */
|
|
|
|
|
+function resetProcessFlow() {
|
|
|
|
|
+ currentStep.value = 0
|
|
|
|
|
+ activeBtn.value = ''
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- /** 更新报警状态 */
|
|
|
|
|
- async function getUpdateWarnStatus() {
|
|
|
|
|
- let res = await updateProcessState({
|
|
|
|
|
- id:props.warnData.id,
|
|
|
|
|
- processState:currentStep.value,
|
|
|
|
|
- })
|
|
|
|
|
- createMessage.success(res.msg || '更新成功')
|
|
|
|
|
|
|
+/** 报警信息列表切换详情时,重置处理流程状态 */
|
|
|
|
|
+watch(
|
|
|
|
|
+ () => props.warnData?.id,
|
|
|
|
|
+ (id, prevId) => {
|
|
|
|
|
+ if (id !== prevId) {
|
|
|
|
|
+ resetProcessFlow()
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+/** 拼接报警图片完整地址 */
|
|
|
|
|
+function buildPicUrl(picName?: string) {
|
|
|
|
|
+ if (!picName) return ''
|
|
|
|
|
+ const path = picName.indexOf('h') >= 0 ? picName.substring(picName.indexOf('h')) : picName
|
|
|
|
|
+ return `${urlStr}/sys/common/static/${path}`
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const picUrl1 = computed(() => buildPicUrl(props.warnData?.picName))
|
|
|
|
|
+const picUrl2 = computed(() => buildPicUrl(props.warnData?.picName2))
|
|
|
|
|
+
|
|
|
|
|
+/** 打开图片预览 */
|
|
|
|
|
+function openPreview(src: string) {
|
|
|
|
|
+ if (!src) return
|
|
|
|
|
+ previewSrc.value = src
|
|
|
|
|
+ previewVisible.value = true
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 关闭图片预览 */
|
|
|
|
|
+function closePreview() {
|
|
|
|
|
+ previewVisible.value = false
|
|
|
|
|
+ previewSrc.value = ''
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 切换步骤 */
|
|
|
|
|
+function changeStep(btn: any) {
|
|
|
|
|
+ currentStep.value = btn.key - 1
|
|
|
|
|
+ activeBtn.value = btn.key
|
|
|
|
|
+ getUpdateWarnStatus()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 更新报警状态 */
|
|
|
|
|
+async function getUpdateWarnStatus() {
|
|
|
|
|
+ let res = await updateProcessState({
|
|
|
|
|
+ id: props.warnData.id,
|
|
|
|
|
+ processState: currentStep.value,
|
|
|
|
|
+ })
|
|
|
|
|
+ createMessage.success(res.msg || '更新成功')
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
@@ -230,13 +309,22 @@ let urlStr = '';
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.echart-box {
|
|
.echart-box {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
height: calc(100% - 44px);
|
|
height: calc(100% - 44px);
|
|
|
- background-color: #114268;
|
|
|
|
|
- // background: var(--image-box-bg7) no-repeat;
|
|
|
|
|
- // background-size: 100% 100%;
|
|
|
|
|
- img {
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- height: 100%;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ .box-img {
|
|
|
|
|
+ height: calc(50% - 2px);
|
|
|
|
|
+ background-color: #114268;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+
|
|
|
|
|
+ img {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ object-fit: contain;
|
|
|
|
|
+ cursor: zoom-in;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -354,4 +442,71 @@ let urlStr = '';
|
|
|
:deep(.zxm-steps-item-wait > .zxm-steps-item-container > .zxm-steps-item-tail::after) {
|
|
:deep(.zxm-steps-item-wait > .zxm-steps-item-container > .zxm-steps-item-tail::after) {
|
|
|
background-color: rgba(28, 118, 172, .6) !important;
|
|
background-color: rgba(28, 118, 172, .6) !important;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+/* Teleport 到 body,需写在 .mixed-warn 外以保证样式生效 */
|
|
|
|
|
+.img-preview-mask {
|
|
|
|
|
+ position: fixed;
|
|
|
|
|
+ inset: 0;
|
|
|
|
|
+ z-index: 3000;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ background: rgba(9, 23, 44, 0.82);
|
|
|
|
|
+ backdrop-filter: blur(4px);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.img-preview-panel {
|
|
|
|
|
+ width: min(86vw, 1100px);
|
|
|
|
|
+ height: min(82vh, 760px);
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ border: 1px solid rgba(11, 37, 66);
|
|
|
|
|
+ box-shadow: 0 0 20px 5px rgba(32, 131, 189, 0.7) inset, 0 0 24px rgba(1, 254, 252, 0.2);
|
|
|
|
|
+ background: rgba(9, 35, 58, 0.95);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.img-preview-header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ height: 36px;
|
|
|
|
|
+ padding: 0 14px;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ background: linear-gradient(to right, #134c77, transparent);
|
|
|
|
|
+ border-bottom: 1px solid rgba(41, 171, 241, 0.45);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.img-preview-close {
|
|
|
|
|
+ width: 28px;
|
|
|
|
|
+ height: 24px;
|
|
|
|
|
+ line-height: 20px;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ color: #01fefc;
|
|
|
|
|
+ border: 1px solid #01fefc;
|
|
|
|
|
+ border-radius: 2px;
|
|
|
|
|
+ transition: background-color 0.2s, box-shadow 0.2s;
|
|
|
|
|
+
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ background-color: rgba(36, 132, 188, 0.55);
|
|
|
|
|
+ box-shadow: 0 0 6px rgba(1, 254, 252, 0.45);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.img-preview-body {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ padding: 16px;
|
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
|
+ background-color: #114268;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+
|
|
|
|
|
+ img {
|
|
|
|
|
+ max-width: 100%;
|
|
|
|
|
+ max-height: 100%;
|
|
|
|
|
+ object-fit: contain;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
</style>
|
|
</style>
|