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