nitrogenHome.vue 30 KB

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