indexGf.vue 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853
  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 class="label">对标方式:</div>
  227. <el-select
  228. style="width: 145px"
  229. v-model="benchmarkingVal"
  230. placeholder="请选择"
  231. clearable
  232. size="mini"
  233. @change="changeNum"
  234. >
  235. <el-option
  236. @mousedown.native="clickBench(item.value)"
  237. v-for="(item, indexe) in benchmarking"
  238. :key="indexe"
  239. :label="item.label"
  240. :value="item.value"
  241. >
  242. </el-option>
  243. </el-select>
  244. <el-badge
  245. v-if="benchNum !== 0 && benchmarkingVal !== ''"
  246. @click="hidenBenchList"
  247. :value="benchNum"
  248. style="margin-left: 20px; cursor: pointer"
  249. >
  250. <img src="@/assets/img/images/benhNum.png" />
  251. </el-badge>
  252. </div>
  253. <div
  254. style="z-index: 999; width: 45%; background: #0c0f15"
  255. class="window"
  256. v-if="displaycheck === true"
  257. >
  258. <div class="stitBorder"></div>
  259. <p class="ststTit header">
  260. <span v-if="benchmarkingVal === 'bench2'"> 场际对标 </span>
  261. <span v-if="benchmarkingVal === 'bench3'"> 项目对标 </span>
  262. <span v-if="benchmarkingVal === 'bench4'"> 线路对标 </span>
  263. <span v-if="benchmarkingVal === 'bench5'"> 阵区对标 </span>
  264. <span v-if="benchmarkingVal === 'bench1'"> 场内对标 </span>
  265. (<span style="color: #d8d8d9">{{ benchNum }}</span
  266. >)
  267. </p>
  268. <div class="lines"></div>
  269. <div
  270. class="overHidd"
  271. style="padding-top: 10px"
  272. v-if="benchmarkingVal === 'bench1'"
  273. >
  274. <ul
  275. v-for="(item, index) in cardBench"
  276. :key="index"
  277. class="stations"
  278. >
  279. <li>
  280. {{ stationData?.name }}
  281. </li>
  282. <li
  283. style="
  284. white-space: nowrap;
  285. overflow: hidden;
  286. text-overflow: ellipsis;
  287. "
  288. >
  289. {{ item }}
  290. </li>
  291. <li @click="removeTable(index)" style="cursor: pointer">
  292. <i class="el-icon-close"></i>
  293. </li>
  294. </ul>
  295. </div>
  296. <div class="overHidd" v-if="benchmarkingVal === 'bench2'">
  297. <ul
  298. v-for="(item, index) in cardBench"
  299. :key="index"
  300. class="stations"
  301. >
  302. <li
  303. style="
  304. width: 60%;
  305. white-space: nowrap;
  306. overflow: hidden;
  307. text-overflow: ellipsis;
  308. "
  309. >
  310. {{ item }}
  311. </li>
  312. <li @click="removeTable(index)" style="cursor: pointer">
  313. <i class="el-icon-close"></i>
  314. </li>
  315. </ul>
  316. </div>
  317. <div
  318. class="overHidd"
  319. v-if="
  320. benchmarkingVal !== 'bench2' && benchmarkingVal !== 'bench1'
  321. "
  322. >
  323. <ul
  324. v-for="(item, index) in cardLists"
  325. :key="index"
  326. class="stations"
  327. >
  328. <li style="text-overflow: ellipsis">
  329. {{ item }}
  330. </li>
  331. <li @click="removeTable(index)" style="cursor: pointer">
  332. <i class="el-icon-close"></i>
  333. </li>
  334. </ul>
  335. </div>
  336. <el-row
  337. class="footerButton"
  338. v-if="
  339. benchmarkingVal === 'bench1' || benchmarkingVal === 'bench2'
  340. "
  341. style="position: absolute; bottom: 19px; left: 15px"
  342. >
  343. <el-button
  344. type="primary"
  345. :disabled="cardBench.length < 2"
  346. round
  347. @click="openCurvData"
  348. >开始对标</el-button
  349. >
  350. <div class="footTitle" @click="clearTable">
  351. <p>清空</p>
  352. <Delete
  353. style="
  354. width: 17px;
  355. height: 17px;
  356. margin-top: 6px;
  357. margin-left: 5px;
  358. color: rgba(255, 102, 0, 1);
  359. "
  360. />
  361. </div>
  362. </el-row>
  363. <el-row
  364. class="footerButton"
  365. v-else
  366. style="position: absolute; bottom: 19px; left: 15px"
  367. >
  368. <el-button
  369. type="primary"
  370. :disabled="cardLists.length < 2"
  371. round
  372. @click="openCurvDatased"
  373. >开始对标</el-button
  374. >
  375. <div class="footTitle" @click="clearTable">
  376. <p>清空</p>
  377. <Delete
  378. style="
  379. width: 17px;
  380. height: 17px;
  381. margin-top: 6px;
  382. margin-left: 5px;
  383. color: rgba(255, 102, 0, 1);
  384. "
  385. />
  386. </div>
  387. </el-row>
  388. </div>
  389. </div>
  390. </div>
  391. <!-- 右侧列表卡片切换按钮 <div class="photovoltaic-toggle">
  392. <div
  393. class="type-card"
  394. :class="isActive === 'card' && 'actived-toggle'"
  395. @click="
  396. () => {
  397. this.isActive = 'card';
  398. }
  399. "
  400. >
  401. <i class="icon-matrix"></i>
  402. </div>
  403. <div
  404. class="type-list"
  405. :class="isActive === 'list' && 'actived-toggle'"
  406. @click="
  407. () => {
  408. this.isActive = 'list';
  409. }
  410. "
  411. >
  412. <i class="icon-tabulation"></i>
  413. </div>
  414. </div>-->
  415. </div>
  416. <div class="photovoltaic-data">
  417. <Card
  418. ref="childCard"
  419. :dataSource="cardData"
  420. :benchmarkingVal="benchmarkingVal"
  421. :electTarget="electTarget"
  422. :typeStr="typeNode"
  423. :theme="themeType"
  424. :isStation="true"
  425. />
  426. <!-- <Card
  427. v-if="isActive === 'card'"
  428. :dataSource="cardData"
  429. :isStation="true"
  430. :theme="themeType"
  431. />
  432. <List
  433. v-if="isActive === 'list'"
  434. :dataSource="cardData"
  435. :isStation="true"
  436. :theme="themeType"
  437. /> -->
  438. </div>
  439. <el-dialog
  440. class="dialogs"
  441. width="100%"
  442. fullscreen
  443. v-model="displaybench"
  444. :show-close="true"
  445. :destroy-on-close="true"
  446. >
  447. <template #title>
  448. <div class="dialog-title">
  449. <img
  450. class="dialog-title-img"
  451. src="@assets/img/images/dialog-title.png"
  452. />
  453. <div v-if="benchmarkingVal === 'bench2'" class="title">场际对标</div>
  454. <div v-if="benchmarkingVal === 'bench3'" class="title">项目对标</div>
  455. <div v-if="benchmarkingVal === 'bench4'" class="title">线路对标</div>
  456. <div v-if="benchmarkingVal === 'bench5'" class="title">阵区对标</div>
  457. <div v-if="benchmarkingVal === 'bench1'" class="title">场内对标</div>
  458. </div>
  459. </template>
  460. <div class="dialog-body">
  461. <img class="dialog-img" src="@assets/img/images/dialog.png" />
  462. <siteBench v-if="benchmarkingVal === 'bench1'" ref="siteBench" />
  463. <intervalBench
  464. v-if="benchmarkingVal === 'bench2'"
  465. ref="intervalBench"
  466. />
  467. <projectBench v-if="benchmarkingVal === 'bench3'" ref="projectBench" />
  468. <wiringBench v-if="benchmarkingVal === 'bench4'" ref="wiringBench" />
  469. <quarterBench v-if="benchmarkingVal === 'bench5'" ref="quarterBench" />
  470. </div>
  471. </el-dialog>
  472. </div>
  473. </template>
  474. <script>
  475. import Card from "../homePage/components/card.vue";
  476. import List from "../homePage/components/list.vue";
  477. import PieChart from "@/components/chart/pie/dual-pie-chart-econey.vue";
  478. import siteBench from "@/views//layout/economicsOperation/benchmarkingManagement/siteBenchmarking/index";
  479. import intervalBench from "@/views//layout/economicsOperation/benchmarkingManagement/intervalBenchmarking/index";
  480. import projectBench from "@/views//layout/economicsOperation/benchmarkingManagement/projectBenchmarking/index";
  481. import wiringBench from "@/views//layout/economicsOperation/benchmarkingManagement/wiringBenchmarking/index";
  482. import quarterBench from "@/views//layout/economicsOperation/benchmarkingManagement/quarterBenchmarking/index";
  483. import { homePage } from "@/api/economy-homepage.js";
  484. import { GetOrganization, GetStationByCompany } from "@/api/econ-headerNav.js";
  485. import { GetRegionInfo } from "@/api/home.js";
  486. export default {
  487. name: "companyHomepage", // 公司分析
  488. components: {
  489. Card,
  490. List,
  491. PieChart,
  492. siteBench,
  493. intervalBench,
  494. projectBench,
  495. wiringBench,
  496. quarterBench,
  497. },
  498. data() {
  499. return {
  500. //风光类型
  501. levels1Data: [
  502. { type: -1, flag: true, id: "F", name: "风电" },
  503. { type: -2, flag: true, id: "G", name: "光伏" },
  504. ],
  505. province: {
  506. name: "",
  507. code: "",
  508. },
  509. typeNode: "-2",
  510. windSpeedRota: null, // 发电统计仪表盘转动角度
  511. OrganizationLists: [], // 公司列表
  512. complyData: [],
  513. stationLists: [], // 场站列表
  514. timer: null, // 3秒调一次
  515. checkNode: "", // 选中区域
  516. themeType: "maintenance", // 主题模式 光能利用率类:maintenance, 损失明细类:operate
  517. stationName: [], //选中场站
  518. isActive: "card", // 切换卡片或列表
  519. dayWindPieData: {}, //五项损失图表数据
  520. cardData: [], //展示列表数据
  521. listData: [], //列表数据
  522. allListData: [], //备用列表数据
  523. companyPowerStationData: [], //全部数据
  524. sortArrData: [
  525. { label: "发电量", value: "fdl" },
  526. { label: "故障损失", value: "gzssdl" },
  527. { label: "维护损失", value: "whssdl" },
  528. { label: "限电损失", value: "xdssdl" },
  529. { label: "性能损失", value: "xnssdl" },
  530. { label: "受累损失", value: "slssdl" },
  531. { label: "光能利用率", value: "gnlyl" }, //排序条件列表
  532. ],
  533. sortCode: "", //排序条件
  534. sortType: true, //升序降序
  535. datetype: "r",
  536. wxssTotal: 0,
  537. stationTopTotal: 0,
  538. benchmarking: [
  539. { label: "场内对标", value: "bench1" },
  540. { label: "场际对标", value: "bench2" },
  541. { label: "项目对标", value: "bench3" },
  542. { label: "线路对标", value: "bench4" },
  543. { label: "阵区对标", value: "bench5" },
  544. ],
  545. benchmarkingVal: "",
  546. benchNum: 0,
  547. displaycheck: false,
  548. displaybench: false,
  549. benchIndex: "",
  550. selectTime: "",
  551. benchChang: "",
  552. cardBench: [],
  553. ListBench: [],
  554. ListBenchs: [],
  555. didBench: "",
  556. benchCode: "",
  557. stationData: {},
  558. dateTimes: null,
  559. timerCurvData: null,
  560. eventx: "",
  561. eventY: "",
  562. stationEg: null,
  563. cardVal: [],
  564. cardVals: [],
  565. cardLists: [],
  566. cardListed: [],
  567. cardNmeCode: [],
  568. cardSta: [],
  569. cardPro: [],
  570. cardLin: [],
  571. };
  572. },
  573. methods: {
  574. init() {
  575. let province = JSON.parse(localStorage.getItem("GlobalConfig"));
  576. if (!province) {
  577. this.getProvinceCode();
  578. } else {
  579. this.province = {
  580. name: province.name,
  581. code: province.code,
  582. };
  583. }
  584. this.checkNode = this.$route.query.companyCode || this.province.code;
  585. this.typeNode = this.levels1Data[1].type;
  586. this.getDataDetial();
  587. this.getOrganizationList();
  588. this.getStationList();
  589. },
  590. async getProvinceCode() {
  591. const data = await GetRegionInfo();
  592. this.province = {
  593. name: data.name,
  594. code: data.code,
  595. };
  596. localStorage.setItem("GlobalConfig", JSON.stringify(data));
  597. },
  598. // 打开对标框
  599. async hidenBenchList(event) {
  600. this.displaycheck = !this.displaycheck;
  601. },
  602. // 切换对标方式
  603. changeNum(val) {
  604. // clearInterval(this.timerDetial);
  605. if (val === "") {
  606. this.$confirm("是否清空对标方式?", "提示", {
  607. confirmButtonText: "确定",
  608. cancelButtonText: "取消",
  609. type: "warning",
  610. })
  611. .then(async () => {
  612. this.$message({
  613. type: "success",
  614. message: "已清空!",
  615. offset: 200,
  616. center: true,
  617. customClass: "s",
  618. });
  619. this.selectTime = "";
  620. this.displaycheck = false;
  621. this.$refs.childCard.changenums();
  622. })
  623. .catch((_) => {
  624. this.benchChang = this.didBench;
  625. this.benchmarkingVal = this.didBench;
  626. });
  627. }
  628. this.benchChang = val;
  629. },
  630. // 点击对标方式
  631. clickBench(val) {
  632. this.didBench = val;
  633. let s = this.benchmarkingVal;
  634. if (
  635. this.benchChang !== "" &&
  636. val !== "" &&
  637. this.benchmarkingVal !== val &&
  638. this.benchNum !== 0
  639. ) {
  640. this.$confirm("是否切换对标方式?", "提示", {
  641. confirmButtonText: "确定",
  642. cancelButtonText: "取消",
  643. type: "warning",
  644. })
  645. .then(async () => {
  646. this.$message({
  647. type: "success",
  648. message: "切换成功!",
  649. offset: 200,
  650. center: true,
  651. customClass: "s",
  652. });
  653. this.selectTime = "";
  654. this.benchmarkingVal = val;
  655. this.$refs.childCard.changenums();
  656. this.displaycheck = false;
  657. })
  658. .catch(() => {
  659. this.benchmarkingVal = s;
  660. });
  661. }
  662. },
  663. // 删除购物车内容
  664. removeTable(index) {
  665. if (this.benchmarkingVal === "bench2") {
  666. this.cardBench.splice(index, 1);
  667. this.benchNum = this.cardBench.length;
  668. if (this.cardBench.length === 0) {
  669. this.displaycheck = false;
  670. }
  671. this.$refs.childCard.changenBench(this.cardBench);
  672. } else if (this.benchmarkingVal === "bench1") {
  673. let stationAname;
  674. this.cardBench.splice(index, 1);
  675. this.benchNum = this.cardBench.length;
  676. if (this.cardBench.length === 0) {
  677. this.displaycheck = false;
  678. stationAname = "";
  679. } else {
  680. stationAname = this.stationData;
  681. }
  682. this.$refs.childCard.changenBenchs(this.cardBench, stationAname);
  683. } else if (
  684. this.benchmarkingVal === "bench4" ||
  685. this.benchmarkingVal === "bench5" ||
  686. this.benchmarkingVal === "bench3"
  687. ) {
  688. this.cardLists.splice(index, 1);
  689. this.cardNmeCode.splice(index, 1);
  690. let arr = [];
  691. this.cardVal.forEach((s) => {
  692. this.cardNmeCode.forEach((z) => {
  693. if (z === s.nemCode) {
  694. arr.push(s);
  695. }
  696. });
  697. });
  698. this.cardVals = [...new Set(arr)];
  699. this.cardBench = this.cardNmeCode;
  700. if (this.cardNmeCode.length === 0) {
  701. this.displaycheck = false;
  702. }
  703. this.$refs.childCard.changenBench(this.cardBench, this.cardVals);
  704. this.benchNum = this.cardNmeCode.length;
  705. }
  706. },
  707. // 清空购物车
  708. clearTable() {
  709. this.cardBench = [];
  710. this.benchNum = this.cardBench.length;
  711. this.displaycheck = false;
  712. if (this.benchmarkingVal === "bench1") {
  713. this.$refs.childCard.changenBenchs(this.cardBench, "");
  714. } else {
  715. this.$refs.childCard.changenBench(this.cardBench);
  716. }
  717. },
  718. disBenTable() {
  719. this.displaycheck = false;
  720. },
  721. // 点击确认后添加数据
  722. setdata(data) {
  723. this.cardBench = data;
  724. this.benchNum = data.length;
  725. if (data.length === 0) {
  726. this.displaycheck = false;
  727. }
  728. },
  729. // 点击确认后添加数据
  730. setdataed(data, val) {
  731. this.cardBench = data;
  732. this.benchNum = data.length;
  733. this.stationData = val;
  734. if (data.length === 0) {
  735. this.displaycheck = false;
  736. }
  737. },
  738. setdatas(data, val, sta, pro, lin) {
  739. this.cardSta = sta;
  740. this.cardPro = pro;
  741. this.cardLin = lin;
  742. this.cardBench = data;
  743. this.cardVal = val;
  744. this.benchNum = data.length;
  745. if (data.length === 0) {
  746. this.displaycheck = false;
  747. }
  748. this.getList();
  749. },
  750. getList() {
  751. let arr = [];
  752. let data = [];
  753. if (this.benchmarkingVal === "bench3") {
  754. let n = [];
  755. this.cardVal.forEach((s) => {
  756. this.cardBench.forEach((z) => {
  757. if (s.nemCode === z) {
  758. arr.push(s.aname);
  759. data.push(s.id);
  760. n.push(s);
  761. }
  762. });
  763. });
  764. this.cardVals = [...new Set(n)];
  765. } else if (
  766. this.benchmarkingVal === "bench4" ||
  767. this.benchmarkingVal === "bench5"
  768. ) {
  769. let n = [];
  770. this.cardVal.forEach((s) => {
  771. this.cardBench.forEach((z, index) => {
  772. if (s.nemCode === z) {
  773. arr.push(s.names);
  774. data.push(s.nemCode);
  775. n.push(s);
  776. }
  777. });
  778. });
  779. this.cardVals = [...new Set(n)];
  780. }
  781. this.cardNmeCode = [...new Set(data)];
  782. this.cardLists = [...new Set(arr)];
  783. },
  784. // 场内开始对标
  785. openCurvDatasedDate() {
  786. let arr = [];
  787. this.cardBench.forEach((s) => {
  788. arr.push(s);
  789. });
  790. if (arr.length == 2) {
  791. this.displaycheck = false;
  792. this.displaybench = true;
  793. this.$nextTick(() => {
  794. if (this.$refs.siteBench) {
  795. this.$refs.siteBench.starTime = arr[0];
  796. this.$refs.siteBench.endTime = arr[1];
  797. }
  798. this.$refs.siteBench &&
  799. this.$refs.siteBench.init(
  800. this.stationData,
  801. this.typeNode,
  802. this.checkNode
  803. );
  804. });
  805. }
  806. },
  807. openCurvData() {
  808. this.benchmarkingVal === "bench1"
  809. ? this.openCurvDatasedDate()
  810. : this.openCurvDatased();
  811. },
  812. // 开始对标(除场内对标)
  813. openCurvDatased() {
  814. this.displaycheck = false;
  815. this.displaybench = true;
  816. this.curvData();
  817. },
  818. curvData() {
  819. if (this.benchmarkingVal === "bench2") {
  820. let arr = [];
  821. this.cardData.forEach((s) => {
  822. this.cardBench.forEach((d) => {
  823. if (s.name === d) {
  824. arr.push(s.id);
  825. }
  826. });
  827. });
  828. this.$nextTick(() => {
  829. this.$refs.intervalBench &&
  830. this.$refs.intervalBench.init(arr, this.typeNode, this.checkNode);
  831. });
  832. } else if (this.benchmarkingVal === "bench3") {
  833. this.$nextTick(() => {
  834. this.$refs.projectBench &&
  835. this.$refs.projectBench.init(
  836. this.cardSta,
  837. this.cardBench,
  838. this.checkNode,
  839. this.typeNode
  840. );
  841. });
  842. } else if (this.benchmarkingVal === "bench4") {
  843. this.$nextTick(() => {
  844. this.$refs.wiringBench &&
  845. this.$refs.wiringBench.init(
  846. this.typeNode,
  847. this.checkNode,
  848. this.cardSta,
  849. this.cardPro,
  850. this.cardBench
  851. );
  852. });
  853. } else if (this.benchmarkingVal === "bench5") {
  854. this.$nextTick(() => {
  855. this.$refs.quarterBench &&
  856. this.$refs.quarterBench.init(
  857. this.typeNode,
  858. this.checkNode,
  859. this.cardSta,
  860. this.cardPro,
  861. this.cardLin,
  862. this.cardBench
  863. );
  864. });
  865. }
  866. },
  867. // 关闭购物车
  868. cancel() {
  869. this.displaycheck = false;
  870. },
  871. //切换类型
  872. levels1DataChang() {
  873. this.checkNode = "";
  874. this.resetAllFiller();
  875. this.$router.push({ path: "/economicsOperation/comphomepage" });
  876. },
  877. // 获取数据
  878. async getDataDetial() {
  879. let { data: res } = await homePage({
  880. companyId: this.checkNode,
  881. type: 0,
  882. statype: -2,
  883. datetype: this.datetype,
  884. });
  885. this.companyPowerStationData = res; //所有页面数据
  886. this.listData = this.companyPowerStationData?.wxsslb; //列表数据
  887. this.allListData = this.companyPowerStationData?.wxsslb; //存储备用列表(筛选使用)
  888. this.cardData = this.getSortList(this.listData, this.sortCode);
  889. this.dayWindPieData = [
  890. {
  891. name: "性能损失",
  892. value: this.companyPowerStationData?.wxsstb?.xnss,
  893. class: "state-xn",
  894. },
  895. {
  896. name: "故障损失",
  897. value: this.companyPowerStationData?.wxsstb?.gzss,
  898. class: "state-gz",
  899. },
  900. {
  901. name: "维护损失",
  902. value: this.companyPowerStationData?.wxsstb?.whss,
  903. class: "state-wh",
  904. },
  905. {
  906. name: "限电损失",
  907. value: this.companyPowerStationData?.wxsstb?.xdss,
  908. class: "state-xd",
  909. },
  910. {
  911. name: "受累损失",
  912. value: this.companyPowerStationData?.wxsstb?.slss,
  913. class: "state-sl",
  914. },
  915. ];
  916. this.wxssTotal = this.dayWindPieData?.reduce((a, b) => {
  917. return a + b.value * 1;
  918. }, 0);
  919. this.stationTop5 = this.companyPowerStationData?.czwxss?.map((item) => {
  920. return { name: item.name, value: item.wxss };
  921. });
  922. this.stationTopTotal = this.stationTop5?.reduce((a, b) => {
  923. return a + b.value * 1;
  924. }, 0);
  925. },
  926. // 获取公司列表
  927. getOrganizationList() {
  928. GetOrganization({ type: this.typeNode }).then(({ data }) => {
  929. this.OrganizationLists = data;
  930. });
  931. },
  932. // 获取场站列表
  933. getStationList() {
  934. GetStationByCompany({
  935. companyids: this.checkNode,
  936. type: this.typeNode,
  937. }).then(({ data }) => {
  938. this.complyData = data;
  939. });
  940. },
  941. //排序方式改变(升序降序)
  942. sortTypechange() {
  943. this.sortType = !this.sortType;
  944. this.cardData = this.getSortList(this.listData, this.sortCode);
  945. },
  946. //排序条件改变
  947. sortFilterchange(val) {
  948. this.sortCode = val;
  949. this.cardData = this.getSortList(this.listData, this.sortCode);
  950. },
  951. //切换日月年
  952. handleChangeDay(val) {
  953. this.datetype = val;
  954. this.getDataDetial();
  955. },
  956. // 切换公司
  957. async companyChange(val) {
  958. clearInterval(this.timer);
  959. this.timer = null;
  960. const newUrl = `${location.href.split("?")[0]}?companyCode=${val}`;
  961. history.replaceState(null, null, newUrl);
  962. this.checkNode = val;
  963. this.resetAllFiller();
  964. this.getDataDetial();
  965. this.getStationList();
  966. this.stationLists = this.complyData;
  967. // this.timer = setInterval(() => {
  968. // this.getDataDetial();
  969. // }, 10000);
  970. },
  971. // 场站切换
  972. stationChange(val) {
  973. clearInterval(this.timer);
  974. this.timer = null;
  975. this.resetFiller();
  976. if (val && val.length) {
  977. this.stationName = val;
  978. let allListData = this.allListData;
  979. const params = val.length > 0 ? val : this.stationName;
  980. let listData1 = allListData.filter((item) =>
  981. params.some((i) => i == item.id)
  982. );
  983. this.listData = listData1;
  984. this.cardData = this.getSortList(this.listData, this.sortCode);
  985. this.timer = setInterval(() => {}, 3000);
  986. } else {
  987. this.stationName = [];
  988. this.listData = this.allListData;
  989. this.cardData = this.getSortList(this.listData, this.sortCode);
  990. }
  991. // this.timer = setInterval(() => {
  992. // this.getDataDetial();
  993. // }, 10000);
  994. },
  995. // 切换主题
  996. themeChange(type) {
  997. this.sortCode = "";
  998. this.themeType = type;
  999. },
  1000. // 切换公司重置筛选条件
  1001. resetAllFiller() {
  1002. this.sortCode = "";
  1003. this.stationName = "";
  1004. this.sortType = true;
  1005. },
  1006. // 切换场站重置筛选条件
  1007. resetFiller() {
  1008. this.sortCode = "";
  1009. this.sortType = true;
  1010. },
  1011. //列表排序方法
  1012. getSortList(list, sort) {
  1013. const _this = this;
  1014. if (sort) {
  1015. let cloneArr = JSON.parse(JSON.stringify(list));
  1016. let sortArr = cloneArr.sort(function (a, b) {
  1017. if (_this.sortType) {
  1018. return Number(b[sort]) - Number(a[sort]);
  1019. } else {
  1020. return Number(a[sort]) - Number(b[sort]);
  1021. }
  1022. });
  1023. return sortArr;
  1024. } else {
  1025. return this.listData;
  1026. }
  1027. },
  1028. },
  1029. created() {
  1030. this.init();
  1031. },
  1032. mounted() {
  1033. // this.timer = setInterval(() => {
  1034. // this.getDataDetial();
  1035. // }, 10000);
  1036. },
  1037. unmounted() {
  1038. clearInterval(this.timer);
  1039. this.timer = null;
  1040. },
  1041. watch: {},
  1042. };
  1043. </script>
  1044. <style lang="less" scoped>
  1045. .window {
  1046. position: absolute;
  1047. top: 22px;
  1048. right: -45%;
  1049. height: 350px;
  1050. border: 1px solid #094493;
  1051. border-image: linear-gradient(
  1052. 0deg,
  1053. rgba(28, 156, 255, 0),
  1054. rgba(28, 156, 255, 0.6),
  1055. rgba(28, 156, 255, 0.8)
  1056. )
  1057. 1 1;
  1058. background: rgba(29, 34, 43, 0.9) !important;
  1059. border-radius: 3px;
  1060. box-shadow: 0 0 22px rgba(0, 70, 199, 0.2) inset !important;
  1061. .stitBorder {
  1062. position: absolute;
  1063. width: 70%;
  1064. height: 2px;
  1065. top: 0;
  1066. background-image: linear-gradient(to right, #1c99ff, rgba(0, 70, 199, 0));
  1067. }
  1068. //box-shadow: 0 0 22px rgb(0 70 199 / 20%) inset !important;
  1069. }
  1070. .ststTit {
  1071. width: 100%;
  1072. text-align: center;
  1073. height: 44px;
  1074. color: #1c99ff;
  1075. font-size: 16px;
  1076. line-height: 44px;
  1077. box-sizing: border-box;
  1078. //cursor: move;
  1079. }
  1080. .lines {
  1081. width: 99%;
  1082. height: 1px;
  1083. margin-left: 1px;
  1084. position: relative;
  1085. background: #3a3f43;
  1086. &:after {
  1087. content: "";
  1088. display: block;
  1089. width: 9px;
  1090. height: 1px;
  1091. background-color: #fff;
  1092. position: absolute;
  1093. right: 0;
  1094. }
  1095. &:before {
  1096. content: "";
  1097. display: block;
  1098. width: 8px;
  1099. height: 1px;
  1100. background-color: #fff;
  1101. position: absolute;
  1102. left: 0;
  1103. }
  1104. }
  1105. .overHidd {
  1106. overflow: scroll;
  1107. height: 70%;
  1108. width: 100%;
  1109. }
  1110. .footerButton {
  1111. display: flex;
  1112. justify-content: space-between;
  1113. width: 90%;
  1114. .footTitle {
  1115. height: 30px;
  1116. line-height: 30px;
  1117. display: flex;
  1118. p {
  1119. font-size: 14px;
  1120. font-family: Microsoft YaHei;
  1121. font-weight: 300;
  1122. color: #d3d3d3;
  1123. }
  1124. }
  1125. .el-button:last-of-type {
  1126. width: 88px;
  1127. color: rgba(28, 108, 255, 1);
  1128. border-radius: 3px;
  1129. background: rgba(28, 108, 255, 0);
  1130. border: 1px solid !important;
  1131. border-image: linear-gradient(0deg, rgba(28, 156, 255, 0), #1d74eb, #1d74eb)
  1132. 1 1 !important;
  1133. }
  1134. /deep/ .el-button.is-round {
  1135. padding: 0 10px !important;
  1136. }
  1137. }
  1138. .stations {
  1139. height: 39px;
  1140. line-height: 39px;
  1141. width: 100%;
  1142. display: flex;
  1143. border-bottom: 1px solid rgba(76, 85, 90, 1);
  1144. justify-content: space-between;
  1145. font-size: 13px;
  1146. padding-right: 20px;
  1147. padding-left: 20px;
  1148. color: rgba(211, 211, 211, 1);
  1149. white-space: nowrap;
  1150. }
  1151. .photovoltaic-filter {
  1152. /deep/ .el-badge__content--danger {
  1153. background: #ff6600;
  1154. border: 1px solid #a5a5a5;
  1155. }
  1156. /deep/ .el-badge__content.is-fixed {
  1157. top: 5px;
  1158. right: 10px;
  1159. }
  1160. }
  1161. .searchColors {
  1162. background: rgba(0, 70, 199, 0.5) !important;
  1163. color: #ffffff !important;
  1164. }
  1165. :deep(.el-input) {
  1166. .el-input__inner {
  1167. height: 25px !important;
  1168. background: #222832 !important;
  1169. border: 1px solid #465166 !important;
  1170. }
  1171. }
  1172. .photovoltaic-filter .sort {
  1173. :deep(.el-input) {
  1174. .el-input__inner {
  1175. width: 140px !important;
  1176. }
  1177. }
  1178. }
  1179. .photovoltaic-filter .status {
  1180. :deep(.el-input) {
  1181. .el-input__inner {
  1182. width: 100px !important;
  1183. }
  1184. }
  1185. }
  1186. .photovoltaic-filter .station {
  1187. :deep(.el-input) {
  1188. .el-input__inner {
  1189. width: 160px !important;
  1190. }
  1191. }
  1192. }
  1193. .dialog-body {
  1194. height: 100%;
  1195. }
  1196. .photovoltaicStation {
  1197. display: flex;
  1198. flex-direction: column;
  1199. height: 100%;
  1200. padding: 0 20px;
  1201. .province-data {
  1202. display: flex;
  1203. .province {
  1204. width: 132px;
  1205. padding: 0 14px;
  1206. height: 25px;
  1207. line-height: 25px;
  1208. background: rgba(0, 70, 199, 0.2);
  1209. border-radius: 16px;
  1210. text-align: center;
  1211. margin-right: 15px;
  1212. cursor: pointer;
  1213. span {
  1214. width: 29px;
  1215. height: 12px;
  1216. font-size: 14px;
  1217. font-family: Microsoft YaHei;
  1218. font-weight: 400;
  1219. color: #fff;
  1220. }
  1221. i {
  1222. font-size: 16px;
  1223. color: #1b99ff;
  1224. position: relative;
  1225. margin-right: 9px;
  1226. vertical-align: -9%;
  1227. }
  1228. }
  1229. .form-box {
  1230. display: flex;
  1231. align-items: center;
  1232. }
  1233. }
  1234. .photovoltaic-chart3 {
  1235. margin-top: 20px;
  1236. display: flex;
  1237. .chart-card {
  1238. height: 284px;
  1239. flex: 1;
  1240. margin-right: 25px;
  1241. background: rgba(11, 11, 11, 0.45);
  1242. border-radius: 8px;
  1243. padding: 25px 15px;
  1244. .chart-card-title-wrapper {
  1245. display: flex;
  1246. justify-content: space-between;
  1247. }
  1248. .chart-card-title {
  1249. position: relative;
  1250. top: -8px;
  1251. left: 7px;
  1252. font-size: 16px;
  1253. color: #fff;
  1254. }
  1255. .right-bar {
  1256. display: flex;
  1257. flex-direction: row;
  1258. align-items: center;
  1259. margin-top: -8px;
  1260. }
  1261. .day-button {
  1262. display: flex;
  1263. flex-direction: row;
  1264. align-items: center;
  1265. justify-content: center;
  1266. border: 1px solid #5e6778;
  1267. border-radius: 16px;
  1268. text-align: center;
  1269. margin-right: 20px;
  1270. cursor: pointer;
  1271. color: #b3b3b3;
  1272. font-size: 16px;
  1273. height: 32px;
  1274. min-width: 54px;
  1275. .type-name {
  1276. font-size: 14px;
  1277. font-family: Microsoft YaHei;
  1278. font-weight: 400;
  1279. line-height: 32px;
  1280. }
  1281. }
  1282. .type-button {
  1283. display: flex;
  1284. flex-direction: row;
  1285. align-items: center;
  1286. justify-content: center;
  1287. padding: 0 14px;
  1288. background: rgba(0, 70, 199, 0.2);
  1289. border-radius: 16px;
  1290. text-align: center;
  1291. margin-right: 20px;
  1292. cursor: pointer;
  1293. color: #b3b3b3;
  1294. font-size: 16px;
  1295. height: 32px;
  1296. min-width: 54px;
  1297. .type-name {
  1298. margin-left: 9px;
  1299. font-size: 14px;
  1300. font-family: Microsoft YaHei;
  1301. font-weight: 400;
  1302. line-height: 32px;
  1303. }
  1304. }
  1305. .type-button-on {
  1306. display: flex;
  1307. flex-direction: row;
  1308. align-items: center;
  1309. justify-content: center;
  1310. padding: 0 14px;
  1311. background: rgba(0, 70, 199, 0.5);
  1312. border-radius: 16px;
  1313. text-align: center;
  1314. margin-right: 20px;
  1315. cursor: pointer;
  1316. color: #1c99ff;
  1317. font-size: 16px;
  1318. height: 32px;
  1319. min-width: 54px;
  1320. .type-name {
  1321. margin-left: 9px;
  1322. color: #ffffff;
  1323. font-size: 14px;
  1324. font-family: Microsoft YaHei;
  1325. font-weight: 400;
  1326. line-height: 32px;
  1327. }
  1328. .day-name {
  1329. color: #ffffff;
  1330. font-size: 14px;
  1331. font-family: Microsoft YaHei;
  1332. font-weight: 400;
  1333. line-height: 32px;
  1334. }
  1335. }
  1336. .chart-content {
  1337. display: flex;
  1338. align-items: center;
  1339. // justify-content: space-around;
  1340. height: 200px;
  1341. .chart-pie {
  1342. position: relative;
  1343. // flex: 1;
  1344. width: 52%;
  1345. height: 100%;
  1346. .chart-total {
  1347. position: absolute;
  1348. text-align: center;
  1349. z-index: 0;
  1350. background: url("../../../../assets/img/images/piaBack.png")
  1351. no-repeat;
  1352. width: 80px;
  1353. height: 80px;
  1354. background-size: cover;
  1355. left: 50%;
  1356. margin-left: -40px;
  1357. top: 50%;
  1358. margin-top: -40px;
  1359. .chart-num {
  1360. font-family: Bicubik;
  1361. font-size: 22px;
  1362. color: #fff;
  1363. margin-top: 16px;
  1364. }
  1365. .chart-name {
  1366. color: #b3b3b3;
  1367. font-size: 14px;
  1368. }
  1369. }
  1370. }
  1371. .chart-img {
  1372. position: relative;
  1373. width: 173px;
  1374. height: 156px;
  1375. background: url("../../../../assets/img/images/equipment-dashboard.png")
  1376. no-repeat;
  1377. background-size: cover;
  1378. // .img {
  1379. // height: 100%;
  1380. // }
  1381. .img-unit {
  1382. font-family: Bicubik;
  1383. display: flex;
  1384. position: absolute;
  1385. top: 44%;
  1386. left: 19%;
  1387. color: #fff;
  1388. align-items: baseline;
  1389. width: 110px;
  1390. justify-content: center;
  1391. .information {
  1392. font-size: 20px;
  1393. }
  1394. }
  1395. img {
  1396. position: absolute;
  1397. top: 53%;
  1398. left: 9%;
  1399. transform: rotateZ(360deg);
  1400. transform-origin: right top;
  1401. }
  1402. p {
  1403. position: absolute;
  1404. bottom: 0;
  1405. width: 100%;
  1406. text-align: center;
  1407. color: #fff;
  1408. font-size: 12px;
  1409. }
  1410. }
  1411. .chart-online {
  1412. position: relative;
  1413. width: 52%;
  1414. height: 100%;
  1415. .chart-total {
  1416. position: absolute;
  1417. text-align: center;
  1418. z-index: 0;
  1419. background: url("../../../../assets/img/images/piaBack.png")
  1420. no-repeat;
  1421. width: 80px;
  1422. height: 80px;
  1423. background-size: cover;
  1424. left: 50%;
  1425. margin-left: -40px;
  1426. top: 50%;
  1427. margin-top: -40px;
  1428. .chart-num {
  1429. font-family: Bicubik;
  1430. font-size: 22px;
  1431. color: #fff;
  1432. margin-top: 16px;
  1433. }
  1434. .chart-name {
  1435. color: #b3b3b3;
  1436. font-size: 14px;
  1437. }
  1438. }
  1439. }
  1440. .chart-list {
  1441. width: 45%;
  1442. display: flex;
  1443. flex-direction: column;
  1444. // align-items: center;
  1445. text-align: center;
  1446. color: #b3b3b3;
  1447. span {
  1448. display: inline-block;
  1449. }
  1450. .statistics-li {
  1451. display: flex;
  1452. align-items: center;
  1453. margin-bottom: 25px;
  1454. font-size: 14px;
  1455. .statistics-name {
  1456. width: 80px;
  1457. text-align: left;
  1458. }
  1459. .statistics-data {
  1460. font-family: Bicubik;
  1461. color: #fff;
  1462. margin: 0 10px 0 20px;
  1463. width: 90px;
  1464. text-align: right;
  1465. font-size: 16px;
  1466. }
  1467. .statistics-unit {
  1468. color: #fff;
  1469. white-space: nowrap;
  1470. font-size: 12px;
  1471. }
  1472. }
  1473. .state-li {
  1474. display: flex;
  1475. align-items: center;
  1476. justify-content: space-between;
  1477. padding-bottom: 5px;
  1478. border-bottom: 1px solid #4c545a;
  1479. margin-bottom: 10px;
  1480. .station-state {
  1481. display: flex;
  1482. align-items: center;
  1483. font-size: 16px;
  1484. }
  1485. .station-state:before {
  1486. content: "";
  1487. width: 10px;
  1488. height: 10px;
  1489. display: inline-block;
  1490. background: #1c99ff;
  1491. margin-right: 10px;
  1492. border: 2px solid rgba(20, 24, 27, 0.25);
  1493. }
  1494. .station-data {
  1495. font-family: Bicubik;
  1496. color: #1c99ff;
  1497. font-size: 16px;
  1498. .unit {
  1499. color: #b3b3b3;
  1500. font-size: 12px;
  1501. font-family: PingFangSC-Regular, PingFang SC;
  1502. }
  1503. }
  1504. }
  1505. .state-xn {
  1506. .station-state:before {
  1507. background: #1986e0;
  1508. }
  1509. .station-data {
  1510. color: #1986e0;
  1511. }
  1512. }
  1513. .state-gz {
  1514. .station-state:before {
  1515. background: #ba3237;
  1516. }
  1517. .station-data {
  1518. color: #ba3237;
  1519. }
  1520. }
  1521. .state-wh {
  1522. .station-state:before {
  1523. background: #e17d24;
  1524. }
  1525. .station-data {
  1526. color: #e17d24;
  1527. }
  1528. }
  1529. .state-xd {
  1530. .station-state:before {
  1531. background: #c531cb;
  1532. }
  1533. .station-data {
  1534. color: #c531cb;
  1535. }
  1536. }
  1537. .state-sl {
  1538. .station-state:before {
  1539. background: #a7a7a7;
  1540. }
  1541. .station-data {
  1542. color: #a7a7a7;
  1543. }
  1544. }
  1545. .online-li {
  1546. display: flex;
  1547. font-size: 15px;
  1548. margin-bottom: 15px;
  1549. align-items: center;
  1550. justify-content: space-between;
  1551. .online-name:before {
  1552. content: "";
  1553. display: inline-block;
  1554. width: 5px;
  1555. height: 5px;
  1556. background: #a7a7a7;
  1557. margin-right: 5px;
  1558. }
  1559. .online-name {
  1560. display: flex;
  1561. align-items: center;
  1562. font-size: 17px;
  1563. }
  1564. .online-data {
  1565. font-family: "AgencyFB-Reg";
  1566. text-align: right;
  1567. margin-right: 10px;
  1568. color: #a7a7a7;
  1569. font-size: 19px;
  1570. }
  1571. .online-percent {
  1572. font-size: 14px;
  1573. color: #fff;
  1574. text-align: left;
  1575. font-family: PingFangSC-Regular, PingFang SC;
  1576. }
  1577. &.online0 {
  1578. .online-name:before {
  1579. background: #1986e0;
  1580. }
  1581. .online-data {
  1582. color: #1986e0;
  1583. }
  1584. }
  1585. &.online1 {
  1586. .online-name:before {
  1587. background: #ba3237;
  1588. }
  1589. .online-data {
  1590. color: #ba3237;
  1591. }
  1592. }
  1593. &.online2 {
  1594. .online-name:before {
  1595. background: #e17d24;
  1596. }
  1597. .online-data {
  1598. color: #e17d24;
  1599. }
  1600. }
  1601. &.online3 {
  1602. .online-name:before {
  1603. background: #c531cb;
  1604. }
  1605. .online-data {
  1606. color: #c531cb;
  1607. }
  1608. }
  1609. &.online4 {
  1610. .online-name:before {
  1611. background: #a7a7a7;
  1612. }
  1613. .online-data {
  1614. color: #a7a7a7;
  1615. }
  1616. }
  1617. }
  1618. .online-li:last-child {
  1619. margin-bottom: 0;
  1620. }
  1621. }
  1622. }
  1623. }
  1624. .chart-card:last-child {
  1625. margin-right: 0;
  1626. }
  1627. .power-statistics {
  1628. .chart-content {
  1629. margin-left: 66px;
  1630. .chart-img {
  1631. margin-right: 52px;
  1632. position: relative;
  1633. top: -13px;
  1634. }
  1635. .chart-list {
  1636. width: auto;
  1637. }
  1638. }
  1639. }
  1640. }
  1641. .photovoltaic-filter {
  1642. display: flex;
  1643. justify-content: space-between;
  1644. align-items: center;
  1645. .photovoltaic-left {
  1646. display: flex;
  1647. height: 50px;
  1648. align-items: center;
  1649. color: #b3b3b3;
  1650. .photovoltaic-sort {
  1651. //display: flex;
  1652. //margin-right: 10px;
  1653. padding: 0 4px;
  1654. color: #1b99ff;
  1655. cursor: pointer;
  1656. }
  1657. .search-form {
  1658. display: flex;
  1659. align-items: center;
  1660. margin-left: 10px;
  1661. position: relative;
  1662. .form-box {
  1663. display: flex;
  1664. height: 50px;
  1665. align-items: center;
  1666. margin-right: 10px;
  1667. .theme-change {
  1668. display: flex;
  1669. align-items: center;
  1670. cursor: pointer;
  1671. margin-right: 10px;
  1672. i {
  1673. margin-right: 5px;
  1674. font-size: 16px;
  1675. }
  1676. span {
  1677. font-size: 14px;
  1678. }
  1679. }
  1680. .active-theme {
  1681. color: #1b99ff;
  1682. }
  1683. :deep(.el-input__inner) {
  1684. color: #b3b3b3;
  1685. }
  1686. .label {
  1687. white-space: nowrap;
  1688. margin-right: 5px;
  1689. }
  1690. }
  1691. .search-btn {
  1692. background: rgba(0, 69, 199, 0.45);
  1693. width: 100px;
  1694. height: 25px;
  1695. line-height: 25px;
  1696. text-align: center;
  1697. border-radius: 10px;
  1698. }
  1699. }
  1700. }
  1701. .photovoltaic-toggle {
  1702. display: flex;
  1703. align-items: center;
  1704. border: 1px solid #455066;
  1705. border-radius: 13px;
  1706. height: 25px;
  1707. box-sizing: border-box;
  1708. div:first-child {
  1709. // border-right: 1px solid #455066;
  1710. }
  1711. div {
  1712. width: 50px;
  1713. height: 100%;
  1714. background: #242b37;
  1715. cursor: pointer;
  1716. display: flex;
  1717. align-items: center;
  1718. justify-content: center;
  1719. i {
  1720. font-size: 16px;
  1721. }
  1722. }
  1723. .type-card {
  1724. border-top-left-radius: 12px;
  1725. border-bottom-left-radius: 12px;
  1726. }
  1727. .type-list {
  1728. border-top-right-radius: 12px;
  1729. border-bottom-right-radius: 12px;
  1730. }
  1731. .actived-toggle {
  1732. background: #1c3c77;
  1733. i {
  1734. color: #fff;
  1735. }
  1736. }
  1737. }
  1738. }
  1739. .photovoltaic-data {
  1740. flex: 1;
  1741. }
  1742. }
  1743. </style>