| | |
| | | "@fortawesome/vue-fontawesome": "^3.0.6", |
| | | "@vueuse/core": "^10.9.0", |
| | | "axios": "^1.6.8", |
| | | "docxtemplater": "^3.65.3", |
| | | "docxtemplater-image-module-free": "^1.1.1", |
| | | "echarts": "^5.5.0", |
| | | "element-plus": "^2.6.2", |
| | | "file-saver": "^2.0.5", |
| | | "jquery": "^3.7.1", |
| | | "jquery-xml2json": "^0.0.8", |
| | | "jquery.soap": "^1.7.3", |
| | | "js-base64": "^3.7.7", |
| | | "jszip-utils": "^0.1.0", |
| | | "moment": "^2.30.1", |
| | | "pinia": "^2.1.7", |
| | | "pizzip": "^3.2.0", |
| | | "strong-soap": "^4.1.3", |
| | | "unplugin-vue-components": "^0.26.0", |
| | | "vue": "^3.4.21", |
| | |
| | | "node": ">=6.0.0" |
| | | } |
| | | }, |
| | | "node_modules/docxtemplater": { |
| | | "version": "3.65.3", |
| | | "resolved": "https://registry.npmmirror.com/docxtemplater/-/docxtemplater-3.65.3.tgz", |
| | | "integrity": "sha512-NMCUehaHAz1itLGBz+GhVMX6gQ/ipqDicPoTPJ+ss/i9Jx7CVPuPj8yNPmvMFGgDrkZV8tOTTz6h/YXAztBDPA==", |
| | | "dependencies": { |
| | | "@xmldom/xmldom": "^0.9.8" |
| | | }, |
| | | "engines": { |
| | | "node": ">=0.10" |
| | | } |
| | | }, |
| | | "node_modules/docxtemplater-image-module-free": { |
| | | "version": "1.1.1", |
| | | "resolved": "https://registry.npmmirror.com/docxtemplater-image-module-free/-/docxtemplater-image-module-free-1.1.1.tgz", |
| | | "integrity": "sha512-aWOzVQN7ggDYjfoy3pTTNrcrZ7/CJrQcI9cT+hmyHE6nRLR67nt5yPFPe9hm9VWbfYIED2fi+3itOnF0TE/RWQ==", |
| | | "dependencies": { |
| | | "xmldom": "^0.1.27" |
| | | } |
| | | }, |
| | | "node_modules/docxtemplater/node_modules/@xmldom/xmldom": { |
| | | "version": "0.9.8", |
| | | "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.9.8.tgz", |
| | | "integrity": "sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==", |
| | | "engines": { |
| | | "node": ">=14.6" |
| | | } |
| | | }, |
| | | "node_modules/dom-serializer": { |
| | | "version": "2.0.0", |
| | | "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", |
| | |
| | | "engines": { |
| | | "node": "^10.12.0 || >=12.0.0" |
| | | } |
| | | }, |
| | | "node_modules/file-saver": { |
| | | "version": "2.0.5", |
| | | "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz", |
| | | "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" |
| | | }, |
| | | "node_modules/file-uri-to-path": { |
| | | "version": "1.0.0", |
| | |
| | | "verror": "1.10.0" |
| | | } |
| | | }, |
| | | "node_modules/jszip-utils": { |
| | | "version": "0.1.0", |
| | | "resolved": "https://registry.npmmirror.com/jszip-utils/-/jszip-utils-0.1.0.tgz", |
| | | "integrity": "sha512-tBNe0o3HAf8vo0BrOYnLPnXNo5A3KsRMnkBFYjh20Y3GPYGfgyoclEMgvVchx0nnL+mherPi74yLPIusHUQpZg==" |
| | | }, |
| | | "node_modules/keyv": { |
| | | "version": "4.5.4", |
| | | "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", |
| | |
| | | "node": ">=10" |
| | | } |
| | | }, |
| | | "node_modules/pako": { |
| | | "version": "2.1.0", |
| | | "resolved": "https://registry.npmmirror.com/pako/-/pako-2.1.0.tgz", |
| | | "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" |
| | | }, |
| | | "node_modules/parent-module": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", |
| | |
| | | "@vue/composition-api": { |
| | | "optional": true |
| | | } |
| | | } |
| | | }, |
| | | "node_modules/pizzip": { |
| | | "version": "3.2.0", |
| | | "resolved": "https://registry.npmmirror.com/pizzip/-/pizzip-3.2.0.tgz", |
| | | "integrity": "sha512-X4NPNICxCfIK8VYhF6wbksn81vTiziyLbvKuORVAmolvnUzl1A1xmz9DAWKxPRq9lZg84pJOOAMq3OE61bD8IQ==", |
| | | "dependencies": { |
| | | "pako": "^2.1.0" |
| | | } |
| | | }, |
| | | "node_modules/pkg-types": { |
| | |
| | | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", |
| | | "dev": true |
| | | }, |
| | | "node_modules/xmldom": { |
| | | "version": "0.1.31", |
| | | "resolved": "https://registry.npmmirror.com/xmldom/-/xmldom-0.1.31.tgz", |
| | | "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", |
| | | "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", |
| | | "engines": { |
| | | "node": ">=0.1" |
| | | } |
| | | }, |
| | | "node_modules/yallist": { |
| | | "version": "4.0.0", |
| | | "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", |
| | |
| | | "esutils": "^2.0.2" |
| | | } |
| | | }, |
| | | "docxtemplater": { |
| | | "version": "3.65.3", |
| | | "resolved": "https://registry.npmmirror.com/docxtemplater/-/docxtemplater-3.65.3.tgz", |
| | | "integrity": "sha512-NMCUehaHAz1itLGBz+GhVMX6gQ/ipqDicPoTPJ+ss/i9Jx7CVPuPj8yNPmvMFGgDrkZV8tOTTz6h/YXAztBDPA==", |
| | | "requires": { |
| | | "@xmldom/xmldom": "^0.9.8" |
| | | }, |
| | | "dependencies": { |
| | | "@xmldom/xmldom": { |
| | | "version": "0.9.8", |
| | | "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.9.8.tgz", |
| | | "integrity": "sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==" |
| | | } |
| | | } |
| | | }, |
| | | "docxtemplater-image-module-free": { |
| | | "version": "1.1.1", |
| | | "resolved": "https://registry.npmmirror.com/docxtemplater-image-module-free/-/docxtemplater-image-module-free-1.1.1.tgz", |
| | | "integrity": "sha512-aWOzVQN7ggDYjfoy3pTTNrcrZ7/CJrQcI9cT+hmyHE6nRLR67nt5yPFPe9hm9VWbfYIED2fi+3itOnF0TE/RWQ==", |
| | | "requires": { |
| | | "xmldom": "^0.1.27" |
| | | } |
| | | }, |
| | | "dom-serializer": { |
| | | "version": "2.0.0", |
| | | "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", |
| | |
| | | "requires": { |
| | | "flat-cache": "^3.0.4" |
| | | } |
| | | }, |
| | | "file-saver": { |
| | | "version": "2.0.5", |
| | | "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz", |
| | | "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" |
| | | }, |
| | | "file-uri-to-path": { |
| | | "version": "1.0.0", |
| | |
| | | "verror": "1.10.0" |
| | | } |
| | | }, |
| | | "jszip-utils": { |
| | | "version": "0.1.0", |
| | | "resolved": "https://registry.npmmirror.com/jszip-utils/-/jszip-utils-0.1.0.tgz", |
| | | "integrity": "sha512-tBNe0o3HAf8vo0BrOYnLPnXNo5A3KsRMnkBFYjh20Y3GPYGfgyoclEMgvVchx0nnL+mherPi74yLPIusHUQpZg==" |
| | | }, |
| | | "keyv": { |
| | | "version": "4.5.4", |
| | | "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", |
| | |
| | | "p-limit": "^3.0.2" |
| | | } |
| | | }, |
| | | "pako": { |
| | | "version": "2.1.0", |
| | | "resolved": "https://registry.npmmirror.com/pako/-/pako-2.1.0.tgz", |
| | | "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" |
| | | }, |
| | | "parent-module": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", |
| | |
| | | "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", |
| | | "requires": {} |
| | | } |
| | | } |
| | | }, |
| | | "pizzip": { |
| | | "version": "3.2.0", |
| | | "resolved": "https://registry.npmmirror.com/pizzip/-/pizzip-3.2.0.tgz", |
| | | "integrity": "sha512-X4NPNICxCfIK8VYhF6wbksn81vTiziyLbvKuORVAmolvnUzl1A1xmz9DAWKxPRq9lZg84pJOOAMq3OE61bD8IQ==", |
| | | "requires": { |
| | | "pako": "^2.1.0" |
| | | } |
| | | }, |
| | | "pkg-types": { |
| | |
| | | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", |
| | | "dev": true |
| | | }, |
| | | "xmldom": { |
| | | "version": "0.1.31", |
| | | "resolved": "https://registry.npmmirror.com/xmldom/-/xmldom-0.1.31.tgz", |
| | | "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" |
| | | }, |
| | | "yallist": { |
| | | "version": "4.0.0", |
| | | "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", |
| | |
| | | "@fortawesome/vue-fontawesome": "^3.0.6", |
| | | "@vueuse/core": "^10.9.0", |
| | | "axios": "^1.6.8", |
| | | "docxtemplater": "^3.65.3", |
| | | "docxtemplater-image-module-free": "^1.1.1", |
| | | "echarts": "^5.5.0", |
| | | "element-plus": "^2.6.2", |
| | | "file-saver": "^2.0.5", |
| | | "jquery": "^3.7.1", |
| | | "jquery-xml2json": "^0.0.8", |
| | | "jquery.soap": "^1.7.3", |
| | | "js-base64": "^3.7.7", |
| | | "jszip-utils": "^0.1.0", |
| | | "moment": "^2.30.1", |
| | | "pinia": "^2.1.7", |
| | | "pizzip": "^3.2.0", |
| | | "strong-soap": "^4.1.3", |
| | | "unplugin-vue-components": "^0.26.0", |
| | | "vue": "^3.4.21", |
| | |
| | | return $http |
| | | .get(`air/analysis/pollution/trace/history`, { params: { missionCode } }) |
| | | .then((res) => res.data); |
| | | }, |
| | | |
| | | /** |
| | | * è·åèµ°èªä»»å¡æ±æ»ç»è®¡ |
| | | * @param {*} startTime å¼å§æ¶é´ï¼æ ¼å¼YYYY-MM-DD HH:mm:ss |
| | | * @param {*} endTime ç»ææ¶é´ï¼æ ¼å¼YYYY-MM-DD HH:mm:ss |
| | | * @param {*} area åºå |
| | | * @returns |
| | | */ |
| | | fetchMissionSummary({ startTime, endTime, area }) { |
| | | return $http |
| | | .post(`air/analysis/report/missionSummary`, area, { |
| | | params: { startTime, endTime } |
| | | }) |
| | | .then((res) => res.data); |
| | | }, |
| | | |
| | | /** |
| | | * è·åèµ°èªä»»å¡æ¸
å |
| | | * @param {*} startTime å¼å§æ¶é´ï¼æ ¼å¼YYYY-MM-DD HH:mm:ss |
| | | * @param {*} endTime ç»ææ¶é´ï¼æ ¼å¼YYYY-MM-DD HH:mm:ss |
| | | * @param {*} area åºå |
| | | * @returns |
| | | */ |
| | | fetchMissionList({ startTime, endTime, area }) { |
| | | return $http |
| | | .post(`air/analysis/report/missionList`, area, { |
| | | params: { startTime, endTime } |
| | | }) |
| | | .then((res) => res.data); |
| | | }, |
| | | |
| | | /** |
| | | * è·åèµ°èªä»»å¡è¯¦æ
|
| | | * @param {*} startTime å¼å§æ¶é´ï¼æ ¼å¼YYYY-MM-DD HH:mm:ss |
| | | * @param {*} endTime ç»ææ¶é´ï¼æ ¼å¼YYYY-MM-DD HH:mm:ss |
| | | * @param {*} area åºå |
| | | * @returns |
| | | */ |
| | | fetchMissionDetail({ startTime, endTime, area }) { |
| | | return $http |
| | | .post(`air/analysis/report/missionDetail`, area, { |
| | | params: { startTime, endTime } |
| | | }) |
| | | .then((res) => res.data); |
| | | }, |
| | | |
| | | /** |
| | | * è·åèµ°èªå
¸å鿣åºå |
| | | * @param {*} startTime å¼å§æ¶é´ï¼æ ¼å¼YYYY-MM-DD HH:mm:ss |
| | | * @param {*} endTime ç»ææ¶é´ï¼æ ¼å¼YYYY-MM-DD HH:mm:ss |
| | | * @param {*} area åºå |
| | | * @returns |
| | | */ |
| | | fetchClueByRiskArea({ startTime, endTime, area }) { |
| | | return $http |
| | | .post(`air/analysis/report/clueByRiskArea`, area, { |
| | | params: { startTime, endTime } |
| | | }) |
| | | .then((res) => res.data); |
| | | } |
| | | }; |
| | |
| | | import axios from 'axios'; |
| | | import { ElMessage } from 'element-plus'; |
| | | |
| | | const openLog = false; |
| | | const debug = false; |
| | | const openLog = true; |
| | | const debug = true; |
| | | |
| | | let ip1 = 'http://47.100.191.150:9029/'; |
| | | let ws = `47.100.191.150:9031`; |
| | |
| | | 'CardDialog copy': typeof import('./components/CardDialog copy.vue')['default'] |
| | | CheckButton: typeof import('./components/common/CheckButton.vue')['default'] |
| | | ConfigManage: typeof import('./components/map/ConfigManage.vue')['default'] |
| | | copy: typeof import('./components/CardDialog copy.vue')['default'] |
| | | CoreHeader: typeof import('./components/core/CoreHeader.vue')['default'] |
| | | CoreMenu: typeof import('./components/core/CoreMenu.vue')['default'] |
| | | DataSummary: typeof import('./components/monitor/DataSummary.vue')['default'] |
| | |
| | | ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] |
| | | ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] |
| | | ElDialog: typeof import('element-plus/es')['ElDialog'] |
| | | ElDivider: typeof import('element-plus/es')['ElDivider'] |
| | | ElDropdown: typeof import('element-plus/es')['ElDropdown'] |
| | | ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] |
| | | ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] |
| | |
| | | ElFormItem: typeof import('element-plus/es')['ElFormItem'] |
| | | ElIcon: typeof import('element-plus/es')['ElIcon'] |
| | | ElInput: typeof import('element-plus/es')['ElInput'] |
| | | ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] |
| | | ElLink: typeof import('element-plus/es')['ElLink'] |
| | | ElOption: typeof import('element-plus/es')['ElOption'] |
| | | ElPagination: typeof import('element-plus/es')['ElPagination'] |
| | |
| | | 设å¤ç®¡ç |
| | | </el-button> |
| | | </el-dropdown-item> |
| | | <el-dropdown-item> |
| | | <el-button |
| | | type="info" |
| | | icon="Document" |
| | | plain |
| | | @click="reportVisible = !reportVisible" |
| | | > |
| | | èµ°èªæ¥å |
| | | </el-button> |
| | | </el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </template> |
| | | </el-dropdown> |
| | | <MissionManage v-model="missionVisible"></MissionManage> |
| | | <DeviceManage v-model="deviceVisible"></DeviceManage> |
| | | <MissionReport v-model="reportVisible"></MissionReport> |
| | | </template> |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | missionVisible: false, |
| | | deviceVisible: false |
| | | }; |
| | | }, |
| | | methods: {} |
| | | }; |
| | | <script setup> |
| | | import MissionReport from '@/views/historymode/component/MissionReport.vue'; |
| | | import { ref } from 'vue'; |
| | | |
| | | const missionVisible = ref(false); |
| | | const deviceVisible = ref(false); |
| | | const reportVisible = ref(false); |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import JSZipUtils from 'jszip-utils'; |
| | | import docxtemplater from 'docxtemplater'; |
| | | import ImageModule from 'docxtemplater-image-module-free'; |
| | | import Pizzip from 'pizzip'; |
| | | import FileSaver from 'file-saver'; |
| | | |
| | | /** |
| | | * çæ¯ä¾ç¼©æ¾å¾ç |
| | | * æ ¹æ®å¾ççé¿å®½æ¯è¿è¡ä¸åæ¹å¼çç¼©æ¾ |
| | | * å¦æå®½åº¦å¤§äºé«åº¦ï¼æ¨ªæå¾çï¼ï¼åæç
§è®¾å®é«åº¦çæ¯ç¼©æ¾ï¼ |
| | | * å¦æå®½åº¦å°äºé«åº¦ï¼ç«æå¾çï¼ï¼åæç
§è®¾å®å®½åº¦çæ¯ç¼©æ¾ï¼ |
| | | * @param {Number} horizontalHeight 设å®é«åº¦ |
| | | * @param {Number} verticalWidth 设å®å®½åº¦ |
| | | * @param {*} img |
| | | * @param {*} tagValue |
| | | * @param {*} tagName |
| | | * @returns |
| | | */ |
| | | function getSizeProportional( |
| | | horizontalHeight, |
| | | verticalWidth, |
| | | img, |
| | | tagValue, |
| | | tagName |
| | | ) { |
| | | return new Promise(function (resolve, reject) { |
| | | const image = new Image(); |
| | | image.src = tagValue; |
| | | image.onload = function () { |
| | | let width = image.width; |
| | | let height = image.height; |
| | | // console.log('width height', width, height); |
| | | |
| | | if (width > height && horizontalHeight && height > horizontalHeight) { |
| | | const scale = image.height / horizontalHeight; |
| | | height = horizontalHeight; |
| | | width = image.width / scale; |
| | | } else if (width <= height && verticalWidth && width > verticalWidth) { |
| | | const scale = image.width / verticalWidth; |
| | | width = verticalWidth; |
| | | height = image.height / scale; |
| | | } |
| | | // console.log('scale', width, height); |
| | | |
| | | resolve([width, height]); |
| | | }; |
| | | image.onerror = function (e) { |
| | | console.log('img, tagValue, tagName : ', img, tagValue, tagName); |
| | | alert('An error occured while loading ' + tagValue); |
| | | reject(e); |
| | | }; |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * åºå®å¤§å°ç¼©æ¾å¾ç |
| | | * æ ¹æ®å¾ççé¿å®½æ¯è¿è¡ä¸åæ¹å¼çç¼©æ¾ |
| | | * å¦æå®½åº¦å¤§äºé«åº¦ï¼æ¨ªæå¾çï¼ï¼åæç
§è®¾å®é«åº¦å宽髿¯ç¼©æ¾ï¼ |
| | | * å¦æå®½åº¦å°äºé«åº¦ï¼ç«æå¾çï¼ï¼åæç
§è®¾å®å®½åº¦å宽髿¯ç¼©æ¾ï¼ |
| | | * @param {*} horizontalHeight 设å®é«åº¦ |
| | | * @param {*} verticalWidth 设å®å®½åº¦ |
| | | * @param {*} scale ç¼©æ¾æ¯ä¾ï¼é¿è¾¹é¤çè¾¹çæ¯ä¾ç³»æ° |
| | | * @param {*} img |
| | | * @param {*} tagValue |
| | | * @param {*} tagName |
| | | * @returns |
| | | */ |
| | | function getSizeFixed( |
| | | horizontalHeight, |
| | | verticalWidth, |
| | | scale, |
| | | img, |
| | | tagValue, |
| | | tagName |
| | | ) { |
| | | return new Promise(function (resolve, reject) { |
| | | const image = new Image(); |
| | | image.src = tagValue; |
| | | image.onload = function () { |
| | | let width = image.width; |
| | | let height = image.height; |
| | | |
| | | if ( |
| | | width > height && |
| | | horizontalHeight && |
| | | height > horizontalHeight && |
| | | scale |
| | | ) { |
| | | height = horizontalHeight; |
| | | width = horizontalHeight * scale; |
| | | } else if ( |
| | | width <= height && |
| | | verticalWidth && |
| | | width > verticalWidth && |
| | | scale |
| | | ) { |
| | | width = verticalWidth; |
| | | height = verticalWidth * scale; |
| | | } |
| | | resolve([width, height]); |
| | | }; |
| | | image.onerror = function (e) { |
| | | console.log('img, tagValue, tagName : ', img, tagValue, tagName); |
| | | alert('An error occured while loading ' + tagValue); |
| | | reject(e); |
| | | }; |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * è·åå¾çé
ç½®ä¿¡æ¯ |
| | | * @param {Number} horizontalHeight å¾ç宽度大äºé«åº¦æ¶ï¼éå¶å
¶é«åº¦ |
| | | * @param {Number} verticalWidth å¾ç宽度å°äºé«åº¦æ¶ï¼éå¶å
¶å®½åº¦ |
| | | * @returns |
| | | */ |
| | | function getImageOptions(options) { |
| | | const horizontalHeight = options ? options.horizontalHeight : undefined; |
| | | const verticalWidth = options ? options.verticalWidth : undefined; |
| | | return { |
| | | centered: false, |
| | | fileType: 'docx', |
| | | getImage(tagValue) { |
| | | // In this case tagValue will be a URL tagValue = "https://docxtemplater.com/puffin.png" |
| | | return new Promise(function (resolve, reject) { |
| | | JSZipUtils.getBinaryContent(tagValue, function (error, content) { |
| | | if (error) { |
| | | return reject(error); |
| | | } |
| | | return resolve(content); |
| | | }); |
| | | }); |
| | | }, |
| | | |
| | | getSize(img, tagValue, tagName) { |
| | | // return getSizeProportional(horizontalHeight, verticalWidth, img, tagValue, tagName) |
| | | return getSizeFixed( |
| | | horizontalHeight, |
| | | verticalWidth, |
| | | options.scale, |
| | | img, |
| | | tagValue, |
| | | tagName |
| | | ); |
| | | } |
| | | }; |
| | | } |
| | | |
| | | export const exportDocx = (tempDocpath, data, zipName, imageSize) => { |
| | | return new Promise((resolve, reject) => { |
| | | JSZipUtils.getBinaryContent(tempDocpath, (error, content) => { |
| | | if (error) { |
| | | reject(error); |
| | | throw error; |
| | | } |
| | | const zip = new Pizzip(content); |
| | | let doc = new docxtemplater() |
| | | .setOptions({ paragraphLoop: true }) |
| | | .loadZip(zip); |
| | | |
| | | if (imageSize) { |
| | | const imageOptions = getImageOptions(imageSize); |
| | | doc.attachModule(new ImageModule(imageOptions)); |
| | | } |
| | | doc.compile(); |
| | | doc.resolveData(data).then(() => { |
| | | try { |
| | | doc.render(); |
| | | } catch (error) { |
| | | console.log(error); |
| | | throw error; |
| | | } |
| | | const out = doc.getZip().generate({ |
| | | type: 'blob', |
| | | mimeType: |
| | | 'application/vnd.openxmlformats-officedocumnet.wordprocessingml.document' |
| | | }); |
| | | FileSaver.saveAs(out, zipName); |
| | | resolve(); |
| | | }); |
| | | }); |
| | | }); |
| | | }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <!-- <el-button type="primary" class="el-button-custom" @click="handleClick"> |
| | | ä¸è½½æ¥å |
| | | </el-button> --> |
| | | <CardDialog v-bind="$attrs" title="èµ°èªæ¥åçæ"> |
| | | <el-form ref="formRef" label-width="120px"> |
| | | <el-form-item label="åºå" prop="area"> |
| | | <OptionLocation2 |
| | | :level="3" |
| | | :initValue="false" |
| | | :checkStrictly="false" |
| | | :allOption="false" |
| | | v-model="formObj.location" |
| | | ></OptionLocation2> |
| | | </el-form-item> |
| | | <OptionTime v-model="formObj.timeArray"></OptionTime> |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | class="el-button-custom" |
| | | @click="handleClick" |
| | | :loading="docLoading" |
| | | > |
| | | ä¸è½½æ¥å |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </CardDialog> |
| | | </template> |
| | | <script setup> |
| | | import { computed, ref } from 'vue'; |
| | | import moment from 'moment'; |
| | | import dataAnalysisApi from '@/api/dataAnalysisApi'; |
| | | import { exportDocx } from '@/utils/doc'; |
| | | |
| | | const formObj = ref({ |
| | | timeArray: [new Date('2025-07-01T00:00:00'), new Date('2025-08-31T23:59:59')], |
| | | location: {} |
| | | }); |
| | | |
| | | const docLoading = ref(false); |
| | | |
| | | const params = computed(() => { |
| | | return { |
| | | startTime: moment(formObj.value.timeArray[0]).format('YYYY-MM-DD HH:mm:ss'), |
| | | endTime: moment(formObj.value.timeArray[1]).format('YYYY-MM-DD HH:mm:ss'), |
| | | // startTime: formObj.value.timeArray[0], |
| | | // endTime: formObj.value.timeArray[1], |
| | | area: { |
| | | provinceCode: formObj.value.location.pCode, |
| | | provinceName: formObj.value.location.pName, |
| | | cityCode: formObj.value.location.cCode, |
| | | cityName: formObj.value.location.cName, |
| | | districtCode: formObj.value.location.dCode, |
| | | districtName: formObj.value.location.dName |
| | | } |
| | | }; |
| | | }); |
| | | |
| | | const templateParam = { |
| | | sryTime: '2025年第ä¸å£åº¦ï¼7-9æï¼', |
| | | sryArea: 'éå®åº', |
| | | sryCount: '5', |
| | | sryKm: '1000', |
| | | sryRegion: 'åºå1ãåºå2', |
| | | sryCountByDegree: 'ä¼Xæ¬¡ï¼ %ï¼ãè¯Xæ¬¡ï¼ %ï¼å轻度污æXæ¬¡ï¼ %ï¼ç', |
| | | sryProbCount: 10, |
| | | srySceneCount: 5, |
| | | sryProbByFactor: |
| | | 'é¢ç²ç©ï¼PMï¼ç¸å
³Xå¤ï¼å æ¯ %ï¼ä¸»è¦æ¶å工尿¬å°æ±¡æé®é¢ãéè·¯æ¬å°æ±¡æé®é¢çï¼VOCç¸å
³Xå¤ï¼å æ¯ %ï¼ä¸»è¦æ¶åå æ²¹ç«æ²¹æ°æ³é²ãé¤é¥®æ²¹ç污æç', |
| | | missionInfoList: [ |
| | | { |
| | | missionCode: '', |
| | | _time: '', |
| | | region: '', |
| | | _airQulity: 'AQIï¼30ï¼ä¼ï¼', |
| | | mainFactor: '', |
| | | _abnormalFactors: '', |
| | | sceneCount: 0 |
| | | } |
| | | ], |
| | | missionDetailList: [ |
| | | { |
| | | _startTime: '2025å¹´07æ29æ¥', |
| | | _time: '09:00è³14:30', |
| | | _kilometres: '1000', |
| | | _keyScene: '1ä¸ªå½æ§ç¹ï¼éå®çæµç«ï¼å2ä¸ªå¸æ§ç¹ï¼åç°ä¸å¦ãå¸å髿°ï¼', |
| | | _dataStat: |
| | | 'PMâ.â
ï¼èå´30â35 μg/m³ï¼åå¼35.51 μg/m³ï¼ãPMââï¼èå´25â68 μg/m³ï¼åå¼38 μg/m³ï¼ãNOâï¼èå´22â54 μg/m³ï¼åå¼32 μg/m³ï¼ãCOï¼èå´2.08â6.39 mg/m³ï¼åå¼3.398 mg/m³ï¼åNOï¼èå´1â106 μg/m³ï¼åå¼20.97 μg/m³ï¼', |
| | | aqi: 30, |
| | | pollutionDegree: 'ä¼' |
| | | } |
| | | ] |
| | | }; |
| | | |
| | | const handleClick = () => { |
| | | generateMissionSummary(params.value).then((res) => { |
| | | // generateDocx(); |
| | | generateMissionList(params.value).then((res) => { |
| | | generateMissionDetail(params.value).then((res) => { |
| | | // generateClueByRiskArea(params.value).then((res) => {}); |
| | | }); |
| | | }); |
| | | }); |
| | | }; |
| | | |
| | | function generateMissionSummary(param) { |
| | | return dataAnalysisApi.fetchMissionSummary(param).then((res) => { |
| | | templateParam.sryTime = getQuarterDescription( |
| | | new Date(res.data.startTime), |
| | | new Date(res.data.endTime) |
| | | ); |
| | | templateParam.sryArea = res.data.area.districtName; |
| | | templateParam.sryCount = res.data.count; |
| | | templateParam.sryKm = Math.round(res.data.kilometres / 1000); |
| | | templateParam.sryRegion = res.data.regionList.join('ã'); |
| | | templateParam.sryCountByDegree = |
| | | res.data.countByDegree |
| | | .map((item) => { |
| | | return `${item.first}${item.second}次ï¼${Math.round(item.third * 1000) / 10}%ï¼`; |
| | | }) |
| | | .join('ã') + 'ç'; |
| | | templateParam.sryProbCount = res.data.probCount; |
| | | templateParam.srySceneCount = res.data.highRiskSceneCount; |
| | | templateParam.sryProbByFactor = res.data.probByFactor |
| | | .map((item) => { |
| | | return `${item.first}ç¸å
³${item.second}å¤ï¼å æ¯ ${Math.round(item.third * 1000) / 10}%ï¼ä¸»è¦æ¶å${getPollutingProblemTypes(item.first)}ç`; |
| | | }) |
| | | .join('ï¼'); |
| | | }); |
| | | } |
| | | |
| | | function generateMissionList(param) { |
| | | return dataAnalysisApi.fetchMissionList(param).then((res) => { |
| | | templateParam.missionInfoList = res.data.map((item) => { |
| | | item._time = formatDateTimeRange(item.startTime, item.endTime); |
| | | item._airQulity = `AQIï¼${item.aqi}ï¼${item.pollutionDegree}ï¼`; |
| | | item._abnormalFactors = item.abnormalFactors |
| | | .map((factor) => factor.des) |
| | | .join('ã'); |
| | | return item; |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | function generateMissionDetail(param) { |
| | | return dataAnalysisApi.fetchMissionDetail(param).then((res) => { |
| | | templateParam.missionDetailList = res.data.map((item) => { |
| | | const t = formatDateTimeRange(item.startTime, item.endTime).split(' '); |
| | | item._startTime = t[0]; |
| | | item._time = t[1]; |
| | | item._kilometres = Math.round(item.kilometres / 1000); |
| | | |
| | | const keySceneMap = new Map(); |
| | | item.keyScene.forEach((e) => { |
| | | if (!keySceneMap.has(e.type)) { |
| | | keySceneMap.set(e.type, { scenes: [], count: 0 }); |
| | | } |
| | | keySceneMap.get(e.type).scenes.push(e.scene); |
| | | keySceneMap.get(e.type).count++; |
| | | }); |
| | | item._keyScene = [...keySceneMap] |
| | | .map( |
| | | ([type, info]) => |
| | | `${info.count}个${type}ï¼${info.scenes.map((s) => s.name).join('ã')}ï¼` |
| | | ) |
| | | .join('ã'); |
| | | item._dataStat = item.dataStatistic |
| | | .map( |
| | | (e) => |
| | | `${e.factor.des}ï¼èå´${e.minValue}â${e.maxValue}μg/m³ï¼åå¼${e.avgValue}μg/m³ï¼` |
| | | ) |
| | | .join('ã'); |
| | | |
| | | return item; |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | function generateClueByRiskArea(param) { |
| | | return dataAnalysisApi.fetchClueByRiskArea(param).then((res) => {}); |
| | | } |
| | | |
| | | function generateDocx() { |
| | | docLoading.value = true; |
| | | exportDocx( |
| | | '/underway_season_report.docx', |
| | | templateParam, |
| | | `èµ°èªå£åº¦æ¥å.docx`, |
| | | { |
| | | horizontalHeight: 368, |
| | | verticalWidth: 266, |
| | | scale: 1.367 |
| | | } |
| | | ).finally(() => (docLoading.value = false)); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®å¼å§æ¶é´åç»ææ¶é´çæå£åº¦æè¿° |
| | | * @param {Date} startTime - å¼å§æ¶é´ |
| | | * @param {Date} endTime - ç»ææ¶é´ |
| | | * @returns {string} æ ¼å¼åçå£åº¦æè¿°å符串 |
| | | */ |
| | | function getQuarterDescription(startTime, endTime) { |
| | | // éªè¯æ¥æå¯¹è±¡æææ§ |
| | | if ( |
| | | !(startTime instanceof Date) || |
| | | !(endTime instanceof Date) || |
| | | isNaN(startTime.getTime()) || |
| | | isNaN(endTime.getTime()) |
| | | ) { |
| | | return ''; |
| | | } |
| | | |
| | | const startYear = startTime.getFullYear(); |
| | | const startMonth = startTime.getMonth(); |
| | | const startDate = startTime.getDate(); |
| | | const endYear = endTime.getFullYear(); |
| | | const endMonth = endTime.getMonth(); |
| | | const endDate = endTime.getDate(); |
| | | |
| | | // 夿æ¯å¦ä¸ºå£åº¦ç¬¬ä¸å¤© |
| | | let quarter = null; |
| | | if (startDate === 1) { |
| | | if (startMonth === 0) |
| | | quarter = 1; // Q1:1æ |
| | | else if (startMonth === 3) |
| | | quarter = 2; // Q2:4æ |
| | | else if (startMonth === 6) |
| | | quarter = 3; // Q3:7æ |
| | | else if (startMonth === 9) quarter = 4; // Q4:10æ |
| | | } |
| | | |
| | | // 䏿¯å£åº¦ç¬¬ä¸å¤©åè¿åå
·ä½æ¥æèå´ |
| | | if (!quarter) { |
| | | return `${startYear}å¹´${startMonth + 1}æ${startDate}æ¥-${endYear}å¹´${endMonth + 1}æ${endDate}æ¥`; |
| | | } |
| | | |
| | | // éªè¯æ¯å¦ä¸ºå¯¹åºå£åº¦æåä¸ä¸ªæ |
| | | const expectedEndMonth = quarter * 3 - 1; // Q1:2(3æ), Q2:5(6æ), Q3:8(9æ), Q4:11(12æ) |
| | | if (endMonth !== expectedEndMonth) { |
| | | return `${startYear}å¹´${startMonth + 1}æ${startDate}æ¥-${endYear}å¹´${endMonth + 1}æ${endDate}æ¥`; |
| | | } |
| | | |
| | | // éªè¯æ¯å¦ä¸ºå£åº¦æåä¸å¤© |
| | | const lastDayOfEndMonth = new Date(endYear, endMonth + 1, 0).getDate(); |
| | | if (endDate !== lastDayOfEndMonth) { |
| | | return `${startYear}å¹´${startMonth + 1}æ${startDate}æ¥-${endYear}å¹´${endMonth + 1}æ${endDate}æ¥`; |
| | | } |
| | | |
| | | const quarterNames = ['', '第ä¸å£åº¦', '第äºå£åº¦', '第ä¸å£åº¦', '第åå£åº¦']; |
| | | const monthRanges = ['', '1-3æ', '4-6æ', '7-9æ', '10-12æ']; |
| | | return `${startYear}å¹´${quarterNames[quarter]}ï¼${monthRanges[quarter]}ï¼`; |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ç©ºæ°è´¨éçæµå åè¿åå¯è½æ¶åçæ±¡æé®é¢ç±»å |
| | | * @param {string|string[]} factors - 空æ°è´¨éçæµå åï¼æ¯æå个å åå符串æå åæ°ç» |
| | | * @returns {string} å¯è½æ¶åçæ±¡æé®é¢ç±»åæè¿°ï¼å¤ä¸ªç±»åç¨é¡¿å·åé |
| | | */ |
| | | function getPollutingProblemTypes(factors) { |
| | | // çæµå å䏿±¡æé®é¢ç±»åçæ å°å
³ç³» |
| | | const factorProblemMap = { |
| | | 'é¢ç²ç©(PM)': ['工尿¬å°æ±¡æé®é¢', 'éè·¯æ¬å°æ±¡æé®é¢'], |
| | | PM25: ['工尿¬å°æ±¡æé®é¢', 'éè·¯æ¬å°æ±¡æé®é¢'], |
| | | PM10: ['工尿¬å°æ±¡æé®é¢', 'éè·¯æ¬å°æ±¡æé®é¢'], |
| | | SO2: ['çç
¤çµå', 'é¢éå', 'åå·¥å', 'æè²éå±å¶ç¼å'], |
| | | NO2: ['æºå¨è½¦å°¾æ°ææ¾é®é¢'], |
| | | 氮氧åç©: ['æºå¨è½¦å°¾æ°ææ¾é®é¢'], |
| | | CO: ['æºå¨è½¦å°¾æ°ææ¾é®é¢'], |
| | | O3: ['å æ²¹ç«', 'æºå¨è½¦å°¾æ°ææ¾é®é¢'], |
| | | VOCs: ['å æ²¹ç«æ²¹æ°æ³é²', 'é¤é¥®æ²¹ç污æ'] |
| | | }; |
| | | |
| | | // æ ååè¾å
¥ä¸ºæ°ç» |
| | | const factorArray = Array.isArray(factors) ? factors : [factors]; |
| | | |
| | | // æ¶éææå¯è½çé®é¢ç±»åå¹¶å»é |
| | | const enterpriseSet = new Set(); |
| | | factorArray.forEach((factor) => { |
| | | const trimmedFactor = factor.trim(); |
| | | factorProblemMap[trimmedFactor].forEach((problem) => { |
| | | enterpriseSet.add(problem); |
| | | }); |
| | | }); |
| | | |
| | | // 转æ¢ä¸ºæ ¼å¼åå符串è¿å |
| | | return Array.from(enterpriseSet).join('ã'); |
| | | } |
| | | |
| | | /** |
| | | * å°å¼å§åç»ææ¶é´æ ¼å¼å为"YYYYå¹´MMæDDæ¥ HH:mmè³HH:mm"æ ¼å¼ |
| | | * @param {Date|string} startTime - å¼å§æ¶é´ï¼Date对象æå¯è¢«momentè§£æçåç¬¦ä¸²ï¼ |
| | | * @param {Date|string} endTime - ç»ææ¶é´ï¼Date对象æå¯è¢«momentè§£æçåç¬¦ä¸²ï¼ |
| | | * @returns {string} æ ¼å¼ååçæ¶é´èå´å符串 |
| | | */ |
| | | function formatDateTimeRange(startTime, endTime) { |
| | | // éªè¯è¾å
¥æææ§ |
| | | if (!startTime || !endTime) return ''; |
| | | |
| | | const startMoment = moment(startTime); |
| | | const endMoment = moment(endTime); |
| | | |
| | | // æ£æ¥æ¥ææ¯å¦ææ |
| | | if (!startMoment.isValid() || !endMoment.isValid()) return ''; |
| | | |
| | | // æ ¼å¼åæ¥æé¨ååæ¶é´é¨å |
| | | const datePart = startMoment.format('YYYYå¹´MMæDDæ¥'); |
| | | const startTimePart = startMoment.format('HH:mm'); |
| | | const endTimePart = endMoment.format('HH:mm'); |
| | | |
| | | return `${datePart} ${startTimePart}è³${endTimePart}`; |
| | | } |
| | | </script> |