From 5be9679fb4288936b576cf3d1f1548af1c4151b8 Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期一, 21 七月 2025 15:31:21 +0800 Subject: [PATCH] 2025.7.21 任务管理-监管地图功能(待完成) --- src/views/fysp/task/components/CompTaskMap.vue | 49 ++++++++- src/components/search-option/FYOptionSupervisionStatus.vue | 78 +++++++++++++++ src/enum/scene.js | 4 src/components.d.ts | 17 -- src/components/map/SceneMap.vue | 99 +++++++++++++++++-- src/views/fysp/task/TaskManage.vue | 4 src/views/fysp/task/components/CompMonitorPlan.vue | 2 src/components/search-option/FYOptionScene.vue | 15 ++ src/utils/map/marks.js | 13 ++ 9 files changed, 240 insertions(+), 41 deletions(-) diff --git a/src/components.d.ts b/src/components.d.ts index dfd2932..688bead 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -13,6 +13,7 @@ CompGenericWrapper: typeof import('./components/CompGenericWrapper.vue')['default'] CompQuickSet: typeof import('./components/search-option/CompQuickSet.vue')['default'] Content: typeof import('./components/core/Content.vue')['default'] + copy: typeof import('./components/search-option/FYOptionUserType copy.vue')['default'] ElAffix: typeof import('element-plus/es')['ElAffix'] ElAside: typeof import('element-plus/es')['ElAside'] ElAvatar: typeof import('element-plus/es')['ElAvatar'] @@ -20,7 +21,6 @@ ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem'] ElButton: typeof import('element-plus/es')['ElButton'] - ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup'] ElCalendar: typeof import('element-plus/es')['ElCalendar'] ElCard: typeof import('element-plus/es')['ElCard'] ElCascader: typeof import('element-plus/es')['ElCascader'] @@ -37,9 +37,6 @@ ElDialog: typeof import('element-plus/es')['ElDialog'] ElDivider: typeof import('element-plus/es')['ElDivider'] ElDrawer: typeof import('element-plus/es')['ElDrawer'] - ElDropdown: typeof import('element-plus/es')['ElDropdown'] - ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] - ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] ElEmpty: typeof import('element-plus/es')['ElEmpty'] ElForm: typeof import('element-plus/es')['ElForm'] ElFormItem: typeof import('element-plus/es')['ElFormItem'] @@ -55,17 +52,9 @@ ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup'] ElOption: typeof import('element-plus/es')['ElOption'] - ElPageHeader: typeof import('element-plus/es')['ElPageHeader'] - ElPagination: typeof import('element-plus/es')['ElPagination'] - ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm'] ElPopover: typeof import('element-plus/es')['ElPopover'] - ElRadio: typeof import('element-plus/es')['ElRadio'] - ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] - ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] ElRow: typeof import('element-plus/es')['ElRow'] - ElScroll: typeof import('element-plus/es')['ElScroll'] ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] - ElSegmented: typeof import('element-plus/es')['ElSegmented'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSpace: typeof import('element-plus/es')['ElSpace'] ElStep: typeof import('element-plus/es')['ElStep'] @@ -79,7 +68,6 @@ ElTag: typeof import('element-plus/es')['ElTag'] ElText: typeof import('element-plus/es')['ElText'] ElTooltip: typeof import('element-plus/es')['ElTooltip'] - ElTransfer: typeof import('element-plus/es')['ElTransfer'] ElTree: typeof import('element-plus/es')['ElTree'] ElUpload: typeof import('element-plus/es')['ElUpload'] Footer: typeof import('./components/core/Footer.vue')['default'] @@ -91,9 +79,12 @@ FYImageSelectDialog: typeof import('./components/FYImageSelectDialog.vue')['default'] FYInfoSearch: typeof import('./components/search-option/FYInfoSearch.vue')['default'] FYList: typeof import('./components/table/FYList.vue')['default'] + FYOption: typeof import('./components/search-option/FYOption.vue')['default'] FYOptionLocation: typeof import('./components/search-option/FYOptionLocation.vue')['default'] FYOptionOnlineStatus: typeof import('./components/search-option/FYOptionOnlineStatus.vue')['default'] FYOptionScene: typeof import('./components/search-option/FYOptionScene.vue')['default'] + FYOptionSupervision: typeof import('./components/search-option/FYOptionSupervision.vue')['default'] + FYOptionSupervisionStatus: typeof import('./components/search-option/FYOptionSupervisionStatus.vue')['default'] FYOptionText: typeof import('./components/search-option/base/FYOptionText.vue')['default'] FYOptionTime: typeof import('./components/search-option/FYOptionTime.vue')['default'] FYOptionUserType: typeof import('./components/search-option/FYOptionUserType.vue')['default'] diff --git a/src/components/map/SceneMap.vue b/src/components/map/SceneMap.vue index 7994a7f..fe296bd 100644 --- a/src/components/map/SceneMap.vue +++ b/src/components/map/SceneMap.vue @@ -1,8 +1,17 @@ <template> <BaseMap></BaseMap> + <el-row class="left-top-wrap"> + <FYOptionScene + label="" + :allOption="true" + :type="2" + v-model:value="scenetype" + ></FYOptionScene> + <slot name="left-top"></slot> + </el-row> </template> <script setup> -import { watch } from 'vue'; +import { ref, watch } from 'vue'; import { map, onMapMounted } from '@/utils/map/index'; import marks from '@/utils/map/marks'; import { sceneIcon } from '@/assets/scene-icon'; @@ -11,32 +20,100 @@ data: Array }); -var markViewList = []; +let allMarkViews = []; +let markViewList = []; + +const scenetype = ref(); watch( () => props.data, (nV, oV) => { if (nV != oV) { - drawSceneMarks(); + clearSceneMarks(); + createSceneMarks(); + filterMarkViews(); } }, { immediate: true } ); -function drawSceneMarks() { +watch(scenetype, (nV, oV) => { + if (nV != oV) { + clearSceneMarks(); + filterMarkViews(); + } +}); + +function createSceneMarks() { onMapMounted(() => { - markViewList = []; + allMarkViews = []; props.data.forEach((d) => { + // 鍒涘缓鍦烘櫙鍦板浘鏍囨敞 const mark = marks.createMarker({ position: [d.longitude, d.latitude], - icon: sceneIcon(d.typeid), - label: d.name, - extData: d.guid + img: sceneIcon(d.typeid), + // label: d.name, + extData: d }); - markViewList.push(mark); + // 娣诲姞鐐瑰嚮浜嬩欢 + mark.on('click', (ev) => { + const _mark = ev.target; + const _extData = _mark.getExtData(); + if (_extData._show) { + ev.target.setLabel({ + content: '' + // direction: 'bottom' + }); + _extData._show = false + ev.target.setExtData(_extData) + } else { + ev.target.setLabel({ + content: _extData.name + // direction: 'bottom' + }); + _extData._show = true + ev.target.setExtData(_extData) + } + }); + allMarkViews.push(mark); }); - map.setFitView(markViewList); + }); +} + +/** + * 绛涢�夋墍閫夌被鍨嬬殑鍦烘櫙 + */ +function filterMarkViews() { + onMapMounted(() => { + if (scenetype.value == undefined) { + markViewList = allMarkViews; + } else { + markViewList = allMarkViews.filter((v) => { + return ( + scenetype.value.value == null || + v.getExtData().typeid + '' == scenetype.value.value + ); + }); + } + map.add(markViewList); + setTimeout(() => { + map.setFitView(markViewList); + }, 1000); + }); +} + +function clearSceneMarks() { + onMapMounted(() => { + if (markViewList.length > 0) { + map.remove(markViewList); + } }); } </script> -<style scoped></style> +<style scoped> +.left-top-wrap { + position: absolute; + left: 0; + top: 0; +} +</style> diff --git a/src/components/search-option/FYOptionScene.vue b/src/components/search-option/FYOptionScene.vue index cbf4697..9815fd8 100644 --- a/src/components/search-option/FYOptionScene.vue +++ b/src/components/search-option/FYOptionScene.vue @@ -1,12 +1,17 @@ <template> - <el-form-item label="鍦烘櫙绫诲瀷" :prop="prop"> + <el-form-item :label="label" :prop="prop"> <el-select :model-value="value" @change="handleChange" - placeholder="鍦烘櫙绫诲瀷" + :placeholder="label" style="width: 150px" > - <el-option v-for="s in sceneTypes" :key="s.value" :label="s.label" :value="s" /> + <el-option + v-for="s in sceneTypes" + :key="s.value" + :label="s.label" + :value="s" + /> </el-select> </el-form-item> </template> @@ -21,6 +26,10 @@ type: Boolean, default: true }, + label: { + type: String, + default: '鍦烘櫙绫诲瀷' + }, // 1:椋炵窘鐜绯荤粺锛�2锛氶缇界洃绠$郴缁燂紱 type: { type: Number || String, diff --git a/src/components/search-option/FYOptionSupervisionStatus.vue b/src/components/search-option/FYOptionSupervisionStatus.vue new file mode 100644 index 0000000..b90fbf4 --- /dev/null +++ b/src/components/search-option/FYOptionSupervisionStatus.vue @@ -0,0 +1,78 @@ +<template> + <el-form-item :label="label" :prop="prop"> + <el-select + :model-value="value" + @change="handleChange" + :placeholder="label" + style="width: 150px" + > + <el-option + v-for="s in options" + :key="s.value" + :label="s.label" + :value="s" + /> + </el-select> + </el-form-item> +</template> + +<script> + +export default { + props: { + // 鏄惁鍦ㄩ閫夐」澶勬坊鍔犫�滃叏閮ㄢ�濋�夐」 + allOption: { + type: Boolean, + default: true + }, + label: { + type: String, + default: '鐩戠鐘舵��' + }, + // 杩斿洖缁撴灉 + value: Object, + // 鏄惁榛樿杩斿洖鍒濆閫夐」 + initValue: { + type: Boolean, + default: true + }, + prop: { + type: String, + default: '_usertype' + } + }, + emits: ['update:value'], + data() { + return { + options: [ + { + label: '鍏ㄩ儴鐩戠鐘舵��', + value: null + }, + { + label: '鏈洃绠�', + value: '0' + }, + { + label: '宸茬洃绠�', + value: '1' + }, + { + label: '宸插鏍�', + value: '2' + } + ] + }; + }, + methods: { + handleChange(value) { + this.$emit('update:value', value); + } + }, + mounted() { + if (this.initValue) { + this.handleChange(this.options[0]); + } + } +}; +</script> diff --git a/src/enum/scene.js b/src/enum/scene.js index 4e07130..a292c5d 100644 --- a/src/enum/scene.js +++ b/src/enum/scene.js @@ -35,7 +35,7 @@ function _enumScene_1() { return [ { - label: '鍏ㄩ儴', + label: '鍏ㄩ儴鍦烘櫙', value: null }, { @@ -81,7 +81,7 @@ function _enumScene_2() { return [ { - label: '鍏ㄩ儴', + label: '鍏ㄩ儴鍦烘櫙', value: null }, { diff --git a/src/utils/map/marks.js b/src/utils/map/marks.js index bf01656..b957b7f 100644 --- a/src/utils/map/marks.js +++ b/src/utils/map/marks.js @@ -145,10 +145,17 @@ return layer; }, - createMarker({ position, icon, label, extData }) { + createMarker({ position, img, label, extData }) { + //鍒涘缓 AMap.Icon 瀹炰緥锛� + const icon = new AMap.Icon({ + size: new AMap.Size(30, 30), //鍥炬爣灏哄 + image: img, //Icon 鐨勫浘鍍� + // imageOffset: new AMap.Pixel(-9, -3), //鍥惧儚鐩稿灞曠ず鍖哄煙鐨勫亸绉婚噺锛岄�備簬闆ⅶ鍥剧瓑 + imageSize: new AMap.Size(30, 30) //鏍规嵁鎵�璁剧疆鐨勫ぇ灏忔媺浼告垨鍘嬬缉鍥剧墖 + }); const marker = new AMap.Marker({ position: position, - offset: new AMap.Pixel(-10, -10), + // offset: new AMap.Pixel(-13, -30), icon: icon, //娣诲姞 icon 鍥炬爣 URL title: label, label: { @@ -157,7 +164,7 @@ }, extData }); - map.add(marker); + // map.add(marker); return marker; } }; diff --git a/src/views/fysp/task/TaskManage.vue b/src/views/fysp/task/TaskManage.vue index 07d98d9..40ace5d 100644 --- a/src/views/fysp/task/TaskManage.vue +++ b/src/views/fysp/task/TaskManage.vue @@ -43,7 +43,7 @@ <CompMonitorPlan ref="planRef" :task="curTask.data" - :day-task-list="dayTaskList" + :day-task-list="curDayTaskList" @date-change="onDateChange" ></CompMonitorPlan> </el-col> @@ -283,7 +283,7 @@ return taskApi .fetchDayTasks(this.curTask.data.tguid) .then((res) => { - this.dayTaskList = res; + this.curDayTaskList = res; }) .finally(() => (this.dayTaskLoading = false)); }, diff --git a/src/views/fysp/task/components/CompMonitorPlan.vue b/src/views/fysp/task/components/CompMonitorPlan.vue index c1e2856..954a280 100644 --- a/src/views/fysp/task/components/CompMonitorPlan.vue +++ b/src/views/fysp/task/components/CompMonitorPlan.vue @@ -104,7 +104,7 @@ watch( () => props.dayTaskList, (nV, oV) => { - if (nV != oV && dateValue.value) { + if (nV && dateValue.value) { onDateChange(dateValue.value); } }, diff --git a/src/views/fysp/task/components/CompTaskMap.vue b/src/views/fysp/task/components/CompTaskMap.vue index 9079ab7..4ca6f09 100644 --- a/src/views/fysp/task/components/CompTaskMap.vue +++ b/src/views/fysp/task/components/CompTaskMap.vue @@ -1,10 +1,19 @@ <template> - <div style="width: 70vw; height: 600px; background-color: aliceblue"> - <SceneMap :data="scenes"></SceneMap> + <div style="width: 68vw; height: 600px; background-color: aliceblue"> + <SceneMap :data="scenes"> + <template #left-top> + <FYOptionSupervisionStatus + label="" + :allOption="true" + v-model:value="supervisionStatus" + ></FYOptionSupervisionStatus> + </template> + </SceneMap> </div> </template> <script setup> -import { computed } from 'vue'; +import { ref, computed } from 'vue'; + const props = defineProps({ // 鍦烘櫙璁″垝 plans: { @@ -17,9 +26,37 @@ } }); +const supervisionStatus = ref(); + const scenes = computed(() => { - return props.plans.map((p) => { - return p.scene; - }); + return props.plans + .filter((v) => { + if (supervisionStatus.value) { + switch (supervisionStatus.value.value) { + case '0': + return ( + v.extension1 == undefined || + v.extension1 == null || + v.extension1 == '0' + ); + case '1': + return v.extension1 == '1'; + case '2': + return v.extension1 == '2'; + default: + return true; + } + } else { + return true + } + // if (supervisionStatus.value) { + // supervisionStatus.value; + // } else { + // return true; + // } + }) + .map((p) => { + return p.scene; + }); }); </script> -- Gitblit v1.9.3