From f19e5267cc23b1c714dc746239864f33ed715dd9 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期五, 05 十二月 2025 17:55:02 +0800
Subject: [PATCH] 完成地图制作任务功能初版

---
 src/styles/element/base.scss                                           |    3 
 src/views/fysp/task/components/CompTaskMap.vue                         |  108 +++
 src/views/fysp/task/components/CompSubTaskSelect.vue                   |   44 +
 package-lock.json                                                      |  613 +++++++++++++++++++++--
 src/views/fysp/check/components/CompProblemAddOrUpd copy.vue           |    6 
 src/components/CompGenericWrapper.vue                                  |    4 
 src/assets/dialog.css                                                  |    6 
 src/utils/time-util.js                                                 |    2 
 src/router/index.js                                                    |    2 
 src/utils/map/marks.js                                                 |    5 
 src/views/fysp/task/TaskProxy.js                                       |   52 +
 src/components/FYImageSelectDialog.vue                                 |    2 
 src/composables/messageBox.js                                          |    2 
 src/views/fysp/data-product/final-data-product/ProdMonInspecReport.vue |    6 
 src/views/fysp/task/components/CompDayTask.vue                         |   75 --
 package.json                                                           |    4 
 src/views/fysp/check/components/CompProblemAddOrUpd.vue                |    6 
 src/components/list-item/ItemSubTask.vue                               |   35 
 src/components/map/SceneMap.vue                                        |  379 ++++++++++----
 src/views/fysp/check/components/ComChangeEdit.vue                      |    8 
 src/views/fysp/task/components/CompSubTaskList.vue                     |   28 
 src/views/fysp/task/TaskManage.vue                                     |  117 ++-
 src/views/fysp/task/components/CompMonitorPlan.vue                     |   38 +
 23 files changed, 1,187 insertions(+), 358 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index c5270a2..1b5f587 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,7 +20,7 @@
         "docxtemplater-image-module": "^3.1.0",
         "docxtemplater-image-module-free": "^1.1.1",
         "echarts": "^5.5.1",
-        "element-plus": "^2.8.3",
+        "element-plus": "^2.11.9",
         "exceljs": "^4.4.0",
         "file-saver": "^2.0.5",
         "js-base64": "^3.7.5",
@@ -59,7 +59,7 @@
         "less": "^4.1.3",
         "less-loader": "^11.1.0",
         "prettier": "^3.1.0",
-        "sass": "^1.56.2",
+        "sass": "^1.94.2",
         "start-server-and-test": "^1.14.0",
         "typescript": "^4.9.4",
         "unplugin-element-plus": "^0.4.1",
@@ -1865,9 +1865,9 @@
       }
     },
     "node_modules/@element-plus/icons-vue": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
-      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+      "version": "2.3.2",
+      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
+      "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
       "peerDependencies": {
         "vue": "^3.2.0"
       }
@@ -2195,6 +2195,302 @@
         "node": ">= 8"
       }
     },
+    "node_modules/@parcel/watcher": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz",
+      "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "dependencies": {
+        "detect-libc": "^1.0.3",
+        "is-glob": "^4.0.3",
+        "micromatch": "^4.0.5",
+        "node-addon-api": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      },
+      "optionalDependencies": {
+        "@parcel/watcher-android-arm64": "2.5.1",
+        "@parcel/watcher-darwin-arm64": "2.5.1",
+        "@parcel/watcher-darwin-x64": "2.5.1",
+        "@parcel/watcher-freebsd-x64": "2.5.1",
+        "@parcel/watcher-linux-arm-glibc": "2.5.1",
+        "@parcel/watcher-linux-arm-musl": "2.5.1",
+        "@parcel/watcher-linux-arm64-glibc": "2.5.1",
+        "@parcel/watcher-linux-arm64-musl": "2.5.1",
+        "@parcel/watcher-linux-x64-glibc": "2.5.1",
+        "@parcel/watcher-linux-x64-musl": "2.5.1",
+        "@parcel/watcher-win32-arm64": "2.5.1",
+        "@parcel/watcher-win32-ia32": "2.5.1",
+        "@parcel/watcher-win32-x64": "2.5.1"
+      }
+    },
+    "node_modules/@parcel/watcher-android-arm64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
+      "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-arm64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
+      "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-x64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
+      "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-freebsd-x64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
+      "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm-glibc": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
+      "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm-musl": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
+      "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-glibc": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
+      "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-musl": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
+      "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-glibc": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
+      "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-musl": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
+      "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-arm64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
+      "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-ia32": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
+      "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-x64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
+      "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
     "node_modules/@popperjs/core": {
       "name": "@sxzz/popperjs-es",
       "version": "2.11.7",
@@ -2287,12 +2583,14 @@
       "license": "MIT"
     },
     "node_modules/@types/lodash": {
-      "version": "4.14.191",
-      "license": "MIT"
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ=="
     },
     "node_modules/@types/lodash-es": {
-      "version": "4.17.6",
-      "license": "MIT",
+      "version": "4.17.12",
+      "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+      "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
       "dependencies": {
         "@types/lodash": "*"
       }
@@ -4060,9 +4358,9 @@
       }
     },
     "node_modules/dayjs": {
-      "version": "1.11.13",
-      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
-      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+      "version": "1.11.19",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz",
+      "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="
     },
     "node_modules/debug": {
       "version": "4.3.4",
@@ -4157,6 +4455,19 @@
       "license": "MIT",
       "engines": {
         "node": ">=0.4.0"
+      }
+    },
+    "node_modules/detect-libc": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz",
+      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+      "dev": true,
+      "optional": true,
+      "bin": {
+        "detect-libc": "bin/detect-libc.js"
+      },
+      "engines": {
+        "node": ">=0.10"
       }
     },
     "node_modules/dfa": {
@@ -4327,23 +4638,22 @@
       "license": "ISC"
     },
     "node_modules/element-plus": {
-      "version": "2.8.3",
-      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.8.3.tgz",
-      "integrity": "sha512-BXQOyDf0s7JHyNEV8iaO+iaOzTZPsBXVKMzMI967vLCodUBDLrtiY5vglAn1YEebQcUOEUMhGcttTpIvEkcBjQ==",
+      "version": "2.11.9",
+      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.11.9.tgz",
+      "integrity": "sha512-yTckX+fMGDGiBHVL1gpwfmjEc8P8OwuyU5ZX3f4FhMy2OdC2Y+OwQYWUXmuB+jFMukuSdnGYXYgHq6muBjSxTg==",
       "dependencies": {
         "@ctrl/tinycolor": "^3.4.1",
-        "@element-plus/icons-vue": "^2.3.1",
+        "@element-plus/icons-vue": "^2.3.2",
         "@floating-ui/dom": "^1.0.1",
         "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
-        "@types/lodash": "^4.14.182",
-        "@types/lodash-es": "^4.17.6",
+        "@types/lodash": "^4.17.20",
+        "@types/lodash-es": "^4.17.12",
         "@vueuse/core": "^9.1.0",
         "async-validator": "^4.2.5",
-        "dayjs": "^1.11.3",
-        "escape-html": "^1.0.3",
+        "dayjs": "^1.11.19",
         "lodash": "^4.17.21",
         "lodash-es": "^4.17.21",
-        "lodash-unified": "^1.0.2",
+        "lodash-unified": "^1.0.3",
         "memoize-one": "^6.0.0",
         "normalize-wheel-es": "^1.2.0"
       },
@@ -4509,10 +4819,6 @@
       "engines": {
         "node": ">=6"
       }
-    },
-    "node_modules/escape-html": {
-      "version": "1.0.3",
-      "license": "MIT"
     },
     "node_modules/escape-string-regexp": {
       "version": "4.0.0",
@@ -5636,9 +5942,10 @@
       "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
     },
     "node_modules/immutable": {
-      "version": "4.1.0",
-      "dev": true,
-      "license": "MIT"
+      "version": "5.1.4",
+      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.4.tgz",
+      "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==",
+      "dev": true
     },
     "node_modules/import-fresh": {
       "version": "3.3.0",
@@ -6731,6 +7038,13 @@
       "license": "MIT",
       "peer": true
     },
+    "node_modules/node-addon-api": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz",
+      "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+      "dev": true,
+      "optional": true
+    },
     "node_modules/node-releases": {
       "version": "2.0.6",
       "dev": true,
@@ -7556,19 +7870,51 @@
       "license": "MIT"
     },
     "node_modules/sass": {
-      "version": "1.56.2",
+      "version": "1.94.2",
+      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.94.2.tgz",
+      "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "chokidar": ">=3.0.0 <4.0.0",
-        "immutable": "^4.0.0",
+        "chokidar": "^4.0.0",
+        "immutable": "^5.0.2",
         "source-map-js": ">=0.6.2 <2.0.0"
       },
       "bin": {
         "sass": "sass.js"
       },
       "engines": {
-        "node": ">=12.0.0"
+        "node": ">=14.0.0"
+      },
+      "optionalDependencies": {
+        "@parcel/watcher": "^2.4.1"
+      }
+    },
+    "node_modules/sass/node_modules/chokidar": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz",
+      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+      "dev": true,
+      "dependencies": {
+        "readdirp": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 14.16.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/sass/node_modules/readdirp": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz",
+      "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 14.18.0"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://paulmillr.com/funding/"
       }
     },
     "node_modules/sax": {
@@ -10321,9 +10667,9 @@
       }
     },
     "@element-plus/icons-vue": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
