cbd_report_detail.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. {% load staticfiles %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8" />
  6. <link href="{% static '/lib/bootstrap-3.3.7/css/bootstrap.css' %}" rel="stylesheet">
  7. <link rel="stylesheet" href="{% static '/lib/font-awesome/4.5.0/css/font-awesome.css' %}">
  8. <link rel="stylesheet" href="{% static '/lib/css/ace.min.css' %}" />
  9. <link rel="stylesheet" href="{% static '/lib/css/ace-skins.min.css' %}">
  10. <link rel="stylesheet" href="{% static '/lib/css/ace-rtl.min.css' %}">
  11. <link rel="stylesheet" href="{% static '/lib/layui/css/layui.css' %}">
  12. <link rel="stylesheet" href="{% static '/css/loading.css' %}?versions=0.5.0" />
  13. <style type="text/css">
  14. /* 返回 */
  15. .headerPlace {
  16. font-size: 22px;
  17. color: #418fbb;
  18. cursor: pointer;
  19. }
  20. .headerPlace img {
  21. vertical-align: middle;
  22. margin-right: 10px;
  23. margin-top: -4px;
  24. }
  25. body {
  26. overflow: hidden;
  27. background: #fff;
  28. }
  29. .searchCover {
  30. margin: 20px 0;
  31. }
  32. .innerTable {
  33. padding: 0 1px 0 0;
  34. min-width: 750px;
  35. /* overflow-x: scroll; */
  36. }
  37. .table,
  38. .table.table-striped>thead>tr>th {
  39. text-align: center;
  40. }
  41. table td {
  42. vertical-align: middle !important;
  43. }
  44. .nullData {
  45. width: 100%;
  46. height: 500px;
  47. background: #ddd;
  48. text-align: center;
  49. line-height: 500px;
  50. font-size: 20px;
  51. border: 1px solid #ddd;
  52. }
  53. .container-wrap {
  54. margin: 30px 0;
  55. }
  56. .container-cartogram>div {
  57. width: 100%;
  58. margin: 0 10px;
  59. height: 300px;
  60. text-align: center;
  61. line-height: 300px;
  62. font-size: 22px;
  63. color: #8a8a8a;
  64. position: relative;
  65. }
  66. .container-cartogram>div>div {
  67. width: 100%;
  68. height: 100%;
  69. }
  70. .container-cartogram>div>.hint {
  71. width: 100%;
  72. height: 100%;
  73. position: absolute;
  74. }
  75. .container-wrap {
  76. overflow-x: scroll;
  77. }
  78. .searchCover input {
  79. width: 180px;
  80. }
  81. .timeStage {
  82. display: none;
  83. }
  84. .downTitle {
  85. text-align: right;
  86. line-height: 27px;
  87. padding-left: 0;
  88. margin-bottom: 5px;
  89. }
  90. .downContent {
  91. padding-left: 0;
  92. margin-bottom: 5px;
  93. }
  94. /* */
  95. .userinfo .fa {
  96. font-size: 18px;
  97. color: #26b3ff;
  98. margin: 0px 5px;
  99. }
  100. .userinfoTitle {
  101. margin-right: 30px;
  102. font-size: 16px;
  103. }
  104. button.btn.btn-sm.btn-white.active {
  105. background: #428bca !important;
  106. color: #fff !important;
  107. }
  108. </style>
  109. </head>
  110. <body>
  111. <div class="content">
  112. <div class="page-header">
  113. <span class="headerPlace" onclick="goback('cbd_report')">
  114. <!-- <span class="headerPlace" onclick="gobackA()"> -->
  115. <img src="{% static '/img/gobackIcon.png' %}" alt="">返回
  116. </span>
  117. </div>
  118. <div class="row userinfo">
  119. <div class="col-xs-11">
  120. <i class="fa fa-user-o" aria-hidden="true"></i>
  121. 设备ID:
  122. <span class="userinfoTitle">{{ equip_id }}</span>
  123. 设备名称:
  124. <span class="userinfoTitle" id="equip_name">{{ename}}</span>
  125. </div>
  126. </div>
  127. <div class="searchCover">
  128. 统计图时间段搜索:
  129. <button type="button" onclick="getCharts(this,1)" class="btn btn-sm btn-white">当天</button>
  130. <button type="button" onclick="getCharts(this,2)" class="btn btn-sm btn-white active">本月</button>
  131. <button type="button" onclick="getCharts(this,3)" class="btn btn-sm btn-white">半年</button>
  132. <button type="button" onclick="getCharts(this,4)" class="btn btn-sm btn-white">本年</button>
  133. <input type="text" id="timSelectBox" autocomplete="off" placeholder="请选择时间段 ">
  134. <input type="hidden" id="begin" name="begin">
  135. <input type="hidden" id="end" name="end">
  136. <button type="button" onclick="dtl_sub_filter()" class="btn btn-sm btn-primary">筛选</button>
  137. </div>
  138. <div class="container-wrap">
  139. <div class="container-cartogram clearfix">
  140. <div class="echartsBox fl">
  141. <div class="hint"></div>
  142. <div class="fl" id="line-chart"></div>
  143. </div>
  144. <!-- <div class="fl" id="bar-chart"></div>
  145. <div class="fl" id="pie-chart"></div> -->
  146. </div>
  147. <div>
  148. <input id="equip_id" type="hidden" type="text" value={{ equip_id }}>
  149. </div>
  150. <div class="searchCover">
  151. 数据列表时间段搜索:
  152. <input type="text" id="dataSelectBox" autocomplete="off" placeholder="请选择时间段 ">
  153. <input type="hidden" id="databegin" name="begin">
  154. <input type="hidden" id="dataend" name="end">
  155. <button type="button" onclick="data_sub_filter()" class="btn btn-sm btn-primary">筛选</button>
  156. <!-- <button type="button" onclick="operation()" class="btn btn-sm btn-success">导出</button> -->
  157. <!-- <button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#myModal">导出</button> -->
  158. <button type="button" class="btn btn-success btn-sm" onclick="decideExport()">导出</button>
  159. </div>
  160. <div class="innerTable">
  161. <table id="datatableDet" class="table table-striped table-hover">
  162. <thead>
  163. <tr>
  164. <th>设备ID</th>
  165. <th>环境温度(℃)</th>
  166. <th>环境湿度(%)</th>
  167. <th>加热仓温度(℃)</th>
  168. <th>雨控状态</th>
  169. <th>温控状态</th>
  170. <th>光控状态</th>
  171. <th>灯管状态</th>
  172. <th>电池电压(V)</th>
  173. <th>电池状态</th>
  174. <th>纬度</th>
  175. <th>经度</th>
  176. <th>上报时间</th>
  177. </tr>
  178. </thead>
  179. <tbody>
  180. </tbody>
  181. </table>
  182. <div class="fenpei-bottom">
  183. <input type="hidden" id="totalPage" value={{ nums }}>
  184. <div id="page" style="text-align: center;"></div>
  185. </div>
  186. </div>
  187. </div>
  188. <!-- 导出提示框 -->
  189. <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  190. <div class="modal-dialog" role="document">
  191. <div class="modal-content">
  192. <div class="modal-header">
  193. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  194. <span aria-hidden="true">&times;</span>
  195. </button>
  196. <h4 class="modal-title" id="myModalLabel">导出信息</h4>
  197. </div>
  198. <div class="modal-body">
  199. <div class="row">
  200. <div class="col-xs-3 downTitle">文件名称:</div>
  201. <div class="col-xs-8 downContent" style=>
  202. <input type="text" id="filename" placeholder="请输入文件的名称" maxlength="15"
  203. class="col-xs-12">
  204. </div>
  205. <div class="col-xs-3 downTitle">下载类型:</div>
  206. <div class="col-xs-8 downContent">
  207. <select name="downtype" id="downtype" onchange="downtype(this)" class="col-xs-12">
  208. <option value="1">全部</option>
  209. <option value="2">时间段</option>
  210. </select>
  211. </div>
  212. <div class="col-xs-3 downTitle timeStage">时间段:</div>
  213. <div class="col-xs-8 downContent timeStage">
  214. <input type="text" id="timSelectBox3" autocomplete="off" placeholder="请选择时间段 "
  215. class="col-xs-12">
  216. <input type="hidden" id="downbegin" name="begin">
  217. <input type="hidden" id="downend" name="end">
  218. </div>
  219. </div>
  220. </div>
  221. <div class="modal-footer">
  222. <button type="button" class="btn btn-default btn-sm" data-dismiss="modal">取消</button>
  223. <button type="button" class="btn btn-primary btn-sm" onclick="operation()">下载</button>
  224. </div>
  225. </div>
  226. </div>
  227. </div>
  228. </div>
  229. <script src="{% static '/lib/js/jquery-2.1.4.min.js' %}"></script>
  230. <script src="{% static '/lib/bootstrap-3.3.7/js/bootstrap.js' %}"></script>
  231. <script src="{% static '/lib/layui/layui.all.js' %}"></script>
  232. <script src="{% static '/js/common.js' %}?versions=0.5.0"></script>
  233. <script>
  234. $.ajaxSetup({
  235. data: {
  236. csrfmiddlewaretoken: '{{ csrf_token }}'
  237. },
  238. });
  239. if (!$.fn.highcharts) {
  240. var script = document.createElement("script");
  241. script.type = "text/javascript";
  242. script.src = "../static/lib/js/highcharts.js";
  243. document.body.appendChild(script);
  244. }
  245. </script>
  246. <script src="{% static '/js/reportmanage/cbd_report_detail_table.js' %}?versions=0.5.0"
  247. type="text/javascript"></script>
  248. <script src="{% static '/js/reportmanage/cbd_report_detail_echarts.js' %}?versions=0.5.0" type="text/javascript"></script>
  249. <script>
  250. var chart;
  251. $(function () {
  252. // 时间插件初始化
  253. layui.use('laydate', function () {
  254. var laydate = layui.laydate;
  255. var _layDateMark = (new Date()).getTime();
  256. $('#timSelectBox').attr('lay-key', '11' + _layDateMark);
  257. //执行一个laydate实例
  258. laydate.render({
  259. elem: '#timSelectBox' //指定元素
  260. ,
  261. range: true,
  262. done: function (value, date) {
  263. var dateArray = value.split(' - ')
  264. $('#begin').val(dateArray[0])
  265. $('#end').val(dateArray[1])
  266. }
  267. });
  268. $('#dataSelectBox').attr('lay-key', '22' + _layDateMark);
  269. laydate.render({
  270. elem: '#dataSelectBox' //指定元素
  271. ,
  272. range: true,
  273. done: function (value, date) {
  274. var dateArray = value.split(' - ')
  275. $('#databegin').val(dateArray[0])
  276. $('#dataend').val(dateArray[1])
  277. }
  278. });
  279. //执行一个laydate实例
  280. $('#timSelectBox3').attr('lay-key', '33' + _layDateMark);
  281. laydate.render({
  282. elem: '#timSelectBox3' //指定元素
  283. ,
  284. range: true,
  285. done: function (value, date) {
  286. var dateArray = value.split(' - ')
  287. $('#downbegin').val(dateArray[0])
  288. $('#downend').val(dateArray[1])
  289. }
  290. });
  291. });
  292. var equip_id = document.getElementById("equip_id").value
  293. $.ajax({
  294. url: 'cbd_report_detail_chart',
  295. type: 'post',
  296. data: {
  297. req: 'data',
  298. id: equip_id
  299. },
  300. dataType: 'json',
  301. success: function (data) {
  302. if (!data.length) {
  303. $('#line-chart').prev().html('暂无温度数据').css('z-index', 99);
  304. return false;
  305. } else {
  306. $('#line-chart').prev().html('').css('z-index', 0);
  307. }
  308. var temp = data;
  309. var atData = [];
  310. var ahData = [];
  311. for (var i = 0; i < temp.length; i++) {
  312. var arr1 = [],
  313. arr2 = [];
  314. var thisTime = temp[i].tim;
  315. thisTime = thisTime.replace(/-/g, '/');
  316. var time = new Date(thisTime);
  317. timestamp = time.getTime() + 8 * 3600000;
  318. arr1.push(timestamp);
  319. arr1.push(parseFloat((temp[i].at / 10).toFixed(1)));
  320. arr2.push(timestamp);
  321. arr2.push(parseFloat((temp[i].ah / 10).toFixed(1)));
  322. atData.unshift(arr1);
  323. ahData.unshift(arr2);
  324. if (i == temp.length - 1) {
  325. // atData = [
  326. // [1582976778000,-3],
  327. // [1582978987000,55],
  328. // [1582995597000,8],
  329. // [1582996834000,18],
  330. // ]
  331. // ahData = [
  332. // [1582976778000,13],
  333. // [1582978356000,-1],
  334. // [1582978987000,-5],
  335. // [1582994357000,7],
  336. // ]
  337. console.log(ahData)
  338. renderCharts(atData, ahData, 30 * 24 * 60 * 60 * 1000)
  339. }
  340. }
  341. }
  342. })
  343. })
  344. function getChartsData(begin, end, spaceNum) {
  345. $.ajax({
  346. url: 'cbd_report_detail_chart',
  347. type: 'post',
  348. data: {
  349. req: 'filter',
  350. begin: begin,
  351. end: end,
  352. id: document.getElementById("equip_id").value
  353. },
  354. dataType: 'json',
  355. success: function (data) {
  356. if (!data.length) {
  357. $('#line-chart').prev().html('暂无温度数据').css('z-index', 99);
  358. if (chart) {
  359. var seriesList = chart.series; //获得图表的所有序列
  360. var seriesCount = seriesList.length;
  361. //通过for循环删除序列数据
  362. for (var i = 0; i < seriesCount; i++) {
  363. chart.series[0].remove();
  364. }
  365. }
  366. return false;
  367. } else {
  368. $('#line-chart').prev().html('').css('z-index', 0);
  369. }
  370. // var temp = eval('(' + data + ')');
  371. var temp = data;
  372. var atData = [];
  373. var ahData = [];
  374. for (var i = 0; i < temp.length; i++) {
  375. var arr1 = [],
  376. arr2 = [];
  377. var thisTime = temp[i].tim;
  378. thisTime = thisTime.replace(/-/g, '/');
  379. var time = new Date(thisTime);
  380. timestamp = time.getTime() + 8 * 3600000;
  381. // console.log(timestamp)
  382. arr1.push(timestamp);
  383. arr1.push(parseFloat((temp[i].at / 10).toFixed(1)));
  384. arr2.push(timestamp);
  385. arr2.push(parseFloat((temp[i].ah / 10).toFixed(1)));
  386. atData.unshift(arr1);
  387. ahData.unshift(arr2);
  388. if (i == temp.length - 1) {
  389. renderCharts(atData, ahData, spaceNum)
  390. }
  391. }
  392. if (!temp.length) {
  393. $('#line-chart').prev().html('暂无温度数据').css('z-index', 99);
  394. } else {
  395. $('#line-chart').prev().html('').css('z-index', 0);
  396. }
  397. },
  398. error: function (type) { }
  399. })
  400. }
  401. setTimeout(function(){
  402. Highcharts.setOptions({
  403. // 所有语言文字相关配置都设置在 lang 里
  404. lang: {
  405. resetZoom: '重置',
  406. resetZoomTitle: '重置缩放比例'
  407. }
  408. });
  409. },3000)
  410. function renderCharts(atData, ahData, tickInterval) {
  411. chart = Highcharts.chart('line-chart', {
  412. chart: {
  413. type: 'spline',
  414. zoomType: 'x',
  415. selectionMarkerFill: 'rgba(0,0,0, 0.2)',
  416. resetZoomButton: {
  417. // 按钮定位
  418. position: {
  419. align: 'right', // by default
  420. verticalAlign: 'top', // by default
  421. x: -20,
  422. y: -50
  423. },
  424. }
  425. },
  426. title: {
  427. text: '环境温湿度'
  428. },
  429. subtitle: {
  430. // text: '非规律性时间内的变化'
  431. },
  432. xAxis: {
  433. crosshair: true, //十字基准线
  434. type: 'datetime',
  435. dateTimeLabelFormats: { //根据时间间距X轴自动显示哪种格式
  436. millisecond: '%H:%M:%S.%L',
  437. second: '%H:%M:%S',
  438. minute: '%H:%M',
  439. hour: '%H:%M',
  440. day: '%m-%d',
  441. week: '%m-%d',
  442. month: '%Y-%m',
  443. year: '%Y'
  444. },
  445. // dateTimeLabelFormats: {
  446. // week: '%m/%d'
  447. // },
  448. // tickInterval: 7 * 24 * 3600 * 1000,
  449. tickInterval: tickInterval,
  450. // minRange: 20
  451. },
  452. colors: ['#39F', '#6CF', '#036', '#000', '#6CF',],
  453. yAxis: {
  454. title: {
  455. text: '温湿度变化'
  456. },
  457. },
  458. credits: { //去掉默认的highcharts.com
  459. enabled: false
  460. },
  461. tooltip: {
  462. // crosshairs: true,
  463. shared: true, //折线共享
  464. headerFormat: '<b>{point.x:%Y-%m-%e %H:%M:%S}</b><br>',
  465. },
  466. plotOptions: {
  467. spline: {
  468. marker: {
  469. enabled: true,
  470. radius: 3, //曲线点半径,默认是4
  471. symbol: 'diamond' //曲线点类型:”circle”, “square”, “diamond”, “triangle”,”triangle-down”,默认是”circle”
  472. }
  473. }
  474. },
  475. series: [{
  476. name: '环境温度',
  477. data: atData,
  478. tooltip: {
  479. valueSuffix: '°C'
  480. }
  481. },
  482. {
  483. name: '环境湿度',
  484. data: ahData,
  485. tooltip: {
  486. valueSuffix: '%RH'
  487. }
  488. },
  489. ]
  490. });
  491. }
  492. function dtl_sub_filter() {
  493. $('.searchCover .btn-white').removeClass('active');
  494. var begin = $('#begin').val();
  495. var end = $('#end').val();
  496. if (begin && end) {
  497. getChartsData(begin, end, 24 * 60 * 60 * 1000)
  498. } else {
  499. layer.msg("请选择时间段!", {
  500. time: 2000
  501. });
  502. }
  503. }
  504. // 1当天 2本月 3半年 4本年
  505. function getCharts(obj, flag) {
  506. $('#timSelectBox').val('')
  507. $('#begin').val('')
  508. $('#end').val('')
  509. if ($(obj).hasClass('active')) {
  510. return false;
  511. } else {
  512. $('.searchCover .btn-white').removeClass('active');
  513. $(obj).addClass('active')
  514. }
  515. var newDate = new Date();
  516. var begin;
  517. var end;
  518. var endNewDate = new Date(newDate.getTime() + 24 * 60 * 60 * 1000);
  519. end = endNewDate.getFullYear() + '-' + (endNewDate.getMonth() + 1) + '-' + endNewDate.getDate();
  520. if (flag == 1) {
  521. end = getTime(-1);
  522. begin = getTime(0);
  523. var spaceNum = 60 * 60 * 1000;
  524. } else if (flag == 2) {
  525. begin = getTime(30);
  526. var spaceNum = 24 * 60 * 60 * 1000;
  527. } else if (flag == 3) {
  528. begin = getTime(182.5);
  529. var spaceNum = 30 * 24 * 60 * 60 * 1000;
  530. } else if (flag == 4) {
  531. begin = getTime(365);
  532. var spaceNum = 30 * 24 * 60 * 60 * 1000;
  533. }
  534. getChartsData(begin, end, spaceNum)
  535. }
  536. // 获取想要时间 num为天数
  537. function getTime(num) {
  538. // 先获取当前时间
  539. var curDate = (new Date()).getTime();
  540. // 将半年的时间单位换算成毫秒
  541. var halfYear = num * 24 * 3600 * 1000;
  542. var pastResult = curDate - halfYear; // 半年前的时间(毫秒单位)
  543. // 日期函数,定义起点为半年前
  544. var pastDate = new Date(pastResult),
  545. pastYear = pastDate.getFullYear(),
  546. pastMonth = pastDate.getMonth() + 1,
  547. pastDay = pastDate.getDate();
  548. return pastYear + '-' + pastMonth + '-' + pastDay;
  549. }
  550. function gobackA() {
  551. window.history.back(-1)
  552. }
  553. </script>
  554. </body>
  555. </html>