From c40500d288339cd9b2200f8f909e3cd5471c0c22 Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期五, 30 八月 2024 17:38:29 +0800 Subject: [PATCH] 1. 优化3D动画中风向的变化逻辑; 2. 修复折线图切换因子时,数据直接跳转至起始处的问题; 3. 折线图和表格加回风向因子; 4. 优化风向的均值计算为矢量计算,同时最大最小值不显示; 5. 新增表格数据导出功能; --- src/components/monitor/DataTable.vue | 119 +++++++++++- src/utils/map/animation.js | 10 src/views/historymode/HistoryMode.vue | 15 + package-lock.json | 156 +++++++++++++++++ src/utils/map/dialog.js | 56 ++--- src/components/monitor/DataSummary.vue | 93 +++++++-- package.json | 1 src/model/Factor.js | 39 +++ src/views/historymode/component/DataSheet.vue | 2 src/components/chart/ProgressLineChart.vue | 3 src/constant/checkbox-options/options-jingan.js | 10 src/utils/file.js | 18 ++ 12 files changed, 426 insertions(+), 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index 61ffb58..4c6118f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "unplugin-vue-components": "^0.26.0", "vue": "^3.4.21", "vue-router": "^4.3.0", + "xlsx": "^0.18.5", "xml2json": "^0.12.0" }, "devDependencies": { @@ -1371,6 +1372,14 @@ "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", @@ -1601,6 +1610,18 @@ "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", @@ -1688,6 +1709,14 @@ "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", @@ -1750,6 +1779,17 @@ "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", @@ -2598,6 +2638,14 @@ }, "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": { @@ -4507,6 +4555,17 @@ "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", @@ -5324,6 +5383,22 @@ "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", @@ -5427,6 +5502,26 @@ "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": { @@ -6419,6 +6514,11 @@ "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", @@ -6607,6 +6707,15 @@ "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", @@ -6676,6 +6785,11 @@ "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", @@ -6729,6 +6843,11 @@ "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", @@ -7384,6 +7503,11 @@ "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", @@ -8822,6 +8946,14 @@ "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", @@ -9399,6 +9531,16 @@ "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", @@ -9475,6 +9617,20 @@ "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", diff --git a/package.json b/package.json index c9aa419..afe157a 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "unplugin-vue-components": "^0.26.0", "vue": "^3.4.21", "vue-router": "^4.3.0", + "xlsx": "^0.18.5", "xml2json": "^0.12.0" }, "devDependencies": { diff --git a/src/components/chart/ProgressLineChart.vue b/src/components/chart/ProgressLineChart.vue index 861af1e..482740d 100644 --- a/src/components/chart/ProgressLineChart.vue +++ b/src/components/chart/ProgressLineChart.vue @@ -128,7 +128,8 @@ }, // 淇敼鍥捐〃灞曠ず鐨勬姌绾垮浘绫诲瀷 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() { diff --git a/src/components/monitor/DataSummary.vue b/src/components/monitor/DataSummary.vue index 39a61f0..250cdd7 100644 --- a/src/components/monitor/DataSummary.vue +++ b/src/components/monitor/DataSummary.vue @@ -26,7 +26,7 @@ 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> @@ -38,6 +38,7 @@ <script> import { FactorDatas } from '@/model/FactorDatas'; import { factorName } from '@/constant/factor-name'; +import { windDir } from '@/constant/wind-dir'; export default { props: { @@ -56,29 +57,40 @@ 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; @@ -88,6 +100,39 @@ 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: 鐪熷疄瑙掑害澶勪簬绗竴璞¢檺锛屼慨姝e�间负+0掳 + * avgU>0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗簩璞¢檺锛屼慨姝e�间负+180掳 + * avgU<0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗笁璞¢檺锛屼慨姝e�间负+180掳 + * avgU<0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗洓璞¢檺锛屼慨姝e�间负+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> diff --git a/src/components/monitor/DataTable.vue b/src/components/monitor/DataTable.vue index 217aeb9..b99e67a 100644 --- a/src/components/monitor/DataTable.vue +++ b/src/components/monitor/DataTable.vue @@ -1,3 +1,4 @@ +<!-- eslint-disable no-unused-vars --> <template> <BaseCard size="medium" direction="right"> <template #content> @@ -34,6 +35,7 @@ v-if="selectFactorType.includes(item.value)" :prop="item.name" :label="item.label" + :formatter="factorFormatter" align="center" width="79" sortable="custom" @@ -54,7 +56,18 @@ </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 > @@ -69,6 +82,7 @@ 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: { @@ -79,6 +93,7 @@ // type0: 杞﹁浇鎴栨棤浜烘満; type1:鏃犱汉鑸� default: TYPE0 }, + deviceCode: String, selectFactorType: { type: Array, default: () => [] @@ -92,21 +107,39 @@ 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: { @@ -118,9 +151,6 @@ 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, @@ -134,16 +164,28 @@ } 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) { @@ -160,6 +202,13 @@ 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); @@ -167,9 +216,45 @@ // 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; } } }; diff --git a/src/constant/checkbox-options/options-jingan.js b/src/constant/checkbox-options/options-jingan.js index 7d23581..f270d4d 100644 --- a/src/constant/checkbox-options/options-jingan.js +++ b/src/constant/checkbox-options/options-jingan.js @@ -42,10 +42,10 @@ label: '椋庨��', name: 'WIND_SPEED', value: '16' + }, + { + label: '椋庡悜', + name: 'WIND_DIRECTION', + value: '17' } - // { - // label: '椋庡悜', - // name: 'WIND_DIRECTION', - // value: '17' - // } ]; diff --git a/src/model/Factor.js b/src/model/Factor.js index 354a585..1aaa149 100644 --- a/src/model/Factor.js +++ b/src/model/Factor.js @@ -194,24 +194,49 @@ if (d1 == undefined || d2 == undefined) { return; } + let diffValue = d2.factorData - d1.factorData; + // 瀵逛簬椋庡悜鐭㈤噺鏉ヨ锛屽姩鐢荤殑鍙樺寲搴旇浠庝袱涓鍚戝す瑙掕緝灏忕殑閭d竴渚ц繘琛屽彉鍖� + 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); } diff --git a/src/utils/file.js b/src/utils/file.js new file mode 100644 index 0000000..61fcfa3 --- /dev/null +++ b/src/utils/file.js @@ -0,0 +1,18 @@ +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锛屽苟鎶妔heet娣诲姞杩涘幓 + const wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, xls, sheet); + // 灏唚orkbook杞负浜岃繘鍒秞lsx鏂囦欢骞朵笅杞� + XLSX.writeFile(wb, excelName); + } +}; diff --git a/src/utils/map/animation.js b/src/utils/map/animation.js index 6ac8216..4180e7d 100644 --- a/src/utils/map/animation.js +++ b/src/utils/map/animation.js @@ -83,7 +83,7 @@ if (i == endIndex || i == factorDatas.length() - 1) { break; } - // 鍔ㄧ敾杞ㄨ抗 + // 鍔ㄧ敾杞ㄨ抗锛堝凡缁樺埗閮ㄥ垎锛� var animationData = factorDatas.getByIndex(0, i + 1); // 璺緞鐐� @@ -105,14 +105,14 @@ 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); @@ -135,7 +135,7 @@ } 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); diff --git a/src/utils/map/dialog.js b/src/utils/map/dialog.js index 713af62..5c1ada9 100644 --- a/src/utils/map/dialog.js +++ b/src/utils/map/dialog.js @@ -3,6 +3,7 @@ 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, @@ -21,8 +22,9 @@ * @param {*} onClose 鍏抽棴寮瑰嚭妗嗗洖璋� * @returns */ - createInfoWindow(deviceCode, factorDatas, i, onClose) { + createInfoWindow(deviceType, deviceCode, factorDatas, i, onClose) { let m = { + deviceType: deviceType, deviceCode: deviceCode, data: factorDatas, index: i, @@ -40,22 +42,6 @@ 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; - }, /** * 绔欑偣鏍囪淇℃伅绐椾綋 */ @@ -74,6 +60,7 @@ }, createWindowContent2(marker) { + const factorTypes = checkboxOptions(marker.deviceType); const time = marker.time; const factorList = marker.factorList; //瀹炰緥鍖栦俊鎭獥浣� @@ -89,14 +76,17 @@ 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; } @@ -253,15 +243,15 @@ 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); } }; diff --git a/src/views/historymode/HistoryMode.vue b/src/views/historymode/HistoryMode.vue index d75c5b2..cbf22c8 100644 --- a/src/views/historymode/HistoryMode.vue +++ b/src/views/historymode/HistoryMode.vue @@ -42,6 +42,7 @@ @table-click="handelIndexChange" :factor-datas="factorDatas" :device-type="deviceType" + :device-code="deviceCode" ></DataSheet> </div> </template> @@ -152,10 +153,16 @@ 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 鏍规嵁璁惧绫诲瀷鍒囨崲鍦板浘鐩戞祴鍥犲瓙灞曠ず鍗曢�夋銆佹姌绾垮浘澶嶉�夋銆佹暟鎹〃鏍煎閫夋鐨勫洜瀛愮被鍨� diff --git a/src/views/historymode/component/DataSheet.vue b/src/views/historymode/component/DataSheet.vue index 778d322..8caa27a 100644 --- a/src/views/historymode/component/DataSheet.vue +++ b/src/views/historymode/component/DataSheet.vue @@ -24,6 +24,7 @@ :select-factor-type="selectFactorType" :factor-datas="factorDatas" :device-type="deviceType" + :device-code="deviceCode" :locate-index="locateIndex" @table-click="handleTableClick" ></DataTable> @@ -58,6 +59,7 @@ // type0: 杞﹁浇鎴栨棤浜烘満; type1:鏃犱汉鑸� default: TYPE0 }, + deviceCode: String, // 褰撳墠閫変腑楂樹寒鐨勬暟鎹偣绱㈠紩 locateIndex: Number }, -- Gitblit v1.9.3