LightMatrix.vue 28 KB

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