1. 优化3D动画中风向的变化逻辑;
2. 修复折线图切换因子时,数据直接跳转至起始处的问题;
3. 折线图和表格加回风向因子;
4. 优化风向的均值计算为矢量计算,同时最大最小值不显示;
5. 新增表格数据导出功能;
| | |
| | | "unplugin-vue-components": "^0.26.0", |
| | | "vue": "^3.4.21", |
| | | "vue-router": "^4.3.0", |
| | | "xlsx": "^0.18.5", |
| | | "xml2json": "^0.12.0" |
| | | }, |
| | | "devDependencies": { |
| | |
| | | "node": ">=0.4.0" |
| | | } |
| | | }, |
| | | "node_modules/adler-32": { |
| | | "version": "1.3.1", |
| | | "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz", |
| | | "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", |
| | | "engines": { |
| | | "node": ">=0.8" |
| | | } |
| | | }, |
| | | "node_modules/agent-base": { |
| | | "version": "7.1.0", |
| | | "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.0.tgz", |
| | |
| | | "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz", |
| | | "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" |
| | | }, |
| | | "node_modules/cfb": { |
| | | "version": "1.2.2", |
| | | "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz", |
| | | "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", |
| | | "dependencies": { |
| | | "adler-32": "~1.3.0", |
| | | "crc-32": "~1.2.0" |
| | | }, |
| | | "engines": { |
| | | "node": ">=0.8" |
| | | } |
| | | }, |
| | | "node_modules/chai": { |
| | | "version": "4.4.1", |
| | | "resolved": "https://registry.npmmirror.com/chai/-/chai-4.4.1.tgz", |
| | |
| | | "resolved": "https://registry.npmmirror.com/cldrjs/-/cldrjs-0.5.5.tgz", |
| | | "integrity": "sha512-KDwzwbmLIPfCgd8JERVDpQKrUUM1U4KpFJJg2IROv89rF172lLufoJnqJ/Wea6fXL5bO6WjuLMzY8V52UWPvkA==" |
| | | }, |
| | | "node_modules/codepage": { |
| | | "version": "1.15.0", |
| | | "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz", |
| | | "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", |
| | | "engines": { |
| | | "node": ">=0.8" |
| | | } |
| | | }, |
| | | "node_modules/color-convert": { |
| | | "version": "2.0.1", |
| | | "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", |
| | |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", |
| | | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" |
| | | }, |
| | | "node_modules/crc-32": { |
| | | "version": "1.2.2", |
| | | "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz", |
| | | "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", |
| | | "bin": { |
| | | "crc32": "bin/crc32.njs" |
| | | }, |
| | | "engines": { |
| | | "node": ">=0.8" |
| | | } |
| | | }, |
| | | "node_modules/cross-spawn": { |
| | | "version": "7.0.3", |
| | |
| | | }, |
| | | "engines": { |
| | | "node": ">= 6" |
| | | } |
| | | }, |
| | | "node_modules/frac": { |
| | | "version": "1.1.2", |
| | | "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz", |
| | | "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", |
| | | "engines": { |
| | | "node": ">=0.8" |
| | | } |
| | | }, |
| | | "node_modules/fs.realpath": { |
| | |
| | | "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", |
| | | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" |
| | | }, |
| | | "node_modules/ssf": { |
| | | "version": "0.11.2", |
| | | "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz", |
| | | "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", |
| | | "dependencies": { |
| | | "frac": "~1.1.2" |
| | | }, |
| | | "engines": { |
| | | "node": ">=0.8" |
| | | } |
| | | }, |
| | | "node_modules/sshpk": { |
| | | "version": "1.18.0", |
| | | "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz", |
| | |
| | | "node": ">=8" |
| | | } |
| | | }, |
| | | "node_modules/wmf": { |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz", |
| | | "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", |
| | | "engines": { |
| | | "node": ">=0.8" |
| | | } |
| | | }, |
| | | "node_modules/word": { |
| | | "version": "0.3.0", |
| | | "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz", |
| | | "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", |
| | | "engines": { |
| | | "node": ">=0.8" |
| | | } |
| | | }, |
| | | "node_modules/wrap-ansi": { |
| | | "version": "8.1.0", |
| | | "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", |
| | |
| | | "utf-8-validate": { |
| | | "optional": true |
| | | } |
| | | } |
| | | }, |
| | | "node_modules/xlsx": { |
| | | "version": "0.18.5", |
| | | "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz", |
| | | "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", |
| | | "dependencies": { |
| | | "adler-32": "~1.3.0", |
| | | "cfb": "~1.2.1", |
| | | "codepage": "~1.15.0", |
| | | "crc-32": "~1.2.1", |
| | | "ssf": "~0.11.2", |
| | | "wmf": "~1.0.1", |
| | | "word": "~0.3.0" |
| | | }, |
| | | "bin": { |
| | | "xlsx": "bin/xlsx.njs" |
| | | }, |
| | | "engines": { |
| | | "node": ">=0.8" |
| | | } |
| | | }, |
| | | "node_modules/xml-name-validator": { |
| | |
| | | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", |
| | | "dev": true |
| | | }, |
| | | "adler-32": { |
| | | "version": "1.3.1", |
| | | "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz", |
| | | "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==" |
| | | }, |
| | | "agent-base": { |
| | | "version": "7.1.0", |
| | | "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.0.tgz", |
| | |
| | | "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz", |
| | | "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" |
| | | }, |
| | | "cfb": { |
| | | "version": "1.2.2", |
| | | "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz", |
| | | "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", |
| | | "requires": { |
| | | "adler-32": "~1.3.0", |
| | | "crc-32": "~1.2.0" |
| | | } |
| | | }, |
| | | "chai": { |
| | | "version": "4.4.1", |
| | | "resolved": "https://registry.npmmirror.com/chai/-/chai-4.4.1.tgz", |
| | |
| | | "resolved": "https://registry.npmmirror.com/cldrjs/-/cldrjs-0.5.5.tgz", |
| | | "integrity": "sha512-KDwzwbmLIPfCgd8JERVDpQKrUUM1U4KpFJJg2IROv89rF172lLufoJnqJ/Wea6fXL5bO6WjuLMzY8V52UWPvkA==" |
| | | }, |
| | | "codepage": { |
| | | "version": "1.15.0", |
| | | "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz", |
| | | "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==" |
| | | }, |
| | | "color-convert": { |
| | | "version": "2.0.1", |
| | | "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", |
| | |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", |
| | | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" |
| | | }, |
| | | "crc-32": { |
| | | "version": "1.2.2", |
| | | "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz", |
| | | "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" |
| | | }, |
| | | "cross-spawn": { |
| | | "version": "7.0.3", |
| | |
| | | "combined-stream": "^1.0.8", |
| | | "mime-types": "^2.1.12" |
| | | } |
| | | }, |
| | | "frac": { |
| | | "version": "1.1.2", |
| | | "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz", |
| | | "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" |
| | | }, |
| | | "fs.realpath": { |
| | | "version": "1.0.0", |
| | |
| | | "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", |
| | | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" |
| | | }, |
| | | "ssf": { |
| | | "version": "0.11.2", |
| | | "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz", |
| | | "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", |
| | | "requires": { |
| | | "frac": "~1.1.2" |
| | | } |
| | | }, |
| | | "sshpk": { |
| | | "version": "1.18.0", |
| | | "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz", |
| | |
| | | "stackback": "0.0.2" |
| | | } |
| | | }, |
| | | "wmf": { |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz", |
| | | "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==" |
| | | }, |
| | | "word": { |
| | | "version": "0.3.0", |
| | | "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz", |
| | | "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==" |
| | | }, |
| | | "wrap-ansi": { |
| | | "version": "8.1.0", |
| | | "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", |
| | |
| | | "dev": true, |
| | | "requires": {} |
| | | }, |
| | | "xlsx": { |
| | | "version": "0.18.5", |
| | | "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz", |
| | | "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", |
| | | "requires": { |
| | | "adler-32": "~1.3.0", |
| | | "cfb": "~1.2.1", |
| | | "codepage": "~1.15.0", |
| | | "crc-32": "~1.2.1", |
| | | "ssf": "~0.11.2", |
| | | "wmf": "~1.0.1", |
| | | "word": "~0.3.0" |
| | | } |
| | | }, |
| | | "xml-name-validator": { |
| | | "version": "4.0.0", |
| | | "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", |
| | |
| | | "unplugin-vue-components": "^0.26.0", |
| | | "vue": "^3.4.21", |
| | | "vue-router": "^4.3.0", |
| | | "xlsx": "^0.18.5", |
| | | "xml2json": "^0.12.0" |
| | | }, |
| | | "devDependencies": { |
| | |
| | | }, |
| | | // ä¿®æ¹å¾è¡¨å±ç¤ºçæçº¿å¾ç±»å |
| | | changeChartSeries() { |
| | | this.option.series = this.getShowSeries(); |
| | | const { sIndex, eIndex, startPer, endPer } = this.getRange(); |
| | | this.option.series = this.getShowSeries(sIndex, eIndex); |
| | | this.lineChart.setOption(this.option, { notMerge: true }); |
| | | }, |
| | | changeChartRange() { |
| | |
| | | header-cell-class-name="t-header-cell" |
| | | > |
| | | <el-table-column prop="factor" label="å å" width="66" /> |
| | | <el-table-column prop="avg" label="åå¼" width="66" /> |
| | | <el-table-column prop="avg" label="åå¼" width="84" /> |
| | | <el-table-column prop="min" label="æå°å¼" width="66" /> |
| | | <el-table-column prop="max" label="æå¤§å¼" width="66" /> |
| | | </el-table> |
| | |
| | | <script> |
| | | import { FactorDatas } from '@/model/FactorDatas'; |
| | | import { factorName } from '@/constant/factor-name'; |
| | | import { windDir } from '@/constant/wind-dir'; |
| | | |
| | | export default { |
| | | props: { |
| | |
| | | for (const key in this.factorDatas.factor) { |
| | | if (Object.hasOwnProperty.call(this.factorDatas.factor, key)) { |
| | | const f = this.factorDatas.factor[key]; |
| | | let min, |
| | | max, |
| | | total = 0, |
| | | count = 0; |
| | | f.datas.forEach((v) => { |
| | | if (!min || v.factorData < min) { |
| | | min = v.factorData; |
| | | } |
| | | if (!max || v.factorData > max) { |
| | | max = v.factorData; |
| | | } |
| | | total += v.factorData; |
| | | count++; |
| | | }); |
| | | let _avg = count == 0 ? 0 : Math.round((total / count) * 100) / 100; |
| | | if (isNaN(_avg)) _avg = '-'; |
| | | list.push({ |
| | | factorId: f.factorId, |
| | | factor: factorName[f.factorName], |
| | | min, |
| | | max, |
| | | avg: _avg |
| | | }); |
| | | if (f.factorName == 'WIND_DIRECTION') { |
| | | const avg = this.windDirAvg(f); |
| | | list.push({ |
| | | factorId: f.factorId, |
| | | factor: factorName[f.factorName], |
| | | min: '-', |
| | | max: '-', |
| | | avg: `${avg}(${windDir(avg)})` |
| | | }); |
| | | } else { |
| | | let min, |
| | | max, |
| | | total = 0, |
| | | count = 0; |
| | | f.datas.forEach((v) => { |
| | | if (!min || v.factorData < min) { |
| | | min = v.factorData; |
| | | } |
| | | if (!max || v.factorData > max) { |
| | | max = v.factorData; |
| | | } |
| | | total += v.factorData; |
| | | count++; |
| | | }); |
| | | let _avg = count == 0 ? 0 : Math.round((total / count) * 100) / 100; |
| | | if (isNaN(_avg)) _avg = '-'; |
| | | list.push({ |
| | | factorId: f.factorId, |
| | | factor: factorName[f.factorName], |
| | | min, |
| | | max, |
| | | avg: _avg |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | return list; |
| | |
| | | return this.selectFactorType.includes(v.factorId); |
| | | }); |
| | | } |
| | | }, |
| | | methods: { |
| | | windDirAvg(factor) { |
| | | let u = 0, // ä¸è¥¿æ¹ååéæ»å |
| | | v = 0, // ååæ¹ååéæ»å |
| | | c = 0; // é£åæ°æ®ä¸ªæ° |
| | | factor.datas.forEach((value) => { |
| | | let r = (value.factorData / 180.0) * Math.PI; |
| | | u += Math.sin(r); |
| | | v += Math.cos(r); |
| | | c++; |
| | | }); |
| | | if (c != 0) { |
| | | const avgU = u / c; |
| | | const avgV = v / c; |
| | | let a = Math.atan(avgU / avgV); |
| | | /** |
| | | * avgU>0;avgV>0: çå®è§åº¦å¤äºç¬¬ä¸è±¡éï¼ä¿®æ£å¼ä¸º+0° |
| | | * avgU>0;avgV<0: çå®è§åº¦å¤äºç¬¬äºè±¡éï¼ä¿®æ£å¼ä¸º+180° |
| | | * avgU<0;avgV<0: çå®è§åº¦å¤äºç¬¬ä¸è±¡éï¼ä¿®æ£å¼ä¸º+180° |
| | | * avgU<0;avgV>0: çå®è§åº¦å¤äºç¬¬å象éï¼ä¿®æ£å¼ä¸º+360° |
| | | */ |
| | | a = (a * 180.0) / Math.PI; |
| | | if (avgV > 0) { |
| | | a += avgU > 0 ? 0 : 360; |
| | | } else { |
| | | a += 180; |
| | | } |
| | | return parseInt(a); |
| | | } else { |
| | | return 0; |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | |
| | | <!-- eslint-disable no-unused-vars --> |
| | | <template> |
| | | <BaseCard size="medium" direction="right"> |
| | | <template #content> |
| | |
| | | v-if="selectFactorType.includes(item.value)" |
| | | :prop="item.name" |
| | | :label="item.label" |
| | | :formatter="factorFormatter" |
| | | align="center" |
| | | width="79" |
| | | sortable="custom" |
| | |
| | | </template> |
| | | |
| | | <template #footer> |
| | | <el-row justify="end"> |
| | | <el-row justify="space-between" class="p-b-2"> |
| | | <el-button |
| | | :loading="downloadLoading" |
| | | type="primary" |
| | | class="el-button-custom" |
| | | size="small" |
| | | @click="handleDownload" |
| | | :disabled="downloadLoading" |
| | | :icon="downloadLoading ? '' : 'download'" |
| | | > |
| | | å¯¼åºæ°æ® |
| | | </el-button> |
| | | <el-text size="small" type="warning" |
| | | >å
± {{ tableData.length }} æ¡ï¼{{ pageSize }}æ¡/页</el-text |
| | | > |
| | |
| | | import { checkboxOptions } from '@/constant/checkbox-options'; |
| | | import { TYPE0 } from '@/constant/device-type'; |
| | | import { windDir } from '@/constant/wind-dir'; |
| | | import fileUtil from '@/utils/file'; |
| | | |
| | | export default { |
| | | props: { |
| | |
| | | // type0: è½¦è½½ææ äººæº; type1:æ äººè¹ |
| | | default: TYPE0 |
| | | }, |
| | | deviceCode: String, |
| | | selectFactorType: { |
| | | type: Array, |
| | | default: () => [] |
| | |
| | | total: 0, |
| | | currentPage: 1, |
| | | pageSize: 200, |
| | | rowHeight: undefined |
| | | rowHeight: undefined, |
| | | // tableData:[], |
| | | showData: [], |
| | | downloadLoading: false |
| | | }; |
| | | }, |
| | | emits: ['tableClick'], |
| | | watch: { |
| | | locateIndex(nV, oV) { |
| | | if (nV == oV) return; |
| | | this.$refs.tableRef.setCurrentRow(this.tableData[nV]); |
| | | const _index = this.tableData.findIndex((v) => v.index == nV); |
| | | this.$refs.tableRef.setCurrentRow(this.tableData[_index]); |
| | | // 计ç®å页 |
| | | this.currentPage = parseInt(nV / this.pageSize) + 1; |
| | | this.currentPage = parseInt(_index / this.pageSize) + 1; |
| | | // 计ç®å¯¹åºå页ä¸çç´¢å¼ |
| | | const index = nV % this.pageSize; |
| | | const index = _index % this.pageSize; |
| | | |
| | | const h = this.getRowHeight(); |
| | | this.$refs.tableRef.setScrollTop(h * index - 350); |
| | | setTimeout(() => { |
| | | this.$refs.tableRef.setScrollTop(h * index - 350); |
| | | }, 200); |
| | | }, |
| | | currentPage(nV, oV) { |
| | | if (nV == oV) return; |
| | | this.getShowData(); |
| | | }, |
| | | pageSize(nV, oV) { |
| | | if (nV == oV) return; |
| | | this.getShowData(); |
| | | }, |
| | | tableData(nV, oV) { |
| | | if (nV == oV) return; |
| | | this.getShowData(); |
| | | } |
| | | }, |
| | | computed: { |
| | |
| | | f.datas.forEach((v, i) => { |
| | | const name = f.factorName; |
| | | let value = v.factorData; |
| | | if (name == 'WIND_DIRECTION') { |
| | | value = windDir(value); |
| | | } |
| | | if (list.length <= i) { |
| | | list.push({ |
| | | index: i, |
| | |
| | | } |
| | | return list; |
| | | }, |
| | | showData() { |
| | | const sIndex = (this.currentPage - 1) * this.pageSize; |
| | | const eIndex = sIndex + this.pageSize; |
| | | return this.tableData.slice(sIndex, eIndex); |
| | | }, |
| | | // showData: { |
| | | // get() { |
| | | // // const sIndex = (this.currentPage - 1) * this.pageSize; |
| | | // // const eIndex = sIndex + this.pageSize; |
| | | // // return this.tableData.slice(sIndex, eIndex); |
| | | // this.pageData = this.getShowData(); |
| | | // return this.pageData |
| | | // }, |
| | | // set(newValue) { |
| | | // this.pageData = newValue |
| | | // } |
| | | // }, |
| | | tableColumn() { |
| | | return checkboxOptions(this.deviceType); |
| | | } |
| | | }, |
| | | methods: { |
| | | getShowData() { |
| | | const sIndex = (this.currentPage - 1) * this.pageSize; |
| | | const eIndex = sIndex + this.pageSize; |
| | | this.showData = this.tableData.slice(sIndex, eIndex); |
| | | }, |
| | | // è·åè¡¨æ ¼ç¬¬ä¸è¡é«åº¦ |
| | | getRowHeight() { |
| | | if (!this.rowHeight) { |
| | |
| | | timeFormatter(row, col, cellValue, index) { |
| | | return moment(cellValue).format('HH:mm:ss'); |
| | | }, |
| | | factorFormatter(row, col, cellValue, index) { |
| | | if (col.property == 'WIND_DIRECTION') { |
| | | return windDir(cellValue); |
| | | } else { |
| | | return cellValue; |
| | | } |
| | | }, |
| | | handleRowClick(row, col, event) { |
| | | this.$emit('tableClick', row.index); |
| | | // console.log(row); |
| | |
| | | // console.log(event.target.getBoundingClientRect().height); |
| | | }, |
| | | handleSort({ column, prop, order }) { |
| | | console.log(column); |
| | | console.log(prop); |
| | | console.log(order); |
| | | // console.log(column); |
| | | // console.log(prop); |
| | | // console.log(order); |
| | | this.tableData.sort((a, b) => { |
| | | if (order == 'ascending') { |
| | | if (a[prop] != b[prop]) { |
| | | return a[prop] - b[prop]; |
| | | } else { |
| | | return a.TIME - b.TIME; |
| | | } |
| | | } else if (order == 'descending') { |
| | | if (a[prop] != b[prop]) { |
| | | return b[prop] - a[prop]; |
| | | } else { |
| | | return a.TIME - b.TIME; |
| | | } |
| | | } else { |
| | | return a.TIME - b.TIME; |
| | | } |
| | | }); |
| | | this.getShowData(); |
| | | }, |
| | | handleDownload() { |
| | | this.downloadLoading = true; |
| | | setTimeout(() => { |
| | | this.downloadLoading = false; |
| | | }, 2000); |
| | | const excelData = this.tableData.map((v) => { |
| | | const res = { |
| | | ç¼å·: ++v.index, |
| | | æ¶é´: moment(v.TIME).format('YYYY-MM-DD HH:mm:ss') |
| | | }; |
| | | this.tableColumn.forEach((c) => { |
| | | res[c.label] = v[c.name]; |
| | | }); |
| | | return res; |
| | | }); |
| | | fileUtil.exportToExcel(excelData, this.deviceCode, 'èµ°èªçæµæ°æ®.xlsx'); |
| | | this.downloadLoading = false; |
| | | } |
| | | } |
| | | }; |
| | |
| | | label: 'é£é', |
| | | name: 'WIND_SPEED', |
| | | value: '16' |
| | | }, |
| | | { |
| | | label: 'é£å', |
| | | name: 'WIND_DIRECTION', |
| | | value: '17' |
| | | } |
| | | // { |
| | | // label: 'é£å', |
| | | // name: 'WIND_DIRECTION', |
| | | // value: '17' |
| | | // } |
| | | ]; |
| | |
| | | if (d1 == undefined || d2 == undefined) { |
| | | return; |
| | | } |
| | | let diffValue = d2.factorData - d1.factorData; |
| | | // 对äºé£åç¢éæ¥è¯´ï¼å¨ç»çåååºè¯¥ä»ä¸¤ä¸ªé£å夹è§è¾å°çé£ä¸ä¾§è¿è¡åå |
| | | if (this.factorName == 'WIND_DIRECTION') { |
| | | // é£åè§åº¦å·® |
| | | if (diffValue > 180) { |
| | | diffValue -= 360; |
| | | } else if (diffValue < -180) { |
| | | diffValue += 360; |
| | | } |
| | | } |
| | | // åå¸§æ°æ®å¼çå·®å¼ |
| | | var dValue = { |
| | | factorData: (d2.factorData - d1.factorData) / count, |
| | | physicalQuantity: (d2.physicalQuantity - d2.physicalQuantity) / count |
| | | const dValue = { |
| | | factorData: diffValue / count |
| | | // physicalQuantity: (d2.physicalQuantity - d2.physicalQuantity) / count |
| | | }; |
| | | |
| | | // é£åç¢éä¿®æ£ |
| | | const correct = (v) => { |
| | | if (this.factorName == 'WIND_DIRECTION') { |
| | | if (v < 0) { |
| | | return 360 + v; |
| | | } else if (v > 360) { |
| | | return v - 360; |
| | | } else { |
| | | return v; |
| | | } |
| | | } else { |
| | | return v; |
| | | } |
| | | }; |
| | | for (let i = 0; i < count - 1; i++) { |
| | | var _data = { |
| | | factorData: d1.factorData + dValue.factorData * (i + 1), |
| | | factorData: correct(d1.factorData + dValue.factorData * (i + 1)), |
| | | factorId: d1.factorId, |
| | | factorName: d1.factorName, |
| | | physicalQuantity: |
| | | d1.physicalQuantity + dValue.physicalQuantity * (i + 1), |
| | | // physicalQuantity: |
| | | // d1.physicalQuantity + dValue.physicalQuantity * (i + 1), |
| | | sensorId: d1.sensorId, |
| | | statusList: d1.statusList |
| | | }; |
| | | if (!isDraw) { |
| | | _data.factorData = -1; |
| | | _data.physicalQuantity = -1; |
| | | // _data.physicalQuantity = -1; |
| | | } |
| | | this.datas.push(_data); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import * as XLSX from 'xlsx/xlsx.mjs'; |
| | | |
| | | export default { |
| | | exportToExcel(exportData, sheet = 'Sheet1', excelName = 'data.xlsx') { |
| | | // å建xlsx对象 |
| | | const xls = XLSX.utils.json_to_sheet(exportData); |
| | | |
| | | // ç¼è¾è¡¨å¤´è¡ ä¿®æ¹è¡¨å¤´ |
| | | // excelColumnsName.forEach((item) => { |
| | | // xls[item[0]].v = item[1] |
| | | // }) |
| | | // å建workbookï¼å¹¶æsheetæ·»å è¿å» |
| | | const wb = XLSX.utils.book_new(); |
| | | XLSX.utils.book_append_sheet(wb, xls, sheet); |
| | | // å°workbook转为äºè¿å¶xlsxæä»¶å¹¶ä¸è½½ |
| | | XLSX.writeFile(wb, excelName); |
| | | } |
| | | }; |
| | |
| | | if (i == endIndex || i == factorDatas.length() - 1) { |
| | | break; |
| | | } |
| | | // å¨ç»è½¨è¿¹ |
| | | // å¨ç»è½¨è¿¹ï¼å·²ç»å¶é¨åï¼ |
| | | var animationData = factorDatas.getByIndex(0, i + 1); |
| | | |
| | | // è·¯å¾ç¹ |
| | |
| | | var d = distance / count; |
| | | // æ¯ä¸ªfps对åºçå®é
æ¶é¿(é»è®¤1ç§) |
| | | var t = 1; |
| | | // 两ç¹é´ä¸è¿ç»æ¶ |
| | | // 两ç¹é´ä¸è¿ç»æ¶ï¼ä½¿ç¨é»è®¤æ¶é¿ï¼é¿å
|
| | | if (distance > this.maxD) { |
| | | count = 4 * this._fps; |
| | | count = this.frameAnimation.taskPeriod * this._fps; |
| | | d = distance / count; |
| | | t = duration / (count / this._fps); |
| | | } |
| | | |
| | | // çæµæ°æ® |
| | | // çæµæ°æ®ï¼å¾
ç»å¶æ°æ®ç¹ï¼å¨å·²ç»å¶é¨ååè¯¥æ°æ®ç¹ä¹é´ï¼æå
¥å¨ç»å¸§æ°æ®ç¹ï¼ |
| | | // var fData1 = factorDatas.getByIndex(i, i + 1) |
| | | var fData2 = factorDatas.getByIndex(i + 1, i + 2); |
| | | |
| | |
| | | } |
| | | animationData.times.push(time); |
| | | } |
| | | // factor |
| | | // ç»æ¯ä¸ªçæµå åè¿è¡æå¸§ |
| | | for (const key in animationData.factor) { |
| | | var factor = animationData.factor[key]; |
| | | factor.insertFrame(fData2.factor[key], count, distance <= this.maxD); |
| | |
| | | import { factorUnit } from '@/constant/factor-unit'; |
| | | import { windDir } from '@/constant/wind-dir'; |
| | | import { map } from './index_old'; |
| | | import { checkboxOptions } from '@/constant/checkbox-options'; |
| | | |
| | | export const DialogUtil = { |
| | | show: true, |
| | |
| | | * @param {*} onClose å
³éå¼¹åºæ¡åè° |
| | | * @returns |
| | | */ |
| | | createInfoWindow(deviceCode, factorDatas, i, onClose) { |
| | | createInfoWindow(deviceType, deviceCode, factorDatas, i, onClose) { |
| | | let m = { |
| | | deviceType: deviceType, |
| | | deviceCode: deviceCode, |
| | | data: factorDatas, |
| | | index: i, |
| | |
| | | return m.window; |
| | | }, |
| | | |
| | | createInfoWindow2(factorData, onClose) { |
| | | let m = { |
| | | time: factorData.time, |
| | | factorList: factorData.values, |
| | | window: '', |
| | | close: onClose |
| | | }; |
| | | // eslint-disable-next-line no-undef |
| | | m.window = new AMap.InfoWindow({ |
| | | isCustom: true, //使ç¨èªå®ä¹çªä½ |
| | | content: this.createWindowContent2(m), |
| | | // eslint-disable-next-line no-undef |
| | | offset: new AMap.Pixel(16, -45) |
| | | }); |
| | | return m.window; |
| | | }, |
| | | /** |
| | | * ç«ç¹æ è®°ä¿¡æ¯çªä½ |
| | | */ |
| | |
| | | }, |
| | | |
| | | createWindowContent2(marker) { |
| | | const factorTypes = checkboxOptions(marker.deviceType); |
| | | const time = marker.time; |
| | | const factorList = marker.factorList; |
| | | //å®ä¾åä¿¡æ¯çªä½ |
| | |
| | | var _contents = new Map(); |
| | | factorList.forEach((f) => { |
| | | // å é䏿¾ç¤ºçå å |
| | | if ( |
| | | f.factorName == 'NOI' || |
| | | f.factorName == 'LNG' || |
| | | f.factorName == 'LAT' || |
| | | f.factorName == 'VELOCITY' || |
| | | f.factorName == 'TIME' || |
| | | f.factorName == 'HEIGHT' |
| | | ) { |
| | | // if ( |
| | | // f.factorName == 'NOI' || |
| | | // f.factorName == 'LNG' || |
| | | // f.factorName == 'LAT' || |
| | | // f.factorName == 'VELOCITY' || |
| | | // f.factorName == 'TIME' || |
| | | // f.factorName == 'HEIGHT' |
| | | // ) { |
| | | // return; |
| | | // } |
| | | if (!factorTypes.find((v) => v.name == f.factorName)) { |
| | | return; |
| | | } |
| | | |
| | |
| | | return info; |
| | | }, |
| | | |
| | | openNewWindow(deviceCode, factorDatas, i, onClose) { |
| | | openNewWindow(deviceType, deviceCode, factorDatas, i, onClose) { |
| | | if (!this.show) return; |
| | | const window = this.createInfoWindow(deviceCode, factorDatas, i, onClose); |
| | | const window = this.createInfoWindow( |
| | | deviceType, |
| | | deviceCode, |
| | | factorDatas, |
| | | i, |
| | | onClose |
| | | ); |
| | | window.open(map, factorDatas.lnglats_GD[i]); |
| | | }, |
| | | |
| | | openNewWindow2(factorData, position, onClose) { |
| | | if (!this.show) return; |
| | | const window = this.createInfoWindow2(factorData, onClose); |
| | | window.open(map, position); |
| | | } |
| | | }; |
| | |
| | | @table-click="handelIndexChange" |
| | | :factor-datas="factorDatas" |
| | | :device-type="deviceType" |
| | | :device-code="deviceCode" |
| | | ></DataSheet> |
| | | </div> |
| | | </template> |
| | |
| | | mapUtil.setCenter(pr.p); |
| | | // mapUtil.setFitSector(pr); |
| | | // 2. ç»å¶å¯¹è¯æ¡ |
| | | DialogUtil.openNewWindow(this.deviceCode, this.factorDatas, index, () => { |
| | | // ç§»é¤æå½¢åºå |
| | | sector.clearSector(); |
| | | }); |
| | | DialogUtil.openNewWindow( |
| | | this.deviceType, |
| | | this.deviceCode, |
| | | this.factorDatas, |
| | | index, |
| | | () => { |
| | | // ç§»é¤æå½¢åºå |
| | | sector.clearSector(); |
| | | } |
| | | ); |
| | | }, |
| | | onFetchData(deviceType, data) { |
| | | // todo æ ¹æ®è®¾å¤ç±»å忢å°å¾çæµå åå±ç¤ºåéæ¡ãæçº¿å¾å¤éæ¡ãæ°æ®è¡¨æ ¼å¤éæ¡çå åç±»å |
| | |
| | | :select-factor-type="selectFactorType" |
| | | :factor-datas="factorDatas" |
| | | :device-type="deviceType" |
| | | :device-code="deviceCode" |
| | | :locate-index="locateIndex" |
| | | @table-click="handleTableClick" |
| | | ></DataTable> |
| | |
| | | // type0: è½¦è½½ææ äººæº; type1:æ äººè¹ |
| | | default: TYPE0 |
| | | }, |
| | | deviceCode: String, |
| | | // å½åéä¸é«äº®çæ°æ®ç¹ç´¢å¼ |
| | | locateIndex: Number |
| | | }, |