You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
342 lines
12 KiB
342 lines
12 KiB
<template>
|
|
<div class="warning_list">
|
|
<el-tabs v-model="activeTab" @tab-click="onChangeTab">
|
|
<el-tab-pane label="预警事件" name="four" v-hasPermi="['home:notice:event']" />
|
|
<el-tab-pane label="感知事件" name="first" v-hasPermi="['home:notice:warningEvent']"/>
|
|
<el-tab-pane label="待确认事件" name="second" v-hasPermi="['home:notice:warningEvent']" />
|
|
<el-tab-pane label="处置中事件" name="third" v-hasPermi="['home:notice:disposeEvent']" />
|
|
<el-tab-pane label="设备异常" name="fifth" v-hasPermi="['home:notice:deviceOffline']" />
|
|
</el-tabs>
|
|
<div>
|
|
<Table :data="tableData" :show-header="false" @cell-click="onCellClick" height="400px">
|
|
<ElTableColumn prop="remark" width="550">
|
|
<template slot-scope="scope">
|
|
|
|
<el-tooltip class="item" effect="dark" :content="scope.row.remark" placement="top-start">
|
|
<div class="markPanel">
|
|
<div class="leftColumn">
|
|
<div class="device-icon" :style="{ backgroundImage: `url(${require(`@screen/images/event/${scope.row.icon? scope.row.icon : '交通拥堵'}.svg`)})` }" />
|
|
<p>{{ activeTab == 'first' ? WarningType[scope.row.warningType] : scope.row.stringEventType }}</p>
|
|
</div>
|
|
<p class="rightRemark">
|
|
{{ scope.row.remark }}
|
|
</p>
|
|
</div>
|
|
</el-tooltip>
|
|
</template>
|
|
</ElTableColumn>
|
|
</Table>
|
|
</div>
|
|
|
|
<div class="footer" style="width:100%;display:flex;justify-content: center;margin-top: 10px;">
|
|
<Pagination @current-change="getMainData" @size-change="onSizeChange" width="'100%'"
|
|
:page-sizes="[10, 20, 30, 40, 50]" :page-size="searchData.pageSize" :current-page.sync="searchData.pageNum"
|
|
layout="total, sizes, prev, pager, next" :total="total">
|
|
</Pagination>
|
|
</div>
|
|
|
|
<DialogDeviceOffline :visible="modelDeviceVisible" :activeId="activeId"
|
|
@update:value="handleDeviceDialogClose" />
|
|
<!-- "详情"弹出框 -->
|
|
<EventDetailDialog :visible="eventDetailDialogVisible" :formData="detailDialogFormData" :activeName="activeName"
|
|
@update:value="handleDialogClose" @queryData="reData" />
|
|
<DialogWarning ref="refDigWarn" v-model="dialogWarningVisible"></DialogWarning>
|
|
|
|
<!-- 设备异常弹窗 -->
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import request from "@/utils/request";
|
|
import Table from '@screen/components/Table.vue';
|
|
import Pagination from '@screen/components/Pagination.vue';
|
|
import { WarningType , deviceTypeOptions} from "@screen/utils/enum.js";
|
|
import { Message } from "element-ui";
|
|
|
|
import { WarningType as warningTypeMapping, DirectionTypes as gzDirectionMapping, warningSourceMapping, warningStateMapping } from "@screen/utils/enum.js"
|
|
|
|
import { checkPermi } from "@/utils/permission.js";
|
|
import DialogWarning from './dialogWarn/DialogWarning.vue'
|
|
import {mokStakeWarning} from './dialogWarn/mock.js'
|
|
export default {
|
|
components: {
|
|
Table,
|
|
Pagination,
|
|
DialogWarning,
|
|
},
|
|
data() {
|
|
return {
|
|
activeTab: "four",
|
|
WarningType,
|
|
eventDetailDialogVisible: false,
|
|
detailDialogFormData: {},
|
|
activeName: '-1',
|
|
tableData: [],
|
|
total: 10,
|
|
searchData: {
|
|
pageSize: 10,
|
|
pageNum: 1,
|
|
},
|
|
|
|
dialogWarningVisible: false,
|
|
|
|
|
|
modelDeviceVisible:false,
|
|
activeId:''
|
|
};
|
|
},
|
|
computed: {
|
|
},
|
|
mounted() {
|
|
// 判断初始化弹窗列表
|
|
//预警事件
|
|
if (checkPermi(["home:notice:event"])) {
|
|
this.activeTab = "four";
|
|
} else if(checkPermi(["home:notice:warningEvent"])){
|
|
this.activeTab = "first";
|
|
} else if(checkPermi(["home:notice:processingEvent"])){
|
|
this.activeTab = "third";
|
|
} else if(checkPermi(["home:notice:deviceOffline"])){
|
|
this.activeTab = "fifth";
|
|
}
|
|
//添加全局事件监听
|
|
this.$root.$on('refresh-event', this.getMainData);
|
|
this.getMainData();
|
|
},
|
|
beforeDestroy() {
|
|
// 在实例销毁前移除事件监听,防止内存泄漏
|
|
this.$root.$off('refresh-event', this.getMainData);
|
|
},
|
|
methods: {
|
|
onChangeTab(tab, event) {
|
|
this.getMainData();
|
|
},
|
|
|
|
handleDeviceDialogClose() {
|
|
this.modelDeviceVisible = false;
|
|
},
|
|
onCellClick(row, column, cell, event) {
|
|
if(this.activeTab === 'fifth'){
|
|
this.activeId = row.id;
|
|
this.modelDeviceVisible = true;
|
|
|
|
return;
|
|
}
|
|
if(this.activeTab === 'four'){
|
|
if(row.warningType === '1'){
|
|
|
|
this.dialogWarningVisible = true;
|
|
this.$refs.refDigWarn.bind(row.id,row.remark)
|
|
}
|
|
return;
|
|
// setTimeout(() => {
|
|
// this.dialogWarningData = mokStakeWarning
|
|
// }, 500);
|
|
// return;
|
|
|
|
} else if (this.activeTab == 'first') {
|
|
this.activeName = '-1'
|
|
} else if(this.activeTab == 'third'){
|
|
this.activeName = '1'
|
|
} else {
|
|
this.activeName = '0'
|
|
}
|
|
this.firstBtnClick(row.id);
|
|
},
|
|
handleDialogClose() {
|
|
this.eventDetailDialogVisible = false;
|
|
|
|
this.$root.$emit('refresh-event-list');
|
|
},
|
|
reData() {
|
|
|
|
},
|
|
getMainData() {
|
|
if (this.activeTab == 'first') {
|
|
request({
|
|
url: `/perceivedEvents/warning/warningListPage?pageNum=${this.searchData.pageNum}&pageSize=${this.searchData.pageSize}`,
|
|
method: "POST",
|
|
data: {
|
|
warningState: 1,
|
|
}
|
|
})
|
|
.then((result) => {
|
|
if (result.code != 200) return;
|
|
this.tableData = result.rows;
|
|
this.total = result.total;
|
|
})
|
|
} else if (this.activeTab == 'second' || this.activeTab == 'third') {
|
|
request({
|
|
url: `dc/system/event/list?eventState=${this.activeTab == 'second'?0:1}&pageSize=${this.searchData.pageSize}&pageNum=${this.searchData.pageNum}`,
|
|
method: "GET",
|
|
// params: {}
|
|
})
|
|
.then((result) => {
|
|
if (result.code != 200) return;
|
|
result.rows.forEach(item => {
|
|
item.remark = (item.occurrenceTime || '') + " " + (item.stakeMark || '') + " " + (item.direction==='1'?'菏泽方向':'济南方向') + " 发生" + (item.stringEventType || '') + "( " + (item.eventSubclassName || '') + ")事件"
|
|
// item.remark = item.stakeMark + " " + item.direction + " 发生" + item.stringEventType + "( " + item.eventSubclass + ")事件"
|
|
})
|
|
this.tableData = result.rows;
|
|
this.total = result.total;
|
|
})
|
|
} else if(this.activeTab === 'four'){
|
|
request({
|
|
url: `/business/warning/meteorologicalList?pageSize=${this.searchData.pageSize}&pageNum=${this.searchData.pageNum}`,
|
|
method: "Post",
|
|
// url: `business/dcNoStakeWarningTable/list?pageSize=${this.searchData.pageSize}&pageNum=${this.searchData.pageNum}`,
|
|
// method: "GET",
|
|
})
|
|
.then((result) => {
|
|
if (result.code != 200) return;
|
|
result.rows.forEach(item => {
|
|
item.remark = item.warningDescription
|
|
if (item.warningType === '1') {
|
|
item.stringEventType = '交通流预警';
|
|
} else if (item.warningType === '2') {
|
|
item.stringEventType = '气象预警';
|
|
} else if (item.warningType === '3') {
|
|
item.stringEventType = '交通流异常预警';
|
|
} else {
|
|
item.stringEventType = '未知预警类型'; // 可选:处理未知的 warningType
|
|
}
|
|
/*
|
|
item.stringEventType = item.warningType === '1'?'交通流预警':'气象预警';
|
|
*/
|
|
if(item.warningType === '2'){
|
|
item.icon = '气象检测器'
|
|
}
|
|
})
|
|
this.tableData = result.rows;
|
|
this.total = result.total;
|
|
})
|
|
} else if(this.activeTab === 'fifth'){
|
|
request({
|
|
url: `/deviceOfflineRecord/list?status=0&orderByColumn=createTime&isAsc=desc&pageSize=${this.searchData.pageSize}&pageNum=${this.searchData.pageNum}`,
|
|
method: "GET",
|
|
})
|
|
.then((result) => {
|
|
if (result.code != 200) return;
|
|
result.rows.forEach(item => {
|
|
item.icon = '设备'
|
|
item.remark = item.createTime+ ' '+item.stakeMark +' ' +item.deviceName+'发生故障'
|
|
item.stringEventType = _.find(deviceTypeOptions,{value:parseInt(item.deviceType)}).label
|
|
|
|
})
|
|
this.tableData = result.rows;
|
|
this.total = result.total;
|
|
})
|
|
}
|
|
},
|
|
firstBtnClick(id) {//点击去确认/详情/处置记录等第一个按钮
|
|
if (this.activeName == '-1') {
|
|
request({
|
|
url: `/perceivedEvents/warning/getWarningById`,//感知事件
|
|
method: "post",
|
|
data: { id }
|
|
}).then((result) => {
|
|
if (result.code != 200) return Message.error(result?.msg);
|
|
let data = result.data;
|
|
|
|
data.stringEventSource = data?.warningSource ? warningSourceMapping[data.warningSource] : '';
|
|
data.nickName = data.userName;
|
|
// data.direction = gzDirectionMapping[data.direction] || data.direction;
|
|
data.startTime = data.warningTime;
|
|
data.stringEventState = warningStateMapping[data.warningState];
|
|
data.stringEventType = warningTypeMapping[data.warningType];
|
|
data.actionSource = this.activeName
|
|
data.videoList = [];
|
|
if (data.otherConfig) {
|
|
let otherConfig = JSON.parse(data.otherConfig);
|
|
|
|
data.waterFilmThickness = otherConfig.waterFilmThickness;
|
|
data.windSpeed = otherConfig.windSpeed;
|
|
data.visibility = otherConfig.visibility;
|
|
|
|
data.pictures = otherConfig.pictures || otherConfig.imgUrl ||[];
|
|
data.videoList = otherConfig.videoList || otherConfig.videoUrl|| [];
|
|
// data.videoList = ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4',
|
|
// 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4']
|
|
}
|
|
data.videoType = "mp4";
|
|
data.component = "Video";
|
|
|
|
data.description = data.remark;
|
|
this.detailDialogFormData = data;
|
|
// console.log('data', this.detailDialogFormData)
|
|
|
|
this.eventDetailDialogVisible = true;
|
|
});
|
|
} else {
|
|
request({
|
|
url: `/dc/system/event/${id}`,//交通事件
|
|
method: "get",
|
|
}).then(async (result) => {
|
|
if (result.code != 200) return Message.error(result?.msg);
|
|
let data = result.data;
|
|
data.stringDirection = gzDirectionMapping[data.direction] || data.direction;
|
|
data.startTime = data?.occurrenceTime || '';
|
|
|
|
|
|
data.videoList = [];
|
|
data.component = "VideoMulti";
|
|
|
|
// const { downCamera, upCamera } = ((await getNearCameraNew(data.stakeMark))?.data || {});//新的上下游摄像头接口
|
|
// data.downCamId = downCamera?.camId;
|
|
// data.upCamId = upCamera?.camId;
|
|
data.videoType = "flv";
|
|
|
|
this.detailDialogFormData = data;
|
|
|
|
this.eventDetailDialogVisible = true;
|
|
});
|
|
}
|
|
|
|
},
|
|
onSizeChange(pageSize) {
|
|
this.searchData.pageSize = pageSize;
|
|
this.getMainData();
|
|
},
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.warning_list {
|
|
.markPanel{
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
.rightRemark{
|
|
flex: 1;
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
.leftColumn {
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
margin-right: 8px;
|
|
border: 1px solid #FF5F5F;
|
|
width: 120px;
|
|
height: 28px;
|
|
p {
|
|
color: #FF5F5F;
|
|
font-size: 13px;
|
|
margin-right: 3px;
|
|
}
|
|
|
|
.device-icon {
|
|
height: 22px;
|
|
width: 22px;
|
|
background-repeat: no-repeat;
|
|
background-size: 100% 100%;
|
|
background-position: center;
|
|
}
|
|
|
|
}
|
|
}
|
|
</style>
|
|
|