LightMatrix1.vue 29 KB

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