$(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}人员类别统计
{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 + '
'; //x轴的名称 } htmlStr += '
'; htmlStr += ''; //一个点 htmlStr += seriesName + ':' + value + '人'; //圆点后面显示的文本 htmlStr += '
'; } 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 += "
" html += "" + (i + 1) + "" html += "" +data.equipList[i].deviceType+ "" html += "" +data.equipList[i].deviceAddress+ "" html += "" + idMap.get(data.equipList[i].equipType) + "" html += "" +data.equipList[i].alarmTime+ "" html += "
" } $(".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 }); }