device_status.jsp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@include file="/context/mytags.jsp"%>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <meta name="Generator" content="EditPlus®">
  8. <meta name="Author" content="">
  9. <meta name="Keywords" content="">
  10. <meta name="Description" content="">
  11. <title>群众艺术馆设备监测</title>
  12. <style type="text/css">
  13. #demo {
  14. overflow: hidden;
  15. border: 0px dashed #CCC;
  16. width: 100%;
  17. height: 230px;
  18. }
  19. #demo img {
  20. border: 0px solid #F2F2F2;
  21. }
  22. #indemo {
  23. height: 300%;
  24. }
  25. #yibiao1 {
  26. width: 100%;
  27. height: 230px;
  28. }
  29. </style>
  30. <link rel="stylesheet" href="plug-in/dataview/css/tongji.css">
  31. <link rel="stylesheet" href="plug-in/dataview/css/progresscircle.css">
  32. <script type="text/javascript"
  33. src="plug-in/dataview/jquery-1.8.1.min.js"></script>
  34. <script type="text/javascript" src="plug-in/dataview/echarts4.min.js"></script>
  35. <script type="text/javascript" src="plug-in/dataview/tongji.js"></script>
  36. <script type="text/javascript" src="plug-in/dataview/infographic.js"></script>
  37. <script type="text/javascript" src="plug-in/dataview/progresscircle.js"></script>
  38. <script type="text/javascript">
  39. <!--
  40. $(window).resize(function ()// 绑定到窗口的这个事件中
  41. {
  42. var whdef = 100/916;// 表示1920的设计图,使用100PX的默认值
  43. var wH = window.innerHeight;// 当前窗口的高度
  44. var wW = window.innerWidth;// 当前窗口的宽度
  45. // var rem = wW * whdef;// 以默认比例值乘以当前窗口宽度,得到该宽度下的相应FONT-SIZE值
  46. var rem = wH * whdef;// 以默认比例值乘以当前窗口宽度,得到该宽度下的相应FONT-SIZE值
  47. $('html').css('font-size', rem + "px");
  48. myChart1.resize();
  49. myChart2.resize();
  50. myChart3.resize();
  51. // yibiao1.resize();
  52. myChart4.resize();
  53. });
  54. //-->
  55. </script>
  56. </head>
  57. <body>
  58. <div class="container">
  59. <header>
  60. <div class="herder_bg"></div>
  61. </header>
  62. <article>
  63. <div class="wrap">
  64. <div class="wrap-left">
  65. <div class="left-top sun-div">
  66. <div class="sun-title">
  67. <span class="">实时功率</span>
  68. </div>
  69. <div class="left-top-ec">
  70. <!--<span>当天实时</span> <span>全局工作统计</span>-->
  71. <!--统计图一-->
  72. <div id="ec1"></div>
  73. <!--统计图二-->
  74. <div id="ec2"></div>
  75. </div>
  76. </div>
  77. <div class="left-btm sun-div">
  78. <div class="sun-title">
  79. <span class="">设备运行日历</span>
  80. </div>
  81. <!-- <table class="ri-table">
  82. <tr ><td style="width: 40%;"><span style="color:#fda400;position: relative;">设备</span></td><td style="width: 30%;"><span style="color:#fda400">位置</span></td><td style="width: 30%;"><span style="color:#fda400">运行状态</span></td></tr>
  83. <tr><td>集水井1</td><td>停车场东侧</td><td>正常</td></tr>
  84. <tr><td>集水井2</td><td>停车场东侧</td><td>正常</td></tr>
  85. <tr><td>集水井3</td><td>停车场东侧</td><td>正常</td></tr>
  86. <tr><td>集水井4</td><td>停车场东侧</td><td>正常</td></tr>
  87. <tr><td>集水井5</td><td>停车场东侧</td><td style="color:red">超出上限</td></tr>
  88. <tr><td>集水井6</td><td>停车场东侧</td><td>正常</td></tr>
  89. <tr><td>集水井7</td><td>停车场东侧</td><td>正常</td></tr>
  90. </table>-->
  91. <div id="ecRiLi"></div>
  92. </div>
  93. </div>
  94. <div class="wrap-right">
  95. <div class="right-top sun-div">
  96. <div class="sun-title">
  97. <span class="">能耗统计</span>
  98. </div>
  99. <div id="data-list">
  100. <table style="width: 100%">
  101. <tr style="height: 0.5rem">
  102. <td style="text-align: center; width: 33%; font-size: 0.22rem">今日能耗</td>
  103. <td style="text-align: center; width: 33%; font-size: 0.22rem">月度能耗</td>
  104. <td style="text-align: center; width: 33%; font-size: 0.22rem">季度能耗</td>
  105. </tr>
  106. <tr>
  107. <td style="text-align: center"><div id="rinenghao"
  108. class="circlechart" data-percentage="100">0</div></td>
  109. <td style="text-align: center">
  110. <div id="yuenenghao" class="circlechart" data-percentage="100">0</div>
  111. </td>
  112. <td style="text-align: center">
  113. <div id="jinenghao" class="circlechart" data-percentage="100">0</div>
  114. </td>
  115. </tr>
  116. </table>
  117. </div>
  118. <div id="ec3"></div>
  119. </div>
  120. <div class="right-btm">
  121. <div class="r-btm-left">
  122. <div class="sun-title">
  123. <span class="">报警统计</span>
  124. </div>
  125. <!--<div class="notice">
  126. <ul>
  127. <li><b class="litext" title="集水井5水位超出上限">集水井5水位 57cm, 超出上限</b><span class="r">04-17 17:52</span></li>
  128. <li><b class="litext" title="关于XX申请筹建幼儿园">集水井4水位 67cm, 超出上限</b><span class="r">04-17 17:56</span></li>
  129. <li><b class="litext" title="关于XX申请筹建幼儿园">集水井5水位 57cm, 超出上限</b><span class="r">04-17 17:23</span></li>
  130. <li><b class="litext" title="关于XX申请筹建幼儿园">集水井5水位 57cm, 超出上限</b><span class="r">04-17 17:23</span></li>
  131. </ul>
  132. </div>-->
  133. <div id='ec4'></div>
  134. </div>
  135. <div class="r-btm-righ">
  136. <div class="sun-title">
  137. <span class="">传感器实时数据</span>
  138. </div>
  139. <div id="demo">
  140. <div id="indemo">
  141. <div id="demo1">
  142. <ul>
  143. <li><b class="litextsmall" title="集水井5水位超出上限">04-17
  144. 17:52:00 : 1号消防泵压力采集值 [1000] [正常]</b></li>
  145. <li><b style="color: red" class="litextsmall"
  146. title="关于XX申请筹建幼儿园">04-17 17:26:09 : 4号集水井水位采集值 [67cm]
  147. [超出上限]</b></li>
  148. <li><b style="color: red" class="litextsmall"
  149. title="关于XX申请筹建幼儿园">04-17 17:26:09 : 5号集水井水位采集值 [57cm]
  150. [超出上限]</b></li>
  151. <li><b class="litextsmall" title="关于XX申请筹建幼儿园">04-17
  152. 17:26:09 : 1号电梯电压采集值 [381V] [正常]</b></li>
  153. <li><b class="litextsmall" title="集水井5水位超出上限">04-17
  154. 17:26:09 : 高压间环境温度采集值 [35℃] [正常]</b></li>
  155. <li><b class="litextsmall" title="关于XX申请筹建幼儿园">04-17
  156. 17:26:09 : 主变压箱温度采值 [44℃] [正常]</b></li>
  157. <li><b class="litextsmall" title="关于XX申请筹建幼儿园">04-17
  158. 17:26:09 : 备变压箱温度采集值 [33℃] [正常]</b></li>
  159. </ul>
  160. </div>
  161. <div id="demo2"></div>
  162. </div>
  163. </div>
  164. </div>
  165. </div>
  166. </div>
  167. </div>
  168. </article>
  169. </div>
  170. <script type="text/javascript">
  171. var myChart1 = echarts.init(document.getElementById('ec1'));
  172. var myChart2 = echarts.init(document.getElementById('ec2'));
  173. var myChart3 = echarts.init(document.getElementById('ec3'));
  174. var myChart4 = echarts.init(document.getElementById('ec4'));
  175. var myChartRiLi = echarts.init(document.getElementById('ecRiLi'),'infographic');
  176. // var yibiao1 = echarts.init(document.getElementById('yibiao1'));
  177. //
  178. // var option = {
  179. // series : [{
  180. // name : '警告信息',
  181. // type : 'gauge',
  182. // detail : {formatter:'{value}条警告'},
  183. // axisLine : {lineStyle : {width:20}},
  184. // splitLine : {length :20},
  185. // date : [{value:2,name:''}]
  186. // }]
  187. // }
  188. // yibiao1.setOption(option);
  189. //var myChart4 = echarts.init(document.getElementById('ec4'));
  190. /*
  191. * 参数说明
  192. * obj : 动画的节点,本例中是ul
  193. * top : 动画的高度,本例中是-35px;注意向上滚动是负数
  194. * time : 动画的速度,即完成动画所用时间,本例中是500毫秒,即marginTop从0到-35px耗时500毫秒
  195. * function : 回调函数,每次动画完成,marginTop归零,并把此时第一条信息添加到列表最后;
  196. *
  197. */
  198. function noticeUp(obj,top,time) {
  199. $(obj).animate({
  200. marginTop: top
  201. }, time, function () {
  202. $(this).css({marginTop:"0"}).find(":first").appendTo(this);
  203. })
  204. }
  205. function getVirtulData() {
  206. var currDate = new Date();
  207. var currMonth = echarts.format.formatTime('yyyy-MM', currDate);
  208. var date = +echarts.number.parseDate(currMonth+"-01");
  209. var end = +echarts.number.parseDate(new Date());
  210. var dayTime = 3600 * 24 * 1000;
  211. var data = [];
  212. for (var time = date; time < end; time += dayTime) {
  213. data.push([
  214. echarts.format.formatTime('yyyy-MM-dd', time),
  215. Math.floor(Math.random() * 100)
  216. ]);
  217. }
  218. return data;
  219. }
  220. function getPieSeriesUpdate(scatterData, chart) {
  221. var currDate = new Date();
  222. var currMonth = echarts.format.formatTime('yyyy-MM', currDate);
  223. var date = +echarts.number.parseDate(currMonth+"-01");
  224. var ajaxdata;
  225. $.ajax({
  226. url:"dataviewController.do?getRiLi&startDate="+echarts.format.formatTime('yyyy-MM-dd', date)+"&endDate="+echarts.format.formatTime('yyyy-MM-dd', currDate),
  227. type:"post",
  228. dataType: 'json',
  229. async:false,
  230. success:function(result){
  231. ajaxdata = result;
  232. }
  233. }
  234. );
  235. return echarts.util.map(scatterData, function (item, index) {
  236. var obj = ajaxdata.attributes[item[0]];
  237. var warning = 0;
  238. var normal = 0;
  239. var offline = 0;
  240. if(obj && typeof obj === "object"){
  241. warning = obj.warningCount;
  242. normal = obj.normalCount;
  243. offline = obj.offlineCount;
  244. }
  245. var center = chart.convertToPixel('calendar', item);
  246. return {
  247. id: index + 'pie',
  248. type: 'pie',
  249. center: center,
  250. label: {
  251. normal: {
  252. formatter: '{c}',
  253. position: 'inside'
  254. }
  255. },
  256. radius: 25 ,
  257. data: [ {name: '报警', value: warning},
  258. {name: '正常', value:normal},
  259. {name: '设备离线', value: offline}
  260. ]
  261. };
  262. });
  263. }
  264. function loadOptionRiLi(){
  265. var app = {};
  266. option = null;
  267. var cellSize = [120, 80];
  268. var pieRadius = 30;
  269. var scatterData = getVirtulData();
  270. if(myChartRiLi){
  271. myChartRiLi.clear();
  272. }
  273. option = {
  274. tooltip : {},
  275. legend: {
  276. data: [ {
  277. name: '正常',
  278. // 设置文本为红色
  279. textStyle: {
  280. color: 'white'
  281. }
  282. },{
  283. name: '报警',
  284. // 设置文本为红色
  285. textStyle: {
  286. color: 'white'
  287. }
  288. },{
  289. name: '设备离线',
  290. // 设置文本为红色
  291. textStyle: {
  292. color: 'white'
  293. }
  294. }],
  295. top: 1,
  296. color:'red'
  297. },
  298. calendar: {
  299. top: 45,
  300. left: 'center',
  301. height:'auto',
  302. orient: 'vertical',
  303. cellSize: cellSize,
  304. splitLine: {
  305. show: true,
  306. lineStyle: {
  307. color: 'rgb(0,136,212)',
  308. width: 1,
  309. type: 'solid'
  310. }
  311. },
  312. yearLabel: {
  313. show: false,
  314. textStyle: {
  315. fontSize: 30
  316. }
  317. },
  318. dayLabel: {
  319. margin: 7,
  320. firstDay: 1,
  321. nameMap: ['日', '一', '二', '三', '四', '五', '六'],
  322. color:'white',
  323. fontSize:13
  324. },
  325. monthLabel: {
  326. show: true
  327. },
  328. itemStyle: {
  329. normal: {
  330. color: 'rgba(255,255,255,0)',
  331. borderWidth: 1,
  332. borderColor: 'rgb(0,136,212)'
  333. }
  334. },
  335. range: [echarts.format.formatTime('yyyy-MM', new Date())]
  336. },
  337. series: [{
  338. id: 'label',
  339. type: 'scatter',
  340. coordinateSystem: 'calendar',
  341. symbolSize: 1,
  342. label: {
  343. normal: {
  344. show: true,
  345. formatter: function (params) {
  346. return echarts.format.formatTime('dd', params.value[0]);
  347. },
  348. offset: [-cellSize[0] / 2 + 10, -cellSize[1] / 2 + 10],
  349. textStyle: {
  350. color: 'white',
  351. fontSize: 14
  352. },
  353. }
  354. },
  355. data: scatterData
  356. }]
  357. };
  358. if (!app.inNode) {
  359. var pieInitialized;
  360. setTimeout(function () {
  361. pieInitialized = true;
  362. myChartRiLi.setOption({
  363. series: getPieSeriesUpdate(scatterData, myChartRiLi)
  364. });
  365. }, 10);
  366. app.onresize = function () {
  367. if (pieInitialized) {
  368. myChartRiLi.setOption({
  369. series: getPieSeriesUpdate(scatterData, myChartRiLi)
  370. });
  371. }
  372. };
  373. };
  374. if (option && typeof option === "object") {
  375. myChartRiLi.setOption(option, true);
  376. }
  377. }
  378. function rinenghaoCallback(result){
  379. var d=$.parseJSON(result);
  380. var div1 = document.getElementById("rinenghao");
  381. var div2 = document.getElementById("yuenenghao");
  382. var div3 = document.getElementById("jinenghao");
  383. div1.innerHTML = d.attributes["rinenghao"];
  384. div2.innerHTML = d.attributes["yuenenghao"];
  385. div3.innerHTML = d.attributes["jinenghao"];
  386. $('.circlechart').circlechart();
  387. }
  388. function refreshNenghao(){
  389. $("#rinenghao").load("dataviewController.do?getRiNenghao","",rinenghaoCallback);
  390. }
  391. function getRiLiData(){
  392. var currDate = new Date();
  393. var currMonth = echarts.format.formatTime('yyyy-MM', currDate);
  394. var date = +echarts.number.parseDate(currMonth+"-01");
  395. var data = [];
  396. $.ajax({
  397. url:"dataviewController.do?getRiLi&startDate="+echarts.format.formatTime('yyyy-MM-dd', date)+"&endDate="+echarts.format.formatTime('yyyy-MM-dd', currDate),
  398. type:"post",
  399. dataType: 'json',
  400. async:false,
  401. success:function(result){
  402. data = riliCallback(result);
  403. }
  404. }
  405. );
  406. }
  407. function refreshGonglvPie(){
  408. $.ajax({
  409. url:"dataviewController.do?getGonglvPie",
  410. type:"post",
  411. dataType: 'json',
  412. async:false,
  413. success:function(result){
  414. //alert(result.title.text);
  415. if(result!=null){
  416. // alert(result.series[0].data[0]);
  417. var opt = myChart1.getOption();
  418. var value = [];
  419. var serisdata = result.series[0].data;
  420. $.each(serisdata, function(i,p){
  421. value[i] = {'name':p['name'], 'value':p['value']};
  422. });
  423. //alert(opt.title[0].text);
  424. opt.legend[0].data = result.legend.data;
  425. opt.title[0].text = result.title.text;
  426. opt.series[0].data = value;
  427. myChart1.hideLoading();
  428. myChart1.setOption(opt);
  429. }
  430. }
  431. }
  432. );
  433. }
  434. function refreshWarningSumBar(){
  435. $.ajax({
  436. url:"dataviewController.do?getWarningSumBar",
  437. type:"post",
  438. dataType: 'json',
  439. async:false,
  440. success:function(result){
  441. // alert(result.title.text);
  442. if(result!=null){
  443. //alert(result.yaxis[0].data);
  444. var opt = myChart4.getOption();
  445. var serisdata = result.series[0].data;
  446. opt.series[0].data = serisdata;
  447. opt.xAxis[0].data = result.xaxis[0].data;
  448. myChart4.hideLoading();
  449. myChart4.setOption(opt);
  450. }
  451. }
  452. }
  453. );
  454. }
  455. function refreshGonglvBar(){
  456. $.ajax({
  457. url:"dataviewController.do?getGonglvBar",
  458. type:"post",
  459. dataType: 'json',
  460. async:false,
  461. success:function(result){
  462. // alert(result.title.text);
  463. if(result!=null){
  464. //alert(result.yaxis[0].data);
  465. var opt = myChart2.getOption();
  466. var serisdata = result.series[0].data;
  467. opt.series[0].data = serisdata;
  468. opt.yAxis[0].data = result.yaxis[0].data;
  469. myChart2.hideLoading();
  470. myChart2.setOption(opt);
  471. }
  472. }
  473. }
  474. );
  475. }
  476. function refreshNenghaoLine(){
  477. $.ajax({
  478. url:"dataviewController.do?getNenghaoLine",
  479. type:"post",
  480. dataType:"json",
  481. async:false,
  482. success:function(result){
  483. if(result!=null){
  484. var opt = myChart3.getOption();
  485. var serisdata = result.series[0].data;
  486. opt.series[0].data = serisdata;
  487. opt.xAxis[0].data = result.xaxis[0].data;
  488. myChart3.setOption(opt);
  489. }
  490. }
  491. });
  492. }
  493. $(function () {
  494. // 调用 公告滚动函数
  495. setInterval("noticeUp('.notice ul','-35px',500)", 5000);
  496. setInterval(refreshNenghao, 10000);
  497. setInterval(refreshGonglvPie, 8000);
  498. setInterval(refreshGonglvBar, 9000);
  499. setInterval(refreshNenghaoLine, 60000);
  500. setInterval(refreshWarningSumBar, 3000);
  501. loadOptionRiLi();
  502. setInterval(loadOptionRiLi, 10000);
  503. });
  504. $('.circlechart').circlechart();
  505. var speed=10;//控制速度
  506. var tab=document.getElementById("demo");
  507. var tab1=document.getElementById("demo1");
  508. var tab2=document.getElementById("demo2");
  509. tab2.innerHTML=tab1.innerHTML;
  510. function Marquee(){
  511. if(tab2.offsetHeight-tab.scrollTop<=0)
  512. tab.scrollTop-=tab1.offsetHeight;
  513. else{
  514. tab.scrollTop++;
  515. }
  516. }
  517. //定时器
  518. var MyMar=setInterval(Marquee,speed);
  519. //鼠标滑过停止滚动
  520. tab.onmouseover=function() {clearInterval(MyMar)};
  521. //鼠标滑出继续滚动
  522. tab.onmouseout=function() {MyMar=setInterval(Marquee,speed)};
  523. </script>
  524. </body>
  525. </html>