-      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+      "version": "2.3.2",
+      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
+      "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
       "requires": {}
     },
     "@eslint-community/eslint-utils": {
@@ -10573,6 +10919,123 @@
         "fastq": "^1.6.0"
       }
     },
+    "@parcel/watcher": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz",
+      "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "@parcel/watcher-android-arm64": "2.5.1",
+        "@parcel/watcher-darwin-arm64": "2.5.1",
+        "@parcel/watcher-darwin-x64": "2.5.1",
+        "@parcel/watcher-freebsd-x64": "2.5.1",
+        "@parcel/watcher-linux-arm-glibc": "2.5.1",
+        "@parcel/watcher-linux-arm-musl": "2.5.1",
+        "@parcel/watcher-linux-arm64-glibc": "2.5.1",
+        "@parcel/watcher-linux-arm64-musl": "2.5.1",
+        "@parcel/watcher-linux-x64-glibc": "2.5.1",
+        "@parcel/watcher-linux-x64-musl": "2.5.1",
+        "@parcel/watcher-win32-arm64": "2.5.1",
+        "@parcel/watcher-win32-ia32": "2.5.1",
+        "@parcel/watcher-win32-x64": "2.5.1",
+        "detect-libc": "^1.0.3",
+        "is-glob": "^4.0.3",
+        "micromatch": "^4.0.5",
+        "node-addon-api": "^7.0.0"
+      }
+    },
+    "@parcel/watcher-android-arm64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
+      "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-darwin-arm64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
+      "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-darwin-x64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
+      "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-freebsd-x64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
+      "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-linux-arm-glibc": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
+      "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-linux-arm-musl": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
+      "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-linux-arm64-glibc": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
+      "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-linux-arm64-musl": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
+      "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-linux-x64-glibc": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
+      "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-linux-x64-musl": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
+      "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-win32-arm64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
+      "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-win32-ia32": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
+      "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-win32-x64": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
+      "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
+      "dev": true,
+      "optional": true
+    },
     "@popperjs/core": {
       "version": "npm:@sxzz/popperjs-es@2.11.7"
     },
@@ -10642,10 +11105,14 @@
       "dev": true
     },
     "@types/lodash": {
-      "version": "4.14.191"
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ=="
     },
     "@types/lodash-es": {
-      "version": "4.17.6",
+      "version": "4.17.12",
+      "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+      "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
       "requires": {
         "@types/lodash": "*"
       }
@@ -11850,9 +12317,9 @@
       }
     },
     "dayjs": {
-      "version": "1.11.13",
-      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
-      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+      "version": "1.11.19",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz",
+      "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="
     },
     "debug": {
       "version": "4.3.4",
@@ -11911,6 +12378,13 @@
     },
     "delayed-stream": {
       "version": "1.0.0"
+    },
+    "detect-libc": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz",
+      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+      "dev": true,
+      "optional": true
     },
     "dfa": {
       "version": "1.2.0",
@@ -12061,23 +12535,22 @@
       "dev": true
     },
     "element-plus": {
-      "version": "2.8.3",
-      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.8.3.tgz",
-      "integrity": "sha512-BXQOyDf0s7JHyNEV8iaO+iaOzTZPsBXVKMzMI967vLCodUBDLrtiY5vglAn1YEebQcUOEUMhGcttTpIvEkcBjQ==",
+      "version": "2.11.9",
+      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.11.9.tgz",
+      "integrity": "sha512-yTckX+fMGDGiBHVL1gpwfmjEc8P8OwuyU5ZX3f4FhMy2OdC2Y+OwQYWUXmuB+jFMukuSdnGYXYgHq6muBjSxTg==",
       "requires": {
         "@ctrl/tinycolor": "^3.4.1",
-        "@element-plus/icons-vue": "^2.3.1",
+        "@element-plus/icons-vue": "^2.3.2",
         "@floating-ui/dom": "^1.0.1",
         "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
-        "@types/lodash": "^4.14.182",
-        "@types/lodash-es": "^4.17.6",
+        "@types/lodash": "^4.17.20",
+        "@types/lodash-es": "^4.17.12",
         "@vueuse/core": "^9.1.0",
         "async-validator": "^4.2.5",
-        "dayjs": "^1.11.3",
-        "escape-html": "^1.0.3",
+        "dayjs": "^1.11.19",
         "lodash": "^4.17.21",
         "lodash-es": "^4.17.21",
-        "lodash-unified": "^1.0.2",
+        "lodash-unified": "^1.0.3",
         "memoize-one": "^6.0.0",
         "normalize-wheel-es": "^1.2.0"
       },
@@ -12186,9 +12659,6 @@
     "escalade": {
       "version": "3.1.1",
       "dev": true
-    },
-    "escape-html": {
-      "version": "1.0.3"
     },
     "escape-string-regexp": {
       "version": "4.0.0",
@@ -12924,7 +13394,9 @@
       "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
     },
     "immutable": {
-      "version": "4.1.0",
+      "version": "5.1.4",
+      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.4.tgz",
+      "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==",
       "dev": true
     },
     "import-fresh": {
@@ -13685,6 +14157,13 @@
       "dev": true,
       "peer": true
     },
+    "node-addon-api": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz",
+      "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+      "dev": true,
+      "optional": true
+    },
     "node-releases": {
       "version": "2.0.6",
       "dev": true
@@ -14199,12 +14678,32 @@
       "version": "2.1.2"
     },
     "sass": {
-      "version": "1.56.2",
+      "version": "1.94.2",
+      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.94.2.tgz",
+      "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==",
       "dev": true,
       "requires": {
-        "chokidar": ">=3.0.0 <4.0.0",
-        "immutable": "^4.0.0",
+        "@parcel/watcher": "^2.4.1",
+        "chokidar": "^4.0.0",
+        "immutable": "^5.0.2",
         "source-map-js": ">=0.6.2 <2.0.0"
+      },
+      "dependencies": {
+        "chokidar": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz",
+          "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+          "dev": true,
+          "requires": {
+            "readdirp": "^4.0.1"
+          }
+        },
+        "readdirp": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz",
+          "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+          "dev": true
+        }
       }
     },
     "sax": {
diff --git a/package.json b/package.json
index 4c12d0f..cb5560b 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,7 @@
     "docxtemplater-image-module": "^3.1.0",
     "docxtemplater-image-module-free": "^1.1.1",
     "echarts": "^5.5.1",
-    "element-plus": "^2.8.3",
+    "element-plus": "^2.11.9",
     "exceljs": "^4.4.0",
     "file-saver": "^2.0.5",
     "js-base64": "^3.7.5",
@@ -64,7 +64,7 @@
     "less": "^4.1.3",
     "less-loader": "^11.1.0",
     "prettier": "^3.1.0",
-    "sass": "^1.56.2",
+    "sass": "^1.94.2",
     "start-server-and-test": "^1.14.0",
     "typescript": "^4.9.4",
     "unplugin-element-plus": "^0.4.1",
diff --git a/src/assets/dialog.css b/src/assets/dialog.css
index 0c5d374..75962cc 100644
--- a/src/assets/dialog.css
+++ b/src/assets/dialog.css
@@ -1,9 +1,9 @@
-::v-deep .el-dialog {
+:deep(.el-dialog) {
     --el-dialog-margin-top: 8vh;
 }
-::v-deep .el-dialog__body {
+:deep(.el-dialog__body) {
     padding: 0 var(--el-dialog-padding-primary) var(--el-dialog-padding-primary) var(--el-dialog-padding-primary);
 }
-::v-deep .el-drawer__body {
+:deep(.el-drawer__body) {
     padding: 0 var(--el-drawer-padding-primary);
 }
\ No newline at end of file
diff --git a/src/components/CompGenericWrapper.vue b/src/components/CompGenericWrapper.vue
index 8048cb5..c641608 100644
--- a/src/components/CompGenericWrapper.vue
+++ b/src/components/CompGenericWrapper.vue
@@ -68,11 +68,11 @@
 );
 </script>
 <style scoped>
-::v-deep .el-drawer__body {
+:deep(.el-drawer__body) {
   padding-top: 0;
 }
 
-::v-deep .el-drawer__header {
+:deep(.el-drawer__header) {
   margin-bottom: 16px;
 }
 </style>
diff --git a/src/components/FYImageSelectDialog.vue b/src/components/FYImageSelectDialog.vue
index c35bc94..3bffbf1 100644
--- a/src/components/FYImageSelectDialog.vue
+++ b/src/components/FYImageSelectDialog.vue
@@ -304,7 +304,7 @@
   padding: 5px;
 }
 
-::v-deep .el-dialog__body {
+:deep(.el-dialog__body) {
   padding: 10px calc(var(--el-dialog-padding-primary) + 10px) !important;
 }
 </style>
diff --git a/src/components/list-item/ItemSubTask.vue b/src/components/list-item/ItemSubTask.vue
index 93c3e8f..42cc041 100644
--- a/src/components/list-item/ItemSubTask.vue
+++ b/src/components/list-item/ItemSubTask.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="wrapper">
     <el-row justify="space-between" class="m-t-4">
-      <el-col :span="20">
+      <el-col :span="24">
         <div class="text-title">
           <el-tag
             size="small"
@@ -31,7 +31,9 @@
             <el-icon class="m-r-4" size="16"><AlarmClock /></el-icon>
             <span>鏃堕棿锛�</span>
           </div>
-          {{ $fm.formatYMDHM(item.executionstarttime) }}鑷硔{ $fm.formatYMDHM(item.executionendtime) }}
+          {{ $fm.formatYMDHM(item.executionstarttime) }}鑷硔{
+            $fm.formatYMDHM(item.executionendtime)
+          }}
         </div>
         <div class="text-info">
           <div class="text-label">
@@ -40,21 +42,22 @@
           </div>
           {{ item.executorrealtimes }}
         </div>
-        <el-space class="m-t-4">
-          <el-tag size="small" type="info" effect=""
-            >闂锛歿{ status.proNum }}</el-tag
-          >
-          <el-tag size="small" type="info" effect=""
-            >鏁存敼锛歿{ status.changeNum }}</el-tag
-          >
-          <el-tag size="small" :type="changePerType" effect=""
-            >鏁存敼鐜囷細{{ status.changePer }}</el-tag
-          >
-        </el-space>
+        <el-row justify="space-between">
+          <el-space class="m-t-4">
+            <el-tag size="small" type="info" effect=""
+              >闂锛歿{ status.proNum }}</el-tag
+            >
+            <el-tag size="small" type="info" effect=""
+              >鏁存敼锛歿{ status.changeNum }}</el-tag
+            >
+            <el-tag size="small" :type="changePerType" effect=""
+              >鏁存敼鐜囷細{{ status.changePer }}</el-tag
+            >
+          </el-space>
+          <slot :item="item"></slot>
+        </el-row>
       </el-col>
