var url=\'<c:url value=\'/deviceActChart\' />\'; $.get(url,{ devId:row.devId, beginDate:beginStr, endDate:endStr, field:field }, function(data){ console.log(data); timeArr=data.time; var max=timeArr.length-1; var isScroll=false; if(max>20){ isScroll=true; max=20; } //根据field判断需要生成的折线图 if(field=="mainFanStatus"){ charData=data.mainfandata; fieldName="主风机状态"; }else if(field=="outdoorFanStatus"){ charData=data.outdoorfandata; fieldName="外风机状态"; }else if(field=="ac1Status"){ charData=data.ac1data; fieldName="空调一状态"; }else if(field=="ac2Status"){ charData=data.ac2data; fieldName="空调二状态"; }else if(field=="ac3Status"){ charData=data.ac3data; fieldName="空调三状态"; }else{ return; } //console.log(data.time); chart=Highcharts.chart(\'container\', { title: { text: row.devName+fieldName+\'折线图\' }, legend:{
//图例 enabled:false }, credits:{
//版权信息 enabled:false }, exporting:{ enabled:false//导出模块 }, /* plotOptions:{ series:{ color:\'blue\' } }, */ tooltip:{ formatter:function(){ return "时间:"+formatDate(this.x)+"<br/>"+ "状态:"+formatActStatus(this.y); } }, xAxis: { categories: timeArr,//坐标轴的分类 type: \'datetime\', labels: { formatter:function(){ //var xdate=new Date(this.value); return formatDate(new Date(this.value)).substring(2,16); } }, min:0, max:max//设置坐标最大值 }, scrollbar:{ enabled:isScroll,//通过定义变量动态控制是否产生滚动条 showFull:false }, yAxis:{ categories: [0,1], labels: { formatter:function(){ if(this.value ==1) { return "开机"; }else if(this.value ==0) { return "关机"; } } }, title:{ text:\'设备动作\' } }, series: [{ data: charData, color: \'blue\', threshold:0.01,//设置阀值 negativeColor: \'red\' }] },function(c){ if(isScroll){
//将产生的滚动条滚动到最右边显示 c.xAxis[0].setExtremes(charData.length-20,charData.length-1); } }); $("#reportDialog").dialog("open").dialog("setTitle", "设备状态折线图"); },"json");
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>设备报警状态变化报表</title> <sec:authentication property="principal" var="currentUser" /> <%@ include file="/WEB-INF/views/shared/script.jsp"%> <script> var beginStr; var endStr; var charData; var timeArr; var fieldName; var chart=null; $(function(){ $("#begindate").datetimebox(\'setValue\',formatDate(subOneDay(new Date()))); $("#enddate").datetimebox(\'setValue\',formatDate(new Date())); checkDate(); $("#oname").combotree({ url:"<c:url value=\'/orgs.json/\' />", width:170, method:\'get\', onClick:function(node){ $("#oid").val(node.attributes.orgId); searchDevice(); }, onLoadSuccess:function(row,data){ var root=$("#oname").combotree(\'tree\').tree(\'getRoot\'); $("#oname").combotree(\'tree\').tree("expand",root.target); } }); $("#oname").combotree(\'setValue\',\'${currentUser.orgName}\'); $("#dg").datagrid({ fit:true, fitColumns:false, pageSize:20, border:false, rownumbers:true, pagination:true, singleSelect:false, url:\'<c:url value=\'/alarmStatus.json\' />\', method:\'get\', queryParams:{ orgId:$(\'#oid\').val(), beginDate:beginStr, endDate:endStr, containSub:$(\'#containSub\').is(\':checked\') }, toolbar:\'#tbDevice\', columns:[[ {field:\'cku\',checkbox:true}, {field:\'orgId\',title:\'机构id\',align:\'center\',hidden:true}, {field:\'orgName\',title:\'机构\',align:\'center\',width:90}, {field:\'devName\',title:\'设备名称\',align:\'center\',width:130}, {field:\'macAddr\',title:\'硬件地址\',align:\'center\',width:110}, {field:\'geoAddr\',title:\'机房地址\',align:\'center\',width:150}, {field:\'outdoorTempSensorAlert\',title:\'室外温感报警\',align:\'center\',styler:function(){return \'background-color:#EEE8AA;color:black;\';},width:90,formatter:formatterAct}, {field:\'indoorTempSensorAlert\',title:\'室内温感报警\',align:\'center\',styler:function(){return \'background-color:#EEE8AA;color:black;\';},width:90,formatter:formatterAct}, {field:\'fanAlarmAlert\',title:\'风机故障报警\',align:\'center\',styler:function(){return \'background-color:#EEE8AA;color:black;\';},width:100,formatter:formatterAct}, {field:\'highTempAlarmAlert\',title:\'高温报警\',align:\'center\',styler:function(){return \'background-color:#EEE8AA;color:black;\';},width:100,formatter:formatterAct}, {field:\'lowTempAlarmAlert\',title:\'低温报警\',align:\'center\',styler:function(){return \'background-color:#EEE8AA;color:black;\';},width:100,formatter:formatterAct}, {field:\'voltageAlarmAlert\',title:\'电压过高/过低报警\',align:\'center\',styler:function(){return \'background-color:#EEE8AA;color:black;\';},width:150,formatter:formatterAct}, {field:\'ac1DownAlert\',title:\'空调一失效报警\',align:\'center\',styler:function(){return \'background-color:#EEE8AA;color:black;\';},width:150,formatter:formatterAct}, {field:\'ac2DownAlert\',title:\'空调二失效报警\',align:\'center\',styler:function(){return \'background-color:#EEE8AA;color:black;\';},width:150,formatter:formatterAct}, {field:\'ac3DownAlert\',title:\'空调三失效报警\',align:\'center\',styler:function(){return \'background-color:#EEE8AA;color:black;\';},width:150,formatter:formatterAct}, {field:\'smokeSensorAlert\',title:\'烟雾报警\',align:\'center\',styler:function(){return \'background-color:#EEE8AA;color:black;\';},width:150,formatter:formatterAct}, {field:\'devId\',title:\'id\',hidden:true} ]], onDblClickCell:function(rowIndex,field,value){ //alert("rowIndex="+rowIndex+"<br/>"+"field="+field+"<br/>"+"value="+value+"<br/>"); //根据行索引查出设备id var rows = $(\'#dg\').datagrid(\'getRows\');//获得所有行 var row = rows[rowIndex];//根据index获得其中一行。 var url=\'<c:url value=\'/alarmStatusChart\' />\'; $.get(url,{ devId:row.devId, beginDate:beginStr, endDate:endStr, field:field }, function(data){ timeArr=data.time; var max=timeArr.length-1; var isScroll=false; if(max>20){ isScroll=true; max=20; } //根据field判断需要生成的折线图 if(field=="outdoorTempSensorAlert"){ charData=data.outdoor; fieldName="室外温感报警"; }else if(field=="indoorTempSensorAlert"){ charData=data.indoor; fieldName="室内温感报警"; }else if(field=="fanAlarmAlert"){ charData=data.fan; fieldName="风机报警"; }else if(field=="highTempAlarmAlert"){ charData=data.hightemp; fieldName="高温报警"; }else if(field=="lowTempAlarmAlert"){ charData=data.lowtemp; fieldName="低温报警"; }else if(field=="voltageAlarmAlert"){ charData=data.vol; fieldName="电压过高过低报警"; }else if(field=="ac1DownAlert"){ charData=data.ac1data; fieldName="空调一报警"; }else if(field=="ac2DownAlert"){ charData=data.ac2data; fieldName="空调二报警"; }else if(field=="ac3DownAlert"){ charData=data.ac3data; fieldName="空调三报警"; }else if(field=="smokeSensorAlert"){ charData=data.smoke; fieldName="烟雾报警"; }else{ return; } chart=Highcharts.chart(\'container\', { title: { text: row.devName+fieldName+\'状态折线图\' }, legend:{ enabled:false }, credits:{ enabled:false }, exporting:{ enabled:false }, tooltip:{ formatter:function(){ return "时间:"+formatDate(this.x)+"<br/>"+ "状态:"+formatAlarmStatus(this.y); } }, plotOptions:{ series:{ event:{ afterAnimate: function () { this.chart.renderer.label(this.name + \' has appeared\', 100, 70) .attr({ padding: 10, fill: Highcharts.getOptions().colors[0] }) .css({ color: \'white\' }) .add(); } } } }, xAxis: { /* tickInterval:5, */ categories: timeArr, labels: { formatter:function(){ /* var xdate=new Date(this.value); console.log(this.value); */ //var a=formatDate(new Date(this.value)).substring(2); return formatDate(new Date(this.value)).substring(2,16); } }, min:0, max:max }, scrollbar:{ enabled:isScroll }, yAxis:{ categories: [0,1], labels: { formatter:function(){ if(this.value ==1) { return "报警"; }else if(this.value ==0) { return "正常"; } } }, title:{ text:\'报警状态\' } }, series: [{ data: charData, color: \'red\', threshold:0.99,//设置阀值 negativeColor: \'#0088FF\', }] },function(c){ if(isScroll){
//设置滚动条居右显示 c.xAxis[0].setExtremes(charData.length-20,charData.length-1); } }); $("#reportDialog").dialog("open").dialog("setTitle", "报警状态折线图"); },"json"); } }); $("#reportDialog").dialog({
//图表尺寸改变时,重新绘画折线图 onResize:function(){ if(chart!=null){ chart.reflow(); } } }); }); function formatterAct(val){ return val+"次"; } function formatAlarmStatus(value){ if(value ==1) { return \'<font color="red">报警</font>\'; } return "正常"; } function searchDevice() { //checkDate(); if(!checkDate()){ return; } $("#dg").datagrid(\'load\', { orgId:$(\'#oid\').val(), beginDate:beginStr, endDate:endStr, containSub:$(\'#containSub\').is(\':checked\') }); } function checkDate(){ var regexp = /^[1-9]{4}-[0-9]{2}-[0-9]{2} [0-2]{1}[0-4]{1}:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$/g;//yyyy-MM-dd HH:mm:ss beginStr = $(\'#begindate\').datetimebox(\'getValue\'); endStr = $(\'#enddate\').datetimebox(\'getValue\'); /* if(!regexp.test(beginStr)||!regexp.test(endStr)){ $.messager.alert("警告","请输入正确的时间格式!","warning"); return false; } */ var begindate=new Date(Date.parse(beginStr.replace(/-/g,\'/\'))); if(endStr==\'\' || endStr==null){ var enddate=new Date(); }else{ var enddate=new Date(Date.parse(endStr.replace(/-/g,\'/\'))); } if(begindate>enddate){ $.messager.alert("警告","结束时间不能小于开始时间!","warning"); return false; } return true; } function subOneDay(val){ val.setDate(val.getDate()-1); val.setHours(0); val.setMinutes(0); val.setSeconds(0); return val; } </script> </head> <body class="easyui-layout"> <div data-options="border:false,region:\'north\',collapsible:true,title:\'查询条件\',iconCls:\'icon-form-edit\'" style="border: 1px solid #95B8E7; background: #F4F4F4; border-left: none; border-right: none; border-top: none; height: 80px;"> <div style="padding: 10px; background: #F4F4F4;"> <label>起始时间:</label><input id="begindate" class="easyui-datetimebox" editable="false"> <label>结束时间:</label><input id="enddate" class="easyui-datetimebox" editable="false"> <label>机构:</label> <input id="oname" class="easyui-combotree expandCombotree" style="width:100px;"/> <input id="oid" type="hidden" value="${currentUser.orgId }"/> <label style="white-space: nowrap;"><input type="checkbox" id="containSub" name="containSub" checked="checked"/>包含子机构</label> <a id="searchDev" onclick="javascript:searchDevice();" class="easyui-linkbutton" iconCls="icon-search" style="white-space: nowrap;">查询</a> </div> </div> <div data-options="border:false,region:\'center\',title:\'报警统计(双击淡菊色区域单元格会弹出相应状态折线图)\',collapsible:true,iconCls:\'icon-list\'" style="border: 1px solid #95B8E7; background: #F4F4F4; border-left: none; border-right: none; border-top: none;"> <table id="dg"></table> </div> <div id="reportDialog" class="easyui-dialog" title="sdsa" closed=true resizable="true" style="width:60%;height:450px;"> <div> <div id="container" style="height: 90%; margin: 0 auto; width: 100%"></div> </div> </div> </body> </html>