index.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. <template>
  2. <div class="detail">
  3. <nav-bar></nav-bar>
  4. <van-row>
  5. <van-col span="24">
  6. <div class="flex-container flex-row" style="height: 140px">
  7. <div class="flex-item" style="flex-grow: 1">
  8. <div class="moduleCom">
  9. <div class="titleText">
  10. <span class="leftSty"></span><span>设备一览表(单位:台)</span>
  11. </div>
  12. <van-row class="detail-item">
  13. <van-col span="8">
  14. <div class="complete">
  15. <div class="numCls wj-title-blue">
  16. <span class="textSize">{{dataInfo.deviceOverview == null ? 0 : dataInfo.deviceOverview.edgeComputingHosts}}</span>
  17. </div>
  18. </div>
  19. <div class="moduleItem">
  20. <div class="fontCls">边缘计算主机</div>
  21. </div>
  22. </van-col>
  23. <van-col span="8">
  24. <div class="complete">
  25. <div class="numCls wj-title-blue">
  26. <span class="textSize">{{dataInfo.deviceOverview == null ? 0 : dataInfo.deviceOverview.iotDevices}}</span>
  27. </div>
  28. </div>
  29. <div class="moduleItem">
  30. <div class="fontCls">物联感知设备</div>
  31. </div>
  32. </van-col>
  33. <van-col span="8">
  34. <div class="complete">
  35. <div class="numCls wj-title-blue">
  36. <span class="textSize">{{dataInfo.deviceOverview == null ? 0 : dataInfo.deviceOverview.alarmControllers}}</span>
  37. </div>
  38. </div>
  39. <div class="moduleItem">
  40. <div class="fontCls">报警控制器</div>
  41. </div>
  42. </van-col>
  43. </van-row>
  44. <van-row class="detail-item">
  45. <van-col span="8">
  46. <div class="complete">
  47. <div class="numCls wj-title-blue">
  48. <span class="textSize">{{dataInfo.deviceOverview == null ? 0 : dataInfo.deviceOverview.hardDiskRecorders}}</span>
  49. </div>
  50. </div>
  51. <div class="moduleItem">
  52. <div class="fontCls">硬盘录像机</div>
  53. </div>
  54. </van-col>
  55. <van-col span="8">
  56. <div class="complete">
  57. <div class="numCls wj-title-blue">
  58. <span class="textSize">{{dataInfo.deviceOverview == null ? 0 : dataInfo.deviceOverview.cameras}}</span>
  59. </div>
  60. </div>
  61. <div class="moduleItem">
  62. <div class="fontCls">摄像机</div>
  63. </div>
  64. </van-col>
  65. <van-col span="8">
  66. <div class="complete">
  67. <div class="numCls wj-title-blue">
  68. <span class="textSize">{{dataInfo.deviceOverview == null ? 0 : dataInfo.deviceOverview.hardDisks}}</span>
  69. </div>
  70. </div>
  71. <div class="moduleItem">
  72. <div class="fontCls">硬盘</div>
  73. </div>
  74. </van-col>
  75. </van-row>
  76. </div>
  77. </div>
  78. </div>
  79. </van-col>
  80. </van-row>
  81. <van-row>
  82. <van-col span="12" class="customVanCell" >
  83. <div class="flex-container flex-column" style="height: 180px">
  84. <div class="flex-item" style="flex-grow: 1">
  85. <div class="moduleCom">
  86. <div class="titleText">
  87. <span class="leftSty"></span><span>告警总量</span>
  88. <van-image
  89. width="0.5rem"
  90. height="0.5rem"
  91. style="float: right;margin-right: 5px;"
  92. :src="require('@/assets/img/my/operta.png')"
  93. />
  94. </div>
  95. <van-row class="detail-item">
  96. <van-col span="24">
  97. <div class="complete">
  98. <div class="numCls wj-title-blue">
  99. <span class="textSize">{{dataInfo.totalAlerts}}</span>条
  100. </div>
  101. </div>
  102. </van-col>
  103. </van-row>
  104. </div>
  105. </div>
  106. <div class="flex-item" style="flex-grow: 1">
  107. <div class="moduleCom">
  108. <div class="titleText">
  109. <span class="leftSty"></span><span>烟雾感应器</span>
  110. <van-image
  111. width="0.5rem"
  112. height="0.5rem"
  113. style="float: right;margin-right: 5px;"
  114. :src="require('@/assets/img/my/operta.png')"
  115. />
  116. </div>
  117. <van-row class="detail-item">
  118. <van-col span="24">
  119. <div class="complete">
  120. <div class="numCls wj-title-blue">
  121. <span class="textSize">{{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(4182).deviceCount}}</span>台
  122. </div>
  123. <div class="moduleItem">
  124. <div class="fontCls">历史告警量: {{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(4182).historicalAlarmTotal}}条</div>
  125. </div>
  126. </div>
  127. </van-col>
  128. </van-row>
  129. </div>
  130. </div>
  131. </div>
  132. </van-col>
  133. <van-col span="12" class="customVanCell">
  134. <div class="flex-container flex-column" style="height: 180px">
  135. <div class="flex-item" style="flex-grow: 1">
  136. <div class="moduleCom">
  137. <div class="titleText">
  138. <span class="leftSty"></span><span>录像文件自检</span>
  139. <van-image
  140. width="0.5rem"
  141. height="0.5rem"
  142. style="float: right;margin-right: 5px;"
  143. :src="require('@/assets/img/my/operta.png')"
  144. />
  145. </div>
  146. <van-row class="detail-item" :style="{'margin-top': rightMargin}">
  147. <van-col span="24">
  148. <div class="complete">
  149. <div class="numCls wj-title-blue">
  150. <span class="textSize">{{dataInfo.videoInspection == null ? 0 : dataInfo.videoInspection.lostRate}}</span>
  151. </div>
  152. <div class="moduleItem">
  153. <div class="fontCls">录像文件丢失率</div>
  154. </div>
  155. </div>
  156. </van-col>
  157. </van-row>
  158. <van-row class="detail-item" :style="{'margin-top': rightMargin}">
  159. <van-col span="24">
  160. <div class="complete">
  161. <div class="numCls wj-title-blue">
  162. <span class="textSize">{{dataInfo.videoInspection == null ? 0 : dataInfo.videoInspection.hardDiskExceptionRate}}</span>
  163. </div>
  164. <div class="moduleItem">
  165. <div class="fontCls">硬盘异常率</div>
  166. </div>
  167. </div>
  168. </van-col>
  169. </van-row>
  170. </div>
  171. </div>
  172. </div>
  173. </van-col>
  174. </van-row>
  175. <van-row>
  176. <van-col span="12" class="customVanCell">
  177. <div class="flex-container flex-column" style="height: 180px">
  178. <div class="flex-item" style="flex-grow: 1">
  179. <div class="moduleCom">
  180. <div class="titleText">
  181. <span class="leftSty"></span><span>燃气感应器</span>
  182. <van-image
  183. width="0.5rem"
  184. height="0.5rem"
  185. style="float: right;margin-right: 5px;"
  186. :src="require('@/assets/img/my/operta.png')"
  187. />
  188. </div>
  189. <van-row class="detail-item">
  190. <van-col span="24">
  191. <div class="complete">
  192. <div class="numCls wj-title-blue">
  193. <span class="textSize">{{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(41885).deviceCount}}</span>台
  194. </div>
  195. <div class="moduleItem">
  196. <div class="fontCls">历史告警量: {{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(41885).historicalAlarmTotal}}条</div>
  197. </div>
  198. </div>
  199. </van-col>
  200. </van-row>
  201. </div>
  202. </div>
  203. <div class="flex-item" style="flex-grow: 1">
  204. <div class="moduleCom">
  205. <div class="titleText">
  206. <span class="leftSty"></span><span>温湿度传感器</span>
  207. <van-image
  208. width="0.5rem"
  209. height="0.5rem"
  210. style="float: right;margin-right: 5px;"
  211. :src="require('@/assets/img/my/operta.png')"
  212. />
  213. </div>
  214. <van-row class="detail-item">
  215. <van-col span="24">
  216. <div class="complete">
  217. <div class="numCls wj-title-blue">
  218. <span class="textSize">{{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(4183).deviceCount}}</span>台
  219. </div>
  220. <div class="moduleItem">
  221. <div class="fontCls">历史告警量: {{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(4183).historicalAlarmTotal}}条</div>
  222. </div>
  223. </div>
  224. </van-col>
  225. </van-row>
  226. </div>
  227. </div>
  228. </div>
  229. </van-col>
  230. <van-col span="12" class="customVanCell">
  231. <div class="flex-container flex-column" style="height: 180px">
  232. <div class="flex-item" style="flex-grow: 1">
  233. <div class="moduleCom">
  234. <div class="titleText">
  235. <span class="leftSty"></span><span>录像存储天数</span>
  236. <van-image
  237. width="0.5rem"
  238. height="0.5rem"
  239. style="float: right;margin-right: 5px;"
  240. :src="require('@/assets/img/my/operta.png')"
  241. />
  242. </div>
  243. <van-row class="detail-item" :style="{'margin-top': rightMargin}">
  244. <van-col span="24">
  245. <div class="complete">
  246. <div class="numCls wj-title-blue">
  247. <span class="textSize">{{this.daysMap.size === 0 ? "-" : this.daysMap.get('30')}}</span>
  248. </div>
  249. <div class="moduleItem">
  250. <div class="fontCls">大于或等于30天</div>
  251. </div>
  252. </div>
  253. </van-col>
  254. </van-row>
  255. <van-row class="detail-item" :style="{'margin-top': rightMargin}">
  256. <van-col span="24">
  257. <div class="complete">
  258. <div class="numCls wj-title-blue">
  259. <span class="textSize">{{this.daysMap.size === 0 ? "-" : this.daysMap.get('90')}}</span>
  260. </div>
  261. <div class="moduleItem">
  262. <div class="fontCls">大于或等于90天</div>
  263. </div>
  264. </div>
  265. </van-col>
  266. </van-row>
  267. </div>
  268. </div>
  269. </div>
  270. </van-col>
  271. </van-row>
  272. <van-row>
  273. <van-col span="12" class="customVanCell">
  274. <div class="flex-container flex-column" style="height: 180px">
  275. <div class="flex-item" style="flex-grow: 1">
  276. <div class="moduleCom">
  277. <div class="titleText">
  278. <span class="leftSty"></span><span>门窗磁传感器</span>
  279. <van-image
  280. width="0.5rem"
  281. height="0.5rem"
  282. style="float: right;margin-right: 5px;"
  283. :src="require('@/assets/img/my/operta.png')"
  284. />
  285. </div>
  286. <van-row class="detail-item">
  287. <van-col span="24">
  288. <div class="complete">
  289. <div class="numCls wj-title-blue">
  290. <span class="textSize">{{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(4188).deviceCount}}</span>台
  291. </div>
  292. <div class="moduleItem">
  293. <div class="fontCls">历史告警量: {{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(4188).historicalAlarmTotal}}条</div>
  294. </div>
  295. </div>
  296. </van-col>
  297. </van-row>
  298. </div>
  299. </div>
  300. <div class="flex-item" style="flex-grow: 1">
  301. <div class="moduleCom">
  302. <div class="titleText">
  303. <span class="leftSty"></span><span>红外探测器</span>
  304. <van-image
  305. width="0.5rem"
  306. height="0.5rem"
  307. style="float: right;margin-right: 5px;"
  308. :src="require('@/assets/img/my/operta.png')"
  309. />
  310. </div>
  311. <van-row class="detail-item">
  312. <van-col span="24">
  313. <div class="complete">
  314. <div class="numCls wj-title-blue">
  315. <span class="textSize">{{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(4181).deviceCount}}</span>台
  316. </div>
  317. <div class="moduleItem">
  318. <div class="fontCls">历史告警量: {{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(4181).historicalAlarmTotal}}条</div>
  319. </div>
  320. </div>
  321. </van-col>
  322. </van-row>
  323. </div>
  324. </div>
  325. </div>
  326. </van-col>
  327. <van-col span="12" class="customVanCell">
  328. <div class="flex-container flex-column" style="height: 180px">
  329. <div class="flex-item" style="flex-grow: 1">
  330. <div class="moduleCom">
  331. <div class="titleText">
  332. <span class="leftSty"></span><span>视频画面诊断</span>
  333. <van-image
  334. width="0.5rem"
  335. height="0.5rem"
  336. style="float: right;margin-right: 5px;"
  337. :src="require('@/assets/img/my/operta.png')"
  338. />
  339. </div>
  340. <van-row class="detail-item" :style="{'margin-top': rightMargin}">
  341. <van-col span="24">
  342. <div class="complete">
  343. <div class="numCls wj-title-blue">
  344. <span class="textSize">{{dataInfo.videoDiagnostic == null ? 0 : dataInfo.videoDiagnostic.singleLostAlarmNums}}</span>条
  345. </div>
  346. <div class="moduleItem">
  347. <div class="fontCls">视频丢失历史告警量</div>
  348. </div>
  349. </div>
  350. </van-col>
  351. </van-row>
  352. <van-row class="detail-item" :style="{'margin-top': rightMargin}">
  353. <van-col span="24">
  354. <div class="complete">
  355. <div class="numCls wj-title-blue">
  356. <span class="textSize">{{dataInfo.videoDiagnostic == null ? 0 : dataInfo.videoDiagnostic.occludeAlarmNums}}</span>条
  357. </div>
  358. <div class="moduleItem">
  359. <div class="fontCls">视频遮挡历史告警量</div>
  360. </div>
  361. </div>
  362. </van-col>
  363. </van-row>
  364. </div>
  365. </div>
  366. </div>
  367. </van-col>
  368. </van-row>
  369. <van-row>
  370. <van-col span="12" class="customVanCell">
  371. <div class="flex-container flex-column" style="height: 240px">
  372. <div class="flex-item" style="flex-grow: 1">
  373. <div class="moduleCom">
  374. <div class="titleText">
  375. <span class="leftSty"></span><span>水浸传感器</span>
  376. <van-image
  377. width="0.5rem"
  378. height="0.5rem"
  379. style="float: right;margin-right: 5px;"
  380. :src="require('@/assets/img/my/operta.png')"
  381. />
  382. </div>
  383. <van-row class="detail-item">
  384. <van-col span="24">
  385. <div class="complete">
  386. <div class="numCls wj-title-blue">
  387. <span class="textSize">{{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(4184).deviceCount}}</span>台
  388. </div>
  389. <div class="moduleItem">
  390. <div class="fontCls">历史告警量: {{this.sensorDataMap.size === 0 ? 0 : this.sensorDataMap.get(4184).historicalAlarmTotal}}条</div>
  391. </div>
  392. </div>
  393. </van-col>
  394. </van-row>
  395. </div>
  396. </div>
  397. <div class="flex-item" style="flex-grow: 2">
  398. <div class="moduleCom">
  399. <div class="titleText">
  400. <span class="leftSty"></span><span>空调控制器</span>
  401. <van-image
  402. width="0.5rem"
  403. height="0.5rem"
  404. style="float: right;margin-right: 5px;"
  405. :src="require('@/assets/img/my/operta.png')"
  406. />
  407. </div>
  408. <van-row class="detail-item">
  409. <van-col span="24">
  410. <div class="complete">
  411. <div class="numCls wj-title-blue">
  412. <span class="textSize">{{dataInfo.airConditionerInfo == null ? 0 : dataInfo.airConditionerInfo.totalDevices}}</span>台
  413. </div>
  414. <div class="moduleItem">
  415. <div class="fontCls">设备总数</div>
  416. </div>
  417. </div>
  418. </van-col>
  419. </van-row>
  420. <van-row class="detail-item" :style="{'margin-top': leftMargin}">
  421. <van-col span="24">
  422. <div class="complete">
  423. <div class="numCls wj-title-blue">
  424. <span class="textSize">{{dataInfo.airConditionerInfo == null ? 0 : dataInfo.airConditionerInfo.linkExceptions}}</span>台
  425. </div>
  426. <div class="moduleItem">
  427. <div class="fontCls">连接异常</div>
  428. </div>
  429. </div>
  430. </van-col>
  431. </van-row>
  432. </div>
  433. </div>
  434. </div>
  435. </van-col>
  436. <van-col span="12" class="customVanCell">
  437. <div class="flex-container flex-column" style="height: 240px">
  438. <div class="flex-item" style="flex-grow: 3">
  439. <div class="moduleCom">
  440. <div class="titleText">
  441. <span class="leftSty"></span><span>UPS状态信息</span>
  442. <van-image
  443. width="0.5rem"
  444. height="0.5rem"
  445. style="float: right;margin-right: 5px;"
  446. :src="require('@/assets/img/my/operta.png')"
  447. />
  448. </div>
  449. <van-row class="detail-item">
  450. <van-col span="24">
  451. <div class="complete">
  452. <div class="numCls wj-title-blue">
  453. <span class="textSize">{{dataInfo.upsInfo == null ? 0 : dataInfo.upsInfo.totalDevices}}</span>台
  454. </div>
  455. <div class="moduleItem">
  456. <div class="fontCls">设备总数</div>
  457. </div>
  458. </div>
  459. </van-col>
  460. </van-row>
  461. <van-row class="detail-item">
  462. <van-col span="24">
  463. <div class="complete">
  464. <div class="numCls wj-title-blue">
  465. <span class="textSize">{{dataInfo.upsInfo == null ? 0 : dataInfo.upsInfo.communicationInterrupts}}</span>台
  466. </div>
  467. <div class="moduleItem">
  468. <div class="fontCls">通信中断</div>
  469. </div>
  470. </div>
  471. </van-col>
  472. </van-row>
  473. <van-row class="detail-item">
  474. <van-col span="24">
  475. <div class="complete">
  476. <div class="numCls wj-title-blue">
  477. <span class="textSize">{{dataInfo.upsInfo == null ? 0 : dataInfo.upsInfo.shutdownDevices}}</span>台
  478. </div>
  479. <div class="moduleItem">
  480. <div class="fontCls">设备关机</div>
  481. </div>
  482. </div>
  483. </van-col>
  484. </van-row>
  485. <van-row class="detail-item">
  486. <van-col span="24">
  487. <div class="complete">
  488. <div class="numCls wj-title-blue">
  489. <span class="textSize">{{dataInfo.upsInfo == null ? 0 : dataInfo.upsInfo.historicalAlarmCounts}}</span>条
  490. </div>
  491. <div class="moduleItem">
  492. <div class="fontCls">历史告警量</div>
  493. </div>
  494. </div>
  495. </van-col>
  496. </van-row>
  497. </div>
  498. </div>
  499. </div>
  500. </van-col>
  501. </van-row>
  502. </div>
  503. </template>
  504. <script>
  505. import {dataScreen} from '@/api/iot/board.js'
  506. import NavBar from '@/components/NavBar'
  507. export default {
  508. components: { NavBar},
  509. data() {
  510. return {
  511. rightMargin: '10%',
  512. leftMargin: '5%',
  513. dataInfo: {
  514. deviceOverview:{
  515. edgeComputingHosts: 0,
  516. iotDevices: 0,
  517. alarmControllers: 0,
  518. hardDiskRecorders: 0,
  519. cameras: 0,
  520. hardDisks: 0
  521. },
  522. totalAlerts: 0,
  523. videoInspection: {
  524. lostRate: '-',
  525. hardDiskExceptionRate: '-'
  526. },
  527. recordingStorage: {
  528. hashmap: null
  529. },
  530. videoDiagnostic: {
  531. singleLostAlarmNums: 0,
  532. occludeAlarmNums: 0
  533. },
  534. airConditionerInfo: {
  535. totalDevices: 0,
  536. linkExceptions: 0
  537. },
  538. upsInfo: {
  539. totalDevices: 0,
  540. communicationInterrupts: 0,
  541. shutdownDevices: 0,
  542. historicalAlarmCounts: 0
  543. },
  544. sensorDetails: null
  545. },
  546. sensorDataMap: new Map(),
  547. daysMap: new Map()
  548. }
  549. },
  550. computed: {
  551. },
  552. watch: {},
  553. props: {
  554. },
  555. methods: {
  556. refresh() {
  557. dataScreen().then(r => {
  558. this.dataInfo = r.data
  559. if (r.data && r.data.sensorDetails){
  560. r.data.sensorDetails.forEach(item =>{
  561. this.sensorDataMap.set(item.type,item);
  562. })
  563. }
  564. if (r.data && r.data.recordingStorage && r.data.recordingStorage.hashmap){
  565. this.daysMap = new Map(Object.entries(r.data.recordingStorage.hashmap));
  566. }
  567. })
  568. }
  569. },
  570. async created() {},
  571. async mounted() {
  572. this.refresh();
  573. }
  574. }
  575. </script>
  576. <style lang="scss" scoped>
  577. .detail{
  578. //background-color: rgba(237, 252, 255, 1);
  579. }
  580. .flex-container {
  581. display: -webkit-flex;
  582. display: flex;
  583. width: auto;
  584. height: auto;
  585. }
  586. .flex-row{
  587. flex-direction: row;
  588. }
  589. .flex-column{
  590. flex-direction: column;
  591. }
  592. .flex-item {
  593. background-color: #e5e5e5;
  594. width: auto;
  595. margin: 10px;
  596. border-radius: 5px;
  597. }
  598. .numCls{
  599. text-align: center;
  600. margin-top: 5px;
  601. }
  602. .textSize{
  603. font-size: 40px;
  604. }
  605. .fontCls{
  606. text-align: center;
  607. margin-top: 2px;
  608. }
  609. .detail-item{
  610. margin-top: 10px;
  611. }
  612. .moduleItem{
  613. margin-top: 5px;
  614. }
  615. .titleText{
  616. margin-top: 10px;
  617. margin-left: 10px;
  618. font-size: 30px;
  619. font-weight: bold;
  620. }
  621. </style>