济菏高速业务端
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

<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>