LightMatrix3.vue 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093
  1. <template>
  2. <div class="light-matrix">
  3. <div class="panel">
  4. <div class="dot left top"></div>
  5. <div class="dot left bottom"></div>
  6. <div class="dot right top"></div>
  7. <div class="dot right bottom"></div>
  8. <Row>
  9. <Col :span="3">
  10. <div class="panel-item-gf">
  11. <div class="panel-item-gf-left">
  12. <span class="svg-icon svg-icon-write svg-icon-md">
  13. <SvgIcon :svgid="panelData.first.icon"></SvgIcon>
  14. </span>
  15. </div>
  16. <div class="panel-item-gf-right">
  17. <div class="panel-item-gf-up">{{ panelData.first.text }}</div>
  18. <div class="panel-item-gf-down">{{ sourceMap[panelData.first.key] || '---' }}</div>
  19. </div>
  20. </div>
  21. </Col>
  22. <Col :span="3" v-for="(data, index) of panelData.datas" :key="index">
  23. <div class="panel-item" :class="data.color">
  24. <div class="panel-item-left">
  25. <div class="panel-item-li">
  26. <span>{{ data.name }}</span>
  27. <span class="svg-icon svg-icon-sm" :class="'svg-icon-' + data.color">
  28. <SvgIcon :svgid="data.nameIcon"></SvgIcon>
  29. </span>
  30. </div>
  31. <div class="panel-item-li">
  32. <span v-if="data.calcStr && sourceMap">{{calcGfStr(data.calcStr) || '---'}}</span>
  33. <span v-else>{{sourceMap[data.key] || '---'}}</span>
  34. <span class="svg-icon svg-icon-sm" :class="'svg-icon-' + data.color">
  35. <SvgIcon :svgid="data.numIcon"></SvgIcon>
  36. </span>
  37. </div>
  38. </div>
  39. <div class="panel-item-right">
  40. <div class="panel-item-ri">
  41. <span>{{ data.text1 }}</span>
  42. <span>{{ sourceMap[data.key1] || '---' }}</span>
  43. </div>
  44. <div class="panel-item-ri">
  45. <span>{{ data.text2 }}</span>
  46. <span>{{ sourceMap[data.key2] || '---' }}</span>
  47. </div>
  48. </div>
  49. </div>
  50. </Col>
  51. </Row>
  52. </div>
  53. <div class="panel-box">
  54. <div v-for="(pItem, pIndex) in sourceMap.fjmap" :key="pIndex">
  55. <div class="panel-title">
  56. <div class="panel-title-name">
  57. <i class="fa fa-send"></i>
  58. <span>{{sourceMap.fczbmap[pItem[pIndex].wpId].name}}</span>
  59. <div class="sub-title-item" v-for="(data, index) of tables[0].subTitleDatas" :key="index">
  60. <span class="sub-title">{{ data.text }}</span>
  61. <span class="sub-count" :class="data.color">{{ sourceMap.fczbmap[pItem[pIndex].wpId][data.key] }}</span>
  62. </div>
  63. </div>
  64. </div>
  65. <div class="panel-body">
  66. <table>
  67. <tbody>
  68. <tr>
  69. <td v-for="(cItem, cIndex) in pItem" :key="cIndex">
  70. <div class="card" :class="cItem.color">
  71. <span class="center-icon svg-icon svg-icon-md" :class="cItem.color == 'write' ? 'svg-icon-black' : 'svg-icon-write'">
  72. <SvgIcon :svgid="mapping[cItem.color]"></SvgIcon>
  73. </span>
  74. <div class="card-panel">
  75. <div class="card-left">
  76. <div class="tag">{{ cItem.wtnum }}</div>
  77. <div class="num">
  78. <i class="fa fa-user"></i>
  79. <span>{{ cItem.fdl }}</span>
  80. </div>
  81. </div>
  82. <div class="card-right">
  83. <div class="num">
  84. <i class="fa fa-user"></i>
  85. <span>{{ cItem.gl }}</span>
  86. </div>
  87. <div class="num">
  88. <i class="fa fa-user"></i>
  89. <span>{{ cItem.fs }}</span>
  90. </div>
  91. </div>
  92. </div>
  93. </div>
  94. </td>
  95. </tr>
  96. </tbody>
  97. </table>
  98. </div>
  99. </div>
  100. </div>
  101. </div>
  102. </template>
  103. <script>
  104. import Row from "@/components/coms/grid/row.vue";
  105. import Col from "@/components/coms/grid/col.vue";
  106. import SvgIcon from "@com/coms/icon/svg-icon.vue";
  107. import util from "@/helper/util.js";
  108. import { datainit, webtest } from "@tools/websocket.js";
  109. import store from "@store/index.js";
  110. export default {
  111. // 名称
  112. name: "LightMatrix3",
  113. // 使用组件
  114. components: {
  115. Row,
  116. Col,
  117. SvgIcon,
  118. },
  119. // 数据
  120. data () {
  121. return {
  122. loadingFlg: false, // 遮罩开关
  123. websocketServe: null, // websocket 服务实例
  124. sourceMap: {}, // 核心数据
  125. mapping: {
  126. green: "svg-standby",
  127. blue: "svg-normal-power",
  128. purple: "svg-limit-power",
  129. red: "svg-gz-downtime",
  130. orange: "svg-jx-downtime",
  131. gray: "svg-offline",
  132. write: "svg-intranet-involvement",
  133. },
  134. panelData: {
  135. first: {
  136. icon: "svg-photovoltaic",
  137. text: "接入风场",
  138. key: "fcjrnum",
  139. },
  140. datas: [
  141. {
  142. color: "green",
  143. name: "待机",
  144. nameIcon: "svg-standby",
  145. calcStr: ["fcdjnum", "fcsdtjnum"],
  146. numIcon: "svg-manual",
  147. text1: "待风",
  148. key1: "fcdjnum",
  149. text2: "手动停机",
  150. key2: "fcsdtjnum",
  151. },
  152. {
  153. color: "blue",
  154. name: "运行",
  155. nameIcon: "svg-normal-power",
  156. calcStr: ["fczcfdnum", "fcqxjclnum"],
  157. numIcon: "svg-drop-output",
  158. text1: "正常发电",
  159. key1: "fczcfdnum",
  160. text2: "降出力运行",
  161. key2: "fcqxjclnum",
  162. },
  163. {
  164. color: "purple",
  165. name: "限电",
  166. nameIcon: "svg-limit-power",
  167. calcStr: ["fcxdjclnum", "fcxdtjnum"],
  168. numIcon: "svg-downtime",
  169. text1: "限电降出力",
  170. key1: "fcxdjclnum",
  171. text2: "停机",
  172. key2: "fcxdtjnum",
  173. },
  174. {
  175. color: "red",
  176. name: "故障",
  177. nameIcon: "svg-gz-downtime",
  178. calcStr: ["fcgztjnum", "fccnsltjnum"],
  179. numIcon: "svg-field-involved",
  180. text1: "故障停机",
  181. key1: "fcgztjnum",
  182. text2: "场内受累",
  183. key2: "fccnsltjnum",
  184. },
  185. {
  186. color: "orange",
  187. name: "检休",
  188. nameIcon: "svg-jx-downtime",
  189. calcStr: ["fcjcnum", "fccnsljxnum"],
  190. numIcon: "svg-field-involved",
  191. text1: "检修停机",
  192. key1: "fcjxtjnum",
  193. text2: "产内受累",
  194. key2: "fccnsljxnum",
  195. },
  196. {
  197. color: "write",
  198. name: "受累",
  199. calcStr: ["fcdwslnum", "fchjslnum"],
  200. nameIcon: "svg-intranet-involvement",
  201. numIcon: "svg-environment",
  202. text1: "电网",
  203. key1: "fcdwslnum",
  204. text2: "环境",
  205. key2: "fchjslnum",
  206. },
  207. {
  208. color: "gray",
  209. name: "离线",
  210. nameIcon: "svg-offline",
  211. key: "fclxnum",
  212. numIcon: "svg-unknown",
  213. text1: "离线",
  214. key1: "fclxnum",
  215. text2: "未知",
  216. key2: "fcwznum",
  217. }
  218. ],
  219. },
  220. tables: [
  221. {
  222. col: 15,
  223. subTitleDatas: [
  224. {
  225. text: "接入台数",
  226. color: "write",
  227. key: "jrts"
  228. },
  229. {
  230. text: "待机台数",
  231. color: "green",
  232. key: "djts"
  233. },
  234. {
  235. text: "并网台数",
  236. color: "blue",
  237. key: "yxts",
  238. },
  239. {
  240. text: "限电台数",
  241. color: "purple",
  242. key: "xdts"
  243. },
  244. {
  245. text: "故障台数",
  246. color: "red",
  247. key: "gzts"
  248. },
  249. {
  250. text: "检修台数",
  251. color: "orange",
  252. key: "whts"
  253. },
  254. {
  255. text: "受累台数",
  256. color: "write",
  257. key: "slts"
  258. },
  259. {
  260. text: "离线台数",
  261. color: "gray",
  262. key: "lxts"
  263. },
  264. {
  265. text: "风速",
  266. color: "gray",
  267. key: "ssfs"
  268. },
  269. {
  270. text: "预测功率",
  271. color: "gray",
  272. key: "ycgl"
  273. },
  274. {
  275. text: "保证功率",
  276. color: "gray",
  277. key: "bzgl"
  278. },
  279. {
  280. text: "应发功率",
  281. color: "gray",
  282. key: "yfgl"
  283. },
  284. {
  285. text: "实际功率",
  286. color: "gray",
  287. key: "sjgl"
  288. },
  289. {
  290. text: "AGC指令",
  291. color: "gray",
  292. key: "agcygsd"
  293. },
  294. {
  295. text: "出线功率",
  296. color: "gray",
  297. key: "agccxyg"
  298. },
  299. ],
  300. datas: [
  301. {
  302. tag: "A-11",
  303. num1: 12.6,
  304. num2: 12.6,
  305. num3: 12.6,
  306. color: "blue",
  307. },
  308. ],
  309. groupDatas: [],
  310. },
  311. ],
  312. };
  313. },
  314. // 函数
  315. methods: {
  316. // 根据风机状态码返回对应 class
  317. getColor (fjzt) {
  318. switch (fjzt) {
  319. case 0:
  320. return 'green';
  321. break;
  322. case 1:
  323. return 'blue';
  324. break;
  325. case 2:
  326. return 'red';
  327. break;
  328. case 3:
  329. return 'gray';
  330. break;
  331. case 4:
  332. return 'orange';
  333. break;
  334. case 5:
  335. return 'purple';
  336. break;
  337. case 6:
  338. return 'write';
  339. break;
  340. }
  341. },
  342. calcGfStr (calcStr) {
  343. return (parseInt(this.sourceMap[calcStr[0]]) + parseInt(this.sourceMap[calcStr[1]])) + "";
  344. },
  345. createGroupDatas (table) {
  346. table.groupDatas = [];
  347. let tempDatas = [];
  348. table.datas.forEach((data, index) => {
  349. if (index % table.col == 0) {
  350. if (tempDatas.length > 0) {
  351. table.groupDatas.push(util.copy(tempDatas));
  352. tempDatas = [];
  353. }
  354. }
  355. tempDatas.push(util.copy(data));
  356. });
  357. if (tempDatas.length > 0) {
  358. table.groupDatas.push(util.copy(tempDatas));
  359. tempDatas = [];
  360. }
  361. },
  362. },
  363. created () {
  364. // 创建后
  365. let tempData = [];
  366. for (let i = 0; i < 45; i++) {
  367. tempData.push(util.copy(this.tables[0].datas[0]));
  368. if (i == 39) {
  369. tempData[i].color = "green";
  370. }
  371. if (i == 40) {
  372. tempData[i].color = "purple";
  373. }
  374. if (i == 41) {
  375. tempData[i].color = "orange";
  376. }
  377. if (i == 42) {
  378. tempData[i].color = "red";
  379. }
  380. if (i == 43) {
  381. tempData[i].color = "write";
  382. }
  383. if (i == 44) {
  384. tempData[i].color = "gray";
  385. }
  386. }
  387. this.tables[0].datas = util.copy(tempData);
  388. this.createGroupDatas(this.tables[0]);
  389. for (let i = 0; i < 5; i++) {
  390. this.tables.push(util.copy(this.tables[0]));
  391. }
  392. },
  393. mounted () {
  394. // 渲染后
  395. let that = this;
  396. that.loadingFlg = true;
  397. that.BASE.showLoading();
  398. that.$nextTick(() => {
  399. that.websocketServe && that.websocketServe.disconnect();
  400. that.API.requestData({
  401. method: "POST",
  402. subUrl: "admin/websocketdisconnect",
  403. success () {
  404. that.websocketServe = datainit("/topic/matrixdetialpushtask");
  405. }
  406. });
  407. });
  408. },
  409. watch: {
  410. // 监听 websocket 回调并包装数据用于展示
  411. '$store.state.windturbineMap': function (res) {
  412. this.loadingFlg && this.BASE.closeLoading();
  413. this.loadingFlg = false;
  414. if (res) {
  415. let sourceMap = JSON.parse(res);
  416. for (let key in sourceMap) {
  417. if (key !== 'fczbmap' && key !== 'fjmap') {
  418. sourceMap[key] += '';
  419. } else if (key === 'fjmap') {
  420. sourceMap[key].forEach(pItem => {
  421. pItem.forEach(cItem => {
  422. cItem.color = this.getColor(cItem.fjzt);
  423. cItem.isShow = true;
  424. });
  425. });
  426. }
  427. }
  428. this.sourceMap = sourceMap;
  429. } else {
  430. this.sourceMap = {};
  431. }
  432. }
  433. }
  434. };
  435. </script>
  436. <style lang="less" scoped>
  437. @panelHeight: 6.481vh;
  438. @titleHeight: 3.704vh;
  439. .light-matrix {
  440. width: calc(100% - 1.111vh);
  441. height: calc(100vh - 7.222vh);
  442. display: flex;
  443. flex-direction: column;
  444. .panel {
  445. width: 100%;
  446. border: 1px solid @gray;
  447. position: relative;
  448. padding: 1.111vh 2.222vh;
  449. background-color: fade(@gray, 20%);
  450. .dot {
  451. width: 2px;
  452. height: 2px;
  453. border-radius: 50%;
  454. background-color: @write;
  455. position: absolute;
  456. &.left {
  457. left: 4px;
  458. }
  459. &.right {
  460. right: 4px;
  461. }
  462. &.top {
  463. top: 4px;
  464. }
  465. &.bottom {
  466. bottom: 4px;
  467. }
  468. }
  469. .panel-item-gf {
  470. width: 100%;
  471. background-color: fade(@gray, 20%);
  472. display: flex;
  473. height: @panelHeight;
  474. .panel-item-gf-left {
  475. width: @panelHeight;
  476. height: @panelHeight;
  477. background-color: fade(@gray, 40%);
  478. display: flex;
  479. align-items: center;
  480. justify-content: center;
  481. i {
  482. font-size: 2.778vh;
  483. color: @write;
  484. }
  485. }
  486. .panel-item-gf-right {
  487. flex-grow: 1;
  488. color: @write;
  489. text-align: right;
  490. .panel-item-gf-up {
  491. height: @panelHeight / 2;
  492. border-bottom: 1px solid fade(@gray, 40%);
  493. line-height: @panelHeight / 2;
  494. padding-right: 1.111vh;
  495. font-size: @fontsize;
  496. }
  497. .panel-item-gf-down {
  498. height: @panelHeight / 2;
  499. line-height: @panelHeight / 2;
  500. padding-right: 1.111vh;
  501. font-weight: 600;
  502. font-size: @fontsize-l;
  503. }
  504. }
  505. }
  506. .panel-item {
  507. width: 100%;
  508. height: @panelHeight;
  509. display: flex;
  510. font-size: @fontsize;
  511. .panel-item-left {
  512. width: @panelHeight;
  513. height: @panelHeight;
  514. .panel-item-li {
  515. width: 100%;
  516. height: @panelHeight / 2;
  517. line-height: @panelHeight / 2;
  518. padding: 0 1.111vh;
  519. display: flex;
  520. align-items: center;
  521. .svg-icon {
  522. margin-left: auto;
  523. }
  524. }
  525. }
  526. .panel-item-right {
  527. flex-grow: 1;
  528. height: @panelHeight;
  529. .panel-item-ri {
  530. height: @panelHeight / 2;
  531. line-height: @panelHeight / 2;
  532. padding: 0 1.111vh;
  533. &:first-child {
  534. border-bottom: 0.093vh solid;
  535. }
  536. span {
  537. &:first-child {
  538. float: left;
  539. }
  540. &:last-child {
  541. float: right;
  542. color: @write;
  543. }
  544. }
  545. }
  546. }
  547. &.green {
  548. background-color: fade(@green, 20%);
  549. color: @green;
  550. .panel-item-left {
  551. background-color: fade(@green, 20%);
  552. }
  553. .panel-item-right {
  554. .panel-item-ri {
  555. &:first-child {
  556. border-color: @green;
  557. }
  558. }
  559. }
  560. }
  561. &.blue {
  562. background-color: fade(@darkBlue, 20%);
  563. color: @darkBlue;
  564. .panel-item-left {
  565. background-color: fade(@darkBlue, 20%);
  566. }
  567. .panel-item-right {
  568. .panel-item-ri {
  569. &:first-child {
  570. border-color: @darkBlue;
  571. }
  572. }
  573. }
  574. }
  575. &.purple {
  576. background-color: fade(@purple, 20%);
  577. color: @purple;
  578. .panel-item-left {
  579. background-color: fade(@purple, 20%);
  580. }
  581. .panel-item-right {
  582. .panel-item-ri {
  583. &:first-child {
  584. border-color: @purple;
  585. }
  586. }
  587. }
  588. }
  589. &.red {
  590. background-color: fade(@red, 20%);
  591. color: @red;
  592. .panel-item-left {
  593. background-color: fade(@red, 20%);
  594. }
  595. .panel-item-right {
  596. .panel-item-ri {
  597. &:first-child {
  598. border-color: @red;
  599. }
  600. }
  601. }
  602. }
  603. &.orange {
  604. background-color: fade(@orange, 20%);
  605. color: @orange;
  606. .panel-item-left {
  607. background-color: fade(@orange, 20%);
  608. }
  609. .panel-item-right {
  610. .panel-item-ri {
  611. &:first-child {
  612. border-color: @orange;
  613. }
  614. }
  615. }
  616. }
  617. &.gray {
  618. background-color: fade(@gray, 20%);
  619. color: @gray;
  620. .panel-item-left {
  621. background-color: fade(@gray, 20%);
  622. }
  623. .panel-item-right {
  624. .panel-item-ri {
  625. &:first-child {
  626. border-color: @gray;
  627. }
  628. }
  629. }
  630. }
  631. &.write {
  632. background-color: fade(@write, 20%);
  633. color: @write;
  634. .panel-item-left {
  635. background-color: fade(@write, 20%);
  636. }
  637. .panel-item-right {
  638. .panel-item-ri {
  639. &:first-child {
  640. border-color: @write;
  641. }
  642. }
  643. }
  644. }
  645. }
  646. }
  647. .panel-box {
  648. margin-top: 1.481vh;
  649. flex-grow: 1;
  650. overflow: auto;
  651. .panel-title {
  652. width: 100%;
  653. height: @titleHeight;
  654. line-height: @titleHeight;
  655. background-color: fade(@gray, 40%);
  656. .panel-title-name {
  657. font-size: 1.111vh;
  658. color: @green;
  659. display: flex;
  660. align-items: center;
  661. i {
  662. margin: 0 0.556vh 0 1.481vh;
  663. }
  664. .sub-title-item {
  665. .sub-title {
  666. color: @gray;
  667. font-size: 1.019vh;
  668. margin: 0 0.556vh 0 1.481vh;
  669. }
  670. .sub-count {
  671. font-size: 1.296vh;
  672. font-family: 'Bicubik';
  673. font-weight: 500;
  674. &.write {
  675. color: @write;
  676. }
  677. &.green {
  678. color: @green;
  679. }
  680. &.blue {
  681. color: @blue;
  682. }
  683. &.purple {
  684. color: @purple;
  685. }
  686. &.red {
  687. color: @red;
  688. }
  689. &.orange {
  690. color: @orange;
  691. }
  692. &.gray {
  693. color: @gray;
  694. }
  695. }
  696. }
  697. }
  698. }
  699. .panel-body {
  700. background-color: fade(@gray, 20%);
  701. padding: 0.741vh;
  702. margin-bottom: 1.481vh;
  703. table {
  704. width: 100%;
  705. .card {
  706. border: 1px solid;
  707. position: relative;
  708. .center-icon {
  709. font-size: 2.222vh;
  710. position: absolute;
  711. left: calc(50% - 1.111vh);
  712. top: calc(50% - 1.111vh);
  713. }
  714. .card-panel {
  715. display: flex;
  716. flex-grow: row;
  717. .card-left {
  718. width: 50%;
  719. border-right: 1px solid;
  720. .tag {
  721. color: @write;
  722. font-size: 1.111vh;
  723. width: 100%;
  724. text-align: center;
  725. border-bottom: 1px solid;
  726. padding: 0.37vh 0;
  727. }
  728. .num {
  729. width: 100%;
  730. font-size: 1.019vh;
  731. text-align: left;
  732. padding-right: 0.278vh;
  733. padding: 0.37vh 0;
  734. i {
  735. margin: 0 0.37vh;
  736. }
  737. }
  738. }
  739. .card-right {
  740. width: 50%;
  741. .num {
  742. width: 100%;
  743. font-size: 1.019vh;
  744. text-align: left;
  745. padding-right: 0.278vh;
  746. padding: 0.37vh 0;
  747. &:first-child {
  748. border-bottom: 1px solid;
  749. }
  750. i {
  751. margin: 0 0.37vh;
  752. }
  753. }
  754. }
  755. }
  756. .card-percent {
  757. height: 0.926vh;
  758. padding: 0.093vh 0.185vh;
  759. position: relative;
  760. border-top: 1px solid;
  761. background-color: transparent;
  762. .percent {
  763. height: 0.648vh;
  764. background-color: @green;
  765. position: absolute;
  766. left: 0.185vh;
  767. top: 0.093vh;
  768. }
  769. }
  770. &.blue {
  771. border-color: @darkBlue;
  772. background-color: fade(@darkBlue, 30%);
  773. .center-icon {
  774. color: @write;
  775. }
  776. .card-panel {
  777. .card-left {
  778. border-color: @darkBlue;
  779. .tag {
  780. border-color: @darkBlue;
  781. }
  782. .num {
  783. color: @darkBlue;
  784. }
  785. }
  786. .card-right {
  787. .num {
  788. color: @darkBlue;
  789. border-color: @darkBlue;
  790. }
  791. }
  792. }
  793. .card-percent {
  794. border-color: @darkBlue;
  795. }
  796. }
  797. &.purple {
  798. border-color: @purple;
  799. background-color: fade(@purple, 30%);
  800. .center-icon {
  801. color: @write;
  802. }
  803. .card-panel {
  804. .card-left {
  805. border-color: @purple;
  806. .tag {
  807. border-color: @purple;
  808. }
  809. .num {
  810. color: @purple;
  811. }
  812. }
  813. .card-right {
  814. .num {
  815. color: @purple;
  816. border-color: @purple;
  817. }
  818. }
  819. }
  820. .card-percent {
  821. border-color: @purple;
  822. }
  823. }
  824. &.orange {
  825. border-color: @orange;
  826. background-color: fade(@orange, 30%);
  827. .center-icon {
  828. color: @write;
  829. }
  830. .card-panel {
  831. .card-left {
  832. border-color: @orange;
  833. .tag {
  834. border-color: @orange;
  835. }
  836. .num {
  837. color: @orange;
  838. }
  839. }
  840. .card-right {
  841. .num {
  842. color: @orange;
  843. border-color: @orange;
  844. }
  845. }
  846. }
  847. .card-percent {
  848. border-color: @orange;
  849. }
  850. }
  851. &.green {
  852. border-color: @green;
  853. background-color: fade(@green, 30%);
  854. .center-icon {
  855. color: @write;
  856. }
  857. .card-panel {
  858. .card-left {
  859. border-color: @green;
  860. .tag {
  861. border-color: @green;
  862. }
  863. .num {
  864. color: @green;
  865. }
  866. }
  867. .card-right {
  868. .num {
  869. color: @green;
  870. border-color: @green;
  871. }
  872. }
  873. }
  874. .card-percent {
  875. border-color: @green;
  876. }
  877. }
  878. &.gray {
  879. border-color: @gray;
  880. background-color: fade(@gray, 30%);
  881. .center-icon {
  882. color: @write;
  883. }
  884. .card-panel {
  885. .card-left {
  886. border-color: @gray;
  887. .tag {
  888. border-color: @gray;
  889. }
  890. .num {
  891. color: @gray;
  892. }
  893. }
  894. .card-right {
  895. .num {
  896. color: @gray;
  897. border-color: @gray;
  898. }
  899. }
  900. }
  901. .card-percent {
  902. border-color: @gray;
  903. }
  904. }
  905. &.red {
  906. border-color: @red;
  907. .center-icon {
  908. color: @write;
  909. }
  910. .card-panel {
  911. background-color: @red;
  912. .card-left {
  913. border-color: @darkRed;
  914. .tag {
  915. border-color: @darkRed;
  916. }
  917. .num {
  918. color: @write;
  919. }
  920. }
  921. .card-right {
  922. .num {
  923. color: @write;
  924. border-color: @darkRed;
  925. }
  926. }
  927. }
  928. .card-percent {
  929. border-color: @red;
  930. }
  931. }
  932. &.write {
  933. border-color: @write;
  934. .center-icon {
  935. color: @black;
  936. }
  937. .card-panel {
  938. background-color: @write;
  939. .card-left {
  940. border-color: @black;
  941. .tag {
  942. color: @black;
  943. border-color: @black;
  944. }
  945. .num {
  946. color: @black;
  947. }
  948. }
  949. .card-right {
  950. .num {
  951. color: @black;
  952. border-color: @black;
  953. }
  954. }
  955. }
  956. }
  957. }
  958. }
  959. }
  960. }
  961. }
  962. </style>