Decision1Mx.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. <template>
  2. <div class="decision-page-1">
  3. <div class="query mg-b-8">
  4. <div class="query-items">
  5. <div class="query-item">
  6. <div class="lable">场站:</div>
  7. <div class="search-input">
  8. <el-select v-model="value1" @change="ChangZhanChange(value1)" clearable placeholder="请选择"
  9. popper-class="select">
  10. <el-option v-for="item in ChangZhan" :key="item.id" :value="item.id" :label="item.name">
  11. </el-option>
  12. </el-select>
  13. </div>
  14. </div>
  15. <div class="query-item">
  16. <div class="lable">项目:</div>
  17. <div class="search-input">
  18. <el-select v-model="value2" @change="XiangMuChange(value2)" multiple placeholder="请选择"
  19. popper-class="select">
  20. <el-option v-for="item in XiangMu" :key="item.id" :value="item.id" :label="item.name">
  21. </el-option>
  22. </el-select>
  23. </div>
  24. </div>
  25. <div class="query-item">
  26. <div class="lable">线路:</div>
  27. <div class="search-input">
  28. <el-select v-model="value3" @change="XianLuChange(value3)" multiple placeholder="请选择"
  29. popper-class="select">
  30. <el-option v-for="item in XianLu" :key="item.id" :label="item.name" :value="item.id">
  31. </el-option>
  32. </el-select>
  33. </div>
  34. </div>
  35. <div class="query-item">
  36. <div class="lable">开始日期:</div>
  37. <div class="search-input">
  38. <el-date-picker v-model="value4" @change="BeginChange(value4)" type="date"
  39. value-format="YYYY-MM-DD" placeholder="选择日期" popper-class="date-select">
  40. </el-date-picker>
  41. </div>
  42. </div>
  43. <div class="query-item">
  44. <div class="lable">结束日期:</div>
  45. <div class="search-input">
  46. <el-date-picker v-model="value5" @change="EndChange(value5)" type="date"
  47. value-format="YYYY-MM-DD" placeholder="选择日期" popper-class="date-select">
  48. </el-date-picker>
  49. <div class="unit svg-icon svg-icon-gray">
  50. <svg-icon :svgid="''" />
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. <div class="query-actions">
  56. <button class="btn" @click="mxClick()">搜索</button>
  57. <button class="btn green" >明细信息</button>
  58. <button class="btn" @click="exportExcel()">导出</button>
  59. </div>
  60. </div>
  61. <div class="actions mg-b-8">
  62. <button class="btn" :class="TypeClass==1?'green':''" @click="TypeClick(1)">风场</button>
  63. <button class="btn" :class="TypeClass==2?'green':''" @click="TypeClick(2)">项目</button>
  64. <button class="btn" :class="TypeClass==3?'green':''" @click="TypeClick(3)">集电线路</button>
  65. </div>
  66. <div class="contentMx">
  67. <div class="activeMx">
  68. <el-row :type="'flex'" class="content">
  69. <el-col :span="10" class="pd-r-8">
  70. <toolbar-panel title="风机绩效榜明细" :showLine="false">
  71. <bar-line-chart :height="'calc(100vh - 250px)'" :bardata="bardata" :lineData="lineData"
  72. :color="barColor" lineName="理论发电量" />
  73. </toolbar-panel>
  74. </el-col>
  75. <el-col :span="14" class="pd-l-8">
  76. <panel :title="'项目列表'" :showLine="false">
  77. <div class="project-table">
  78. <Table :data="tableData">
  79. <template v-slot:tr v-if="tableData.data.length > 0">
  80. <tr>
  81. <td>
  82. {{tableDataEnd.index}}
  83. </td>
  84. <td style="width:150px">
  85. {{tableDataEnd.name}}
  86. </td>
  87. <td>
  88. {{tableDataEnd.llfdl}}
  89. </td>
  90. <td>
  91. {{tableDataEnd.sjfdl}}
  92. </td>
  93. <td>
  94. {{tableDataEnd.speed}}
  95. </td>
  96. <td>
  97. {{tableDataEnd.fjhjx1}}
  98. </td>
  99. <td>
  100. {{tableDataEnd.fjhjx2}}
  101. </td>
  102. <td>
  103. {{tableDataEnd.jhjx1}}
  104. </td>
  105. <td>
  106. {{tableDataEnd.jhjx2}}
  107. </td>
  108. <td>
  109. {{tableDataEnd.sl1}}
  110. </td>
  111. <td>
  112. {{tableDataEnd.sl2}}
  113. </td>
  114. <td>
  115. {{tableDataEnd.xd1}}
  116. </td>
  117. <td>
  118. {{tableDataEnd.xd2}}
  119. </td>
  120. <td>
  121. {{tableDataEnd.xn1}}
  122. </td>
  123. <td>
  124. {{tableDataEnd.xn2}}
  125. </td>
  126. <td>
  127. {{tableDataEnd.xn3}}
  128. </td>
  129. <td>
  130. {{tableDataEnd.xn4}}
  131. </td>
  132. <td>
  133. {{tableDataEnd.fnlly}}
  134. </td>
  135. </tr>
  136. </template>
  137. </Table>
  138. </div>
  139. </panel>
  140. </el-col>
  141. </el-row>
  142. </div>
  143. </div>
  144. </div>
  145. </template>
  146. <script>
  147. import BarLineChart from "../../components/chart/combination/bar-line-chart.vue";
  148. import SvgIcon from "../../components/coms/icon/svg-icon.vue";
  149. import Panel from "../../components/coms/panel/panel.vue";
  150. import ToolbarPanel from "../../components/coms/panel/toolbar-panel.vue";
  151. import Table from "./table.vue";
  152. import partten from "@/helper/partten.js";
  153. export default {
  154. components: {
  155. ToolbarPanel,
  156. BarLineChart,
  157. Panel,
  158. Table,
  159. partten,
  160. SvgIcon
  161. },
  162. data() {
  163. return {
  164. tableData: {
  165. column: [{
  166. name: "",
  167. field: "index",
  168. is_num: false,
  169. is_light: false,
  170. },
  171. {
  172. name: "名称",
  173. field: "name",
  174. width: '150px',
  175. is_num: false,
  176. is_light: false,
  177. },
  178. {
  179. name: "理论发电量",
  180. field: "llfdl",
  181. is_num: false,
  182. is_light: false,
  183. sortable: true
  184. },
  185. {
  186. name: "SCADA发电量",
  187. field: "sjfdl",
  188. is_num: false,
  189. is_light: false,
  190. sortable: true
  191. },
  192. {
  193. name: "风速",
  194. field: "speed",
  195. is_num: false,
  196. is_light: false,
  197. sortable: true
  198. },
  199. {
  200. name: "故障损失",
  201. field: "fjhjx1",
  202. is_num: false,
  203. is_light: false,
  204. sortable: true
  205. },
  206. {
  207. name: "故障受累",
  208. field: "fjhjx2",
  209. is_num: false,
  210. is_light: false,
  211. sortable: true
  212. },
  213. {
  214. name: "检修损失",
  215. field: "jhjx1",
  216. is_num: false,
  217. is_light: false,
  218. sortable: true
  219. },
  220. {
  221. name: "检修受累",
  222. field: "jhjx2",
  223. is_num: false,
  224. is_light: false,
  225. sortable: true
  226. },
  227. {
  228. name: "电网受累",
  229. field: "sl1",
  230. is_num: false,
  231. is_light: false,
  232. sortable: true
  233. },
  234. {
  235. name: "天气受累",
  236. field: "sl2",
  237. is_num: false,
  238. is_light: false,
  239. sortable: true
  240. },
  241. {
  242. name: "限电降出",
  243. field: "xd1",
  244. is_num: false,
  245. is_light: false,
  246. sortable: true
  247. },
  248. {
  249. name: "限电停机",
  250. field: "xd2",
  251. is_num: false,
  252. is_light: false,
  253. sortable: true
  254. },
  255. {
  256. name: "待风损失",
  257. field: "xn1",
  258. is_num: false,
  259. is_light: false,
  260. sortable: true
  261. },
  262. {
  263. name: "手动停机",
  264. field: "xn2",
  265. is_num: false,
  266. is_light: false,
  267. sortable: true
  268. },
  269. {
  270. name: "正常发电",
  271. field: "xn3",
  272. is_num: false,
  273. is_light: false,
  274. sortable: true
  275. },
  276. {
  277. name: "缺陷降出",
  278. field: "xn4",
  279. is_num: false,
  280. is_light: false,
  281. sortable: true
  282. },
  283. {
  284. name: "风能利用率%",
  285. field: "fnlly",
  286. is_num: false,
  287. is_light: false,
  288. sortable: true
  289. }
  290. ],
  291. data: [],
  292. },
  293. tableDataEnd: [], //合计
  294. ChangZhan: [], //场站
  295. XiangMu: [], //项目
  296. XianLu: [], //线路
  297. value1: [],
  298. value2: [],
  299. value3: [],
  300. value4: "",
  301. value5: "",
  302. barColor: [partten.getColor("purple"), partten.getColor("green"), partten.getColor("pink"), partten
  303. .getColor("red"), partten.getColor("orange"), partten.getColor("grayl"), partten.getColor(
  304. "yellow"), partten.getColor("gray"), partten.getColor("blue"), partten.getColor("cyan"),
  305. partten
  306. .getColor("brown"), partten.getColor("mauve")
  307. ],
  308. TypeClass: 1, //风场,项目,集电线路 的按钮颜色,默认第一个
  309. bardata: [],
  310. lineData: [],
  311. };
  312. },
  313. created() {
  314. this.ChangZhanVal();
  315. this.value4 = this.getTime(1);
  316. this.value5 = this.getTime(2);
  317. this.AjaxCommon();
  318. },
  319. methods: {
  320. ChangZhanVal() {
  321. var that = this;
  322. that.API.requestData({
  323. method: "GET",
  324. baseURL: "http://10.155.32.4:9001/",
  325. subUrl: "benchmarking/wplist",
  326. success(res) {
  327. that.ChangZhan = res.data;
  328. }
  329. });
  330. },
  331. ChangZhanChange(val) {
  332. this.TypeClass = "";
  333. this.value1 = val;
  334. this.value2 = [];
  335. this.value3 = [];
  336. this.AjaxCommon();
  337. this.XiangMuVal(val);
  338. },
  339. XiangMuVal(val) {
  340. var that = this;
  341. that.API.requestData({
  342. method: "GET",
  343. baseURL: "http://10.155.32.4:9001/",
  344. subUrl: "benchmarking/projectList",
  345. data: {
  346. wpids: val
  347. },
  348. success(res) {
  349. that.XiangMu = res.data;
  350. }
  351. });
  352. },
  353. XiangMuChange(val) {
  354. this.TypeClass = "";
  355. this.value2 = val;
  356. this.value3 = [];
  357. this.AjaxCommon();
  358. this.XianLuVal(val);
  359. },
  360. XianLuVal(val) {
  361. var that = this;
  362. that.API.requestData({
  363. method: "GET",
  364. baseURL: "http://10.155.32.4:9001/",
  365. subUrl: "benchmarking/lineList",
  366. data: {
  367. projects: val
  368. },
  369. success(res) {
  370. that.XianLu = res.data;
  371. }
  372. });
  373. },
  374. XianLuChange(val) {
  375. this.TypeClass = "";
  376. this.value3 = val;
  377. this.AjaxCommon();
  378. },
  379. BeginChange(val) {
  380. this.value4 = val;
  381. this.AjaxCommon();
  382. },
  383. EndChange(val) {
  384. this.value5 = val;
  385. this.AjaxCommon();
  386. },
  387. TypeClick(val) {
  388. this.TypeClass = val;
  389. // 重置状态start
  390. this.value1 = [];
  391. this.value2 = [];
  392. this.value3 = [];
  393. this.value4 = this.getTime(1);
  394. this.value5 = this.getTime(2);
  395. this.AjaxCommon();
  396. // 重置状态end
  397. },
  398. getTime(val) { //时间戳处理,val=1是默认开始时间(当前月第一天),val=2是默认结束时间(今天)
  399. var date = new Date();
  400. var year = date.getFullYear(),
  401. month = date.getMonth() + 1,
  402. day = date.getDate();
  403. month >= 1 && month <= 9 ? (month = '0' + month) : '';
  404. day >= 0 && day <= 9 ? (day = '0' + day) : '';
  405. var begin = year + '-' + month + '-01';
  406. var end = year + '-' + month + '-' + day;
  407. if (val == 1) {
  408. return begin;
  409. } else if (val == 2) {
  410. return end;
  411. }
  412. },
  413. AjaxCommon() {
  414. var that = this;
  415. that.API.requestData({
  416. method: "GET",
  417. baseURL: "http://10.155.32.4:9001/",
  418. subUrl: "benchmarking/fjjxbmx",
  419. data: {
  420. wpids: that.value1,
  421. projectids: that.value2,
  422. lineids: that.value3,
  423. beginDate: that.value4,
  424. endDate: that.value5,
  425. type: that.TypeClass,
  426. target: '',
  427. sort: ''
  428. },
  429. success(res) {
  430. var name = [],
  431. data = [],
  432. llfdl = [],
  433. legend = ["实际电量", "故障损失", "故障受累", "检修受累", "电网受累", "天气受累", "限电降出", "限电停机", "待风损失",
  434. "手动停机", "正常发电", "缺陷降出"
  435. ],
  436. data2 = []; //项目列表
  437. if(that.value1.length){
  438. let arr = [];
  439. let hj = res.data.pop();
  440. res.data.forEach((ele,index)=>{
  441. arr[ele.id.split('_')[1] - 1] = ele
  442. })
  443. arr.push(hj);
  444. res.data = arr;
  445. }
  446. res.data.forEach((item, index) => {
  447. name.push(item.name);
  448. llfdl.push(item.llfdl);
  449. data.push([item.sjfdl, item.fjhjx1, item.fjhjx2, item.jhjx1, item.jhjx2, item
  450. .sl1, item.sl2, item.xd1, item.xd2, item.xn1, item.xn2, item.xn3,
  451. item.xn4
  452. ])
  453. data2.push({
  454. index: index + 1,
  455. name: item.name,
  456. llfdl: item.llfdl,
  457. sjfdl: item.sjfdl,
  458. speed: item.speed,
  459. fjhjx1: item.fjhjx1,
  460. fjhjx2: item.fjhjx2,
  461. jhjx1: item.jhjx1,
  462. jhjx2: item.jhjx2,
  463. sl1: item.sl1,
  464. sl2: item.sl2,
  465. xd1: item.xd1,
  466. xd2: item.xd2,
  467. xn1: item.xn1,
  468. xn2: item.xn2,
  469. xn3: item.xn3,
  470. xn4: item.xn4,
  471. fnlly: item.fnlly,
  472. is_light: false
  473. })
  474. })
  475. name.pop();
  476. data.pop();
  477. llfdl.pop();
  478. if (data.length > 0) {
  479. let arr1 = [];
  480. const length = data[0].length;
  481. for (var i = 0; i < length; i++) {
  482. let arr2 = [];
  483. data.forEach(ele => {
  484. arr2.push(ele[i])
  485. });
  486. arr1.push(arr2);
  487. }
  488. that.lineData = llfdl;
  489. that.bardata = {
  490. area: name,
  491. legend: legend,
  492. data: arr1
  493. };
  494. }
  495. that.tableDataEnd = data2[data2.length - 1];
  496. data2.pop();
  497. that.tableData.data = data2;
  498. }
  499. });
  500. },
  501. mxClick() {
  502. this.$router.push("/decision/decision1")
  503. },
  504. formatJson(filterVal, jsonData) {
  505. return jsonData.map(v => filterVal.map(j => v[j]));
  506. },
  507. exportExcel() {
  508. let that = this;
  509. const {
  510. export_json_to_excel
  511. } = require('@tools/excel/Export2Excel.js'); // 注意这个Export2Excel路径
  512. let tHeader = []; // 上面设置Excel的表格第一行的标题
  513. let filterVal = []; // 上面的index、nickName、name是tableData里对象的属性key值
  514. that.tableData.column.forEach(ele => {
  515. tHeader.push(ele.name);
  516. filterVal.push(ele.field);
  517. });
  518. var list = [];
  519. that.tableData.data.forEach((i, index) => {
  520. list.push(i);
  521. })
  522. list.push(that.tableDataEnd)
  523. const data = that.formatJson(filterVal, list);
  524. export_json_to_excel(tHeader, data, '导出的Excel'); // 最后一个是表名字
  525. },
  526. }
  527. };
  528. </script>
  529. <style lang="less">
  530. .contentMx::-webkit-scrollbar {
  531. width: 200px;
  532. height: 20px;
  533. }
  534. .contentMx::-webkit-scrollbar-track-piece {
  535. background-color: rgba(255, 255, 255, 0.05);
  536. -webkit-border-radius: 4px;
  537. }
  538. .contentMx::-webkit-scrollbar-thumb {
  539. background-color: fade(@gray, 75);
  540. -webkit-border-radius: 4px;
  541. outline: none;
  542. outline-offset: 0px;
  543. border: none;
  544. }
  545. .decision-page-1 {
  546. .com-panel .panel-title {
  547. line-height: 3.4259vh;
  548. }
  549. .tools {
  550. display: flex;
  551. line-height: 3.4259vh;
  552. .tool-block {
  553. display: flex;
  554. align-items: center;
  555. margin-left: 0.741vh;
  556. .legend {
  557. flex: auto;
  558. width: 0.741vh;
  559. height: 0.741vh;
  560. margin-right: 0.741vh;
  561. &.long {
  562. width: 2.963vh;
  563. height: 0.37vh;
  564. }
  565. }
  566. .legend-text {
  567. color: @gray-l;
  568. font-size: @fontsize-s;
  569. }
  570. }
  571. }
  572. .project-table {
  573. overflow: auto;
  574. tbody {
  575. height: calc(100vh - 31.5vh);
  576. }
  577. td {
  578. color: #b2bdc0;
  579. }
  580. }
  581. .contentMx {
  582. width: 100%;
  583. overflow-x: auto;
  584. }
  585. .activeMx {
  586. width: 130%;
  587. }
  588. }
  589. .main {
  590. overflow: auto;
  591. }
  592. // .main .main-body{height: calc(100vh - 6.63vh);}
  593. .bg-olive {
  594. background-color: #8dc63f;
  595. color: #ffffff;
  596. }
  597. .bg-cyan {
  598. background-color: #1cbbb4;
  599. }
  600. .bg-mauve {
  601. background-color: #9c26b0;
  602. }
  603. .bg-pink {
  604. background-color: #e03997;
  605. }
  606. .bg-brown {
  607. background-color: #a5673f;
  608. }
  609. .bg-pink2 {
  610. background-color: #FF0099;
  611. }
  612. .bg-blue2 {
  613. background-color: #07ABF5;
  614. }
  615. .bg-green2 {
  616. background-color: #1D3638;
  617. }
  618. </style>