manhole.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  7. <link rel="stylesheet" href="style/reset.css" />
  8. <link rel="stylesheet" href="style/public.css" />
  9. <link rel="stylesheet" href="style/manhole.css" />
  10. <link rel="stylesheet" href="font/iconfont.css" />
  11. <title>Document</title>
  12. </head>
  13. <body>
  14. <section class="s1">
  15. <div class="s-title">
  16. <h2>设备概况</h2>
  17. <span class="tag">丰乐社区</span>
  18. </div>
  19. <div class="s1-title">总计设备数量 <span>200台</span></div>
  20. <div class="e-con">
  21. <div>
  22. <div id="con1"></div>
  23. <div class="con-txt">掀翻</div>
  24. </div>
  25. <div>
  26. <div id="con2"></div>
  27. <div class="con-txt">抬起</div>
  28. </div>
  29. <div>
  30. <div id="con3"></div>
  31. <div class="con-txt">水浸</div>
  32. </div>
  33. <div>
  34. <div id="con4"></div>
  35. <div class="con-txt">正常</div>
  36. </div>
  37. </div>
  38. </section>
  39. <div class="line"></div>
  40. <section class="s2">
  41. <div class="s-title">
  42. <h2>设备趋势</h2>
  43. <span class="tag">丰乐社区</span>
  44. </div>
  45. <div class="s2-con">
  46. <div class="s2-left">
  47. <div class="sl-title">设备报警时间</div>
  48. <div class="sl-sub" style="color:#fe2a2a">1分钟前</div>
  49. <div class="sl-title">区域负责人值班电话</div>
  50. <div class="sl-sub">13417787373</div>
  51. <div class="sl-title">丰乐社区消防大队值班电话</div>
  52. <div class="sl-sub">0750-8555199</div>
  53. </div>
  54. <div class="s2-right" id="s2-e"</div>
  55. </div>
  56. </section>
  57. <div class="line"></div>
  58. <section class="s3">
  59. <div class="s-title">
  60. <h2>设备列表</h2>
  61. <span class="tag">丰乐社区</span>
  62. </div>
  63. <div class="s3-select">
  64. <div>井盖传感器</div>
  65. <div>
  66. <select value="0" name="全部" id="select">
  67. <option value="0">全部</option>
  68. <option value="1">掀翻</option>
  69. <option value="2">抬起</option>
  70. <option value="3">水浸</option>
  71. <option value="4">正常</option>
  72. </select>
  73. </div>
  74. </div>
  75. <div class="jiaotong">
  76. <div class="jiaotong-table">
  77. <div class="t-header">
  78. <span>更新时间</span>
  79. <span>状态</span>
  80. <span>信号强度</span>
  81. <span>电量</span>
  82. <span>详情</span>
  83. </div>
  84. <div class="t-main">
  85. </div>
  86. </div>
  87. </div>
  88. </section>
  89. <div class="line"></div>
  90. <section class="s4">
  91. <div class="s-title">
  92. <h2>设备详情</h2>
  93. <span class="tag">AGE86ioj-35</span>
  94. </div>
  95. <div class="s4-con">
  96. <div class="s4-left" id="map"></div>
  97. <div class="s4-right">
  98. </div>
  99. </div>
  100. </section>
  101. <script src="js/jquery-3.2.1.min.js"></script>
  102. <script src="js/echarts.min.js"></script>
  103. <script src="https://webapi.amap.com/maps?v=1.4.10&key=e661b00bdf2c44cccf71ef6070ef41b8"></script>
  104. <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.6&key=e661b00bdf2c44cccf71ef6070ef41b8"></script>
  105. <script type="text/javascript" src="https://webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
  106. <script>
  107. let equipment = [{
  108. time:"19.03.27 21.23.27",
  109. status:'掀翻',
  110. temperature:"强",
  111. quantity:'99%',
  112. id:1,
  113. detail:{
  114. name:"AGE67ioj-49",
  115. lanlat:[113.0842709541, 22.5944937320],
  116. xinghao:"AllRange1",
  117. status:"掀翻",
  118. color:'#fe2a2a',
  119. update:"1分钟前",
  120. xinhao:"强",
  121. quantity:'99%',
  122. position:"丰乐社区沂水街南段东城街路口"
  123. }
  124. },{
  125. time:"19.03.27 21.23.27",
  126. status:'抬起',
  127. temperature:"强",
  128. quantity:'99%',
  129. id:2,
  130. detail:{
  131. name:"AGE67ioj-49",
  132. lanlat:[113.0842709541, 22.5944937320],
  133. xinghao:"AllRange1",
  134. status:"抬起",
  135. color:'#04cd0d',
  136. update:"1分钟前",
  137. xinhao:"强",
  138. quantity:'99%',
  139. position:"丰乐社区沂水街南段东城街路口"
  140. }
  141. },{
  142. time:"19.03.27 21.23.27",
  143. status:'水浸',
  144. temperature:"强",
  145. quantity:'99%',
  146. id:3,
  147. detail:{
  148. name:"AGE67ioj-49",
  149. lanlat:[113.0842709541, 22.5944937320],
  150. xinghao:"AllRange1",
  151. status:"水浸",
  152. color:'#fdca3a',
  153. update:"1分钟前",
  154. xinhao:"强",
  155. quantity:'99%',
  156. position:"丰乐社区沂水街南段东城街路口"
  157. }
  158. },{
  159. time:"19.03.27 21.23.27",
  160. status:'正常',
  161. temperature:"弱",
  162. quantity:'99%',
  163. id:0,
  164. detail:{
  165. name:"AGE67ioj-49",
  166. lanlat:[113.0842709541, 22.5944937320],
  167. xinghao:"AllRange1",
  168. color:'#479eff',
  169. status:"正常",
  170. update:"1分钟前",
  171. xinhao:"弱",
  172. quantity:'99%',
  173. position:"丰乐社区沂水街南段东城街路口"
  174. }
  175. }];
  176. let fixStatus={
  177. 0:'正常',
  178. 1:'掀翻',
  179. 2:'水浸',
  180. 3:'抬起',
  181. }
  182. let fixColor={
  183. 0:'#479eff',
  184. 1:'#fe2a2a',
  185. 2:'#fdca3a',
  186. 3:'#04cd0d',
  187. }
  188. console.log(fixStatus[111]);
  189. (function() {
  190. let c1 = "#fe2a2a";
  191. let c2 = "#04cd0d";
  192. let c3 = "#fdca3a";
  193. let c4 = "#479eff";
  194. let con1 = {
  195. color: [c1, "#a3a3a3"],
  196. title: {
  197. text: "25%",
  198. textStyle: {
  199. color: "#fff",
  200. fontSize: 12,
  201. fontWeight: "normal"
  202. },
  203. subtext: "50台",
  204. subtextStyle: {
  205. color: c1,
  206. fontSize: 14
  207. },
  208. x: "center",
  209. y: "30%"
  210. },
  211. series: [
  212. {
  213. name: "50台",
  214. type: "pie",
  215. textStyle: {
  216. color: "#999"
  217. },
  218. radius: ["80%", "65%"],
  219. center: ["50%", "50%"],
  220. avoidLabelOverlap: false,
  221. label: {
  222. normal: {
  223. show: false,
  224. position: "center"
  225. }
  226. },
  227. labelLine: {
  228. normal: {
  229. show: false
  230. }
  231. },
  232. data: [{ value: 25, name: "报警" }, { value: 75, name: "未报警" }]
  233. }
  234. ]
  235. };
  236. let con2 = {
  237. color: [c2, "#a3a3a3"],
  238. title: {
  239. text: "25%",
  240. textStyle: {
  241. color: "#fff",
  242. fontSize: 12,
  243. fontWeight: "normal"
  244. },
  245. subtext: "50台",
  246. subtextStyle: {
  247. color: c2,
  248. fontSize: 14
  249. },
  250. x: "center",
  251. y: "30%"
  252. },
  253. series: [
  254. {
  255. name: "50台",
  256. type: "pie",
  257. textStyle: {
  258. color: "#999"
  259. },
  260. radius: ["80%", "65%"],
  261. center: ["50%", "50%"],
  262. avoidLabelOverlap: false,
  263. label: {
  264. normal: {
  265. show: false,
  266. position: "center"
  267. }
  268. },
  269. labelLine: {
  270. normal: {
  271. show: false
  272. }
  273. },
  274. data: [{ value: 25, name: "报警" }, { value: 75, name: "未报警" }]
  275. }
  276. ]
  277. };
  278. let con3 = {
  279. color: [c3, "#a3a3a3"],
  280. title: {
  281. text: "25%",
  282. textStyle: {
  283. color: "#fff",
  284. fontSize: 12,
  285. fontWeight: "normal"
  286. },
  287. subtext: "50台",
  288. subtextStyle: {
  289. color: c3,
  290. fontSize: 14
  291. },
  292. x: "center",
  293. y: "30%"
  294. },
  295. series: [
  296. {
  297. name: "50台",
  298. type: "pie",
  299. textStyle: {
  300. color: "#999"
  301. },
  302. radius: ["80%", "65%"],
  303. center: ["50%", "50%"],
  304. avoidLabelOverlap: false,
  305. label: {
  306. normal: {
  307. show: false,
  308. position: "center"
  309. }
  310. },
  311. labelLine: {
  312. normal: {
  313. show: false
  314. }
  315. },
  316. data: [{ value: 25, name: "报警" }, { value: 75, name: "未报警" }]
  317. }
  318. ]
  319. };
  320. let con4 = {
  321. color: [c4, "#a3a3a3"],
  322. title: {
  323. text: "25%",
  324. textStyle: {
  325. color: "#fff",
  326. fontSize: 12,
  327. fontWeight: "normal"
  328. },
  329. subtext: "50台",
  330. subtextStyle: {
  331. color: c4,
  332. fontSize: 14
  333. },
  334. x: "center",
  335. y: "30%"
  336. },
  337. series: [
  338. {
  339. name: "50台",
  340. type: "pie",
  341. textStyle: {
  342. color: "#999"
  343. },
  344. radius: ["80%", "65%"],
  345. center: ["50%", "50%"],
  346. avoidLabelOverlap: false,
  347. label: {
  348. normal: {
  349. show: false,
  350. position: "center"
  351. }
  352. },
  353. labelLine: {
  354. normal: {
  355. show: false
  356. }
  357. },
  358. data: [{ value: 25, name: "报警" }, { value: 75, name: "未报警" }]
  359. }
  360. ]
  361. };
  362. let option = {
  363. title: {
  364. textStyle:{
  365. color:'#fff'
  366. }
  367. },
  368. grid: {
  369. left: '3%',
  370. right: '4%',
  371. bottom: '3%',
  372. containLabel: true
  373. },
  374. xAxis: {
  375. type: 'category',
  376. boundaryGap: false,
  377. data: ['周一','周二','周三','周四','周五','周六','周日'],
  378. axisLine: {
  379. lineStyle: {
  380. color: "#ffffff"
  381. }
  382. }
  383. },
  384. yAxis: {
  385. type: 'value',
  386. axisLine: {
  387. lineStyle: {
  388. color: "#ffffff"
  389. }
  390. },
  391. splitLine: {
  392. show: false
  393. },
  394. },
  395. series: [
  396. {
  397. name:'邮件营销',
  398. type:'line',
  399. stack: '总量',
  400. data:[120, 132, 101, 134, 90, 230, 210]
  401. },
  402. {
  403. name:'联盟广告',
  404. type:'line',
  405. stack: '总量',
  406. data:[220, 182, 191, 234, 290, 330, 310]
  407. },
  408. {
  409. name:'视频广告',
  410. type:'line',
  411. stack: '总量',
  412. data:[150, 232, 201, 154, 190, 330, 410]
  413. },
  414. {
  415. name:'直接访问',
  416. type:'line',
  417. stack: '总量',
  418. data:[320, 332, 301, 334, 390, 330, 320]
  419. },
  420. {
  421. name:'搜索引擎',
  422. type:'line',
  423. stack: '总量',
  424. data:[820, 932, 901, 934, 1290, 1330, 1320]
  425. }
  426. ]
  427. };
  428. let optionChart = echarts.init(document.querySelector("#s2-e"));
  429. let con1Chart = echarts.init(document.querySelector("#con1"));
  430. let con2Chart = echarts.init(document.querySelector("#con2"));
  431. let con3Chart = echarts.init(document.querySelector("#con3"));
  432. let con4Chart = echarts.init(document.querySelector("#con4"));
  433. optionChart.setOption(option);
  434. con1Chart.setOption(con1);
  435. con2Chart.setOption(con2);
  436. con3Chart.setOption(con3);
  437. con4Chart.setOption(con4);
  438. var map = new AMap.Map('map', {
  439. resizeEnable: true,
  440. zoom:14,
  441. center: [113.0842709541, 22.5944937320]
  442. });
  443. let arr = Array.from(document.querySelectorAll(".s1 .card")).concat(
  444. Array.from(document.querySelectorAll(".s2 .card"))
  445. );
  446. arr.forEach((dom, index) => {
  447. dom.addEventListener("click", e => {
  448. console.log("equipmentClickHandle", index);
  449. window.equipmentClickHandle && window.equipmentClickHandle(index);
  450. });
  451. });
  452. })();
  453. function getItemHtml(item) {
  454. return `<div class="s4-item">
  455. <div class="s4i-l">设备状态</div>
  456. <div class="s4i-r" style="color:${item.color};">${item.status}</div>
  457. </div>
  458. <div class="s4-item">
  459. <div class="s4i-l">更新时间</div>
  460. <div class="s4i-r">${item.update}</div>
  461. </div>
  462. <div class="s4-item">
  463. <div class="s4i-l">设备位置</div>
  464. <div class="s4i-r">${item.position}</div>
  465. </div>`
  466. }
  467. let arr = []
  468. function getDeviceList(fn) {
  469. $.ajax({
  470. url: "http://139.159.231.141:8182/api/device/list",
  471. type: "get",
  472. success: function(data) {
  473. let callback = JSON.parse(data)
  474. fn(callback)
  475. }
  476. });
  477. }
  478. getDeviceList(function (data) {
  479. arr = data.data.filter(item=>item.deviceType === "JG")
  480. update(arr)
  481. })
  482. function update(arr) {
  483. arr = arr.map(item=>{
  484. let status = fixStatus[item.status]
  485. let color = fixColor[item.status]
  486. console.log(status);
  487. return {
  488. time:item.updateTime,
  489. status:item.status,
  490. id:item.id,
  491. detail:{
  492. name:item.deviceId,
  493. lanlat:[item.longitude, item.latitude],
  494. color:color,
  495. status:status,
  496. update:item.updateTime,
  497. position:item.address
  498. }
  499. }
  500. })
  501. let htmlTemp = ""
  502. arr.forEach((item,idx)=>{
  503. htmlTemp+=`<div class="t-body ${idx===0?'active':''}" data-detail="${item.id}">
  504. <span>${item.time}</span>
  505. <span>${fixStatus[item.status]}</span>
  506. <span>强</span>
  507. <span>66%</span>
  508. <span>...</span>
  509. </div>`
  510. })
  511. let firstItem = arr[0].detail
  512. let htmlItem = getItemHtml(firstItem)
  513. $('.s4-right').html(htmlItem)
  514. $('.t-main').html(htmlTemp)
  515. $("#select").unbind('change').change(function(e){
  516. htmlTemp = ""
  517. let val = $("#select").find("option:selected").text();
  518. console.log(val);
  519. if (val!=="全部") {
  520. arr.forEach(item=>{
  521. if (fixStatus[item.status] === val) {
  522. htmlTemp+=`<div class="t-body" data-detail="${item.id}">
  523. <span>${item.time}</span>
  524. <span>${fixStatus[item.status]}</span>
  525. <span>强</span>
  526. <span>66%</span>
  527. <span>...</span>
  528. </div>`
  529. }
  530. })
  531. }
  532. else{
  533. arr.forEach(item=>{
  534. htmlTemp+=`<div class="t-body" data-detail="${item.id}">
  535. <span>${item.time}</span>
  536. <span>${fixStatus[item.status]}</span>
  537. <span>强</span>
  538. <span>66%</span>
  539. <span>...</span>
  540. </div>`
  541. })
  542. }
  543. $('.t-main').html(htmlTemp)
  544. });
  545. $('.t-main').unbind('click').on("click",".t-body",function (e) {
  546. let that = $(this)
  547. let id = that.data('detail')
  548. $('.t-main .t-body').removeClass('active')
  549. that.addClass('active')
  550. arr.forEach(item=>{
  551. if (item.id === id) {
  552. let html = getItemHtml(item.detail)
  553. $('.s4-right').html(html)
  554. }
  555. })
  556. })
  557. }
  558. // 建立连接对象(还未发起连接)
  559. if (socket) {
  560. socket = null
  561. }
  562. var socket = new SockJS("http://139.159.231.141:8182/webSocketServer");
  563. // 获取 STOMP 子协议的客户端对象
  564. var stompClient = Stomp.over(socket);
  565. // 向服务器发起websocket连接并发送CONNECT帧
  566. stompClient.connect(
  567. {},
  568. function connectCallback(frame) {
  569. subscribe1()
  570. console.log('连接成功');
  571. },
  572. function errorCallBack(error) {
  573. }
  574. );
  575. //订阅消息
  576. function subscribe1() {
  577. stompClient.subscribe("/topic/device", function(response) {
  578. // setMessageInnerHTML("已成功订阅/topic/device");
  579. var returnData = JSON.parse(response.body);
  580. let {id,status} = returnData
  581. arr = arr.map(item=> {
  582. if (item.id === id) {
  583. switch (status) {
  584. case 'ERC52':
  585. item.status = 2
  586. break;
  587. case 'ERC51':
  588. item.status = 1
  589. break;
  590. case 'ERC50':
  591. item.status = 3
  592. break;
  593. default:
  594. item.status = 0
  595. break;
  596. }
  597. }
  598. return item
  599. })
  600. update(arr)
  601. });
  602. }
  603. </script>
  604. </body>
  605. </html>