nitrogenHome.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. <template>
  2. <div id="nitrogenCss3D" class="threejs-Object-CSS"
  3. style="width: 100%; height: 100%; position: absolute; pointer-events: none; overflow: hidden; z-index: 2; top: 0px; left: 0px">
  4. <a-spin :spinning="loading" />
  5. <div v-for="groupNum in monitorDataGroupNum" :key="groupNum" class="modal-monitor">
  6. <fourBorderBg :class="`kyj${groupNum}`" :id="`nitrogenMonitor${groupNum}`">
  7. <div class="title">{{ groupNum }}号空压机 </div>
  8. <div class="monitor-item">
  9. <span class="monitor-title">排气压力:</span>
  10. <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['compressExhaustPressF1'] ?
  11. monitorData[groupNum - 1]['compressExhaustPressF1'] : '-' }}</span><span class="unit">Mpa</span></span>
  12. </div>
  13. <div class="monitor-item">
  14. <span class="monitor-title">分离压力:</span>
  15. <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['compressSeparatePressF1'] ?
  16. monitorData[groupNum - 1]['compressSeparatePressF1'] : '-' }}</span><span class="unit">Mpa</span></span>
  17. </div>
  18. <div class="monitor-item">
  19. <span class="monitor-title">排气温度:</span>
  20. <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['exhaustTemp'] ? monitorData[groupNum
  21. - 1]['exhaustTemp'] : '-' }}</span><span class="unit">℃</span></span>
  22. </div>
  23. <div class="signal-item">
  24. <div class="signal"><span class="monitor-title">运行信号</span><span
  25. :class="{ 'signal-round': true, 'signal-round-run': monitorData[groupNum - 1]['compressRunSigF1'], 'signal-round-gry': !monitorData[groupNum - 1]['compressRunSigF1'] }"></span>
  26. </div>
  27. <div class="signal"><span class="monitor-title">加载信号</span><span
  28. :class="{ 'signal-round': true, 'signal-round-run': monitorData[groupNum - 1]['compressLoadSigF1'], 'signal-round-gry': !monitorData[groupNum - 1]['compressLoadSigF1'] }"></span>
  29. </div>
  30. </div>
  31. </fourBorderBg>
  32. <fourBorderBg :class="`cqg${groupNum}`" :id="`cqgMonitor${groupNum}`">
  33. <div class="title">{{ cqgs[groupNum - 1] }}</div>
  34. <div class="monitor-item">
  35. <span class="monitor-title">气囊温度:</span>
  36. <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['airReceiverTemp'] ?
  37. monitorData[groupNum - 1]['airReceiverTemp'] : '-' }}</span><span class="unit">℃</span></span>
  38. </div>
  39. <div class="monitor-item">
  40. <span class="monitor-title">气囊压力<span class="unit"></span>:</span>
  41. <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['airReceiverPress'] ?
  42. monitorData[groupNum - 1]['airReceiverPress'] : '-' }}</span><span class="unit">Mpa</span></span>
  43. </div>
  44. <div class="monitor-item">
  45. <span class="monitor-title">气囊流量<span class="unit"></span>:</span>
  46. <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1]['airReceiverFlow'] ?
  47. monitorData[groupNum - 1]['airReceiverFlow'] : '-' }}</span><span class="unit">m³/k</span></span>
  48. </div>
  49. </fourBorderBg>
  50. </div>
  51. </div>
  52. <div id="nitrogen3D" style="width: 100%; height: 100%; position: absolute; overflow: hidden"></div>
  53. <div class="nitrogen-home">
  54. <div class="nitrogen-container">
  55. <div class="top-box">
  56. <!-- 左边监测数据 -->
  57. <div class="lr-box left-box">
  58. <div class="left-container">
  59. <div class="item item-l" v-for="groupNum in monitorDataGroupNum" :key="groupNum">
  60. <div class="monitor-box">
  61. <ventBox1>
  62. <template #title>
  63. <div>{{ groupNum }}号空压机组</div>
  64. </template>
  65. <template #container>
  66. <div class="state-item" v-for="(data, index) in showMonitorData" :key="index">
  67. <div class="item-col">
  68. <span class="state-title">{{ Object.values(data)[0] }} :</span>
  69. <span class="state-val">{{ (monitorData.length > 0 && monitorData[groupNum - 1][Object.keys(data)[0]])
  70. >= 0 ? monitorData[groupNum - 1][Object.keys(data)[0]] : '-' }}</span>
  71. </div>
  72. <div class="item-col">
  73. <span class="state-title">{{ Object.values(data)[1] }} :</span>
  74. <span class="state-val">{{ (monitorData.length > 0 && monitorData[groupNum - 1][Object.keys(data)[1]])
  75. >= 0 ? monitorData[groupNum - 1][Object.keys(data)[1]] : '-' }}</span>
  76. </div>
  77. </div>
  78. </template>
  79. </ventBox1>
  80. </div>
  81. </div>
  82. </div>
  83. </div>
  84. <!-- 右边控制状态 -->
  85. <div class="lr-box right-box">
  86. <ventBox1>
  87. <template #title>
  88. <div>远程控制</div>
  89. </template>
  90. <template #container>
  91. <div class="control-group">
  92. <div class="control-item" v-for="groupNum in monitorDataGroupNum" :key="groupNum">
  93. <div class="control-item-title">{{ kyjs[groupNum - 1] }}</div>
  94. <div class="control-item-state">
  95. <a-switch v-model="airCompressorState[groupNum - 1][`compressRunSigF1`]" size="small" checked-children="开启"
  96. un-checked-children="关闭" :disabled="airCompressorState[groupNum - 1][`controlModel`]"
  97. @change="handlerDevice(airCompressorState[groupNum - 1])">
  98. </a-switch>
  99. </div>
  100. </div>
  101. <div class="control-item" v-for="groupNum in monitorDataGroupNum" :key="groupNum">
  102. <div class="control-item-title">{{ cqgs[groupNum - 1] }}</div>
  103. <div class="control-item-state">
  104. <a-switch v-model="airCompressorState[groupNum - 1][`compressRunSigF1`]" size="small" checked-children="开启"
  105. un-checked-children="关闭" :disabled="airCompressorState[groupNum - 1][`controlModel`]"
  106. @change="handlerDevice(airCompressorState[groupNum - 1])">
  107. </a-switch>
  108. </div>
  109. </div>
  110. <a-divider style="height: 1px; background-color: #d7d7d755" />
  111. <div class="control-btn-group">
  112. <div class="control-left-box">
  113. <div class="btn-box">
  114. <span @click="handlerDevice({ remote: true })">远程</span>
  115. <span @click="handlerDevice({ remote: false })">就地</span>
  116. </div>
  117. <div class="icon-box" :class="{ 'remote-icon-box': true }">
  118. <div class="icon"></div>
  119. </div>
  120. </div>
  121. <div class="control-right-box">
  122. <div class="control-item-title">是否开启联动</div>
  123. <div class="item-data-box" >
  124. <div :class="{ 'state-icon': true, 'open': monitorData[0].linkState, 'close': !monitorData[0].linkState }">
  125. </div>
  126. <div >{{ !monitorData[0].linkState ? '不联动' : '联动' }}</div>
  127. </div>
  128. </div>
  129. </div>
  130. </div>
  131. </template>
  132. </ventBox1>
  133. <!-- <div class="control-item">
  134. <div class="control-item-l">
  135. <span class="round"></span>
  136. <span>控制模式</span>
  137. </div>
  138. <div>
  139. <a-switch v-model="airCompressorState[0][`controlModel`]" checked-children="就地" un-checked-children="远程"
  140. @change="handlerControlModel(airCompressorState[0])">
  141. </a-switch>
  142. </div>
  143. </div> -->
  144. </div>
  145. </div>
  146. </div>
  147. </div>
  148. </template>
  149. <script lang="ts" setup name="nitrogenHome">
  150. import { onMounted, onUnmounted, ref, watch } from 'vue'
  151. import fourBorderBg from '../../../comment/components/fourBorderBg.vue'
  152. import { mountedThree, destroy } from '../nitrogen.threejs'
  153. import { list } from '../nitrogen.api'
  154. import ventBox1 from '/@/components/vent/ventBox1.vue'
  155. const loading = ref(true)
  156. const kyjs = ['1号空压机', '2号空压机', '3号空压机', '4号空压机'];
  157. const cqgs = ['1号储气罐', '2号储气罐', '3号储气罐', '4号储气罐'];
  158. const monitorDataGroupNum = ref(3);
  159. const airCompressorState = ref([
  160. {
  161. id: '',
  162. compressRunSigF1: false,
  163. controlModel: false
  164. },
  165. {
  166. id: '',
  167. compressRunSigF1: false,
  168. controlModel: false
  169. },
  170. {
  171. id: '',
  172. compressRunSigF1: false,
  173. controlModel: false
  174. },
  175. {
  176. id: '',
  177. compressRunSigF1: false,
  178. controlModel: false
  179. }
  180. ]);
  181. const showMonitorData = [
  182. {
  183. supVolt1: '电流A(A)',
  184. supVolt2: '电流B(A)',
  185. },
  186. {
  187. supVolt3: '电流C(A)',
  188. current: '电源电压(V)',
  189. },
  190. {
  191. shock1: '震动X(mm/s)',
  192. shock2: '震动Y(mm/s)',
  193. },
  194. {
  195. shock3: '震动Z(mm/s)',
  196. noise: '噪声',
  197. },
  198. {
  199. ambTempCol: '环境温度(℃)',
  200. },
  201. ];
  202. const monitorData = ref(new Array(4).fill({
  203. strName: '空压机',
  204. compressGroupName: '',
  205. compressExhaustPressF1: '-',
  206. compressSeparatePressF1: '-',
  207. compressHostTempF1: '-',
  208. compressCrewTempF1: '-',
  209. compressRunTimeF1: '-',
  210. controlModel: 'LOC'
  211. }));
  212. // https获取监测数据
  213. let timer: null | NodeJS.Timeout = null;
  214. async function getMonitor() {
  215. if (Object.prototype.toString.call(timer) === '[object Null]') {
  216. timer = await setTimeout(async () => {
  217. await getDataSource();
  218. if (timer) {
  219. timer = null;
  220. }
  221. await getMonitor();
  222. }, 1000);
  223. }
  224. };
  225. async function getDataSource() {
  226. const res = await list({ devicetype: 'pressurefan', pagetype: 'normal' });
  227. const dataSource = res.msgTxt[0].datalist || [];
  228. dataSource.forEach((data, index) => {
  229. const item = data.readData;
  230. Object.assign(item, data);
  231. item.compressRunSigF1 = item.compressRunSigF1 ? true : false
  232. airCompressorState.value[index].id = item.id
  233. airCompressorState.value[index].compressRunSigF1 = item.compressRunSigF1
  234. airCompressorState.value[index].controlModel = item.controlModel === 'LOC' ? true : false
  235. monitorData.value[index] = item
  236. });
  237. monitorDataGroupNum.value = monitorData.value.length
  238. loading.value = false
  239. };
  240. function handlerDevice(data) {
  241. // if (data.length < 1) return
  242. // handleAirCompressor({ id: data.id, compressRunF1: data.compressRunSigF1 }).then(res => {
  243. // if (res.success) {
  244. // message.success('操作成功')
  245. // } else {
  246. // message.warning(data.msg)
  247. // }
  248. // })
  249. };
  250. function resetDevice(data) {
  251. }
  252. function handlerControlModel(data) {
  253. }
  254. watch(monitorDataGroupNum, (newVal) => {
  255. if (newVal) {
  256. destroy()
  257. mountedThree(newVal)
  258. }
  259. })
  260. onMounted(async () => {
  261. await getMonitor()
  262. })
  263. onUnmounted(() => {
  264. destroy();
  265. if (timer) {
  266. clearTimeout(timer);
  267. timer = undefined;
  268. }
  269. });
  270. </script>
  271. <style lang="less" scoped>
  272. @ventSpace: zxm;
  273. .nitrogen-box {
  274. width: 100%;
  275. height: 100%;
  276. display: flex;
  277. justify-content: center;
  278. }
  279. #nitrogenCss3D {
  280. .modal-monitor {
  281. position: absolute;
  282. left: 0px;
  283. top: 0px;
  284. }
  285. &:deep(.win) {
  286. margin: 0 !important;
  287. }
  288. &:deep(.main) {
  289. .title {
  290. height: 34px;
  291. text-align: center;
  292. font-weight: 600;
  293. color: #7AF5FF;
  294. // background-image: url('../../../assets/img/yfj/light.png');
  295. background-repeat: no-repeat;
  296. background-position-x: center;
  297. background-position-y: 100%;
  298. background-size: 80%;
  299. font-size: 16px;
  300. }
  301. .monitor-item {
  302. display: flex;
  303. flex-direction: row;
  304. width: auto;
  305. margin-bottom: 3px;
  306. .monitor-val {
  307. color: #ffb700;
  308. display: flex;
  309. width: auto;
  310. .val {
  311. width: 80px;
  312. font-size: 14px;
  313. }
  314. .unit {
  315. color: #ffffffbb;
  316. font-size: 14px;
  317. }
  318. }
  319. }
  320. .monitor-title {
  321. width: 100px;
  322. color: #7AF5FF;
  323. font-weight: 400;
  324. font-size: 14px;
  325. }
  326. .signal-item {
  327. display: flex;
  328. justify-content: space-between;
  329. // margin-bottom: 5px;
  330. .signal-round {
  331. display: inline-block;
  332. width: 8px;
  333. height: 8px;
  334. border-radius: 50%;
  335. margin: 0 10px;
  336. position: relative;
  337. &::after {
  338. display: block;
  339. content: '';
  340. position: absolute;
  341. width: 12px;
  342. height: 12px;
  343. top: -2px;
  344. left: -2px;
  345. border-radius: 50%;
  346. }
  347. }
  348. .signal-round-gry {
  349. background-color: #858585;
  350. &::after {
  351. background-color: #85858544;
  352. box-shadow: 0 0 1px 1px #85858599;
  353. }
  354. }
  355. .signal-round-run {
  356. background-color: #67FC00;
  357. &::after {
  358. background-color: #67FC0044;
  359. box-shadow: 0 0 1px 1px #c6ff77;
  360. }
  361. }
  362. .signal-round-warning {
  363. background-color: #E9170B;
  364. &::after {
  365. background-color: #E9170B44;
  366. box-shadow: 0 0 1px 1px #E9170B;
  367. }
  368. }
  369. }
  370. }
  371. }
  372. .nitrogen-home {
  373. width: 100%;
  374. height: calc(100% - 100px);
  375. position: fixed;
  376. z-index: 99;
  377. display: flex;
  378. flex-direction: column;
  379. justify-content: center;
  380. align-items: center;
  381. pointer-events: none;
  382. top: 100px;
  383. .nitrogen-container {
  384. width: 100%;
  385. height: calc(100%);
  386. display: flex;
  387. justify-content: space-between;
  388. margin-bottom: 100px;
  389. .top-box {
  390. width: 100%;
  391. padding: 10px;
  392. overflow: hidden;
  393. display: flex;
  394. justify-content: space-between;
  395. .lr-box {
  396. display: flex;
  397. flex-direction: column;
  398. position: relative;
  399. z-index: 9999;
  400. }
  401. .item {
  402. width: 285px;
  403. height: auto;
  404. position: relative;
  405. border-radius: 5px;
  406. margin-top: 10px;
  407. margin-bottom: 0px;
  408. pointer-events: auto;
  409. color: #fff;
  410. overflow: hidden;
  411. .control-item {
  412. height: auto;
  413. min-height: 35px;
  414. display: flex;
  415. flex-direction: row;
  416. justify-content: space-between;
  417. align-items: center;
  418. padding: 5px;
  419. margin: 0 10px 0 3px;
  420. pointer-events: auto;
  421. background: linear-gradient(to right, #0063CD22, #0063CD04);
  422. margin-bottom: 5px;
  423. border-width: 1px;
  424. border-style: dashed;
  425. border-image: linear-gradient(to right, #008ccd66, #0063CD04)1 1;
  426. border-radius: 5px;
  427. &:last-child {
  428. margin-bottom: 0
  429. }
  430. .control-item-l {
  431. display: flex;
  432. align-items: center;
  433. font-size: 14px;
  434. .round {
  435. display: inline-block;
  436. width: 3px;
  437. height: 3px;
  438. padding: 1px;
  439. border-radius: 50%;
  440. background-color: #3DF6FF;
  441. margin-right: 5px;
  442. box-shadow: 0 0 1px 1px #64f7ff;
  443. }
  444. }
  445. .control-item-r {
  446. text-align: right;
  447. }
  448. .button-box {
  449. position: relative;
  450. padding: 5px;
  451. border: 1px transparent solid;
  452. background-clip: border-box;
  453. border-radius: 5px;
  454. margin-left: 8px;
  455. }
  456. .a-button {
  457. pointer-events: auto;
  458. }
  459. &::v-deep .a-button--mini {
  460. padding: 6px 10px;
  461. }
  462. &::v-deep .a-button--mini.is-round {
  463. padding: 6px 10px;
  464. }
  465. }
  466. .base-title {
  467. width: calc(100% - 60px);
  468. text-align: center;
  469. color: #00d8ff;
  470. }
  471. .state-item {
  472. display: flex;
  473. flex-direction: row;
  474. padding: 5px;
  475. .item-col {
  476. width: 50%;
  477. display: flex;
  478. justify-content: center;
  479. align-items: center;
  480. padding-right: 4px;
  481. .state-title {
  482. color: #ffffffcc;
  483. flex: 9;
  484. font-size: 14px;
  485. .unit {
  486. // color: #ffffffbb;
  487. }
  488. }
  489. .state-val {
  490. flex: 1;
  491. color: #e4a300;
  492. margin-right: 5px;
  493. text-align: right;
  494. font-size: 14px;
  495. }
  496. }
  497. }
  498. .signal-box {
  499. margin: 5px 0;
  500. display: flex;
  501. align-items: center;
  502. .signal-title {
  503. color: #7AF5FF;
  504. margin: 0 5px;
  505. }
  506. &:last-child {
  507. margin-right: 0px;
  508. }
  509. }
  510. .list-item {
  511. padding: 0 10px;
  512. display: flex;
  513. justify-content: space-between;
  514. align-items: center;
  515. .item-data-key {
  516. color: #ffffff99;
  517. }
  518. }
  519. .item-data-box {
  520. color: #fff;
  521. .state-icon {
  522. display: inline-block;
  523. width: 12px;
  524. height: 12px;
  525. border-radius: 12px;
  526. }
  527. .open {
  528. border: 5px solid #133a56;
  529. background: #4ecb73;
  530. }
  531. .close {
  532. border: 5px solid #192961;
  533. background: #6d7898;
  534. }
  535. }
  536. }
  537. .item-l {
  538. width: 335px;
  539. .monitor-box {
  540. // width: 335px;
  541. background-color: #ffffff05;
  542. // margin-left: 2px;
  543. // border-radius: 5px;
  544. // backdrop-filter: blur(10px);
  545. }
  546. }
  547. .right-box {
  548. width: 330px;
  549. .control-group{
  550. display: flex;
  551. // justify-content: space-around;
  552. flex-wrap: wrap;
  553. .control-item {
  554. display: flex;
  555. flex-direction: column;
  556. justify-content: center;
  557. align-items: center;
  558. padding: 0 4px;
  559. .control-item-title{
  560. color: #A6DCE9;
  561. position: relative;
  562. top: 5px;
  563. }
  564. .control-item-state{
  565. width: 94px;
  566. height: 47px;
  567. background: url('/@/assets/images/vent/control-switch-bg.png');
  568. display: flex;
  569. justify-content: center;
  570. align-items: center;
  571. color: #fff;
  572. }
  573. .button-box {
  574. position: relative;
  575. padding: 5px;
  576. border: 1px transparent solid;
  577. background-clip: border-box;
  578. border-radius: 5px;
  579. margin-left: 8px;
  580. }
  581. .a-button {
  582. pointer-events: auto;
  583. }
  584. &::v-deep .a-button--mini {
  585. padding: 6px 10px;
  586. }
  587. &::v-deep .a-button--mini.is-round {
  588. padding: 6px 10px;
  589. }
  590. }
  591. }
  592. .control-btn-group{
  593. width: 100%;
  594. display: flex;
  595. flex-direction: row;
  596. justify-content: space-between;
  597. align-items: center;
  598. .control-left-box{
  599. display: flex;
  600. flex-direction: column;
  601. justify-content: center;
  602. align-items: center;
  603. padding: 0 20px;
  604. .btn-box{
  605. width: 100px;
  606. color: #fff;
  607. display: flex;
  608. justify-content: space-between;
  609. span{
  610. display: inline-block;
  611. padding: 2px 8px;
  612. background: #007099;
  613. border-radius: 4px;
  614. border: 1px solid rgb(125, 230, 249);
  615. cursor: pointer;
  616. &:hover{
  617. background: #005574;
  618. }
  619. }
  620. }
  621. .icon-box{
  622. width: 60px;
  623. height: 60px;
  624. border-radius: 30px;
  625. border: 2px solid #00bcdd;
  626. box-shadow: 0 0 20px #ffffff88;
  627. display: flex;
  628. justify-content: center;
  629. align-items: center;
  630. margin-top: 20px;
  631. .icon{
  632. width: 18px;
  633. height: 18px;
  634. border-radius: 9px;
  635. border: 3px solid #d7f9ff;
  636. position: relative;
  637. background: #00bcdd;
  638. &::before{
  639. position: absolute;
  640. content: '';
  641. width: 2px;
  642. height: 12px;
  643. background-color: #00bcdd;
  644. left: 6px;
  645. top: -16px;
  646. }
  647. &::after{
  648. position: absolute;
  649. content: '';
  650. width: 2px;
  651. height: 12px;
  652. left: 6px;
  653. top: 17px;
  654. background-color: #00d9ff;
  655. }
  656. }
  657. }
  658. .remote-icon-box{
  659. transform: rotate(30deg);
  660. animation: iconRotate 1s linear;
  661. }
  662. .remote-icon-box1{
  663. transform: rotate(-30deg);
  664. animation: iconRotate1 1s linear;
  665. }
  666. @keyframes iconRotate{
  667. from{
  668. transform: rotate(-30deg);
  669. }
  670. to {
  671. transform: rotate(30deg);
  672. }
  673. }
  674. @keyframes iconRotate1{
  675. from {
  676. transform: rotate(30deg);
  677. }
  678. to {
  679. transform: rotate(-30deg);
  680. }
  681. }
  682. }
  683. .control-right-box{
  684. width: 100px;
  685. color: #fff;
  686. height: 80px;
  687. justify-content: space-between;
  688. align-items: center;
  689. .btn{
  690. margin-bottom: 30px;
  691. }
  692. }
  693. }
  694. }
  695. .left-box {
  696. height: calc(100% );
  697. overflow-x: hidden;
  698. overflow-y: auto;
  699. pointer-events: auto;
  700. direction: rtl;
  701. .left-container{
  702. direction: ltr;
  703. }
  704. .control-item {
  705. height: 36px;
  706. }
  707. }
  708. }
  709. }
  710. }</style>