nitrogenHome.vue 30 KB

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