riku
5 天以前 f19e5267cc23b1c714dc746239864f33ed715dd9
完成地图制作任务功能初版
已修改23个文件
1409 ■■■■ 文件已修改
package-lock.json 613 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/dialog.css 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/CompGenericWrapper.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/FYImageSelectDialog.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/list-item/ItemSubTask.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/map/SceneMap.vue 323 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/composables/messageBox.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/styles/element/base.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/map/marks.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/time-util.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/ComChangeEdit.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/CompProblemAddOrUpd copy.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/check/components/CompProblemAddOrUpd.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/data-product/final-data-product/ProdMonInspecReport.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/TaskManage.vue 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/TaskProxy.js 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompDayTask.vue 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompMonitorPlan.vue 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompSubTaskList.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompSubTaskSelect.vue 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/fysp/task/components/CompTaskMap.vue 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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": {
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",
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);
}
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>
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>
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,6 +42,7 @@
          </div>
          {{ item.executorrealtimes }}
        </div>
        <el-row justify="space-between">
        <el-space class="m-t-4">
          <el-tag size="small" type="info" effect=""
            >问题:{{ status.proNum }}</el-tag
@@ -51,10 +54,10 @@
            >整改率:{{ status.changePer }}</el-tag
          >
        </el-space>
      </el-col>
      <el-col :span="4">
        <slot :item="item"></slot>
        </el-row>
      </el-col>
      <!-- <el-col :span="4"> </el-col> -->
    </el-row>
  </div>
</template>
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,28 +14,65 @@
      </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 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]"
      >
        <div><el-text size="large">场景列表</el-text></div>
        <el-scrollbar height="400px" class="scrollbar">
              <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 :height="scrollHeight" class="scrollbar">
          <el-row
            v-for="s in selectedSceneList"
              v-for="s in filteredSceneList"
            :key="s.guid"
            justify="space-between"
            class="p-v-4 scene-item"
          >
            <el-text truncated style="width: 250px">
              {{ s.index + '、' + s.name }}
              <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)'
                "
@@ -56,25 +93,16 @@
          </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 == undefined ||
      scenetype.value.value == null ||
      v.typeid + '' == scenetype.value.value
        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>
src/composables/messageBox.js
@@ -24,7 +24,7 @@
        message: msg,
        type: 'success',
        // offset: 170,
        position: 'top-right',
        position: 'bottom-right',
      });
    })
    .catch((err) => {
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 }
              },
              {
                //监管任务场景编辑
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;
  }
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'
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 }
    ];
    
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>
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>
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>
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
src/views/fysp/task/TaskManage.vue
@@ -31,13 +31,19 @@
        class="el-scrollbar"
        v-loading="mainLoading"
      >
        <el-row justify="space-between">
          <!-- <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-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
@@ -49,24 +55,28 @@
                  ></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="56vh"
                  height="66vh"
                  @openMap="sceneMapDialog = true"
                    @add="handleAddSubtask"
                    @submit="handleSubtaskSubmit"
                  @submit="onSubtaskUpdate"
                  @remove="onSubtaskUpdate"
                  ></CompSubTaskList>
              <!-- </el-affix> -->
                </el-col>
              </el-row>
            </el-tab-pane>
            <el-tab-pane label="场景地图" name="second">
              <CompTaskMap :plans="curMonitorObjList"></CompTaskMap>
            </el-tab-pane>
          </el-tabs>
        </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>
src/views/fysp/task/TaskProxy.js
@@ -1,9 +1,55 @@
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);
  },
  /**
@@ -28,4 +74,4 @@
      rName: rNames.join('#')
    };
  }
}
};
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
    };
  });
  // 更新场景监管次数
  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) => {
function createSubtasks() {
        seletedSceneList.value = [];
        fetchSubTask(props.dayTask.guid);
        ElMessage({
          message: '巡查任务添加成功',
          type: 'success'
        });
        emit('submit')
      });
    }
  });
  emit('submit');
}
function deleteSubtasks() {
  emit('submit')
  emit('submit');
}
</script>
<style scoped></style>
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;
src/views/fysp/task/components/CompSubTaskList.vue
@@ -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月DD日'))
const dateStr = computed(() => dayjs(props.date).format('MM月DD日'));
function remove(item) {
  if (item.status == '未执行') {
@@ -156,6 +159,15 @@
  emit('add');
}
/**
 * 打开场景地图
 */
function openMap() {
  emit('openMap');
}
onUnmounted(() => {
  dialogVisible.value = false;
});
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) {
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>