-      <el-col :span="4">
-        <slot :item="item"></slot>
-      </el-col>
+      <!-- <el-col :span="4"> </el-col> -->
     </el-row>
   </div>
 </template>
diff --git a/src/components/map/SceneMap.vue b/src/components/map/SceneMap.vue
index 42dede6..bcb2076 100644
--- a/src/components/map/SceneMap.vue
+++ b/src/components/map/SceneMap.vue
@@ -1,7 +1,7 @@
 <template>
   <BaseMap></BaseMap>
   <div class="wrap p-events-none">
-    <el-row class="p-events-none">
+    <el-row class="p-events-none top-left-wrap">
       <FYOptionScene
         class="p-events-auto"
         label=""
@@ -14,67 +14,95 @@
       </div>
     </el-row>
     <el-row
-      class="p-events-none left-wrap"
-      align="bottom"
+      class="p-events-none bottom-left-wrap"
+      align="middle"
       :style="leftCardWrapStyle"
     >
-      <div
-        ref="refLeftCard"
-        v-show="leftCardShow"
-        class="card-left p-events-auto"
-      >
-        <div><el-text size="large">鍦烘櫙鍒楄〃</el-text></div>
-        <el-scrollbar height="400px" class="scrollbar">
-          <el-row
-            v-for="s in selectedSceneList"
-            :key="s.guid"
-            justify="space-between"
-            class="p-v-4 scene-item"
-          >
-            <el-text truncated style="width: 250px">
-              {{ s.index + '銆�' + s.name }}
-            </el-text>
-            <el-space>
-              <el-icon
-                :color="
-                  s._checked ? 'rgb(121, 187, 255)' : 'rgb(200, 201, 204)'
-                "
-                @click="locateTo(s)"
-              >
-                <LocationInformation />
-              </el-icon>
-              <el-icon
-                class="cursor-p"
-                :color="
-                  s._visible ? 'rgb(121, 187, 255)' : 'rgb(200, 201, 204)'
-                "
-                @click="handleVisibleChange(s)"
-              >
-                <View />
-              </el-icon>
-            </el-space>
+      <div class="card-left" ref="refLeftCard">
+        <div v-show="leftCardShow" class="p-events-auto">
+          <el-row ref="refLeftCardTitle" class="p-8" justify="space-between">
+            <el-text size="large">鍦烘櫙鍒楄〃</el-text>
+            <el-input
+              v-model="filterText"
+              icon="Search"
+              style="width: 250px"
+              placeholder="杈撳叆鍏抽敭瀛楋紝鎸夊洖杞﹂敭鎼滅储"
+              clearable
+            />
+            <!-- <el-badge
+              ref="sampleBadgeRef"
+              :value="1"
+              type="success"
+              :offset="[-2, 2]"
+            >
+              <img
+                style="width: 30px; height: 30px"
+                :src="sceneIcon(1)"
+                alt="宸ュ湴"
+              />
+              <template #content="{ value }">
+                <div class="custom-content">
+                  <el-icon :size="8"><Select /></el-icon>
+                </div>
+              </template>
+            </el-badge> -->
           </el-row>
-        </el-scrollbar>
+          <el-scrollbar :height="scrollHeight" class="scrollbar">
+            <el-row
+              v-for="s in filteredSceneList"
+              :key="s.guid"
+              justify="space-between"
+              class="p-v-4 scene-item"
+            >
+              <el-text truncated style="width: 100%">
+                {{ s.index + '. ' + s.name }}
+              </el-text>
+              <el-row justify="space-between" style="margin-top: 4px">
+                <el-space>
+                  <el-tag type="info" effect="plain" size="small">
+                    {{ s.type }}
+                  </el-tag>
+                  <el-tag
+                    :type="s.extension1 == '0' ? 'info' : 'success'"
+                    size="small"
+                  >
+                    {{ onlineFormat(s.extension1) }}
+                  </el-tag>
+                </el-space>
+              </el-row>
+              <el-space>
+                <el-icon
+                  class="cursor-p"
+                  :color="
+                    s._checked ? 'rgb(121, 187, 255)' : 'rgb(200, 201, 204)'
+                  "
+                  @click="locateTo(s)"
+                >
+                  <LocationInformation />
+                </el-icon>
+                <el-icon
+                  class="cursor-p"
+                  :color="
+                    s._visible ? 'rgb(121, 187, 255)' : 'rgb(200, 201, 204)'
+                  "
+                  @click="handleVisibleChange(s)"
+                >
+                  <View />
+                </el-icon>
+              </el-space>
+            </el-row>
+          </el-scrollbar>
+        </div>
       </div>
       <el-button
         class="close-btn-right p-events-auto"
-        type="primary"
-        plain
+        type="success"
         size="small"
         :icon="leftCardShow ? 'ArrowLeft' : 'ArrowRight'"
         @click="leftCardShow = !leftCardShow"
       ></el-button>
     </el-row>
   </div>
-
-  <!-- <el-row class="right-wrap">
-    <el-col :span="4">
-      <el-button>close</el-button>
-    </el-col>
-    <el-col :span="20">
-      
-    </el-col>
-  </el-row> -->
 </template>
 <script setup>
 import { ref, watch, computed, onMounted } from 'vue';
@@ -82,34 +110,88 @@
 import marks from '@/utils/map/marks';
 import mapUtil from '@/utils/map/util';
 import { sceneIcon } from '@/assets/scene-icon';
+
+const startHtml = `<div class="el-badge">`;
+const endHtml = `<sup
+      class="el-badge__content el-badge__content--success is-fixed"
+      style="margin-top: 2px; margin-right: 2px"
+    >
+      <div class="custom-content">
+        <i class="el-icon"  style="font-size: 8px">
+          <svg
+            xmlns="http://www.w3.org/2000/svg"
+            viewBox="0 0 1024 1024"
+          >
+            <path
+              fill="currentColor"
+              d="M77.248 415.04a64 64 0 0 1 90.496 0l226.304 226.304L846.528 188.8a64 64 0 1 1 90.56 90.496l-543.04 543.04-316.8-316.8a64 64 0 0 1 0-90.496"
+            ></path>
+          </svg>
+        </i>
+      </div>
+    </sup>
+  </div>`;
+//
+const markContentHtml = (sceneType, checked) => {
+  const imgHtml = `<img
+      style="width: 30px; height: 30px"
+      src="${sceneIcon(sceneType)}"
+    />`;
+  if (checked) {
+    return startHtml + imgHtml + endHtml;
+  } else {
+    return imgHtml;
+  }
+};
+
 const props = defineProps({
+  // 閫変腑鐨勫満鏅�
+  modelValue: {
+    type: Array,
+    default: () => []
+  },
   // 鍦烘櫙鐐逛綅淇℃伅
   data: Array
 });
 
