nitrogenHome.vue 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  1. <template>
  2. <div id="compressor3D" style="width: 100%; height: 100%; position: absolute; overflow: hidden"></div>
  3. <template v-for="(sysItem, sysIndex) in 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: 2; top: 0px; left: 0px"
  8. >
  9. </div>
  10. </template>
  11. <div v-for="(sysItem, sysIndex) in monitorDataGroupArr" :key="sysIndex" style="position: absolute; z-index: -1">
  12. <div v-show="monitorDataGroupFlag == sysIndex + 1" :id="`nitrogenMonitorBox${sysIndex}`">
  13. <div v-for="(groupNum, index) in sysItem" :key="index" class="modal-monitor">
  14. <fourBorderBg :class="`kyj${groupNum}`" :id="`nitrogenMonitor${groupNum}`">
  15. <div class="title">{{ `空压机${groupNum}` }} </div>
  16. <template v-for="(preMonitor, preMonitorIndex) in preMonitorList" :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"
  20. ><span class="val">{{
  21. monitorData[preMonitor.code.replace(prefix[0], `${prefix[0]}${groupNum}`)]
  22. ? formatNum(monitorData[preMonitor.code.replace(prefix[0], `${prefix[0]}${groupNum}`)])
  23. : preMonitor.value
  24. ? preMonitor.value
  25. : '-'
  26. }}</span
  27. ><span class="unit">{{ preMonitor.unit }}</span></span
  28. >
  29. </div>
  30. <div v-else class="signal-item">
  31. <div class="signal" v-for="(signal, childIndex) in preMonitor.child" :key="childIndex">
  32. <span class="monitor-title">{{ signal.title }}</span>
  33. <span
  34. :class="{
  35. 'signal-round': true,
  36. 'signal-round-run': signal.title != '故障信号' && monitorData[signal.code.replace(prefix[0], `${prefix[0]}${groupNum}`)] == '1',
  37. 'signal-round-warning':
  38. signal.title == '故障信号' && monitorData[signal.code.replace(prefix[0], `${prefix[0]}${groupNum}`)] == '1',
  39. 'signal-round-gry': monitorData[signal.code.replace(prefix[0], `${prefix[0]}${groupNum}`)] != '1',
  40. }"
  41. ></span>
  42. </div>
  43. </div>
  44. </template>
  45. </fourBorderBg>
  46. <fourBorderBg :class="`cqg${groupNum}`" :id="`cqgMonitor${groupNum}`" v-if="cqgMonitorList && cqgMonitorList.length > 0">
  47. <div class="title">{{ `风包${groupNum}` }}</div>
  48. <template v-for="(cqgMonitor, cqgMonitorIndex) in cqgMonitorList" :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. monitorData[cqgMonitor.code.replace(prefix[0], `${prefix[1]}${groupNum}`)]
  54. ? formatNum(monitorData[cqgMonitor.code.replace(prefix[1], `${prefix[1]}${groupNum}`)])
  55. : cqgMonitor.value
  56. ? cqgMonitor.value
  57. : '-'
  58. }}</span
  59. ><span class="unit">{{ cqgMonitor.unit }}</span></span
  60. >
  61. </div>
  62. </template>
  63. </fourBorderBg>
  64. </div>
  65. </div>
  66. </div>
  67. <div class="nitrogen-home">
  68. <div style="position: absolute; color: #fff; top: 30px; pointer-events: auto; display: flex" v-if="monitorDataGroupArr.length > 1">
  69. <div
  70. v-for="(sysItem, sysIndex) in monitorDataGroupArr"
  71. :key="sysIndex"
  72. class="tab-button-box"
  73. :class="{ 'tab-button-box-active': monitorDataGroupFlag == sysIndex + 1 }"
  74. @click="setMonitorGroupNum(sysIndex + 1)"
  75. >{{ '压风系统' + (sysIndex + 1) }}
  76. <!-- (运行: <p style="padding: 0 5px"></p
  77. ><span
  78. :class="{
  79. 'signal-round': true,
  80. 'signal-round-run': sysStateList[sysIndex] && sysStateList[sysIndex].isRun,
  81. 'signal-round-gry': sysStateList[sysIndex] && !sysStateList[sysIndex].isRun,
  82. }"
  83. ></span>
  84. <p style="padding: 0 5px"></p>故障:<p style="padding: 0 5px"></p
  85. ><span
  86. :class="{
  87. 'signal-round': true,
  88. 'signal-round-warning': sysStateList[sysIndex] && sysStateList[sysIndex].fault,
  89. 'signal-round-gry': sysStateList[sysIndex] && !sysStateList[sysIndex].fault,
  90. }"
  91. ></span
  92. ><p style="padding: 0 5px"></p> ) -->
  93. </div>
  94. </div>
  95. <div class="total-data" v-if="totalData && totalData.length > 0">
  96. <div class="vent-flex-row">
  97. <div class="item" v-for="(data, index) in totalData" :key="index"
  98. >{{ data.title + '(' + data.unit + ')' }}:<span class="val">{{
  99. monitorData[data.code] ? formatNum(monitorData[data.code]) : data.value ? data.value : '-'
  100. }}</span></div
  101. >
  102. </div>
  103. </div>
  104. <div class="total-data" v-if="totalData1 && totalData1.length > 0">
  105. <div class="vent-flex-row item-box">
  106. <div class="item" v-for="(data, index) in totalData1[monitorDataGroupFlag - 1]" :key="index"
  107. ><div>{{ data.title + '(' + data.unit + ')' }}:</div
  108. ><div class="val">{{ monitorData[data.code] ? formatNum(monitorData[data.code]) : data.value ? data.value : '-' }}</div>
  109. </div>
  110. </div>
  111. </div>
  112. <div class="nitrogen-container">
  113. <div v-if="monitorData['netStatus'] == 0" class="device-state">网络断开</div>
  114. <div class="top-box">
  115. <!-- 左边监测数据 -->
  116. <div class="lr-box left-box">
  117. <div class="left-container" v-if="preFanMonitorData && preFanMonitorData.length > 0">
  118. <div class="item item-l" v-for="(groupNum, index) in monitorDataGroup" :key="index">
  119. <div class="monitor-box">
  120. <ventBox1>
  121. <template #title>
  122. <div>{{ groupNum }}号压风机</div>
  123. </template>
  124. <template #container>
  125. <div class="state-item">
  126. <div class="item-col" v-for="(preFan, preFanIndex) in preFanMonitorData" :key="preFanIndex">
  127. <span class="state-title">{{
  128. preFan.title + (preFan.unit !== 'signal' && preFan.unit !== 'warning' ? `(${preFan.unit})` : '')
  129. }}</span>
  130. <span v-if="preFan.unit !== 'signal' && preFan.unit !== 'warning'" class="state-val">{{
  131. monitorData[preFan.code.replace(prefix[2], prefix[2] + groupNum)] >= 0
  132. ? formatNum(Number(monitorData[preFan.code.replace(prefix[2], prefix[2] + groupNum)]))
  133. : preFan.value
  134. ? preFan.value
  135. : '-'
  136. }}</span>
  137. <span
  138. v-else
  139. :class="{
  140. 'signal-round': true,
  141. 'signal-round-run':
  142. preFan.unit == 'signal' && monitorData[preFan.code.replace(prefix[2], `${prefix[2]}${groupNum}`)] != '1',
  143. 'signal-round-warning':
  144. preFan.unit == 'warning' && monitorData[preFan.code.replace(prefix[2], `${prefix[2]}${groupNum}`)] == '1',
  145. 'signal-round-gry': monitorData[preFan.code.replace(prefix[2], `${prefix[2]}${groupNum}`)] != '1',
  146. }"
  147. ></span>
  148. </div>
  149. </div>
  150. </template>
  151. </ventBox1>
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156. <div class="lr-box right-box">
  157. <div class="right-container" v-if="(btnSet && btnSet.length > 0) || (controlSet && controlSet.length > 0)">
  158. <ventBox1>
  159. <template #title>
  160. <div>设备控制</div>
  161. </template>
  162. <template #container>
  163. <div class="vent-flex-row btn-box" v-if="btnSet">
  164. <div class="btn btn1 ml-16px" v-for="(btn, index) in btnSet" :key="index">{{ btn.title }}</div>
  165. </div>
  166. <template v-if="controlSet">
  167. <div class="input-item" v-for="(item, index) in controlSet" :key="index">
  168. <div class="title-auto">{{ item.title }}:</div>
  169. <div>
  170. <a-input class="input-value" v-model="item.value" />
  171. <span class="btn btn1 vent-margin-l-8">保存</span>
  172. </div>
  173. </div>
  174. </template>
  175. </template>
  176. </ventBox1>
  177. </div>
  178. </div>
  179. <div ref="playerRef" class="playerBox"> </div>
  180. </div>
  181. </div>
  182. </div>
  183. </template>
  184. <script lang="ts" setup name="nitrogenHome">
  185. import { onMounted, onUnmounted, ref, onBeforeUnmount } from 'vue';
  186. import fourBorderBg from '../../../comment/components/fourBorderBg.vue';
  187. import { mountedThree, destroy, setModelType } from '../nitrogen.threejs';
  188. import { list } from '../nitrogen.api';
  189. import ventBox1 from '/@/components/vent/ventBox1.vue';
  190. import { getMonitorData } from '../nitrogen.data.1';
  191. import type { State } from '../nitrogen.data.1';
  192. import { formatNum } from '/@/utils/ventutil';
  193. import { useCamera } from '/@/hooks/system/useCamera';
  194. const { monitorDataGroupArr, preFanMonitorData, preMonitorList, cqgMonitorList, prefix, getSysState, totalData, totalData1, btnSet, controlSet } =
  195. await getMonitorData();
  196. const loading = ref(true);
  197. const monitorDataGroupFlag = ref(1);
  198. const monitorDataGroup = ref<Number[]>([]);
  199. const kyjs = ref<string[]>([]);
  200. const cqgs = ref<string[]>([]);
  201. const monitorData = ref<Object | []>({});
  202. const sysStateList = ref<State[]>([]);
  203. const playerRef = ref();
  204. const { getCamera, removeCamera } = useCamera();
  205. // https获取监测数据
  206. let timer: null | NodeJS.Timeout = null;
  207. async function getMonitor(flag?) {
  208. if (Object.prototype.toString.call(timer) === '[object Null]') {
  209. return new Promise(async (resolve) => {
  210. timer = await setTimeout(
  211. async () => {
  212. await getDataSource();
  213. if (timer) {
  214. timer = null;
  215. }
  216. resolve(null);
  217. await getMonitor(false);
  218. },
  219. flag ? 0 : 1000
  220. );
  221. });
  222. }
  223. }
  224. async function getDataSource() {
  225. const res = await list({ devicetype: 'forcFan', pagetype: 'normal' });
  226. let dataSource = res.msgTxt[0] && res.msgTxt[0].datalist ? res.msgTxt[0].datalist[0] : [];
  227. // dataSource = {
  228. // msgType: null,
  229. // deviceID: '1766018589748658177',
  230. // strname: '压风机',
  231. // strinstallpos: '压风机',
  232. // fsectarea: 'null',
  233. // stationname: '压风机分站',
  234. // stationtype: 'http_kc',
  235. // deviceType: 'forcFan_auto',
  236. // typeName: '压风机',
  237. // netStatus: 1,
  238. // warnFlag: 0,
  239. // warnLevel: 0,
  240. // warnLevel_str: '正常',
  241. // syswarnLevel: null,
  242. // syswarnLevel_str: null,
  243. // syswarnLevel_des: null,
  244. // warnTime: null,
  245. // readTime: '2025-02-20 16:25:40',
  246. // warnDes: '',
  247. // frontGateOpenCtrl: null,
  248. // rearGateOpenCtrl: null,
  249. // readData: {
  250. // Compressor4GasSupplyPressure: '0.52',
  251. // PreFan2Fault: '0',
  252. // sign: '0',
  253. // Compressor1CurrentA: '0',
  254. // Compressor1WindBagTemp: '10',
  255. // Compressor5GasSupplyPressure: '0.57',
  256. // Compressor4ExhaustTemp: '91',
  257. // Compressor4RunTime: '1334',
  258. // Compressor5RunTime: '6308.78809',
  259. // Compressor2WindBagPressure: '0.50247',
  260. // Compressor2LoadTime: '14228',
  261. // Compressor1RunTime: '20219',
  262. // Compressor2GasSupplyPressure: '0.53',
  263. // Compressor6RunTime: '13355',
  264. // Compressor2RunTime: '13776.78613',
  265. // Compressor3RunTime: '7053.3335',
  266. // Compressor6WindBagTemp: '4.4',
  267. // Compressor4LoadTime: '1532',
  268. // Compressor6GasSupplyPressure: '0.53',
  269. // Compressor1ExhaustTemp: '16',
  270. // Compressor3ExhaustTemp: '86',
  271. // Compressor5LoadTime: '5029.39404',
  272. // Compressor1GasSupplyPressure: '0.54',
  273. // Compressor3WindBagTemp: '9',
  274. // Totalpressure: '0.48107',
  275. // Compressor4CurrentA: '21',
  276. // Compressor6CurrentA: '0',
  277. // PreFan5Fault: '1',
  278. // Compressor4WindBagTemp: '12.5',
  279. // Compressor1WindBagPressure: '0.49739',
  280. // Compressor6WindBagPressure: '0.49817',
  281. // Compressor5WindBagTemp: '4.8',
  282. // Compressor2CurrentA: '22',
  283. // Compressor2ExhaustTemp: '87',
  284. // Compressor2WindBagTemp: '14',
  285. // PreFan4Fault: '0',
  286. // Compressor3LoadTime: '4670.1665',
  287. // Compressor5ExhaustTemp: '22',
  288. // Compressor1Working: '0',
  289. // Compressor2Working: '1',
  290. // Compressor3Working: '1',
  291. // Compressor4Working: '1',
  292. // Compressor5Working: '0',
  293. // Compressor6Working: '0',
  294. // Compressor6LoadTime: '11308',
  295. // PreFan3Fault: '0',
  296. // Compressor6ExhaustTemp: '17',
  297. // Compressor3WindBagPressure: '0.49328',
  298. // Compressor1LoadTime: '15877',
  299. // PreFan1Fault: '0',
  300. // Compressor3GasSupplyPressure: '0.53',
  301. // Compressor5CurrentA: '0',
  302. // Compressor3CurrentA: '22',
  303. // Compressor5WindBagPressure: '0.48107',
  304. // Compressor4WindBagPressure: '0.49856',
  305. // isRun: '-2',
  306. // },
  307. // readDataDes: null,
  308. // summaryHour: [],
  309. // summaryDay: [],
  310. // history: [],
  311. // dayhistory: [],
  312. // totalInfo: null,
  313. // sign: null,
  314. // cameras: [],
  315. // links: [],
  316. // other1: null,
  317. // other2: null,
  318. // other3: null,
  319. // remarkInfo: null,
  320. // linkInfo: null,
  321. // addrIndex: null,
  322. // warnLogNotOkCount: 0,
  323. // };
  324. if (dataSource) {
  325. Object.assign(monitorData.value, dataSource, dataSource.readData);
  326. }
  327. loading.value = false;
  328. sysStateList.value = getSysState(monitorData.value);
  329. }
  330. function setMonitorGroupNum(flag) {
  331. if (flag != monitorDataGroupFlag.value) monitorDataGroupFlag.value = flag;
  332. const monitorGroup = monitorDataGroupArr[flag - 1];
  333. setModelType('compressor' + (flag - 1));
  334. monitorDataGroup.value = monitorGroup;
  335. }
  336. onMounted(async () => {
  337. setTimeout(() => {
  338. mountedThree(monitorDataGroupArr).then(async () => {
  339. setMonitorGroupNum(1);
  340. getMonitor(true).then(async () => {
  341. if (monitorData.value && monitorData.value['deviceID']) await getCamera(monitorData.value['deviceID'], playerRef.value);
  342. });
  343. });
  344. }, 0);
  345. });
  346. onBeforeUnmount(() => {
  347. removeCamera();
  348. });
  349. onUnmounted(() => {
  350. destroy();
  351. removeCamera();
  352. if (timer) {
  353. clearTimeout(timer);
  354. timer = undefined;
  355. }
  356. });
  357. </script>
  358. <style lang="less" scoped>
  359. @import '../../comment/less/workFace.less';
  360. @ventSpace: zxm;
  361. .compressorCss3D-box {
  362. .modal-monitor {
  363. position: absolute;
  364. left: 0px;
  365. top: 0px;
  366. }
  367. &:deep(.win) {
  368. margin: 0 !important;
  369. background: #00000044;
  370. }
  371. &:deep(.main) {
  372. .title {
  373. height: 34px;
  374. text-align: center;
  375. font-weight: 600;
  376. color: #7af5ff;
  377. // background-image: url('../../../assets/img/yfj/light.png');
  378. background-repeat: no-repeat;
  379. background-position-x: center;
  380. background-position-y: 100%;
  381. background-size: 80%;
  382. font-size: 16px;
  383. }
  384. .monitor-item {
  385. display: flex;
  386. flex-direction: row;
  387. width: auto;
  388. margin-bottom: 3px;
  389. .monitor-val {
  390. color: #ffb700;
  391. display: flex;
  392. width: auto;
  393. .val {
  394. width: 80px;
  395. font-size: 14px;
  396. }
  397. .unit {
  398. color: #ffffffbb;
  399. font-size: 14px;
  400. }
  401. }
  402. }
  403. .monitor-title {
  404. width: 100px;
  405. color: #7af5ff;
  406. font-weight: 400;
  407. font-size: 14px;
  408. }
  409. .signal-item {
  410. display: flex;
  411. justify-content: space-between;
  412. // margin-bottom: 5px;
  413. .signal-round {
  414. display: inline-block;
  415. width: 8px;
  416. height: 8px;
  417. border-radius: 50%;
  418. margin: 0 10px;
  419. position: relative;
  420. &::after {
  421. display: block;
  422. content: '';
  423. position: absolute;
  424. width: 12px;
  425. height: 12px;
  426. top: -2px;
  427. left: -2px;
  428. border-radius: 50%;
  429. }
  430. }
  431. .signal-round-gry {
  432. background-color: #858585;
  433. &::after {
  434. background-color: #85858544;
  435. box-shadow: 0 0 1px 1px #85858599;
  436. }
  437. }
  438. .signal-round-run {
  439. background-color: #67fc00;
  440. &::after {
  441. background-color: #67fc0044;
  442. box-shadow: 0 0 1px 1px #c6ff77;
  443. }
  444. }
  445. .signal-round-warning {
  446. background-color: #e9170b;
  447. &::after {
  448. background-color: #e9170b44;
  449. box-shadow: 0 0 1px 1px #e9170b;
  450. }
  451. }
  452. }
  453. }
  454. }
  455. .nitrogen-home {
  456. width: 100%;
  457. height: calc(100%);
  458. position: fixed;
  459. z-index: 99;
  460. display: flex;
  461. flex-direction: column;
  462. justify-content: center;
  463. align-items: center;
  464. pointer-events: none;
  465. top: 60px;
  466. .total-data {
  467. position: absolute;
  468. color: #e4cd00;
  469. z-index: 9;
  470. top: 20px;
  471. right: 30px;
  472. // display: flex;
  473. font-size: 18px;
  474. .item {
  475. margin-left: 20px;
  476. .val {
  477. display: inline-box;
  478. width: 150px;
  479. color: #00d8ff;
  480. }
  481. }
  482. }
  483. .nitrogen-container {
  484. width: 100%;
  485. height: calc(100%);
  486. display: flex;
  487. justify-content: space-between;
  488. position: relative;
  489. .device-state {
  490. width: 100%;
  491. position: absolute;
  492. top: 20px;
  493. color: #e90000;
  494. display: flex;
  495. justify-content: center;
  496. font-size: 20px;
  497. }
  498. .top-box {
  499. width: 100%;
  500. padding: 10px;
  501. overflow: hidden;
  502. display: flex;
  503. justify-content: space-between;
  504. .lr-box {
  505. display: flex;
  506. flex-direction: column;
  507. position: relative;
  508. z-index: 9999;
  509. pointer-events: auto;
  510. }
  511. .item {
  512. width: 285px;
  513. height: auto;
  514. position: relative;
  515. border-radius: 5px;
  516. margin-top: 10px;
  517. margin-bottom: 0px;
  518. pointer-events: auto;
  519. color: #fff;
  520. overflow: hidden;
  521. .control-item {
  522. height: auto;
  523. min-height: 35px;
  524. display: flex;
  525. flex-direction: row;
  526. justify-content: space-between;
  527. align-items: center;
  528. padding: 5px;
  529. margin: 0 10px 0 3px;
  530. pointer-events: auto;
  531. background: linear-gradient(to right, #0063cd22, #0063cd04);
  532. margin-bottom: 5px;
  533. border-width: 1px;
  534. border-style: dashed;
  535. border-image: linear-gradient(to right, #008ccd66, #0063cd04) 1 1;
  536. border-radius: 5px;
  537. &:last-child {
  538. margin-bottom: 0;
  539. }
  540. .control-item-l {
  541. display: flex;
  542. align-items: center;
  543. font-size: 14px;
  544. .round {
  545. display: inline-block;
  546. width: 3px;
  547. height: 3px;
  548. padding: 1px;
  549. border-radius: 50%;
  550. background-color: #3df6ff;
  551. margin-right: 5px;
  552. box-shadow: 0 0 1px 1px #64f7ff;
  553. }
  554. }
  555. .control-item-r {
  556. text-align: right;
  557. }
  558. .button-box {
  559. position: relative;
  560. padding: 5px;
  561. border: 1px transparent solid;
  562. background-clip: border-box;
  563. border-radius: 5px;
  564. margin-left: 8px;
  565. }
  566. .a-button {
  567. pointer-events: auto;
  568. }
  569. &::v-deep .a-button--mini {
  570. padding: 6px 10px;
  571. }
  572. &::v-deep .a-button--mini.is-round {
  573. padding: 6px 10px;
  574. }
  575. }
  576. .base-title {
  577. width: calc(100% - 60px);
  578. text-align: center;
  579. color: #00d8ff;
  580. }
  581. .state-item {
  582. width: 100%;
  583. display: flex;
  584. flex-direction: row;
  585. flex-wrap: wrap;
  586. .item-col {
  587. width: 50%;
  588. display: flex;
  589. justify-content: center;
  590. align-items: center;
  591. padding: 5px;
  592. .state-title {
  593. color: #ffffffcc;
  594. flex: 9;
  595. font-size: 14px;
  596. .unit {
  597. // color: #ffffffbb;
  598. }
  599. }
  600. .state-val {
  601. flex: 1;
  602. color: #e4a300;
  603. margin-right: 5px;
  604. text-align: right;
  605. font-size: 14px;
  606. }
  607. }
  608. }
  609. .signal-box {
  610. margin: 5px 0;
  611. display: flex;
  612. align-items: center;
  613. .signal-title {
  614. color: #7af5ff;
  615. margin: 0 5px;
  616. }
  617. &:last-child {
  618. margin-right: 0px;
  619. }
  620. }
  621. .list-item {
  622. padding: 0 10px;
  623. display: flex;
  624. justify-content: space-between;
  625. align-items: center;
  626. .item-data-key {
  627. color: #ffffff99;
  628. }
  629. }
  630. .item-data-box {
  631. color: #fff;
  632. .state-icon {
  633. display: inline-block;
  634. width: 12px;
  635. height: 12px;
  636. border-radius: 12px;
  637. }
  638. .open {
  639. border: 5px solid #133a56;
  640. background: #4ecb73;
  641. }
  642. .close {
  643. border: 5px solid #192961;
  644. background: #6d7898;
  645. }
  646. }
  647. }
  648. .right-box {
  649. width: 330px;
  650. margin-top: 60px;
  651. .control-group {
  652. display: flex;
  653. // justify-content: space-around;
  654. flex-wrap: wrap;
  655. .control-item {
  656. display: flex;
  657. flex-direction: column;
  658. justify-content: center;
  659. align-items: center;
  660. padding: 0 4px;
  661. .control-item-title {
  662. color: #a6dce9;
  663. position: relative;
  664. top: 5px;
  665. }
  666. .control-item-state {
  667. width: 94px;
  668. height: 47px;
  669. background: url('/@/assets/images/vent/control-switch-bg.png');
  670. display: flex;
  671. justify-content: center;
  672. align-items: center;
  673. color: #fff;
  674. }
  675. .button-box {
  676. position: relative;
  677. padding: 5px;
  678. border: 1px transparent solid;
  679. background-clip: border-box;
  680. border-radius: 5px;
  681. margin-left: 8px;
  682. }
  683. .a-button {
  684. pointer-events: auto;
  685. }
  686. &::v-deep .a-button--mini {
  687. padding: 6px 10px;
  688. }
  689. &::v-deep .a-button--mini.is-round {
  690. padding: 6px 10px;
  691. }
  692. }
  693. }
  694. .control-btn-group {
  695. width: 100%;
  696. display: flex;
  697. flex-direction: row;
  698. justify-content: space-between;
  699. align-items: center;
  700. .control-left-box {
  701. display: flex;
  702. flex-direction: column;
  703. justify-content: center;
  704. align-items: center;
  705. padding: 0 20px;
  706. .btn-box {
  707. width: 100px;
  708. color: #fff;
  709. display: flex;
  710. justify-content: space-between;
  711. span {
  712. display: inline-block;
  713. padding: 2px 8px;
  714. background: #007099;
  715. border-radius: 4px;
  716. border: 1px solid rgb(125, 230, 249);
  717. cursor: pointer;
  718. &:hover {
  719. background: #005574;
  720. }
  721. }
  722. }
  723. .icon-box {
  724. width: 60px;
  725. height: 60px;
  726. border-radius: 30px;
  727. border: 2px solid #00bcdd;
  728. box-shadow: 0 0 20px #ffffff88;
  729. display: flex;
  730. justify-content: center;
  731. align-items: center;
  732. margin-top: 20px;
  733. .icon {
  734. width: 18px;
  735. height: 18px;
  736. border-radius: 9px;
  737. border: 3px solid #d7f9ff;
  738. position: relative;
  739. background: #00bcdd;
  740. &::before {
  741. position: absolute;
  742. content: '';
  743. width: 2px;
  744. height: 12px;
  745. background-color: #00bcdd;
  746. left: 6px;
  747. top: -16px;
  748. }
  749. &::after {
  750. position: absolute;
  751. content: '';
  752. width: 2px;
  753. height: 12px;
  754. left: 6px;
  755. top: 17px;
  756. background-color: #00d9ff;
  757. }
  758. }
  759. }
  760. .remote-icon-box {
  761. transform: rotate(30deg);
  762. animation: iconRotate 1s linear;
  763. }
  764. .remote-icon-box1 {
  765. transform: rotate(-30deg);
  766. animation: iconRotate1 1s linear;
  767. }
  768. @keyframes iconRotate {
  769. from {
  770. transform: rotate(-30deg);
  771. }
  772. to {
  773. transform: rotate(30deg);
  774. }
  775. }
  776. @keyframes iconRotate1 {
  777. from {
  778. transform: rotate(30deg);
  779. }
  780. to {
  781. transform: rotate(-30deg);
  782. }
  783. }
  784. }
  785. .control-right-box {
  786. width: 100px;
  787. color: #fff;
  788. height: 80px;
  789. justify-content: space-between;
  790. align-items: center;
  791. .btn {
  792. margin-bottom: 30px;
  793. }
  794. }
  795. }
  796. }
  797. .left-box {
  798. height: calc(100% - 50px);
  799. overflow-x: hidden;
  800. overflow-y: auto;
  801. pointer-events: auto;
  802. direction: rtl;
  803. .item-l {
  804. width: 335px;
  805. .monitor-box {
  806. background-color: #ffffff05;
  807. }
  808. }
  809. .left-container {
  810. direction: ltr;
  811. }
  812. .control-item {
  813. height: 36px;
  814. }
  815. }
  816. }
  817. }
  818. .playerBox {
  819. z-index: 9999;
  820. position: fixed;
  821. // top: 200px;
  822. right: 15px;
  823. width: 100%;
  824. height: calc(100% - 100px);
  825. overflow-y: auto;
  826. margin: auto;
  827. pointer-events: none;
  828. display: flex;
  829. justify-content: end;
  830. &:deep(#LivePlayerBox) {
  831. width: auto !important;
  832. height: auto !important;
  833. display: flex;
  834. flex-flow: column;
  835. justify-content: end;
  836. }
  837. }
  838. .tab-button-box {
  839. display: inline-block;
  840. position: relative;
  841. padding: 5px;
  842. // border: 1px transparent solid;
  843. border-radius: 5px;
  844. margin-left: 8px;
  845. margin-right: 8px;
  846. width: auto;
  847. // height: 40px;
  848. // border: 1px solid #65dbea;
  849. height: 35px !important;
  850. display: flex;
  851. align-items: center;
  852. justify-content: center;
  853. color: #fff;
  854. padding: 0 15px 5px 15px;
  855. cursor: pointer;
  856. &:hover {
  857. background: linear-gradient(#2cd1ff55, #1eb0ff55);
  858. }
  859. &::before {
  860. width: calc(100% - 6px);
  861. height: 27px;
  862. content: '';
  863. position: absolute;
  864. top: 3px;
  865. right: 0;
  866. left: 3px;
  867. bottom: 0;
  868. z-index: -1;
  869. border-radius: inherit; /*important*/
  870. background: linear-gradient(#1fa6cb, #127cb5);
  871. }
  872. &::after {
  873. width: calc(100% + 32px);
  874. height: 10px;
  875. content: '';
  876. position: absolute;
  877. top: 28px;
  878. right: 0;
  879. left: -16px;
  880. bottom: 0;
  881. z-index: -1;
  882. border-radius: inherit; /*important*/
  883. background: url('/@/assets/images/vent/short-light.png') no-repeat;
  884. background-position: center;
  885. background-size: 100%;
  886. z-index: 999;
  887. }
  888. }
  889. .tab-button-box-active {
  890. border: 1px solid #66989e !important;
  891. &:hover {
  892. background: none !important;
  893. }
  894. &::before {
  895. background: linear-gradient(#1fa6cbcc, #127cb5cc) !important;
  896. }
  897. }
  898. }
  899. .btn {
  900. padding: 2px 12px;
  901. position: relative;
  902. border-radius: 2px;
  903. color: #fff;
  904. cursor: pointer;
  905. &::before {
  906. position: absolute;
  907. display: block;
  908. content: '';
  909. width: calc(100% - 4px);
  910. height: calc(100% - 4px);
  911. top: 2px;
  912. left: 2px;
  913. border-radius: 2px;
  914. z-index: -1;
  915. }
  916. }
  917. .btn1 {
  918. border: 1px solid #5cfaff;
  919. &::before {
  920. background-image: linear-gradient(#2effee92, #0cb1d592);
  921. }
  922. &:hover {
  923. border: 1px solid #5cfaffaa;
  924. &::before {
  925. background-image: linear-gradient(#2effee72, #0cb1d572);
  926. }
  927. }
  928. }
  929. .btn2 {
  930. border: 1px solid #e91927;
  931. margin-left: 10px;
  932. &::before {
  933. background-image: linear-gradient(#b02533, #a31f2e);
  934. }
  935. &:hover {
  936. &::before {
  937. background-image: linear-gradient(#bd2e3ccc, #a31f2ecc);
  938. }
  939. }
  940. }
  941. </style>