【前端】智能库房综合管理系统前端项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

935 lines
31 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. <template>
  2. <div class="env-container">
  3. <div class="env-top-title" />
  4. <div class="current-date">{{ nowDate }}</div>
  5. <div class="env-main">
  6. <div class="env-main-left">
  7. <div class="env-item container-wrap">
  8. <span class="right-top-line" />
  9. <span class="left-bottom-line" />
  10. <h3><i class="iconfont icon-kongqizhiliangshuju" />档案库空气质量数据</h3>
  11. <ul class="screen-env-list">
  12. <li v-show="topDisplayData.DAK_DIV_TOP_003.show" :class="{ 'li-warn': topDisplayData.DAK_DIV_TOP_003.curstatus > 0 }">
  13. <svg-icon icon-class="co2" class-name="msg-list-svg" />
  14. <div class="msg-txt">
  15. <span class="msg-list-num">{{ topDisplayData.DAK_DIV_TOP_003.curValue }}</span>
  16. <p class="msg-list-unit">CO2 {{ topDisplayData.DAK_DIV_TOP_003.unit }}</p>
  17. </div>
  18. </li>
  19. <li v-show="topDisplayData.DAK_DIV_TOP_004.show" :class="{ 'li-warn': topDisplayData.DAK_DIV_TOP_004.curstatus > 0 }">
  20. <svg-icon icon-class="voc" class-name="msg-list-svg" />
  21. <div class="msg-txt">
  22. <span class="msg-list-num">{{ topDisplayData.DAK_DIV_TOP_004.curValue }}</span>
  23. <p class="msg-list-unit">VOC {{ topDisplayData.DAK_DIV_TOP_004.unit }}</p>
  24. </div>
  25. </li>
  26. <li v-show="topDisplayData.DAK_DIV_TOP_005.show" :class="{ 'li-warn': topDisplayData.DAK_DIV_TOP_005.curstatus > 0 }" class="msg-pm">
  27. <svg-icon icon-class="pm25" class-name="msg-list-svg" />
  28. <div class="msg-txt">
  29. <span class="msg-list-num">{{ topDisplayData.DAK_DIV_TOP_005.curValue }}</span>
  30. <p class="msg-list-unit">PM2.5 {{ topDisplayData.DAK_DIV_TOP_005.unit }}</p>
  31. </div>
  32. </li>
  33. <li v-show="topDisplayData.DAK_DIV_TOP_006.show" :class="{ 'li-warn': topDisplayData.DAK_DIV_TOP_006.curstatus > 0 }" class="msg-pm">
  34. <svg-icon icon-class="pm10" class-name="msg-list-svg" />
  35. <div class="msg-txt">
  36. <span class="msg-list-num">{{ topDisplayData.DAK_DIV_TOP_006.curValue }}</span>
  37. <p class="msg-list-unit">PM10 {{ topDisplayData.DAK_DIV_TOP_006.unit }}</p>
  38. </div>
  39. </li>
  40. </ul>
  41. </div>
  42. <div class="env-item container-wrap">
  43. <span class="right-top-line" />
  44. <span class="left-bottom-line" />
  45. <h3><i class="iconfont icon-loushuijiance" />漏水检测</h3>
  46. <div class="leakage-detection">
  47. <div class="state-list">
  48. <span>正常</span>
  49. <span>报警</span>
  50. </div>
  51. <ul class="leakage-list">
  52. <li :class="{ 'leakage-warn': waterLeakage.waterLeakageStatus1 }">
  53. <p><i class="iconfont icon-weihubaojing" />维护报警</p>
  54. <span class="leakage-state-tip" />
  55. </li>
  56. <li :class="{ 'leakage-warn': waterLeakage.waterLeakageStatus2 }">
  57. <p><i class="iconfont icon-loushuibaojing" />漏水报警</p>
  58. <span class="leakage-state-tip" />
  59. </li>
  60. <li :class="{ 'leakage-warn': waterLeakage.waterLeakageStatus3 }">
  61. <p><i class="iconfont icon-ganyingxianduanlie" />感应线断裂</p>
  62. <span class="leakage-state-tip" />
  63. </li>
  64. <li :class="{ 'leakage-warn': waterLeakage.waterLeakageStatus4 }">
  65. <p><i class="iconfont icon-loushuiweizhi" />漏水位置</p>
  66. <span>{{ waterLeakage.waterLeakageText4 }}</span>
  67. </li>
  68. </ul>
  69. </div>
  70. </div>
  71. <!-- <div class="env-item container-wrap">
  72. <span class="right-top-line" />
  73. <span class="left-bottom-line" />
  74. <h3><i class="iconfont icon-menjinjilu" />门禁记录</h3>
  75. <el-table
  76. ref="table"
  77. style="min-width: 100%;"
  78. height="calc(100% - 38px)"
  79. :data="tableData"
  80. class="warehose-el-table"
  81. :row-class-name="rowBgColor"
  82. >
  83. <el-table-column prop="time" label="时间" align="center" min-width="60" />
  84. <el-table-column prop="warehouse" label="库房" align="center" min-width="60" />
  85. <el-table-column prop="name" label="档案名称" align="center" :show-overflow-tooltip="true" min-width="85" />
  86. </el-table>
  87. </div> -->
  88. <!-- 门禁记录 -->
  89. <security-door :height="'calc(100% - 38px)'" />
  90. </div>
  91. <div class="env-main-middle">
  92. <div class="env-3d">
  93. <iframe id="myIframe" ref="myIframe" name="iframeMap" class="iframe_box" src="/webA/index.html" frameborder="0" scrolling="no" />
  94. <ul class="screen-env-list">
  95. <li v-show="topDisplayData.DAK_DIV_TOP_001.show" :class="{ 'li-warn': topDisplayData.DAK_DIV_TOP_001.curstatus > 0 }">
  96. <svg-icon icon-class="temperature" class-name="msg-list-svg" />
  97. <div class="msg-txt">
  98. <span class="msg-list-num">{{ topDisplayData.DAK_DIV_TOP_001.curValue }}</span>
  99. <p class="msg-list-unit">温度 {{ topDisplayData.DAK_DIV_TOP_001.unit }}</p>
  100. </div>
  101. </li>
  102. <li v-show="topDisplayData.DAK_DIV_TOP_002.show" :class="{ 'li-warn': topDisplayData.DAK_DIV_TOP_002.curstatus > 0 }">
  103. <svg-icon icon-class="shidu" class-name="msg-list-svg" />
  104. <div class="msg-txt">
  105. <span class="msg-list-num">{{ topDisplayData.DAK_DIV_TOP_002.curValue }}</span>
  106. <p class="msg-list-unit">湿度 {{ topDisplayData.DAK_DIV_TOP_002.unit }}</p>
  107. </div>
  108. </li>
  109. </ul>
  110. </div>
  111. <!-- <div class="env-item container-wrap device-container">
  112. <span class="right-top-line" />
  113. <span class="left-bottom-line" />
  114. <h3><i class="iconfont icon-shebeizhuangtai" />设备状态</h3>
  115. <div class="state-list">
  116. <span>正常</span>
  117. <span>报警</span>
  118. </div>
  119. <ul class="env-device-list">
  120. <li class="device-warn">
  121. <div class="env-device-img">
  122. <img src="~@/assets/images/largeScreen/device-1.png" alt="">
  123. </div>
  124. <div class="env-device-text">
  125. <p>密集架</p>
  126. <span />
  127. </div>
  128. </li>
  129. <li>
  130. <div class="env-device-img">
  131. <img src="~@/assets/images/largeScreen/device-2.png" alt="">
  132. </div>
  133. <div class="env-device-text">
  134. <p>回转柜</p>
  135. <span />
  136. </div>
  137. </li>
  138. <li>
  139. <div class="env-device-img">
  140. <img src="~@/assets/images/largeScreen/device-3.png" alt="">
  141. </div>
  142. <div class="env-device-text">
  143. <p>空调</p>
  144. <span />
  145. </div>
  146. </li>
  147. <li>
  148. <div class="env-device-img">
  149. <img src="~@/assets/images/largeScreen/device-4.png" alt="">
  150. </div>
  151. <div class="env-device-text">
  152. <p>通道门</p>
  153. <span />
  154. </div>
  155. </li>
  156. <li>
  157. <div class="env-device-img">
  158. <img src="~@/assets/images/largeScreen/device-5.png" alt="">
  159. </div>
  160. <div class="env-device-text">
  161. <p>漏水传感器</p>
  162. <span />
  163. </div>
  164. </li>
  165. <li>
  166. <div class="env-device-img">
  167. <img src="~@/assets/images/largeScreen/device-6.png" alt="">
  168. </div>
  169. <div class="env-device-text">
  170. <p>温湿度传感器</p>
  171. <span />
  172. </div>
  173. </li>
  174. </ul>
  175. </div> -->
  176. <div class="middle-bottom">
  177. <!-- <span class="right-top-line" />
  178. <span class="left-bottom-line" /> -->
  179. <div class="container-wrap middle-bottom-l">
  180. <span class="right-top-line" />
  181. <span class="left-bottom-line" />
  182. <ul>
  183. <li>
  184. <div class="row-item">
  185. <div class="svg-box">
  186. <svg-icon icon-class="danganzongliang" class-name="card-panel-icon" />
  187. </div>
  188. <span>馆藏总量</span>
  189. </div>
  190. <span class="row-num">12345</span>
  191. </li>
  192. <li>
  193. <div class="row-item">
  194. <div class="svg-box">
  195. <svg-icon icon-class="danganzongliang" class-name="card-panel-icon" />
  196. </div>
  197. <span>在借数量</span>
  198. </div>
  199. <span class="row-num">12345</span>
  200. </li>
  201. <li>
  202. <div class="row-item">
  203. <div class="svg-box">
  204. <svg-icon icon-class="danganhezongliang" class-name="card-panel-icon" />
  205. </div>
  206. <span>在库数量</span>
  207. </div>
  208. <span class="row-num">12345</span>
  209. </li>
  210. </ul>
  211. <ul>
  212. <li>
  213. <div class="row-item">
  214. <div class="svg-box">
  215. <svg-icon icon-class="quanbushebei" class-name="card-panel-icon" />
  216. </div>
  217. <span>全部设备</span>
  218. </div>
  219. <span class="row-num">12345</span>
  220. </li>
  221. <li>
  222. <div class="row-item">
  223. <div class="svg-box">
  224. <svg-icon icon-class="zaixianshebei" class-name="card-panel-icon" />
  225. </div>
  226. <span>在线设备</span>
  227. </div>
  228. <span class="row-num">12345</span>
  229. </li>
  230. <li>
  231. <div class="row-item">
  232. <div class="svg-box">
  233. <svg-icon icon-class="lixianshebei" class-name="card-panel-icon" />
  234. </div>
  235. <span>离线设备</span>
  236. </div>
  237. <span class="row-num">12345</span>
  238. </li>
  239. </ul>
  240. </div>
  241. <div class="container-wrap middle-bottom-r">
  242. <span class="right-top-line" />
  243. <span class="left-bottom-line" />
  244. <ul>
  245. <li>
  246. <span>日借阅量</span>
  247. <NumFlip :tnum="daylend" />
  248. </li>
  249. <li><span>日归还量</span>
  250. <NumFlip :tnum="dayreturn" />
  251. </li>
  252. <li><span>月借阅量</span>
  253. <NumFlip :tnum="monlend" />
  254. </li>
  255. <li><span>月归还量</span>
  256. <NumFlip :tnum="monreturn" />
  257. </li>
  258. </ul>
  259. </div>
  260. </div>
  261. </div>
  262. <div class="env-main-right">
  263. <div class="env-item container-wrap">
  264. <span class="right-top-line" />
  265. <span class="left-bottom-line" />
  266. <h3><i class="iconfont icon-zhenglishi" />档案借阅</h3>
  267. <div class="chart-wrapper" style="height: calc(100% - 40px);">
  268. <lend-across :lend-data="lendData" :refreshtime="60000" />
  269. </div>
  270. </div>
  271. <div class="env-item container-wrap">
  272. <span class="right-top-line" />
  273. <span class="left-bottom-line" />
  274. <h3><i class="iconfont icon-zhenglishi" />档案类型</h3>
  275. <div v-if="typeData.length !== 0" class="chart-wrapper" style="height: calc(100% - 40px);">
  276. <type-pie :type-data="typeData" :refreshtime="60000" />
  277. </div>
  278. <div v-else class="empty-main">
  279. <svg-icon icon-class="empty" class-name="empty-img" />
  280. <p>暂无数据</p>
  281. </div>
  282. </div>
  283. <!-- 报警记录 -->
  284. <warehouse-warning :height="'calc(100% - 38px)'" />
  285. </div>
  286. </div>
  287. <!-- 摄像头视频 -->
  288. <Video ref="camera" />
  289. </div>
  290. </template>
  291. <script>
  292. import { getCurrentTime } from '@/utils/index'
  293. import typePie from '@/views/components/echarts/typePie.vue'
  294. import lendAcross from '@/views/components/echarts/lendAcross.vue'
  295. import Video from '@/views/storeManage/warehouse3D/module/video'
  296. import WarehouseWarning from '@/views/components/WarehouseWarning'
  297. import SecurityDoor from '@/views/components/SecurityDoor'
  298. import displayConfigApi from '@/api/storeManage/displayConfig'
  299. import thirdApi from '@/api/thirdApi'
  300. import { statisticsCrud } from '@/views/system/archiveStatistics/mixins/statistics'
  301. import NumFlip from './module/numFlip.vue'
  302. export default {
  303. name: 'EnvironmentalScreen',
  304. components: {
  305. WarehouseWarning,
  306. SecurityDoor,
  307. Video,
  308. lendAcross,
  309. typePie,
  310. NumFlip
  311. },
  312. mixins: [statisticsCrud],
  313. data() {
  314. return {
  315. nowDate: '',
  316. timer: null,
  317. lendData: [],
  318. typeData: [],
  319. className: ['readRoomContainer', 'collateRoomContainer'],
  320. roomId: 'D6490DA3D4261E8C26D0E3',
  321. allDisplayConfigData: [],
  322. displayConfigData: [],
  323. url: '',
  324. allDeviceIds: [],
  325. oaoMessage: [],
  326. topDisplayData: {
  327. DAK_DIV_TOP_001: {
  328. show: false,
  329. curValue: '',
  330. unit: '',
  331. curstatus: 0
  332. },
  333. DAK_DIV_TOP_002: {
  334. show: false,
  335. curValue: '',
  336. unit: '',
  337. curstatus: 0
  338. },
  339. DAK_DIV_TOP_003: {
  340. show: false,
  341. curValue: '',
  342. unit: '',
  343. curstatus: 0
  344. },
  345. DAK_DIV_TOP_004: {
  346. show: false,
  347. curValue: '',
  348. unit: '',
  349. curstatus: 0
  350. },
  351. DAK_DIV_TOP_005: {
  352. show: false,
  353. curValue: '',
  354. unit: '',
  355. curstatus: 0
  356. },
  357. DAK_DIV_TOP_006: {
  358. show: false,
  359. curValue: '',
  360. unit: '',
  361. curstatus: 0
  362. }
  363. },
  364. waterLeakage: {
  365. waterLeakageStatus1: false,
  366. waterLeakageStatus2: false,
  367. waterLeakageStatus3: false,
  368. waterLeakageStatus4: false,
  369. waterLeakageText4: ''
  370. },
  371. daylend: 'daylend',
  372. dayreturn: 'dayreturn',
  373. monlend: 'monlend',
  374. monreturn: 'monreturn'
  375. }
  376. },
  377. async created() {
  378. this.timer = setInterval(() => {
  379. this.nowDate = getCurrentTime()
  380. }, 1000)
  381. window.getIframeLoading = this.getIframeLoading // 把vue实例中的方法引用给window对象
  382. this.allDisplayConfigData = await displayConfigApi.list({ storeroomId: this.roomId })
  383. this.allDisplayConfigData.forEach(element => {
  384. if (element.isDisplay && element.bindState && element.deviceInfo && (element.divPosition.includes('OAO') || element.divPosition.includes('TOP') || element.divPosition.includes('LS'))) {
  385. this.allDeviceIds.push(element.deviceInfo.deviceId)
  386. if (!this.url) {
  387. this.url = 'http://' + element.deviceInfo.deviceIp + ':' + element.deviceInfo.devicePort
  388. }
  389. }
  390. })
  391. this.displayConfigData = this.allDisplayConfigData.filter((item) => { return item.isDisplay && item.bindState && item.deviceInfo && (item.divPosition.includes('OAO') || item.divPosition.includes('TOP') || item.divPosition.includes('LS')) })
  392. await this.getRealTimeData()
  393. },
  394. mounted() {
  395. const _this = this
  396. this.iframeWin = this.$refs.myIframe.contentWindow
  397. // inframe 加载完成之后
  398. document.getElementById('myIframe').onload = function() {
  399. _this.deviceState()
  400. }
  401. window.addEventListener('message', this.handleMessageDevice)
  402. // 定时请求第三方数据,更新页面数据
  403. this.dataTimer = setInterval(async() => {
  404. await _this.getRealTimeData()
  405. _this.handleAQI()
  406. }, 10000)
  407. },
  408. beforeDestroy() {
  409. if (this.timer) {
  410. clearInterval(this.timer)
  411. }
  412. if (this.dataTimer) {
  413. clearInterval(this.dataTimer)
  414. }
  415. },
  416. methods: {
  417. // 加载完成状态传值
  418. getIframeLoading(value) {
  419. // console.log(`我是iframe传过来的参数:${value}`)
  420. if (value === 'false') {
  421. this.allDisplayConfigData.forEach(element => {
  422. if ((!element.isDisplay || !element.bindState) && element.divPosition.includes('OAO')) {
  423. this.handleHide(element.divPosition)
  424. }
  425. })
  426. // this.handleAlarm('DAK_MO_OAO_003')
  427. this.deviceState()
  428. this.handleAQI()
  429. }
  430. },
  431. // 传入设备状态data / 给iframe传初始值
  432. deviceState(e) {
  433. this.iframeWin.postMessage({
  434. data: this.oaoMessage
  435. }, '*')
  436. },
  437. // 点击查看设备状况 / 密集架列号
  438. handleMessageDevice(event) {
  439. const _this = this
  440. if (event.data && event.data.data) {
  441. const data = event.data.data
  442. // 摄像头
  443. if (data.includes('CAM')) {
  444. _this.$nextTick(() => {
  445. this.$refs.camera.openVideoVisible = true
  446. // 后期看接口调试变化
  447. this.$refs.camera.videoSrc = 'https://qiniu.aiyxlib.com/1606275873000.mp4'
  448. this.$refs.camera.videoTitle = data
  449. })
  450. }
  451. }
  452. },
  453. // 设置温湿度
  454. handleAQI() {
  455. this.oaoMessage.forEach(element => {
  456. window.frames['iframeMap'].setAlertValue(element.id, element.wendu, element.sidu)
  457. })
  458. },
  459. // 设置温湿度报警状况
  460. handleAlarm(deviceId) {
  461. window.frames['iframeMap'].Myalert(deviceId, true)
  462. },
  463. // 设置是否显示
  464. handleHide(deviceId) {
  465. // true 显示 false 隐藏
  466. window.frames['iframeMap'].setYangGanCanshow(deviceId, false)
  467. },
  468. // 表格隔行变色
  469. rowBgColor({ row, rowIndex }) {
  470. if (rowIndex % 2 === 1) {
  471. return 'light-blue'
  472. } else {
  473. return ''
  474. }
  475. },
  476. getRealTimeData() {
  477. if (this.allDeviceIds.length > 0) {
  478. thirdApi.getRealTimeData({ ids: this.allDeviceIds, url: this.url }).then((data) => {
  479. this.oaoMessage.splice(0, this.oaoMessage.length)
  480. this.displayConfigData.forEach(element => {
  481. if (element.divPosition.includes('TOP') && element.deviceSpecParams[0]) {
  482. // 获取页面div显示的数据
  483. const result = data.find((item) => {
  484. return item.property_id === element.deviceSpecParams[0].paramId && item.device_id === element.deviceInfo.deviceId
  485. })
  486. if (result) {
  487. this.$set(this.topDisplayData, element.divPosition, {
  488. show: true,
  489. curValue: result.curvalue,
  490. unit: result.unit,
  491. curstatus: result.curstatus
  492. })
  493. } else {
  494. this.$set(this.topDisplayData, element.divPosition, {
  495. show: false
  496. })
  497. }
  498. } else if (element.divPosition.includes('OAO')) {
  499. // 获取3D弹窗显示的数据
  500. const wenduParamId = element.deviceSpecParams.find((item) => { return item.paramName === '温度' })?.paramId
  501. const siduParamId = element.deviceSpecParams.find((item) => { return item.paramName === '湿度' })?.paramId
  502. let wendu = {}
  503. let sidu = {}
  504. if (wenduParamId) {
  505. wendu = data.find((item) => {
  506. return item.property_id === wenduParamId && item.device_id === element.deviceInfo.deviceId
  507. })
  508. }
  509. if (siduParamId) {
  510. sidu = data.find((item) => {
  511. return item.property_id === siduParamId && item.device_id === element.deviceInfo.deviceId
  512. })
  513. }
  514. // console.log(wendu?.curstatus, sidu?.curstatus)
  515. this.oaoMessage.push({
  516. id: element.divPosition,
  517. wendu: (wendu?.curvalue) ? (Math.round(wendu?.curvalue)) : '-',
  518. sidu: (sidu?.curvalue) ? (Math.round(sidu?.curvalue)) : '-',
  519. alarmState: (wendu && wendu.curstatus > 0) || (sidu && sidu.curstatus > 0)
  520. })
  521. } else {
  522. // LS 漏水感应器
  523. const waterLeakageParamId1 = element.deviceSpecParams.find((item) => { return item.paramName === '维护报警' })?.paramId
  524. const waterLeakageParamId2 = element.deviceSpecParams.find((item) => { return item.paramName === '漏水报警' })?.paramId
  525. const waterLeakageParamId3 = element.deviceSpecParams.find((item) => { return item.paramName === '感应线断裂' })?.paramId
  526. const waterLeakage4 = element.deviceSpecParams.find((item) => { return item.paramName === '漏水位置' })
  527. if (waterLeakage4) {
  528. this.waterLeakage.waterLeakageText4 = waterLeakage4.unit
  529. }
  530. const waterLeakageParamId4 = waterLeakage4?.paramId
  531. if (waterLeakageParamId1) {
  532. this.waterLeakage.waterLeakageStatus1 = data.find((item) => {
  533. return item.property_id === waterLeakageParamId1 && item.device_id === element.deviceInfo.deviceId
  534. })?.curstatus > 0
  535. }
  536. if (waterLeakageParamId2) {
  537. this.$set(this.waterLeakage, 'waterLeakageStatus2', data.find((item) => {
  538. return item.property_id === waterLeakageParamId2 && item.device_id === element.deviceInfo.deviceId
  539. })?.curstatus > 0)
  540. }
  541. if (waterLeakageParamId3) {
  542. this.$set(this.waterLeakage, 'waterLeakageStatus3', data.find((item) => {
  543. return item.property_id === waterLeakageParamId3 && item.device_id === element.deviceInfo.deviceId
  544. })?.curstatus > 0)
  545. }
  546. if (waterLeakageParamId4) {
  547. const waterLeakageValue4 = data.find((item) => {
  548. return item.property_id === waterLeakageParamId4 && item.device_id === element.deviceInfo.deviceId
  549. })
  550. this.$set(this.waterLeakage, 'waterLeakageStatus4', waterLeakageValue4?.curstatus > 0)
  551. this.waterLeakage.waterLeakageText4 = waterLeakageValue4?.curvalue ? waterLeakageValue4?.curvalue + ' ' + this.waterLeakage.waterLeakageText4 : ''
  552. }
  553. }
  554. })
  555. })
  556. }
  557. }
  558. }
  559. }
  560. </script>
  561. <style rel="stylesheet/scss" lang="scss" scoped>
  562. @import "~@/assets/styles/lend-manage.scss";
  563. .env-container {
  564. width: 100%;
  565. height: calc(100vh);
  566. background-color: #031435;
  567. .env-top-title {
  568. width: calc(100vw);
  569. height: 130px;
  570. background: url("~@/assets/images/largeScreen/top-title.png") no-repeat 0 -14px;
  571. background-size: contain;
  572. }
  573. .current-date {
  574. position: fixed;
  575. top: 25px;
  576. right: 150px;
  577. font-size: 16px;
  578. color: #3a99fd;
  579. }
  580. .env-main {
  581. display: flex;
  582. justify-content: space-between;
  583. padding: 0 25px;
  584. margin-top: -12px;
  585. .env-main-left,
  586. .env-main-right {
  587. max-width: 24%;
  588. flex: 1;
  589. height: calc(100vh - 138px);
  590. overflow: hidden;
  591. }
  592. .env-main-middle {
  593. flex: 1;
  594. margin: 0 20px;
  595. height: calc(100vh - 138px);
  596. }
  597. .container-wrap {
  598. height: calc(100% / 3 - 14px);
  599. min-height: auto;
  600. }
  601. .env-item {
  602. margin-bottom: 20px;
  603. text-align: center;
  604. h3 {
  605. position: relative;
  606. display: inline-block;
  607. padding: 10px 70px;
  608. font-size: 16px;
  609. color: #fff;
  610. .iconfont {
  611. margin-right: 10px;
  612. font-size: 14px;
  613. color: #f65163;
  614. }
  615. &::before {
  616. content: "";
  617. position: absolute;
  618. left: 0;
  619. top: 50%;
  620. width: 36px;
  621. height: 12px;
  622. margin-top: -6px;
  623. background: url("~@/assets/images/largeScreen/item-left.png")
  624. no-repeat;
  625. background-size: cover;
  626. }
  627. &::after {
  628. content: "";
  629. position: absolute;
  630. top: 50%;
  631. right: 0;
  632. width: 36px;
  633. height: 12px;
  634. margin-top: -6px;
  635. background: url("~@/assets/images/largeScreen/item-right.png")
  636. no-repeat;
  637. background-size: cover;
  638. }
  639. }
  640. }
  641. .screen-env-list {
  642. flex-wrap: wrap;
  643. justify-content: space-between;
  644. height: calc(100% - 38px);
  645. padding: 0 44px 0 4px;
  646. li {
  647. flex: none;
  648. width: calc(100% / 2 - 44px);
  649. margin: 20px 0 20px 40px;
  650. height: calc(100% / 2 - 40px);
  651. .msg-list-svg {
  652. font-size: 40px;
  653. margin-left: 20px;
  654. }
  655. &.msg-pm {
  656. .msg-list-svg {
  657. font-size: 46px;
  658. }
  659. }
  660. }
  661. }
  662. .leakage-detection {
  663. padding: 0 44px;
  664. font-size: 14px;
  665. color: #339cff;
  666. height: calc(100% - 38px);
  667. .leakage-list {
  668. height: calc(100% - 26px);
  669. text-align: left;
  670. li {
  671. position: relative;
  672. display: flex;
  673. justify-content: space-between;
  674. align-items: center;
  675. height: calc(100% / 4 - 14px);
  676. margin-bottom: 14px;
  677. padding: 0 30px;
  678. border: 1px solid #3581cc;
  679. background-color: #02255f;
  680. border-radius: 2px;
  681. &::before {
  682. content: "";
  683. position: absolute;
  684. top: 4px;
  685. left: 4px;
  686. width: 0;
  687. height: 0;
  688. border-color: transparent #339cff;
  689. border-width: 0 0 6px 6px;
  690. border-style: solid;
  691. }
  692. p {
  693. i {
  694. margin-right: 8px;
  695. }
  696. }
  697. span.leakage-state-tip {
  698. position: relative;
  699. display: block;
  700. width: 6px;
  701. height: 6px;
  702. border-radius: 50%;
  703. background-color: #18b08f;
  704. &::before {
  705. content: "";
  706. position: absolute;
  707. left: 50%;
  708. top: 50%;
  709. width: 14px;
  710. height: 14px;
  711. border-radius: 50%;
  712. box-shadow: inset 0px 0px 10px 1px #18b08f;
  713. transform: translate(-50%, -50%);
  714. }
  715. }
  716. &.leakage-warn {
  717. border-color: #f65164;
  718. box-shadow: inset 0px 0px 15px 1px #f65164;
  719. color: #f65164;
  720. &::before {
  721. border-color: transparent #f65164;
  722. }
  723. span.leakage-state-tip {
  724. background-color: #f65164;
  725. &::before {
  726. box-shadow: inset 0px 0px 10px 1px #f65164;
  727. }
  728. }
  729. }
  730. }
  731. }
  732. }
  733. .state-list {
  734. display: flex;
  735. justify-content: flex-end;
  736. margin-bottom: 10px;
  737. font-size: 14px;
  738. color: #339cff;
  739. span {
  740. position: relative;
  741. display: block;
  742. padding-left: 16px;
  743. margin-left: 30px;
  744. &::before {
  745. content: "";
  746. position: absolute;
  747. left: 0;
  748. top: 50%;
  749. width: 10px;
  750. height: 10px;
  751. border-radius: 50%;
  752. margin-top: -5px;
  753. background-color: #18b08f;
  754. }
  755. &:last-child::before {
  756. background-color: #f65164;
  757. }
  758. }
  759. }
  760. .device-container {
  761. position: relative;
  762. .state-list {
  763. position: absolute;
  764. right: 40px;
  765. top: 12px;
  766. }
  767. .env-device-list {
  768. display: flex;
  769. height: calc(100% - 38px);
  770. justify-content: space-between;
  771. padding: 0 0 20px 20px;
  772. li {
  773. width: calc(100% / 6 - 20px);
  774. margin-right: 20px;
  775. .env-device-img {
  776. display: flex;
  777. align-items: center;
  778. justify-content: center;
  779. height: calc(100% - 40px);
  780. border: 1px solid #3581cc;
  781. margin-bottom: 10px;
  782. img {
  783. display: block;
  784. // height: 100%;
  785. // object-fit: contain;
  786. }
  787. }
  788. .env-device-text {
  789. position: relative;
  790. display: flex;
  791. justify-content: center;
  792. align-items: center;
  793. height: 36px;
  794. line-height: 36px;
  795. font-size: 14px;
  796. color: #339cff;
  797. border: 1px solid #3581cc;
  798. background-color: #02255f;
  799. border-radius: 36px;
  800. span {
  801. position: relative;
  802. // position: absolute;
  803. // right: 8px;
  804. // top: 50%;
  805. // margin-top: -3px;
  806. display: block;
  807. width: 6px;
  808. height: 6px;
  809. margin-left: 14px;
  810. border-radius: 50%;
  811. background-color: #18b08f;
  812. &::before {
  813. content: "";
  814. position: absolute;
  815. left: 50%;
  816. top: 50%;
  817. width: 14px;
  818. height: 14px;
  819. border-radius: 50%;
  820. box-shadow: inset 0px 0px 10px 1px #18b08f;
  821. transform: translate(-50%, -50%);
  822. }
  823. }
  824. }
  825. &.device-warn {
  826. .env-device-text {
  827. span {
  828. background-color: #f65164;
  829. &::before {
  830. box-shadow: inset 0px 0px 10px 1px #f65164;
  831. }
  832. }
  833. }
  834. }
  835. }
  836. }
  837. }
  838. .env-3d {
  839. position: relative;
  840. width: 100%;
  841. height: calc(100% - (100% / 4) - 8px);
  842. margin-bottom: 20px;
  843. background: url("~@/assets/images/largeScreen/bg.png") no-repeat center -130px;
  844. // background-size: 100% 100%;
  845. overflow: hidden;
  846. .iframe_box {
  847. width: 100%;
  848. height: 100%;
  849. margin-left: -80px;
  850. }
  851. .screen-env-list {
  852. position: absolute;
  853. right: 0;
  854. bottom: 0;
  855. flex-wrap: wrap;
  856. justify-content: space-between;
  857. padding: 0;
  858. width: 165px;
  859. height: 200px;
  860. li {
  861. width: 100%;
  862. margin: 20px 0 0 0;
  863. height: calc(100% / 2 - 20px);
  864. }
  865. }
  866. }
  867. }
  868. }
  869. .middle-bottom{
  870. display: flex;
  871. color: #339CFF ;
  872. font-size: 14px;
  873. justify-content: space-between;
  874. height: calc(100% - 198px);
  875. .middle-bottom-l{
  876. display: flex;
  877. justify-content: space-between;
  878. width: 60%;
  879. ul{
  880. width: 59%;
  881. padding: 25px 20px;
  882. display: flex;
  883. flex-direction: column;
  884. justify-content: space-between;
  885. li{
  886. height: calc(100% / 3 - 14px);
  887. background: linear-gradient(360deg, rgba(51,156,255,0.24) 0%, rgba(56,158,225,0) 70%, rgba(56,158,225,0) 100%);
  888. display: flex;
  889. align-items: center;
  890. justify-content: space-between;
  891. .row-item{
  892. display: flex;
  893. align-items: center;
  894. .svg-box{
  895. margin-right: 10px;
  896. .card-panel-icon{
  897. font-size: 24px;
  898. }
  899. }
  900. }
  901. .row-num{
  902. font-size: 18px;
  903. color: #fff;
  904. }
  905. // padding: 10px 0;
  906. }
  907. }
  908. }
  909. .middle-bottom-r{
  910. width: 38%;
  911. ul{
  912. width: 100%;
  913. height: 100%;
  914. padding: 20px;
  915. display: flex;
  916. flex-direction: column;
  917. justify-content: space-between;
  918. li{
  919. height: 20%;
  920. display: flex;
  921. align-items: center;
  922. justify-content: space-between;
  923. // padding: 10px 0;
  924. }
  925. }
  926. }
  927. }
  928. </style>