Home.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. <template>
  2. <div class="wind-site-home">
  3. <div class="mg-b-8">
  4. <btn-group-double :btnGroups="btnGroups" :rowIndex="0" :index="1" @select="select" />
  5. </div>
  6. <row>
  7. <wind-site-weather />
  8. <panel-3 class="wind-site-info">
  9. <row align="middle">
  10. <div class="info-item">
  11. <div class="value">{{ jczbmap.zjrl }}</div>
  12. <div class="text">装机容量</div>
  13. </div>
  14. <div class="info-item">
  15. <div class="value">{{ jczbmap.rfdl }}</div>
  16. <div class="text">日发电量</div>
  17. </div>
  18. <div class="info-item">
  19. <div class="value">{{ jczbmap.yfdl }}</div>
  20. <div class="text">月发电量</div>
  21. </div>
  22. <div class="info-item">
  23. <div class="value">{{ jczbmap.nfdl }}</div>
  24. <div class="text">年发电量</div>
  25. </div>
  26. <div class="info-item">
  27. <div class="value">{{ jczbmap.ylyxs }}</div>
  28. <div class="text">月利用小时</div>
  29. </div>
  30. <div class="info-item">
  31. <div class="value">{{ jczbmap.nlyxs }}</div>
  32. <div class="text">年利用小时</div>
  33. </div>
  34. <div class="info-item">
  35. <div class="value">{{ jczbmap.ssfs }}</div>
  36. <div class="text">实时风速</div>
  37. </div>
  38. <div class="info-item">
  39. <div class="value">{{ jczbmap.sjgl }}</div>
  40. <div class="text">实时功率</div>
  41. </div>
  42. </row>
  43. </panel-3>
  44. <panel-3 class="wind-running-info">
  45. <row align="middle">
  46. <div class="fengji">
  47. <div class="fengji-icon svg-icon svg-icon-white">
  48. <svg-icon class="" svgid="svg-风机" />
  49. </div>
  50. <div class="info">
  51. <div class="text green">接入风机</div>
  52. <div class="value">{{ jczbmap.jrts }}</div>
  53. </div>
  54. </div>
  55. <div class="situation">
  56. <row class="icon-status">
  57. <div class="status ">
  58. <span class="svg-icon svg-icon-purple">
  59. <svg-icon svgid="svg-standby" />
  60. </span>
  61. <span class="text purple">
  62. 待机
  63. </span>
  64. </div>
  65. <div class="status ">
  66. <span class="svg-icon svg-icon-green">
  67. <svg-icon svgid="svg-normal-power" />
  68. </span>
  69. <span class="text green">
  70. 运行
  71. </span>
  72. </div>
  73. <div class="status ">
  74. <span class="svg-icon svg-icon-yellow">
  75. <svg-icon svgid="svg-limit-power" />
  76. </span>
  77. <span class="text yellow">
  78. 限电
  79. </span>
  80. </div>
  81. <div class="status ">
  82. <span class="svg-icon svg-icon-red">
  83. <svg-icon svgid="svg-gz-downtime" />
  84. </span>
  85. <span class="text red">
  86. 故障
  87. </span>
  88. </div>
  89. <div class="status ">
  90. <span class="svg-icon svg-icon-orange">
  91. <svg-icon svgid="svg-jx-downtime" />
  92. </span>
  93. <span class="text orange">
  94. 检修
  95. </span>
  96. </div>
  97. <div class="status ">
  98. <span class="svg-icon svg-icon-gray">
  99. <svg-icon svgid="svg-offline" />
  100. </span>
  101. <span class="text gray">
  102. 离线
  103. </span>
  104. </div>
  105. <div class="status ">
  106. <span class="svg-icon svg-icon-darkblue">
  107. <svg-icon svgid="svg-intranet-involvement" />
  108. </span>
  109. <span class="text darkblue">
  110. 受限
  111. </span>
  112. </div>
  113. </row>
  114. <row>
  115. <div class="status">
  116. <span class="text gray">
  117. 待风
  118. </span>
  119. <span class="value">
  120. {{ jczbmap.djnum }}
  121. </span>
  122. </div>
  123. <div class="status">
  124. <span class="text gray">
  125. 正常出力
  126. </span>
  127. <span class="value">
  128. {{ jczbmap.zcfdnum }}
  129. </span>
  130. </div>
  131. <div class="status">
  132. <span class="text gray">
  133. 降出力
  134. </span>
  135. <span class="value">
  136. {{ jczbmap.xdjclnum }}
  137. </span>
  138. </div>
  139. <div class="status">
  140. <span class="text gray">
  141. 故障停机
  142. </span>
  143. <span class="value">
  144. {{ jczbmap.gztjnum }}
  145. </span>
  146. </div>
  147. <div class="status">
  148. <span class="text gray">
  149. 检修停机
  150. </span>
  151. <span class="value">
  152. {{ jczbmap.jxtjnum }}
  153. </span>
  154. </div>
  155. <div class="status">
  156. <span class="text gray">
  157. 电网
  158. </span>
  159. <span class="value">
  160. {{ jczbmap.dwslnum }}
  161. </span>
  162. </div>
  163. <div class="status">
  164. <span class="text gray">
  165. 离线
  166. </span>
  167. <span class="value">
  168. {{ jczbmap.lxnum }}
  169. </span>
  170. </div>
  171. </row>
  172. </div>
  173. </row>
  174. </panel-3>
  175. </row>
  176. <div class="first-info mg-t-16 mg-b-16" style="height:215px;">
  177. <div style="flex:0 1 450px;">
  178. <panel title="日度损失电量分析"></panel>
  179. </div>
  180. <div class="mg-l-16" style="flex:1 1 auto;" ref="lineChart">
  181. <panel title="4小时功率曲线图">
  182. <multiple-line-chart height="18.519vh" v-if="Powertrend" :list="Powertrend.value" :units="Powertrend.units" :showLegend="true" />
  183. </panel>
  184. </div>
  185. <div class="mg-l-16" style="flex:0 0 400px;">
  186. <panel class="light-matrix-panel">
  187. <light-matrix :list="fjmap" />
  188. </panel>
  189. </div>
  190. </div>
  191. <row>
  192. <Col :span="8">
  193. <panel title="日度损失电量分析">
  194. <dual-pie-chart :innerData="pieChartData.dayData" :outerData="pieChartData.dayData" height="21.296vh" />
  195. </panel>
  196. </Col>
  197. <Col :span="8">
  198. <panel title="月度损失电量分析">
  199. <dual-pie-chart :innerData="pieChartData.monthData" :outerData="pieChartData.monthData" height="21.296vh" />
  200. </panel>
  201. </Col>
  202. <Col :span="8">
  203. <panel title="年度损失电量分析">
  204. <dual-pie-chart :innerData="pieChartData.yearData" :outerData="pieChartData.yearData" height="21.296vh" />
  205. </panel>
  206. </Col>
  207. </row>
  208. <row>
  209. <Col :span="8">
  210. <panel title="日度损失电量分析">
  211. <hover-bar-chart :list="dayLost" height="21.296vh" />
  212. </panel>
  213. </Col>
  214. <Col :span="8">
  215. <panel title="完成电量">
  216. <multiple-bar-chart height="21.296vh" :list="CompleteElectricity.data" :units="CompleteElectricity.units" />
  217. </panel>
  218. </Col>
  219. <Col :span="8">
  220. <panel title="月发电量对比">
  221. <normal-line-chart height="21.296vh" :list="MonthCompare.value" :units="MonthCompare.units" />
  222. </panel>
  223. </Col>
  224. </row>
  225. </div>
  226. </template>
  227. <script>
  228. import HoverBarChart from "../../../../components/chart/bar/hover-bar-chart.vue";
  229. import MultipleBarChart from "../../../../components/chart/bar/multiple-bar-chart.vue";
  230. import MultipleLineChart from "../../../../components/chart/line/multiple-line-chart.vue";
  231. import NormalLineChart from "../../../../components/chart/line/normal-line-chart.vue";
  232. import DualPieChart from "../../../../components/chart/pie/dual-pie-chart.vue";
  233. import BtnGroupDouble from "../../../../components/coms/btn/btn-group-double.vue";
  234. import Col from "../../../../components/coms/grid/col.vue";
  235. import Row from "../../../../components/coms/grid/row.vue";
  236. import SvgIcon from "../../../../components/coms/icon/svg-icon.vue";
  237. import Panel from "../../../../components/coms/panel/panel.vue";
  238. import Panel3 from "../../../../components/coms/panel/panel3.vue";
  239. import LightMatrix from "./light-matrix.vue";
  240. import WindSiteWeather from "./wind-site-weather.vue";
  241. export default {
  242. // 名称
  243. name: "WindSiteHome",
  244. // 使用组件
  245. components: { WindSiteWeather, Row, Col, Panel, DualPieChart, MultipleLineChart, Panel3, SvgIcon, HoverBarChart, MultipleBarChart, NormalLineChart, LightMatrix, BtnGroupDouble },
  246. // 数据
  247. data() {
  248. return {
  249. timmer: null, // 计时器
  250. fjmap: [], // 分机矩阵
  251. glvos: {}, // 72小时功率曲线图
  252. wxssmap: {}, // 五项损失饼图数据
  253. jczbmap: {}, // 顶部基础数据
  254. dayLost: [], // 日度损失电量分析柱状图
  255. donePower: [], // 完成电量柱状图
  256. // 饼图数据
  257. pieChartData: {
  258. // 日度
  259. dayData: [
  260. {
  261. title: "",
  262. value: [],
  263. },
  264. ],
  265. // 月度
  266. monthData: [
  267. {
  268. title: "",
  269. value: [],
  270. },
  271. ],
  272. // 年度
  273. yearData: [
  274. {
  275. title: "",
  276. value: [],
  277. },
  278. ],
  279. },
  280. // 完成电量
  281. CompleteElectricity: {
  282. data: [
  283. {
  284. title: "发电量",
  285. yAxisIndex: 0,
  286. value: [],
  287. },
  288. {
  289. title: "预测电量",
  290. yAxisIndex: 0,
  291. value: [],
  292. },
  293. ],
  294. units: ["", ""],
  295. },
  296. // 4小时功率曲线图
  297. Powertrend: {
  298. value: [
  299. {
  300. title: "",
  301. value: [],
  302. },
  303. ],
  304. },
  305. // 月发电量对比
  306. MonthCompare: {
  307. units: ["(MK)"],
  308. value: [
  309. {
  310. title: "月发电量",
  311. yAxisIndex: 0,
  312. value: [],
  313. },
  314. {
  315. title: "月预测电量",
  316. yAxisIndex: 0,
  317. value: [],
  318. },
  319. ],
  320. },
  321. };
  322. },
  323. // 函数
  324. methods: {
  325. // 根据风机状态码返回对应 class
  326. getColor(fjzt) {
  327. switch (fjzt) {
  328. case 0:
  329. return "green";
  330. break;
  331. case 1:
  332. return "blue";
  333. break;
  334. case 2:
  335. return "red";
  336. break;
  337. case 3:
  338. return "gray";
  339. break;
  340. case 4:
  341. return "orange";
  342. break;
  343. case 5:
  344. return "purple";
  345. break;
  346. case 6:
  347. return "write";
  348. break;
  349. }
  350. },
  351. // 请求服务
  352. requestData(showLoading) {
  353. this.requestWpInfo(showLoading);
  354. this.requestLoss(showLoading);
  355. this.requestPower(showLoading);
  356. this.requestMonthPower(showLoading);
  357. },
  358. // 获取场站监视数据
  359. requestWpInfo(showLoading) {
  360. let that = this;
  361. that.API.requestData({
  362. showLoading,
  363. method: "POST",
  364. subUrl: "monitor/findWpInfoBywpId",
  365. data: {
  366. wpId: that.wpId,
  367. },
  368. success(res) {
  369. if (res.data) {
  370. let fjmap = [];
  371. let keys = ["value1", "value2", "value3", "value4", "value5", "value6", "value7", "value9"];
  372. let Powertrend = {
  373. // 图表所用单位
  374. units: ["(万KWh)", "(风速)"],
  375. value: [
  376. {
  377. title: "应发功率",
  378. yAxisIndex: 1, // 使用单位
  379. value: [],
  380. },
  381. {
  382. title: "实发功率",
  383. yAxisIndex: 1, // 使用单位
  384. value: [],
  385. },
  386. {
  387. title: "理论功率",
  388. yAxisIndex: 1, // 使用单位
  389. value: [],
  390. },
  391. {
  392. title: "预测功率",
  393. yAxisIndex: 1, // 使用单位
  394. value: [],
  395. },
  396. {
  397. title: "保证功率",
  398. yAxisIndex: 1, // 使用单位
  399. value: [],
  400. },
  401. {
  402. title: "平均风速",
  403. yAxisIndex: 1, // 使用单位
  404. value: [],
  405. },
  406. {
  407. title: "小时预测功率",
  408. yAxisIndex: 1, // 使用单位
  409. value: [],
  410. },
  411. {
  412. title: "最有功率律",
  413. yAxisIndex: 1, // 使用单位
  414. value: [],
  415. },
  416. ],
  417. };
  418. let dayPieChartKey = [
  419. {
  420. key: "gzssdl",
  421. name: "故障损失电量",
  422. },
  423. {
  424. key: "jxssdl",
  425. name: "检修损失电量",
  426. },
  427. {
  428. key: "qfssdl",
  429. name: "性能损失电量",
  430. },
  431. {
  432. key: "slssdl",
  433. name: "受累损失电量",
  434. },
  435. {
  436. key: "xdssdl",
  437. name: "限电损失电量",
  438. },
  439. ];
  440. // 饼图 1 数据
  441. let dayData = [];
  442. // 饼图 2 数据
  443. let monthData = [];
  444. // 饼图 2 数据
  445. let yearData = [];
  446. res.data.fjjzmap.fjmap[0].forEach((ele) => {
  447. fjmap.push({
  448. tag: ele.wtnum,
  449. color: that.getColor(ele.fjzt),
  450. });
  451. });
  452. keys.forEach((key, keyIndex) => {
  453. res.data.glvos.forEach((ele) => {
  454. Powertrend.value[keyIndex].value.push({
  455. text: "",
  456. value: ele[key],
  457. });
  458. });
  459. });
  460. dayPieChartKey.forEach((ele) => {
  461. dayData.push({
  462. value: res.data.wxssmap["r" + ele.key],
  463. unit: "万kwh",
  464. name: ele.name,
  465. });
  466. monthData.push({
  467. value: res.data.wxssmap["y" + ele.key] || 0,
  468. unit: "万kwh",
  469. name: ele.name,
  470. });
  471. yearData.push({
  472. value: res.data.wxssmap["n" + ele.key] || 0,
  473. unit: "万kwh",
  474. name: ele.name,
  475. });
  476. });
  477. that.fjmap = fjmap;
  478. that.Powertrend = Powertrend;
  479. that.jczbmap = res.data.jczbmap;
  480. that.pieChartData = {
  481. dayData,
  482. monthData,
  483. yearData,
  484. };
  485. } else {
  486. that.fjmap = [];
  487. that.Powertrend = {};
  488. that.jczbmap = {};
  489. that.pieChartData = {
  490. dayData: [],
  491. monthData: [],
  492. yearData: [],
  493. };
  494. }
  495. },
  496. });
  497. },
  498. // 获取日度损失电量分析
  499. requestLoss(showLoading) {
  500. let that = this;
  501. that.API.requestData({
  502. showLoading,
  503. method: "POST",
  504. subUrl: "monitor/findLossWpBar",
  505. data: {
  506. wpId: that.wpId,
  507. },
  508. success(res) {
  509. let dayLost = [];
  510. res.data.forEach((ele) => {
  511. dayLost.push({
  512. text: ele.timestr,
  513. value: ele.value1,
  514. });
  515. });
  516. that.dayLost = dayLost;
  517. },
  518. });
  519. },
  520. // 获取完成电量
  521. requestPower(showLoading) {
  522. let that = this;
  523. that.API.requestData({
  524. showLoading,
  525. method: "POST",
  526. subUrl: "monitor/findPowerWpBar",
  527. data: {
  528. wpId: that.wpId,
  529. },
  530. success(res) {
  531. let data = [
  532. {
  533. title: "发电量",
  534. yAxisIndex: 0,
  535. value: [],
  536. },
  537. {
  538. title: "预测电量",
  539. yAxisIndex: 0,
  540. value: [],
  541. },
  542. ];
  543. res.data.forEach((ele) => {
  544. data[0].value.push({
  545. text: ele.timestr,
  546. value: ele.value1 || 0,
  547. });
  548. data[1].value.push({
  549. text: ele.timestr,
  550. value: ele.value2 || 0,
  551. });
  552. });
  553. that.CompleteElectricity.data = data;
  554. },
  555. });
  556. },
  557. // 获取月发电量对比
  558. requestMonthPower(showLoading) {
  559. let that = this;
  560. that.API.requestData({
  561. showLoading,
  562. method: "POST",
  563. subUrl: "monitor/findMonthPowerWpBar",
  564. data: {
  565. wpId: that.wpId,
  566. },
  567. success(res) {
  568. let data = [
  569. {
  570. title: "月发电量",
  571. yAxisIndex: 0,
  572. value: [],
  573. },
  574. {
  575. title: "月预测电量",
  576. yAxisIndex: 0,
  577. value: [],
  578. },
  579. ];
  580. res.data.forEach((ele) => {
  581. data[0].value.push({
  582. text: ele.timestr,
  583. value: ele.value1,
  584. });
  585. data[1].value.push({
  586. text: ele.timestr,
  587. value: ele.value2,
  588. });
  589. });
  590. that.MonthCompare.value = data;
  591. },
  592. });
  593. },
  594. },
  595. created() {
  596. let that = this;
  597. that.wpId = that.$route.params.wpId;
  598. that.$nextTick(() => {
  599. that.requestData(false);
  600. that.timmer = setInterval(() => {
  601. that.requestData(false);
  602. }, that.$store.state.websocketTimeSec);
  603. });
  604. },
  605. mounted() {},
  606. unmounted() {
  607. clearInterval(this.timmer);
  608. this.timmer = null;
  609. },
  610. };
  611. </script>
  612. <style lang="less">
  613. .wind-site-home {
  614. .first-info {
  615. display: flex;
  616. }
  617. .wind-site-info {
  618. margin-left: 0.7407vh;
  619. flex: 1 0 auto;
  620. & > .row {
  621. height: 100%;
  622. }
  623. .info-item {
  624. text-align: center;
  625. padding: 0 0.37vh;
  626. flex: 1;
  627. .value {
  628. font-size: @fontsize-s;
  629. margin-bottom: 1.111vh;
  630. }
  631. .text {
  632. font-size: 12px;
  633. color: @gray;
  634. }
  635. }
  636. }
  637. .wind-running-info {
  638. margin-left: 0.7407vh;
  639. padding: 0.741vh;
  640. flex: 1 1 auto;
  641. & > .row {
  642. height: 100%;
  643. }
  644. .fengji {
  645. display: flex;
  646. align-content: center;
  647. flex: 0 0 auto;
  648. .fengji-icon {
  649. padding: 1.111vh;
  650. border-radius: 50%;
  651. box-shadow: inset 1.5px -1px 1px 0px @green;
  652. svg {
  653. width: 3.333vh;
  654. height: 3.333vh;
  655. }
  656. }
  657. .info {
  658. display: flex;
  659. flex-direction: column;
  660. justify-content: center;
  661. .text {
  662. font-size: @fontsize-s;
  663. margin-bottom: 1.111vh;
  664. }
  665. .value {
  666. text-align: right;
  667. font-size: 1.852vh;
  668. }
  669. }
  670. }
  671. .situation {
  672. flex: 1 1 auto;
  673. margin-left: 1.481vh;
  674. .row + .row {
  675. margin: 0;
  676. }
  677. .status {
  678. flex: 1;
  679. width: 7.963vh;
  680. display: flex;
  681. align-items: center;
  682. padding: 0.37vh 0;
  683. svg {
  684. width: 1.8519vh;
  685. height: 1.8519vh;
  686. margin-right: 0.37vh;
  687. }
  688. .text {
  689. font-size: 12px;
  690. flex: auto;
  691. }
  692. .value {
  693. font-size: 12px;
  694. padding-right: 0.741vh;
  695. }
  696. }
  697. .icon-status {
  698. .text {
  699. font-size: @fontsize;
  700. font-weight: 600;
  701. }
  702. }
  703. }
  704. }
  705. .light-matrix-panel {
  706. height: 100%;
  707. .panel-body {
  708. height: 100%;
  709. }
  710. }
  711. }
  712. </style>