action.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. <template>
  2. <el-dialog
  3. width="70%"
  4. @open="opened"
  5. @closed="closed"
  6. :fullscreen="true"
  7. :show-close="true"
  8. class="dialogs"
  9. >
  10. <template #title>
  11. <div class="showTitles currentShowTitles">
  12. <div class="titles">动作查询</div>
  13. </div>
  14. </template>
  15. <div class="body">
  16. <div class="bodyDetial">
  17. <!-- <div style="width: 50%;height:200px;background-color:red;"></div>
  18. <div style="width: 50%;height:200px;background-color:yellow;"></div> -->
  19. <div class="left-item">
  20. <el-scrollbar>
  21. <el-input placeholder="输入关键字进行过滤" v-model="filterText">
  22. </el-input>
  23. <el-tree
  24. class="filter-tree"
  25. :data="showData"
  26. :props="defaultProps"
  27. :filter-node-method="filterNode"
  28. node-key="id"
  29. :default-expanded-keys="[0]"
  30. ref="tree"
  31. @node-click="handleChange"
  32. >
  33. </el-tree>
  34. </el-scrollbar>
  35. </div>
  36. <div class="right-item">
  37. <div class="dateBar">
  38. <el-date-picker
  39. class="pickers"
  40. @change="changes"
  41. v-model="timeValue"
  42. type="datetimerange"
  43. range-separator="至"
  44. start-placeholder="开始日期"
  45. end-placeholder="结束日期"
  46. >
  47. </el-date-picker>
  48. <div
  49. class="buttons"
  50. @click="
  51. () => {
  52. getControlRecord();
  53. getControlStatistics();
  54. }
  55. "
  56. >
  57. 查询
  58. </div>
  59. </div>
  60. <el-scrollbar style="height: 94%">
  61. <div class="tables">
  62. <el-table
  63. :data="recordData"
  64. class="table"
  65. style="width: 100%"
  66. height="81vh"
  67. :header-cell-style="{
  68. background: 'rgb(30,30,30)',
  69. color: 'rgb(220,220,220)',
  70. padding: '4px',
  71. fontSize: '14px',
  72. 'border-bottom': 'solid 1px rgba(77, 77, 77, 1)',
  73. }"
  74. :cell-style="{
  75. height: '40px',
  76. background: 'rgb(30,30,30)',
  77. color: 'rgb(220,220,220)',
  78. padding: '3px',
  79. fontSize: '12px',
  80. 'border-bottom': '1px solid #000000',
  81. }"
  82. @cell-dblclick="cellDbClick"
  83. >
  84. <el-table-column
  85. prop="time"
  86. label="日期"
  87. width="120"
  88. align="center"
  89. >
  90. </el-table-column>
  91. <el-table-column
  92. prop="code"
  93. label="风机号"
  94. width="120"
  95. align="center"
  96. >
  97. </el-table-column>
  98. <el-table-column
  99. prop="controls"
  100. label="控制命令"
  101. width="100"
  102. align="center"
  103. >
  104. </el-table-column>
  105. <el-table-column prop="result" label="操作结果" align="center">
  106. </el-table-column>
  107. <el-table-column
  108. prop="userName"
  109. label="操作人"
  110. width="160"
  111. align="center"
  112. >
  113. </el-table-column>
  114. </el-table>
  115. <div class="titleinfoall" v-if="showControlStatistics">
  116. <div class="titleinfo">
  117. <span class="showTitle fontSty1">启动次数:</span>
  118. <span class="showvalue">
  119. {{ controlStatisticsInfo.startCount }}
  120. </span>
  121. <span class="showTitle fontSty">次</span>
  122. </div>
  123. <div class="titleinfo">
  124. <span class="showTitle fontSty1">停机次数:</span>
  125. <span class="showvalue">
  126. {{ controlStatisticsInfo.stopCount }}
  127. </span>
  128. <span class="showTitle fontSty">次</span>
  129. </div>
  130. <div class="titleinfo">
  131. <span class="showTitle fontSty1">维护次数:</span>
  132. <span class="showvalue">
  133. {{ controlStatisticsInfo.maintenanceCount }}
  134. </span>
  135. <span class="showTitle fontSty">次</span>
  136. </div>
  137. <div class="titleinfo">
  138. <span class="showTitle fontSty1">解除维护次数:</span>
  139. <span class="showvalue">
  140. {{ controlStatisticsInfo.unMaintenanceCount }}
  141. </span>
  142. <span class="showTitle fontSty">次</span>
  143. </div>
  144. <div class="titleinfo">
  145. <span class="showTitle fontSty1">提前时间:</span>
  146. <span class="showvalue">
  147. {{ controlStatisticsInfo.advanceTime?.toFixed(2) || 0 }}
  148. </span>
  149. <span class="showTitle fontSty">小时</span>
  150. </div>
  151. <div class="titleinfo">
  152. <span class="showTitle fontSty1">多发电量:</span>
  153. <span class="showvalue">
  154. {{ controlStatisticsInfo.powerGeneration?.toFixed(2) || 0 }}
  155. </span>
  156. <span class="showTitle fontSty">kw</span>
  157. </div>
  158. <div class="titleinfo">
  159. <span class="showTitle fontSty1">节约电量:</span>
  160. <span class="showvalue">
  161. {{ controlStatisticsInfo.powerSaving?.toFixed(2) || 0 }}
  162. </span>
  163. <span class="showTitle fontSty">kw</span>
  164. </div>
  165. </div>
  166. </div>
  167. </el-scrollbar>
  168. <div class="paginations">
  169. <el-pagination
  170. :hide-on-single-page="true"
  171. :page-size="currentPage"
  172. background
  173. layout="prev, pager, next"
  174. :total="total"
  175. @current-change="handleCurrentChange"
  176. />
  177. </div>
  178. </div>
  179. </div>
  180. </div>
  181. <el-dialog
  182. class="dialogs"
  183. custom-class="currentBorder"
  184. width="70%"
  185. top="50px"
  186. :show-close="true"
  187. append-to-body
  188. v-model="showStartDialog"
  189. >
  190. <div id="chart" style="width: 100%; height: 500px" />
  191. <el-card class="otherContentBox" v-if="otherContentInfo.success">
  192. <el-descriptions title="控制评分">
  193. <el-descriptions-item label="控制时间">{{
  194. otherContentInfo.operationRecordTs || "---"
  195. }}</el-descriptions-item>
  196. <el-descriptions-item label="并网开始时间">{{
  197. otherContentInfo.onLineStartTs || "---"
  198. }}</el-descriptions-item>
  199. <el-descriptions-item label="并网结束时间">{{
  200. otherContentInfo.onLineEndTs || "---"
  201. }}</el-descriptions-item>
  202. <el-descriptions-item label="并网时长">
  203. {{ otherContentInfo.onLineDuration || "---" }}
  204. </el-descriptions-item>
  205. <el-descriptions-item label="并网期间发电量">{{
  206. otherContentInfo.onLinePowerGeneration
  207. }}</el-descriptions-item>
  208. <el-descriptions-item label="单位时间内发电量">{{
  209. otherContentInfo.powerGenerationPerHour
  210. }}</el-descriptions-item>
  211. <el-descriptions-item label="并网期间耗电量">{{
  212. otherContentInfo.powerConsumption
  213. }}</el-descriptions-item>
  214. <!-- <el-descriptions-item label="风能利用百分比">{{
  215. otherContentInfo.windUseRate
  216. }}</el-descriptions-item> -->
  217. <el-descriptions-item label="评分">
  218. <el-rate
  219. style="display: inline-block"
  220. v-model="otherContentInfo.score"
  221. allow-half
  222. disabled
  223. />
  224. <span>{{ otherContentInfo.score * 2 }}&nbsp;/&nbsp;10&nbsp;分</span>
  225. </el-descriptions-item>
  226. </el-descriptions>
  227. </el-card>
  228. <el-card class="otherContentBox" v-else>
  229. <div
  230. style="
  231. width: 100%;
  232. height: 140px;
  233. color: #eee;
  234. display: flex;
  235. justify-content: center;
  236. align-items: center;
  237. font-size: 18px;
  238. "
  239. >
  240. <el-empty
  241. class="empSvg"
  242. :image-size="100"
  243. description="暂无控制评分"
  244. />
  245. </div>
  246. </el-card>
  247. </el-dialog>
  248. </el-dialog>
  249. </template>
  250. <script>
  251. import dayjs from "dayjs";
  252. import api from "api/index";
  253. import * as echarts from "echarts";
  254. export default {
  255. props: {},
  256. updated() {
  257. if (this.timeValue.length === 0) {
  258. let date = new Date();
  259. this.timeValue[0] = date.getTime() - 28800000;
  260. this.timeValue[1] = date.getTime() + 3600000;
  261. }
  262. },
  263. mounted() {},
  264. data() {
  265. return {
  266. currentPage: 20,
  267. filterText: "",
  268. pageIndex: 1,
  269. station: [],
  270. datas: {},
  271. chooseStation: {},
  272. timeValue: [],
  273. showData: [
  274. {
  275. id: 0,
  276. code: "全部",
  277. stationId: "",
  278. children: [],
  279. },
  280. ],
  281. defaultProps: {
  282. children: "children",
  283. label: "code",
  284. },
  285. recordData: [],
  286. total: "",
  287. controlErorCodes: [
  288. "控制成功",
  289. "控制命令发送失败",
  290. "无效的控制地址",
  291. "被控设备异常",
  292. "无效的控制功能",
  293. "网络连接错误,检查场站通信",
  294. "控制结果读取超时",
  295. "未知错误",
  296. "控制命令错误",
  297. "收到无法识别数据",
  298. "未读取到数据包",
  299. "未知错误",
  300. "风机操作过频繁",
  301. "风机被挂牌",
  302. "风机操作与风机状态不符",
  303. "需要登录",
  304. ],
  305. showStartDialog: false,
  306. rateValue: 4.5,
  307. otherContentInfo: {
  308. score: 0,
  309. },
  310. showControlStatistics: false,
  311. controlStatisticsInfo: {},
  312. };
  313. },
  314. methods: {
  315. // getWindturbineFdc() {
  316. // api.getWindturbineFdc().then((res) => {
  317. // this.station = res.data;
  318. // this.getControlRecord();
  319. // });
  320. // },
  321. dataDeal() {
  322. let stationList = this.$store.state.stationList;
  323. this.showData[0].children = [
  324. // {
  325. // id : 1,
  326. // code : "风机全部",
  327. // stationId : "WIND_ALL",
  328. // children : [],
  329. // }
  330. ];
  331. stationList.forEach((item, index) => {
  332. if (item.type === 1) {
  333. let obj = {};
  334. obj.id = index + 1;
  335. obj.code = item.name;
  336. obj.stationId = item.id;
  337. obj.children = [];
  338. this.showData[0].children.push(obj);
  339. }
  340. });
  341. this.datas = this.$store.state.windturbinelist
  342. ? this.$store.state.windturbinelist
  343. : {};
  344. let arr = Object.keys(this.datas).sort();
  345. for (let id of arr) {
  346. let item = this.datas[id];
  347. this.showData[0].children
  348. .filter((val) => val.stationId === item.stationId)[0]
  349. ?.children.push(item);
  350. }
  351. },
  352. handleChange(value) {
  353. this.chooseStation = value;
  354. this.pageIndex = 1;
  355. this.getControlRecord(value);
  356. },
  357. closed() {
  358. this.pageIndex = 1;
  359. this.chooseStation = {};
  360. this.showData = [
  361. {
  362. id: 0,
  363. code: "全部",
  364. stationId: "",
  365. children: [],
  366. },
  367. ];
  368. let stationList = this.$store.state.stationList;
  369. stationList.forEach((item, index) => {
  370. let obj = {};
  371. obj.id = index + 1;
  372. obj.code = item.name;
  373. obj.stationId = item.id;
  374. obj.children = [];
  375. this.showData[0].children.push(obj);
  376. });
  377. this.$emit("closed");
  378. },
  379. filterNode(value, data) {
  380. if (!value) return true;
  381. return data.code.indexOf(value) !== -1;
  382. },
  383. handleCurrentChange(val) {
  384. this.pageIndex = val;
  385. this.getControlRecord();
  386. },
  387. opened() {
  388. let date = new Date();
  389. this.timeValue[0] = date.getTime() - 28800000;
  390. this.timeValue[1] = date.getTime() + 3600000;
  391. this.dataDeal();
  392. this.getControlRecord();
  393. },
  394. getControlStatistics() {
  395. this.showControlStatistics = false;
  396. this.controlStatisticsInfo = {};
  397. const stTs = this.timeValue[0];
  398. const endTs = this.timeValue[1];
  399. api
  400. .getControlStatistics(
  401. new Date(stTs).getTime(),
  402. new Date(endTs).getTime()
  403. )
  404. .then((res) => {
  405. this.showControlStatistics = true;
  406. this.controlStatisticsInfo = {
  407. advanceTime: res.data.advanceTime,
  408. maintenanceCount: res.data.maintenanceCount,
  409. powerGeneration: res.data.powerGeneration,
  410. powerSaving: res.data.powerSaving,
  411. startCount: res.data.startCount,
  412. stopCount: res.data.stopCount,
  413. unMaintenanceCount: res.data.unMaintenanceCount,
  414. };
  415. });
  416. },
  417. getControlRecord() {
  418. api
  419. .controlRecord({
  420. stationId: this.chooseStation.stationId
  421. ? this.chooseStation.stationId
  422. : "",
  423. userName: "",
  424. windturbineId:
  425. String(this.chooseStation?.id)?.length < 2
  426. ? ""
  427. : this.chooseStation.stationId
  428. ? this.chooseStation.windturbineId
  429. : "",
  430. startTime: dayjs(this.timeValue[0]).format("YYYY/MM/DD HH:mm:ss"),
  431. endTime: dayjs(this.timeValue[1]).format("YYYY/MM/DD HH:mm:ss"),
  432. pageSize: this.currentPage,
  433. pageIndex: this.pageIndex,
  434. })
  435. .then((res) => {
  436. if (res) {
  437. let types = {
  438. Start: "启动",
  439. Stop: "停止",
  440. Reset: "复位",
  441. Maintain: "维护",
  442. UnMaintain: "取消维护",
  443. Lock: "挂牌",
  444. UnLock: "取消挂牌",
  445. };
  446. res.data.dataList.forEach((item) => {
  447. item.time = dayjs(item.time).format("MM-DD HH:mm:ss");
  448. item.result = this.controlErorCodes[item.errorCode];
  449. item.controls = types[item.controlType];
  450. item.showName = item.windturbineId;
  451. });
  452. this.total = res.data.total;
  453. this.recordData = res.data.dataList;
  454. }
  455. });
  456. },
  457. cellDbClick(row) {
  458. const controlType = row.controlType || "";
  459. if (controlType === "Start") {
  460. this.initEcharts(row.id);
  461. }
  462. },
  463. initEcharts(id) {
  464. api.getEvaluationData(id).then((res) => {
  465. var data = res.data.datas;
  466. var statistics = res.data.statistics;
  467. var marks = new Array();
  468. if (Array.isArray(statistics.mark)) {
  469. for (var j = 0; j < statistics.mark.length; ++j) {
  470. marks.push({ xAxis: statistics.mark[j] });
  471. }
  472. }
  473. var ser = new Array();
  474. var isFirst = true;
  475. for (var i = 0; i < data.length; ++i) {
  476. var s = {
  477. data: data[i].values.map((item) => {
  478. return item.value;
  479. }),
  480. type: "line",
  481. name: data[i].name,
  482. symbol: "none",
  483. yAxisIndex: /功率/g.test(data[i].name) ? 1 : 0,
  484. };
  485. if (isFirst) {
  486. s.markLine = {
  487. symbol: ["none", "none"],
  488. label: { show: false },
  489. data: marks,
  490. };
  491. }
  492. ser.push(s);
  493. isFirst = false;
  494. }
  495. var option = {
  496. tooltip: {
  497. trigger: "axis",
  498. },
  499. legend: {
  500. show: true,
  501. textStyle: {
  502. color: "#eee", //字体颜色
  503. },
  504. data: data.map((item) => {
  505. return item.name;
  506. }),
  507. },
  508. xAxis: {
  509. type: "category",
  510. data: data[0].values.map((item) => {
  511. return new Date(item.ts).toLocaleString();
  512. }),
  513. axisLabel: {
  514. show: true,
  515. textStyle: {
  516. color: "#eee",
  517. },
  518. },
  519. },
  520. yAxis: [
  521. {
  522. type: "value",
  523. name: "风速(m/s)",
  524. nameTextStyle: {
  525. color: "#fff",
  526. },
  527. axisLabel: {
  528. textStyle: {
  529. color: "#eee",
  530. },
  531. },
  532. splitLine: {
  533. lineStyle: {
  534. color: ["#878787"],
  535. },
  536. },
  537. },
  538. {
  539. type: "value",
  540. name: "功率(kw)",
  541. nameTextStyle: {
  542. color: "#fff",
  543. },
  544. axisLabel: {
  545. textStyle: {
  546. color: "#eee",
  547. },
  548. },
  549. splitLine: {
  550. show: false,
  551. },
  552. },
  553. ],
  554. dataZoom: [
  555. {
  556. type: "inside",
  557. start: 0,
  558. end: 100,
  559. },
  560. ],
  561. series: ser,
  562. };
  563. if (res.data.statistics.success) {
  564. this.otherContentInfo = {
  565. operationRecordTs: this.formatDate(
  566. new Date(res.data.statistics.allTime.operationRecordTs)
  567. ),
  568. onLineStartTs: this.formatDate(
  569. new Date(res.data.statistics.allTime.onlineStartTs)
  570. ),
  571. onLineEndTs: this.formatDate(
  572. new Date(res.data.statistics.allTime.onlineEndTs)
  573. ),
  574. onLineDuration: `${res.data.statistics.allTime.onLineDuration.toFixed(
  575. 2
  576. )} h`,
  577. onLinePowerGeneration: `${res.data.statistics.onLinePowerGeneration.toFixed(
  578. 2
  579. )} kwh`,
  580. powerGenerationPerHour: `${res.data.statistics.powerGenerationPerHour.toFixed(
  581. 2
  582. )} kwh`,
  583. powerConsumption: `${res.data.statistics.powerConsumption.toFixed(
  584. 2
  585. )} kwh`,
  586. windUseRate: `${res.data.statistics.windUseRate.toFixed(2)} %`,
  587. score: res.data.statistics.score / 2,
  588. success: res.data.statistics.success,
  589. };
  590. } else {
  591. this.otherContentInfo = {};
  592. }
  593. this.showStartDialog = true;
  594. this.$nextTick(() => {
  595. let chartDom = document.getElementById("chart");
  596. chartDom.innerHTML = "";
  597. chartDom?.removeAttribute("_echarts_instance_");
  598. let chart = echarts.init(chartDom, null, { renderer: "svg" });
  599. chart.setOption(option);
  600. });
  601. });
  602. },
  603. formatDate(value) {
  604. var date = new Date(value);
  605. var y = date.getFullYear(),
  606. m = date.getMonth() + 1,
  607. d = date.getDate(),
  608. h = date.getHours(),
  609. i = date.getMinutes(),
  610. s = date.getSeconds();
  611. if (m < 10) {
  612. m = "0" + m;
  613. }
  614. if (d < 10) {
  615. d = "0" + d;
  616. }
  617. if (h < 10) {
  618. h = "0" + h;
  619. }
  620. if (i < 10) {
  621. i = "0" + i;
  622. }
  623. if (s < 10) {
  624. s = "0" + s;
  625. }
  626. var t = y + "-" + m + "-" + d + " " + h + ":" + i + ":" + s;
  627. return t;
  628. },
  629. },
  630. watch: {
  631. filterText(val) {
  632. this.$refs.tree.filter(val);
  633. },
  634. },
  635. };
  636. </script>
  637. <style lang="less" scoped>
  638. .body {
  639. background-color: #000000;
  640. height: 90vh;
  641. width: 102%;
  642. margin-left: -1%;
  643. margin-top: -40px;
  644. }
  645. .searchTitle {
  646. display: flex;
  647. flex-direction: row;
  648. justify-content: space-between;
  649. align-items: center;
  650. }
  651. .bodyDetial {
  652. display: flex;
  653. flex-direction: row;
  654. margin-left: 3vw;
  655. padding-top: 10px;
  656. color: #ffffff;
  657. height: 98%;
  658. }
  659. .left-item {
  660. width: 20%;
  661. height: 100%;
  662. background-color: rgba(77, 77, 77, 1);
  663. border-right: 2px solid #000000;
  664. }
  665. .right-item {
  666. width: 80%;
  667. height: 100%;
  668. background-color: rgba(77, 77, 77, 1);
  669. }
  670. .el-tree {
  671. color: #ffffff !important;
  672. background-color: rgba(77, 77, 77, 1) !important;
  673. }
  674. .el-tree-node:focus > .el-tree-node__content {
  675. background-color: #000000 !important;
  676. }
  677. .el-tree-node__content:hover {
  678. background-color: #000000 !important;
  679. }
  680. .dateBar {
  681. display: flex;
  682. flex-direction: row;
  683. align-items: center;
  684. justify-content: space-between;
  685. margin-left: 20px;
  686. }
  687. .pickers {
  688. margin-left: 20px;
  689. }
  690. .tables {
  691. margin-top: 20px;
  692. width: 95%;
  693. margin-left: 3%;
  694. position: relative;
  695. }
  696. .table {
  697. background-color: rgba(77, 77, 77, 1) !important;
  698. }
  699. .el-table td,
  700. .el-table th.is-leaf {
  701. border-bottom: 1px solid rgba(77, 77, 77, 1) !important;
  702. }
  703. .el-table__header {
  704. width: 100% !important;
  705. }
  706. .el-table__body-wrapper {
  707. background-color: rgba(77, 77, 77, 1) !important;
  708. }
  709. .el-table::before {
  710. width: 0;
  711. }
  712. tr {
  713. line-height: 1.5;
  714. background: #1e1e1e;
  715. margin-bottom: 2px;
  716. border-radius: 5px;
  717. }
  718. .table-main {
  719. font-size: 14px;
  720. width: 600px;
  721. text-align: center;
  722. background: #000000;
  723. margin: 5px;
  724. border-collapse: separate;
  725. border-spacing: 0px 5px;
  726. }
  727. .paginations {
  728. display: flex;
  729. flex-direction: row-reverse;
  730. }
  731. .titleinfoall {
  732. display: flex;
  733. position: absolute;
  734. left: 10px;
  735. bottom: 10px;
  736. }
  737. .showTitle {
  738. color: #ffffff;
  739. margin-right: 10px;
  740. }
  741. .fontSty {
  742. font-size: 12px;
  743. }
  744. .fontSty1 {
  745. font-weight: bold;
  746. }
  747. .showvalue {
  748. color: #ffffff;
  749. font-size: 14px;
  750. font-weight: bold;
  751. margin-right: 10px;
  752. }
  753. </style>
  754. <style lang="less">
  755. .el-dialog.currentBorder {
  756. border: 1px solid #eee;
  757. }
  758. .el-card.otherContentBox {
  759. background: rgb(36, 36, 36);
  760. .el-descriptions__header {
  761. color: #fff;
  762. }
  763. .el-descriptions__cell {
  764. white-space: nowrap;
  765. }
  766. .el-descriptions__body {
  767. color: #eee;
  768. background: rgb(36, 36, 36);
  769. }
  770. .empSvg {
  771. .el-empty__image {
  772. opacity: 0.9;
  773. }
  774. .el-empty__description {
  775. p {
  776. color: #eee;
  777. }
  778. }
  779. }
  780. }
  781. </style>