nitrogenHome.vue 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007
  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 item-box">
  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-box {
  470. width: 600px;
  471. flex-wrap: wrap;
  472. .item {
  473. width: 250px;
  474. margin-left: 30px;
  475. .val {
  476. color: #00d8ff;
  477. }
  478. }
  479. }
  480. }
  481. .nitrogen-container {
  482. width: 100%;
  483. height: calc(100%);
  484. display: flex;
  485. justify-content: space-between;
  486. position: relative;
  487. .device-state {
  488. width: 100%;
  489. position: absolute;
  490. top: 20px;
  491. color: #e90000;
  492. display: flex;
  493. justify-content: center;
  494. font-size: 20px;
  495. }
  496. .top-box {
  497. width: 100%;
  498. padding: 10px;
  499. overflow: hidden;
  500. display: flex;
  501. justify-content: space-between;
  502. .lr-box {
  503. display: flex;
  504. flex-direction: column;
  505. position: relative;
  506. z-index: 9999;
  507. pointer-events: auto;
  508. }
  509. .item {
  510. width: 285px;
  511. height: auto;
  512. position: relative;
  513. border-radius: 5px;
  514. margin-top: 10px;
  515. margin-bottom: 0px;
  516. pointer-events: auto;
  517. color: #fff;
  518. overflow: hidden;
  519. .control-item {
  520. height: auto;
  521. min-height: 35px;
  522. display: flex;
  523. flex-direction: row;
  524. justify-content: space-between;
  525. align-items: center;
  526. padding: 5px;
  527. margin: 0 10px 0 3px;
  528. pointer-events: auto;
  529. background: linear-gradient(to right, #0063cd22, #0063cd04);
  530. margin-bottom: 5px;
  531. border-width: 1px;
  532. border-style: dashed;
  533. border-image: linear-gradient(to right, #008ccd66, #0063cd04) 1 1;
  534. border-radius: 5px;
  535. &:last-child {
  536. margin-bottom: 0;
  537. }
  538. .control-item-l {
  539. display: flex;
  540. align-items: center;
  541. font-size: 14px;
  542. .round {
  543. display: inline-block;
  544. width: 3px;
  545. height: 3px;
  546. padding: 1px;
  547. border-radius: 50%;
  548. background-color: #3df6ff;
  549. margin-right: 5px;
  550. box-shadow: 0 0 1px 1px #64f7ff;
  551. }
  552. }
  553. .control-item-r {
  554. text-align: right;
  555. }
  556. .button-box {
  557. position: relative;
  558. padding: 5px;
  559. border: 1px transparent solid;
  560. background-clip: border-box;
  561. border-radius: 5px;
  562. margin-left: 8px;
  563. }
  564. .a-button {
  565. pointer-events: auto;
  566. }
  567. &::v-deep .a-button--mini {
  568. padding: 6px 10px;
  569. }
  570. &::v-deep .a-button--mini.is-round {
  571. padding: 6px 10px;
  572. }
  573. }
  574. .base-title {
  575. width: calc(100% - 60px);
  576. text-align: center;
  577. color: #00d8ff;
  578. }
  579. .state-item {
  580. width: 100%;
  581. display: flex;
  582. flex-direction: row;
  583. flex-wrap: wrap;
  584. .item-col {
  585. width: 50%;
  586. display: flex;
  587. justify-content: center;
  588. align-items: center;
  589. padding: 5px;
  590. .state-title {
  591. color: #ffffffcc;
  592. flex: 9;
  593. font-size: 14px;
  594. .unit {
  595. // color: #ffffffbb;
  596. }
  597. }
  598. .state-val {
  599. flex: 1;
  600. color: #e4a300;
  601. margin-right: 5px;
  602. text-align: right;
  603. font-size: 14px;
  604. }
  605. }
  606. }
  607. .signal-box {
  608. margin: 5px 0;
  609. display: flex;
  610. align-items: center;
  611. .signal-title {
  612. color: #7af5ff;
  613. margin: 0 5px;
  614. }
  615. &:last-child {
  616. margin-right: 0px;
  617. }
  618. }
  619. .list-item {
  620. padding: 0 10px;
  621. display: flex;
  622. justify-content: space-between;
  623. align-items: center;
  624. .item-data-key {
  625. color: #ffffff99;
  626. }
  627. }
  628. .item-data-box {
  629. color: #fff;
  630. .state-icon {
  631. display: inline-block;
  632. width: 12px;
  633. height: 12px;
  634. border-radius: 12px;
  635. }
  636. .open {
  637. border: 5px solid #133a56;
  638. background: #4ecb73;
  639. }
  640. .close {
  641. border: 5px solid #192961;
  642. background: #6d7898;
  643. }
  644. }
  645. }
  646. .right-box {
  647. width: 330px;
  648. margin-top: 60px;
  649. .control-group {
  650. display: flex;
  651. // justify-content: space-around;
  652. flex-wrap: wrap;
  653. .control-item {
  654. display: flex;
  655. flex-direction: column;
  656. justify-content: center;
  657. align-items: center;
  658. padding: 0 4px;
  659. .control-item-title {
  660. color: #a6dce9;
  661. position: relative;
  662. top: 5px;
  663. }
  664. .control-item-state {
  665. width: 94px;
  666. height: 47px;
  667. background: url('/@/assets/images/vent/control-switch-bg.png');
  668. display: flex;
  669. justify-content: center;
  670. align-items: center;
  671. color: #fff;
  672. }
  673. .button-box {
  674. position: relative;
  675. padding: 5px;
  676. border: 1px transparent solid;
  677. background-clip: border-box;
  678. border-radius: 5px;
  679. margin-left: 8px;
  680. }
  681. .a-button {
  682. pointer-events: auto;
  683. }
  684. &::v-deep .a-button--mini {
  685. padding: 6px 10px;
  686. }
  687. &::v-deep .a-button--mini.is-round {
  688. padding: 6px 10px;
  689. }
  690. }
  691. }
  692. .control-btn-group {
  693. width: 100%;
  694. display: flex;
  695. flex-direction: row;
  696. justify-content: space-between;
  697. align-items: center;
  698. .control-left-box {
  699. display: flex;
  700. flex-direction: column;
  701. justify-content: center;
  702. align-items: center;
  703. padding: 0 20px;
  704. .btn-box {
  705. width: 100px;
  706. color: #fff;
  707. display: flex;
  708. justify-content: space-between;
  709. span {
  710. display: inline-block;
  711. padding: 2px 8px;
  712. background: #007099;
  713. border-radius: 4px;
  714. border: 1px solid rgb(125, 230, 249);
  715. cursor: pointer;
  716. &:hover {
  717. background: #005574;
  718. }
  719. }
  720. }
  721. .icon-box {
  722. width: 60px;
  723. height: 60px;
  724. border-radius: 30px;
  725. border: 2px solid #00bcdd;
  726. box-shadow: 0 0 20px #ffffff88;
  727. display: flex;
  728. justify-content: center;
  729. align-items: center;
  730. margin-top: 20px;
  731. .icon {
  732. width: 18px;
  733. height: 18px;
  734. border-radius: 9px;
  735. border: 3px solid #d7f9ff;
  736. position: relative;
  737. background: #00bcdd;
  738. &::before {
  739. position: absolute;
  740. content: '';
  741. width: 2px;
  742. height: 12px;
  743. background-color: #00bcdd;
  744. left: 6px;
  745. top: -16px;
  746. }
  747. &::after {
  748. position: absolute;
  749. content: '';
  750. width: 2px;
  751. height: 12px;
  752. left: 6px;
  753. top: 17px;
  754. background-color: #00d9ff;
  755. }
  756. }
  757. }
  758. .remote-icon-box {
  759. transform: rotate(30deg);
  760. animation: iconRotate 1s linear;
  761. }
  762. .remote-icon-box1 {
  763. transform: rotate(-30deg);
  764. animation: iconRotate1 1s linear;
  765. }
  766. @keyframes iconRotate {
  767. from {
  768. transform: rotate(-30deg);
  769. }
  770. to {
  771. transform: rotate(30deg);
  772. }
  773. }
  774. @keyframes iconRotate1 {
  775. from {
  776. transform: rotate(30deg);
  777. }
  778. to {
  779. transform: rotate(-30deg);
  780. }
  781. }
  782. }
  783. .control-right-box {
  784. width: 100px;
  785. color: #fff;
  786. height: 80px;
  787. justify-content: space-between;
  788. align-items: center;
  789. .btn {
  790. margin-bottom: 30px;
  791. }
  792. }
  793. }
  794. }
  795. .left-box {
  796. height: calc(100%);
  797. overflow-x: hidden;
  798. overflow-y: auto;
  799. pointer-events: auto;
  800. direction: rtl;
  801. .item-l {
  802. width: 335px;
  803. .monitor-box {
  804. background-color: #ffffff05;
  805. }
  806. }
  807. .left-container {
  808. direction: ltr;
  809. }
  810. .control-item {
  811. height: 36px;
  812. }
  813. }
  814. }
  815. }
  816. .playerBox {
  817. z-index: 9999;
  818. position: fixed;
  819. // top: 200px;
  820. right: 15px;
  821. width: 100%;
  822. height: calc(100% - 100px);
  823. overflow-y: auto;
  824. margin: auto;
  825. pointer-events: none;
  826. display: flex;
  827. justify-content: end;
  828. &:deep(#LivePlayerBox) {
  829. width: auto !important;
  830. height: auto !important;
  831. display: flex;
  832. flex-flow: column;
  833. justify-content: end;
  834. }
  835. }
  836. .tab-button-box {
  837. display: inline-block;
  838. position: relative;
  839. padding: 5px;
  840. // border: 1px transparent solid;
  841. border-radius: 5px;
  842. margin-left: 8px;
  843. margin-right: 8px;
  844. width: auto;
  845. // height: 40px;
  846. // border: 1px solid #65dbea;
  847. height: 35px !important;
  848. display: flex;
  849. align-items: center;
  850. justify-content: center;
  851. color: #fff;
  852. padding: 0 15px 5px 15px;
  853. cursor: pointer;
  854. &:hover {
  855. background: linear-gradient(#2cd1ff55, #1eb0ff55);
  856. }
  857. &::before {
  858. width: calc(100% - 6px);
  859. height: 27px;
  860. content: '';
  861. position: absolute;
  862. top: 3px;
  863. right: 0;
  864. left: 3px;
  865. bottom: 0;
  866. z-index: -1;
  867. border-radius: inherit; /*important*/
  868. background: linear-gradient(#1fa6cb, #127cb5);
  869. }
  870. &::after {
  871. width: calc(100% + 32px);
  872. height: 10px;
  873. content: '';
  874. position: absolute;
  875. top: 28px;
  876. right: 0;
  877. left: -16px;
  878. bottom: 0;
  879. z-index: -1;
  880. border-radius: inherit; /*important*/
  881. background: url('/@/assets/images/vent/short-light.png') no-repeat;
  882. background-position: center;
  883. background-size: 100%;
  884. z-index: 999;
  885. }
  886. }
  887. .tab-button-box-active {
  888. border: 1px solid #66989e !important;
  889. &:hover {
  890. background: none !important;
  891. }
  892. &::before {
  893. background: linear-gradient(#1fa6cbcc, #127cb5cc) !important;
  894. }
  895. }
  896. }
  897. .btn {
  898. padding: 2px 12px;
  899. position: relative;
  900. border-radius: 2px;
  901. color: #fff;
  902. cursor: pointer;
  903. &::before {
  904. position: absolute;
  905. display: block;
  906. content: '';
  907. width: calc(100% - 4px);
  908. height: calc(100% - 4px);
  909. top: 2px;
  910. left: 2px;
  911. border-radius: 2px;
  912. z-index: -1;
  913. }
  914. }
  915. .btn1 {
  916. border: 1px solid #5cfaff;
  917. &::before {
  918. background-image: linear-gradient(#2effee92, #0cb1d592);
  919. }
  920. &:hover {
  921. border: 1px solid #5cfaffaa;
  922. &::before {
  923. background-image: linear-gradient(#2effee72, #0cb1d572);
  924. }
  925. }
  926. }
  927. .btn2 {
  928. border: 1px solid #e91927;
  929. margin-left: 10px;
  930. &::before {
  931. background-image: linear-gradient(#b02533, #a31f2e);
  932. }
  933. &:hover {
  934. &::before {
  935. background-image: linear-gradient(#bd2e3ccc, #a31f2ecc);
  936. }
  937. }
  938. }
  939. </style>