nitrogenHome1.vue 23 KB

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