multiple-police-situations/src/views/page/indexMim.vue

1121 lines
31 KiB
Vue
Raw Normal View History

2024-07-22 11:11:43 +08:00
<template>
<div class="box">
<div class="left">
<div class="left_top">
<div class="title1">
<span style="margin-left:13px;font-weight: bold;font-size: 15px;">接入总览</span>
</div>
<div style="display: flex;align-items: center;justify-content: center;padding: 10px 0px;">
<img style="width:15%;height:15%;" src="./indeximag/图2.png" alt="" />
<div style="text-align: center;">
<p style="font-size: 13px;margin-bottom: 10px;">接入数量</p>
<span class="fp">{{getNthChar(data1.alarmPointTotal+'',5)}}</span>
<span class="fp">{{getNthChar(data1.alarmPointTotal+'',4)}}</span>
<span class="fp">{{getNthChar(data1.alarmPointTotal+'',3)}}</span>
<span class="fp">{{getNthChar(data1.alarmPointTotal+'',2)}}</span>
<span class="fp">{{getNthChar(data1.alarmPointTotal+'',1)}}</span>
<span class="fp">{{getNthChar(data1.alarmPointTotal+'',0)}}</span>
</div>
</div>
<div id="EcharRef" style="width:98%; height:54%;"></div>
</div>
<div class="left_cen">
<div class="title1">
<span style="margin-left:13px;font-weight: bold;font-size: 15px;">运营单位</span>
</div>
<div style="display: flex;justify-content:space-between;margin-top: 10px;">
<div style="margin-left:30px;">
<span style="margin-right:5px;font-size: 13px;">接入数量</span>
<span class="fp">{{getNthChar(config.data.length+'',2)}}</span>
<span class="fp">{{getNthChar(config.data.length+'',1)}}</span>
<span class="fp">{{getNthChar(config.data.length+'',0)}}</span>
</div>
<div style="margin-right:30px;padding-top:6px;">
<span style="display:inline-block;font-size: 13px;">在线率</span>
<div style="display:inline-block;">
<el-progress
style="width:65px;display: inline-block;vertical-align: middle;margin-left:10px;margin-top: -5px;"
:percentage="(i/config.data.length).toFixed(2)*100" :stroke-width="15"
:text-inside="true"></el-progress>
</div>
</div>
</div>
<div style="width:100%;height:70%;margin-top: 5px;">
<dv-scroll-board :config="config" @click="row1" style="" />
</div>
</div>
<div class="left_bottm">
<div class="title1">
<span style="margin-left:13px;font-weight: bold;font-size: 15px;">重点单位</span>
</div>
<div id="EcharRef1" style="width:98%; height:44%;">
</div>
<div style="width:100%;height:30%;margin-top: 10px;">
<dv-scroll-board :config="config1" style="" />
</div>
</div>
</div>
<div class="cen" id="myMap">
<!-- <el-button icon="el-icon-search" circle></el-button> -->
</div>
<div class="right" style="position: relative;">
<span style="position: absolute;left:-180px;top:12px;z-index:9;font-size:23px;font-weight: bold;">{{maptitle}}</span>
<el-tooltip class="item" effect="dark" content="返回上一级" placement="top-start">
<el-button @click="hy()" type="primary" icon="refresh-left" circle
style="position: absolute;left:-48px;top:4px;z-index:9;"></el-button>
</el-tooltip>
<div class="right_top">
<div class="title1">
<span style="margin-left:13px;font-weight: bold;font-size: 15px;">今日警情</span>
<img src="" alt="" />
</div>
<div style="width:100%;display:flex;justify-content: center;align-items: center;margin-top:15px;">
<div>
<span style="margin-right:5px;font-size: 13px;">报警次数</span>
<span class="fp">{{getNthChar(drzs.countAlarm+'',2)}}</span>
<span class="fp">{{getNthChar(drzs.countAlarm+'',1)}}</span>
<span class="fp">{{getNthChar(drzs.countAlarm+'',0)}}</span>
</div>
<div style="margin-left:30px;">
<span style="margin-right:5px;font-size: 13px;">警情数量</span>
<span class="fp">{{getNthChar(drzs.countCase+'',1)}}</span>
<span class="fp">{{getNthChar(drzs.countCase+'',0)}}</span>
</div>
</div>
<div id="EcharRef2" style="width:98%; height:73%;margin-top:10px;">
</div>
</div>
<div class="right_cen">
<div class="title1">
<span style="margin-left:13px;font-weight: bold;font-size: 15px;">今日报警</span>
</div>
<div style="width:100%;height:80%;margin-top: 10px;">
<el-empty v-if="config2.data.length==0" :image-size="100" description="暂无数据"></el-empty>
<dv-scroll-board v-else :config="config2" @click="row2" style="" />
</div>
</div>
<div class="right_bottm">
<div class="title1">
<span style="margin-left:13px;font-weight: bold;font-size: 15px;">今日预警</span>
</div>
<div style="width:100%;height:70%;margin-top: 10px;">
<el-empty v-if="config3.data.length==0" :image-size="100" description="暂无数据"></el-empty>
<dv-scroll-board v-else :config="config3" @click="row3" style="" />
</div>
</div>
</div>
<el-dialog title="运营单位" v-model="dialogVisible1" width="800" :before-close="handleClose">
<div class="uploadBtn" style="text-align: right;margin-right: 10px;">
<el-button><el-icon>
<Printer />
</el-icon></el-button>
</div>
<el-descriptions title="" border direction="" :column="2">
<el-descriptions-item label="平台名称">{{showrow1data.name}}</el-descriptions-item>
<el-descriptions-item label="公司">{{showrow1data.company}}</el-descriptions-item>
<el-descriptions-item label="城市">{{showrow1data.city}}</el-descriptions-item>
<el-descriptions-item label="区县">{{showrow1data.district}}</el-descriptions-item>
<el-descriptions-item label="IP">{{showrow1data.ip}}</el-descriptions-item>
<el-descriptions-item label="平台公钥">{{showrow1data.platKey}}</el-descriptions-item>
<el-descriptions-item label="视频系统">{{showrow1data.ipcSystem}}</el-descriptions-item>
<el-descriptions-item label="在线状态">{{showrow1data.lineState}}</el-descriptions-item>
<el-descriptions-item label="启用状态">{{showrow1data.useState}}</el-descriptions-item>
<el-descriptions-item label="联系人">{{showrow1data.userName1}}</el-descriptions-item>
<el-descriptions-item label="电话">{{showrow1data.userPhone2}}</el-descriptions-item>
</el-descriptions>
</el-dialog>
<el-dialog title="今日报警" v-model="dialogVisible2" width="800" :before-close="handleClose">
<div class="uploadBtn" style="text-align: right;margin-right: 10px;">
<el-button><el-icon>
<Printer />
</el-icon></el-button>
</div>
<el-descriptions title="" border direction="" :column="2">
<el-descriptions-item label="时间">{{showrow2data.timestamp}}</el-descriptions-item>
<el-descriptions-item label="类型">{{showrow2data.alarmCode}}</el-descriptions-item>
<el-descriptions-item label="报警单位">{{showrow2data.alarmTarget}}</el-descriptions-item>
<el-descriptions-item label="地点">{{showrow2data.address}}</el-descriptions-item>
<el-descriptions-item label="城市">{{showrow2data.city}}</el-descriptions-item>
<el-descriptions-item label="区县">{{showrow2data.district}}</el-descriptions-item>
<el-descriptions-item label="乡镇">{{showrow2data.town}}</el-descriptions-item>
<el-descriptions-item label="报警类型">{{showrow2data.alarmType}}</el-descriptions-item>
<el-descriptions-item label="设备类型">{{showrow2data.deviceType}}</el-descriptions-item>
<el-descriptions-item label="设备号">{{showrow2data.alarmSource}}</el-descriptions-item>
<el-descriptions-item label="描述信息">{{showrow2data.description}}</el-descriptions-item>
<el-descriptions-item label="核验状态">{{totypecn(showrow2data.fakeState) }}</el-descriptions-item>
<el-descriptions-item label="联系人">{{showrow2data.user1Name}}</el-descriptions-item>
<el-descriptions-item label="联系人号码">{{showrow2data.user1Phone}}</el-descriptions-item>
</el-descriptions>
</el-dialog>
<el-dialog title="今日预警" v-model="dialogVisible3" width="800" :before-close="handleClose">
<div class="uploadBtn" style="text-align: right;margin-right: 10px;">
<el-button><el-icon>
<Printer />
</el-icon></el-button>
</div>
<el-descriptions title="" border direction="" :column="2">
<el-descriptions-item label="时间">{{showrow3data.timestamp}}</el-descriptions-item>
<el-descriptions-item label="类型">{{showrow3data.alarmCode}}</el-descriptions-item>
<el-descriptions-item label="报警单位">{{showrow3data.alarmTarget}}</el-descriptions-item>
<el-descriptions-item label="地点">{{showrow3data.address}}</el-descriptions-item>
<el-descriptions-item label="城市">{{showrow3data.city}}</el-descriptions-item>
<el-descriptions-item label="区县">{{showrow3data.district}}</el-descriptions-item>
<el-descriptions-item label="乡镇">{{showrow3data.town}}</el-descriptions-item>
<el-descriptions-item label="报警类型">{{showrow3data.alarmType}}</el-descriptions-item>
<el-descriptions-item label="设备类型">{{showrow3data.deviceType}}</el-descriptions-item>
<el-descriptions-item label="设备号">{{showrow3data.alarmSource}}</el-descriptions-item>
<el-descriptions-item label="描述信息">{{showrow3data.description}}</el-descriptions-item>
<el-descriptions-item label="核验状态">{{totypecn(showrow3data.fakeState) }}</el-descriptions-item>
<el-descriptions-item label="联系人">{{showrow3data.user1Name}}</el-descriptions-item>
<el-descriptions-item label="联系人号码">{{showrow3data.user1Phone}}</el-descriptions-item>
</el-descriptions>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import 'echarts-gl';
import { getAreaCode } from './js/area';
import { Ref, ref, watch, onMounted, deleted, onBeforeMount, reactive, getCurrentInstance, nextTick } from 'vue';
import * as echarts from "echarts";
import api from "@/axios";
const { proxy } = getCurrentInstance() as any;
const day = proxy.day;
onMounted(
() => {
// gettotal();
seach();
initMapdt(localStorage.getItem('mapdata'), JSON.parse(localStorage.getItem('totaldata')),JSON.parse(localStorage.getItem('user-stores'))['userInfo']['levelvalue']);
get1(JSON.parse(localStorage.getItem('user-stores'))['userInfo']['levelvalue'], '', '');
get3(JSON.parse(localStorage.getItem('user-stores'))['userInfo']['levelvalue'], '', '');
getaiyuji(JSON.parse(localStorage.getItem('user-stores'))['userInfo']['levelvalue'], '', '');
getdayline(JSON.parse(localStorage.getItem('user-stores'))['userInfo']['levelvalue'], '', '');
getAi(JSON.parse(localStorage.getItem('user-stores'))['userInfo']['levelvalue'], '', '');
}
);
//详情
const row1data = ref();
const showrow1data = ref();
const dialogVisible1 = ref(false);
const row1 = (row) => {
showrow1data.value = row1data.value[row.rowIndex]
dialogVisible1.value = true;
};
const totypecn = (data) => {
if (data == '0') {
return '未核验'
} else if (data == '1') {
return '核验为假'
} else if (data == '2') {
return '核验为真'
}
};
//查询运营商
const config = reactive({
header: ['名称', 'ip', '地区', '状态'],
headerHeight: 28,
columnWidth: [150, 150, 180, 80],
waitTime: 3000,
data: [
],
headerBGC: '#174F8A',
oddRowBGC: '#2C5784',
evenRowBGC: 'F3FDFF',
index: false,
align: ['left', 'left', 'left', 'center'],
});
const i = ref(0)
const seach = (obj) => {
api.post('/multialarm/client/platform/getlist', obj).then((res) => {
if (res.code == 0) {
row1data.value = res.data;
let arr = [];
res.data.forEach((x) => {
if (x.lineState == "online") {
i.value++;
arr.push([x.name, x.ip, x.address, '<span style="background:#038E4C;padding:2px 3px;color:#fff;font-size:12px;border-radius:3px">在线</span>'])
} else {
arr.push([x.name, x.ip, x.address, '<span style="background:red;padding:2px 3px;color:#fff;font-size:12px;border-radius:3px">离线</span>'])
}
})
config.data = arr;
}
})
};
//还原
const hy = () => {
var tree4data = flattenTree(JSON.parse(localStorage.getItem('tree4data')));
// maptitle.value = tree4data.find(element => element.code == JSON.parse(data)['name'])['title'];
if (localStorage.getItem('nowCode') == JSON.parse(localStorage.getItem('user-stores'))['userInfo']['geoCode']) {
return
} else {
let fhcode = getAreaCode(localStorage.getItem('nowCode'))['codes'][0];
let ado = echarts.init(document.getElementById('myMap'));
ado.showLoading({
text: '地图加载中',
color: '#09A2DC', //设置加载颜色
textColor: '#09A2DC',
maskColor: 'rgba(255, 255, 255, 0.2)',
zlevel: 0
})
// const url = 'https://www.hndyjqrh.cn:8083/multialarm/pic/download?creator=geo&file=' + fhcode + '.geojson'
const url = 'https://www.hndyjqrh.cn/api/multialarm/pic/download?creator=geo&file=' + fhcode + '.geojson'
fetch(url).then(response => {
var status = response["status"]
if (status == "500") {
return new Promise((resovle) => {
resovle("无数据");
})
} else {
return response.text();
}
}).then(data => {
api.post('multialarm/system/alarm/total', {
name: localStorage.getItem('loginname'),
parent: fhcode,
}).then((res) => {
if (res.code == 0) {
const myChart = echarts.init(document.getElementById('myMap'));
myChart.dispose();
initMapdt(data, res.data,tree4data.find(element => element.code == fhcode)['title'])
// ado.hideLoading()
}
})
});
}
};
//详情
const row3data = ref();
const showrow3data = ref();
const dialogVisible3 = ref(false);
const row3 = (row) => {
showrow3data.value = row3data.value[row.rowIndex]
dialogVisible3.value = true;
};
//查询当日预警
const config3 = reactive({
header: ['时间', '事件', '位置'],
waitTime: 3000,
rowNum: 6,
columnWidth: [220, 150, 200],
headerHeight: 38,
data: [
],
headerBGC: '#174F8A',
oddRowBGC: '#2C5784',
evenRowBGC: 'F3FDFF',
index: false,
align: ['left', 'center', 'center', 'center'],
});
const getAi = (city, district, town) => {
api.post('/multialarm/ai/alarm/getlist/today', {
name: localStorage.getItem('loginname'),
city: city == '湖南省' ? null : city,
district: district,
town: town,
}).then((res) => {
if (res.code == 0) {
row3data.value = res.data;
let arr = [];
res.data.forEach((x) => {
arr.push([x.timestamp, x.alarmName, x.address])
})
// res.data.forEach((x)={
// })
config3.data = arr;
} else {
}
})
};
//2.3.5查询近7天报警数量
const drzs = ref({});
const getdayline = (city, district, town) => {
api.post('multialarm/system/alarm/count/dayline', {
name: localStorage.getItem('loginname'),
city: city == '湖南省' ? null : city,
district: district,
town: town,
start: day().format('YYYY-MM-DD HH:mm:ss'),
before: 1,
}).then((res) => {
if (res.code == 0) {
drzs.value = res.data[6];
initMap2(res.data);
} else {
}
})
};
//详情
const dialogVisible2 = ref(false);
const row2data = ref();
const showrow2data = ref();
const row2 = (row) => {
showrow2data.value = row2data.value[row.rowIndex]
dialogVisible2.value = true;
};
//查询指定区域的当天所有警报事件列表
const config2 = reactive({
header: ['时间', '类型', '报警单位', '地点'],
waitTime: 3000,
rowNum: 6,
columnWidth: [180, 100, 130, 180],
headerHeight: 38,
data: [
],
headerBGC: '#174F8A',
oddRowBGC: '#2C5784',
evenRowBGC: 'F3FDFF',
index: false,
align: ['left', 'left', 'left', 'left'],
});
const getaiyuji = (city, district, town) => {
api.post('multialarm/client/sensor/alarm_event/getlist/today', {
name: localStorage.getItem('loginname'),
city: city == '湖南省' ? '' : city,
district: district,
town: town,
}).then((res) => {
if (res.code == 0) {
row2data.value = res.data;
let arr = [];
res.data.forEach((x) => {
arr.push([x.timestamp, x.alarmCode, x.station, x.address])
})
config2.data = arr;
} else {
}
})
};
//01
const getNthChar = (str, n) => {
let str1 = str.split("").reverse().join("")
return str1.charAt(n) || '0';
};
const data1 = ref({});
const get1 = (city, district, town) => {
api.post('multialarm/system/count/devices', {
name: localStorage.getItem('loginname'),
city: city,
district: district,
town: town,
}).then((res) => {
if (res.code == 0) {
data1.value = res.data;
initMap(res.data);
} else {
}
})
};
const config1 = ref({});
const get3 = (city, district, town) => {
api.post('/multialarm/system/station/summary', {
name: localStorage.getItem('loginname'),
city: city,
district: district,
town: town,
}).then((res) => {
if (res.code == 0) {
initMap1(res.data)
config1.value = {
header: ['行业名称', '总数', '在线总数', '在线率'],
waitTime: 3000,
rowNum: 2,
columnWidth: [150, 120, 180, 120],
headerHeight: 28,
data: [
['党政机关', res.data[0]['total'], res.data[0]['lineOnTotal'], res.data[0]['lineOnTotal'] == 0 ? '0%' : (res.data[0]['lineOnTotal'] / res.data[0]['total']) * 100 + '%'],
['金融机构', res.data[2]['total'], res.data[2]['lineOnTotal'], res.data[2]['lineOnTotal'] == 0 ? '0%' : (res.data[2]['lineOnTotal'] / res.data[2]['total']) * 100 + '%'],
['医疗单位', res.data[3]['total'], res.data[3]['lineOnTotal'], res.data[3]['lineOnTotal'] == 0 ? '0%' : (res.data[3]['lineOnTotal'] / res.data[3]['total']) * 100 + '%'],
['中小学', res.data[1]['total'], res.data[1]['lineOnTotal'], res.data[1]['lineOnTotal'] == 0 ? '0%' : (res.data[1]['lineOnTotal'] / res.data[1]['total']) * 100 + '%'],
['其他', res.data[4]['total'], res.data[4]['lineOnTotal'], res.data[4]['lineOnTotal'] == 0 ? '0%' : (res.data[4]['lineOnTotal'] / res.data[4]['total']) * 100 + '%'],
],
headerBGC: '#174F8A',
oddRowBGC: '#2C5784',
evenRowBGC: 'F3FDFF',
index: false,
align: ['left', 'left', 'left', 'left'],
}
// initMap(res.data);
} else {
}
})
};
const convertData = (data) => {
var res = [];
for (var i = 0; i < data.length; i++) {
var dataItem = data[i];
var fromCoord = chinaGeoCoordMap[dataItem[0].name];
var toCoord = [116.4551, 40.2539];
if (fromCoord && toCoord) {
res.push([{
coord: fromCoord,
value: dataItem[0].value
}, {
coord: toCoord,
}]);
}
}
return res;
};
var mapJson = '';
const flattenTree = (treeData) => {
const result = [];
function traverse(node) {
if (node.children && node.children.length > 0) {
for (const child of node.children) {
traverse(child);
}
}
delete node.children
result.push(node);
}
traverse(treeData);
return result;
};
const maptitle = ref('');
const initMapdt = (data, podat,nameb) => {
var tree4data = flattenTree(JSON.parse(localStorage.getItem('tree4data')));
// maptitle.value = tree4data.find(element => element.code == JSON.parse(data)['name'])['title'];
maptitle.value = nameb;
localStorage.setItem('nowCode', JSON.parse(data)['name'])
const myChart = echarts.init(document.getElementById('myMap'));
// myChart.showLoading();
// myChart.hideLoading();
let langarr = JSON.parse(data)['features'];
langarr.forEach((x, i) => {
})
echarts.registerMap('myMap', data);
var option = {
tooltip: {
trigger: 'item',
textStyle: { fontSize: '14', color: '#fff', fontFamily: 'Arial' },
backgroundColor: '#092b6a',
formatter: (params) => {
let datat = podat;
let itemWithId2 = datat.children.find(item => item.grope === params.name);
if (itemWithId2 == null || itemWithId2 == undefined) {
return '<br /> 报警:' + '0' + '<br /> 警情:' + '0' + ' <br /> AI预警:' + '0'
} else {
return '<br /> 报警:' + itemWithId2.alarmCount + '<br /> 警情:' + itemWithId2.caseCount + ' <br /> AI预警:' + itemWithId2.aiCount
}
}
},
series: [
{
type: 'map3D',
name: '地图',
selectedMode: 'single', // 地图高亮单选
regionHeight: 1, // 地图高度
map: 'myMap',
viewControl: {
distance: 168, // 地图视角 控制初始大小
alpha: 180,// 倾斜角度
rotateSensitivity: 0,
},
label: {
show: true, // 是否显示名字
color: '#fff', // 文字颜色
fontSize: 15, // 文字大小
fontWeight: 'bold', // 文字大小
},
itemStyle: {
color: '#0A3E77', // 地图背景颜色
borderWidth: 1, // 分界线wdith
borderColor: '#a4d8f0', // 分界线颜色
opacity: 0.9
},
emphasis: {
label: {
show: true, // 是否显示高亮
textStyle: {
color: '#fff' // 高亮文字颜色
}
},
itemStyle: {
color: '#3a69c1', // 地图高亮颜色
borderWidth: 10, // 分界线wdith
borderColor: '#6BECF5'// 分界线颜色
}
},
light: {
main: {
color: '#fff',
intensity: 1,
shadow: true,
shadowQuality: 'high',
alpha: 25, //
beta: 20
},
ambient: {
color: '#fff',
intensity: 0.6
}
},
lines3D: {
show: true,
data: [
{
coords: [
[111.51, 29.02], // 起点坐标
[109.22793, 29.12239] // 终点坐标
],
lineStyle: {
width: 2,
color: '#fff'
}
}
// 可以添加更多的线条
]
}
},
]
};
myChart.setOption(option);
window.addEventListener('resize', function () {
myChart.resize();
});
myChart.on('click', (x) => {
// let tree4data = flattenTree(JSON.parse(localStorage.getItem('tree4data')));
tree4data.forEach((item) => {
if (item.stationId === undefined) {
if (item.code.length < 9) {
if (x.name == item.title) {
myChart.dispose();
let ado = echarts.init(document.getElementById('myMap'));
ado.showLoading({
text: '地图加载中',
color: '#09A2DC', //设置加载颜色
textColor: '#09A2DC',
maskColor: 'rgba(255, 255, 255, 0.2)',
zlevel: 0
})
get1(x.name, '', '');
get3(x.name, '', '');
getaiyuji(x.name, '', '');
getdayline(x.name, '', '');
getAi(x.name, '', '');
//item.code
// const url = 'https://www.hndyjqrh.cn:8083/multialarm/pic/download?creator=geo&file=' + item.code + '.geojson'
const url = 'https://www.hndyjqrh.cn/api/multialarm/pic/download?creator=geo&file=' + item.code + '.geojson'
fetch(url).then(response => {
var status = response["status"]
if (status == "500") {
return new Promise((resovle) => {
resovle("无数据");
})
} else {
return response.text();
}
}).then(data => {
api.post('multialarm/system/alarm/total', {
name: localStorage.getItem('loginname'),
parent: item.code,
}).then((res) => {
if (res.code == 0) {
initMapdt(data, res.data,x.name)
ado.hideLoading();
}
})
});
}
}
}
})
})
};
const initMap = (data1) => {
const domMap = document.getElementById("EcharRef");
domMap.removeAttribute("_echarts_instance_");
const myChart = echarts.init(domMap);
var option = {
tooltip: {
trigger: 'item'
},
legend: {
top: '15px',
left: '230px',
orient: 'vertical',
type: 'scroll',
itemHeight: 5,
textStyle: {
color: '#fff'
}
},
series: [
{
type: 'pie',
radius: ['45%', '70%'],
avoidLabelOverlap: false,
label: {
show: false,
position: 'right'
},
emphasis: {
label: {
show: true,
fontSize: 12,
fontWeight: 'bold',
color: '#fff'
}
},
labelLine: {
show: true,
},
center: ['35%', '50%'],
data: [
{ value: data1.alarmPointZone, name: '防区报警' },
{ value: data1.alarmPointTalk, name: '对讲报警' },
{ value: data1.mdevTotal, name: '移动报警' },
{ value: data1.alarmPointPushButton, name: '一键报警' },
{ value: data1.ipcTotal, name: '报警复合' }
]
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
};
const initMap1 = (data1) => {
const domMap = document.getElementById("EcharRef1");
domMap.removeAttribute("_echarts_instance_");
const myChart = echarts.init(domMap);
var option = {
tooltip: {
trigger: 'item'
},
xAxis: {
type: 'category',
splitLine: {
show: false //去掉网格线
},
axisLine: {//这是y轴文字颜色
lineStyle: {
color: "#fff",
},
},
data: ['党政机关', '金融机构', '医疗单位', '中小学', '其他'],
axisLabel: {
formatter: val => {
let txt = val
if (val.length > 4) {
txt = val.substr(0, 4) + '...'
}
return txt
}
}
},
grid: {
top: '8%',
left: '1%',
right: '1%',
bottom: '3%',
containLabel: true
},
yAxis: {
type: 'value',
axisLine: {//这是y轴文字颜色
lineStyle: {
color: "#fff",
},
},
splitLine: { // 设置x轴轴线相关配置
show: false // 不显示x轴轴线
},
},
series: [
{
barWidth: '24%',
data: [data1[0]['total'], data1[2]['total'], data1[3]['total'], data1[1]['total'], data1[4]['total']],
type: 'bar',
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: '#0386F6' // 起始颜色(红)
}, {
offset: 1,
color: '#0FBBC4' // 结束颜色(蓝)
}])
}
}
}
]
};
myChart.setOption(option);
};
const initMap2 = (arr) => {
let time = [];
let data1 = [];
let data2 = [];
arr.forEach(x => {
time.push(x.month + '-' + x.day);
data1.push(parseInt(x.countAlarm))
data2.push(parseInt(x.countCase))
})
const domMap = document.getElementById("EcharRef2");
domMap.removeAttribute("_echarts_instance_");
const myChart = echarts.init(domMap);
var option = {
tooltip: {
trigger: 'item',
formatter: (params) => {
return '警情数量:' + params.seriesIndex + '<br /> 报警次数:' + params.data
}
},
grid: {
top: '15%',
left: '1%',
right: '1%',
bottom: '3%',
containLabel: true
},
legend: {
data: [{
name: '报警次数',
textStyle: {
color: '#fff'
},
}, {
name: '警情数量',
textStyle: {
color: '#fff'
},
}]
},
xAxis: [
{
type: 'category',
splitLine: {
show: false //去掉网格线
},
data: time,
axisLine: {//这是y轴文字颜色
lineStyle: {
color: "#fff",
},
},
axisPointer: {
type: 'shadow'
}
}
],
yAxis: [
{
type: 'value',
name: '',
min: 0,
// max: 250,
interval: 50,
splitLine: { // 设置x轴轴线相关配置
show: false // 不显示x轴轴线
},
axisLine: {//这是y轴文字颜色
lineStyle: {
color: "#fff",
},
},
axisLabel: {
formatter: '{value}次'
}
},
{
type: 'value',
min: 0,
splitLine: { // 设置x轴轴线相关配置
show: false // 不显示x轴轴线
},
max: 25,
interval: 5,
axisLabel: {
formatter: ''
}
}
],
series: [
{
name: '报警次数',
type: 'bar',
tooltip: {
valueFormatter: function (value) {
// return value + ' ml';
}
},
barWidth: '24%',
itemStyle: {
color: '#3F7AD1' // 设置折线的颜色为红色
},
data: data1,
},
{
name: '警情数量',
type: 'line',
smooth: true,
yAxisIndex: 1,
tooltip: {
valueFormatter: function (value) {
// return value + '°C';
}
},
itemStyle: {
color: '#81A2CF' // 设置折线的颜色为红色
},
data: data2,
}
]
};
myChart.setOption(option);
};
</script>
<style scoped lang="scss">
:deep(.dv-scroll-board .header) {
font-size: 13px;
}
:deep(.dv-scroll-board .rows .row-item) {
font-size: 12px;
}
:deep(.el-descriptions) {
width: 98%;
margin: 10px auto;
text-align: center;
border: 1px solid #1F9BD9;
--el-descriptions-table-border: {
1px solid #1F9BD9
}
;
--el-descriptions-item-bordered-label-background: {
transparent
}
;
}
:deep(.el-descriptions__body) {
background: transparent;
}
:deep(.el-descriptions__label) {
width: 130px;
color: rgb(12, 214, 254);
background: transparent;
}
:deep(.el-descriptions__content.el-descriptions__cell.is-bordered-content) {
color: #fff;
}
:deep(.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell) {
border: 1px solid #1F9BD9;
}
:deep(.el-dialog__body) {
padding: 10px;
color: #fff;
}
.uploadBtn .el-button {
background-color: transparent;
border-color: #1F9BD9;
color: #1F9BD9;
}
.uploadBtn .el-button i {
font-size: 16px;
margin-right: 3px;
}
.uploadBtn .el-button:hover {
color: rgb(12, 214, 254);
border: 1px solid rgb(12, 214, 254);
}
:deep(.el-dialog) {
--el-dialog-bg-color: #071D4D;
border: 3px solid #387dbf;
}
:deep(.el-dialog__header) {
padding: 13px;
border-bottom: 1px solid #3374b4 !important;
margin-right: 0px;
}
:deep(.el-dialog__title) {
color: #067bc1 !important;
font-weight: 500;
}
:deep(.el-input__inner) {
color: #000;
}
:deep(.el-dialog__headerbtn .el-dialog__close) {
color: #fff;
font-weight: 500;
font-size: 18px;
}
.tabs_a {
background-image: url(./indeximag/able.jpg);
background-size: 100% 100%;
}
:deep(.el-tabs__nav-wrap) {
margin-bottom: 1px;
}
:deep(.el-tabs--border-card>.el-tabs__content) {
height: calc(100% - 40px);
background: red;
padding: 0px;
}
:deep(.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active) {
color: #d1dbe5;
background-color: #29d;
border-right-color: #29d;
border-left-color: #29d;
}
:deep(.el-tabs--border-card>.el-tabs__header) {
background-color: transparent;
border-bottom: none;
}
:deep(.el-tabs--border-card) {
background: #022C54;
border: none;
}
:deep(.el-progress-bar__outer) {
background-color: #174771;
}
:deep(.el-progress-bar__inner) {
background-color: #3BC5F3;
}
.title1 {
width: 100%;
height: 30px;
background-image: url(./indeximag/一级标题.png);
background-size: 100% 100%;
line-height: 30px;
}
.fp {
background-image: url(./indeximag/数字背景.png);
width: 15px;
height: 22px;
display: inline-block;
background-size: 100% 100%;
line-height: 22px;
text-align: center;
margin-right: 10px;
font-size: 13px;
font-weight: 500;
}
.box {
width: 100%;
height: 100%;
display: flex;
background-color: #022C54;
.left {
width: 450px;
height: 98%;
margin-top: 0.5%;
margin-left: 0.5%;
border: 1px solid #3876B9;
.left_top {
width: 97%;
height: 33%;
padding: 5px;
}
.left_cen {
width: 97%;
height: 33%;
padding: 5px;
}
.left_bottm {
width: 97%;
height: 33%;
padding: 5px;
}
}
.right {
width: 450px;
height: 98%;
margin-top: 0.5%;
border: 1px solid #3876B9;
margin-right: 5px;
.right_top {
width: 97%;
height: 33%;
padding: 5px;
}
.right_cen {
width: 97%;
height: 33%;
padding: 5px;
}
.right_bottm {
width: 97%;
2024-08-06 15:35:51 +08:00
height: 35%;
2024-07-22 11:11:43 +08:00
padding: 5px;
}
}
.cen {
width: calc(100% - 900px);
height: 98%;
margin-top: 0.5%;
margin-left: 0.5%;
margin-right: 0.5%;
border: 1px solid #3876B9;
background-image: url(./indeximag/able.jpg);
background-size: 100% 100%;
}
}
</style>