Explorar o código

fix: 对接相册,报告,首页

刘秀芳 hai 1 semana
pai
achega
fae34087c8

+ 178 - 32
package-lock.json

@@ -13840,8 +13840,6 @@
     },
     },
     "node_modules/npm/node_modules/@npmcli/disparity-colors": {
     "node_modules/npm/node_modules/@npmcli/disparity-colors": {
       "version": "3.0.0",
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/disparity-colors/-/disparity-colors-3.0.0.tgz",
-      "integrity": "sha512-5R/z157/f20Fi0Ou4ZttL51V0xz0EdPEOauFtPCEYOLInDBRCj1/TxOJ5aGTrtShxEshN2d+hXb9ZKSi5RLBcg==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -13853,8 +13851,6 @@
     },
     },
     "node_modules/npm/node_modules/@npmcli/fs": {
     "node_modules/npm/node_modules/@npmcli/fs": {
       "version": "3.1.0",
       "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz",
-      "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -13866,8 +13862,6 @@
     },
     },
     "node_modules/npm/node_modules/@npmcli/git": {
     "node_modules/npm/node_modules/@npmcli/git": {
       "version": "4.0.3",
       "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.3.tgz",
-      "integrity": "sha512-8cXNkDIbnXPVbhXMmQ7/bklCAjtmPaXfI9aEM4iH+xSuEHINLMHhlfESvVwdqmHJRJkR48vNJTSUvoF6GRPSFA==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -13916,8 +13910,6 @@
     },
     },
     "node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
     "node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
       "version": "5.0.0",
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.0.tgz",
-      "integrity": "sha512-BBFQx4M12wiEuVwCgtX/Depx0B/+NHMwDWOlXT41/Pdy5W/1Fenk+hibUlMSrFWwASbX+fY90UbILAEIYH02/A==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -13947,8 +13939,6 @@
     },
     },
     "node_modules/npm/node_modules/@npmcli/package-json": {
     "node_modules/npm/node_modules/@npmcli/package-json": {
       "version": "3.0.0",
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-3.0.0.tgz",
-      "integrity": "sha512-NnuPuM97xfiCpbTEJYtEuKz6CFbpUHtaT0+5via5pQeI25omvQDFbp1GcGJ/c4zvL/WX0qbde6YiLgfZbWFgvg==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -13982,8 +13972,6 @@
     },
     },
     "node_modules/npm/node_modules/@npmcli/run-script": {
     "node_modules/npm/node_modules/@npmcli/run-script": {
       "version": "6.0.0",
       "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.0.tgz",
-      "integrity": "sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -14098,8 +14086,6 @@
     },
     },
     "node_modules/npm/node_modules/aproba": {
     "node_modules/npm/node_modules/aproba": {
       "version": "2.0.0",
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
-      "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
@@ -14112,8 +14098,6 @@
     },
     },
     "node_modules/npm/node_modules/are-we-there-yet": {
     "node_modules/npm/node_modules/are-we-there-yet": {
       "version": "4.0.0",
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz",
-      "integrity": "sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -14193,8 +14177,6 @@
     },
     },
     "node_modules/npm/node_modules/bin-links": {
     "node_modules/npm/node_modules/bin-links": {
       "version": "4.0.1",
       "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.1.tgz",
-      "integrity": "sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -14209,8 +14191,6 @@
     },
     },
     "node_modules/npm/node_modules/binary-extensions": {
     "node_modules/npm/node_modules/binary-extensions": {
       "version": "2.2.0",
       "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -14219,8 +14199,6 @@
     },
     },
     "node_modules/npm/node_modules/brace-expansion": {
     "node_modules/npm/node_modules/brace-expansion": {
       "version": "2.0.1",
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -14229,8 +14207,6 @@
     },
     },
     "node_modules/npm/node_modules/builtins": {
     "node_modules/npm/node_modules/builtins": {
       "version": "5.0.1",
       "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
-      "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -14334,8 +14310,6 @@
     },
     },
     "node_modules/npm/node_modules/cli-table3": {
     "node_modules/npm/node_modules/cli-table3": {
       "version": "0.6.3",
       "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
-      "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -14388,6 +14362,8 @@
     },
     },
     "node_modules/npm/node_modules/color-support": {
     "node_modules/npm/node_modules/color-support": {
       "version": "1.1.3",
       "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "bin": {
       "bin": {
@@ -14396,6 +14372,8 @@
     },
     },
     "node_modules/npm/node_modules/columnify": {
     "node_modules/npm/node_modules/columnify": {
       "version": "1.6.0",
       "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz",
+      "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -14408,21 +14386,29 @@
     },
     },
     "node_modules/npm/node_modules/common-ancestor-path": {
     "node_modules/npm/node_modules/common-ancestor-path": {
       "version": "1.0.1",
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz",
+      "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
     "node_modules/npm/node_modules/concat-map": {
     "node_modules/npm/node_modules/concat-map": {
       "version": "0.0.1",
       "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT"
       "license": "MIT"
     },
     },
     "node_modules/npm/node_modules/console-control-strings": {
     "node_modules/npm/node_modules/console-control-strings": {
       "version": "1.1.0",
       "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
     "node_modules/npm/node_modules/cssesc": {
     "node_modules/npm/node_modules/cssesc": {
       "version": "3.0.0",
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "bin": {
       "bin": {
@@ -14463,6 +14449,8 @@
     },
     },
     "node_modules/npm/node_modules/delegates": {
     "node_modules/npm/node_modules/delegates": {
       "version": "1.0.0",
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT"
       "license": "MIT"
     },
     },
@@ -14484,11 +14472,15 @@
     },
     },
     "node_modules/npm/node_modules/emoji-regex": {
     "node_modules/npm/node_modules/emoji-regex": {
       "version": "8.0.0",
       "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT"
       "license": "MIT"
     },
     },
     "node_modules/npm/node_modules/encoding": {
     "node_modules/npm/node_modules/encoding": {
       "version": "0.1.13",
       "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "optional": true,
       "optional": true,
@@ -14498,6 +14490,8 @@
     },
     },
     "node_modules/npm/node_modules/env-paths": {
     "node_modules/npm/node_modules/env-paths": {
       "version": "2.2.1",
       "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+      "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -14506,11 +14500,15 @@
     },
     },
     "node_modules/npm/node_modules/err-code": {
     "node_modules/npm/node_modules/err-code": {
       "version": "2.0.3",
       "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+      "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT"
       "license": "MIT"
     },
     },
     "node_modules/npm/node_modules/event-target-shim": {
     "node_modules/npm/node_modules/event-target-shim": {
       "version": "5.0.1",
       "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -14519,6 +14517,8 @@
     },
     },
     "node_modules/npm/node_modules/events": {
     "node_modules/npm/node_modules/events": {
       "version": "3.3.0",
       "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -14527,6 +14527,8 @@
     },
     },
     "node_modules/npm/node_modules/fastest-levenshtein": {
     "node_modules/npm/node_modules/fastest-levenshtein": {
       "version": "1.0.16",
       "version": "1.0.16",
+      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+      "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -14535,6 +14537,8 @@
     },
     },
     "node_modules/npm/node_modules/fs-minipass": {
     "node_modules/npm/node_modules/fs-minipass": {
       "version": "2.1.0",
       "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -14557,6 +14561,8 @@
     },
     },
     "node_modules/npm/node_modules/fs.realpath": {
     "node_modules/npm/node_modules/fs.realpath": {
       "version": "1.0.0",
       "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
@@ -14619,6 +14625,8 @@
     },
     },
     "node_modules/npm/node_modules/has-flag": {
     "node_modules/npm/node_modules/has-flag": {
       "version": "4.0.0",
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -14627,6 +14635,8 @@
     },
     },
     "node_modules/npm/node_modules/has-unicode": {
     "node_modules/npm/node_modules/has-unicode": {
       "version": "2.0.1",
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
@@ -14648,6 +14658,8 @@
     },
     },
     "node_modules/npm/node_modules/http-proxy-agent": {
     "node_modules/npm/node_modules/http-proxy-agent": {
       "version": "5.0.0",
       "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+      "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -14661,6 +14673,8 @@
     },
     },
     "node_modules/npm/node_modules/https-proxy-agent": {
     "node_modules/npm/node_modules/https-proxy-agent": {
       "version": "5.0.1",
       "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -14673,6 +14687,8 @@
     },
     },
     "node_modules/npm/node_modules/humanize-ms": {
     "node_modules/npm/node_modules/humanize-ms": {
       "version": "1.2.1",
       "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+      "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -14681,6 +14697,8 @@
     },
     },
     "node_modules/npm/node_modules/iconv-lite": {
     "node_modules/npm/node_modules/iconv-lite": {
       "version": "0.6.3",
       "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "optional": true,
       "optional": true,
@@ -14693,6 +14711,8 @@
     },
     },
     "node_modules/npm/node_modules/ieee754": {
     "node_modules/npm/node_modules/ieee754": {
       "version": "1.2.1",
       "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
       "funding": [
       "funding": [
         {
         {
           "type": "github",
           "type": "github",
@@ -14723,6 +14743,8 @@
     },
     },
     "node_modules/npm/node_modules/imurmurhash": {
     "node_modules/npm/node_modules/imurmurhash": {
       "version": "0.1.4",
       "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -14731,6 +14753,8 @@
     },
     },
     "node_modules/npm/node_modules/indent-string": {
     "node_modules/npm/node_modules/indent-string": {
       "version": "4.0.0",
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -14739,11 +14763,15 @@
     },
     },
     "node_modules/npm/node_modules/infer-owner": {
     "node_modules/npm/node_modules/infer-owner": {
       "version": "1.0.4",
       "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
     "node_modules/npm/node_modules/inflight": {
     "node_modules/npm/node_modules/inflight": {
       "version": "1.0.6",
       "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -14753,6 +14781,8 @@
     },
     },
     "node_modules/npm/node_modules/inherits": {
     "node_modules/npm/node_modules/inherits": {
       "version": "2.0.4",
       "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
@@ -14788,6 +14818,8 @@
     },
     },
     "node_modules/npm/node_modules/ip-regex": {
     "node_modules/npm/node_modules/ip-regex": {
       "version": "4.3.0",
       "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz",
+      "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -14796,6 +14828,8 @@
     },
     },
     "node_modules/npm/node_modules/is-cidr": {
     "node_modules/npm/node_modules/is-cidr": {
       "version": "4.0.2",
       "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-4.0.2.tgz",
+      "integrity": "sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA==",
       "inBundle": true,
       "inBundle": true,
       "license": "BSD-2-Clause",
       "license": "BSD-2-Clause",
       "dependencies": {
       "dependencies": {
@@ -14818,6 +14852,8 @@
     },
     },
     "node_modules/npm/node_modules/is-fullwidth-code-point": {
     "node_modules/npm/node_modules/is-fullwidth-code-point": {
       "version": "3.0.0",
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -14826,11 +14862,15 @@
     },
     },
     "node_modules/npm/node_modules/is-lambda": {
     "node_modules/npm/node_modules/is-lambda": {
       "version": "1.0.1",
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+      "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT"
       "license": "MIT"
     },
     },
     "node_modules/npm/node_modules/isexe": {
     "node_modules/npm/node_modules/isexe": {
       "version": "2.0.0",
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
@@ -14844,6 +14884,8 @@
     },
     },
     "node_modules/npm/node_modules/json-stringify-nice": {
     "node_modules/npm/node_modules/json-stringify-nice": {
       "version": "1.1.4",
       "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz",
+      "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "funding": {
       "funding": {
@@ -14852,6 +14894,8 @@
     },
     },
     "node_modules/npm/node_modules/jsonparse": {
     "node_modules/npm/node_modules/jsonparse": {
       "version": "1.3.1",
       "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
       "engines": [
       "engines": [
         "node >= 0.2.0"
         "node >= 0.2.0"
       ],
       ],
@@ -15081,6 +15125,8 @@
     },
     },
     "node_modules/npm/node_modules/minipass-collect": {
     "node_modules/npm/node_modules/minipass-collect": {
       "version": "1.0.2",
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15130,6 +15176,8 @@
     },
     },
     "node_modules/npm/node_modules/minipass-flush": {
     "node_modules/npm/node_modules/minipass-flush": {
       "version": "1.0.5",
       "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15172,6 +15220,8 @@
     },
     },
     "node_modules/npm/node_modules/minipass-pipeline": {
     "node_modules/npm/node_modules/minipass-pipeline": {
       "version": "1.2.4",
       "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15194,6 +15244,8 @@
     },
     },
     "node_modules/npm/node_modules/minipass-sized": {
     "node_modules/npm/node_modules/minipass-sized": {
       "version": "1.0.3",
       "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+      "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15216,6 +15268,8 @@
     },
     },
     "node_modules/npm/node_modules/minizlib": {
     "node_modules/npm/node_modules/minizlib": {
       "version": "2.1.2",
       "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -15239,6 +15293,8 @@
     },
     },
     "node_modules/npm/node_modules/mkdirp": {
     "node_modules/npm/node_modules/mkdirp": {
       "version": "1.0.4",
       "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "bin": {
       "bin": {
@@ -15250,6 +15306,8 @@
     },
     },
     "node_modules/npm/node_modules/ms": {
     "node_modules/npm/node_modules/ms": {
       "version": "2.1.3",
       "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT"
       "license": "MIT"
     },
     },
@@ -15340,8 +15398,6 @@
     },
     },
     "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": {
     "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": {
       "version": "1.1.11",
       "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -15381,8 +15437,6 @@
     },
     },
     "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": {
     "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": {
       "version": "2.0.1",
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -15420,6 +15474,8 @@
     },
     },
     "node_modules/npm/node_modules/node-gyp/node_modules/gauge": {
     "node_modules/npm/node_modules/node-gyp/node_modules/gauge": {
       "version": "4.0.4",
       "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
+      "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15483,6 +15539,8 @@
     },
     },
     "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": {
     "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": {
       "version": "3.1.2",
       "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15494,6 +15552,8 @@
     },
     },
     "node_modules/npm/node_modules/node-gyp/node_modules/minipass": {
     "node_modules/npm/node_modules/node-gyp/node_modules/minipass": {
       "version": "3.3.6",
       "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15505,6 +15565,8 @@
     },
     },
     "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": {
     "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": {
       "version": "2.1.2",
       "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz",
+      "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -15549,6 +15611,8 @@
     },
     },
     "node_modules/npm/node_modules/node-gyp/node_modules/ssri": {
     "node_modules/npm/node_modules/node-gyp/node_modules/ssri": {
       "version": "9.0.1",
       "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz",
+      "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15560,6 +15624,8 @@
     },
     },
     "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": {
     "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": {
       "version": "2.0.1",
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz",
+      "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15571,6 +15637,8 @@
     },
     },
     "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": {
     "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": {
       "version": "3.0.0",
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz",
+      "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15610,6 +15678,8 @@
     },
     },
     "node_modules/npm/node_modules/normalize-package-data": {
     "node_modules/npm/node_modules/normalize-package-data": {
       "version": "5.0.0",
       "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz",
+      "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==",
       "inBundle": true,
       "inBundle": true,
       "license": "BSD-2-Clause",
       "license": "BSD-2-Clause",
       "dependencies": {
       "dependencies": {
@@ -15665,6 +15735,8 @@
     },
     },
     "node_modules/npm/node_modules/npm-package-arg": {
     "node_modules/npm/node_modules/npm-package-arg": {
       "version": "10.1.0",
       "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz",
+      "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15679,6 +15751,8 @@
     },
     },
     "node_modules/npm/node_modules/npm-packlist": {
     "node_modules/npm/node_modules/npm-packlist": {
       "version": "7.0.4",
       "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz",
+      "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15704,6 +15778,8 @@
     },
     },
     "node_modules/npm/node_modules/npm-profile": {
     "node_modules/npm/node_modules/npm-profile": {
       "version": "7.0.1",
       "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-7.0.1.tgz",
+      "integrity": "sha512-VReArOY/fCx5dWL66cbJ2OMogTQAVVQA//8jjmjkarboki3V7UJ0XbGFW+khRwiAJFQjuH0Bqr/yF7Y5RZdkMQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15738,6 +15814,8 @@
     },
     },
     "node_modules/npm/node_modules/npmlog": {
     "node_modules/npm/node_modules/npmlog": {
       "version": "7.0.1",
       "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz",
+      "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15752,6 +15830,8 @@
     },
     },
     "node_modules/npm/node_modules/once": {
     "node_modules/npm/node_modules/once": {
       "version": "1.4.0",
       "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15760,6 +15840,8 @@
     },
     },
     "node_modules/npm/node_modules/p-map": {
     "node_modules/npm/node_modules/p-map": {
       "version": "4.0.0",
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -15817,6 +15899,8 @@
     },
     },
     "node_modules/npm/node_modules/path-is-absolute": {
     "node_modules/npm/node_modules/path-is-absolute": {
       "version": "1.0.1",
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -15837,6 +15921,8 @@
     },
     },
     "node_modules/npm/node_modules/proc-log": {
     "node_modules/npm/node_modules/proc-log": {
       "version": "3.0.0",
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
+      "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "engines": {
       "engines": {
@@ -15845,6 +15931,8 @@
     },
     },
     "node_modules/npm/node_modules/process": {
     "node_modules/npm/node_modules/process": {
       "version": "0.11.10",
       "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -15853,6 +15941,8 @@
     },
     },
     "node_modules/npm/node_modules/promise-all-reject-late": {
     "node_modules/npm/node_modules/promise-all-reject-late": {
       "version": "1.0.1",
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz",
+      "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "funding": {
       "funding": {
@@ -15869,11 +15959,15 @@
     },
     },
     "node_modules/npm/node_modules/promise-inflight": {
     "node_modules/npm/node_modules/promise-inflight": {
       "version": "1.0.1",
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
     "node_modules/npm/node_modules/promise-retry": {
     "node_modules/npm/node_modules/promise-retry": {
       "version": "2.0.1",
       "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+      "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -15894,6 +15988,8 @@
     },
     },
     "node_modules/npm/node_modules/qrcode-terminal": {
     "node_modules/npm/node_modules/qrcode-terminal": {
       "version": "0.12.0",
       "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
+      "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
       "inBundle": true,
       "inBundle": true,
       "bin": {
       "bin": {
         "qrcode-terminal": "bin/qrcode-terminal.js"
         "qrcode-terminal": "bin/qrcode-terminal.js"
@@ -15912,6 +16008,8 @@
     },
     },
     "node_modules/npm/node_modules/read-cmd-shim": {
     "node_modules/npm/node_modules/read-cmd-shim": {
       "version": "4.0.0",
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz",
+      "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "engines": {
       "engines": {
@@ -15959,6 +16057,8 @@
     },
     },
     "node_modules/npm/node_modules/retry": {
     "node_modules/npm/node_modules/retry": {
       "version": "0.12.0",
       "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+      "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -15967,6 +16067,8 @@
     },
     },
     "node_modules/npm/node_modules/rimraf": {
     "node_modules/npm/node_modules/rimraf": {
       "version": "3.0.2",
       "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -15981,8 +16083,6 @@
     },
     },
     "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": {
     "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": {
       "version": "1.1.11",
       "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -16011,6 +16111,8 @@
     },
     },
     "node_modules/npm/node_modules/rimraf/node_modules/minimatch": {
     "node_modules/npm/node_modules/rimraf/node_modules/minimatch": {
       "version": "3.1.2",
       "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -16022,6 +16124,8 @@
     },
     },
     "node_modules/npm/node_modules/safe-buffer": {
     "node_modules/npm/node_modules/safe-buffer": {
       "version": "5.2.1",
       "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
       "funding": [
       "funding": [
         {
         {
           "type": "github",
           "type": "github",
@@ -16041,6 +16145,8 @@
     },
     },
     "node_modules/npm/node_modules/safer-buffer": {
     "node_modules/npm/node_modules/safer-buffer": {
       "version": "2.1.2",
       "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "optional": true
       "optional": true
@@ -16072,16 +16178,22 @@
     },
     },
     "node_modules/npm/node_modules/set-blocking": {
     "node_modules/npm/node_modules/set-blocking": {
       "version": "2.0.0",
       "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
     "node_modules/npm/node_modules/signal-exit": {
     "node_modules/npm/node_modules/signal-exit": {
       "version": "3.0.7",
       "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
     "node_modules/npm/node_modules/smart-buffer": {
     "node_modules/npm/node_modules/smart-buffer": {
       "version": "4.2.0",
       "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+      "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "engines": {
       "engines": {
@@ -16104,6 +16216,8 @@
     },
     },
     "node_modules/npm/node_modules/socks-proxy-agent": {
     "node_modules/npm/node_modules/socks-proxy-agent": {
       "version": "7.0.0",
       "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
+      "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -16131,6 +16245,8 @@
     },
     },
     "node_modules/npm/node_modules/spdx-expression-parse": {
     "node_modules/npm/node_modules/spdx-expression-parse": {
       "version": "3.0.1",
       "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -16156,6 +16272,8 @@
     },
     },
     "node_modules/npm/node_modules/string_decoder": {
     "node_modules/npm/node_modules/string_decoder": {
       "version": "1.3.0",
       "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -16164,6 +16282,8 @@
     },
     },
     "node_modules/npm/node_modules/string-width": {
     "node_modules/npm/node_modules/string-width": {
       "version": "4.2.3",
       "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -16177,6 +16297,8 @@
     },
     },
     "node_modules/npm/node_modules/strip-ansi": {
     "node_modules/npm/node_modules/strip-ansi": {
       "version": "6.0.1",
       "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -16188,6 +16310,8 @@
     },
     },
     "node_modules/npm/node_modules/supports-color": {
     "node_modules/npm/node_modules/supports-color": {
       "version": "7.2.0",
       "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -16215,16 +16339,22 @@
     },
     },
     "node_modules/npm/node_modules/text-table": {
     "node_modules/npm/node_modules/text-table": {
       "version": "0.2.0",
       "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT"
       "license": "MIT"
     },
     },
     "node_modules/npm/node_modules/tiny-relative-date": {
     "node_modules/npm/node_modules/tiny-relative-date": {
       "version": "1.3.0",
       "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz",
+      "integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT"
       "license": "MIT"
     },
     },
     "node_modules/npm/node_modules/treeverse": {
     "node_modules/npm/node_modules/treeverse": {
       "version": "3.0.0",
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz",
+      "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "engines": {
       "engines": {
@@ -16233,6 +16363,8 @@
     },
     },
     "node_modules/npm/node_modules/unique-filename": {
     "node_modules/npm/node_modules/unique-filename": {
       "version": "3.0.0",
       "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz",
+      "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -16244,6 +16376,8 @@
     },
     },
     "node_modules/npm/node_modules/unique-slug": {
     "node_modules/npm/node_modules/unique-slug": {
       "version": "4.0.0",
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz",
+      "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -16255,11 +16389,15 @@
     },
     },
     "node_modules/npm/node_modules/util-deprecate": {
     "node_modules/npm/node_modules/util-deprecate": {
       "version": "1.0.2",
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT"
       "license": "MIT"
     },
     },
     "node_modules/npm/node_modules/validate-npm-package-license": {
     "node_modules/npm/node_modules/validate-npm-package-license": {
       "version": "3.0.4",
       "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
       "inBundle": true,
       "inBundle": true,
       "license": "Apache-2.0",
       "license": "Apache-2.0",
       "dependencies": {
       "dependencies": {
@@ -16285,6 +16423,8 @@
     },
     },
     "node_modules/npm/node_modules/wcwidth": {
     "node_modules/npm/node_modules/wcwidth": {
       "version": "1.0.1",
       "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
       "inBundle": true,
       "inBundle": true,
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
@@ -16307,6 +16447,8 @@
     },
     },
     "node_modules/npm/node_modules/wide-align": {
     "node_modules/npm/node_modules/wide-align": {
       "version": "1.1.5",
       "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC",
       "license": "ISC",
       "dependencies": {
       "dependencies": {
@@ -16315,6 +16457,8 @@
     },
     },
     "node_modules/npm/node_modules/wrappy": {
     "node_modules/npm/node_modules/wrappy": {
       "version": "1.0.2",
       "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },
@@ -16332,6 +16476,8 @@
     },
     },
     "node_modules/npm/node_modules/yallist": {
     "node_modules/npm/node_modules/yallist": {
       "version": "4.0.0",
       "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "inBundle": true,
       "inBundle": true,
       "license": "ISC"
       "license": "ISC"
     },
     },

+ 11 - 1
src/api/modules/questionnaire.js

@@ -23,7 +23,7 @@ module.exports = {
     },
     },
     // 获取外部感知任务接口
     // 获取外部感知任务接口
     getExternalInteractTasks: {
     getExternalInteractTasks: {
-        url: config.base_new_url + "pheno/interact_tasks",
+        url: config.base_new_url + "pheno/outer_interact_tasks",
         type: "get",
         type: "get",
     },
     },
     // 获取内部感知任务接口
     // 获取内部感知任务接口
@@ -91,4 +91,14 @@ module.exports = {
         url: config.base_new_url + "questionnaire/upload_image",
         url: config.base_new_url + "questionnaire/upload_image",
         type: "post",
         type: "post",
     },
     },
+    // 查询分区照片列表
+    getZoneImages: {
+        url: config.base_new_url + "questionnaire/zone_image_list",
+        type: "get",
+    },
+    // 诊断报告列表
+    getReportList: {
+        url: config.base_new_url + "questionnaire/weather_report_list",
+        type: "get",
+    },
 }
 }

+ 22 - 1
src/components/allGarden.vue

@@ -5,6 +5,10 @@
         <div class="page-body">
         <div class="page-body">
             <div class="map-wrap">
             <div class="map-wrap">
                 <div class="map-container" ref="mapContainer"></div>
                 <div class="map-container" ref="mapContainer"></div>
+                <div class="add-farm-btn" @click="handleAddFarm">
+                    <el-icon><Plus /></el-icon>
+                    <span>{{ t("garden.addFarm") }}</span>
+                </div>
             </div>
             </div>
 
 
             <div class="farm-filter">
             <div class="farm-filter">
@@ -264,7 +268,7 @@ function handleEnterFarm(item, index) {
 }
 }
 
 
 function handleAddFarm() {
 function handleAddFarm() {
-    router.push("/create_farm?from=all_garden&isReload=true");
+    router.push("/entry_information");
 }
 }
 
 
 function handleForward() {
 function handleForward() {
@@ -344,6 +348,23 @@ onActivated(() => {
         height: 162px;
         height: 162px;
         clip-path: inset(0 round 8px);
         clip-path: inset(0 round 8px);
     }
     }
+    
+    .add-farm-btn {
+        position: absolute;
+        right: 10px;
+        bottom: 10px;
+        z-index: 2;
+        display: inline-flex;
+        align-items: center;
+        gap: 2px;
+        height: 28px;
+        padding: 0 10px;
+        border-radius: 14px;
+        background: #fff;
+        color: #2199f8;
+        font-size: 12px;
+        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+    }
 }
 }
 
 
 .farm-filter {
 .farm-filter {

+ 19 - 4
src/components/popup/restorePlantingPopup.vue

@@ -116,8 +116,8 @@ const { t } = useI18n();
 // Props
 // Props
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 const props = defineProps({
 const props = defineProps({
-    /** 分区 id,初始互动接口必填 */
-    zoneId: { type: [Number, String], default: 42 },
+    /** 分区 id;不传则读当前选中农场缓存 */
+    zoneId: { type: [Number, String], default: null },
 });
 });
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
@@ -173,6 +173,17 @@ const interactKeys = computed(() =>
     Object.keys(interactMap.value).sort((a, b) => Number(a) - Number(b))
     Object.keys(interactMap.value).sort((a, b) => Number(a) - Number(b))
 );
 );
 
 
+const getSelectedZoneId = () => {
+    try {
+        const farm = JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
+        return farm.zone_id ?? farm.zoneId ?? null;
+    } catch {
+        return null;
+    }
+};
+
+const resolvedZoneId = computed(() => props.zoneId ?? getSelectedZoneId());
+
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 // 工具函数
 // 工具函数
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
@@ -280,9 +291,13 @@ const applyQuestionData = (data) => {
 
 
 /** 请求接口判断是否展示,并填充问题内容 */
 /** 请求接口判断是否展示,并填充问题内容 */
 const checkShouldShow = async () => {
 const checkShouldShow = async () => {
+    if (resolvedZoneId.value == null || resolvedZoneId.value === "") {
+        visible.value = false;
+        return;
+    }
     try {
     try {
         const res = await VE_API.questionnaire.getInitialInteraction({
         const res = await VE_API.questionnaire.getInitialInteraction({
-            zone_id: props.zoneId,
+            zone_id: resolvedZoneId.value,
             date: formatToday(),
             date: formatToday(),
             // date: '2025-07-10',
             // date: '2025-07-10',
         });
         });
@@ -327,7 +342,7 @@ const handlePhenologySelect = (value) => {
  */
  */
 const buildSubmitPayload = (type = "time") => {
 const buildSubmitPayload = (type = "time") => {
     const payload = {
     const payload = {
-        zone_id: Number(props.zoneId) || props.zoneId,
+        zone_id: Number(resolvedZoneId.value) || resolvedZoneId.value,
         date: toApiDate(selectedDate.value) || formatToday(),
         date: toApiDate(selectedDate.value) || formatToday(),
     };
     };
     if (type === "time") {
     if (type === "time") {

+ 5 - 5
src/i18n/messages.js

@@ -147,16 +147,16 @@ export default {
             patrolRecord: "巡园记录",
             patrolRecord: "巡园记录",
             patrolGrowthTitle: "长势跟踪巡园要点",
             patrolGrowthTitle: "长势跟踪巡园要点",
             patrolAbnormalTitle: "异常态势巡园要点",
             patrolAbnormalTitle: "异常态势巡园要点",
-            patrolSubject: "某某主题",
-            patrolIssue: "连阴雨泡得芽点发软,不清沟排水,芽都烂在土里今年连叶都没得看",
+            patrolSubject: "--",
+            patrolIssue: "暂无数据",
             forward: "转发",
             forward: "转发",
             workName: "农事名称",
             workName: "农事名称",
             interactTheme: "互动主题",
             interactTheme: "互动主题",
-            interactReason: "互动原因互动原因",
+            interactReason: "--",
             agriAssessment: "农情研判",
             agriAssessment: "农情研判",
-            agriAssessmentDesc: "互动原因互动原因互动原因互动原因互气象风险等互动原因互动原因互动原因互动原因互气象风险等",
+            agriAssessmentDesc: "---",
             interactQuestion: "互动问题",
             interactQuestion: "互动问题",
-            interactQuestionText: "具体问题具体问题具体问题具体问题具体?",
+            interactQuestionText: "--",
             ratioPlaceholder: "请输入比例",
             ratioPlaceholder: "请输入比例",
             pleaseSelectOption: "请先选择一个选项",
             pleaseSelectOption: "请先选择一个选项",
             submit: "提交",
             submit: "提交",

+ 91 - 35
src/views/old_mini/agri_file/components/addZoneInfoPopup.vue

@@ -35,12 +35,13 @@
                         filterable
                         filterable
                         :loading="varietyLoading"
                         :loading="varietyLoading"
                         :disabled="!form.categoryId"
                         :disabled="!form.categoryId"
+                        @change="handleVarietyChange"
                     >
                     >
                         <el-option
                         <el-option
-                            v-for="item in varietyOptions"
-                            :key="item.id"
-                            :label="item.name"
-                            :value="item.id"
+                            v-for="(item, index) in varietyOptions"
+                            :key="index"
+                            :label="item"
+                            :value="item"
                         />
                         />
                     </el-select>
                     </el-select>
                 </div>
                 </div>
@@ -89,13 +90,20 @@ import { useI18n } from "@/i18n";
 
 
 const { t } = useI18n();
 const { t } = useI18n();
 
 
-const FIRST_CROPS = ["果树", "大田"];
+const LOCATION_KEY = "ENTRY_RESIDENT_LOCATION";
+const DEFAULT_COUNTY_CODE = "440113";
+const META_KEYS = new Set(["city", "county", "county_code", "province"]);
 
 
 const props = defineProps({
 const props = defineProps({
     show: {
     show: {
         type: Boolean,
         type: Boolean,
         default: false,
         default: false,
     },
     },
+    /** 区县编码;不传则从缓存位置解析 */
+    countyCode: {
+        type: [String, Number],
+        default: "",
+    },
 });
 });
 
 
 const emit = defineEmits(["update:show", "confirm"]);
 const emit = defineEmits(["update:show", "confirm"]);
@@ -112,48 +120,79 @@ const varietyLoading = ref(false);
 const categoryOptions = ref([]);
 const categoryOptions = ref([]);
 const varietyOptions = ref([]);
 const varietyOptions = ref([]);
 const startingPointQuestion = ref(t("agriFile.plantStartPoint"));
 const startingPointQuestion = ref(t("agriFile.plantStartPoint"));
-const categoryLoaded = ref(false);
 
 
 const showValue = computed({
 const showValue = computed({
     get: () => props.show,
     get: () => props.show,
     set: (value) => emit("update:show", value),
     set: (value) => emit("update:show", value),
 });
 });
 
 
-const flattenThirdCrops = (list) => {
-    if (!Array.isArray(list)) return [];
+const resolveCountyCode = () => {
+    if (props.countyCode) return String(props.countyCode);
+    try {
+        const saved = JSON.parse(sessionStorage.getItem(LOCATION_KEY) || "null");
+        if (saved?.adcode) return String(saved.adcode);
+    } catch {
+        // ignore
+    }
+    try {
+        const farm = JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
+        const code = farm.county_code || farm.adcode;
+        if (code) return String(code);
+    } catch {
+        // ignore
+    }
+    return DEFAULT_COUNTY_CODE;
+};
+
+/** getCrops 可能返回对象(果树/大田分组)或数组,统一展平为下拉选项 */
+const flattenCropsToOptions = (data) => {
     const map = new Map();
     const map = new Map();
-    list.forEach((group) => {
-        (group?.third_crops || []).forEach((crop) => {
-            if (crop?.id == null || !crop?.name) return;
-            map.set(String(crop.id), {
-                id: crop.id,
-                name: crop.name,
+    const pushCrop = (crop) => {
+        const id = crop?.crop_id ?? crop?.id;
+        const name = crop?.crop_name ?? crop?.name;
+        if (id == null || !name) return;
+        map.set(String(id), { id, name, code: crop.crop_code || "" });
+    };
+
+    if (Array.isArray(data)) {
+        data.forEach((item) => {
+            if (Array.isArray(item?.items)) {
+                item.items.forEach(pushCrop);
+                return;
+            }
+            pushCrop(item);
+        });
+        return Array.from(map.values());
+    }
+
+    if (!data || typeof data !== "object") return [];
+    Object.keys(data)
+        .filter((key) => !META_KEYS.has(key) && Array.isArray(data[key]))
+        .forEach((key) => {
+            data[key].forEach((group) => {
+                if (Array.isArray(group?.items)) {
+                    group.items.forEach(pushCrop);
+                    return;
+                }
+                pushCrop(group);
             });
             });
         });
         });
-    });
     return Array.from(map.values());
     return Array.from(map.values());
 };
 };
 
 
 const fetchCategoryOptions = async () => {
 const fetchCategoryOptions = async () => {
-    if (categoryLoaded.value || categoryLoading.value) return;
+    if (categoryLoading.value) return;
     categoryLoading.value = true;
     categoryLoading.value = true;
     try {
     try {
-        const results = await Promise.all(
-            FIRST_CROPS.map((firstCrop) =>
-                VE_API.entry.getCropHierarchy({ first_crop: firstCrop })
-            )
-        );
-        const merged = [];
-        results.forEach((res) => {
-            if (res?.code === 200) {
-                merged.push(...flattenThirdCrops(res.data));
-            }
+        const res = await VE_API.entry.getCrops({
+            county_code: resolveCountyCode(),
         });
         });
-        // 按 id 去重(果树/大田可能有交叉)
-        const uniqueMap = new Map();
-        merged.forEach((item) => uniqueMap.set(String(item.id), item));
-        categoryOptions.value = Array.from(uniqueMap.values());
-        categoryLoaded.value = true;
+        if (res?.code === 200) {
+            categoryOptions.value = flattenCropsToOptions(res.data);
+        } else {
+            categoryOptions.value = [];
+            ElMessage.error(res?.msg || "获取种植品类失败");
+        }
     } catch {
     } catch {
         categoryOptions.value = [];
         categoryOptions.value = [];
         ElMessage.error("获取种植品类失败,请稍后再试");
         ElMessage.error("获取种植品类失败,请稍后再试");
@@ -174,10 +213,7 @@ const fetchVarietyOptions = async (cropId) => {
             crop_id: cropId,
             crop_id: cropId,
         });
         });
         if (res.code === 200 && res.data) {
         if (res.code === 200 && res.data) {
-            varietyOptions.value = (res.data.varieties || []).map((item) => ({
-                id: item.id,
-                name: item.name,
-            }));
+            varietyOptions.value = res.data.varieties;
             startingPointQuestion.value =
             startingPointQuestion.value =
                 res.data.starting_point_question || t("agriFile.plantStartPoint");
                 res.data.starting_point_question || t("agriFile.plantStartPoint");
         } else {
         } else {
@@ -194,11 +230,22 @@ const fetchVarietyOptions = async (cropId) => {
     }
     }
 };
 };
 
 
+const lastAutoZoneName = ref("");
+
+const applyAutoZoneName = (name) => {
+    const nextName = String(name || "").trim();
+    const current = form.zoneName.trim();
+    if (current && current !== lastAutoZoneName.value) return;
+    form.zoneName = nextName;
+    lastAutoZoneName.value = nextName;
+};
+
 const resetForm = () => {
 const resetForm = () => {
     form.categoryId = "";
     form.categoryId = "";
     form.varietyId = "";
     form.varietyId = "";
     form.plantDate = "";
     form.plantDate = "";
     form.zoneName = "";
     form.zoneName = "";
+    lastAutoZoneName.value = "";
     varietyOptions.value = [];
     varietyOptions.value = [];
     startingPointQuestion.value = t("agriFile.plantStartPoint");
     startingPointQuestion.value = t("agriFile.plantStartPoint");
 };
 };
@@ -215,6 +262,15 @@ watch(
 const handleCategoryChange = (cropId) => {
 const handleCategoryChange = (cropId) => {
     form.varietyId = "";
     form.varietyId = "";
     fetchVarietyOptions(cropId);
     fetchVarietyOptions(cropId);
+    const category = categoryOptions.value.find(
+        (item) => String(item.id) === String(cropId)
+    );
+    applyAutoZoneName(category?.name || "");
+};
+
+const handleVarietyChange = (variety) => {
+    const name = typeof variety === "string" ? variety : variety?.name || "";
+    applyAutoZoneName(name);
 };
 };
 
 
 const handleConfirm = () => {
 const handleConfirm = () => {

+ 27 - 6
src/views/old_mini/agri_file/components/albumPanel.vue

@@ -52,7 +52,7 @@
                     <span class="album-card__count">
                     <span class="album-card__count">
                         {{ t("agriFile.photoCount", { count: item.count }) }}
                         {{ t("agriFile.photoCount", { count: item.count }) }}
                     </span>
                     </span>
-                    <div class="album-card__add" @click.stop="emit('open-upload')">
+                    <div class="album-card__add" @click.stop="handleUploadClick(item.zone_id)">
                         <el-icon>
                         <el-icon>
                             <Plus />
                             <Plus />
                         </el-icon>
                         </el-icon>
@@ -141,6 +141,7 @@ function mapZoneItem(zone) {
     return {
     return {
         id: zone.zone_id,
         id: zone.zone_id,
         zoneId: zone.zone_id,
         zoneId: zone.zone_id,
+        zone_id: zone.zone_id,
         name: zone.zone_name || "",
         name: zone.zone_name || "",
         count: zone.image_count ?? 0,
         count: zone.image_count ?? 0,
         cover: resolveZoneCoverUrl(zone.cover_url),
         cover: resolveZoneCoverUrl(zone.cover_url),
@@ -235,13 +236,28 @@ const initAlbumMap = async () => {
     fileMap.kmap?.map?.updateSize?.();
     fileMap.kmap?.map?.updateSize?.();
 };
 };
 
 
+const getFarmMapCenter = () => {
+    try {
+        const farm = JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
+        const wkt = farm.wkt || farm.geom_wkt || farm.farm_location;
+        if (typeof wkt === "string" && wkt.trim()) return wkt.trim();
+    } catch {
+        // ignore
+    }
+    return "";
+};
+
 // ---------- 事件处理 ----------
 // ---------- 事件处理 ----------
 const goAddZone = (type) => {
 const goAddZone = (type) => {
+    const mapCenter = getFarmMapCenter();
     router.push({
     router.push({
-        path: "/add_zone",
+        path: "/entry_select_location",
         query: {
         query: {
-            type,
-            isSuccessPopup: type === "farm" ? "1" : "0",
+            ...(mapCenter ? { mapCenter } : {}),
+            iconType: "plant",
+            pointType: "plant",
+            from: "agri_album",
+            zoneType: type || "region",
         },
         },
     });
     });
 };
 };
@@ -254,13 +270,18 @@ const goAlbumDetail = (item) => {
     router.push({
     router.push({
         path: "/region_albums",
         path: "/region_albums",
         query: {
         query: {
-            id: item?.id,
+            farm_id: getSelectedFarmId(),
+            zone_id: item?.zone_id ?? item?.zoneId ?? item?.id ?? "",
             name: item?.name || "",
             name: item?.name || "",
-            noImage: item?.count ? "false" : "true",
         },
         },
     });
     });
 };
 };
 
 
+const handleUploadClick = (zoneId) => {
+    // 上传照片
+    emit('open-upload', zoneId)
+};
+
 // ---------- 生命周期 ----------
 // ---------- 生命周期 ----------
 onMounted(initAlbumMap);
 onMounted(initAlbumMap);
 onActivated(initAlbumMap);
 onActivated(initAlbumMap);

+ 8 - 1
src/views/old_mini/agri_file/components/albumUploadPopup.vue

@@ -32,6 +32,7 @@
                     value-format="YYYY-MM-DD"
                     value-format="YYYY-MM-DD"
                     placeholder="请选择上传日期"
                     placeholder="请选择上传日期"
                     :editable="false"
                     :editable="false"
+                    :disabled-date="disableAfterToday"
                     style="width: 100%"
                     style="width: 100%"
                     size="large"
                     size="large"
                 />
                 />
@@ -100,9 +101,15 @@ function formatDate(date = new Date()) {
     const year = date.getFullYear();
     const year = date.getFullYear();
     const month = String(date.getMonth() + 1).padStart(2, "0");
     const month = String(date.getMonth() + 1).padStart(2, "0");
     const day = String(date.getDate()).padStart(2, "0");
     const day = String(date.getDate()).padStart(2, "0");
-    return `${year}.${month}.${day}`;
+    return `${year}-${month}-${day}`;
 }
 }
 
 
+const disableAfterToday = (date) => {
+    const today = new Date();
+    today.setHours(0, 0, 0, 0);
+    return date.getTime() > today.getTime();
+};
+
 watch(
 watch(
     () => props.show,
     () => props.show,
     (val) => {
     (val) => {

+ 84 - 23
src/views/old_mini/agri_file/components/patrolPanel.vue

@@ -47,6 +47,14 @@
             <div class="crop-archive__title">{{ t("agriFile.cropArchive") }}</div>
             <div class="crop-archive__title">{{ t("agriFile.cropArchive") }}</div>
             <PhenologyTrackTimelineItem :list="cropArchiveList" />
             <PhenologyTrackTimelineItem :list="cropArchiveList" />
         </div>
         </div>
+        <album-upload-popup v-model:show="showUploadPopup" @confirm="handleUploadConfirm" />
+        <tip-popup v-model:show="showSuccessPopup" type="executeSuccess" text="您已上传成功" text2="请等待诊断报告生成" hideBtn>
+            <template #footer>
+                <div class="bottom-btn-container">
+                    <div class="bottom-btn primary-btn" @click="handleComplete">完成</div>
+                </div>
+            </template>
+        </tip-popup>
     </div>
     </div>
 </template>
 </template>
 
 
@@ -54,12 +62,13 @@
 import { onActivated, onMounted, ref } from "vue";
 import { onActivated, onMounted, ref } from "vue";
 import { useRouter } from "vue-router";
 import { useRouter } from "vue-router";
 import { Icon } from "vant";
 import { Icon } from "vant";
+import { ElMessage } from "element-plus";
 import { useI18n } from "@/i18n";
 import { useI18n } from "@/i18n";
 import PhenologyTrackTimelineItem from "@/components/pageComponents/PhenologyTrackTimelineItem.vue";
 import PhenologyTrackTimelineItem from "@/components/pageComponents/PhenologyTrackTimelineItem.vue";
+import albumUploadPopup from "./albumUploadPopup.vue";
+import tipPopup from "@/components/popup/tipPopup.vue";
 import wx from "weixin-js-sdk";
 import wx from "weixin-js-sdk";
 
 
-const emit = defineEmits(["open-upload"]);
-
 const { t } = useI18n();
 const { t } = useI18n();
 const router = useRouter();
 const router = useRouter();
 
 
@@ -90,8 +99,9 @@ const patrolList = ref([
     },
     },
 ]);
 ]);
 const cropArchiveList = ref([]);
 const cropArchiveList = ref([]);
-/** 与 growthTrack 一致:需勾画时先走 add_zone */
-const needDraw = ref(true);
+const showUploadPopup = ref(false);
+const showSuccessPopup = ref(false);
+const uploadZoneId = ref("");
 
 
 // ---------- 工具函数 ----------
 // ---------- 工具函数 ----------
 /** 外部感知任务 → 巡园卡片(仅取第一条) */
 /** 外部感知任务 → 巡园卡片(仅取第一条) */
@@ -127,10 +137,25 @@ const mapPhenoRecordToArchive = (item, index, zoneName) => ({
     crop_code: item.crop_code,
     crop_code: item.crop_code,
 });
 });
 
 
+const getSelectedFarm = () => {
+    try {
+        return JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
+    } catch {
+        return {};
+    }
+};
+
+const getSelectedZoneId = () => {
+    const farm = getSelectedFarm();
+    return farm.zone_id ?? farm.zoneId ?? null;
+};
+
 // ---------- 业务逻辑:加载 ----------
 // ---------- 业务逻辑:加载 ----------
 const fetchPatrolInteractTask = async () => {
 const fetchPatrolInteractTask = async () => {
+    const zoneId = getSelectedZoneId();
+    if (zoneId == null || zoneId === "") return;
     try {
     try {
-        const res = await VE_API.questionnaire.getExternalInteractTasks({ zone_id: 42 });
+        const res = await VE_API.questionnaire.getExternalInteractTasks({ zone_id: zoneId });
         const tasks = res?.data?.interact_tasks;
         const tasks = res?.data?.interact_tasks;
         const first = Array.isArray(tasks) ? tasks[0] : null;
         const first = Array.isArray(tasks) ? tasks[0] : null;
         if (!first) return;
         if (!first) return;
@@ -149,7 +174,7 @@ const fetchPatrolInteractTask = async () => {
 };
 };
 
 
 const fetchCropArchive = async () => {
 const fetchCropArchive = async () => {
-    const farm = JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
+    const farm = getSelectedFarm();
     const params = {
     const params = {
         farm_id: farm.farm_id,
         farm_id: farm.farm_id,
         zone_id: 46,
         zone_id: 46,
@@ -231,27 +256,39 @@ const handleShare = (item) => {
     });
     });
 };
 };
 
 
-/** 与 growthTrack 上传一致:需勾画 → add_zone;异常 → pest_interact;否则弹上传 */
 const handleUploadClick = (item) => {
 const handleUploadClick = (item) => {
-    const isAbnormal = item?.type === "abnormal";
-    if (needDraw.value) {
-        router.push({
-            path: "/add_zone",
-            query: {
-                type: "farm",
-                targetUrl: isAbnormal ? "/pest_interact" : "/growth_track",
-                ...(isAbnormal ? { isAbnormal: "true" } : {}),
-                ...(item?.id != null ? { trackId: item.id } : {}),
-                ...(item?.type ? { trackType: item.type } : {}),
-            },
-        });
+    uploadZoneId.value = item?.zoneId ?? item?.id ?? getSelectedZoneId() ?? "";
+    showUploadPopup.value = true;
+};
+
+const handleUploadConfirm = async ({ images, date } = {}) => {
+    const cloud_url = Array.isArray(images) ? images : [];
+    if (!cloud_url.length) {
+        ElMessage.warning("请先上传照片");
         return;
         return;
     }
     }
-    if (isAbnormal) {
-        router.push({ path: "/pest_interact" });
-        return;
+    const farm = getSelectedFarm();
+    try {
+        const res = await VE_API.questionnaire.uploadImages({
+            cloud_url,
+            farm_id: farm.farm_id ?? farm.id ?? "",
+            zone_id: uploadZoneId.value || getSelectedZoneId() || "",
+            category_code: farm.category_code || "",
+            zone_name: farm.variety_name || "",
+            create_time: date,
+        });
+        if (res?.code === 200) {
+            showSuccessPopup.value = true;
+            return;
+        }
+        ElMessage.error(res?.msg || "上传失败,请稍后再试");
+    } catch {
+        ElMessage.error("上传失败,请稍后再试");
     }
     }
-    emit("open-upload");
+};
+
+const handleComplete = () => {
+    showSuccessPopup.value = false;
 };
 };
 
 
 // ---------- 生命周期 ----------
 // ---------- 生命周期 ----------
@@ -419,4 +456,28 @@ onActivated(loadPatrolData);
         }
         }
     }
     }
 }
 }
+
+.bottom-btn-container {
+    display: flex;
+    justify-content: space-between;
+    gap: 12px;
+    width: 100%;
+
+    .bottom-btn {
+        padding: 0 25px;
+        border-radius: 4px;
+        font-size: 16px;
+        height: 40px;
+        line-height: 40px;
+        box-sizing: border-box;
+        font-weight: 500;
+        text-align: center;
+
+        &.primary-btn {
+            flex: 1;
+            background: #2199f8;
+            color: #fff;
+        }
+    }
+}
 </style>
 </style>

+ 51 - 19
src/views/old_mini/agri_file/components/reportPanel.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
     <div class="report-panel">
     <div class="report-panel">
-        <div v-for="item in reportList" :key="item.id" class="report-card">
+        <div v-for="item in reportList" :key="item.id" class="report-card" @click="handleReportClick(item)">
             <div class="report-card__cover">
             <div class="report-card__cover">
                 <img :src="item.cover" alt="" />
                 <img :src="item.cover" alt="" />
                 <span class="report-card__date">{{ item.date }}</span>
                 <span class="report-card__date">{{ item.date }}</span>
@@ -20,37 +20,69 @@
 <script setup>
 <script setup>
 import { onActivated, onMounted, ref } from "vue";
 import { onActivated, onMounted, ref } from "vue";
 import { useI18n } from "@/i18n";
 import { useI18n } from "@/i18n";
+import { useRouter } from "vue-router";
 
 
+const router = useRouter();
 const { t } = useI18n();
 const { t } = useI18n();
 
 
 // ---------- 常量 ----------
 // ---------- 常量 ----------
 const reportCover = require("@/assets/img/common/sd-1.jpg");
 const reportCover = require("@/assets/img/common/sd-1.jpg");
 
 
 // ---------- 页面状态 ----------
 // ---------- 页面状态 ----------
-const reportList = ref([
-    { id: 1, title: "", desc: "", date: "", cover: reportCover },
-    { id: 2, title: "", desc: "", date: "", cover: require("@/assets/img/common/sd-2.jpg") },
-    { id: 3, title: "", desc: "", date: "", cover: require("@/assets/img/common/sd-3.jpg") },
-]);
+const reportList = ref([]);
+
+// ---------- 工具函数 ----------
+const getSelectedFarm = () => {
+    try {
+        return JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
+    } catch {
+        return {};
+    }
+};
 
 
-// ---------- 业务逻辑:加载 ----------
-/** 后续替换为诊断报告列表接口 */
-const fillMockLabels = () => {
-    reportList.value = reportList.value.map((item) => ({
-        ...item,
-        title: t("agriFile.reportTitle"),
-        desc: t("agriFile.reportDesc"),
-        date: t("agriFile.reportDate"),
-    }));
+const mapReportItem = (item, index) => ({
+    id: item.id ?? `${item.time || ""}-${index}`,
+    title: item.title || "",
+    type: item.type || "",
+    desc: item.content || "",
+    date: item.time || "",
+    cover: reportCover,
+});
+
+const handleReportClick = (item) => {
+    router.push({
+        path: "/alert_detail",
+        query: {
+            title: item?.title || "具体预警",
+            type: item?.type || "warning",
+        },
+    });
 };
 };
 
 
-const loadReportData = () => {
-    fillMockLabels();
+// ---------- 业务逻辑:加载 ----------
+const fetchReportList = async () => {
+    const farm = getSelectedFarm();
+    const farmId = farm.farm_id ?? farm.id;
+    const zoneId = farm.zone_id ?? farm.zoneId;
+    if (farmId == null || farmId === "" || zoneId == null || zoneId === "") {
+        reportList.value = [];
+        return;
+    }
+    try {
+        const res = await VE_API.questionnaire.getReportList({
+            farm_id: farmId,
+            zone_id: zoneId,
+        });
+        const reports = Array.isArray(res?.data?.reports) ? res.data.reports : [];
+        reportList.value = reports.map(mapReportItem);
+    } catch {
+        reportList.value = [];
+    }
 };
 };
 
 
 // ---------- 生命周期 ----------
 // ---------- 生命周期 ----------
-onMounted(loadReportData);
-onActivated(loadReportData);
+onMounted(fetchReportList);
+onActivated(fetchReportList);
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>

+ 76 - 6
src/views/old_mini/agri_file/index.vue

@@ -20,7 +20,7 @@
                     <span class="report-guide-bubble__arrow"></span>
                     <span class="report-guide-bubble__arrow"></span>
                     <div class="report-guide-bubble__content">
                     <div class="report-guide-bubble__content">
                         {{ t("agriFile.diagnosisReportGuidePrefix") }}
                         {{ t("agriFile.diagnosisReportGuidePrefix") }}
-                        <span class="report-guide-bubble__link" @click.stop="handleGuideUpload">
+                        <span class="report-guide-bubble__link">
                             {{ t("agriFile.uploadPhoto") }}
                             {{ t("agriFile.uploadPhoto") }}
                         </span>
                         </span>
                         {{ t("agriFile.diagnosisReportGuideSuffix") }}
                         {{ t("agriFile.diagnosisReportGuideSuffix") }}
@@ -37,7 +37,14 @@
             />
             />
             <report-panel v-show="activeNav === 'report'" />
             <report-panel v-show="activeNav === 'report'" />
         </div>
         </div>
-        <album-upload-popup v-model:show="showUploadPopup" />
+        <album-upload-popup v-model:show="showUploadPopup" @confirm="handleUploadConfirm" />
+        <tip-popup v-model:show="showSuccessPopup" type="executeSuccess" text="您已上传成功" text2="请等待诊断报告生成" hideBtn>
+            <template #footer>
+                <div class="bottom-btn-container">
+                    <div class="bottom-btn primary-btn" @click="handleComplete">完成</div>
+                </div>
+            </template>
+        </tip-popup>
         <complete-farm-info-popup v-model:show="showCompleteFarmPopup" @confirm="goCompleteFarmInfo" />
         <complete-farm-info-popup v-model:show="showCompleteFarmPopup" @confirm="goCompleteFarmInfo" />
 
 
         <!-- 诊断报告弹窗:组件内接口判断 exists=2 且本地未展示过 -->
         <!-- 诊断报告弹窗:组件内接口判断 exists=2 且本地未展示过 -->
@@ -72,9 +79,11 @@
 import { computed, onActivated, onBeforeUnmount, onMounted, ref } from "vue";
 import { computed, onActivated, onBeforeUnmount, onMounted, ref } from "vue";
 import { useStore } from "vuex";
 import { useStore } from "vuex";
 import { useRouter } from "vue-router";
 import { useRouter } from "vue-router";
+import { ElMessage } from "element-plus";
 import { useI18n } from "@/i18n";
 import { useI18n } from "@/i18n";
 import farmHeader from "@/components/farmHeader.vue";
 import farmHeader from "@/components/farmHeader.vue";
 import albumUploadPopup from "./components/albumUploadPopup.vue";
 import albumUploadPopup from "./components/albumUploadPopup.vue";
+import tipPopup from "@/components/popup/tipPopup.vue";
 import completeFarmInfoPopup from "@/components/popup/completeFarmInfoPopup.vue";
 import completeFarmInfoPopup from "@/components/popup/completeFarmInfoPopup.vue";
 import diagnosisReportPopup from "@/components/popup/diagnosisReportPopup.vue";
 import diagnosisReportPopup from "@/components/popup/diagnosisReportPopup.vue";
 import restorePlantingPopup from "@/components/popup/restorePlantingPopup.vue";
 import restorePlantingPopup from "@/components/popup/restorePlantingPopup.vue";
@@ -114,6 +123,7 @@ const navCards = [
 const activeNav = ref("patrol");
 const activeNav = ref("patrol");
 const guideVisible = ref(false);
 const guideVisible = ref(false);
 const showUploadPopup = ref(false);
 const showUploadPopup = ref(false);
+const showSuccessPopup = ref(false);
 const showCompleteFarmPopup = ref(false);
 const showCompleteFarmPopup = ref(false);
 
 
 /** 后续由接口控制是否展示代管授权弹窗 */
 /** 后续由接口控制是否展示代管授权弹窗 */
@@ -164,14 +174,50 @@ const tryShowGuide = () => {
     guideVisible.value = true;
     guideVisible.value = true;
 };
 };
 
 
+const uploadZoneId = ref(null);
+const getSelectedFarm = () => {
+    try {
+        return JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
+    } catch {
+        return {};
+    }
+};
+
 // ---------- 事件处理 ----------
 // ---------- 事件处理 ----------
-const openUploadPopup = () => {
+const openUploadPopup = (zoneId) => {
+    if (!zoneId) return;
+    uploadZoneId.value = zoneId;
     showUploadPopup.value = true;
     showUploadPopup.value = true;
 };
 };
 
 
-const handleGuideUpload = () => {
-    dismissGuide();
-    openUploadPopup();
+const handleUploadConfirm = async ({ images, date } = {}) => {
+    const cloud_url = Array.isArray(images) ? images : [];
+    if (!cloud_url.length) {
+        ElMessage.warning("请先上传照片");
+        return;
+    }
+    const farm = getSelectedFarm();
+    try {
+        const res = await VE_API.questionnaire.uploadImages({
+            cloud_url,
+            farm_id: farm.farm_id ?? farm.id ?? "",
+            zone_id: uploadZoneId.value || farm.zone_id || "",
+            category_code: farm.category_code || "",
+            zone_name: farm.variety_name || "",
+            create_time: date,
+        });
+        if (res?.code === 200) {
+            showSuccessPopup.value = true;
+            return;
+        }
+        ElMessage.error(res?.msg || "上传失败,请稍后再试");
+    } catch {
+        ElMessage.error("上传失败,请稍后再试");
+    }
+};
+
+const handleComplete = () => {
+    showSuccessPopup.value = false;
 };
 };
 
 
 const handleNavClick = (item) => {
 const handleNavClick = (item) => {
@@ -349,4 +395,28 @@ onBeforeUnmount(() => {
         }
         }
     }
     }
 }
 }
+
+.bottom-btn-container {
+    display: flex;
+    justify-content: space-between;
+    gap: 12px;
+    width: 100%;
+
+    .bottom-btn {
+        padding: 0 25px;
+        border-radius: 4px;
+        font-size: 16px;
+        height: 40px;
+        line-height: 40px;
+        box-sizing: border-box;
+        font-weight: 500;
+        text-align: center;
+
+        &.primary-btn {
+            flex: 1;
+            background: #2199f8;
+            color: #fff;
+        }
+    }
+}
 </style>
 </style>

+ 2 - 3
src/views/old_mini/agri_file/pages/growthTrack.vue

@@ -51,15 +51,14 @@
                         </div>
                         </div>
                         <div class="interact-card__submit" @click="handleSubmit">{{ t("agriFile.submit") }}</div>
                         <div class="interact-card__submit" @click="handleSubmit">{{ t("agriFile.submit") }}</div>
                     </div>
                     </div>
-                    <div class="interact-card__ref">
+                    <!-- <div class="interact-card__ref">
                         <span class="interact-card__ref-label">{{ t("agriFile.referenceImage") }}</span>
                         <span class="interact-card__ref-label">{{ t("agriFile.referenceImage") }}</span>
-                        <!-- <img class="interact-card__ref-img" :src="guideImage" alt="" /> -->
                         <photo-provider :photo-closable="true">
                         <photo-provider :photo-closable="true">
                             <photo-consumer :src="guideImage">
                             <photo-consumer :src="guideImage">
                                 <img class="interact-card__ref-img" :src="guideImage" alt="" />
                                 <img class="interact-card__ref-img" :src="guideImage" alt="" />
                             </photo-consumer>
                             </photo-consumer>
                         </photo-provider>
                         </photo-provider>
-                    </div>
+                    </div> -->
                 </div>
                 </div>
                 <div class="guide-card">
                 <div class="guide-card">
                     <div class="guide-title">{{ t("agriFile.patrolGuide") }}</div>
                     <div class="guide-title">{{ t("agriFile.patrolGuide") }}</div>

+ 55 - 86
src/views/old_mini/agri_file/pages/regionAlbums.vue

@@ -31,7 +31,7 @@
                 >
                 >
                     <div class="album-group__header">
                     <div class="album-group__header">
                         <div class="album-group__date">{{ group.dateLabel }}</div>
                         <div class="album-group__date">{{ group.dateLabel }}</div>
-                        <div class="album-group__remark">{{ group.remark || '备注备注备注备注' }}</div>
+                        <div v-if="group.remark" class="album-group__remark">{{ group.remark }}</div>
                     </div>
                     </div>
                     <div class="album-group__grid">
                     <div class="album-group__grid">
                         <div
                         <div
@@ -81,37 +81,28 @@ const { t } = useI18n();
 const route = useRoute();
 const route = useRoute();
 const router = useRouter();
 const router = useRouter();
 
 
-/** 临时默认参数,后续改成正式接口后可只走 query */
-const TEMP_ORGAN_ID = "101532";
-const TEMP_AREA_ID = "90178";
-const TEMP_DATE = "2026-08-19";
-
 const loading = ref(false);
 const loading = ref(false);
+const farmImgs = ref([]);
+const imageCount = ref(0);
+const zoneNameFromApi = ref("");
 const imageList = ref([]);
 const imageList = ref([]);
 const showPreview = ref(false);
 const showPreview = ref(false);
 const previewImages = ref([]);
 const previewImages = ref([]);
 const previewIndex = ref(0);
 const previewIndex = ref(0);
 const showUploadPopup = ref(false);
 const showUploadPopup = ref(false);
 
 
-const regionName = computed(
-    () => route.query.regionName || route.query.name || t("agriFile.zoneOne")
-);
+const farmId = computed(() => route.query.farm_id || "");
+const zoneId = computed(() => route.query.zone_id || "");
 
 
-const organId = computed(() => route.query.organId || TEMP_ORGAN_ID);
-const areaId = computed(() => route.query.areaId || TEMP_AREA_ID);
-const queryDate = computed(() => route.query.date || TEMP_DATE);
-const forceEmpty = computed(
-    () => route.query.noImage === "true" || route.query.noImage === true
+const regionName = computed(
+    () => zoneNameFromApi.value || route.query.name || t("agriFile.zoneOne")
 );
 );
 
 
-const totalCount = computed(() => imageList.value.length);
+const totalCount = computed(() => imageCount.value);
 
 
 const heroCover = computed(() => {
 const heroCover = computed(() => {
-    if (forceEmpty.value || !imageList.value.length) return "";
     const first = imageList.value[0];
     const first = imageList.value[0];
-    if (first?.baseMap) return first.baseMap;
-    if (first?.url) return first.url;
-    return "";
+    return first?.url || "";
 });
 });
 
 
 const heroStyle = computed(() => {
 const heroStyle = computed(() => {
@@ -132,85 +123,69 @@ const formatDateLabel = (dateStr) => {
     return `${parts[0]}年${parts[1]}月${parts[2]}日`;
     return `${parts[0]}年${parts[1]}月${parts[2]}日`;
 };
 };
 
 
-const getImageUrl = (item) => {
-    if (!item?.filename) return "";
-    if (/^https?:\/\//i.test(item.filename)) return item.filename;
-    return `${base_img_url2}${item.filename}${resize_300 || ""}`;
+const resolveImageUrl = (path, compact = false) => {
+    if (!path) return "";
+    const text = String(path).trim();
+    if (!text) return "";
+    if (/^https?:\/\//i.test(text)) return text;
+    return `${base_img_url2}${text.replace(/^\//, "")}${compact ? resize_300 || "" : ""}`;
 };
 };
 
 
-const getFullImageUrl = (item) => {
-    if (!item?.filename) return "";
-    if (/^https?:\/\//i.test(item.filename)) return item.filename;
-    return `${base_img_url2}${item.filename}`;
-};
-
-const dateGroups = computed(() => {
-    const map = new Map();
-    imageList.value.forEach((item) => {
-        const date = String(item.uploadDate || "").slice(0, 10) || "未知日期";
-        if (!map.has(date)) {
-            map.set(date, {
-                date,
-                dateLabel: formatDateLabel(date),
-                remark: item.growText || item.watermarkMsg || "",
-                list: [],
-            });
-        }
-        const group = map.get(date);
-        if (!group.remark && (item.growText || item.watermarkMsg)) {
-            group.remark = item.growText || item.watermarkMsg;
-        }
-        group.list.push(item);
-    });
-    return [...map.values()].sort((a, b) => String(b.date).localeCompare(String(a.date)));
-});
-
-const isEmpty = computed(
-    () => forceEmpty.value || (!loading.value && !imageList.value.length)
+const dateGroups = computed(() =>
+    (farmImgs.value || []).map((group) => ({
+        date: group.time || "",
+        dateLabel: formatDateLabel(group.time),
+        remark: group.desc || "",
+        list: (group.imgList || []).map((img) => ({
+            id: img.id,
+            url: resolveImageUrl(img.cloud_url, true),
+            fullUrl: resolveImageUrl(img.cloud_url),
+            uploadDate: group.time || String(img.created_time || "").slice(0, 10),
+            growText: img.desc || group.desc || "",
+            zone_name: img.zone_name || "",
+        })),
+    }))
 );
 );
 
 
-const normalizeList = (raw) => {
-    const list = Array.isArray(raw)
-        ? raw
-        : Array.isArray(raw?.list)
-            ? raw.list
-            : Array.isArray(raw?.records)
-                ? raw.records
-                : [];
-    return list
-        .map((item) => ({
-            ...item,
-            url: getImageUrl(item),
-            fullUrl: getFullImageUrl(item),
+const isEmpty = computed(() => !loading.value && !imageList.value.length);
+
+const applyAlbumData = (data) => {
+    const groups = Array.isArray(data?.farmImgs) ? data.farmImgs : [];
+    farmImgs.value = groups;
+    imageCount.value = Number(data?.image_count) || 0;
+    zoneNameFromApi.value = groups[0]?.imgList?.[0]?.zone_name || "";
+    imageList.value = groups.flatMap((group) =>
+        (group.imgList || []).map((img) => ({
+            id: img.id,
+            url: resolveImageUrl(img.cloud_url, true),
+            fullUrl: resolveImageUrl(img.cloud_url),
+            uploadDate: group.time || String(img.created_time || "").slice(0, 10),
+            growText: img.desc || group.desc || "",
+            zone_name: img.zone_name || "",
         }))
         }))
-        .filter((item) => item.url);
+    );
 };
 };
 
 
 const fetchAlbumImages = async () => {
 const fetchAlbumImages = async () => {
-    if (forceEmpty.value) {
-        imageList.value = [];
+    if (!farmId.value || !zoneId.value) {
+        applyAlbumData(null);
         loading.value = false;
         loading.value = false;
         return;
         return;
     }
     }
     loading.value = true;
     loading.value = true;
     try {
     try {
-        // TODO: 临时接口,后续替换正式相册接口
-        const res = await VE_API.monitor.getRegionAlbumImages({
-            organId: organId.value,
-            areaId: areaId.value,
-            date: queryDate.value,
-            limit: 100,
-            page: 1,
+        const res = await VE_API.questionnaire.getZoneImages({
+            farm_id: farmId.value,
+            zone_id: zoneId.value,
         });
         });
-        const ok = res?.code === 200 || res?.code === 0 || res?.code === 1 || res?.success;
-        if (ok) {
-            imageList.value = normalizeList(res.data);
+        if (res?.code === 200) {
+            applyAlbumData(res.data);
         } else {
         } else {
-            imageList.value = [];
+            applyAlbumData(null);
             if (res?.msg) ElMessage.error(res.msg);
             if (res?.msg) ElMessage.error(res.msg);
         }
         }
     } catch {
     } catch {
-        imageList.value = [];
+        applyAlbumData(null);
         ElMessage.error("获取相册失败,请稍后再试");
         ElMessage.error("获取相册失败,请稍后再试");
     } finally {
     } finally {
         loading.value = false;
         loading.value = false;
@@ -284,12 +259,6 @@ const goBack = () => {
 };
 };
 
 
 const syncAlbumByRoute = () => {
 const syncAlbumByRoute = () => {
-    // 空相册:立即清空缓存照片,避免 keepAlive 残留上一相册数据
-    if (forceEmpty.value) {
-        imageList.value = [];
-        loading.value = false;
-        return;
-    }
     fetchAlbumImages();
     fetchAlbumImages();
 };
 };
 
 

+ 28 - 9
src/views/old_mini/entry_information/selectLocation.vue

@@ -17,6 +17,12 @@
         <div class="custom-bottom-fixed-btns">
         <div class="custom-bottom-fixed-btns">
             <div class="bottom-btn primary-btn" @click="handleSubmit">确认点位</div>
             <div class="bottom-btn primary-btn" @click="handleSubmit">确认点位</div>
         </div>
         </div>
+        <add-zone-info-popup
+            v-if="fromAgriAlbum"
+            v-model:show="showZoneInfoPopup"
+            :county-code="pendingZoneLocation?.adcode"
+            @confirm="handleZoneInfoConfirm"
+        />
     </div>
     </div>
 </template>
 </template>
 
 
@@ -29,6 +35,7 @@ import customHeader from "@/components/customHeader.vue";
 import locationSearch from "@/components/pageComponents/locationSearch.vue";
 import locationSearch from "@/components/pageComponents/locationSearch.vue";
 import SelectLocationMap, { mapLocation, POINT_ICON } from "./map/selectLocationMap.js";
 import SelectLocationMap, { mapLocation, POINT_ICON } from "./map/selectLocationMap.js";
 import { convertPointToArray } from "@/utils/index";
 import { convertPointToArray } from "@/utils/index";
+import addZoneInfoPopup from "@/views/old_mini/agri_file/components/addZoneInfoPopup.vue";
 
 
 const SESSION_KEY_RESIDENT = "ENTRY_RESIDENT_LOCATION";
 const SESSION_KEY_RESIDENT = "ENTRY_RESIDENT_LOCATION";
 const SESSION_KEY_GROWTH = "GROWTH_REPORT_LOCATION";
 const SESSION_KEY_GROWTH = "GROWTH_REPORT_LOCATION";
@@ -42,6 +49,7 @@ const mapContainer = ref(null);
 const isPlantPoint = route.query.pointType === "plant";
 const isPlantPoint = route.query.pointType === "plant";
 const fromGrowthReport = route.query.from === "growth_report";
 const fromGrowthReport = route.query.from === "growth_report";
 const fromService = route.query.from === "entry_service";
 const fromService = route.query.from === "entry_service";
+const fromAgriAlbum = route.query.from === "agri_album";
 const headerName = fromGrowthReport ? "切换位置" : fromService ? "选择位置" : "选择种植点位";
 const headerName = fromGrowthReport ? "切换位置" : fromService ? "选择位置" : "选择种植点位";
 const sessionKey = fromGrowthReport ? SESSION_KEY_GROWTH : SESSION_KEY_RESIDENT;
 const sessionKey = fromGrowthReport ? SESSION_KEY_GROWTH : SESSION_KEY_RESIDENT;
 const iconSrc =
 const iconSrc =
@@ -58,6 +66,8 @@ const userLocation = ref(
 const selectedAdcode = ref("");
 const selectedAdcode = ref("");
 /** 搜索选中时带出的地址文案 */
 /** 搜索选中时带出的地址文案 */
 const selectedAddress = ref("");
 const selectedAddress = ref("");
+const showZoneInfoPopup = ref(false);
+const pendingZoneLocation = ref(null);
 
 
 const selectLocationMap = new SelectLocationMap({
 const selectLocationMap = new SelectLocationMap({
     iconSrc,
     iconSrc,
@@ -152,15 +162,24 @@ const handleSubmit = async () => {
         if (!adcode) adcode = info.adcode;
         if (!adcode) adcode = info.adcode;
         if (!address) address = info.address;
         if (!address) address = info.address;
     }
     }
-    sessionStorage.setItem(
-        sessionKey,
-        JSON.stringify({
-            point,
-            coordinate: [Number(coordinate[0]), Number(coordinate[1])],
-            adcode: adcode || "",
-            address: address || "",
-        })
-    );
+    const payload = {
+        point,
+        coordinate: [Number(coordinate[0]), Number(coordinate[1])],
+        adcode: adcode || "",
+        address: address || "",
+    };
+    if (fromAgriAlbum) {
+        payload.zoneType = route.query.zoneType || "region";
+        pendingZoneLocation.value = payload;
+        showZoneInfoPopup.value = true;
+        return;
+    }
+    sessionStorage.setItem(sessionKey, JSON.stringify(payload));
+    router.back();
+};
+
+const handleZoneInfoConfirm = () => {
+    pendingZoneLocation.value = null;
     router.back();
     router.back();
 };
 };
 </script>
 </script>

+ 32 - 2
src/views/old_mini/growth_report/alert_detail.vue

@@ -88,7 +88,7 @@ import customHeader from "@/components/customHeader.vue";
 
 
 const route = useRoute();
 const route = useRoute();
 
 
-const QUERY_PARAMS = {
+const FALLBACK_QUERY_PARAMS = {
     farm_id: "321",
     farm_id: "321",
     zone_id: "46",
     zone_id: "46",
     date: "2026-08-11",
     date: "2026-08-11",
@@ -126,6 +126,36 @@ const diagnosisList = ref([]);
 const adviceList = ref([]);
 const adviceList = ref([]);
 const loading = ref(false);
 const loading = ref(false);
 
 
+const getSelectedFarm = () => {
+    try {
+        return JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
+    } catch {
+        return {};
+    }
+};
+
+const formatLocalDate = (date) => {
+    const y = date.getFullYear();
+    const m = String(date.getMonth() + 1).padStart(2, "0");
+    const d = String(date.getDate()).padStart(2, "0");
+    return `${y}-${m}-${d}`;
+};
+
+/** 有选中农场用缓存 farm_id/zone_id + 当天日期,否则用默认参数 */
+const getQueryParams = () => {
+    const farm = getSelectedFarm();
+    const farmId = farm.farm_id ?? farm.id;
+    const zoneId = farm.zone_id ?? farm.zoneId;
+    if (farmId == null || farmId === "" || zoneId == null || zoneId === "") {
+        return { ...FALLBACK_QUERY_PARAMS };
+    }
+    return {
+        farm_id: farmId,
+        zone_id: zoneId,
+        date: formatLocalDate(new Date()),
+    };
+};
+
 /** 接口可能返回对象或数组,统一取第一条 */
 /** 接口可能返回对象或数组,统一取第一条 */
 const pickFirstRecord = (res) => {
 const pickFirstRecord = (res) => {
     const data = res?.data ?? res;
     const data = res?.data ?? res;
@@ -219,7 +249,7 @@ const fetchDetail = async () => {
             : VE_API.questionnaire.getWeatherRisk;
             : VE_API.questionnaire.getWeatherRisk;
     loading.value = true;
     loading.value = true;
     try {
     try {
-        const res = await request(QUERY_PARAMS);
+        const res = await request(getQueryParams());
         applyRecord(pickFirstRecord(res), type);
         applyRecord(pickFirstRecord(res), type);
     } catch {
     } catch {
         // 详情页保持空态
         // 详情页保持空态

+ 34 - 3
src/views/old_mini/growth_report/components/CropAlertPanel.vue

@@ -110,7 +110,7 @@ const store = useStore();
 const { t } = useI18n();
 const { t } = useI18n();
 
 
 const GUIDE_STORAGE_KEY = "GROWTH_REPORT_CROP_SWITCH_GUIDE";
 const GUIDE_STORAGE_KEY = "GROWTH_REPORT_CROP_SWITCH_GUIDE";
-const QUERY_PARAMS = {
+const FALLBACK_QUERY_PARAMS = {
     farm_id: "321",
     farm_id: "321",
     zone_id: "46",
     zone_id: "46",
     date: "2026-08-11",
     date: "2026-08-11",
@@ -278,6 +278,36 @@ const alertCards = ref([
     },
     },
 ]);
 ]);
 
 
+const getSelectedFarm = () => {
+    try {
+        return JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
+    } catch {
+        return {};
+    }
+};
+
+const formatLocalDate = (date) => {
+    const y = date.getFullYear();
+    const m = String(date.getMonth() + 1).padStart(2, "0");
+    const d = String(date.getDate()).padStart(2, "0");
+    return `${y}-${m}-${d}`;
+};
+
+/** 有选中农场用缓存 farm_id/zone_id + 当天日期,否则用默认参数 */
+const getQueryParams = () => {
+    const farm = getSelectedFarm();
+    const farmId = farm.farm_id ?? farm.id;
+    const zoneId = farm.zone_id ?? farm.zoneId;
+    if (farmId == null || farmId === "" || zoneId == null || zoneId === "") {
+        return { ...FALLBACK_QUERY_PARAMS };
+    }
+    return {
+        farm_id: farmId,
+        zone_id: zoneId,
+        date: formatLocalDate(new Date()),
+    };
+};
+
 /** 接口可能返回对象或数组,统一取第一条 */
 /** 接口可能返回对象或数组,统一取第一条 */
 const pickFirstRecord = (res) => {
 const pickFirstRecord = (res) => {
     const data = res?.data ?? res;
     const data = res?.data ?? res;
@@ -310,9 +340,10 @@ const applyWeatherStress = (record) => {
 };
 };
 
 
 const fetchAlertCards = async () => {
 const fetchAlertCards = async () => {
+    const queryParams = getQueryParams();
     const [riskRes, stressRes] = await Promise.allSettled([
     const [riskRes, stressRes] = await Promise.allSettled([
-        VE_API.questionnaire.getWeatherRisk(QUERY_PARAMS),
-        VE_API.questionnaire.getWeatherStress(QUERY_PARAMS),
+        VE_API.questionnaire.getWeatherRisk(queryParams),
+        VE_API.questionnaire.getWeatherStress(queryParams),
     ]);
     ]);
 
 
     if (riskRes.status === "fulfilled") {
     if (riskRes.status === "fulfilled") {

+ 16 - 4
src/views/old_mini/growth_report/index.vue

@@ -154,8 +154,18 @@ const panelHeight = ref(280);
 const inviteBottom = computed(() => panelHeight.value);
 const inviteBottom = computed(() => panelHeight.value);
 const invitePopupRef = ref(null);
 const invitePopupRef = ref(null);
 
 
-/** 与 agri_file 一致:外部感知任务 zone_id(后续可改为当前地块) */
-const INTERACT_ZONE_ID = 42;
+const getSelectedFarm = () => {
+    try {
+        return JSON.parse(localStorage.getItem("selectedFarmData") || "{}");
+    } catch {
+        return {};
+    }
+};
+
+const getSelectedZoneId = () => {
+    const farm = getSelectedFarm();
+    return farm.zone_id ?? farm.zoneId ?? "";
+};
 
 
 const showInteractCard = ref(false);
 const showInteractCard = ref(false);
 const interactQuestionText = ref("");
 const interactQuestionText = ref("");
@@ -185,7 +195,7 @@ function buildInteractSubmitPayload(answerText) {
     const task = currentInteractTask.value || {};
     const task = currentInteractTask.value || {};
     const content = task.interact_content || {};
     const content = task.interact_content || {};
     return {
     return {
-        zone_id: Number(task.zone_id ?? INTERACT_ZONE_ID),
+        zone_id: Number(task.zone_id ?? getSelectedZoneId()),
         date: formatToday(),
         date: formatToday(),
         interact_code: task.interact_code || content.interact_code || "",
         interact_code: task.interact_code || content.interact_code || "",
         interact_answer: answerText,
         interact_answer: answerText,
@@ -235,9 +245,11 @@ async function handleInteractOptionClick(item) {
 }
 }
 
 
 async function fetchInteractTask() {
 async function fetchInteractTask() {
+    const zoneId = getSelectedZoneId();
+    if (zoneId === "" || zoneId == null) return;
     try {
     try {
         const res = await VE_API.questionnaire.getExternalInteractTasks({
         const res = await VE_API.questionnaire.getExternalInteractTasks({
-            zone_id: INTERACT_ZONE_ID,
+            zone_id: zoneId,
         });
         });
         const tasks = res?.data?.interact_tasks;
         const tasks = res?.data?.interact_tasks;
         const first = Array.isArray(tasks) ? tasks[0] : null;
         const first = Array.isArray(tasks) ? tasks[0] : null;

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 799 - 713
yarn.lock


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio