gradeassessment.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. <template>
  2. <div>
  3. <div class="query mg-b-8">
  4. <div class="query-items">
  5. <div
  6. class="newspan"
  7. v-for="(item, index) of optionData"
  8. :key="index"
  9. :class="{ active: cur == index }"
  10. @click="handleOpen(item, index)"
  11. >{{ item }}</div>
  12. </div>
  13. </div>
  14. <div class="query mg-b-8">
  15. <div class="query-items">
  16. <div class="query-item">
  17. <div class="lable">场站:</div>
  18. <div class="search-input">
  19. <el-select v-model="value1" clearable placeholder="请选择" popper-class="select">
  20. <el-option
  21. v-for="item in ChangZhan"
  22. :key="item.id"
  23. :value="item.id"
  24. :label="item.name"
  25. ></el-option>
  26. </el-select>
  27. </div>
  28. </div>
  29. <div class="query-item" v-if="shows == 'd'">
  30. <div class="lable">日期:</div>
  31. <div class="search-input">
  32. <el-date-picker
  33. v-model="date"
  34. type="date"
  35. placeholder="选择日期"
  36. popper-class="date-select"
  37. value-format="YYYY-MM-DD"
  38. ></el-date-picker>
  39. </div>
  40. </div>
  41. <div class="query-item" v-if="shows == 'm'">
  42. <div class="lable">年月:</div>
  43. <div class="search-input">
  44. <el-date-picker
  45. v-model="date"
  46. type="month"
  47. placeholder="选择年月"
  48. popper-class="date-select"
  49. value-format="YYYY-MM"
  50. ></el-date-picker>
  51. </div>
  52. </div>
  53. <div class="query-item" v-if="shows == 'y'">
  54. <div class="lable">年:</div>
  55. <div class="search-input">
  56. <el-date-picker
  57. v-model="date"
  58. type="year"
  59. placeholder="选择年"
  60. popper-class="date-select"
  61. value-format="YYYY"
  62. ></el-date-picker>
  63. </div>
  64. </div>
  65. <div class="query-actions">
  66. <button class="btn green" @click="handleSubmit">查询</button>
  67. <button class="btn green" @click="contrast">对比</button>
  68. </div>
  69. </div>
  70. </div>
  71. <div class="table-box">
  72. <div class="title">{{ showTitle }}</div>
  73. <ComTable
  74. ref="curRef"
  75. :data="tableData"
  76. :pageSize="20"
  77. height="73vh"
  78. v-loading="tableLoading"
  79. element-loading-text="拼命加载中.."
  80. element-loading-background="rgba(0, 0, 0, 0.8)"
  81. ></ComTable>
  82. </div>
  83. <el-dialog :title="dialogTitle" v-model="dialogVisible" width="70%" top="10vh" custom-class="modal">
  84. <dayinfo :gridDatas="dialogData1" :chartDatas="dialogData2" />
  85. </el-dialog>
  86. </div>
  87. </template>
  88. <script>
  89. import ComTable from "@/components/coms/table/table.vue";
  90. import Dayinfo from "./dayinfo.vue";
  91. export default {
  92. name: "gradeassessment",
  93. components: { ComTable, Dayinfo },
  94. data() {
  95. let that = this;
  96. return {
  97. cur: 0,
  98. optionData: [
  99. "风机日信息量化评级管理",
  100. "风机月信息量化评级管理",
  101. "风机年信息量化评级管理"
  102. ],
  103. dialogTitle: "日信息对比",
  104. dialogVisible: false,
  105. ChangZhan: [],
  106. value1: "XS_FDC",
  107. date: "",
  108. shows: "d",
  109. showTitle: "风机日信息量化评级管理",
  110. tableLoading: true,
  111. dataIds: new Set(),
  112. dialogData1: [],
  113. dialogData2: [],
  114. tableData: {
  115. column: [
  116. {
  117. name: "",
  118. field: "fj",
  119. is_num: false,
  120. is_light: false,
  121. sortable: false,
  122. template: () => {
  123. return "<input class='check curCheckBox checkItem' type='CheckBox'/>";
  124. },
  125. click: function(event, data) {
  126. if (event.target.checked == false) {
  127. that.dataIds.delete(data.id);
  128. }
  129. if (event.target.checked) {
  130. if (that.dataIds.size < 2) {
  131. that.dataIds.add(data.id);
  132. } else {
  133. event.target.checked = false;
  134. }
  135. }
  136. }
  137. },
  138. {
  139. name: "风机编号",
  140. field: "windturbineid",
  141. is_num: false,
  142. is_light: false,
  143. sortable: true,
  144. id: "id"
  145. },
  146. {
  147. name: "等級",
  148. field: "level",
  149. is_num: false,
  150. is_light: false,
  151. sortable: true,
  152. id: "id"
  153. },
  154. {
  155. name: "综合排名",
  156. field: "rank",
  157. is_num: false,
  158. is_light: false,
  159. sortable: true,
  160. id: "id"
  161. },
  162. {
  163. name: "发电量(kWh)",
  164. field: "dayfdl",
  165. is_num: false,
  166. is_light: false,
  167. sortable: true,
  168. id: "id"
  169. },
  170. {
  171. name: "理论发电量(kWh)",
  172. field: "dayllfdl",
  173. is_num: false,
  174. is_light: false,
  175. sortable: true,
  176. id: "id"
  177. },
  178. {
  179. name: "平均风速(m/s)",
  180. field: "dayfs",
  181. is_num: false,
  182. is_light: false,
  183. sortable: true,
  184. id: "id"
  185. },
  186. {
  187. name: "平均功率(kW)",
  188. field: "daygl",
  189. is_num: false,
  190. is_light: false,
  191. sortable: true,
  192. id: "id"
  193. },
  194. {
  195. name: "故障损失电量(kWh)",
  196. field: "daygzssdl",
  197. is_num: false,
  198. is_light: false,
  199. sortable: true,
  200. id: "id"
  201. },
  202. {
  203. name: "限电损失电量(kWh)",
  204. field: "dayxdssdl",
  205. is_num: false,
  206. is_light: false,
  207. sortable: true,
  208. id: "id"
  209. },
  210. {
  211. name: "维护损失电量(kWh)",
  212. field: "daywhssdl",
  213. is_num: false,
  214. is_light: false,
  215. sortable: true,
  216. id: "id"
  217. },
  218. {
  219. name: "性能损失电量(kWh)",
  220. field: "dayxnssdl",
  221. is_num: false,
  222. is_light: false,
  223. sortable: true,
  224. id: "id"
  225. },
  226. {
  227. name: "利用小时数(h)",
  228. field: "daylyxs",
  229. is_num: false,
  230. is_light: false,
  231. sortable: true,
  232. id: "id"
  233. },
  234. {
  235. name: "拟合优度(%)",
  236. field: "daynhyd",
  237. is_num: false,
  238. is_light: false,
  239. sortable: true,
  240. id: "id"
  241. },
  242. {
  243. name: "设备可利用率(%)",
  244. field: "daysbklyl",
  245. is_num: false,
  246. is_light: false,
  247. sortable: true,
  248. id: "id"
  249. },
  250. {
  251. name: "等效可用系数(%)",
  252. field: "daydxkyxs",
  253. is_num: false,
  254. is_light: false,
  255. sortable: true,
  256. id: "id"
  257. },
  258. {
  259. name: "有效风时数(h)",
  260. field: "dayyxfss",
  261. is_num: false,
  262. is_light: false,
  263. sortable: true,
  264. id: "id"
  265. },
  266. {
  267. name: "平均切入风速(m/s)",
  268. field: "dayxfqr",
  269. is_num: false,
  270. is_light: false,
  271. sortable: true,
  272. id: "id"
  273. },
  274. {
  275. name: "静风频率(%)",
  276. field: "dayjfpl",
  277. is_num: false,
  278. is_light: false,
  279. sortable: true,
  280. id: "id"
  281. },
  282. {
  283. name: "功率一致性系数(%)",
  284. field: "dayglyzxxs",
  285. is_num: false,
  286. is_light: false,
  287. sortable: true,
  288. id: "id"
  289. },
  290. {
  291. name: "操作",
  292. field: "sjbz",
  293. is_num: false,
  294. is_light: false,
  295. sortable: true,
  296. id: "id",
  297. template: () => {
  298. return "<a class='action'>详情</a>";
  299. },
  300. click: function(event, data) {
  301. that.dialogVisible = true;
  302. that.dialogData1 = [data];
  303. const service1 = {
  304. name: data.windturbineid,
  305. value: [
  306. data["yearxfqr"],
  307. data["yearxnssdl"],
  308. data["yearnhyd"],
  309. data["yearglyzxxs"],
  310. data["yearlyxs"],
  311. data["yearsbklyl"],
  312. data["yeardxkyxs"],
  313. data["yearyxfss"],
  314. data["yearfs"],
  315. data["yearjfpl"]
  316. ]
  317. };
  318. const chartData = [
  319. {
  320. indicator: [
  321. "平均切入风速",
  322. "性能损失电量",
  323. "拟合优度",
  324. "功率一致性系数",
  325. "利用小时",
  326. "设备可利用率",
  327. "等效可利用系数",
  328. "有效风时数",
  329. "平均风速",
  330. "静风频率"
  331. ],
  332. data: [service1]
  333. }
  334. ];
  335. that.dialogData2 = chartData;
  336. }
  337. }
  338. ],
  339. data: []
  340. },
  341. tableId: ""
  342. };
  343. },
  344. created() {
  345. this.ChangZhanVal();
  346. this.date = this.getDate(0);
  347. this.getTable(this.date);
  348. },
  349. methods: {
  350. clearCheckBox() {
  351. this.$refs.curRef.clearCheckBox();
  352. this.dataIds = new Set();
  353. },
  354. // 获取表格数据
  355. getTable(date) {
  356. let that = this;
  357. let subUrl = "";
  358. const data = {
  359. isAsc: "asc",
  360. wpId: this.value1
  361. };
  362. if ("d" == this.shows) {
  363. subUrl = "/benchmarking/gadaylistByPage";
  364. data["recorddate"] = date;
  365. }
  366. if ("m" == this.shows) {
  367. subUrl = "/benchmarking/gamonthlistByPage";
  368. const dateStr = date.split("-");
  369. if (dateStr.length > 1) {
  370. data["year"] = dateStr[0];
  371. data["month"] = dateStr[1];
  372. }
  373. }
  374. if ("y" == this.shows) {
  375. subUrl = "/benchmarking/gayearlistByPage";
  376. data["year"] = date;
  377. }
  378. that.tableLoading = true;
  379. that.API.requestData({
  380. timeout: 60000,
  381. method: "POST",
  382. subUrl: subUrl,
  383. data: data,
  384. success(res) {
  385. that.tableLoading = false;
  386. if (res.code === 200) {
  387. var data = [];
  388. res.data.list.forEach((item, index) => {
  389. item["index"] = index;
  390. data[index] = item;
  391. });
  392. that.tableData.data = data;
  393. }
  394. },
  395. Error(res) {
  396. console.log("tag", res);
  397. }
  398. });
  399. },
  400. // tab
  401. handleOpen(vl, index) {
  402. this.$nextTick(() => {
  403. this.cur = index;
  404. this.showTitle = vl;
  405. if (index == 0) {
  406. this.date = this.getDate(0);
  407. this.shows = "d";
  408. this.dialogTitle = "日信息对比";
  409. }
  410. if (index == 1) {
  411. this.date = this.getDate(1);
  412. this.shows = "m";
  413. this.dialogTitle = "月信息对比";
  414. }
  415. if (index == 2) {
  416. this.date = this.getDate(2);
  417. this.shows = "y";
  418. this.dialogTitle = "年信息对比";
  419. }
  420. });
  421. },
  422. // 场站
  423. ChangZhanVal() {
  424. var that = this;
  425. that.API.requestData({
  426. method: "GET",
  427. baseURL: "http://10.155.32.4:9001/",
  428. subUrl: "benchmarking/wplist",
  429. success(res) {
  430. that.ChangZhan = res.data;
  431. that.value1 = res.data[0].id;
  432. }
  433. });
  434. },
  435. // 查询
  436. handleSubmit() {
  437. this.clearCheckBox();
  438. this.getTable(this.date);
  439. },
  440. // 日信息对比
  441. contrast() {
  442. var that = this;
  443. if (that.dataIds.size == 2) {
  444. that.dialogVisible = true;
  445. const tmpArr = Array.from(that.dataIds);
  446. const data = {
  447. gaid1: tmpArr[0],
  448. gaid2: tmpArr[1]
  449. };
  450. that.API.requestData({
  451. method: "GET",
  452. subUrl: "/benchmarking/wtinfo",
  453. data: data,
  454. success(res) {
  455. that.dialogData1 = [res.data.gaid1, res.data.gaid2];
  456. }
  457. });
  458. that.API.requestData({
  459. method: "GET",
  460. subUrl: "/benchmarking/wtchart",
  461. data: data,
  462. success(res) {
  463. const data1 = res.data.gaid1;
  464. const data2 = res.data.gaid2;
  465. const chartData = [
  466. {
  467. indicator: [
  468. "平均切入风速",
  469. "性能损失电量",
  470. "拟合优度",
  471. "功率一致性系数",
  472. "利用小时",
  473. "设备可利用率",
  474. "等效可利用系数",
  475. "有效风时数",
  476. "平均风速",
  477. "静风频率"
  478. ],
  479. data: []
  480. }
  481. ];
  482. if (data1) {
  483. chartData[0].data.push(that.getChartData(data1));
  484. }
  485. if (data2) {
  486. chartData[0].data.push(that.getChartData(data2));
  487. }
  488. that.dialogData2 = chartData;
  489. }
  490. });
  491. }
  492. this.clearCheckBox();
  493. },
  494. getChartData(resData) {
  495. const chartData = {};
  496. const rowMap = {};
  497. resData.forEach(function(rowData, index) {
  498. rowMap[rowData["name"]] = rowData["data1"];
  499. });
  500. chartData["name"] = resData[resData.length - 1]["name"];
  501. chartData["value"] = [];
  502. chartData["value"].push(rowMap["平均切入风速"]);
  503. chartData["value"].push(rowMap["性能损失电量"]);
  504. chartData["value"].push(rowMap["拟合优度"]);
  505. chartData["value"].push(rowMap["功率一致性系数"]);
  506. chartData["value"].push(rowMap["利用小时"]);
  507. chartData["value"].push(rowMap["设备可利用率"]);
  508. chartData["value"].push(rowMap["等效可利用系数"]);
  509. chartData["value"].push(rowMap["有效风时数"]);
  510. chartData["value"].push(rowMap["平均风速"]);
  511. chartData["value"].push(rowMap["静风频率"]);
  512. return chartData;
  513. },
  514. // 获取日期
  515. getDate(vl) {
  516. var date = new Date();
  517. var year = date.getFullYear(),
  518. month = date.getMonth() + 1,
  519. day = date.getDate() - 1;
  520. month >= 1 && month <= 9 ? (month = "0" + month) : "";
  521. day >= 0 && day <= 9 ? (day = "0" + day) : "";
  522. if (vl == 0) {
  523. return year + "-" + month + "-" + day;
  524. }
  525. if (vl == 1) {
  526. return year + "-" + month;
  527. }
  528. if (vl == 2) {
  529. return year + "";
  530. }
  531. }
  532. }
  533. };
  534. </script>
  535. <style scoped>
  536. .newsDiv {
  537. color: rgba(255, 255, 255, 0.75);
  538. background-color: rgba(255, 255, 255, 0.1);
  539. margin-bottom: 8px;
  540. line-height: 3.4259vh;
  541. padding: 0 15px;
  542. }
  543. .newspan {
  544. line-height: 30px;
  545. cursor: pointer;
  546. padding: 0 1vw;
  547. margin: 0 2px;
  548. color: #9ca5a8;
  549. transition: color 0.2s ease-in-out;
  550. position: relative;
  551. }
  552. .newspan:hover {
  553. background: linear-gradient(
  554. to top,
  555. rgba(5, 187, 76, 0.5),
  556. rgba(5, 187, 76, 0)
  557. );
  558. color: white;
  559. position: relative;
  560. }
  561. .newspan:hover::after {
  562. content: "";
  563. position: absolute;
  564. width: 100%;
  565. height: 0.463vh;
  566. border: 0.093vh solid #05bb4c;
  567. border-top: 0;
  568. left: 0;
  569. bottom: 0;
  570. box-sizing: border-box;
  571. }
  572. .active {
  573. background: linear-gradient(
  574. to top,
  575. rgba(5, 187, 76, 0.5),
  576. rgba(5, 187, 76, 0)
  577. );
  578. color: white;
  579. position: relative;
  580. }
  581. .active::after {
  582. content: "";
  583. position: absolute;
  584. width: 100%;
  585. height: 0.463vh;
  586. border: 0.093vh solid #05bb4c;
  587. border-top: 0;
  588. left: 0;
  589. bottom: 0;
  590. box-sizing: border-box;
  591. }
  592. .title {
  593. background: rgba(255, 255, 255, 0.1);
  594. margin-bottom: 8px;
  595. padding: 1vh;
  596. }
  597. </style>
  598. <style lang="less">
  599. .decision-page-2 {
  600. .content .project-table {
  601. tbody {
  602. height: calc(100vh - 24.5vh);
  603. }
  604. }
  605. .project-table {
  606. overflow: auto;
  607. tbody {
  608. height: 239px;
  609. }
  610. th,
  611. td {
  612. color: #b2bdc0;
  613. &:nth-child(1) {
  614. width: 50px;
  615. }
  616. &:nth-child(2) {
  617. width: 50px;
  618. }
  619. }
  620. }
  621. .action {
  622. text-decoration: underline;
  623. color: @green;
  624. cursor: pointer;
  625. }
  626. }
  627. </style>