nitrogenHome2.vue 26 KB

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