+const emits = defineEmits(['update:modelValue']);
+
 onMounted(() => {
-  // refLeftCard.value.offsetHeight;
-  // leftCardWrapStyle.value = {
-  //   height: refLeftCard.value.offsetHeight + 'px'
-  // };
+  setTimeout(() => {
+    scrollHeight.value =
+      refLeftCard.value.offsetHeight -
+      refLeftCardTitle.value.offsetHeight +
+      'px';
+  }, 500);
 });
 
 const refLeftCard = ref();
+const refLeftCardTitle = ref();
+
 const leftCardShow = ref(true);
 const leftCardWrapStyle = ref();
+const scrollHeight = ref('400px');
 
 let allMarkViews = [];
 let markViewList = [];
 
 const scenetype = ref();
 
-const selectedSceneList = computed(() => {
-  return props.data.filter((v) => {
+// 閫変腑鐨勫満鏅�
+const selectedSceneList = ref(props.modelValue);
+
+const allSceneList = computed(() => props.data);
+const filterText = ref('');
+// 鏍规嵁鍦烘櫙绫诲瀷绛涢�夊満鏅垪琛�
+const filteredSceneList = computed(() => {
+  return allSceneList.value.filter((v) => {
     v._visible = true;
     return (
-      scenetype.value == undefined ||
-      scenetype.value.value == null ||
-      v.typeid + '' == scenetype.value.value
+      (scenetype.value == undefined ||
+        scenetype.value.value == null ||
+        v.typeid + '' == scenetype.value.value) &&
+      (v.name.indexOf(filterText.value) != -1 ||
+        v.index + '' == filterText.value)
     );
   });
 });
@@ -118,7 +200,6 @@
   () => props.data,
   (nV, oV) => {
     if (nV != oV) {
-      clearSceneMarks();
       createSceneMarks();
       filterMarkViews(true);
     }
@@ -128,10 +209,32 @@
 
 watch(scenetype, (nV, oV) => {
   if (nV != oV) {
-    clearSceneMarks();
     filterMarkViews(true);
   }
 });
+
+// 鐩戝惉澶栭儴閫変腑鎴栫Щ闄ゅ満鏅彉鍖�
+watch(
+  () => props.modelValue,
+  (nV, oV) => {
+    if (nV != oV) {
+      // 澶栭儴閫変腑鍦烘櫙鍙樺寲鏃讹紝鏇存柊鍐呴儴閫変腑鍦烘櫙鍒楄〃
+      selectedSceneList.value = nV;
+      // 澶栭儴閫変腑鍦烘櫙鍙樺寲鏃讹紝鏇存柊鍦板浘鏍囨敞鍐呭
+      allMarkViews.forEach((mv) => {
+        const scene = mv.getExtData();
+        const findOne = selectedSceneList.value.some((s) => {
+          return s.guid == scene.guid;
+        });
+        if (findOne) {
+          changeSceneMark(mv, true);
+        } else {
+          changeSceneMark(mv, false);
+        }
+      });
+    }
+  }
+);
 
 function handleVisibleChange(scene) {
   const mv = markViewList.find((v) => {
@@ -150,10 +253,12 @@
     return scene.guid == v.getExtData().guid;
   });
   if (mv) {
-    mapUtil.setFitView(mv);
+    // mapUtil.setFitView(mv);
+    mapUtil.setCenter(mv.getPosition());
   }
 }
 
+// 鍒涘缓鍦烘櫙鍦板浘鏍囨敞锛屾坊鍔犻紶鏍囦簨浠跺拰鐐瑰嚮浜嬩欢
 function createSceneMarks() {
   onMapMounted(() => {
     allMarkViews = [];
@@ -161,42 +266,16 @@
       // 鍒涘缓鍦烘櫙鍦板浘鏍囨敞
       const mark = marks.createMarker({
         position: [d.longitude, d.latitude],
-        img: sceneIcon(d.typeid),
-        label: '',
+        // img: sceneIcon(d.typeid),
+        content: markContentHtml(d.typeid),
+        label: d.index,
+        title: d.name,
         extData: d
       });
-      var timeout;
-      // 娣诲姞鐐瑰嚮浜嬩欢
-      mark.on('mouseover', (ev) => {
-        if (timeout) {
-          clearTimeout(timeout);
-        }
-        const _mark = ev.target;
-        const _extData = _mark.getExtData();
-        ev.target.setLabel({
-          content: _extData.name
-        });
-        timeout = setTimeout(() => {
-          ev.target.setLabel({
-            content: ''
-          });
-        }, 2000);
-        // 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);
-        // }
-      });
+      // 榧犳爣浜嬩欢
+      // onMouseOverListener(mark);
+      onClickListener(mark);
+
       allMarkViews.push(mark);
     });
   });
@@ -210,6 +289,7 @@
     if (markViewList.length > 0) {
       map.remove(markViewList);
     }
+    // 1. 绛涢�夊満鏅被鍨�
     if (scenetype.value == undefined) {
       markViewList = allMarkViews;
     } else {
@@ -220,32 +300,74 @@
         );
       });
     }
-    markViewList = markViewList.filter((v) => {
-      const _index = selectedSceneList.value.findIndex((s) => {
-        return s.guid == v.getExtData().guid && s._visible;
-      });
-      return _index != -1;
-    });
     map.add(markViewList);
     if (setFitView) {
       setTimeout(() => {
         map.setFitView(markViewList);
-        // const list = markViewList.map((v) => {
-        //   const _extData = v.getExtData();
-        //   return [_extData.longitude, _extData.latitude];
-        // });
-        // mapUtil.setBound(list);
       }, 1000);
     }
   });
 }
 
-function clearSceneMarks() {
-  onMapMounted(() => {
-    if (markViewList.length > 0) {
-      map.remove(markViewList);
+function onlineFormat(s) {
+  if (s == '0') {
+    return '涓嬬嚎';
+  } else {
+    return '涓婄嚎';
+  }
+}
+
+/** 鍦板浘鍦烘櫙鏍囪榧犳爣浜嬩欢 *********************************************/
+const onMouseOverListener = (mark) => {
+  let timeout;
+  // 娣诲姞鐐瑰嚮浜嬩欢
+  mark.on('mouseover', (ev) => {
+    if (timeout) {
+      clearTimeout(timeout);
     }
+    const _mark = ev.target;
+    const _extData = _mark.getExtData();
+    _mark.setLabel({
+      content: _extData.name
+    });
+    timeout = setTimeout(() => {
+      _mark.setLabel({
+        content: ''
+      });
+    }, 2000);
   });
+};
+const onClickListener = (mark) => {
+  mark.on('click', (ev) => {
+    const _mark = ev.target;
+    const extData = _mark.getExtData();
+    const index = selectedSceneList.value.indexOf(extData);
+    if (index == -1) {
+      selectedSceneList.value.push(extData);
+      changeSceneMark(_mark, true);
+    } else {
+      selectedSceneList.value.splice(index, 1);
+      changeSceneMark(_mark, false);
+    }
+    emits('update:modelValue', selectedSceneList.value);
+  });
+};
+/********************************************************************/
+
+/**
+ * 鏍规嵁閫変腑鐘舵�佷慨鏀瑰湴鍥炬爣璁扮殑鏍峰紡
+ * @param {AMap.Marker} mark 鍦板浘鏍囪
+ * @param checked
+ */
+function changeSceneMark(mark, checked) {
+  const scene = mark.getExtData();
+  if (checked && !scene._checked) {
+    scene._checked = true;
+    mark.setContent(markContentHtml(scene.typeid, true));
+  } else if (!checked && scene._checked) {
+    scene._checked = false;
+    mark.setContent(markContentHtml(scene.typeid, false));
+  }
 }
 </script>
 <style scoped>
@@ -256,28 +378,36 @@
   width: 100%;
   height: 100%;
 }
-.left-wrap {
+.top-left-wrap {
   position: absolute;
-  left: 0;
+  left: 0px;
+  top: 1px;
+}
+.bottom-left-wrap {
+  position: absolute;
+  left: 0px;
   bottom: 1px;
 }
 
 .card-left {
-  background-color: white;
-  /* border-radius: 4px; */
-  width: 316px;
-  /* box-shadow: var(--el-box-shadow); */
+  background-color: rgba(255, 255, 255, 0.8);
+  border-radius: 4px;
+  /* width: 350px; */
+  height: 50vh;
+  box-shadow: var(--el-box-shadow);
   z-index: 0;
+  /* padding: 8px; */
 }
 
 .scrollbar {
   padding-right: 8px;
-  /* width: 300px; */
+  width: 350px;
 }
 
 .close-btn-right {
-  margin-left: -3px;
+  /* margin-left: -3px; */
   height: 60px;
+  width: 20px;
 }
 
 .p-events-auto {
@@ -290,5 +420,16 @@
 
 .scene-item {
   /* background-color: aliceblue; */
+  padding: 8px;
+  border-radius: 8px;
+  border: 1px solid var(--el-border-color);
+  box-shadow: var(--el-box-shadow-lighter);
+  margin-bottom: 6px;
+}
+
+.custom-content {
+  display: flex;
+  align-items: center;
+  justify-content: center;
 }
 </style>
diff --git a/src/composables/messageBox.js b/src/composables/messageBox.js
index a45738c..b2466cc 100644
--- a/src/composables/messageBox.js
+++ b/src/composables/messageBox.js
@@ -24,7 +24,7 @@
         message: msg,
         type: 'success',
         // offset: 170,
-        position: 'top-right',
+        position: 'bottom-right',
       });
     })
     .catch((err) => {
diff --git a/src/router/index.js b/src/router/index.js
index 407f82d..f826b46 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -235,7 +235,7 @@
                 name: 'taskmanage',
                 path: 'manage',
                 component: () => import('@/views/fysp/task/TaskManage.vue'),
-                meta: { keepAlive: true }
+                meta: { keepAlive: false }
               },
               {
                 //鐩戠浠诲姟鍦烘櫙缂栬緫
diff --git a/src/styles/element/base.scss b/src/styles/element/base.scss
index 6a2dabe..05b33f5 100644
--- a/src/styles/element/base.scss
+++ b/src/styles/element/base.scss
@@ -51,6 +51,9 @@
 }
 
 @each $i in $size {
+  .p-#{$i} {
+    padding: #{$i}px;
+  }
   .p-v-#{$i} {
     padding: #{$i}px 0;
   }
diff --git a/src/utils/map/marks.js b/src/utils/map/marks.js
index 6ba80b9..05137fd 100644
--- a/src/utils/map/marks.js
+++ b/src/utils/map/marks.js
@@ -145,7 +145,7 @@
     return layer;
   },
 
