nitrogenHome1.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. <template>
  2. <div class="monitor-container">
  3. <template v-for="(sysItem, sysIndex) in deviceProperty.monitorDataGroupArr" :key="sysIndex">
  4. <div
  5. :id="`compressorCss3D${sysIndex + 1}`"
  6. class="threejs-Object-CSS compressorCss3D-box"
  7. style="width: 100%; height: 100%; position: absolute; pointer-events: none; overflow: hidden; z-index: 1; top: 0px; left: 0px"
  8. >
  9. </div>
  10. </template>
  11. <div id="compressor3D" style="width: 100%; height: 100%; position: absolute; overflow: hidden"></div>
  12. <div v-for="(sysItem, sysIndex) in deviceProperty.monitorDataGroupArr" :key="sysIndex" style="position: absolute; z-index: -1">
  13. <div v-show="monitorDataGroupFlag == sysIndex + 1" :id="`nitrogenMonitorBox${sysIndex}`">
  14. <div v-for="(groupNum, index) in sysItem" :key="index" class="modal-monitor">
  15. <fourBorderBg :class="`kyj${groupNum}`" :id="`nitrogenMonitor${groupNum}`">
  16. <div class="title">{{ deviceProperty.modelMonitor[0].title + (index + 1) }} </div>
  17. <template v-for="(preMonitor, preMonitorIndex) in deviceProperty.modelMonitor[0].list" :key="preMonitorIndex">
  18. <div v-if="preMonitor.code !== 'signal'" class="monitor-item">
  19. <span class="monitor-title">{{ preMonitor.title }}:</span>
  20. <span class="monitor-val"
  21. ><span class="val">{{
  22. selectData[`${deviceProperty.modelMonitor[0].key}${groupNum}${preMonitor.code}`]
  23. ? formatNum(selectData[`${deviceProperty.modelMonitor[0].key}${groupNum}${preMonitor.code}`])
  24. : '-'
  25. }}</span
  26. ><span class="unit">{{ preMonitor.unit }}</span></span
  27. >
  28. </div>
  29. <div v-else class="signal-item">
  30. <div class="signal" v-for="(signal, childIndex) in preMonitor.child" :key="childIndex">
  31. <span class="monitor-title">{{ signal.title }}</span>
  32. <span
  33. :class="{
  34. 'signal-round': true,
  35. 'signal-round-run': selectData[`${deviceProperty.modelMonitor[0].key}${groupNum}${preMonitor.code}`] == '0',
  36. 'signal-round-warning': selectData[`${deviceProperty.modelMonitor[0].key}${groupNum}${preMonitor.code}`] == '1',
  37. 'signal-round-gry':
  38. selectData[`${deviceProperty.modelMonitor[0].key}${groupNum}${preMonitor.code}`] != '1' &&
  39. selectData[`${deviceProperty.modelMonitor[0].key}${groupNum}${preMonitor.code}`] != '0',
  40. }"
  41. ></span>
  42. </div>
  43. </div>
  44. </template>
  45. </fourBorderBg>
  46. <fourBorderBg v-if="getShowModelMonitor(deviceProperty.modelMonitor[1], groupNum)" :class="`cqg${groupNum}`" :id="`cqgMonitor${groupNum}`">
  47. <div class="title">{{ deviceProperty.modelMonitor[1].title + (index + 1) }}</div>
  48. <template v-for="(cqgMonitor, cqgMonitorIndex) in deviceProperty.modelMonitor[1].list" :key="cqgMonitorIndex">
  49. <div v-if="cqgMonitor.code !== 'signal'" class="monitor-item">
  50. <span class="monitor-title">{{ cqgMonitor.title }}:</span>
  51. <span class="monitor-val"
  52. ><span class="val">{{
  53. selectData[`${deviceProperty.modelMonitor[1].key}${groupNum}${cqgMonitor.code}`]
  54. ? formatNum(selectData[`${deviceProperty.modelMonitor[1].key}${groupNum}${cqgMonitor.code}`])
  55. : '-'
  56. }}</span
  57. ><span class="unit">{{ cqgMonitor.unit }}</span></span
  58. >
  59. </div>
  60. <div v-else class="signal-item">
  61. <div class="signal" v-for="(signal, childIndex) in cqgMonitor.child" :key="childIndex">
  62. <span class="monitor-title">{{ signal.title }}</span>
  63. <span
  64. :class="{
  65. 'signal-round': true,
  66. 'signal-round-run': selectData[`${deviceProperty.modelMonitor[0].key}${groupNum}${cqgMonitor.code}`] == '0',
  67. 'signal-round-warning': selectData[`${deviceProperty.modelMonitor[0].key}${groupNum}${cqgMonitor.code}`] == '1',
  68. 'signal-round-gry':
  69. selectData[`${deviceProperty.modelMonitor[0].key}${groupNum}${cqgMonitor.code}`] != '1' &&
  70. selectData[`${deviceProperty.modelMonitor[0].key}${groupNum}${cqgMonitor.code}`] != '0',
  71. }"
  72. ></span>
  73. </div>
  74. </div>
  75. </template>
  76. </fourBorderBg>
  77. </div>
  78. </div>
  79. </div>
  80. <div class="total-data">
  81. <div class="vent-flex-row">
  82. <div class="item" v-for="(data, index) in deviceProperty.totalData" :key="index"
  83. >{{ data.title + '(' + data.unit + ')' }}:<span class="val">{{
  84. selectData[data.code] ? formatNum(selectData[data.code]) : '-'
  85. }}</span></div
  86. >
  87. </div>
  88. </div>
  89. <div v-if="selectData['netStatus'] == 0" class="device-state">网络断开</div>
  90. <div class="nitrogen-home">
  91. <div class="lr left-box">
  92. <div class="left-container">
  93. <div class="monitor-box">
  94. <template v-for="(device, leftIndex) in deviceProperty.leftMonitor" :key="leftIndex">
  95. <ventBox1 :class="{ 'vent-margin-t-10': leftIndex > 0 }">
  96. <template #title>
  97. <div>{{ device.title }}</div>
  98. </template>
  99. <template #container>
  100. <template v-for="(deviceChild, deviceChildIndex) in device.children" :key="deviceChildIndex">
  101. <div v-for="(deviceKey, deviceIndex) in deviceChild.key" :key="deviceIndex">
  102. <div v-if="deviceChild.key.length > 1" class="parameter-title group-parameter-title"
  103. ><SvgIcon class="icon" size="14" name="pulp-title" /><span>{{ deviceChild.childTitle[deviceIndex] }}</span></div
  104. >
  105. <div class="input-box">
  106. <div v-for="(item, index) in deviceChild.list" class="input-item" :key="index">
  107. <div
  108. :class="{
  109. 'w-280px': item.type == 'sign' || item.type == 'warning',
  110. title: item.type !== 'sign' && item.type !== 'warning',
  111. }"
  112. >{{ item.title }}:</div
  113. >
  114. <template v-if="item.type !== 'sign' && item.type !== 'warning'">
  115. <div class="value">{{
  116. selectData && selectData[deviceKey + item.code] ? formatNum(selectData[deviceKey + item.code], 1) : '-'
  117. }}</div>
  118. </template>
  119. <template v-else>
  120. <div class="value">
  121. <span
  122. :class="{
  123. 'signal-round': true,
  124. 'signal-round-run': item.type === 'sign' && selectData[deviceKey + item.code] == '1',
  125. 'signal-round-gry': selectData[deviceKey + item.code] == '0' || !selectData[deviceKey + item.code],
  126. 'signal-round-warning': item.type === 'warning' && selectData[deviceKey + item.code] == '1',
  127. }"
  128. ></span>
  129. </div>
  130. </template>
  131. </div>
  132. </div>
  133. </div>
  134. </template>
  135. </template>
  136. </ventBox1>
  137. </template>
  138. </div>
  139. </div>
  140. </div>
  141. <div class="lr right-box">
  142. <div class="item-box" :class="{ 'mt-50px': deviceProperty.totalData.length > 0 }">
  143. <ventBox1 v-for="(device, rightIndex) in deviceProperty.rightMonitor" :key="rightIndex" class="vent-margin-t-10">
  144. <template #title>
  145. <div>{{ device.title }}</div>
  146. </template>
  147. <template #container>
  148. <div>
  149. <template v-for="(deviceChild, deviceChildIndex) in device.children" :key="deviceChildIndex">
  150. <div v-for="(deviceKey, deviceIndex) in deviceChild.key" :key="deviceIndex">
  151. <div v-if="deviceChild.key.length > 1" class="parameter-title group-parameter-title"
  152. ><SvgIcon class="icon" size="14" name="pulp-title" /><span>{{ deviceChild.childTitle[deviceIndex] }}</span></div
  153. >
  154. <div class="input-box">
  155. <div v-for="(item, index) in deviceChild.list" class="input-item" :key="index">
  156. <div
  157. :class="{
  158. 'w-280px': item.type == 'sign' || item.type == 'warning',
  159. title: item.type !== 'sign' && item.type !== 'warning',
  160. }"
  161. >{{ item.title }}:</div
  162. >
  163. <template v-if="item.type !== 'sign' && item.type !== 'warning'">
  164. <div class="value">{{
  165. selectData && selectData[deviceKey + item.code] ? formatNum(selectData[deviceKey + item.code], 1) : '-'
  166. }}</div>
  167. </template>
  168. <template v-else>
  169. <div class="value">
  170. <span
  171. :class="{
  172. 'signal-round': true,
  173. 'signal-round-run': item.type === 'sign' && selectData[deviceKey + item.code] == '1',
  174. 'signal-round-gry': selectData[deviceKey + item.code] == '0' || !selectData[deviceKey + item.code],
  175. 'signal-round-warning': item.type === 'warning' && selectData[deviceKey + item.code] == '1',
  176. }"
  177. ></span>
  178. </div>
  179. </template>
  180. </div>
  181. </div>
  182. </div>
  183. </template>
  184. </div>
  185. </template>
  186. </ventBox1>
  187. </div>
  188. </div>
  189. </div>
  190. <div
  191. v-if="renderPlayer"
  192. ref="playerRef"
  193. class="player-box"
  194. :class="{ 'sw-player': sysOrgCode == 'sdmtjtswmk' || sysOrgCode == 'hnqymdktymk' }"
  195. ></div>
  196. </div>
  197. </template>
  198. <script setup lang="ts">
  199. import { ref, onMounted, onUnmounted, reactive, defineProps, inject, onBeforeUnmount } from 'vue';
  200. import { devicePropertyType, propertyListType, getMonitorData } from '../nitrogen.data.1';
  201. import fourBorderBg from '../../../comment/components/fourBorderBg.vue';
  202. import { mountedThree, destroy, setModelType } from '../nitrogen.threejs';
  203. import { list } from '../nitrogen.api';
  204. import ventBox1 from '/@/components/vent/ventBox1.vue';
  205. import { formatNum } from '/@/utils/ventutil';
  206. import { useCamera } from '/@/hooks/system/useCamera';
  207. import { useGlobSetting } from '/@/hooks/setting';
  208. const props = defineProps({
  209. deviceId: {
  210. type: String,
  211. require: true,
  212. },
  213. deviceType: {
  214. type: String,
  215. require: true,
  216. },
  217. });
  218. const { sysOrgCode } = useGlobSetting();
  219. // const sysOrgCode = 'sdmtjtswmk';
  220. const loading = ref(false);
  221. const monitorDataGroup = ref<Number[]>([]);
  222. const monitorDataGroupFlag = ref(1);
  223. const playerRef = ref();
  224. const renderPlayer = ref(true);
  225. const deviceProperty = ref({
  226. leftMonitor: [] as devicePropertyType[],
  227. rightMonitor: [] as devicePropertyType[],
  228. modelMonitor: [] as devicePropertyType[],
  229. detailCtrl: [] as devicePropertyType[],
  230. monitorDataGroupArr: [],
  231. totalData: [] as propertyListType[],
  232. });
  233. deviceProperty.value = await getMonitorData(props.deviceType);
  234. // 监测数据
  235. // const selectData = reactive({});
  236. const selectData = ref<Object | []>({});
  237. const { getCamera, removeCamera } = useCamera();
  238. // https获取监测数据
  239. let timer: null | NodeJS.Timeout = null;
  240. async function getMonitor(flag?) {
  241. if (Object.prototype.toString.call(timer) === '[object Null]') {
  242. return new Promise(async (resolve) => {
  243. timer = await setTimeout(
  244. async () => {
  245. await getDataSource();
  246. if (timer) {
  247. timer = null;
  248. }
  249. resolve(null);
  250. await getMonitor(false);
  251. },
  252. flag ? 0 : 1000
  253. );
  254. });
  255. }
  256. }
  257. async function getDataSource() {
  258. const res = await list({ devicetype: 'forcFan', pagetype: 'normal' });
  259. let dataSource = res.msgTxt[0] && res.msgTxt[0].datalist ? res.msgTxt[0].datalist[0] : [];
  260. // dataSource = {
  261. // msgType: null,
  262. // deviceID: '1781605808973565954',
  263. // strname: '压风机',
  264. // strinstallpos: '压风机',
  265. // fsectarea: 'null',
  266. // stationname: '压风机',
  267. // stationtype: 'redis',
  268. // deviceType: 'forcFan_normal',
  269. // typeName: '压风机',
  270. // netStatus: 1,
  271. // warnFlag: 0,
  272. // warnLevel: 0,
  273. // warnLevel_str: '正常',
  274. // warnTime: null,
  275. // readTime: '2024-04-23 08:23:49',
  276. // warnDes: '',
  277. // frontGateOpenCtrl: null,
  278. // rearGateOpenCtrl: null,
  279. // readData: {
  280. // PRE3_CPR_CoolantTemp: '62.0',
  281. // PRE1_MOT_PhaseATemp: '59.0',
  282. // PRE3_MOT_PhaseCTemp: '56.02',
  283. // PRE2_CPR_HeadTemp: '81.0',
  284. // sign: '0',
  285. // PRE1_CPR_UnLoadPre: '6.0',
  286. // PRE3_CPR_ExhaustPre: '5.7',
  287. // PRE1_CPR_LoadorUnload: '0',
  288. // PRE2_MOT_PhaseATempAlarm: '0',
  289. // PRE2_CPR_ExhaustTemp: '18.01',
  290. // PRE1_MOT_StopFail: '0',
  291. // PRE3_MOT_StopFail: '0',
  292. // PRE1_HMIReset: '0',
  293. // PRE2_HMIStop: '0',
  294. // PRE1_MOT_Ready: '1',
  295. // PRE2_CPR_LoadorUnload: '0',
  296. // PRE3_MOT_PhaseBTemp: '66.0',
  297. // Reset: '0',
  298. // PRE1_CPR_ExhaustPre: '5.3',
  299. // PRE3_FaultSignal: '0',
  300. // PRE1_MOT_PhaseATempAlarm: '0',
  301. // PRE2_MOT_PhaseBTempAlarm: '0',
  302. // PRE3_MOT_PhaseCTempAlarm: '0',
  303. // PRE2_HMIStart: '0',
  304. // PRE1_MOT_StartFail: '0',
  305. // PRE3_MOT_PhaseATemp: '66.0',
  306. // PRE2_CPR_CoolantTemp: '53.0',
  307. // PRE3_HostorLoc: '0',
  308. // PRE1_FaultSignal: '0',
  309. // PRE2_FaultSignal: '0',
  310. // PRE3_MOT_RunReturn: '1',
  311. // PRE1_HMIStart: '0',
  312. // PRE1_MOT_TotalRunTime: '6313.0',
  313. // 'PRE1_MOT_Pha seBTempAlarm': '0',
  314. // PRE1_CPR_LoadTime: '5184.0',
  315. // PRE2_MOT_PhaseCTempAlarm: '0',
  316. // PRE2_CPR_LoadTime: '3328.0',
  317. // PRE1_CPR_HeadTemp: '73.0',
  318. // PRE3_CPR_LoadTime: '5920.0',
  319. // PRE2_MOT_StartFail: '0',
  320. // PRE2_MOT_PhaseBTemp: '61.0',
  321. // PRE2_HostorLoc: '0',
  322. // PRE3_HMIStop: '0',
  323. // PRE3_CPR_HeadTemp: '84.0',
  324. // PRE2_MOT_TotalRunTime: '4272.0',
  325. // PRE3_HMIReset: '0',
  326. // PRE2_MOT_Ready: '1',
  327. // PRE2_MOT_RunReturn: '1',
  328. // PRE3_MOT_PhaseBTempAlarm: '0',
  329. // PRE2_MOT_StopFail: '0',
  330. // PRE3_CPR_UnLoadPre: '6.0',
  331. // PRE2_CPR_ExhaustPre: '5.7',
  332. // PRE3_CPR_ExhaustTemp: '18.09',
  333. // PRE3_MOT_StartFail: '0',
  334. // PRE3_MOT_TotalRunTime: '8474.0',
  335. // PRE2_MOT_PhaseATemp: '60.0',
  336. // PRE1_MOT_PhaseCTempAlarm: '0',
  337. // PRE3_HMIStart: '0',
  338. // PRE1_HMIStop: '0',
  339. // PRE3_MOT_Ready: '0',
  340. // PRE1_HostorLoc: '0',
  341. // PRE1_CPR_LoadPre: '5.0',
  342. // PRE1_MOT_RunReturn: '0',
  343. // PRE2_MOT_CtrlMode: '0',
  344. // PRE2_HMIReset: '0',
  345. // PRE1_MOT_CtrlMode: '0',
  346. // PRE3_CPR_LoadPre: '5.0',
  347. // PRE2_CPR_LoadPre: '5.0',
  348. // PRE3_MOT_CtrlMode: '0',
  349. // PRE1_MOT_PhaseCTemp: '58.0',
  350. // PRE3_CPR_LoadorUnload: '1',
  351. // TotalOutPipePre: '5.85',
  352. // PRE1_MOT_PhaseBTemp: '60.0',
  353. // PRE2_MOT_PhaseCTemp: '55.02',
  354. // PRE1_CPR_CoolantTemp: '55.0',
  355. // PRE3_MOT_PhaseATempAlarm: '0',
  356. // PRE2_CPR_UnLoadPre: '6.0',
  357. // isRun: '-2',
  358. // PRE1_CPR_ExhaustTemp: '16.12',
  359. // TotalOutPipeFlow: '884.0',
  360. // },
  361. // readDataDes: null,
  362. // summaryHour: [],
  363. // summaryDay: [],
  364. // history: [],
  365. // dayhistory: [],
  366. // totalInfo: null,
  367. // sign: null,
  368. // cameras: [],
  369. // links: [],
  370. // other1: null,
  371. // other2: null,
  372. // other3: null,
  373. // remarkInfo: null,
  374. // linkInfo: null,
  375. // };
  376. if (dataSource) {
  377. Object.assign(selectData.value, dataSource, dataSource.readData);
  378. }
  379. loading.value = false;
  380. }
  381. function setMonitorGroupNum(flag) {
  382. if (flag != monitorDataGroupFlag.value) monitorDataGroupFlag.value = flag;
  383. const monitorGroup = deviceProperty.value.monitorDataGroupArr[flag - 1];
  384. setModelType('compressor' + (flag - 1));
  385. monitorDataGroup.value = monitorGroup;
  386. }
  387. function handleOK() {}
  388. function handleCancel() {}
  389. // 判断是否应该在某套件(组别)下展示监测数据详情
  390. function getShowModelMonitor(config: devicePropertyType, groupNum: number) {
  391. if (config.hideInGroup) {
  392. return !config.hideInGroup.includes(groupNum);
  393. }
  394. return !!config.list.length;
  395. }
  396. onMounted(async () => {
  397. setTimeout(() => {
  398. mountedThree(deviceProperty.value.monitorDataGroupArr).then(async () => {
  399. setMonitorGroupNum(1);
  400. getMonitor(true).then(async () => {
  401. if (selectData.value && selectData.value['deviceID']) await getCamera(selectData.value['deviceID'], playerRef, renderPlayer);
  402. });
  403. });
  404. }, 0);
  405. });
  406. onBeforeUnmount(() => {
  407. removeCamera(playerRef);
  408. });
  409. onUnmounted(() => {
  410. destroy();
  411. if (timer) {
  412. clearTimeout(timer);
  413. timer = undefined;
  414. }
  415. });
  416. </script>
  417. <style lang="less" scoped>
  418. @import '/@/design/vent/modal.less';
  419. @import '../../comment/less/workFace.less';
  420. @ventSpace: zxm;
  421. .monitor-container {
  422. position: fixed;
  423. width: 100%;
  424. }
  425. .compressorCss3D-box {
  426. pointer-events: auto;
  427. .modal-monitor {
  428. position: absolute;
  429. left: 0px;
  430. top: 0px;
  431. }
  432. &:deep(.win) {
  433. margin: 0 !important;
  434. background: #00000044;
  435. }
  436. &:deep(.main) {
  437. .title {
  438. height: 34px;
  439. text-align: center;
  440. font-weight: 600;
  441. color: #7af5ff;
  442. // background-image: url('../../../assets/img/yfj/light.png');
  443. background-repeat: no-repeat;
  444. background-position-x: center;
  445. background-position-y: 100%;
  446. background-size: 80%;
  447. font-size: 16px;
  448. }
  449. .monitor-item {
  450. display: flex;
  451. flex-direction: row;
  452. width: auto;
  453. margin-bottom: 3px;
  454. .monitor-val {
  455. color: #ffb700;
  456. display: flex;
  457. width: auto;
  458. .val {
  459. width: 80px;
  460. font-size: 14px;
  461. }
  462. .unit {
  463. color: #ffffffbb;
  464. font-size: 14px;
  465. }
  466. }
  467. }
  468. .monitor-title {
  469. width: 100px;
  470. color: #7af5ff;
  471. font-weight: 400;
  472. font-size: 14px;
  473. }
  474. .signal-item {
  475. display: flex;
  476. justify-content: space-between;
  477. // margin-bottom: 5px;
  478. .signal-round {
  479. display: inline-block;
  480. width: 8px;
  481. height: 8px;
  482. border-radius: 50%;
  483. margin: 0 10px;
  484. position: relative;
  485. &::after {
  486. display: block;
  487. content: '';
  488. position: absolute;
  489. width: 12px;
  490. height: 12px;
  491. top: -2px;
  492. left: -2px;
  493. border-radius: 50%;
  494. }
  495. }
  496. .signal-round-gry {
  497. background-color: #858585;
  498. &::after {
  499. background-color: #85858544;
  500. box-shadow: 0 0 1px 1px #85858599;
  501. }
  502. }
  503. .signal-round-run {
  504. background-color: #67fc00;
  505. &::after {
  506. background-color: #67fc0044;
  507. box-shadow: 0 0 1px 1px #c6ff77;
  508. }
  509. }
  510. .signal-round-warning {
  511. background-color: #e9170b;
  512. &::after {
  513. background-color: #e9170b44;
  514. box-shadow: 0 0 1px 1px #e9170b;
  515. }
  516. }
  517. }
  518. }
  519. }
  520. .total-data {
  521. position: absolute;
  522. top: 40px;
  523. right: 100px;
  524. z-index: 999;
  525. color: #e4cd00;
  526. .item {
  527. width: 200px;
  528. margin-left: 30px;
  529. .val {
  530. color: #00d8ff;
  531. }
  532. }
  533. }
  534. .nitrogen-home {
  535. width: 100%;
  536. height: calc(100%);
  537. position: fixed;
  538. z-index: 0;
  539. height: calc(100%);
  540. display: flex;
  541. justify-content: space-between;
  542. position: relative;
  543. top: 20px;
  544. pointer-events: none;
  545. .lr {
  546. margin-top: 0 !important;
  547. }
  548. .left-box {
  549. width: 360px !important;
  550. direction: rtl;
  551. overflow-y: auto;
  552. overflow-x: hidden;
  553. // height: calc(100% - 60px);//lxh
  554. height: calc(100% - 100px);
  555. margin-top: 30px !important;
  556. .left-container {
  557. direction: ltr;
  558. :deep(.input-item .title) {
  559. width: 220px !important;
  560. }
  561. }
  562. }
  563. .right-box {
  564. width: 360px !important;
  565. overflow-y: auto;
  566. overflow-x: hidden;
  567. height: calc(100% - 70px); //lxh
  568. .environment-monitor {
  569. .item {
  570. flex: 1;
  571. margin: 0 5px;
  572. .title {
  573. color: #7ae5ff;
  574. text-align: center;
  575. margin-bottom: 2px;
  576. }
  577. .num {
  578. width: 100%;
  579. height: 30px;
  580. text-align: center;
  581. border-top: 2px solid #50c8fc;
  582. border-radius: 4px;
  583. background-image: linear-gradient(#2e4d5955, #3780b499, #2e465955);
  584. }
  585. }
  586. }
  587. .pool-box {
  588. width: 327px;
  589. height: 65px;
  590. padding: 0 5px;
  591. background: url('/@/assets/images/vent/pump1.png') no-repeat;
  592. background-size: cover;
  593. background-origin: content-box;
  594. margin-top: 2px;
  595. .num {
  596. color: aqua;
  597. }
  598. .center {
  599. padding-right: 5px;
  600. }
  601. }
  602. }
  603. }
  604. .device-state {
  605. width: 100%;
  606. position: absolute;
  607. top: 30px;
  608. color: #e90000;
  609. display: flex;
  610. justify-content: center;
  611. font-size: 20px;
  612. }
  613. .player-box {
  614. position: absolute;
  615. height: 100%;
  616. width: 100%;
  617. padding: 0 20px 0 20px;
  618. z-index: 9999;
  619. display: flex;
  620. align-items: end;
  621. bottom: 80px;
  622. pointer-events: none;
  623. :deep(#LivePlayerBox) {
  624. display: flex;
  625. justify-content: end;
  626. }
  627. }
  628. //**上湾视频样式 */
  629. .sw-player {
  630. right: 350px;
  631. bottom: 130px;
  632. display: flex;
  633. flex-direction: row;
  634. }
  635. .input-box {
  636. width: calc(100%);
  637. display: flex;
  638. flex-direction: row !important;
  639. flex-wrap: wrap !important;
  640. .input-item {
  641. width: calc(50% - 8px);
  642. padding: 0 2px;
  643. &:nth-child(2n) {
  644. margin-left: 4px;
  645. }
  646. }
  647. }
  648. .btn-group {
  649. width: 100%;
  650. position: fixed;
  651. display: flex;
  652. justify-content: end;
  653. right: 380px;
  654. top: 85px;
  655. pointer-events: auto;
  656. .btn-item {
  657. width: auto;
  658. text-align: center;
  659. }
  660. }
  661. .state-header {
  662. display: flex;
  663. color: #73e8fe;
  664. .header-item {
  665. width: 25%;
  666. text-align: center;
  667. }
  668. }
  669. .device-row {
  670. display: flex;
  671. margin-top: 10px;
  672. .state {
  673. width: 25%;
  674. text-align: center;
  675. font-size: 13px;
  676. }
  677. }
  678. :deep(.@{ventSpace}-tabs-tabpane-active) {
  679. overflow: auto;
  680. }
  681. </style>