alarmdetaillist.jsp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. <%@ page import="org.apache.commons.lang3.StringUtils" %>
  2. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme() + "://"
  6. + request.getServerName() + ":" + request.getServerPort()
  7. + path + "/";
  8. Boolean bAll = Boolean.FALSE;
  9. String strAll = (String)request.getParameter("all");
  10. if (StringUtils.isNotBlank(strAll)){
  11. bAll = strAll.equalsIgnoreCase("1");
  12. System.out.println(bAll);
  13. }
  14. Boolean bSS = Boolean.FALSE;
  15. bSS = Boolean.parseBoolean(request.getParameter("ss"));
  16. //bAll 为true时加载所有的报警记录
  17. %>
  18. <!DOCTYPE html>
  19. <html lang="zh-CN">
  20. <head>
  21. <meta charset="utf-8">
  22. <meta http-equiv="x-ua-compatible" content="IE=edge">
  23. <meta name="viewport" content="width=device-width, initial-scale=1">
  24. <title>报警详细列表</title>
  25. <link rel="stylesheet" href="css/bootstrap.min.css">
  26. <link rel="stylesheet" href="css/bootstrap-table.min.css">
  27. <link rel="stylesheet" href="css/sweetalert2.min.css" >
  28. <link rel="icon" href="favicon.ico">
  29. <style type="text/css">
  30. .handle
  31. {
  32. padding-left: 3px;
  33. padding-right: 3px;
  34. }
  35. </style>
  36. </head>
  37. <body>
  38. <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog"
  39. aria-labelledby="exampleModalLabel">
  40. <div class="modal-dialog" role="document">
  41. <div class="modal-content">
  42. <div class="modal-header">
  43. <button type="button" class="close" data-dismiss="modal"
  44. aria-label="Close">
  45. <span aria-hidden="true">&times;</span>
  46. </button>
  47. <h4 class="modal-title" id="exampleModalLabel">处理报警记录</h4>
  48. </div>
  49. <div class="modal-body">
  50. <form id="updatewarnhandles" class="form-horizontal">
  51. <div class="from-group">
  52. <input id="tb_id" name="tb_id" type="hidden">
  53. </div>
  54. <div class="form-group">
  55. <label class="col-sm-2 control-label">报警校对:</label>
  56. <!--<input type="text" class="form-control" id="recipient-name"> -->
  57. <div class="col-sm-10">
  58. <label class="radio-inline"> <input type="radio"
  59. name="tb_handleresult" id="tb_handleresult1" value="1">
  60. 误报
  61. </label> <label class="radio-inline"> <input type="radio"
  62. name="tb_handleresult" id="tb_handleresult2"
  63. value="2">
  64. 已修复
  65. </label> <label class="radio-inline"> <input type="radio"
  66. name="tb_handleresult" id="tb_handleresult3"
  67. value="3">
  68. 其他
  69. </label>
  70. </div>
  71. </div>
  72. <div class="form-group">
  73. <label class="col-sm-2 control-label">备注:</label>
  74. <div class="col-sm-10">
  75. <textarea class="form-control" id="tb_remark" name="tb_remark"></textarea>
  76. </div>
  77. </div>
  78. </form>
  79. </div>
  80. <div class="modal-footer">
  81. <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
  82. <button type="button" class="btn btn-primary" onclick="updateWarnHandles()">处理</button>
  83. </div>
  84. </div>
  85. </div>
  86. </div>
  87. <div class="container-fluid">
  88. <div id="toolbar">
  89. <button id="resetcondition" class="btn btn-danger">
  90. <i class="glyphicon glyphicon-cog"></i> 重置搜索条件
  91. </button>
  92. <button id="result" class="btn btn-danger">
  93. <i class="glyphicon glyphicon-cog"></i> 显示所有记录
  94. </button>
  95. </div>
  96. <table id="table" data-toolbar="#toolbar"
  97. data-search="true" data-advanced-search="true"
  98. data-sort-order="desc" data-sort-name="alarmtime"
  99. data-sort-field="alarmtime" data-show-refresh="true"
  100. data-show-toggle="true" data-show-columns="true"
  101. data-show-export="true" data-detail-view="true"
  102. data-detail-formatter="detailFormatter" data-unique-id="guid"
  103. data-minimum-count-columns="2" data-show-pagination-switch="false"
  104. data-pagination="true" data-id-field="guid" data-id-table="advancedTable"
  105. data-page-list="[50, 100, 200, 500, 1000]" data-show-footer="false"
  106. data-query-params="queryParam" data-search-on-enter-key="true"
  107. data-side-pagination="server" data-url="getalarmdetail.cpp?<%=request.getQueryString() + "&timestamp=" + System.currentTimeMillis()%>"
  108. data-response-handler="responseHandler">
  109. </table>
  110. <!--data-filter-control="true" data-filter-show-clear="true"-->
  111. </div>
  112. <script src="js/jquery-3.1.1.min.js"></script>
  113. <script src="js/bootstrap.min.js"></script>
  114. <script src="js/sweetalert2.min.js"></script>
  115. <!-- for IE support -->
  116. <script src="js/es6-promise.auto.min.js"></script>
  117. <!-- END FOOTER -->
  118. <script>
  119. var $modal = $('#exampleModal');
  120. var recipient;
  121. var curindex;
  122. function queryParam(params) {
  123. return params;
  124. }
  125. //处理报警
  126. function updateWarnHandles() {
  127. var $handleresult = $("input[name='tb_handleresult']");
  128. var handleresult = 2;
  129. for (var i = 0; i < $handleresult.length; i++) {
  130. if ($handleresult[i].checked) {
  131. handleresult = $handleresult[i].value;
  132. break;
  133. }
  134. }
  135. var remark = $("#tb_remark").val();
  136. $.post("updatewarnhandles.cpp", {
  137. guid: recipient,
  138. result: handleresult,
  139. mark: remark
  140. }, function (data, status) {
  141. // 关闭对话框
  142. $modal.modal('toggle');
  143. //$modal.modal('toggle');
  144. //$modal.modal('hide')
  145. if (data) {
  146. //成功是更新列表里的内容
  147. swal("成功", "", "success");
  148. //var curdata = JSON.parse(data.msg);
  149. //$table.bootstrapTable('updateRow', {
  150. // index: curindex,
  151. // row: curdata
  152. //});
  153. } else {
  154. //失败时弹出框
  155. swal("失败", "", "error");
  156. }
  157. });
  158. /*
  159. //TODO
  160. $modal.modal('toggle');
  161. swal({
  162. title: 'Sorry!',
  163. text: '暂时未实现此功能.',
  164. timer: 2500,
  165. confirmButtonText: "确定"
  166. }).then(
  167. function () {},
  168. // handling the promise rejection
  169. function (dismiss) {
  170. if (dismiss === 'timer') {
  171. console.log('I was closed by the timer')
  172. }
  173. }
  174. );
  175. */
  176. }
  177. //处理模块
  178. $modal.on('show.bs.modal', function (event) {
  179. var button = $(event.relatedTarget) // Button that triggered the modal
  180. recipient = button.data('whatever') // Extract info from data-* attributes
  181. // If necessary, you could initiate an AJAX request here (and then do the updating in a callback).
  182. // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.
  183. curindex = button.data('index')
  184. var modal = $(this)
  185. //modal.find('.modal-title').text('处理报警')
  186. // modal.find('.modal-body input').val(recipient)
  187. modal.find("#tb_id").val(recipient);
  188. })
  189. //表格
  190. var $table = $('#table');
  191. function initTable() {
  192. $table.bootstrapTable({
  193. height: getHeight(),
  194. exportDataType: "basic",
  195. columns: [[{
  196. field: 'guid',
  197. title: "GUID",
  198. visible: false
  199. }, {
  200. title: '通道名称',
  201. field: 'taskname',
  202. align: 'center',
  203. valign: 'middle',
  204. sortable: true,
  205. //filterControl:"select",
  206. }, {
  207. field: 'alarmtime',
  208. title: '报警时间',
  209. searchable: true,
  210. align: 'center',
  211. sortable: true
  212. }, {
  213. field: 'alarmtype',
  214. title: '报警类型',
  215. searchable: true,
  216. align: 'center',
  217. filterControl:"select",
  218. formatter: function (value) {
  219. return getAlarmTypeName(value);
  220. }
  221. //visible: false,
  222. }, {
  223. field: 'result',
  224. title: '处理结果',
  225. align: 'center',
  226. formatter: function (value) {
  227. return getResult(value);
  228. }
  229. }, {
  230. field: 'level',
  231. title: '报警等级',
  232. align: 'center',
  233. formatter: function (value) {
  234. return getLevel(value);
  235. }
  236. }, {
  237. field: 'mark',
  238. title: '备注',
  239. align: 'center',
  240. visible: false
  241. <% if (bAll){ %>
  242. }, {
  243. field: 'filterresult',
  244. title: '过滤结果',
  245. align: 'center',
  246. formatter: function (value) {
  247. return getFilterResult(value);
  248. }
  249. <%}%>
  250. }, {
  251. field: 'operate',
  252. title: '操作',
  253. align: 'center',
  254. searchable: false,
  255. events: operateEvents,
  256. formatter: operateFormatter
  257. }],]
  258. });
  259. // sometimes footer render error.
  260. setTimeout(function () {
  261. $table.bootstrapTable('resetView');
  262. }, 200);
  263. $table.on('expand-row.bs.table', function (e, index, row, $detail) {
  264. });
  265. $table.on('all.bs.table', function (e, name, args) {
  266. console.log(name, args);
  267. });
  268. $(window).resize(function () {
  269. $table.bootstrapTable('resetView', {
  270. height: getHeight()
  271. });
  272. });
  273. }
  274. function getFilterResult(result) {
  275. switch (result){
  276. case -1:
  277. return "未过滤";
  278. case 0:
  279. return "匹配到一致";
  280. case 1:
  281. return "匹配到相似";
  282. case 2:
  283. return "匹配到部分相似";
  284. case 3:
  285. return "未匹配到";
  286. case 4:
  287. return "宽高比例过滤";
  288. case 5:
  289. return "最小像素值过滤";
  290. case 6:
  291. return "连续播报过滤";
  292. case 7:
  293. return "水平框过滤";
  294. case 8:
  295. return "行人报警过滤";
  296. case 10:
  297. return "白线过滤";
  298. case 11:
  299. return "梯形过滤";
  300. case 12:
  301. return "树叶过滤";
  302. case 13:
  303. return "地面过滤";
  304. case 14:
  305. return "无明显无标过滤";
  306. case 15:
  307. return "最小高度过滤";
  308. case 18:
  309. return "分类器过滤";
  310. case 20:
  311. return "夜晚亮度过滤";
  312. default:
  313. return result;
  314. }
  315. }
  316. function getLaneName(laneno)
  317. {
  318. switch (laneno)
  319. {
  320. case 92:
  321. return "福建方向";
  322. case 91:
  323. return "安徽方向";
  324. case 273:
  325. case 301678153:
  326. return "江西方向";
  327. case 270:
  328. return "杭州方向";
  329. case 271:
  330. return "上海方向";
  331. case 272:
  332. case 1028415928:
  333. case 404:
  334. return "杭州方向";
  335. case 401:
  336. return "金华方向";
  337. case 402:
  338. return "宁波方向";
  339. case 403:
  340. return "东阳方向";
  341. case 2135407016:
  342. return "友谊关方向";
  343. case 2135407017:
  344. return "南宁方向";
  345. case 2135407014:
  346. return "靖西方向";
  347. case 2135407015:
  348. return "崇左方向";
  349. case 0:
  350. case undefined:
  351. return "未知";
  352. default:
  353. return laneno;
  354. }
  355. }
  356. function getLevel(level) {
  357. switch (level){
  358. case 1:
  359. return "紧急";
  360. case 2:
  361. return "重要";
  362. case 3:
  363. return "警告";
  364. case 4:
  365. return "提示";
  366. default:
  367. return "未知";
  368. }
  369. }
  370. function getResult(result) {
  371. switch (result) {
  372. case 0:
  373. return "未处理";
  374. case 1:
  375. return "已处理";
  376. case 2:
  377. return "误报警";
  378. default :
  379. return "其他";
  380. }
  381. }
  382. function getAlarmTypeName(alarmtype) {
  383. switch (alarmtype){
  384. case 0x50:
  385. return "停驶";
  386. case 0x51:
  387. return "超速";
  388. case 0x52:
  389. return "事故";
  390. case 0x53:
  391. return "拥堵";
  392. case 0x54:
  393. return "行人";
  394. case 0x55:
  395. return "逆行";
  396. case 0x56:
  397. return "火灾";
  398. case 0x57:
  399. return "抛洒物";
  400. case 0x58:
  401. return "排队超限";
  402. case 0x59:
  403. return "交通状态信息";
  404. case 0x5a:
  405. return "抓拍";
  406. case 0x5b:
  407. return "抓拍";
  408. case 0x5c:
  409. return "光线异常";
  410. case 0x5d:
  411. return "烟雾";
  412. case 0x5e:
  413. return "转动";
  414. case 0x5f:
  415. return "低速";
  416. case 0xFF:
  417. return "测试";
  418. default:
  419. return "未知";
  420. }
  421. }
  422. function getIdSelections() {
  423. return $.map($table.bootstrapTable('getSelections'), function (row) {
  424. return row.guid
  425. });
  426. }
  427. function responseHandler(res) {
  428. return res;
  429. }
  430. function detailFormatter(index, row) {
  431. var html = [];
  432. html.push('<div class="well well-sm">');
  433. html.push('<ul>');
  434. html.push('<li>GUID:' + row.guid);
  435. html.push('<li>通道名称:' + row.taskname);
  436. html.push('<li>报警时间:' + row.alarmtime);
  437. html.push('<li>方向:' + getLaneName(row.laneno));
  438. html.push('<li>报警类型:' + getAlarmTypeName(row.alarmtype));
  439. html.push('<li>报警等级:' + getLevel(row.level));
  440. if (row.result === 0){
  441. html.push('<li>处理结果:未处理');
  442. } else if (row.result === 1){
  443. html.push('<li>处理结果:已处理');
  444. html.push('<li>处理信息:' + row.mark);
  445. } else if (row.result === 2) {
  446. html.push('<li>处理结果:误报警');
  447. html.push('<li>误报信息:' + row.mark);
  448. }
  449. <% if (bAll){ %>
  450. html.push('<li>过滤结果' + getFilterResult(row.filterresult));
  451. <% } %>
  452. var filefullname = "http://<%=request.getServerName()%>:<%=request.getServerPort()%>/DB/pic/" + row.imagepath1 + ".jpg";
  453. //var filefullname = "http://192.168.2.251:21006/DB/pic/" + row.imagepath1 + ".jpg";
  454. html.push('<li>报警图片:<img src="' + filefullname + '" width="352" height="288" />');
  455. html.push('</ul>');
  456. html.push('</div>');
  457. return html.join('');
  458. }
  459. function operateFormatter(value, row, index) {
  460. //var picpath = "http://<%=request.getServerName()%>:<%=request.getServerPort()%>/DB/pic/" + row.imagepath1 + ".jpg";
  461. var videopath = "http://<%=request.getServerName()%>:<%=request.getServerPort()%>/DB/video/" + row.imagepath1 + ".mp4";
  462. return [
  463. '<a class="handle" title="查看图片" data-guid="' + row.guid + '" onclick="viewpic(this)">',
  464. '<i class="glyphicon glyphicon-picture"></i>', '</a>',
  465. //'<a class="handle" title="查看报警视频" data-guid="' + row.guid + '" onclick="viewvideo(this)">',
  466. //'<i class="glyphicon glyphicon-video"></i>', '</a>',
  467. '<a class="handle" title="查看录像" target="_blank" href="' + videopath + '">',
  468. '<i class="glyphicon glyphicon-facetime-video"></i>', '</a>',
  469. '<a class="handle" title="处理报警" data-toggle="modal" data-target="#exampleModal" data-whatever="'
  470. + row.guid + '" data-index="' + index + '">',
  471. '<i class="glyphicon glyphicon-apple"></i>', '</a>'<% if(bSS){%>,
  472. '<a class="handle" title="删除记录" data-guid="' + row.guid + '" onclick="removealarm(this)">',
  473. '<i class="glyphicon glyphicon-remove"></i>', '</a>'<%}%>]
  474. .join('');
  475. }
  476. function removealarm(t) {
  477. if (t.dataset.guid){
  478. $.post("deletealarm.cpp", {guid : t.dataset.guid}, function (data, status) {
  479. if (data)
  480. {
  481. swal({
  482. title: 'success',
  483. text: '删除成功.',
  484. type: 'success',
  485. timer: 2500,
  486. confirmButtonText: "确定"
  487. }).then(
  488. function () {},
  489. // handling the promise rejection
  490. function (dismiss) {
  491. if (dismiss === 'timer') {
  492. console.log('I was closed by the timer')
  493. }
  494. }
  495. );
  496. var obj = $table.bootstrapTable('removeByUniqueId', t.dataset.guid);
  497. return ;
  498. }
  499. swal({
  500. title: 'error!',
  501. text: '删除失败.',
  502. timer: 2500,
  503. type: 'error',
  504. confirmButtonText: "确定"
  505. }).then(
  506. function () {},
  507. // handling the promise rejection
  508. function (dismiss) {
  509. if (dismiss === 'timer') {
  510. console.log('I was closed by the timer')
  511. }
  512. }
  513. );
  514. });
  515. }
  516. }
  517. function viewvideo(t) {
  518. swal({
  519. title: 'Sorry!',
  520. text: '暂时未实现此功能.',
  521. timer: 2500,
  522. confirmButtonText: "确定"
  523. }).then(
  524. function () {},
  525. // handling the promise rejection
  526. function (dismiss) {
  527. if (dismiss === 'timer') {
  528. console.log('I was closed by the timer')
  529. }
  530. }
  531. );
  532. }
  533. function viewpic(t) {
  534. if (t.dataset.guid) {
  535. var obj = $table.bootstrapTable('getRowByUniqueId', t.dataset.guid);
  536. //var filefullname = "ftp://12.1.89.30:21010/pic/" + obj.imagepath1 + ".jpg";
  537. var filefullname = "http://<%=request.getServerName()%>:<%=request.getServerPort()%>/DB/pic/" + obj.imagepath1 + ".jpg";
  538. console.log(filefullname);
  539. swal({
  540. title: getAlarmTypeName(obj.alarmtype),
  541. text: obj.taskname,
  542. //imageUrl: 'https://unsplash.it/400/200/?random',
  543. //imageUrl: 'ftp://127.0.0.1:21010/pic/201612/{D7EE7FCC-CC00-466A-94E8-CEFEB20CB5F7}.jpg',
  544. imageUrl: filefullname,
  545. //imageWidth: 400,
  546. //imageHeight: 400,
  547. animation: false,
  548. confirmButtonText: "关闭"
  549. }).catch(swal.noop)
  550. }
  551. }
  552. window.operateEvents = {};
  553. function getHeight() {
  554. return $(window).height();
  555. //return $(window).height() - $('h1').outerHeight(true);
  556. return $(window).height() - $('.page-footer').outerHeight(true)
  557. - $('.page-header').outerHeight(true);
  558. }
  559. $resetcondition = $('#resetcondition');
  560. $resetcondition.click(function () {
  561. var ur = '<%=request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/"%>' + 'alarmdetaillist.cpp';
  562. window.location.href = ur;
  563. });
  564. $('#result').click(function () {
  565. var ur = '<%=request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/"%>' + 'alarmdetaillist.cpp?result=1';
  566. window.location.href = ur;
  567. })
  568. $(function () {
  569. var scripts = [
  570. //location.search.substring(1) ||
  571. 'js/bootstrap-table.min.js', 'js/bootstrap-table-zh-CN.min.js',
  572. 'js/bootstrap-table-export.min.js', 'js/tableExport.js',
  573. 'js/bootstrap-table-editable.min.js',
  574. //"js/bootstrap-table-filter-control.js",
  575. //'js/bootstrap-editable.js',
  576. 'js/bootstrap-table-toolbar.min.js'], eachSeries = function (arr, iterator, callback) {
  577. callback = callback || function () {
  578. };
  579. if (!arr.length) {
  580. return callback();
  581. }
  582. var completed = 0;
  583. var iterate = function () {
  584. iterator(arr[completed], function (err) {
  585. if (err) {
  586. callback(err);
  587. callback = function () {
  588. };
  589. } else {
  590. completed += 1;
  591. if (completed >= arr.length) {
  592. callback(null);
  593. } else {
  594. iterate();
  595. }
  596. }
  597. });
  598. };
  599. iterate();
  600. };
  601. eachSeries(scripts, getScript, initTable);
  602. });
  603. function getScript(url, callback) {
  604. var head = document.getElementsByTagName('head')[0];
  605. var script = document.createElement('script');
  606. script.src = url;
  607. var done = false;
  608. // Attach handlers for all browsers
  609. script.onload = script.onreadystatechange = function () {
  610. if (!done
  611. && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) {
  612. done = true;
  613. if (callback)
  614. callback();
  615. // Handle memory leak in IE
  616. script.onload = script.onreadystatechange = null;
  617. }
  618. };
  619. head.appendChild(script);
  620. // We handle everything using the script element injection
  621. return undefined;
  622. }
  623. </script>
  624. </body>
  625. </html>