From 0a97c702074830791cb29a158098f05c8033c4b1 Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期五, 07 六月 2024 17:39:43 +0800 Subject: [PATCH] 原型制作中 --- src/views/visualization/SubtaskVisual.vue | 95 +++ package-lock.json | 11 src/assets/styles/base.scss | 9 src/views/visualization/SupervisionVisual.vue | 70 ++ src/components.d.ts | 16 src/components/inspection/TaskSummaryItem.vue | 39 + src/components/search/OptionTime.vue | 59 ++ src/utils/time-util.js | 39 + src/views/inspection/SelfInspection.vue | 20 src/api/index.js | 99 +++ src/components/map/BaseMap.vue | 50 + src/api/fysp/taskApi.js | 53 + src/utils/map/index.js | 110 ++++ src/views/main/MonitorView.vue | 12 src/views/inspection/JointEnforcement.vue | 20 src/views/visualization/VisualizationView.vue | 32 + src/assets/icon/scene_1.png | 0 src/views/inspection/TaskTrack.vue | 35 + src/views/management/ManagementView.vue | 2 src/views/management/TaskSummary.vue | 26 src/views/management/TaskStats.vue | 15 src/components/inspection/TaskNode.vue | 6 src/components/search/OptionSceneType.vue | 78 ++ src/enum/location.js | 252 +++++++++ src/utils/map/marks.js | 131 ++++ src/enum/scene.js | 126 ++++ src/views/inspection/InspectionView.vue | 3 src/main.js | 3 package.json | 1 src/components/search/OptionLocation.vue | 165 ++++++ 30 files changed, 1,563 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3a90df..2cf619c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "fy-report", "version": "0.0.0", "dependencies": { + "@amap/amap-jsapi-loader": "^1.0.1", "@element-plus/icons-vue": "^2.3.1", "@vueuse/core": "^10.10.0", "axios": "^1.7.2", @@ -31,6 +32,11 @@ "vite": "^5.2.8", "vitest": "^1.4.0" } + }, + "node_modules/@amap/amap-jsapi-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz", + "integrity": "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==" }, "node_modules/@antfu/utils": { "version": "0.7.8", @@ -4674,6 +4680,11 @@ } }, "dependencies": { + "@amap/amap-jsapi-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz", + "integrity": "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==" + }, "@antfu/utils": { "version": "0.7.8", "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.8.tgz", diff --git a/package.json b/package.json index 7690c78..f9d0366 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "format": "prettier --write src/" }, "dependencies": { + "@amap/amap-jsapi-loader": "^1.0.1", "@element-plus/icons-vue": "^2.3.1", "@vueuse/core": "^10.10.0", "axios": "^1.7.2", diff --git a/src/api/fysp/taskApi.js b/src/api/fysp/taskApi.js new file mode 100644 index 0000000..54ab091 --- /dev/null +++ b/src/api/fysp/taskApi.js @@ -0,0 +1,53 @@ +import { $fysp } from '../index' + +export default { + /** + * 鑾峰彇椤跺眰浠诲姟 + */ + getTopTask() { + return $fysp.get('task/alltask/0').then((res) => res.data) + }, + + /** + * 鏌ヨ鎬讳换鍔� + * @param {Object} area + * @returns + */ + fetchTopTasks(area) { + return $fysp.post('task/find', area).then((res) => res.data) + }, + + /** + * 鑾峰彇瀛愪换鍔$粺璁′俊鎭� + */ + fetchSubtaskSummary({ topTaskId = undefined, sceneTypeId = undefined }) { + return $fysp + .get('subtask/summary', { + params: { + topTaskId: topTaskId, + sceneTypeId: sceneTypeId + } + }) + .then((res) => res.data) + }, + + /** + * 鑾峰彇瀛愪换鍔$粺璁′俊鎭� + */ + fetchSubtaskSummaryArea(area) { + return $fysp.post('subtask/summary/area', area).then((res) => res.data) + }, + + /** + * 鑾峰彇瀛愪换鍔¢棶棰樿鎯� + */ + getProBySubtask(id) { + return $fysp + .get('problemlist/subtask', { + params: { + stGuid: id + } + }) + .then((res) => res.data) + } +} diff --git a/src/api/index.js b/src/api/index.js new file mode 100644 index 0000000..01609aa --- /dev/null +++ b/src/api/index.js @@ -0,0 +1,99 @@ +import axios from 'axios' +import { ElMessage } from 'element-plus' + +const debug = true + +let ip1 = 'http://47.100.191.150:9005/' +let ip1_file = 'http://47.100.191.150:9005/' +// let ip1 = 'https://fyami.com.cn:447/'; +// let ip1_file = 'https://fyami.com.cn:447/'; +let ip2 = 'https://fyami.com.cn/' +let ip2_file = 'https://fyami.com.cn/' + +if (debug) { + ip1 = 'http://192.168.0.138:8082/' + // ip1_file = 'http://47.100.191.150:9005/'; + // ip2 = 'http://192.168.0.138:8080/'; + // ip2_file = 'https://fyami.com.cn/'; +} + +//椋炵窘鐩戠 +const $fysp = axios.create({ + baseURL: ip1, + timeout: 20000 +}) +$fysp.imgUrl = `${ip1_file}images/` +$fysp.downloadUrl = `${ip1_file}files/` + +//椋炵窘鐜 +const $fytz = axios.create({ + baseURL: ip2, + timeout: 20000 +}) +$fytz.imgUrl = `${ip2_file}images/` + +//娣诲姞鎷︽埅鍣� +;[$fysp, $fytz].forEach((i) => { + // 娣诲姞璇锋眰鎷︽埅鍣� + i.interceptors.request.use( + function (config) { + // 鍦ㄥ彂閫佽姹備箣鍓嶅仛浜涗粈涔� + console.log('==>璇锋眰寮�濮�') + console.log(`${config.baseURL}${config.url}`) + if (config.data) { + console.log('==>璇锋眰鏁版嵁', config.data) + } + return config + }, + function (error) { + // 瀵硅姹傞敊璇仛浜涗粈涔� + console.log('==>璇锋眰寮�濮�') + console.log(error) + ElMessage({ + message: error, + type: 'error' + }) + return Promise.reject(error) + } + ) + + // 娣诲姞鍝嶅簲鎷︽埅鍣� + i.interceptors.response.use( + function (response) { + // 2xx 鑼冨洿鍐呯殑鐘舵�佺爜閮戒細瑙﹀彂璇ュ嚱鏁般�� + // 瀵瑰搷搴旀暟鎹仛鐐逛粈涔� + console.log(response) + console.log('==>璇锋眰缁撴潫') + if (response.status == 200) { + if (response.data.success != undefined && response.data.success != null) { + if (response.data.success == true) { + return response + } else { + ElMessage({ + message: response.data.message, + type: 'error' + }) + return Promise.reject(response.data.message) + } + } else { + return response + } + } else { + return Promise.reject(response) + } + }, + function (error) { + // 瓒呭嚭 2xx 鑼冨洿鐨勭姸鎬佺爜閮戒細瑙﹀彂璇ュ嚱鏁般�� + // 瀵瑰搷搴旈敊璇仛鐐逛粈涔� + console.log(error) + console.log('==>璇锋眰缁撴潫') + ElMessage({ + message: error, + type: 'error' + }) + return Promise.reject(error) + } + ) +}) + +export { $fysp, $fytz } diff --git a/src/assets/icon/scene_1.png b/src/assets/icon/scene_1.png new file mode 100644 index 0000000..972dd1c --- /dev/null +++ b/src/assets/icon/scene_1.png Binary files differ diff --git a/src/assets/styles/base.scss b/src/assets/styles/base.scss index 8f27fcf..6227694 100644 --- a/src/assets/styles/base.scss +++ b/src/assets/styles/base.scss @@ -115,3 +115,12 @@ flex-direction: column; align-items: center; } + +/************************************** 榧犳爣浜嬩欢 **************************************/ +.p-events-auto { + pointer-events: auto; +} + +.p-events-none { + pointer-events: none; +} diff --git a/src/components.d.ts b/src/components.d.ts index fb94fc6..0baba56 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -7,21 +7,37 @@ /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + BaseMap: typeof import('./components/map/BaseMap.vue')['default'] + copy: typeof import('./components/search/OptionLocation copy.vue')['default'] CoreHeader: typeof import('./components/core/CoreHeader.vue')['default'] ElButton: typeof import('element-plus/es')['ElButton'] ElCard: typeof import('element-plus/es')['ElCard'] + ElCascader: typeof import('element-plus/es')['ElCascader'] ElCol: typeof import('element-plus/es')['ElCol'] ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] + ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] + ElFormItem: typeof import('element-plus/es')['ElFormItem'] + ElOption: typeof import('element-plus/es')['ElOption'] ElProgress: typeof import('element-plus/es')['ElProgress'] ElRow: typeof import('element-plus/es')['ElRow'] + ElScorllbar: typeof import('element-plus/es')['ElScorllbar'] ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] + ElSelect: typeof import('element-plus/es')['ElSelect'] + ElStatistic: typeof import('element-plus/es')['ElStatistic'] ElTag: typeof import('element-plus/es')['ElTag'] ElText: typeof import('element-plus/es')['ElText'] + ElTimeline: typeof import('element-plus/es')['ElTimeline'] + ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem'] + FYOptionTime: typeof import('./components/search/FYOptionTime.vue')['default'] + OptionLocation: typeof import('./components/search/OptionLocation.vue')['default'] + OptionSceneType: typeof import('./components/search/OptionSceneType.vue')['default'] + OptionTime: typeof import('./components/search/OptionTime.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] SubtaskExamineItem: typeof import('./components/inspection/SubtaskExamineItem.vue')['default'] SubtaskItem: typeof import('./components/inspection/SubtaskItem.vue')['default'] TaskItem: typeof import('./components/inspection/TaskItem.vue')['default'] TaskNode: typeof import('./components/inspection/TaskNode.vue')['default'] + TaskSummaryItem: typeof import('./components/inspection/TaskSummaryItem.vue')['default'] } } diff --git a/src/components/inspection/TaskNode.vue b/src/components/inspection/TaskNode.vue index 4d5b161..71fa853 100644 --- a/src/components/inspection/TaskNode.vue +++ b/src/components/inspection/TaskNode.vue @@ -1,6 +1,9 @@ <template> <div> - <el-row justify="center">{{ title }}</el-row> + <el-row justify="start"> + <div>{{ title }}</div> + <el-text type="danger" size="small">{{ warning }}</el-text> + </el-row> <div class="border-r-small f-b"> <div v-for="(item, i) in items" :key="title + i"> <slot :item="item" :index="i"></slot> @@ -16,6 +19,7 @@ export default { props: { title: String, + warning: String, count: Number, items: Array }, diff --git a/src/components/inspection/TaskSummaryItem.vue b/src/components/inspection/TaskSummaryItem.vue new file mode 100644 index 0000000..2ff508e --- /dev/null +++ b/src/components/inspection/TaskSummaryItem.vue @@ -0,0 +1,39 @@ +<template> + <div class="border-r-small p-h-8"> + <el-row justify="space-between"> + <div>{{ title }}</div> + <el-text size="small">{{ sceneType }}</el-text> + </el-row> + <el-row> + <el-col :span="8"> + <el-statistic title="宸℃煡" :value="10"> + <template #suffix>涓�</template> + </el-statistic> + </el-col> + <el-col :span="8"> + <el-statistic title="闂" :value="16"> + <template #suffix>涓�</template> + </el-statistic> + </el-col> + <el-col :span="8"> + <el-statistic title="鏁存敼" :value="8"> + <template #suffix>涓�</template> + </el-statistic> + </el-col> + </el-row> + </div> +</template> + +<script> +export default { + props: { + title: String, + sceneType: { + type: String, + default: '鍏ㄥ満鏅�' + } + } +} +</script> + +<style scoped></style> diff --git a/src/components/map/BaseMap.vue b/src/components/map/BaseMap.vue new file mode 100644 index 0000000..51deb80 --- /dev/null +++ b/src/components/map/BaseMap.vue @@ -0,0 +1,50 @@ +<template> + <div id="container" :style="height"></div> +</template> + +<script setup> +import { onMounted } from 'vue' +import { createMap } from '@/utils/map/index' +// import { createMap } from '@/utils/map/baseMap' +import { inject } from 'vue' + +const mapHeight = inject('mapHeight') + +const height = 'height:' + mapHeight + +onMounted(() => { + // 楂樺痉鍦板浘鍒濆鍖� + createMap('container') +}) +</script> +<style> +#container { + position: relative; + width: 100%; + /* height: calc(var(--fy-body-height) / 2); */ + /* min-height: var(--screen-min-height); + min-width: var(--screen-min-width); */ + z-index: 0px; +} + +/* 鍘婚櫎楂樺痉鍦板浘鐨勫浐瀹氱増鍙峰浘鏍� */ +.amap-logo { + display: none; + opacity: 0 !important; +} +.amap-copyright { + display: none; + opacity: 0 !important; +} + +.amap-marker-label { + font-size: 13px; + text-align: center; + color: white; + background-color: transparent; + text-shadow: black 2px 2px 2px; + border-radius: 2px; + border: 0px; + padding: 4px; +} +</style> diff --git a/src/components/search/OptionLocation.vue b/src/components/search/OptionLocation.vue new file mode 100644 index 0000000..c2368e5 --- /dev/null +++ b/src/components/search/OptionLocation.vue @@ -0,0 +1,165 @@ +<template> + <!-- <el-form-item :label="placeholder" :prop="prop"> --> + <el-cascader + :model-value="formatedValue" + @change="handleChange" + :options="locations" + :placeholder="placeholder" + :props="optionProps" + size="small" + :style="'width: ' + width + 'px'" + /> + <!-- </el-form-item> --> +</template> + +<script> +import { enumLocation } from '@/enum/location' + +export default { + props: { + // 鏄惁鍦ㄩ閫夐」澶勬坊鍔犫�滃叏閮ㄢ�濋�夐」 + allOption: { + type: Boolean, + default: true + }, + // 鏌ヨ鐨勮鏀跨骇鍒紝鍙栧��1锛�2锛�3锛�4, 5, 6 + level: { + type: Number, + default: 4 + }, + // 缁撴灉杩斿洖 + modelValue: Object, + // 鏄惁榛樿杩斿洖鍒濆閫夐」 + initValue: { + type: Boolean, + default: true + }, + // 鑳藉惁閫夋嫨浠绘剰涓�绾ч�夐」 + checkStrictly: { + type: Boolean, + default: true + }, + prop: { + type: String, + default: '_locations' + }, + width: { + type: Number, + default: 220 + } + }, + emits: ['update:modelValue'], + data() { + return { + locations: enumLocation(this.allOption, this.level), + optionProps: { + checkStrictly: this.checkStrictly + } + } + }, + computed: { + placeholder() { + const list = '鐪�/甯�/鍖�/闀�/闆�/鐗�'.split('/') + const p = [] + for (let i = 0; i < this.level; i++) { + p.push(list[i]) + } + return p.join('/') + }, + formatedValue() { + return this.optionFormatReverse(this.modelValue) + } + }, + methods: { + handleChange(value) { + this.$emit('update:modelValue', this.optionFormat(value)) + }, + /** + * 鍦板尯閫夐」缁撴灉鏍煎紡鍖� + */ + optionFormat(val) { + const res = { + pCode: null, + pName: null, + cCode: null, + cName: null, + dCode: null, + dName: null, + tCode: null, + tName: null, + aCode: null, + aName: null, + mCode: null, + mName: null + } + if (val.length > 0) { + res.pCode = val[0][0] + res.pName = val[0][1] + } + if (val.length > 1) { + res.cCode = val[1][0] + res.cName = val[1][1] + } + if (val.length > 2) { + res.dCode = val[2][0] + res.dName = val[2][1] + } + if (val.length > 3) { + res.tCode = val[3][0] + res.tName = val[3][1] + } + if (val.length > 4) { + res.aCode = val[4][0] + res.aName = val[4][1] + } + if (val.length > 5) { + res.mCode = val[5][0] + res.mName = val[5][1] + } + return res + }, + optionFormatReverse(val) { + const res = [] + if (val) { + if (val.pName) { + res.push([val.pCode, val.pName]) + } + if (val.cName) { + res.push([val.cCode, val.cName]) + } + if (val.dName) { + res.push([val.dCode, val.dName]) + } + if (val.tName) { + res.push([val.tCode, val.tName]) + } + if (val.aName) { + res.push([val.aCode, val.aName]) + } + if (val.mName) { + res.push([val.mCode, val.mName]) + } + } + return res + } + }, + mounted() { + if (this.initValue) { + if (this.checkStrictly) { + this.handleChange([this.locations[0].value]) + } else { + const f = (location) => { + if (location.children && location.children.length > 0) { + const r = f(location.children[0]) + r.unshift(location.value) + return r + } else { + return [location.value] + } + } + this.handleChange(f(this.locations[0])) + } + } + } +} +</script> diff --git a/src/components/search/OptionSceneType.vue b/src/components/search/OptionSceneType.vue new file mode 100644 index 0000000..4fd1f73 --- /dev/null +++ b/src/components/search/OptionSceneType.vue @@ -0,0 +1,78 @@ +<template> + <!-- <el-form-item label="鍦烘櫙绫诲瀷" :prop="prop"> --> + <el-select + :model-value="modelValue" + @change="handleChange" + placeholder="鍦烘櫙绫诲瀷" + size="small" + :style="'width: ' + width + 'px'" + > + <el-option v-for="s in sceneTypes" :key="s.value" :label="s.label" :value="s" /> + </el-select> + <!-- </el-form-item> --> +</template> + +<script> +import { enumScene } from '@/enum/scene' + +export default { + props: { + // 鏄惁鍦ㄩ閫夐」澶勬坊鍔犫�滃叏閮ㄢ�濋�夐」 + allOption: { + type: Boolean, + default: true + }, + // 1:椋炵窘鐜绯荤粺锛�2锛氶缇界洃绠$郴缁燂紱 + type: { + type: Number, + default: 1 + }, + // 杩斿洖缁撴灉 + modelValue: Object, + // 鏄惁榛樿杩斿洖鍒濆閫夐」 + initValue: { + type: Boolean, + default: true + }, + // form琛ㄥ崟缁戝畾灞炴�у悕 + prop: { + type: String, + default: '_scenetype' + }, + // 鍒囨崲 type 鍚庯紝褰撳墠閫夐」鏄惁娓呯┖ + sourceInit: { + type: Boolean, + default: true + }, + width: { + type: Number, + default: 220 + } + }, + emits: ['update:modelValue'], + data() { + return { + // sceneTypes: enumScene(this.type, this.allOption), + } + }, + computed: { + sceneTypes() { + if (this.sourceInit) { + // 褰撳洜涓簍ype鎴栬�卆llOption鍙傛暟鍙樺寲寮曡捣閫夐」鍙樻洿鏃讹紝娓呯┖褰撳墠閫夐」 + this.handleChange() + } + return enumScene(this.type, this.allOption) + } + }, + methods: { + handleChange(value) { + this.$emit('update:modelValue', value) + } + }, + mounted() { + if (this.initValue) { + this.handleChange(this.sceneTypes[0]) + } + } +} +</script> diff --git a/src/components/search/OptionTime.vue b/src/components/search/OptionTime.vue new file mode 100644 index 0000000..f9f7bc5 --- /dev/null +++ b/src/components/search/OptionTime.vue @@ -0,0 +1,59 @@ +<template> + <!-- <el-form-item label="鏃堕棿" :prop="prop"> --> + <el-date-picker + v-model="date" + @change="handleChange" + :type="type" + placeholder="閫夋嫨鏃堕棿" + size="small" + style="width: 100px" + /> + <!-- </el-form-item> --> +</template> + +<script> +const MONTH = 'month' + +export default { + props: { + type: { + type: String, + default: MONTH + }, + // 杩斿洖缁撴灉 + modelValue: Date, + // 鏄惁榛樿杩斿洖鍒濆閫夐」 + initValue: { + type: Boolean, + default: true + }, + prop: String + }, + emits: ['update:modelValue'], + data() { + return { + date: this.modelValue + } + }, + computed: {}, + methods: { + handleChange(value) { + this.$emit('update:modelValue', value) + }, + timeFormat() { + switch (this.type) { + case MONTH: + return 'YYYY-MM' + default: + return 'YYYY-MM' + } + } + }, + mounted() { + if (this.initValue) { + this.date = new Date() + this.handleChange(this.date) + } + } +} +</script> diff --git a/src/enum/location.js b/src/enum/location.js new file mode 100644 index 0000000..3401361 --- /dev/null +++ b/src/enum/location.js @@ -0,0 +1,252 @@ +/** + * 鑾峰彇琛屾斂鍖哄垝 + * @param {Boolean} allOption 鏄惁鍦ㄥご閮ㄦ坊鍔犫�滃叏閮ㄢ�濋�夐」 + * @param {Number} level 鑾峰彇鐨勫垎绫绘繁搴︼紝鑼冨洿 1 - 4 + * @returns + */ +function enumLocation(allOption = true, level = 4) { + const l = _enumLocation() + if (!allOption) { + l.shift() + } + _deleteByLevel(l, level, 1) + + return l +} + +function _enumLocation() { + return [ + { + label: '鍏ㄥ競', + value: [null, '鍏ㄥ競'] + }, + { + label: '涓婃捣甯�', + value: ['31', '涓婃捣甯�'], + children: [ + { + label: '涓婃捣甯�', + value: ['3100', '涓婃捣甯�'], + children: [ + { + label: '閲戝北鍖�', + value: ['310116', '閲戝北鍖�'], + children: [ + { label: '寮犲牥闀�', value: ['310116103', '寮犲牥闀�'] }, + { label: '浜灄闀�', value: ['310116104', '浜灄闀�'] }, + { label: '鍚曞贩闀�', value: ['310116105', '鍚曞贩闀�'] }, + { label: '寤婁笅闀�', value: ['310116107', '寤婁笅闀�'] }, + { label: '楂樻柊鍖�', value: ['310116503', '楂樻柊鍖�'] }, + { label: '閲戝北鍗晣', value: ['310116109', '閲戝北鍗晣'] }, + { label: '婕曟尘闀�', value: ['310116112', '婕曟尘闀�'] }, + { + label: '灞遍槼闀�', + value: ['310116113', '灞遍槼闀�'], + children: [ + { + label: '涓囪揪骞垮満', + value: ['31011611301', '涓囪揪骞垮満'] + } + ] + }, + { label: '鐭冲寲琛楅亾', value: ['310116001', '鐭冲寲琛楅亾'] }, + { label: '鏈辨尘闀�', value: ['310116101', '鏈辨尘闀�'] }, + { label: '鏋尘闀�', value: ['310116102', '鏋尘闀�'] }, + { label: '纰宠胺缁挎咕', value: ['9000', '纰宠胺缁挎咕'] } + ] + }, + { + label: '寰愭眹鍖�', + value: ['310104', '寰愭眹鍖�'], + children: [ + { + label: '婕曟渤娉炬柊鍏存妧鏈紑鍙戝尯', + value: ['310104501', '婕曟渤娉炬柊鍏存妧鏈紑鍙戝尯'] + }, + { label: '婀栧崡璺閬�', value: ['310104004', '婀栧崡璺閬�'] }, + { label: '澶╁钩璺閬�', value: ['310104003', '澶╁钩璺閬�'] }, + { label: '铏规璺閬�', value: ['310104012', '铏规璺閬�'] }, + { label: '鏋灄璺閬�', value: ['310104008', '鏋灄璺閬�'] }, + { label: '鏂滃湡璺閬�', value: ['310104007', '鏂滃湡璺閬�'] }, + { label: '闀挎ˉ琛楅亾', value: ['310104010', '闀挎ˉ琛楅亾'] }, + { + label: '鐢版灄琛楅亾', + value: ['310104011', '鐢版灄琛楅亾'], + children: [ + { + label: '鐢板皻鍧�', + value: ['31010401101', '鐢板皻鍧�'] + } + ] + }, + { label: '搴峰仴鏂版潙琛楅亾', value: ['310104013', '搴峰仴鏂版潙琛楅亾'] }, + { + label: '寰愬姹囪閬�', + value: ['310104014', '寰愬姹囪閬�'], + children: [ + { + label: '澶╅挜妗�', + value: ['31010401401', '澶╅挜妗�'] + } + ] + }, + { label: '鍑屼簯璺閬�', value: ['310104015', '鍑屼簯璺閬�'] }, + { label: '榫欏崕琛楅亾', value: ['310104016', '榫欏崕琛楅亾'] }, + { label: '婕曟渤娉捐閬�', value: ['310104017', '婕曟渤娉捐閬�'] }, + { label: '鍗庢尘闀�', value: ['310104103', '鍗庢尘闀�'] } + ] + }, + { + label: '闈欏畨鍖�', + value: ['310106', '闈欏畨鍖�'], + children: [ + { + label: '澶у畞璺閬�', + value: ['310106019', '澶у畞璺閬�'], + children: [ + { + label: '涔呭厜涓績', + value: ['31010601901', '涔呭厜涓績'] + } + ] + }, + { label: '褰郸鏂版潙琛楅亾', value: ['310106020', '褰郸鏂版潙琛楅亾'] }, + { label: '涓存本璺閬�', value: ['310106021', '涓存本璺閬�'] }, + { label: '鑺锋睙瑗胯矾琛楅亾', value: ['310106022', '鑺锋睙瑗胯矾琛楅亾'] }, + { + label: '褰郸闀�', + value: ['310106101', '褰郸闀�'], + children: [ + { + label: '澶ц瀺鍩�', + value: ['31010610101', '澶ц瀺鍩�'] + } + ] + }, + { label: '姹熷畞璺閬�', value: ['310106006', '姹熷畞璺閬�'] }, + { label: '鐭抽棬浜岃矾琛楅亾', value: ['310106011', '鐭抽棬浜岃矾琛楅亾'] }, + { + label: '鍗椾含瑗胯矾琛楅亾', + value: ['310106012', '鍗椾含瑗胯矾琛楅亾'], + children: [ + { + label: 'X88', + value: ['31010601201', 'X88'] + } + ] + }, + { label: '闈欏畨瀵鸿閬�', value: ['310106013', '闈欏畨瀵鸿閬�'] }, + { + label: '鏇瑰娓¤閬�', + value: ['310106014', '鏇瑰娓¤閬�'], + children: [ + { + label: '889', + value: ['31010601401', '889'] + } + ] + }, + { label: '澶╃洰瑗胯矾琛楅亾', value: ['310106015', '澶╃洰瑗胯矾琛楅亾'] }, + { + label: '鍖楃珯琛楅亾', + value: ['310106016', '鍖楃珯琛楅亾'], + children: [ + { + label: '澶ф偊鍩�', + value: ['31010601601', '澶ф偊鍩�'] + } + ] + }, + { label: '瀹濆北璺閬�', value: ['310106017', '瀹濆北璺閬�'] }, + { label: '鍏卞拰鏂拌矾琛楅亾', value: ['310106018', '鍏卞拰鏂拌矾琛楅亾'] } + ] + }, + { + label: '鏅檧鍖�', + value: ['310107', '鏅檧鍖�'], + children: [ + { label: '鏇规潹鏂版潙琛楅亾', value: ['310107005', '鏇规潹鏂版潙琛楅亾'] }, + { label: '涓囬噷琛楅亾', value: ['310107021', '涓囬噷琛楅亾'] }, + { label: '鐪熷闀囪閬�', value: ['310107022', '鐪熷闀囪閬�'] }, + { label: '闀垮緛闀�', value: ['310107102', '闀垮緛闀�'] }, + { label: '妗冩郸闀�', value: ['310107103', '妗冩郸闀�'] }, + { label: '鐭虫硥璺閬�', value: ['310107017', '鐭虫硥璺閬�'] }, + { label: '鐢樻硥璺閬�', value: ['310107016', '鐢樻硥璺閬�'] }, + { label: '闀垮璺閬�', value: ['310107015', '闀垮璺閬�'] }, + { label: '闀块鏂版潙琛楅亾', value: ['310107014', '闀块鏂版潙琛楅亾'] }, + { label: '瀹滃窛璺閬�', value: ['310107020', '瀹滃窛璺閬�'] } + ] + }, + { + label: '闂佃鍖�', + value: ['310112', '闂佃鍖�'], + children: [ + { label: '姹熷窛璺閬�', value: ['310112001', '姹熷窛璺閬�'] }, + { label: '鍙ょ編琛楅亾', value: ['310112006', '鍙ょ編琛楅亾'] }, + { label: '鏂拌櫣琛楅亾', value: ['310112008', '鏂拌櫣琛楅亾'] }, + { label: '娴﹂敠琛楅亾', value: ['310112009', '娴﹂敠琛楅亾'] }, + { label: '鑾樺簞闀�', value: ['310112101', '鑾樺簞闀�'] }, + { label: '涓冨疂闀�', value: ['310112102', '涓冨疂闀�'] }, + { label: '棰涙ˉ闀�', value: ['310112103', '棰涙ˉ闀�'] }, + { label: '鍗庢紩闀�', value: ['310112106', '鍗庢紩闀�'] }, + { label: '铏规ˉ闀�', value: ['310112107', '铏规ˉ闀�'] }, + { label: '姊呴檱闀�', value: ['310112108', '姊呴檱闀�'] }, + { label: '鍚存尘闀�', value: ['310112110', '鍚存尘闀�'] }, + { label: '椹ˉ闀�', value: ['310112112', '椹ˉ闀�'] }, + { label: '娴︽睙闀�', value: ['310112114', '娴︽睙闀�'] }, + { label: '鑾樺簞宸ヤ笟鍖�', value: ['310112501', '鑾樺簞宸ヤ笟鍖�'] } + ] + }, + { + label: '闀垮畞鍖�', + value: ['310105', '闀垮畞鍖�'], + children: [ + { label: '鍗庨槼璺閬�', value: ['310105001', '鍗庨槼璺閬�'] }, + { label: '姹熻嫃璺閬�', value: ['310105002', '姹熻嫃璺閬�'] }, + { label: '鏂板崕璺閬�', value: ['310105004', '鏂板崕璺閬�'] }, + { label: '鍛ㄥ妗ヨ閬�', value: ['310105005', '鍛ㄥ妗ヨ閬�'] }, + { label: '澶╁北璺閬�', value: ['310105006', '澶╁北璺閬�'] }, + { label: '浠欓湠鏂版潙琛楅亾', value: ['310105008', '浠欓湠鏂版潙琛楅亾'] }, + { label: '铏规ˉ琛楅亾', value: ['310105009', '铏规ˉ琛楅亾'] }, + { label: '绋嬪妗ヨ閬�', value: ['310105010', '绋嬪妗ヨ閬�'] }, + { label: '鍖楁柊娉捐閬�', value: ['310105011', '鍖楁柊娉捐閬�'] }, + { label: '鏂版尘闀�', value: ['310105102', '鏂版尘闀�'] } + ] + }, + { + label: '瀹濆北鍖�', + value: ['310113', '瀹濆北鍖�'], + children: [] + }, + { + label: '鍢夊畾鍖�', + value: ['310114', '鍢夊畾鍖�'], + children: [] + } + ] + } + ] + } + ] +} + +// 鎸夌収闇�姹傜殑瀹氫綅绮惧害杩斿洖瀵瑰簲鏁版嵁 +function _deleteByLevel(locations, level, step) { + if (step == level) { + locations.forEach((l) => { + if (l.children) { + l.children = undefined + } + }) + return + } else { + step++ + locations.forEach((l) => { + if (l.children) { + _deleteByLevel(l.children, level, step) + } + }) + } +} + +export { enumLocation } diff --git a/src/enum/scene.js b/src/enum/scene.js new file mode 100644 index 0000000..6667e9d --- /dev/null +++ b/src/enum/scene.js @@ -0,0 +1,126 @@ +/** + * 鍦烘櫙绫诲瀷鏋氫妇 + * @param {Number} type 1:椋炵窘鐜绯荤粺锛�2锛氶缇界洃绠$郴缁燂紱 + * @param {Boolean} allOption 鏄惁鍦ㄥご閮ㄦ坊鍔犫�滃叏閮ㄢ�濋�夐」 + */ +function enumScene(type, allOption = true) { + let l + switch (type) { + case 1: + l = _enumScene_1() + break + case 2: + l = _enumScene_2() + break + default: + l = _enumScene_1() + break + } + if (!allOption) { + l.shift() + } + + return l +} + +function getSceneName(value, type = 1) { + return enumScene(type).find((v) => { + if (v.value == value) { + return v + } + }) +} + +// 椋炵窘鐜绯荤粺 +function _enumScene_1() { + return [ + { + label: '鍏ㄩ儴鍦烘櫙', + value: null + }, + { + label: '椁愰ギ', + value: '1' + }, + { + label: '宸ュ湴', + value: '2' + }, + { + label: '鐮佸ご', + value: '3' + }, + { + label: '鍫嗗満', + value: '4' + }, + { + label: '鎼呮媽绔�', + value: '5' + }, + { + label: '宸ヤ笟浼佷笟', + value: '6' + }, + { + label: '姹戒慨', + value: '7' + }, + { + label: '瀹為獙瀹�', + value: '8' + }, + { + label: '鍖荤枟鏈烘瀯', + value: '9' + } + ] +} + +// 椋炵窘鐩戠绯荤粺 +function _enumScene_2() { + return [ + { + label: '鍏ㄩ儴鍦烘櫙', + value: null + }, + { + label: '宸ュ湴', + value: '1' + }, + { + label: '鐮佸ご', + value: '2' + }, + { + label: '鎼呮媽绔�', + value: '3' + }, + { + label: '宸ヤ笟浼佷笟', + value: '4' + }, + { + label: '椁愰ギ', + value: '5' + }, + { + label: '姹戒慨', + value: '6' + }, + { + label: '閬撹矾鎵皹鐩戞祴鐐�', + value: '9' + }, + { + label: '閬撹矾', + value: '10' + }, + { + label: '鍫嗗満', + value: '14' + } + ] +} + +export { enumScene, getSceneName } diff --git a/src/main.js b/src/main.js index e491791..af0994d 100644 --- a/src/main.js +++ b/src/main.js @@ -4,9 +4,12 @@ import App from './App.vue' import router from './router' +import timeUtil from './utils/time-util' const app = createApp(App) +app.config.globalProperties.$fm = timeUtil + // elementUI Icon 娉ㄥ唽 for (const [key, component] of Object.entries(ElementPlusIconsVue)) { app.component(key, component) diff --git a/src/utils/map/index.js b/src/utils/map/index.js new file mode 100644 index 0000000..4341f17 --- /dev/null +++ b/src/utils/map/index.js @@ -0,0 +1,110 @@ +import AMapLoader from '@amap/amap-jsapi-loader' + +var mapInitDone = false +var onMapMountedEvents = [] + +var AMap +// 鍦板浘瀵硅薄 +var map +// 鍗槦鍥惧眰 +var satellite +// 榧犳爣缁樺浘 +var mouseTool +// 3D鍥惧眰 +var object3Dlayer +// 鍦板浘鎷栧姩鐘舵�� +var isDragging = false + +// 鍦板浘鍔犺浇瀹屾垚瑙﹀彂 +function onMapMounted(...events) { + if (mapInitDone) { + events.forEach((e) => { + e() + }) + } else { + onMapMountedEvents = onMapMountedEvents.concat(events) + } +} + +function createMap(id) { + AMapLoader.load({ + key: 'c55f27799afbfa69dc5a3fad90cafe51', // 鐢宠濂界殑Web绔紑鍙戣�匥ey锛岄娆¤皟鐢� load 鏃跺繀濉� + version: '2.0', // 鎸囧畾瑕佸姞杞界殑 JS API 鐨勭増鏈紝缂虹渷鏃堕粯璁や负 1.4.15 + plugins: [ + 'Map3D', + 'ElasticMarker', + 'AMap.ControlBar', + 'AMap.ToolBar', + 'AMap.Scale', + 'AMap.DragRoute', + 'AMap.MouseTool', + 'AMap.PolygonEditor' + ] // 闇�瑕佷娇鐢ㄧ殑鐨勬彃浠跺垪琛紝濡傛瘮渚嬪昂'AMap.Scale'绛� + }) + .then((_AMap) => { + AMap = _AMap + _initMap(id) + mapInitDone = true + onMapMountedEvents.forEach((e) => { + e() + }) + onMapMountedEvents = [] + }) + .catch((e) => { + console.log(e) + }) +} + +function _initMap(elementId) { + map = new AMap.Map(elementId, { + rotateEnable: true, + pitchEnable: true, + alwaysRender: false, + showLabel: true, + showBuildingBlock: true, + mapStyle: 'amap://styles/e1e78509de64ddcd2efb4cb34c6fae2a', + features: ['bg', 'road'], + pitch: 45, // 鍦板浘淇话瑙掑害锛屾湁鏁堣寖鍥� 0 搴�- 83 搴� + viewMode: '3D', // 鍦板浘妯″紡 + resizeEnable: true, + center: [121.603928, 31.252955], + zooms: [3, 18], + zoom: 14 + }) + + // 娣诲姞鍗槦鍦板浘 + satellite = new AMap.TileLayer.Satellite() + satellite.hide() + map.add([satellite]) + + _initMouseTool() + // _init3DLayer(); + _initDragEvent() +} + +// 榧犳爣缁樺浘鍒濆鍖� +function _initMouseTool() { + mouseTool = new AMap.MouseTool(map) +} + +// 3D鍥惧眰鍒濆鍖� +// function _init3DLayer() { +// object3Dlayer = new AMap.Object3DLayer(); +// map.add(object3Dlayer); +// } + +// 璁剧疆鍦板浘鎷栨嫿鐩戝惉浜嬩欢 +function _initDragEvent() { + let dragEndEvent + map.on('dragstart', () => { + clearTimeout(dragEndEvent) + isDragging = true + }) + map.on('dragend', function () { + dragEndEvent = setTimeout(() => { + isDragging = false + }, 8000) + }) +} + +export { createMap, onMapMounted, map, AMap, mouseTool, object3Dlayer, isDragging } diff --git a/src/utils/map/marks.js b/src/utils/map/marks.js new file mode 100644 index 0000000..8882fea --- /dev/null +++ b/src/utils/map/marks.js @@ -0,0 +1,131 @@ +/** + * 楂樺痉鍦板浘鐐规爣璁扮粯鍒剁浉鍏� + */ + +import { map, AMap } from './index' + +var _massMarks = undefined + +export default { + /** + * 缁樺埗娴烽噺鐐规爣璁� + * @param fDatas 瀹屾暣鐩戞祴鏁版嵁 + * @param _factor 褰撳墠灞曠ず鐨勭洃娴嬪洜瀛愬璞� + */ + drawMassMarks(fDatas, _factor, onClick) { + if (_massMarks) { + map.remove(_massMarks) + _massMarks = undefined + } + const lnglats = fDatas.lnglats_GD + var data = [] + for (let i = 0; i < lnglats.length; i++) { + data.push({ + lnglat: lnglats[i], //鐐规爣璁颁綅缃� + name: `${fDatas.times[i]}<br/>${_factor.factorName}: ${_factor.datas[i].factorData} mg/m鲁`, + id: i + }) + } + + // 鍒涘缓鏍峰紡瀵硅薄 + var styleObject = { + url: 'https://a.amap.com/jsapi_demos/static/images/mass1.png', + // url: './asset/mipmap/ic_up_white.png', // 鍥炬爣鍦板潃 + + size: new AMap.Size(11, 11), // 鍥炬爣澶у皬 + + anchor: new AMap.Pixel(5, 5) // 鍥炬爣鏄剧ず浣嶇疆鍋忕Щ閲忥紝鍩哄噯鐐逛负鍥炬爣宸︿笂瑙� + } + + var massMarks = new AMap.MassMarks(data, { + zIndex: 5, // 娴烽噺鐐瑰浘灞傚彔鍔犵殑椤哄簭 + zooms: [15, 18], // 鍦ㄦ寚瀹氬湴鍥剧缉鏀剧骇鍒寖鍥村唴灞曠ず娴烽噺鐐瑰浘灞� + style: styleObject // 璁剧疆鏍峰紡瀵硅薄 + }) + massMarks.on('click', (event) => { + const i = event.data.id + // 3. 鑷畾涔夌偣鍑讳簨浠� + onClick(i) + }) + + var marker = new AMap.Marker({ + content: ' ', + map: map, + + offset: new AMap.Pixel(13, 12) + }) + var timeout + massMarks.on('mouseover', (e) => { + if (timeout) { + clearTimeout(timeout) + } + marker.setPosition(e.data.lnglat) + marker.setLabel({ content: e.data.name }) + map.add(marker) + timeout = setTimeout(() => { + map.remove(marker) + }, 2000) + }) + _massMarks = massMarks + map.add(massMarks) + }, + + createLabelMarks(img, dataList) { + const layer = new AMap.LabelsLayer({ + zooms: [3, 20], + zIndex: 1000, + // 寮�鍚爣娉ㄩ伩璁╋紝榛樿涓哄紑鍚紝v1.4.15 鏂板灞炴�� + collision: true, + // 寮�鍚爣娉ㄦ贰鍏ュ姩鐢伙紝榛樿涓哄紑鍚紝v1.4.15 鏂板灞炴�� + animation: true + }) + + map.add(layer) + + // var markers = []; + for (var i = 0; i < dataList.length; i++) { + const data = dataList[i] + var curData = { + name: data.sceneName, + position: [data.longitude, data.latitude], + zooms: [10, 20], + opacity: 1, + zIndex: 10, + icon: { + type: 'image', + image: img, + // clipOrigin: [14, 92], + // clipSize: [50, 68], + size: [30, 30], + anchor: 'bottom-center', + angel: 0, + retina: true + }, + text: { + content: data.sceneName, + direction: 'top', + offset: [0, -5], + style: { + fontSize: 16, + fontWeight: 'normal', + fillColor: '#fff', + strokeColor: '#333', + strokeWidth: 0, + backgroundColor: '#122b54a9' + } + } + } + curData.extData = { + index: i + } + + var labelMarker = new AMap.LabelMarker(curData) + + // markers.push(labelMarker); + + layer.add(labelMarker) + } + + return layer + } +} diff --git a/src/utils/time-util.js b/src/utils/time-util.js new file mode 100644 index 0000000..951116b --- /dev/null +++ b/src/utils/time-util.js @@ -0,0 +1,39 @@ +import dayjs from "dayjs"; + +export default { + format(date, template) { + return dayjs(date).format(template) + }, + + formatH(date){ + if (date) { + return this.format(date, 'HH:mm:ss') + } else { + return '--:--:--' + } + }, + + formatYM(date){ + if (date) { + return this.format(date, 'YYYY-MM') + } else { + return '----/--' + } + }, + + formatYMD(date){ + if (date) { + return this.format(date, 'YYYY-MM-DD') + } else { + return '----/--/--' + } + }, + + formatYMDH(date){ + if (date) { + return this.format(date, 'YYYY-MM-DD HH:mm:ss') + } else { + return '----/--/-- --:--:--' + } + }, +} \ No newline at end of file diff --git a/src/views/inspection/InspectionView.vue b/src/views/inspection/InspectionView.vue index d6f44b8..a42ca35 100644 --- a/src/views/inspection/InspectionView.vue +++ b/src/views/inspection/InspectionView.vue @@ -6,6 +6,9 @@ </template> <script setup> +/** + * 鐜板満宸℃煡瀹炴椂璺熻釜 + */ import TaskTrack from '@/views/inspection/TaskTrack.vue' </script> diff --git a/src/views/inspection/JointEnforcement.vue b/src/views/inspection/JointEnforcement.vue new file mode 100644 index 0000000..f722836 --- /dev/null +++ b/src/views/inspection/JointEnforcement.vue @@ -0,0 +1,20 @@ +<template> + <div class="border-r-small" style="height: 200px"> + <div class="f-l">鑱斿悎鎵ф硶</div> + </div> +</template> + +<script> +export default { + data() { + return { + tasks: [] + } + }, + watch: {}, + methods: {}, + mounted() {} +} +</script> + +<style scoped></style> diff --git a/src/views/inspection/SelfInspection.vue b/src/views/inspection/SelfInspection.vue new file mode 100644 index 0000000..86e2f1a --- /dev/null +++ b/src/views/inspection/SelfInspection.vue @@ -0,0 +1,20 @@ +<template> + <div class="border-r-small" style="height: 200px"> + <div class="f-l">搴旀�ヨ嚜宸℃煡</div> + </div> +</template> + +<script> +export default { + data() { + return { + tasks: [] + } + }, + watch: {}, + methods: {}, + mounted() {} +} +</script> + +<style scoped></style> diff --git a/src/views/inspection/TaskTrack.vue b/src/views/inspection/TaskTrack.vue index 97097a3..e0e6cf2 100644 --- a/src/views/inspection/TaskTrack.vue +++ b/src/views/inspection/TaskTrack.vue @@ -4,27 +4,52 @@ <!-- <div class="f-l">鐜板満宸℃煡璺熻釜锛堢幇鍦轰汉鍛樺贰鏌ユ儏鍐靛疄鏃舵帉鎻★級</div> --> <!-- <SubtaskItem v-for="item in subtaskList" :key="item.guid" v-bind="item"> </SubtaskItem> --> <el-col :span="4"> - <TaskNode title="鏂颁换鍔�" :items="subtaskList" v-slot="{ item, index }"> + <TaskNode + title="鏂颁换鍔�" + :items="subtaskList" + warning="璀﹀憡锛氭湁鍘嗗彶鏈畬鎴愪换鍔�" + v-slot="{ item, index }" + > <SubtaskItem v-bind="item" :index="index"> </SubtaskItem> </TaskNode> </el-col> <el-col :span="4"> - <TaskNode title="姝e湪鎵ц" :items="subtaskList" v-slot="{ item, index }"> + <TaskNode + title="姝e湪鎵ц" + :items="subtaskList" + warning="璀﹀憡锛氭湁鎵ц鏃堕棿杩囬暱鐨勪换鍔�" + v-slot="{ item, index }" + > <SubtaskItem v-bind="item" :index="index"> </SubtaskItem> </TaskNode> </el-col> <el-col :span="4"> - <TaskNode title="寰呭鏍�" :items="subtaskList" v-slot="{ item, index }"> + <TaskNode + title="寰呭鏍�" + :items="subtaskList" + warning="璀﹀憡锛氭湁闀挎椂闂存湭瀹℃牳闂" + v-slot="{ item, index }" + > <SubtaskExamineItem v-bind="item" :index="index" type="闂瀹℃牳"> </SubtaskExamineItem> </TaskNode> </el-col> <el-col :span="4"> - <TaskNode title="寰呮暣鏀�" :items="subtaskList" v-slot="{ item, index }"> + <TaskNode + title="寰呮暣鏀�" + :items="subtaskList" + warning="璀﹀憡锛氭湁闀挎椂闂存湭鏁存敼闂" + v-slot="{ item, index }" + > <SubtaskExamineItem v-bind="item" :index="index" type="寰呮暣鏀�"> </SubtaskExamineItem> </TaskNode> </el-col> <el-col :span="4"> - <TaskNode title="寰呯‘璁�" :items="subtaskList" v-slot="{ item, index }"> + <TaskNode + title="寰呯‘璁�" + :items="subtaskList" + warning="璀﹀憡锛氭湁闀挎椂闂存湭瀹℃牳鏁存敼" + v-slot="{ item, index }" + > <SubtaskExamineItem v-bind="item" :index="index" type="鏁存敼瀹℃牳"> </SubtaskExamineItem> </TaskNode> </el-col> diff --git a/src/views/main/MonitorView.vue b/src/views/main/MonitorView.vue index 5f35cd8..4a88dca 100644 --- a/src/views/main/MonitorView.vue +++ b/src/views/main/MonitorView.vue @@ -20,16 +20,20 @@ import InspectionView from '@/views/inspection/InspectionView.vue' import ManagementView from '@/views/management/ManagementView.vue' import VisualizationView from '@/views/visualization/VisualizationView.vue' + +import { provide } from 'vue' + +provide('mapHeight', 'calc(var(--fy-body-height) / 3 * 2)') </script> <style scoped> .page-left-top { - height: calc(var(--fy-body-height) / 2); - background-color: aquamarine; + height: calc(var(--fy-body-height) / 3 * 2); + /* background-color: aquamarine; */ } .page-left-bottom { - height: calc(var(--fy-body-height) / 2); - background-color: bisque; + height: calc(var(--fy-body-height) / 3 * 1); + /* background-color: bisque; */ } .page-right { diff --git a/src/views/management/ManagementView.vue b/src/views/management/ManagementView.vue index 681eeb0..9473a84 100644 --- a/src/views/management/ManagementView.vue +++ b/src/views/management/ManagementView.vue @@ -1,10 +1,12 @@ <template> <el-row> 缁熻绠$悊 </el-row> <TaskStats></TaskStats> + <TaskSummary></TaskSummary> </template> <script setup> import TaskStats from '@/views/management/TaskStats.vue' +import TaskSummary from '@/views/management/TaskSummary.vue' </script> <style scoped></style> diff --git a/src/views/management/TaskStats.vue b/src/views/management/TaskStats.vue index 509ba31..019e240 100644 --- a/src/views/management/TaskStats.vue +++ b/src/views/management/TaskStats.vue @@ -4,11 +4,26 @@ <el-row> <TaskItem v-for="item in tasks" :key="item.guid" v-bind="item"></TaskItem> </el-row> + <el-row> + <el-col :span="12"> + <SelfInspection></SelfInspection> + </el-col> + <el-col :span="12"> + <JointEnforcement></JointEnforcement> + </el-col> + </el-row> </div> </template> <script> +import SelfInspection from '@/views/inspection/SelfInspection.vue' +import JointEnforcement from '@/views/inspection/JointEnforcement.vue' + +/** + * 浠诲姟瀹屾垚鎯呭喌 + */ export default { + components: { SelfInspection, JointEnforcement }, data() { return { tasks: [] diff --git a/src/views/management/TaskSummary.vue b/src/views/management/TaskSummary.vue new file mode 100644 index 0000000..4bc0909 --- /dev/null +++ b/src/views/management/TaskSummary.vue @@ -0,0 +1,26 @@ +<template> + <el-row> 宸℃煡姹囨�� </el-row> + <el-row> + <el-col :span="8"> + <TaskSummaryItem title="浠婃棩姹囨��"></TaskSummaryItem> + </el-col> + <el-col :span="8"> + <TaskSummaryItem title="鍛ㄥ害姹囨��"></TaskSummaryItem> + </el-col> + <el-col :span="8"> + <TaskSummaryItem title="鏈堝害姹囨��"></TaskSummaryItem> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <TaskSummaryItem title="瀛e害姹囨��"></TaskSummaryItem> + </el-col> + <el-col :span="12"> + <TaskSummaryItem title="骞村害姹囨��"></TaskSummaryItem> + </el-col> + </el-row> +</template> + +<script setup></script> + +<style scoped></style> diff --git a/src/views/visualization/SubtaskVisual.vue b/src/views/visualization/SubtaskVisual.vue new file mode 100644 index 0000000..591758d --- /dev/null +++ b/src/views/visualization/SubtaskVisual.vue @@ -0,0 +1,95 @@ +<template> + <el-scrollbar :height="mapHeight"> + <el-card class="p-events-auto wrapper"> + <div>{{ subtask.name }}</div> + <el-timeline style="max-width: 600px"> + <el-timeline-item + v-for="(activity, index) in activities" + :key="index" + :timestamp="activity.timestamp" + :hide-timestamp="activity.running" + :type="activity.running ? 'danger' : 'success'" + :size="activity.running ? 'large' : 'normal'" + :hollow="false" + > + {{ activity.content }} + </el-timeline-item> + </el-timeline> + </el-card> + </el-scrollbar> +</template> + +<script> +import { inject } from 'vue' +/** + * 鍏蜂綋宸℃煡浠诲姟鍙鍖� + * 鍖呮嫭鍦板浘瀹氫綅淇℃伅灞曠ず銆佸贰鏌ヤ换鍔″叏娴佺▼骞抽摵灞曠ず + */ +export default { + setup() { + const mapHeight = inject('mapHeight') + + const height = 'height:' + mapHeight + return { height, mapHeight } + }, + props: { + subtask: { + type: Object, + default: () => { + return { + guid: 'SMuheEkjswioSn7A', + name: '涓鐢熸�佹暟瀛楁腐椤圭洰宸℃煡涓鐢熸�佹暟瀛楁腐椤圭洰宸℃煡', + district: '閲戝北鍖�', + planTime: '2024-06-04', + startTime: '2024-06-04 13:31:26', + endTime: '2024-06-04 13:33:37', + userName: '鏈辨寮�', + status: '宸茬粨鏉�', + total: 4, + checked: 2 + } + } + } + }, + data() { + return { + activities: [ + { + content: '浠诲姟鍒涘缓', + timestamp: '2024-06-04 08:00', + running: false + }, + { + content: '寮�濮嬪贰鏌�', + timestamp: '2024-06-04 09:00', + running: false + }, + { + content: '缁撴潫宸℃煡', + timestamp: '2024-06-04 09:15', + running: false + }, + { + content: '瀹屾垚闂瀹℃牳', + timestamp: '2024-06-04 10:15', + running: false + }, + { + content: '闂鏁存敼涓�...', + timestamp: '2024-06-04 10:15', + running: true + } + ] + } + } +} +</script> + +<style scoped> +.wrapper { + /* position: absolute; */ + top: 0; + right: 0; + /* background-color: wheat; */ +} +</style> diff --git a/src/views/visualization/SupervisionVisual.vue b/src/views/visualization/SupervisionVisual.vue new file mode 100644 index 0000000..d362111 --- /dev/null +++ b/src/views/visualization/SupervisionVisual.vue @@ -0,0 +1,70 @@ +<template> + <el-row> + <div class="p-events-auto"> + <OptionLocation :level="3" :width="170" v-model="locations"></OptionLocation> + <OptionSceneType :type="2" :width="120" v-model="sceneType"></OptionSceneType> + <OptionTime v-model="time"></OptionTime> + </div> + </el-row> +</template> + +<script> +import { inject } from 'vue' +import taskApi from '@/api/fysp/taskApi.js' +import marks from '@/utils/map/marks.js' +import scene_1 from '@/assets/icon/scene_1.png' +/** + * 鐩戠鍙鍖� + * 灞曠幇鍖哄煙鏁翠綋鐩戠鐘舵�� + */ +export default { + setup() { + const mapHeight = inject('mapHeight') + + const height = 'height:' + mapHeight + return { height, mapHeight } + }, + props: {}, + data() { + return { + locations: {}, + sceneType: {}, + time: '' + } + }, + computed: { + area() { + return { + provincecode: this.locations.pCode, + provincename: this.locations.pName, + citycode: this.locations.cCode, + cityname: this.locations.cName, + districtcode: this.locations.dCode, + districtname: this.locations.dName, + starttime: this.$fm.formatYMDH(this.time), + scensetypeid: this.sceneType.value + } + } + }, + methods: { + // 鏌ヨ + fetchSubtaskSummaryArea() { + return taskApi.fetchSubtaskSummaryArea(this.area).then((res) => { + let list = [] + res.data.forEach((e) => { + list = list.concat(e.subTaskSummary) + }) + this.newLabelMasks(list) + }) + }, + newLabelMasks(data) { + marks.createLabelMarks(scene_1, data) + } + }, + mounted() { + this.fetchSubtaskSummaryArea() + } +} +</script> + +<style scoped></style> diff --git a/src/views/visualization/VisualizationView.vue b/src/views/visualization/VisualizationView.vue index 920b0aa..89942b4 100644 --- a/src/views/visualization/VisualizationView.vue +++ b/src/views/visualization/VisualizationView.vue @@ -1,11 +1,35 @@ <template> - <el-row class="wrapper"> 鍙鍖� </el-row> + <!-- <el-row class="wrapper"> 鍙鍖� </el-row> --> + <BaseMap></BaseMap> + <el-row class="overlay-container" :style="height"> + <el-col :span="18"> + <SupervisionVisual></SupervisionVisual> + </el-col> + <el-col :span="6"> + <SubtaskVisual></SubtaskVisual> + </el-col> + </el-row> </template> -<script setup></script> +<script setup> +import SubtaskVisual from './SubtaskVisual.vue' +import SupervisionVisual from './SupervisionVisual.vue' +import { inject } from 'vue' + +const mapHeight = inject('mapHeight') + +const height = 'height:' + mapHeight +</script> <style scoped> -.wrapper { - /* background-color: aquamarine; */ +.overlay-container { + /* background: aliceblue; */ + position: absolute; + width: 100%; + /* height: 100vh; */ + top: 0; + left: 0; + /* padding: 4px; */ + pointer-events: none; } </style> -- Gitblit v1.9.3