jyyhq/witDisplay/js/googlealarm/googlealarm.js

771 lines
22 KiB
JavaScript
Raw Permalink Normal View History

2025-02-10 12:18:11 +08:00
$(function () {
Interface();
//告警详情
// deviceWarnClick();
})
//接口
function Interface(){
$.ajax({
type: 'POST',
url: dataUrl + "securityPrevent/getFireAlarm",
data: "",
dataType: 'json',
// async:false,
success: function(res) {
let data = res.obj;
document.getElementById('Total').innerText = data.totalDevices;
document.getElementById('year').innerText = data.fireNum;
document.getElementById('month').innerText = data.monthNum;
document.getElementById('Today').innerText = data.todayNum;
document.getElementById('alarmEquipNum').innerText = data.alarmEquipNum;
//设备占比
Proportion(data);
//近十二个月警告
deviceWarnData(data);
//消防数量
fireNum(data);
//今日告警表格
WarningList(data);
},
});
}
//设备占比
function Proportion(data){
var myChart = echarts.init(document.getElementById('equipment'));
// 复制代码
// const chartData = [
// {
// value: 38,
// name: "点型烟感",
// },
// {
// value: 145,
// name: "消防栓",
// },
// {
// value: 45,
// name: "火灾显示盘",
// },
// {
// value: 21,
// name: "消防广播",
// },
// {
// value: 51,
// name: "讯响器",
// },
// {
// value: 9,
// name: "其他",
// },
// ];
const chartData = data.equipInfo;
const colorList = ['#fba75a', '#00d1c8', '#23be72', '#f9da4f', '#7d5afb', '#5aaefb'];
const sum = chartData.reduce((per, cur) => per + cur.value, 0);
const gap = (1 * sum) / 100;
const pieData1 = [];
const pieData2 = [];
const gapData = {
name: "",
value: gap,
itemStyle: {
color: "transparent",
},
};
//图标位置显示
let lefts = ["10%", "10%", "10%", "74%", "74%", "74%"];
let tops = ["24%", "40%", "58%", "24%", "40%", "58%"];
let legendData = [];
let total = 0;
chartData.forEach((item) => {
total += item.value;
});
for (let i = 0; i < chartData.length; i++) {
// 第一圈数据
pieData1.push({
...chartData[i],
itemStyle: {
borderRadius: 10,
},
});
pieData1.push(gapData);
// 第二圈数据
pieData2.push({
...chartData[i],
itemStyle: {
color: colorList[i],
opacity: 0.21,
},
});
pieData2.push(gapData);
// 分散图例
let bfb = parseInt((chartData[i].value / total) * 100) + "%";
legendData.push({
show: true,
icon: "circle", //'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none'
left: lefts[i],
top: tops[i],
itemStyle: {
color: colorList[i],
},
formatter:
`{aa| ` + chartData[i].name + ` }` + `\n\n` + `{bb| ` + bfb + `}`, // 也可以是个函数return
x: "left",
textStyle: {
// color: "#BAFF7F",
rich: {
aa: {
color: "#ffffff",
fontSize: 16,
},
bb: {
color: colorList[i],
fontSize: 16,
},
},
},
data: [chartData[i].name],
});
}
// console.log("pieData2---------", pieData2);
option = {
backgroundColor: 'transparent',
title: {
text: "设备占比",
left: '5%',
top: 'top',
// itemGap:15,
textStyle: {
color: "#f5f5f6",
fontSize: 15,
fontWeight: "bold",
},
},
// backgroundColor: "#0F141B",
tooltip: {
show: true,
backgroundColor: "rgba(0, 0, 0,.8)",
textStyle: {
color: "#fff",
},
},
legend: legendData,
grid: {
top: 30,
right: 20,
bottom: 10,
left: 10,
},
color: colorList,
graphic: [
{
type: 'image', // 图片元素
left: '2%', // 左对齐
top: 'top', // 垂直居中
style: {
image: '../../img/googlealarm/Group.png', // 设置图标路径
width: 20, // 图标宽度
height: 20, // 图标高度
},
},
{
type: 'text', // 文本元素
left: '44.5%', // 水平居中
top: 'middle', // 垂直居中
style: {
text: sum, // 显示的文本内容为80
fill: '#f5f5f6', // 文本颜色
fontSize: 50, // 文本字号
fontWeight: 'bold', // 文本粗细
},
},
],
series: [
{
name: '',
type: 'pie',
roundCap: true,
radius: ['76%', '80%'],
center: ['50%', '50%'],
label: {
show: false
},
labelLine: {
show: false
},
data: pieData1
},
{
type: 'pie',
radius: ['76%', '70%'],
center: ['50%', '50%'],
gap: 1.71,
label: {
show: false
},
labelLine: {
show: false
},
silent: true,
data: pieData2
},
{
type: 'gauge',
zlevel: 2,
splitNumber: 90,
radius: '60%',
center: ['50%', '50%'],
startAngle: 90,
endAngle: -269.9999,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
show: false,
},
splitLine: {
show: true,
length: 7,
lineStyle: {
width: 4,
color: 'rgb(33,85,130)',
},
},
pointer: {
show: 0,
},
detail: {
show: 0,
},
},
{
type: 'pie',
center: ['50%', '50%'],
radius: [0, '45.6%'],
label: {
show: false
},
labelLine: {
show: false
},
itemStyle: {
color: 'rgba(75, 126, 203,.1)'
},
silent: true,
data: [
{
value: 100,
name: ''
}
]
}
],
};
myChart.setOption(option);
}
//近十二个月警告
function deviceWarnData(data){
var myChart = echarts.init(document.getElementById('december'));
const currentDate = new Date();
// 存放最近12个月日期的数组
let myData1 = [];
let count1 = [];
let count3 = [];
const eclice = data.fireAlarm;
// 逐个生成并添加最近12个月的日期到数组
for (let i = 11; i >= 0; i--) {
let year = currentDate.getFullYear();
let month = currentDate.getMonth() - i;
if (month < 0) {
year -= 1;
month += 12;
}
myData1.unshift(new Date(year, month, 1));
}
function formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
return `${year}-${month}`;
}
// 将日期格式化成字符串,方便后面的比较
const myData1String = myData1.map(date => formatDate(date));
// 初始化 count1 和 count3 数组
count1 = Array.from({length: 12}, () => 0);
count3 = Array.from({length: 12}, () => 0);
// 遍历最近12个月的日期数组
for (let i = 0; i < myData1String.length; i++) {
const dateStr = myData1String[i];
// 查找 eclice 中是否有对应的数据
const ecliceDataIndex = eclice.findIndex(item => item.month === dateStr);
if (ecliceDataIndex !== -1) {
count1[i] = eclice[ecliceDataIndex].count1;
count3[i] = eclice[ecliceDataIndex].count3;
}
}
// count1.push(count1.shift());
// count3.push(count3.shift());
function shiftArray(arr) {
var newArr = [];
for (var i = arr.length - 1; i >= 0; i--) {
newArr.push(arr[i]);
}
return newArr;
}
option = {
backgroundColor: 'transparent',
title: {
text: "近十二个月警告",
left: '5%',
top: 'top',
// itemGap:15,
textStyle: {
color: "#f5f5f6",
fontSize: 15,
fontWeight: "bold",
},
},
tooltip: {
show: true,
trigger: 'axis',
textStyle: {
color: '#fff',
fontSize: 14
},
backgroundColor: 'rgba(18, 57, 60, .8)', //设置背景颜色
axisPointer: {
lineStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0,
color: 'rgba(0, 255, 233,0)'
}, {
offset: 0.5,
color: 'rgba(255, 255, 255,1)',
}, {
offset: 1,
color: 'rgba(0, 255, 233,0)'
}],
global: false
}
},
},
borderColor: "rgba(18, 57, 60, .8)",
// formatter: "{b}人员类别统计<br>{c}人"
formatter: function(params, ticket, callback) {
var htmlStr = '';
for (var i = 0; i < params.length; i++) {
var param = params[i];
var xName = param.name + '的告警数量'; //x轴的名称
var seriesName = param.seriesName; //图例名称
var value = param.value; //y轴值
var color = param.color; //图例颜色
if (i === 0) {
htmlStr += xName + '<br/>'; //x轴的名称
}
htmlStr += '<div>';
htmlStr +=
'<span style="margin-right:5px;display:inline-block;width:10px;height:10px;border-radius:5px;background-color:' +
color + ';"></span>'; //一个点
htmlStr += seriesName + '' + value + '人'; //圆点后面显示的文本
htmlStr += '</div>';
}
return htmlStr;
}
},
color: ['#1ed6ff', '#36f097',],
legend: {
// icon: 'circle',
// itemWidth: 10,
itemGap: 4,
x: 'right',
top: '3%',
textStyle: {
color: '#fff',
fontSize: 13,
// padding:[0, 6, 0, 6],
}
},
grid: {
top: '18%',
left: '1%',
right: '4%',
bottom: '2%',
containLabel: true,
},
xAxis: [{
type: 'category',
axisLine: {
lineStyle: {
color: '#36f097'
}
},
axisLabel: {
interval: 0,
align: 'center',
rotate: '40',
margin: '25',
textStyle: {
fontSize: 13,
color: '#fff'
}
},
splitLine: {
show: false,
},
axisTick: {
show: false
},
boundaryGap: false,
data: shiftArray(myData1String) , //this.$moment(data.times).format("HH-mm") ,
}, ],
yAxis: [{
type: 'value',
// min: 0,
// max: 600,
splitNumber: 6,
axisLine: {
lineStyle: {
color: '#36f097'
}
},
splitLine: {
show: true,
lineStyle: {
color: 'rgba(28, 130, 197, .3)',
type: 'solid'
},
},
axisLabel: {
color: '#DEEBFF',
textStyle: {
fontSize: 12
}
},
axisTick: {
show: false
}
}, ],
graphic: [
{
type: 'image', // 图片元素
left: '2%', // 左对齐
top: 'top', // 垂直居中
style: {
image: '../../img/googlealarm/Group.png', // 设置图标路径
width: 20, // 图标宽度
height: 20, // 图标高度
},
},
],
series: [{
name: '一号楼',
type: 'line',
showSymbol: true,
symbolSize: 8,
lineStyle: {
normal: {
color: '#1ed6ff',
},
},
itemStyle: {
color: '#1ed6ff',
borderColor: '#1ed6ff',
borderWidth: 2,
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[{
offset: 0,
color: 'rgb(30, 214, 255)',
},
{
offset: 1,
color: 'rgba(9, 246, 255, .2)',
},
],
false
),
},
},
data: shiftArray(count1) , //data.values
},
{
name: '三号楼',
type: 'line',
showSymbol: true,
symbolSize: 8,
lineStyle: {
normal: {
color: '#36f097',
},
},
itemStyle: {
color: '#36f097',
borderColor: '#36f097',
borderWidth: 2,
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[{
offset: 0,
color: 'rgb(54, 240 ,151)',
},
{
offset: 1,
color: 'rgba(62, 80, 251, .2)',
},
],
false
),
},
},
data: shiftArray(count3) , //data.values
}
],
};
myChart.setOption(option);
}
//消防数量
function fireNum(data){
const myChart = echarts.init(document.getElementById('number-type'));
// var datas = [
// {
// value: 100,
// name: '典型烟感',
// },
// {
// value: 96,
// name: '手动按钮',
// },
// {
// value: 89,
// name: '紧急照明',
// },
// {
// value: 75,
// name: '照明配电',
// },
// {
// value: 56,
// name: '消火栓',
// },
// {
// value: 29,
// name: '讯响器',
// },
// {
// value: 29,
// name: '消防广播 ',
// },
// ];
var datas = data.equipInfo;
var maxArr = new Array(datas.length).fill(100);
option = {
backgroundColor: 'transparent',
grid: {
left: 10,
right:10,
bottom: 0,
top:0,
containLabel: true,
},
tooltip: {
trigger: 'item',
axisPointer: {
type: 'none',
},
formatter: function (params) {
return params.data.name + ' : ' + params.data.value;
},
},
xAxis: {
show: false,
type: 'value',
},
yAxis: [
{
type: 'category',
inverse: true,
axisLabel: {
show: true,
align: 'right',
textStyle: {
fontSize: 18,
color: 'rgb(255,255,255)',
rich: {
name: {
padding: [0,10,0,20],
width:50,
borderWidth:1,
align: 'left',
},
},
},
formatter: (name) => {
var index = datas.map((item) => item.name).indexOf(name) + 1;
return [
'{' + 'index' + '|' +'NO.'+ index + '}',
'{name|' + name + '}',
].join('');
},
},
splitLine: {
show: false,
},
axisTick: {
show: false,
},
axisLine: {
show: false,
},
data: datas.map((item) => item.name),
},
{
type:'category',
inverse: true,
axisLabel:{
show:true,
margin:30,//右侧y轴数字的外边距
textStyle: {
fontSize: 16,
color: 'rgb(255,255,255)',
},
formatter: (value) => {
return value +'个'
},
},
splitLine: {
show: false,
},
axisTick: {
show: false,
},
axisLine: {
show: false,
},
data: datas.map((item) => {
return item.value
}),
}
],
series: [
{
name: '值',
type: 'bar',
zlevel: 1,
showBackground: true,
// 柱状条上方的白色线条
label: {
show: true,
position: 'right', // 位置
color: '#fff',
fontSize: 14,
fontWeight:'bold',
distance: -1, // 字与条形图bar 的距离
formatter: '|', // 这里是数据展示的时候显示的数据
},
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{
offset: 0,
color: '#3cf0f1',
},
{
offset: 1,
color: '#67b1f5',
},
]),
},
},
barWidth: 14,
data: datas,
},
],
};
myChart.setOption(option);
}
const idMap = new Map([
["1", "火警"],
["2", "故障"],
["3", "动作"],
["4", ""],
["5", "启动"],
["6", "停动"],
["7", "隔离"],
["8", "释放"],
["9", "主电备电恢复"]
])
//今日告警表格
function WarningList(data){
let equipNum = 6;
if(data.equipList.length < equipNum){
equipNum = data.equipList.length;
}
let html = ""
for (var i = 0; i < equipNum; i++) {
html += "<div style='font-size: 12px'>"
html += "<span>" + (i + 1) + "</span>"
html += "<span>" +data.equipList[i].deviceType+ "</span>"
html += "<span>" +data.equipList[i].deviceAddress+ "</span>"
html += "<span>" + idMap.get(data.equipList[i].equipType) + "</span>"
html += "<span>" +data.equipList[i].alarmTime+ "</span>"
html += "</div>"
}
$(".down>.up-down").append(html)
}
//告警详情
function deviceWarnClick(){
var index = layer.open({
title: ['告警详情', 'color: #fff; cursor: move;background: transparent;float: left;'],
type: 2,
closeBtn: 2,
content: '../../page/googlealarm/googlealarmFrom.html',
area: ["70%", "96%"],
maxmin: false
});
}