xzdl.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <template>
  2. <div class="dlTable">
  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-date-picker v-model="month" type="month" value-format="YYYY-MM" placeholder="选择日期"
  9. popper-class="date-select">
  10. </el-date-picker>
  11. </div>
  12. </div>
  13. </div>
  14. </div>
  15. <panel :title="monthTitle + '发电量预测'" :showLine="false">
  16. <el-table :data="tableData" height="85vh" style="width: 100%" show-summary :summary-method="getSummaries"
  17. :span-method="yhmxdbMethod">
  18. <el-table-column fixed prop="region" label="名称" width="120" />
  19. <el-table-column fixed prop="speed" label="" width="50" />
  20. <el-table-column label="日期">
  21. <el-table-column v-for="(item, index) in dateS" :key="index" :prop="item.prop" :label="item.label"
  22. width="70" align="center" />
  23. </el-table-column>
  24. <el-table-column fixed="right" prop="hj" label="平均风速/合计" width="100" align="center" />
  25. <el-table-column fixed="right" prop="dqhj" label="地区合并" width="100" align="center" />
  26. </el-table>
  27. </panel>
  28. </div>
  29. </template>
  30. <script>
  31. import $ from "jquery";
  32. import Panel from "@/components/coms/panel/panel.vue";
  33. export default {
  34. components: {
  35. Panel,
  36. },
  37. data() {
  38. return {
  39. month: new Date().formatDate("yyyy-MM"),
  40. monthTitle: "",
  41. spanArr: [],
  42. pos: 0,
  43. spanArrHj: [],
  44. dateS: [{
  45. prop: "01",
  46. label: 1,
  47. },
  48. {
  49. prop: "02",
  50. label: 2,
  51. },
  52. ],
  53. tableData: [{
  54. region: "Tom",
  55. speed: "白天",
  56. hj: 3,
  57. dqhj: 6,
  58. "01": 55,
  59. wpid: "NSS_FDC",
  60. }, ],
  61. };
  62. },
  63. created() {
  64. this.list(new Date(this.month).valueOf());
  65. },
  66. mounted() {
  67. this.$nextTick(() => {
  68. $(".el-table__fixed-footer-wrapper tbody td:last-child").remove();
  69. $(".el-table__fixed-footer-wrapper tbody td:last-child").attr("colspan", "2");
  70. });
  71. },
  72. methods: {
  73. list(month) {
  74. let that = this;
  75. this.API.requestData({
  76. showLoading: true,
  77. method: "GET",
  78. baseURL: "http://10.155.32.4:8082/",
  79. subUrl: "decision/ycfsdlxz/" + month,
  80. success(res) {
  81. let tableData = [],
  82. windpowerstationid = [],
  83. dateS = [],
  84. recodedata = [],
  85. average = [];
  86. res.data.Weatherfd.forEach((ele) => {
  87. let dd = new Date(ele.recodedata).formatDate("dd");
  88. recodedata.push(dd);
  89. if (windpowerstationid.indexOf(ele.windpowerstationid) === -1) {//判断有木有id,若没有,则加进去,并新增一条tableData的白天和夜间
  90. windpowerstationid.push(ele.windpowerstationid);
  91. tableData.push({
  92. region: ele.region,
  93. speed: "白天",
  94. [dd]: ele.speed1,
  95. wpid: ele.windpowerstationid,
  96. dqhj: "",
  97. });
  98. tableData.push({
  99. region: ele.region,
  100. speed: "夜间",
  101. [dd]: ele.speed2,
  102. wpid: ele.windpowerstationid,
  103. dqhj: "",
  104. });
  105. average.push(ele.speed1, ele.speed2);
  106. } else {//匹配tableData的id,并分别传到夜间和白天data中
  107. tableData.forEach((ele2, index2) => {
  108. if (ele2.wpid === ele.windpowerstationid) {
  109. if (ele2.speed === "白天") {
  110. tableData[index2][dd] = ele.speed1;
  111. average[index2] = average[index2] + ele.speed1;
  112. } else {
  113. tableData[index2][dd] = ele.speed2;
  114. average[index2] = average[index2] + ele.speed2;
  115. }
  116. }
  117. });
  118. }
  119. });
  120. Object.values(Array.from(new Set(recodedata))).forEach((ele) => {
  121. dateS.push({
  122. prop: ele,
  123. label: ele,
  124. });
  125. });
  126. average.forEach((ele, index) => {//合计里的平均风速
  127. tableData[index]["hj"] = (ele / dateS.length).toFixed(2);
  128. });
  129. that.dateS = dateS;
  130. that.Forecastwindspeed(res.data.Forecastwindspeed, tableData);
  131. },
  132. });
  133. },
  134. Forecastwindspeed(data, Weatherfd) {
  135. let that = this,
  136. tableData = [],
  137. pjid = [],
  138. wpid = [],
  139. dqhj = {};
  140. data.forEach((ele) => {
  141. let dd = new Date(ele.recodedate).formatDate("dd");
  142. let wpidName = ele.pjid.split("_")[0].match(/^[a-z|A-Z]+/gi)[0];
  143. let power = ele.daypower + ele.nightpower;
  144. if (pjid.indexOf(ele.pjid) === -1) {//判断有木有id,若没有,则加进去,并新增一条tableData的白天和夜间
  145. pjid.push(ele.pjid);
  146. tableData.push({
  147. region: ele.pjname,
  148. speed: "白天",
  149. [dd]: ele.daypower,
  150. wpid: ele.wpid,
  151. pjid: ele.pjid,
  152. hj: power,
  153. dqhj: 1,
  154. });
  155. tableData.push({
  156. region: ele.pjname,
  157. speed: "夜间",
  158. [dd]: ele.nightpower,
  159. wpid: ele.wpid,
  160. pjid: ele.pjid,
  161. });
  162. tableData.push({
  163. region: ele.pjname,
  164. speed: "合计",
  165. [dd]: power,
  166. wpid: ele.wpid,
  167. pjid: ele.pjid,
  168. });
  169. dqhj[wpidName] != undefined ?
  170. (dqhj[wpidName] += power) :
  171. (dqhj[wpidName] = power);
  172. } else {//匹配tableData的id,并分别传到夜间和白天data中
  173. tableData.forEach((ele2, index2) => {
  174. if (ele2.pjid === ele.pjid) {
  175. if (ele2.speed === "白天") {
  176. tableData[index2][dd] = ele.daypower;
  177. tableData[index2].hj += power;
  178. } else if (ele2.speed === "夜间") {
  179. tableData[index2][dd] = ele.nightpower;
  180. } else {
  181. tableData[index2][dd] = power;
  182. dqhj[wpidName] += power;
  183. }
  184. }
  185. });
  186. }
  187. });
  188. tableData.find((ele) => {//地区合并
  189. if (ele.dqhj == 1) {
  190. ele.dqhj = dqhj[ele.wpid.split("_")[0]];
  191. }
  192. });
  193. let arr = [];
  194. Weatherfd.forEach((ele, index) => {
  195. arr.push(ele);
  196. tableData.forEach((ele2, index2) => {
  197. if (ele.wpid === ele2.wpid && ele.speed === "夜间") {
  198. arr.push(ele2);
  199. }
  200. });
  201. });
  202. that.getSpanArr(arr);
  203. that.tableData = arr;
  204. },
  205. yhmxdbMethod({row,column,rowIndex,columnIndex}) {
  206. if (columnIndex === 0) {
  207. let _row = this.spanArr[rowIndex];
  208. const _col = _row > 0 ? 1 : 0;
  209. return [_row, _col];
  210. } else if (columnIndex === this.dateS.length + 2) {//合计列
  211. let _row = this.spanArr[rowIndex];
  212. if (_row < 3) {
  213. _row = 1;
  214. }
  215. const _col = _row > 0 ? 1 : 0;
  216. return [_row, _col];
  217. } else if (columnIndex === this.dateS.length + 3) {//地区合并列
  218. let _row = this.spanArrHj[rowIndex];
  219. const _col = _row > 0 ? 1 : 0;
  220. return [_row, _col];
  221. }
  222. },
  223. getSpanArr(data) {
  224. this.spanArr = [];
  225. for (var i = 0; i < data.length; i++) {
  226. if (i === 0) {
  227. this.spanArr.push(1);
  228. this.pos = 0;
  229. } else {// 判断当前元素与上一个元素是否相同
  230. if (data[i].region === data[i - 1].region) {
  231. this.spanArr[this.pos] += 1;
  232. this.spanArr.push(0);
  233. } else {
  234. this.spanArr.push(1);
  235. this.pos = i;
  236. }
  237. }
  238. }
  239. let spanArrIndex = [], //下标为2时,获取spanArr所对应的下标
  240. idx = [];
  241. this.spanArr.forEach((ele, index) => {
  242. if (ele === 2) {
  243. idx.push(index + 2);
  244. spanArrIndex.push(1);
  245. } else if (this.spanArr[index - 1] === 2) {
  246. spanArrIndex.push(1);
  247. } else {
  248. spanArrIndex.push(0);
  249. }
  250. });
  251. idx.push(this.spanArr.length + 2);
  252. idx.forEach((ele, index) => {
  253. if (idx[index + 1]) {
  254. spanArrIndex[ele] = idx[index + 1] - (ele + 2);
  255. }
  256. });
  257. this.spanArrHj = spanArrIndex;
  258. },
  259. getSummaries(param) {
  260. const {columns,data} = param;
  261. const sums = [];
  262. columns.forEach((column, index) => {
  263. if (index === 0) {
  264. sums[index] = "合计";
  265. return;
  266. }
  267. const values = data.map((item) => {
  268. if (item.pjid && item.speed === "白天") {
  269. return Number(item[column.property]);
  270. }
  271. });
  272. if (!values.every((value) => isNaN(value))) {
  273. sums[index] = values.reduce((prev, curr) => {
  274. const value = Number(curr);
  275. if (!isNaN(value)) {
  276. return prev + curr;
  277. } else {
  278. return prev;
  279. }
  280. }, 0);
  281. } else {
  282. sums[index] = "";
  283. }
  284. });
  285. sums[sums.length - 1] = "";
  286. return sums;
  287. },
  288. },
  289. watch: {
  290. month(e) {
  291. this.list(new Date(e).valueOf());
  292. let tit = e.split("-");
  293. if (tit[1].indexOf(0) != -1) {
  294. tit[1] = tit[1].split("0")[1];
  295. }
  296. this.monthTitle = tit[0] + "年" + tit[1] + "月";
  297. },
  298. },
  299. };
  300. </script>
  301. <style lang="less" scoped>
  302. .main-body {
  303. .dlTable {
  304. .el-table thead.is-group th.el-table__cell {
  305. background-color: rgb(30, 37, 36);
  306. }
  307. .el-table__expanded-cell {
  308. background: #141e1e;
  309. }
  310. .el-table__body {
  311. tr.hover-row>td {
  312. background-color: rgb(4, 12, 11);
  313. color: #b3bdc0 !important;
  314. }
  315. td {
  316. background-color: rgb(4, 12, 11);
  317. }
  318. td[rowspan="2"],
  319. td[rowspan="3"],
  320. td[rowspan="6"],
  321. td[rowspan="9"],
  322. td[rowspan="12"],
  323. tr.hover-row>td[rowspan="2"],
  324. tr.hover-row>td[rowspan="3"],
  325. tr:hover td {
  326. background-color: #141e1e !important;
  327. }
  328. }
  329. .el-table__fixed-footer-wrapper tbody td.el-table__cell {
  330. color: #b3bdc0;
  331. background-color: rgb(30, 37, 36) !important;
  332. }
  333. .el-table__footer-wrapper tbody td.el-table__cell,
  334. .el-table__header-wrapper tbody td.el-table__cell {
  335. color: white;
  336. background-color: rgb(4, 12, 11);
  337. }
  338. .el-table__cell.is-hidden>* {
  339. visibility: inherit;
  340. }
  341. }
  342. }
  343. </style>