LightMatrix3.vue 25 KB

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