-  createMarker({ position, img, label = '', extData }) {
+  createMarker({ position, img, title, content, label = '', extData }) {
     //鍒涘缓 AMap.Icon 瀹炰緥锛�
     const icon = new AMap.Icon({
       size: new AMap.Size(30, 30), //鍥炬爣灏哄
@@ -157,7 +157,8 @@
       position: position,
       // offset: new AMap.Pixel(-13, -30),
       icon: icon, //娣诲姞 icon 鍥炬爣 URL
-      title: label,
+      content: content,
+      title: title,
       label: {
         content: label,
         direction: 'bottom'
diff --git a/src/utils/time-util.js b/src/utils/time-util.js
index cac41e8..3852869 100644
--- a/src/utils/time-util.js
+++ b/src/utils/time-util.js
@@ -75,7 +75,7 @@
     const units = [
       { unit: '澶�', value: 24 * 60 * 60 },
       { unit: '灏忔椂', value: 60 * 60 },
-      { unit: '鍒�', value: 60 },
+      { unit: '鍒嗛挓', value: 60 },
       { unit: '绉�', value: 1 }
     ];
     
diff --git a/src/views/fysp/check/components/ComChangeEdit.vue b/src/views/fysp/check/components/ComChangeEdit.vue
index b8b5b27..b8be328 100644
--- a/src/views/fysp/check/components/ComChangeEdit.vue
+++ b/src/views/fysp/check/components/ComChangeEdit.vue
@@ -263,10 +263,10 @@
   margin-bottom: 30px;
   margin-left: 63px;
 }
-::v-deep .el-dialog__body {
+:deep(.el-dialog__body) {
   width: 95%;
 }
-::v-deep .el-upload-list--picture-card .el-upload-list__item-thumbnail {
+:deep(.el-upload-list--picture-card .el-upload-list__item-thumbnail) {
   object-fit: cover !important;
 }
 .preview-pic {
@@ -274,11 +274,11 @@
   width: 100%;
   height: 100%;
 }
-::v-deep .el-upload--picture-card {
+:deep(.el-upload--picture-card) {
   display: none;
 }
 /* 闅愯棌el-upload涓婁紶鎴愬姛缁勪欢 */
-::v-deep .el-upload-list__item-status-label {
+:deep(.el-upload-list__item-status-label) {
   display: none !important;
 }
 </style>
diff --git a/src/views/fysp/check/components/CompProblemAddOrUpd copy.vue b/src/views/fysp/check/components/CompProblemAddOrUpd copy.vue
index 949e1c6..7ad47aa 100644
--- a/src/views/fysp/check/components/CompProblemAddOrUpd copy.vue
+++ b/src/views/fysp/check/components/CompProblemAddOrUpd copy.vue
@@ -755,7 +755,7 @@
 .row {
   width: 100%;
 }
-::v-deep .el-upload-list--picture-card .el-upload-list__item-thumbnail {
+:deep(.el-upload-list--picture-card .el-upload-list__item-thumbnail) {
   object-fit: cover !important;
 }
 .preview-pic {
@@ -763,11 +763,11 @@
   width: 100%;
   height: 100%;
 }
-::v-deep .el-upload--picture-card {
+:deep(.el-upload--picture-card) {
   display: none;
 }
 /* 闅愯棌el-upload涓婁紶鎴愬姛缁勪欢 */
-::v-deep .el-upload-list__item-status-label {
+:deep(.el-upload-list__item-status-label) {
   display: none !important;
 }
 </style>
diff --git a/src/views/fysp/check/components/CompProblemAddOrUpd.vue b/src/views/fysp/check/components/CompProblemAddOrUpd.vue
index 5bf78fb..8221a0e 100644
--- a/src/views/fysp/check/components/CompProblemAddOrUpd.vue
+++ b/src/views/fysp/check/components/CompProblemAddOrUpd.vue
@@ -764,7 +764,7 @@
 .row {
   width: 100%;
 }
-::v-deep .el-upload-list--picture-card .el-upload-list__item-thumbnail {
+:deep(.el-upload-list--picture-card .el-upload-list__item-thumbnail) {
   object-fit: cover !important;
 }
 .preview-pic {
@@ -772,11 +772,11 @@
   width: 100%;
   height: 100%;
 }
-::v-deep .el-upload--picture-card {
+:deep(.el-upload--picture-card) {
   display: none;
 }
 /* 闅愯棌el-upload涓婁紶鎴愬姛缁勪欢 */
-::v-deep .el-upload-list__item-status-label {
+:deep(.el-upload-list__item-status-label) {
   display: none !important;
 }
 </style>
diff --git a/src/views/fysp/data-product/final-data-product/ProdMonInspecReport.vue b/src/views/fysp/data-product/final-data-product/ProdMonInspecReport.vue
index 664fcbe..f7c3afa 100644
--- a/src/views/fysp/data-product/final-data-product/ProdMonInspecReport.vue
+++ b/src/views/fysp/data-product/final-data-product/ProdMonInspecReport.vue
@@ -194,18 +194,18 @@
     .fetchProblemCountByArea(opt)
     .then(async (res) => {
       if (res.success) {
-        const data = res.data.sort((a, b) => b.ratio - a.ratio);
+        const data = res.data.sort((a, b) => b.proAvg - a.proAvg);
         templateParam.townCount = data.length;
         templateParam.topThree =
           data
             .slice(0, 3)
-            .map((item) => `${item.townName}锛�${item.ratio.toFixed(1)}涓級`)
+            .map((item) => `${item.townName}锛�${item.proAvg.toFixed(1)}涓級`)
             .join('銆�') + '銆�';
 
         const res2 =
           await dataprodmiddleApi.fetchProblemCountByArea(compareOpt);
         if (res2.success) {
-          const data2 = res2.data.sort((a, b) => b.ratio - a.ratio);
+          const data2 = res2.data.sort((a, b) => b.proAvg - a.proAvg);
           const combineData = ProdProblemCountSummaryProxy.combineData(
             data,
             data2
diff --git a/src/views/fysp/task/TaskManage.vue b/src/views/fysp/task/TaskManage.vue
index 31a2926..3274b74 100644
--- a/src/views/fysp/task/TaskManage.vue
+++ b/src/views/fysp/task/TaskManage.vue
@@ -31,42 +31,52 @@
         class="el-scrollbar"
         v-loading="mainLoading"
       >
-        <el-row justify="space-between">
-          <!-- <div><el-text>鐩戠璁″垝</el-text></div>
+        <!-- <div><el-text>鐩戠璁″垝</el-text></div>
           <el-button type="warning" size="small" @click="editPlan"
             >璁″垝璋冩暣</el-button
           > -->
-          <el-tabs model-value="first">
-            <el-tab-pane label="宸℃煡璁″垝" name="first">
-              <el-row>
-                <el-col :span="curSubTaskList ? 16 : 24">
-                  <CompMonitorPlan
-                    :loading="daytaskLoading"
-                    ref="planRef"
-                    :task="curTask.data"
-                    :day-task-list="curDayTaskList"
-                    @date-change="onDateChange"
-                  ></CompMonitorPlan>
-                </el-col>
-                <el-col v-if="curSubTaskList" :span="8">
-                  <CompSubTaskList
-                    create
-                    v-model="curSubTaskList"
-                    :date="curDay"
-                    :loading="subTaskLoading"
-                    :create-loading="daytaskCreateLoading"
-                    height="56vh"
-                    @add="handleAddSubtask"
-                    @submit="handleSubtaskSubmit"
-                  ></CompSubTaskList>
-                </el-col>
-              </el-row>
-            </el-tab-pane>
-            <el-tab-pane label="鍦烘櫙鍦板浘" name="second">
-              <CompTaskMap :plans="curMonitorObjList"></CompTaskMap>
-            </el-tab-pane>
-          </el-tabs>
+        <!-- <el-tabs model-value="first">
+            <el-tab-pane label="宸℃煡璁″垝" name="first"> -->
+        <el-row justify="space-between" style="padding: 16px 0px 16px 16px">
+          <el-text size="large">宸℃煡璁″垝</el-text>
+          <!-- <el-button type="primary" size="small" @click="sceneMapDialog = true">
+            杩涘叆鍦烘櫙鍦板浘<el-icon class="el-icon--right"><Right /></el-icon>
+          </el-button> -->
         </el-row>
+        <div class="plan-container">
+          <el-row>
+            <el-col :span="curSubTaskList ? 16 : 24">
+              <CompMonitorPlan
+                :loading="daytaskLoading"
+                ref="planRef"
+                :task="curTask.data"
+                :day-task-list="curDayTaskList"
+                @date-change="onDateChange"
+              ></CompMonitorPlan>
+            </el-col>
+            <el-col v-if="curSubTaskList" :span="8">
+              <!-- <el-affix target=".plan-container" :offset="140"> -->
+                <CompSubTaskList
+                  create
+                  v-model="curSubTaskList"
+                  :date="curDay"
+                  :loading="subTaskLoading"
+                  :create-loading="daytaskCreateLoading"
+                  height="66vh"
+                  @openMap="sceneMapDialog = true"
+                  @add="handleAddSubtask"
+                  @submit="onSubtaskUpdate"
+                  @remove="onSubtaskUpdate"
+                ></CompSubTaskList>
+              <!-- </el-affix> -->
+            </el-col>
+          </el-row>
+        </div>
+        <!-- </el-tab-pane>
+            <el-tab-pane label="鍦烘櫙鍦板浘" name="second"> -->
+        <!-- <CompTaskMap :plans="curMonitorObjList"></CompTaskMap> -->
+        <!-- </el-tab-pane>
+          </el-tabs> -->
         <el-divider></el-divider>
         <el-row justify="space-between">
           <div><el-text>鐩戠鍦烘櫙</el-text></div>
@@ -94,12 +104,11 @@
     title="鏃ヨ鍒掔鐞�"
     direction="btt"
     size="96%"
-    destroy-on-close
   >
     <CompDayTask
       :day-task="curDayTask"
       :mObjList="curMonitorObjList"
-      @submit="handleSubtaskSubmit"
+      @submit="onSubtaskUpdate"
     ></CompDayTask>
   </el-drawer>
   <el-dialog
@@ -116,6 +125,19 @@
       @cancel="topTaskAddVisible = false"
     ></CompTaskEdit>
   </el-dialog>
+  <el-drawer
+    v-model="sceneMapDialog"
+    title="鍦烘櫙鍦板浘"
+    direction="btt"
+    size="100%"
+    body-class="el-drawer__custom"
+  >
+    <CompTaskMap
+      :plans="curMonitorObjList"
+      :day-task="curDayTask"
+      @submit="onSubtaskUpdate"
+    ></CompTaskMap>
+  </el-drawer>
 </template>
 
 <script>
@@ -197,7 +219,9 @@
       curSubTaskList: undefined,
       subTaskLoading: false,
       // 鎬讳换鍔℃柊澧炲脊鍑烘
-      topTaskAddVisible: false
+      topTaskAddVisible: false,
+      // 鍦烘櫙鍦板浘寮瑰嚭妗�
+      sceneMapDialog: false
     };
   },
   provide() {
@@ -340,11 +364,12 @@
         }
       });
     },
-    handleSubtaskSubmit() {
-      this.subTaskLoading = true;
-      this.$refs.planRef
-        .fetchDayTasks()
-        .finally(() => (this.subTaskLoading = false));
+    onSubtaskUpdate() {
+      // this.subTaskLoading = true;
+      // this.$refs.planRef
+      //   .fetchDayTasks()
+      //   .finally(() => (this.subTaskLoading = false));
+      this.fetchDayTasks();
     },
     handleAddSubtask() {
       // 鍒ゆ柇褰撴棩鏄惁鏈夋棩浠诲姟锛岃嫢娌℃湁锛屽厛鍒涘缓鍦ㄨ烦杞瓙浠诲姟鍒涘缓鐣岄潰
@@ -378,7 +403,7 @@
               totalTaskNum: 0
             };
             this.subTaskDrawer = true;
-            this.handleSubtaskSubmit();
+            this.onSubtaskUpdate();
           })
           .finally(() => (this.daytaskCreateLoading = false));
       }
@@ -399,5 +424,15 @@
 
 .el-scrollbar {
   height: calc((100vh - 60px - 20px * 2 - var(--height-toolbar)));
+  padding-right: 8px;
+}
+
+.plan-container {
+  /* background-color: aliceblue; */
+}
+</style>
+<style>
+.el-drawer__custom {
+  padding: 0px !important;
 }
 </style>
diff --git a/src/views/fysp/task/TaskProxy.js b/src/views/fysp/task/TaskProxy.js
index 4fcca0b..56053d4 100644
--- a/src/views/fysp/task/TaskProxy.js
+++ b/src/views/fysp/task/TaskProxy.js
@@ -1,14 +1,60 @@
+import { unref } from 'vue';
+import dayjs from 'dayjs';
+import taskApi from '@/api/fysp/taskApi';
+import subtaskApi from '@/api/fysp/subtaskApi';
+
 export default {
   /**
    * 鐢熸垚宸℃煡瀛愪换鍔″璞�
    */
-  ceateSubTask(){
+  createSubtasks(dayTask, sceneList, executors) {
+    const seletedSceneList = unref(sceneList);
+    const subtasks = seletedSceneList.map((_) => {
+      const s = _.scene;
+      return {
+        // 涓婚敭鐢辨湇鍔$鍒涘缓
+        stguid: undefined,
+        tguid: dayTask.tsGuid,
+        tsguid: dayTask.guid,
+        name: `${s.name}宸℃煡`,
+        typeno: 1,
+        type: '宸℃煡',
+        provincecode: s.provincecode,
+        provincename: s.provincename,
+        citycode: s.citycode,
+        cityname: s.cityname,
+        districtcode: s.districtcode,
+        districtname: s.districtname,
+        scensename: s.name,
+        scenseid: s.guid,
+        scenseaddress: s.location,
+        planstarttime: dayTask.date,
+        planendtime: dayjs(dayTask.date)
+          .endOf('day')
+          .set('millisecond', 0)
+          .toDate(),
+        deployerguid: 'rAR0A4gJdlOZEqZs',
+        deployerusername: 'ccheck',
+        deployerrealname: '鏁存敼瀹℃牳',
+        executorguids: executors.ids,
+        executorusernames: executors.uName,
+        executorrealtimes: executors.rName,
+        status: '鏈墽琛�',
+        remark: undefined
+      };
+    });
 
+    // 鏇存柊鍦烘櫙鐩戠娆℃暟
+    seletedSceneList.forEach((s) => {
+      s.extension1 = s.extension1 ? parseInt(s.extension1) + 1 + '' : '1';
+    });
+    taskApi.updateMonitorObject(seletedSceneList);
+    return subtaskApi.putSubtasks(subtasks);
   },
 
   /**
    * 鏍规嵁澶氶�変笅鎷夋鐨勯�夐」鍊硷紝杩斿洖浠诲姟鎵ц浜哄璞�
-   * @returns 
+   * @returns
    */
   getExecutors(data, executorOptions) {
     const ids = [];
@@ -28,4 +74,4 @@
       rName: rNames.join('#')
     };
   }
-}
\ No newline at end of file
+};
diff --git a/src/views/fysp/task/components/CompDayTask.vue b/src/views/fysp/task/components/CompDayTask.vue
index 678b26f..16f72ac 100644
--- a/src/views/fysp/task/components/CompDayTask.vue
+++ b/src/views/fysp/task/components/CompDayTask.vue
@@ -6,9 +6,8 @@
       </div>
       <el-divider />
       <CompSubTaskSelect
-        :data="seletedSceneList"
+        v-model="seletedSceneList"
         :dayTask="dayTask"
-        @delete="deleteScene"
         @submit="createSubtasks"
       ></CompSubTaskSelect>
       <div>
@@ -41,6 +40,7 @@
       <CompSubTaskList
         v-model="curSubTaskList"
         :height="height"
+        :date="dayTask.date"
         @submit="deleteSubtasks"
       ></CompSubTaskList>
     </el-col>
@@ -68,7 +68,7 @@
   mObjList: Array
 });
 
-const emit = defineEmits(['submit'])
+const emit = defineEmits(['submit']);
 
 /*************************** 鏁版嵁鍒濆鍖� ************************************/
 // 宸℃煡瀛愪换鍔¢泦鍚�
@@ -122,67 +122,24 @@
   seletedSceneList.value.push(item);
 }
 // 绉婚櫎浠诲姟鍦烘櫙
-function deleteScene(item) {
-  item.select = false;
-  const index = seletedSceneList.value.indexOf(item);
-  seletedSceneList.value.splice(index, 1);
-}
+// function deleteScene(item) {
+//   item.select = false;
+//   const index = seletedSceneList.value.indexOf(item);
+//   seletedSceneList.value.splice(index, 1);
+// }
 
-function createSubtasks(executors) {
-  const dt = props.dayTask;
-  const subtasks = seletedSceneList.value.map((_) => {
-    const s = _.scene;
-    return {
-      // 涓婚敭鐢辨湇鍔$鍒涘缓
-      stguid: undefined,
-      tguid: dt.tsGuid,
-      tsguid: dt.guid,
-      name: `${s.name}宸℃煡`,
-      typeno: 1,
-      type: '宸℃煡',
-      provincecode: s.provincecode,
-      provincename: s.provincename,
-      citycode: s.citycode,
-      cityname: s.cityname,
-      districtcode: s.districtcode,
-      districtname: s.districtname,
-      scensename: s.name,
-      scenseid: s.guid,
-      scenseaddress: s.location,
-      planstarttime: dt.date,
-      planendtime: dayjs(dt.date).endOf('day').set('millisecond', 0).toDate(),
-      deployerguid: 'rAR0A4gJdlOZEqZs',
-      deployerusername: 'ccheck',
-      deployerrealname: '鏁存敼瀹℃牳',
-      executorguids: executors.ids,
-      executorusernames: executors.uName,
-      executorrealtimes: executors.rName,
-      status: '鏈墽琛�',
-      remark: undefined
-    };
+function createSubtasks() {
+  seletedSceneList.value = [];
+  fetchSubTask(props.dayTask.guid);
+  ElMessage({
+    message: '宸℃煡浠诲姟娣诲姞鎴愬姛',
+    type: 'success'
   });
-
-  // 鏇存柊鍦烘櫙鐩戠娆℃暟
-  seletedSceneList.value.forEach((s) => {
-    s.extension1 = s.extension1 ? parseInt(s.extension1) + 1 + '' : '1';
-  });
-  taskApi.updateMonitorObject(seletedSceneList.value).then((res) => {
-    if (res > 0) {
-      subtaskApi.putSubtasks(subtasks).then((res) => {
-        seletedSceneList.value = [];
-        fetchSubTask(props.dayTask.guid);
-        ElMessage({
-          message: '宸℃煡浠诲姟娣诲姞鎴愬姛',
-          type: 'success'
-        });
-        emit('submit')
-      });
-    }
-  });
+  emit('submit');
 }
 
 function deleteSubtasks() {
-  emit('submit')
+  emit('submit');
 }
 </script>
 <style scoped></style>
diff --git a/src/views/fysp/task/components/CompMonitorPlan.vue b/src/views/fysp/task/components/CompMonitorPlan.vue
index a9c6bf8..acea676 100644
--- a/src/views/fysp/task/components/CompMonitorPlan.vue
+++ b/src/views/fysp/task/components/CompMonitorPlan.vue
@@ -5,7 +5,7 @@
     @update:model-value="onDateChange"
   >
     <template #header="{ date }">
-      <div>
+      <div style="width: 100%">
         <el-row justify="space-between">
           <el-space>
             <el-tag type="default"
@@ -21,7 +21,7 @@
                 )
               }}</el-tag
             >
-            <el-tag type="default">鏁存敼锛歿{ taskStatistic.changed }}</el-tag>
+            <!-- <el-tag type="default">鏁存敼锛歿{ taskStatistic.changed }}</el-tag> -->
           </el-space>
           <el-space>
             <el-text>鑱氱劍鐢ㄦ埛锛�</el-text>
@@ -29,6 +29,8 @@
               v-model="selectedUsers"
               multiple
               clearable
+              collapse-tags
+              :max-collapse-tags="1"
               style="width: 150px"
             >
               <el-option
@@ -47,12 +49,21 @@
               v-for="user in taskStatistic.progressPerUser"
               :key="user.userId"
             >
-              {{
+              <!-- {{
                 `${user.userName}锛氬贰鏌ラ噺 ${
                   user.completeTaskNum
-                }锛屽強鏃舵暣鏀圭巼 ${formatPercent(
+                }锛屽嵆鏃舵暣鏀圭巼 ${formatPercent(
                   user.changedProblemNumOnTime / user.totalProblemNum
                 )}锛屽钩鍧囪�楁椂 ${
+                  user.avgInspectionTime ? user.avgInspectionTime : '--'
+                }`
+              }} -->
+                {{
+                `${user.userName}锛�${
+                  user.completeTaskNum
+                } | ${formatPercent(
+                  user.changedProblemNumOnTime / user.totalProblemNum
+                )} | ${
                   user.avgInspectionTime ? user.avgInspectionTime : '--'
                 }`
               }}
@@ -94,6 +105,7 @@
           >
             <el-row justify="space-between">
               <el-text
+                title="宸℃煡浜哄憳"
                 size="small"
                 :type="
                   selectedUsers.includes(item.userName) ? 'primary' : 'info'
@@ -105,6 +117,7 @@
             <el-row justify="space-between">
               <!-- <el-space> -->
               <el-text
+                title="宸℃煡閲�"
                 size="small"
                 style="text-align: center; flex: 1"
                 :type="
@@ -114,6 +127,7 @@
                 >{{ item.completeTaskNum }}</el-text
               >
               <el-text
+                title="鍗虫椂鏁存敼鐜�"
                 size="small"
                 style="text-align: center; flex: 1"
                 :type="
@@ -127,6 +141,7 @@
                 }}</el-text
               >
               <el-text
+                title="骞冲潎鑰楁椂"
                 size="small"
                 style="text-align: center; flex: 1"
                 :type="
@@ -249,6 +264,7 @@
 
 // 鎬讳换鍔$粺璁�
 const taskStatistic = computed(() => {
+  // const resMap = new Map()
   const res = {
     total: 0,
     complete: 0,
@@ -325,16 +341,16 @@
   top: 5px;
 }
 
-::v-deep .el-calendar-table .el-calendar-day {
+:deep(.el-calendar-table .el-calendar-day) {
   height: initial;
   padding: initial;
 }
 
-::v-deep .el-calendar-table .el-calendar-day:hover {
+:deep(.el-calendar-table .el-calendar-day:hover) {
   background-color: transparent;
 }
 
-/* ::v-deep .el-calendar-table td.is-selected {
+/* :deep(.el-calendar-table td.is-selected) {
   background-color: initial;
 } */
 
@@ -361,15 +377,15 @@
   cursor: not-allowed;
 }
 
-/* ::v-deep .el-calendar-table tr td:first-child {
+/* :deep(.el-calendar-table tr td:first-child) {
   border-left: none !important;
 } */
 
-/* ::v-deep .el-calendar-table tr:first-child td {
+/* :deep(.el-calendar-table tr:first-child td) {
   border-top: none;
 } */
 
-/* ::v-deep .el-calendar-table td {
+/* :deep(.el-calendar-table td) {
   border-bottom: none;
   border-right: none;
   vertical-align: top;
@@ -377,7 +393,7 @@
   transition: background-color 0.2s ease;
 } */
 
-::v-deep .el-calendar-table thead th {
+:deep(.el-calendar-table thead th) {
   padding: 12px 0;
   color: #606266;
   font-weight: normal;
diff --git a/src/views/fysp/task/components/CompSubTaskList.vue b/src/views/fysp/task/components/CompSubTaskList.vue
index 51dd342..5b6d1e0 100644
--- a/src/views/fysp/task/components/CompSubTaskList.vue
+++ b/src/views/fysp/task/components/CompSubTaskList.vue
@@ -1,6 +1,6 @@
 <template>
   <el-row justify="space-between">
-    <el-text>{{dateStr}}璁″垝</el-text>
+    <el-text>{{ dateStr }}璁″垝</el-text>
     <div v-show="create && data && data.length > 0">
       <el-button
         icon="IconPrinter"
@@ -13,6 +13,9 @@
       <el-button type="success" size="small" @click="add" icon="Switch"
         >浠诲姟璋冩暣</el-button
       >
+      <el-button type="primary" size="small" @click="openMap">
+        杩涘叆鍦板浘<el-icon class="el-icon--right"><Right /></el-icon>
+      </el-button>
     </div>
   </el-row>
   <el-divider />
@@ -27,7 +30,7 @@
       >
         <ItemSubTask v-for="s in data" :key="s.guid" :item="s">
           <template #default="{ item }">
-            <el-space direction="vertical">
+            <el-space direction="horizontal">
               <el-button
                 :disabled="item.status != '鏈墽琛�'"
                 plain
@@ -35,16 +38,16 @@
                 size="small"
                 icon="EditPen"
                 @click="edit(item)"
-                >淇敼</el-button
-              >
+                title="淇敼"
+              ></el-button>
               <el-button
                 :disabled="item.status != '鏈墽琛�'"
                 type="danger"
                 size="small"
                 icon="Delete"
                 @click="remove(item)"
-                >绉婚櫎</el-button
-              >
+                title="绉婚櫎"
+              ></el-button>
             </el-space>
           </template>
         </ItemSubTask>
@@ -111,9 +114,9 @@
 const downloadDialog = ref(false);
 const downloadSceneList = ref([]);
 
-const emit = defineEmits(['submit', 'add', 'remove', 'update:modelValue']);
+const emit = defineEmits(['submit', 'add', 'openMap', 'remove', 'update:modelValue']);
 
-const dateStr = computed(()=> dayjs(props.date).format('MM鏈圖D鏃�'))
+const dateStr = computed(() => dayjs(props.date).format('MM鏈圖D鏃�'));
 
 function remove(item) {
   if (item.status == '鏈墽琛�') {
@@ -156,6 +159,15 @@
   emit('add');
 }
 
+/**
+ * 鎵撳紑鍦烘櫙鍦板浘
+ */
+function openMap() {
+  emit('openMap');
+}
+
+
+
 onUnmounted(() => {
   dialogVisible.value = false;
 });
diff --git a/src/views/fysp/task/components/CompSubTaskSelect.vue b/src/views/fysp/task/components/CompSubTaskSelect.vue
index cfeb571..11a515e 100644
--- a/src/views/fysp/task/components/CompSubTaskSelect.vue
+++ b/src/views/fysp/task/components/CompSubTaskSelect.vue
@@ -17,7 +17,7 @@
               collapse-tags
               placeholder="閫夋嫨鎵ц浜�"
               :max-collapse-tags="1"
-              style="width: 240px"
+              style="width: 150px"
             >
               <template #header>
                 <el-checkbox
@@ -40,9 +40,13 @@
       </FYForm>
     </el-row>
     <div>
-      <el-scrollbar :height="scrollHeight" v-if="data.length > 0">
-        <el-space wrap>
-          <ItemMonitorObj v-for="obj in data" :key="obj.movid" :item="obj">
+      <el-scrollbar :height="height" v-if="modelValue.length > 0">
+        <el-space wrap :direction="direction">
+          <ItemMonitorObj
+            v-for="obj in modelValue"
+            :key="obj.movid"
+            :item="obj"
+          >
             <template #default="{ item }">
               <el-button
                 size="small"
@@ -79,21 +83,34 @@
 
 const props = defineProps({
   // 瀛愪换鍔¢泦鍚�
-  data: {
+  modelValue: {
     type: Array,
     default: () => []
   },
-  height: String,
+  height: {
+    type: String,
+    default: '14vh'
+  },
+  direction: {
+    type: String,
+    default: 'horizontal'
+  },
   // 鏃ヤ换鍔�
   dayTask: Object
 });
 
-const emit = defineEmits(['submit', 'delete']);
+const emit = defineEmits(['submit', 'delete', 'update:modelValue']);
 
-const scrollHeight = ref('14vh');
+const data = computed(() => props.modelValue);
 
 // 绉婚櫎浠诲姟鍦烘櫙
 function deleteScene(item) {
+  item.select = false;
+  const index = data.value.indexOf(item);
+  if (index > -1) {
+    data.value.splice(index, 1);
+    emit('update:modelValue', data.value);
+  }
   emit('delete', item);
 }
 
@@ -109,7 +126,7 @@
   ]
 });
 function submit(v, success, fail) {
-  if (props.data.length == 0) {
+  if (props.modelValue.length == 0) {
     fail('鏈�夋嫨鐩戠鍦烘櫙');
   } else if (v.value.executor.length == 0) {
     fail('鏈�夋嫨鎵ц浜�');
@@ -117,7 +134,13 @@
     success();
     // 灏嗕换鍔℃墽琛屼汉鏍煎紡鍖栧苟浼犻��
     const param = TaskProxy.getExecutors(v.value.executor, executors.value);
-    emit('submit', param);
+    TaskProxy.createSubtasks(props.dayTask, props.modelValue, param).then(
+      () => {
+        formInfo.value.executor = [];
+        emit('update:modelValue', []);
+        emit('submit');
+      }
+    );
   }
 }
 
@@ -161,6 +184,7 @@
   });
 
   executors.value = list;
+  formInfo.value.executor = [];
 }
 // watch(topTask, (nV, oV) => {
 //   if (nV != oV) {
diff --git a/src/views/fysp/task/components/CompTaskMap.vue b/src/views/fysp/task/components/CompTaskMap.vue
index 1af7d06..2e188e7 100644
--- a/src/views/fysp/task/components/CompTaskMap.vue
+++ b/src/views/fysp/task/components/CompTaskMap.vue
@@ -1,6 +1,10 @@
 <template>
-  <div style="width: 68vw; height: 600px; background-color: aliceblue">
-    <SceneMap :data="scenes">
+  <div class="map-wrapper">
+    <SceneMap
+      :model-value="seletedSceneList"
+      @update:model-value="onUpdateSeletedSceneList"
+      :data="scenes"
+    >
       <template #left-top>
         <FYOptionSupervisionStatus
           label=""
@@ -9,10 +13,32 @@
         ></FYOptionSupervisionStatus>
       </template>
     </SceneMap>
+    <el-row class="p-events-none top-right-wrap" align="middle">
+      <el-button
+        class="close-btn-left p-events-auto"
+        type="success"
+        size="small"
+        :icon="rightCardShow ? 'ArrowRight' : 'ArrowLeft'"
+        @click="rightCardShow = !rightCardShow"
+      ></el-button>
+      <div class="right-wrapper">
+        <div v-show="rightCardShow" class="p-events-auto subtask-select">
+          <CompSubTaskSelect
+            :model-value="selectedPlans"
+            @update:model-value="onUpdateSelectedPlans"
+            height="82vh"
+            :dayTask="dayTask"
+            @submit="handleSubmitDone"
+          ></CompSubTaskSelect>
+        </div>
+      </div>
+    </el-row>
   </div>
 </template>
 <script setup>
-import { ref, computed } from 'vue';
+import { ref, computed, watch } from 'vue';
+
+import CompSubTaskSelect from './CompSubTaskSelect.vue';
 
 const props = defineProps({
   // 鍦烘櫙璁″垝
@@ -20,14 +46,29 @@
     type: Array,
     default: () => []
   },
-  dayTasks: {
-    type: Array,
-    default: () => []
+  dayTask: {
+    type: Object
   }
 });
 
-const supervisionStatus = ref();
+const emits = defineEmits(['submit']);
 
+const supervisionStatus = ref();
+const rightCardShow = ref(true);
+const seletedSceneList = ref([]);
+const selectedPlans = ref([]);
+
+watch(
+  () => props.dayTask,
+  (newVal, oldVal) => {
+    if (newVal != oldVal) {
+      seletedSceneList.value = [];
+      selectedPlans.value = [];
+    }
+  }
+);
+
+// 鐩戠璁″垝鍖呭惈鐨勫満鏅偣浣嶄俊鎭�
 const scenes = computed(() => {
   return props.plans
     .filter((v) => {
@@ -51,11 +92,62 @@
             return true;
         }
       } else {
-        return true
+        return true;
       }
     })
     .map((p) => {
       return p.scene;
     });
 });
+
+// 鐩戝惉鍦板浘閫変腑鍦烘櫙浜嬩欢
+function onUpdateSeletedSceneList(val) {
+  seletedSceneList.value = val;
+  selectedPlans.value = seletedSceneList.value.map((s) => {
+    return props.plans.find((p) => p.scene.guid == s.guid);
+  });
+}
+
+// 鐩戝惉瀛愪换鍔$Щ闄や簨浠�
+function onUpdateSelectedPlans(val) {
+  selectedPlans.value = val;
+  seletedSceneList.value = selectedPlans.value.map((v) => v.scene);
+}
+
+function handleSubmitDone(e) {
+  console.log(e);
+  emits('submit', e);
+}
 </script>
+<style scoped>
+.map-wrapper {
+  position: relative;
+  width: 100%;
+  height: 90vh;
+}
+
+.right-wrapper {
+  background-color: rgba(255, 255, 255, 0.8);
+  box-shadow: var(--el-box-shadow);
+  border-radius: 4px;
+  height: 90vh;
+}
+
+.subtask-select {
+  width: 330px;
+  padding-left: 4px;
+  padding-top: 8px;
+}
+
+.close-btn-left {
+  margin-right: 0px;
+  height: 60px;
+  width: 20px;
+}
+
+.top-right-wrap {
+  position: absolute;
+  right: 0px;
+  top: 1px;
+}
+</style>

--
Gitblit v1.9.3