index.vue 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163
  1. <template>
  2. <div class="photovoltaicStation matrix-body">
  3. <div class="province-data">
  4. <div class="form-box" style="margin-right: 10px">
  5. <el-select v-model="typeNode" @change="levels1DataChang">
  6. <el-option
  7. v-for="(item, index) in levels1Data"
  8. :key="index"
  9. :label="item.name"
  10. :value="item.type"
  11. >
  12. </el-option>
  13. </el-select>
  14. </div>
  15. <div class="form-box">
  16. <el-select
  17. v-model="checkNode"
  18. :placeholder="''"
  19. collapse-tags
  20. size="mini"
  21. @change="companyChange"
  22. >
  23. <el-option
  24. v-for="(item, indexe) in OrganizationLists"
  25. :key="indexe"
  26. :label="item.aname"
  27. :value="item.id"
  28. >
  29. </el-option>
  30. </el-select>
  31. </div>
  32. </div>
  33. <div class="photovoltaic-chart3">
  34. <div class="chart-card power-statistics">
  35. <div class="chart-card-title-wrapper">
  36. <div class="chart-card-title">发电统计</div>
  37. <div class="right-bar">
  38. <div
  39. :class="datetype === 'r' ? 'type-button-on' : 'day-button'"
  40. @click="handleChangeDay('r')"
  41. >
  42. <div class="day-name">日</div>
  43. </div>
  44. <div
  45. :class="datetype === 'y' ? 'type-button-on' : 'day-button'"
  46. @click="handleChangeDay('y')"
  47. >
  48. <div class="day-name">月</div>
  49. </div>
  50. <div
  51. :class="datetype === 'n' ? 'type-button-on' : 'day-button'"
  52. @click="handleChangeDay('n')"
  53. >
  54. <div class="day-name">年</div>
  55. </div>
  56. </div>
  57. </div>
  58. <div class="chart-content">
  59. <div class="chart-img">
  60. <div class="img">
  61. <img src="../../../../assets/img/images/equipment-progress.png" />
  62. <div class="img-unit">
  63. <div class="information">
  64. {{ companyPowerStationData?.fdtj?.gnlyl?.toFixed(2) || 0 }}
  65. </div>
  66. </div>
  67. </div>
  68. <p>风能利用率(%)</p>
  69. </div>
  70. <ul class="chart-list">
  71. <li class="statistics-li">
  72. <span class="statistics-name">发电量</span>
  73. <div>
  74. <span class="statistics-data">{{
  75. companyPowerStationData?.fdtj?.rfdl?.toFixed(2) || 0
  76. }}</span>
  77. </div>
  78. <span class="statistics-unit">万kWh</span>
  79. </li>
  80. <li class="statistics-li">
  81. <span class="statistics-name">理论发电量</span>
  82. <div>
  83. <span class="statistics-data">{{
  84. companyPowerStationData?.fdtj?.llfdl?.toFixed(2) || 0
  85. }}</span>
  86. </div>
  87. <span class="statistics-unit">万kWh</span>
  88. </li>
  89. <li class="statistics-li">
  90. <span class="statistics-name">损失电量</span>
  91. <div>
  92. <span class="statistics-data">{{
  93. companyPowerStationData?.fdtj?.ssdl?.toFixed(2) || 0
  94. }}</span>
  95. </div>
  96. <span class="statistics-unit">万kWh</span>
  97. </li>
  98. </ul>
  99. </div>
  100. </div>
  101. <div class="chart-card station-status">
  102. <div class="chart-card-title">五项损失</div>
  103. <div class="chart-content">
  104. <div class="chart-pie">
  105. <div class="chart-total"></div>
  106. <!-- <pie-chart width="100%" height="100%" :lossPower="dayWindPieData" /> -->
  107. <pie-chart width="100%" height="100%" :series="dayWindPieData" />
  108. </div>
  109. <ul class="chart-list">
  110. <li
  111. v-for="item in dayWindPieData"
  112. :key="item.name"
  113. class="state-li"
  114. :class="item.class"
  115. >
  116. <span class="station-state">{{ item?.name }}</span>
  117. <span class="station-data"
  118. >{{
  119. item?.value
  120. ? ((item?.value / wxssTotal) * 100)?.toFixed(2)
  121. : 0
  122. }}
  123. <i class="unit">%</i></span
  124. >
  125. </li>
  126. </ul>
  127. </div>
  128. </div>
  129. <div class="chart-card">
  130. <div class="chart-card-title">场站损失(前5)</div>
  131. <div class="chart-content">
  132. <div class="chart-online">
  133. <div class="chart-total"></div>
  134. <pie-chart width="100%" height="100%" :series="stationTop5" />
  135. <!-- <PieStationTop5 width="100%" height="100%" :list="stationTop5" /> -->
  136. </div>
  137. <ul class="chart-list">
  138. <li
  139. class="online-li"
  140. v-for="(item, index) in stationTop5"
  141. :key="item.index"
  142. :class="'online' + index"
  143. >
  144. <span class="online-name">{{ item?.name }}</span>
  145. <div>
  146. <span class="online-data">{{
  147. item?.value
  148. ? ((item?.value / stationTopTotal) * 100)?.toFixed(2)
  149. : 0
  150. }}</span>
  151. <span class="online-percent">%</span>
  152. </div>
  153. </li>
  154. </ul>
  155. </div>
  156. </div>
  157. </div>
  158. <div class="photovoltaic-filter">
  159. <div class="photovoltaic-left">
  160. <div class="form-box sort">
  161. <span>排序方式:</span>
  162. <el-select
  163. size="mini"
  164. v-model="sortCode"
  165. placeholder="请选择"
  166. collapse-tags
  167. clearable
  168. @change="sortFilterchange"
  169. >
  170. <el-option
  171. v-for="(item, indexe) in sortArrData"
  172. :key="indexe"
  173. :label="item.label"
  174. :value="item.value"
  175. >
  176. </el-option>
  177. </el-select>
  178. </div>
  179. <div
  180. class="photovoltaic-sort"
  181. v-show="sortCode"
  182. @click="sortTypechange"
  183. >
  184. <i
  185. :class="sortType ? 'icon-descending-order' : 'icon-ascending-order'"
  186. ></i>
  187. </div>
  188. <div class="search-form">
  189. <div class="form-box station">
  190. <div class="label">场站:</div>
  191. <el-select
  192. v-model="stationName"
  193. placeholder="全部场站"
  194. clearable
  195. multiple
  196. collapse-tags
  197. size="mini"
  198. @change="stationChange"
  199. >
  200. <el-option
  201. v-for="(item, indexe) in complyData"
  202. :key="indexe"
  203. :label="item.aname"
  204. :value="item.id"
  205. >
  206. </el-option>
  207. </el-select>
  208. </div>
  209. <div class="form-box">
  210. <div
  211. class="theme-change"
  212. @click="themeChange('maintenance')"
  213. :class="themeType === 'maintenance' && 'active-theme'"
  214. >
  215. <i class="icon-operate"></i>
  216. <span>风能利用率</span>
  217. </div>
  218. <div
  219. class="theme-change"
  220. @click="themeChange('operate')"
  221. :class="themeType === 'operate' && 'active-theme'"
  222. >
  223. <i class="icon-maintenance"></i>
  224. <span>损失明细</span>
  225. </div>
  226. </div>
  227. </div>
  228. </div>
  229. <!-- <div class="photovoltaic-toggle">
  230. <div
  231. class="type-card"
  232. :class="isActive === 'card' && 'actived-toggle'"
  233. @click="
  234. () => {
  235. this.isActive = 'card';
  236. }
  237. "
  238. >
  239. <i class="icon-matrix"></i>
  240. </div>
  241. <div
  242. class="type-list"
  243. :class="isActive === 'list' && 'actived-toggle'"
  244. @click="
  245. () => {
  246. this.isActive = 'list';
  247. }
  248. "
  249. >
  250. <i class="icon-tabulation"></i>
  251. </div>
  252. </div>-->
  253. </div>
  254. <div class="photovoltaic-data">
  255. <Card :dataSource="cardData" :typeStr="typeNode" :theme="themeType" />
  256. <!-- <Card
  257. v-if="isActive === 'card'"
  258. :dataSource="cardData"
  259. :isStation="true"
  260. :theme="themeType"
  261. />
  262. <List
  263. v-if="isActive === 'list'"
  264. :dataSource="cardData"
  265. :isStation="true"
  266. :theme="themeType"
  267. /> -->
  268. </div>
  269. </div>
  270. </template>
  271. <script>
  272. import Card from "../homePage/components/card.vue";
  273. import List from "../homePage/components/list.vue";
  274. import PieChart from "@/components/chart/pie/dual-pie-chart-econey.vue";
  275. // import PieChart from "@/components/chart/pie/pie-chart.vue";
  276. // import PieStationTop5 from "@/components/chart/pie/pie-station-top5.vue";
  277. import { homePage } from "@/api/economy-homepage.js";
  278. import { GetOrganization, GetStationByCompany } from "@/api/econ-headerNav.js";
  279. export default {
  280. name: "photovoltaicLevelTwoStation", // 公司首页
  281. components: {
  282. Card,
  283. List,
  284. PieChart,
  285. // PieStationTop5,
  286. },
  287. data() {
  288. return {
  289. //风光类型
  290. levels1Data: [
  291. { type: -1, flag: true, id: "F", name: "风电" },
  292. { type: -2, flag: true, id: "G", name: "光伏" },
  293. ],
  294. typeNode: "-1",
  295. windSpeedRota: null, // 发电统计仪表盘转动角度
  296. OrganizationLists: [], // 公司列表
  297. complyData: [],
  298. stationLists: [], // 场站列表
  299. timer: null, // 3秒调一次
  300. checkNode: "", // 选中区域
  301. themeType: "maintenance", // 主题模式 风能利用率类:maintenance, 损失明细类:operate
  302. stationName: [], //选中场站
  303. isActive: "card", // 切换卡片或列表
  304. dayWindPieData: {}, //五项损失图表数据
  305. cardData: [], //展示列表数据
  306. listData: [], //列表数据
  307. allListData: [], //备用列表数据
  308. companyPowerStationData: [], //全部数据
  309. sortArrData: [
  310. { label: "发电量", value: "fdl" },
  311. { label: "故障损失", value: "gzssdl" },
  312. { label: "维护损失", value: "whssdl" },
  313. { label: "限电损失", value: "xdssdl" },
  314. { label: "性能损失", value: "xnssdl" },
  315. { label: "受累损失", value: "slssdl" },
  316. { label: "风能利用率", value: "gnlyl" }, //排序条件列表
  317. ],
  318. sortCode: "", //排序条件
  319. sortType: true, //升序降序
  320. datetype: "r",
  321. wxssTotal: 0,
  322. stationTopTotal: 0,
  323. };
  324. },
  325. methods: {
  326. init() {
  327. this.checkNode = this.$route.query.companyCode || "JS_RGN";
  328. this.typeNode = this.levels1Data[0].type;
  329. this.getDataDetial();
  330. this.getOrganizationList();
  331. this.getStationList();
  332. },
  333. //切换类型
  334. levels1DataChang() {
  335. this.checkNode = "";
  336. this.resetAllFiller();
  337. this.$router.push({ path: "/economicsOperation/comphomepageGf" });
  338. },
  339. async getDataDetial() {
  340. let { data: res } = await homePage({
  341. companyId: this.checkNode,
  342. type: 0,
  343. statype: this.typeNode,
  344. datetype: this.datetype,
  345. });
  346. this.companyPowerStationData = res; //所有页面数据
  347. this.listData = this.companyPowerStationData?.wxsslb; //列表数据
  348. this.allListData = this.companyPowerStationData?.wxsslb; //存储备用列表(筛选使用)
  349. this.cardData = this.getSortList(this.listData, this.sortCode);
  350. this.dayWindPieData = [
  351. {
  352. name: "性能损失",
  353. value: this.companyPowerStationData?.wxsstb?.xnss,
  354. class: "state-xn",
  355. },
  356. {
  357. name: "故障损失",
  358. value: this.companyPowerStationData?.wxsstb?.gzss,
  359. class: "state-gz",
  360. },
  361. {
  362. name: "维护损失",
  363. value: this.companyPowerStationData?.wxsstb?.whss,
  364. class: "state-wh",
  365. },
  366. {
  367. name: "限电损失",
  368. value: this.companyPowerStationData?.wxsstb?.xdss,
  369. class: "state-xd",
  370. },
  371. {
  372. name: "受累损失",
  373. value: this.companyPowerStationData?.wxsstb?.slss,
  374. class: "state-sl",
  375. },
  376. ];
  377. this.wxssTotal = this.dayWindPieData?.reduce((a, b) => {
  378. return a + b.value * 1;
  379. }, 0);
  380. this.stationTop5 = this.companyPowerStationData?.czwxss?.map((item) => {
  381. return { name: item.name, value: item.wxss };
  382. });
  383. this.stationTopTotal = this.stationTop5?.reduce((a, b) => {
  384. return a + b.value * 1;
  385. }, 0);
  386. },
  387. // 获取公司列表
  388. getOrganizationList() {
  389. GetOrganization({ type: this.typeNode }).then(({ data }) => {
  390. this.OrganizationLists = data;
  391. });
  392. },
  393. // 获取场站列表
  394. getStationList() {
  395. GetStationByCompany({
  396. companyids: this.checkNode,
  397. type: this.typeNode,
  398. }).then(({ data }) => {
  399. this.complyData = data;
  400. });
  401. },
  402. //排序方式改变(升序降序)
  403. sortTypechange() {
  404. this.sortType = !this.sortType;
  405. this.cardData = this.getSortList(this.listData, this.sortCode);
  406. },
  407. //排序条件改变
  408. sortFilterchange(val) {
  409. this.sortCode = val;
  410. this.cardData = this.getSortList(this.listData, this.sortCode);
  411. },
  412. //切换日月年
  413. handleChangeDay(val) {
  414. this.datetype = val;
  415. this.getDataDetial();
  416. },
  417. // 切换公司
  418. async companyChange(val) {
  419. clearInterval(this.timer);
  420. this.timer = null;
  421. const newUrl = `${location.href.split("?")[0]}?companyCode=${val}`;
  422. history.replaceState(null, null, newUrl);
  423. this.checkNode = val;
  424. this.resetAllFiller();
  425. this.getDataDetial();
  426. this.getStationList();
  427. this.stationLists = this.complyData;
  428. // this.timer = setInterval(() => {
  429. // this.getDataDetial();
  430. // }, 10000);
  431. },
  432. // 场站切换
  433. stationChange(val) {
  434. clearInterval(this.timer);
  435. this.timer = null;
  436. this.resetFiller();
  437. if (val && val.length) {
  438. this.stationName = val;
  439. let allListData = this.allListData;
  440. const params = val.length > 0 ? val : this.stationName;
  441. let listData1 = allListData.filter((item) =>
  442. params.some((i) => i == item.id)
  443. );
  444. this.listData = listData1;
  445. this.cardData = this.getSortList(this.listData, this.sortCode);
  446. this.timer = setInterval(() => {}, 3000);
  447. } else {
  448. this.stationName = [];
  449. this.listData = this.allListData;
  450. this.cardData = this.getSortList(this.listData, this.sortCode);
  451. }
  452. // this.timer = setInterval(() => {
  453. // this.getDataDetial();
  454. // }, 10000);
  455. },
  456. // 切换主题
  457. themeChange(type) {
  458. this.sortCode = "";
  459. this.themeType = type;
  460. },
  461. // 切换公司重置筛选条件
  462. resetAllFiller() {
  463. this.sortCode = "";
  464. this.stationName = "";
  465. this.sortType = true;
  466. },
  467. // 切换场站重置筛选条件
  468. resetFiller() {
  469. this.sortCode = "";
  470. this.sortType = true;
  471. },
  472. //列表排序方法
  473. getSortList(list, sort) {
  474. const _this = this;
  475. if (sort) {
  476. let cloneArr = JSON.parse(JSON.stringify(list));
  477. let sortArr = cloneArr.sort(function (a, b) {
  478. if (_this.sortType) {
  479. return Number(b[sort]) - Number(a[sort]);
  480. } else {
  481. return Number(a[sort]) - Number(b[sort]);
  482. }
  483. });
  484. return sortArr;
  485. } else {
  486. return this.listData;
  487. }
  488. },
  489. },
  490. created() {
  491. this.init();
  492. },
  493. mounted() {
  494. // this.timer = setInterval(() => {
  495. // this.getDataDetial();
  496. // }, 10000);
  497. },
  498. unmounted() {
  499. clearInterval(this.timer);
  500. this.timer = null;
  501. },
  502. watch: {},
  503. };
  504. </script>
  505. <style lang="less" scoped>
  506. :deep(.el-input) {
  507. .el-input__inner {
  508. height: 25px !important;
  509. background: #222832 !important;
  510. border: 1px solid #465166 !important;
  511. }
  512. }
  513. .photovoltaic-filter .sort {
  514. :deep(.el-input) {
  515. .el-input__inner {
  516. width: 140px !important;
  517. }
  518. }
  519. }
  520. .photovoltaic-filter .status {
  521. :deep(.el-input) {
  522. .el-input__inner {
  523. width: 100px !important;
  524. }
  525. }
  526. }
  527. .photovoltaic-filter .station {
  528. :deep(.el-input) {
  529. .el-input__inner {
  530. width: 160px !important;
  531. }
  532. }
  533. }
  534. .photovoltaicStation {
  535. display: flex;
  536. flex-direction: column;
  537. height: 100%;
  538. padding: 0 20px;
  539. .province-data {
  540. display: flex;
  541. .province {
  542. width: 132px;
  543. padding: 0 14px;
  544. height: 25px;
  545. line-height: 25px;
  546. background: rgba(0, 70, 199, 0.2);
  547. border-radius: 16px;
  548. text-align: center;
  549. margin-right: 15px;
  550. cursor: pointer;
  551. span {
  552. width: 29px;
  553. height: 12px;
  554. font-size: 14px;
  555. font-family: Microsoft YaHei;
  556. font-weight: 400;
  557. color: #fff;
  558. }
  559. i {
  560. font-size: 16px;
  561. color: #1b99ff;
  562. position: relative;
  563. margin-right: 9px;
  564. vertical-align: -9%;
  565. }
  566. }
  567. .form-box {
  568. display: flex;
  569. align-items: center;
  570. }
  571. }
  572. .photovoltaic-chart3 {
  573. margin-top: 20px;
  574. display: flex;
  575. .chart-card {
  576. height: 284px;
  577. flex: 1;
  578. margin-right: 25px;
  579. background: rgba(11, 11, 11, 0.45);
  580. border-radius: 8px;
  581. padding: 25px 15px;
  582. .chart-card-title-wrapper {
  583. display: flex;
  584. justify-content: space-between;
  585. }
  586. .chart-card-title {
  587. position: relative;
  588. top: -8px;
  589. left: 7px;
  590. font-size: 16px;
  591. color: #fff;
  592. }
  593. .right-bar {
  594. display: flex;
  595. flex-direction: row;
  596. align-items: center;
  597. margin-top: -8px;
  598. }
  599. .day-button {
  600. display: flex;
  601. flex-direction: row;
  602. align-items: center;
  603. justify-content: center;
  604. border: 1px solid #5e6778;
  605. border-radius: 16px;
  606. text-align: center;
  607. margin-right: 20px;
  608. cursor: pointer;
  609. color: #b3b3b3;
  610. font-size: 16px;
  611. height: 32px;
  612. min-width: 54px;
  613. .type-name {
  614. font-size: 14px;
  615. font-family: Microsoft YaHei;
  616. font-weight: 400;
  617. line-height: 32px;
  618. }
  619. }
  620. .type-button {
  621. display: flex;
  622. flex-direction: row;
  623. align-items: center;
  624. justify-content: center;
  625. padding: 0 14px;
  626. background: rgba(0, 70, 199, 0.2);
  627. border-radius: 16px;
  628. text-align: center;
  629. margin-right: 20px;
  630. cursor: pointer;
  631. color: #b3b3b3;
  632. font-size: 16px;
  633. height: 32px;
  634. min-width: 54px;
  635. .type-name {
  636. margin-left: 9px;
  637. font-size: 14px;
  638. font-family: Microsoft YaHei;
  639. font-weight: 400;
  640. line-height: 32px;
  641. }
  642. }
  643. .type-button-on {
  644. display: flex;
  645. flex-direction: row;
  646. align-items: center;
  647. justify-content: center;
  648. padding: 0 14px;
  649. background: rgba(0, 70, 199, 0.5);
  650. border-radius: 16px;
  651. text-align: center;
  652. margin-right: 20px;
  653. cursor: pointer;
  654. color: #1c99ff;
  655. font-size: 16px;
  656. height: 32px;
  657. min-width: 54px;
  658. .type-name {
  659. margin-left: 9px;
  660. color: #ffffff;
  661. font-size: 14px;
  662. font-family: Microsoft YaHei;
  663. font-weight: 400;
  664. line-height: 32px;
  665. }
  666. .day-name {
  667. color: #ffffff;
  668. font-size: 14px;
  669. font-family: Microsoft YaHei;
  670. font-weight: 400;
  671. line-height: 32px;
  672. }
  673. }
  674. .chart-content {
  675. display: flex;
  676. align-items: center;
  677. // justify-content: space-around;
  678. height: 200px;
  679. .chart-pie {
  680. position: relative;
  681. // flex: 1;
  682. width: 52%;
  683. height: 100%;
  684. .chart-total {
  685. position: absolute;
  686. text-align: center;
  687. z-index: 0;
  688. background: url("../../../../assets/img/images/piaBack.png")
  689. no-repeat;
  690. width: 80px;
  691. height: 80px;
  692. background-size: cover;
  693. left: 50%;
  694. margin-left: -40px;
  695. top: 50%;
  696. margin-top: -40px;
  697. .chart-num {
  698. font-family: Bicubik;
  699. font-size: 22px;
  700. color: #fff;
  701. margin-top: 16px;
  702. }
  703. .chart-name {
  704. color: #b3b3b3;
  705. font-size: 14px;
  706. }
  707. }
  708. }
  709. .chart-img {
  710. position: relative;
  711. width: 173px;
  712. height: 156px;
  713. background: url("../../../../assets/img/images/equipment-dashboard.png")
  714. no-repeat;
  715. background-size: cover;
  716. // .img {
  717. // height: 100%;
  718. // }
  719. .img-unit {
  720. font-family: Bicubik;
  721. display: flex;
  722. position: absolute;
  723. top: 44%;
  724. left: 19%;
  725. color: #fff;
  726. align-items: baseline;
  727. width: 110px;
  728. justify-content: center;
  729. .information {
  730. font-size: 20px;
  731. }
  732. }
  733. img {
  734. position: absolute;
  735. top: 53%;
  736. left: 9%;
  737. transform: rotateZ(360deg);
  738. transform-origin: right top;
  739. }
  740. p {
  741. position: absolute;
  742. bottom: 0;
  743. width: 100%;
  744. text-align: center;
  745. color: #fff;
  746. font-size: 12px;
  747. }
  748. }
  749. .chart-online {
  750. position: relative;
  751. width: 52%;
  752. height: 100%;
  753. .chart-total {
  754. position: absolute;
  755. text-align: center;
  756. z-index: 0;
  757. background: url("../../../../assets/img/images/piaBack.png")
  758. no-repeat;
  759. width: 80px;
  760. height: 80px;
  761. background-size: cover;
  762. left: 50%;
  763. margin-left: -40px;
  764. top: 50%;
  765. margin-top: -40px;
  766. .chart-num {
  767. font-family: Bicubik;
  768. font-size: 22px;
  769. color: #fff;
  770. margin-top: 16px;
  771. }
  772. .chart-name {
  773. color: #b3b3b3;
  774. font-size: 14px;
  775. }
  776. }
  777. }
  778. .chart-list {
  779. width: 45%;
  780. display: flex;
  781. flex-direction: column;
  782. // align-items: center;
  783. text-align: center;
  784. color: #b3b3b3;
  785. span {
  786. display: inline-block;
  787. }
  788. .statistics-li {
  789. display: flex;
  790. align-items: center;
  791. margin-bottom: 25px;
  792. font-size: 14px;
  793. .statistics-name {
  794. width: 80px;
  795. text-align: left;
  796. }
  797. .statistics-data {
  798. font-family: Bicubik;
  799. color: #fff;
  800. margin: 0 10px 0 20px;
  801. width: 90px;
  802. text-align: right;
  803. font-size: 16px;
  804. }
  805. .statistics-unit {
  806. color: #fff;
  807. white-space: nowrap;
  808. font-size: 12px;
  809. }
  810. }
  811. .state-li {
  812. display: flex;
  813. align-items: center;
  814. justify-content: space-between;
  815. padding-bottom: 5px;
  816. border-bottom: 1px solid #4c545a;
  817. margin-bottom: 10px;
  818. .station-state {
  819. display: flex;
  820. align-items: center;
  821. font-size: 16px;
  822. }
  823. .station-state:before {
  824. content: "";
  825. width: 10px;
  826. height: 10px;
  827. display: inline-block;
  828. background: #1c99ff;
  829. margin-right: 10px;
  830. border: 2px solid rgba(20, 24, 27, 0.25);
  831. }
  832. .station-data {
  833. font-family: Bicubik;
  834. color: #1c99ff;
  835. font-size: 16px;
  836. .unit {
  837. color: #b3b3b3;
  838. font-size: 12px;
  839. font-family: PingFangSC-Regular, PingFang SC;
  840. }
  841. }
  842. }
  843. .state-xn {
  844. .station-state:before {
  845. background: #1986e0;
  846. }
  847. .station-data {
  848. color: #1986e0;
  849. }
  850. }
  851. .state-gz {
  852. .station-state:before {
  853. background: #ba3237;
  854. }
  855. .station-data {
  856. color: #ba3237;
  857. }
  858. }
  859. .state-wh {
  860. .station-state:before {
  861. background: #e17d24;
  862. }
  863. .station-data {
  864. color: #e17d24;
  865. }
  866. }
  867. .state-xd {
  868. .station-state:before {
  869. background: #c531cb;
  870. }
  871. .station-data {
  872. color: #c531cb;
  873. }
  874. }
  875. .state-sl {
  876. .station-state:before {
  877. background: #a7a7a7;
  878. }
  879. .station-data {
  880. color: #a7a7a7;
  881. }
  882. }
  883. .online-li {
  884. display: flex;
  885. font-size: 15px;
  886. margin-bottom: 15px;
  887. align-items: center;
  888. justify-content: space-between;
  889. .online-name:before {
  890. content: "";
  891. display: inline-block;
  892. width: 5px;
  893. height: 5px;
  894. background: #a7a7a7;
  895. margin-right: 5px;
  896. }
  897. .online-name {
  898. display: flex;
  899. align-items: center;
  900. font-size: 17px;
  901. }
  902. .online-data {
  903. font-family: "AgencyFB-Reg";
  904. text-align: right;
  905. margin-right: 10px;
  906. color: #a7a7a7;
  907. font-size: 19px;
  908. }
  909. .online-percent {
  910. font-size: 14px;
  911. color: #fff;
  912. text-align: left;
  913. font-family: PingFangSC-Regular, PingFang SC;
  914. }
  915. &.online0 {
  916. .online-name:before {
  917. background: #1986e0;
  918. }
  919. .online-data {
  920. color: #1986e0;
  921. }
  922. }
  923. &.online1 {
  924. .online-name:before {
  925. background: #ba3237;
  926. }
  927. .online-data {
  928. color: #ba3237;
  929. }
  930. }
  931. &.online2 {
  932. .online-name:before {
  933. background: #e17d24;
  934. }
  935. .online-data {
  936. color: #e17d24;
  937. }
  938. }
  939. &.online3 {
  940. .online-name:before {
  941. background: #c531cb;
  942. }
  943. .online-data {
  944. color: #c531cb;
  945. }
  946. }
  947. &.online4 {
  948. .online-name:before {
  949. background: #a7a7a7;
  950. }
  951. .online-data {
  952. color: #a7a7a7;
  953. }
  954. }
  955. }
  956. .online-li:last-child {
  957. margin-bottom: 0;
  958. }
  959. }
  960. }
  961. }
  962. .chart-card:last-child {
  963. margin-right: 0;
  964. }
  965. .power-statistics {
  966. .chart-content {
  967. margin-left: 66px;
  968. .chart-img {
  969. margin-right: 52px;
  970. position: relative;
  971. top: -13px;
  972. }
  973. .chart-list {
  974. width: auto;
  975. }
  976. }
  977. }
  978. }
  979. .photovoltaic-filter {
  980. display: flex;
  981. justify-content: space-between;
  982. align-items: center;
  983. .photovoltaic-left {
  984. display: flex;
  985. height: 50px;
  986. align-items: center;
  987. color: #b3b3b3;
  988. .photovoltaic-sort {
  989. //display: flex;
  990. //margin-right: 10px;
  991. padding: 0 4px;
  992. color: #1b99ff;
  993. cursor: pointer;
  994. }
  995. .search-form {
  996. display: flex;
  997. align-items: center;
  998. margin-left: 10px;
  999. .form-box {
  1000. display: flex;
  1001. height: 50px;
  1002. align-items: center;
  1003. margin-right: 10px;
  1004. .theme-change {
  1005. display: flex;
  1006. align-items: center;
  1007. cursor: pointer;
  1008. margin-right: 10px;
  1009. i {
  1010. margin-right: 5px;
  1011. font-size: 16px;
  1012. }
  1013. span {
  1014. font-size: 14px;
  1015. }
  1016. }
  1017. .active-theme {
  1018. color: #1b99ff;
  1019. }
  1020. :deep(.el-input__inner) {
  1021. color: #b3b3b3;
  1022. }
  1023. .label {
  1024. white-space: nowrap;
  1025. margin-right: 5px;
  1026. }
  1027. }
  1028. .search-btn {
  1029. background: rgba(0, 69, 199, 0.45);
  1030. width: 100px;
  1031. height: 25px;
  1032. line-height: 25px;
  1033. text-align: center;
  1034. border-radius: 10px;
  1035. }
  1036. }
  1037. }
  1038. .photovoltaic-toggle {
  1039. display: flex;
  1040. align-items: center;
  1041. border: 1px solid #455066;
  1042. border-radius: 13px;
  1043. height: 25px;
  1044. box-sizing: border-box;
  1045. div:first-child {
  1046. // border-right: 1px solid #455066;
  1047. }
  1048. div {
  1049. width: 50px;
  1050. height: 100%;
  1051. background: #242b37;
  1052. cursor: pointer;
  1053. display: flex;
  1054. align-items: center;
  1055. justify-content: center;
  1056. i {
  1057. font-size: 16px;
  1058. }
  1059. }
  1060. .type-card {
  1061. border-top-left-radius: 12px;
  1062. border-bottom-left-radius: 12px;
  1063. }
  1064. .type-list {
  1065. border-top-right-radius: 12px;
  1066. border-bottom-right-radius: 12px;
  1067. }
  1068. .actived-toggle {
  1069. background: #1c3c77;
  1070. i {
  1071. color: #fff;
  1072. }
  1073. }
  1074. }
  1075. }
  1076. .photovoltaic-data {
  1077. flex: 1;
  1078. }
  1079. }
  1080. </style>