From 3d3e7f45086799fdd7a412e2079710a6cdf8dc2b Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期四, 24 十月 2024 08:30:04 +0800
Subject: [PATCH] Merge branch 'lsf-dataproduct-1018'

---
 src/views/fysp/data-product/ProdSceneReport.vue                     |    8 
 src/views/fysp/task/components/CompSubTaskSelect.vue                |    6 
 src/api/fysp/dataproductApi.js                                      |   34 
 package-lock.json                                                   | 1600 +++++++++++++++++++++++++++++---
 src/components.d.ts                                                 |    8 
 src/views/fysp/data-product/ProdProAnalysis.vue                     |   12 
 src/views/fysp/data-product/ProdStandardJudge.vue                   |   12 
 src/views/fysp/data-product/components/CompReportDownloadDialog.vue |   80 +
 src/views/fysp/task/components/CompSubTaskEdit.vue                  |  170 +++
 src/components/form/FYForm.vue                                      |    4 
 src/views/fysp/data-product/ProdProFollow.vue                       |   12 
 src/views/fysp/task/components/CompTaskEdit.vue                     |    2 
 src/views/fysp/task/TaskProxy.js                                    |   23 
 src/api/index.js                                                    |    2 
 src/api/fysp/subtaskApi.js                                          |   20 
 src/views/fysp/task/components/CompDayTask.vue                      |  133 +
 package.json                                                        |    6 
 src/components/core/SiderMenu.vue                                   |    6 
 src/components/list-item/ItemSubTask.vue                            |  163 +++
 src/views/fysp/task/components/CompSubTaskList.vue                  |  119 ++
 src/views/fysp/data-product/components/BaseDataProduct.vue          |  353 +++++++
 src/views/fysp/task/TaskManage.vue                                  |   46 
 src/views/fysp/task/components/CompMonitorPlan.vue                  |   53 
 23 files changed, 2,569 insertions(+), 303 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 508cba5..8c46b4e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,16 +11,20 @@
         "@amap/amap-jsapi-loader": "^1.0.1",
         "@ctrl/tinycolor": "^4.0.2",
         "@element-plus/icons-vue": "^2.0.10",
+        "@vue-office/excel": "^1.7.11",
         "@vueuse/core": "^9.7.0",
         "axios": "^1.2.1",
         "dayjs": "^1.11.13",
         "element-plus": "^2.8.3",
+        "exceljs": "^4.4.0",
         "js-base64": "^3.7.5",
         "md5": "^2.3.0",
         "pinia": "^2.0.26",
         "vue": "^3.2.45",
+        "vue-demi": "^0.14.6",
         "vue-i18n": "^9.8.0",
-        "vue-router": "^4.1.6"
+        "vue-router": "^4.1.6",
+        "xlsx": "^0.18.5"
       },
       "devDependencies": {
         "@babel/cli": "^7.19.3",
@@ -1899,6 +1903,33 @@
         "url": "https://opencollective.com/eslint"
       }
     },
+    "node_modules/@fast-csv/format": {
+      "version": "4.3.5",
+      "resolved": "https://registry.npmmirror.com/@fast-csv/format/-/format-4.3.5.tgz",
+      "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==",
+      "dependencies": {
+        "@types/node": "^14.0.1",
+        "lodash.escaperegexp": "^4.1.2",
+        "lodash.isboolean": "^3.0.3",
+        "lodash.isequal": "^4.5.0",
+        "lodash.isfunction": "^3.0.9",
+        "lodash.isnil": "^4.0.0"
+      }
+    },
+    "node_modules/@fast-csv/parse": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmmirror.com/@fast-csv/parse/-/parse-4.3.6.tgz",
+      "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==",
+      "dependencies": {
+        "@types/node": "^14.0.1",
+        "lodash.escaperegexp": "^4.1.2",
+        "lodash.groupby": "^4.6.0",
+        "lodash.isfunction": "^3.0.9",
+        "lodash.isnil": "^4.0.0",
+        "lodash.isundefined": "^3.0.1",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
     "node_modules/@floating-ui/core": {
       "version": "1.0.4",
       "license": "MIT"
@@ -2208,7 +2239,6 @@
     },
     "node_modules/@types/node": {
       "version": "14.18.34",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/@types/semver": {
@@ -2409,6 +2439,22 @@
         "vue": "^3.2.25"
       }
     },
+    "node_modules/@vue-office/excel": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmmirror.com/@vue-office/excel/-/excel-1.7.11.tgz",
+      "integrity": "sha512-LF3R9IV573Sf4qTu6Ik5Ee8UMfkrsZQ6HEQE25/2m1c0CMcHX6KanIy6Cz0b0Q+FrLH3TjIsLTm6oPcqAbDGSA==",
+      "hasInstallScript": true,
+      "peerDependencies": {
+        "@vue/composition-api": "^1.7.1",
+        "vue": "^2.0.0 || >=3.0.0",
+        "vue-demi": "^0.14.6"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@vue/compiler-core": {
       "version": "3.2.45",
       "license": "MIT",
@@ -2527,30 +2573,6 @@
         "url": "https://github.com/sponsors/antfu"
       }
     },
-    "node_modules/@vueuse/core/node_modules/vue-demi": {
-      "version": "0.13.11",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/@vueuse/metadata": {
       "version": "9.7.0",
       "license": "MIT",
@@ -2566,30 +2588,6 @@
       },
       "funding": {
         "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@vueuse/shared/node_modules/vue-demi": {
-      "version": "0.13.11",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
       }
     },
     "node_modules/@webassemblyjs/ast": {
@@ -2800,6 +2798,14 @@
         "node": ">=0.4.0"
       }
     },
+    "node_modules/adler-32": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
+      "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/agent-base": {
       "version": "6.0.2",
       "dev": true,
@@ -2933,6 +2939,70 @@
       ],
       "license": "MIT"
     },
+    "node_modules/archiver": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmmirror.com/archiver/-/archiver-5.3.2.tgz",
+      "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==",
+      "dependencies": {
+        "archiver-utils": "^2.1.0",
+        "async": "^3.2.4",
+        "buffer-crc32": "^0.2.1",
+        "readable-stream": "^3.6.0",
+        "readdir-glob": "^1.1.2",
+        "tar-stream": "^2.2.0",
+        "zip-stream": "^4.1.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/archiver-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-2.1.0.tgz",
+      "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
+      "dependencies": {
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.2.0",
+        "lazystream": "^1.0.0",
+        "lodash.defaults": "^4.2.0",
+        "lodash.difference": "^4.5.0",
+        "lodash.flatten": "^4.4.0",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.union": "^4.6.0",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/archiver-utils/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/archiver-utils/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/archiver-utils/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "node_modules/arg": {
       "version": "5.0.2",
       "dev": true,
@@ -2986,7 +3056,6 @@
     },
     "node_modules/async": {
       "version": "3.2.4",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/async-validator": {
@@ -3121,12 +3190,10 @@
     },
     "node_modules/balanced-match": {
       "version": "1.0.2",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/base64-js": {
       "version": "1.5.1",
-      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -3151,12 +3218,42 @@
         "tweetnacl": "^0.14.3"
       }
     },
+    "node_modules/big-integer": {
+      "version": "1.6.52",
+      "resolved": "https://registry.npmmirror.com/big-integer/-/big-integer-1.6.52.tgz",
+      "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/binary": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/binary/-/binary-0.3.0.tgz",
+      "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==",
+      "dependencies": {
+        "buffers": "~0.1.1",
+        "chainsaw": "~0.1.0"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/binary-extensions": {
       "version": "2.2.0",
       "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=8"
+      }
+    },
+    "node_modules/bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "dependencies": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
       }
     },
     "node_modules/blob-util": {
@@ -3176,7 +3273,6 @@
     },
     "node_modules/brace-expansion": {
       "version": "1.1.11",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0",
@@ -3223,7 +3319,6 @@
     },
     "node_modules/buffer": {
       "version": "5.7.1",
-      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -3246,7 +3341,6 @@
     },
     "node_modules/buffer-crc32": {
       "version": "0.2.13",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": "*"
@@ -3257,6 +3351,22 @@
       "dev": true,
       "license": "MIT",
       "peer": true
+    },
+    "node_modules/buffer-indexof-polyfill": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz",
+      "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==",
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/buffers": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/buffers/-/buffers-0.1.1.tgz",
+      "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==",
+      "engines": {
+        "node": ">=0.2.0"
+      }
     },
     "node_modules/cachedir": {
       "version": "2.3.0",
@@ -3294,6 +3404,18 @@
       "dev": true,
       "license": "Apache-2.0"
     },
+    "node_modules/cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "dependencies": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/chai": {
       "version": "4.3.7",
       "dev": true,
@@ -3309,6 +3431,17 @@
       },
       "engines": {
         "node": ">=4"
+      }
+    },
+    "node_modules/chainsaw": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/chainsaw/-/chainsaw-0.1.0.tgz",
+      "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==",
+      "dependencies": {
+        "traverse": ">=0.3.0 <0.4"
+      },
+      "engines": {
+        "node": "*"
       }
     },
     "node_modules/chalk": {
@@ -3463,6 +3596,14 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/codepage": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
+      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/color-convert": {
       "version": "2.0.1",
       "dev": true,
@@ -3510,9 +3651,22 @@
         "node": ">=4.0.0"
       }
     },
+    "node_modules/compress-commons": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/compress-commons/-/compress-commons-4.1.2.tgz",
+      "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==",
+      "dependencies": {
+        "buffer-crc32": "^0.2.13",
+        "crc32-stream": "^4.0.2",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^3.6.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
     "node_modules/concat-map": {
       "version": "0.0.1",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/convert-source-map": {
@@ -3545,8 +3699,30 @@
     },
     "node_modules/core-util-is": {
       "version": "1.0.2",
-      "dev": true,
       "license": "MIT"
+    },
+    "node_modules/crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+      "bin": {
+        "crc32": "bin/crc32.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/crc32-stream": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/crc32-stream/-/crc32-stream-4.0.3.tgz",
+      "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==",
+      "dependencies": {
+        "crc-32": "^1.2.0",
+        "readable-stream": "^3.4.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
     },
     "node_modules/cross-spawn": {
       "version": "7.0.3",
@@ -3773,6 +3949,41 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/duplexer2": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz",
+      "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+      "dependencies": {
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "node_modules/duplexer2/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/duplexer2/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/duplexer2/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "node_modules/ecc-jsbn": {
       "version": "0.1.2",
       "dev": true,
@@ -3827,7 +4038,6 @@
     },
     "node_modules/end-of-stream": {
       "version": "1.4.4",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "once": "^1.4.0"
@@ -4285,6 +4495,36 @@
         "node": ">=0.8.x"
       }
     },
+    "node_modules/exceljs": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/exceljs/-/exceljs-4.4.0.tgz",
+      "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==",
+      "dependencies": {
+        "archiver": "^5.0.0",
+        "dayjs": "^1.8.34",
+        "fast-csv": "^4.3.1",
+        "jszip": "^3.10.1",
+        "readable-stream": "^3.6.0",
+        "saxes": "^5.0.1",
+        "tmp": "^0.2.0",
+        "unzipper": "^0.10.11",
+        "uuid": "^8.3.0"
+      },
+      "engines": {
+        "node": ">=8.3.0"
+      }
+    },
+    "node_modules/exceljs/node_modules/saxes": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/saxes/-/saxes-5.0.1.tgz",
+      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+      "dependencies": {
+        "xmlchars": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/execa": {
       "version": "4.1.0",
       "dev": true,
@@ -4349,6 +4589,18 @@
         "node >=0.6.0"
       ],
       "license": "MIT"
+    },
+    "node_modules/fast-csv": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmmirror.com/fast-csv/-/fast-csv-4.3.6.tgz",
+      "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==",
+      "dependencies": {
+        "@fast-csv/format": "4.3.5",
+        "@fast-csv/parse": "4.3.6"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
     },
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
@@ -4522,6 +4774,14 @@
         "node": ">= 0.12"
       }
     },
+    "node_modules/frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/fraction.js": {
       "version": "4.2.0",
       "dev": true,
@@ -4538,6 +4798,11 @@
       "version": "0.1.7",
       "dev": true,
       "license": "MIT"
+    },
+    "node_modules/fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
     },
     "node_modules/fs-extra": {
       "version": "9.1.0",
@@ -4560,8 +4825,34 @@
     },
     "node_modules/fs.realpath": {
       "version": "1.0.0",
-      "dev": true,
       "license": "ISC"
+    },
+    "node_modules/fstream": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmmirror.com/fstream/-/fstream-1.0.12.tgz",
+      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+      "deprecated": "This package is no longer supported.",
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      },
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/fstream/node_modules/rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      }
     },
     "node_modules/function-bind": {
       "version": "1.1.1",
@@ -4616,7 +4907,6 @@
     },
     "node_modules/glob": {
       "version": "7.2.3",
-      "dev": true,
       "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
@@ -4706,7 +4996,6 @@
     },
     "node_modules/graceful-fs": {
       "version": "4.2.10",
-      "dev": true,
       "license": "ISC"
     },
     "node_modules/grapheme-splitter": {
@@ -4809,7 +5098,6 @@
     },
     "node_modules/ieee754": {
       "version": "1.2.1",
-      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -4845,6 +5133,11 @@
       "engines": {
         "node": ">=0.10.0"
       }
+    },
+    "node_modules/immediate": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz",
+      "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
     },
     "node_modules/immutable": {
       "version": "4.1.0",
@@ -4884,7 +5177,6 @@
     },
     "node_modules/inflight": {
       "version": "1.0.6",
-      "dev": true,
       "license": "ISC",
       "dependencies": {
         "once": "^1.3.0",
@@ -4893,7 +5185,6 @@
     },
     "node_modules/inherits": {
       "version": "2.0.4",
-      "dev": true,
       "license": "ISC"
     },
     "node_modules/ini": {
@@ -5036,6 +5327,11 @@
       "version": "3.14.1",
       "dev": true,
       "license": "MIT"
+    },
+    "node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
     },
     "node_modules/isexe": {
       "version": "2.0.0",
@@ -5260,6 +5556,44 @@
         "verror": "1.10.0"
       }
     },
+    "node_modules/jszip": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz",
+      "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
+      "dependencies": {
+        "lie": "~3.3.0",
+        "pako": "~1.0.2",
+        "readable-stream": "~2.3.6",
+        "setimmediate": "^1.0.5"
+      }
+    },
+    "node_modules/jszip/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/jszip/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/jszip/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "node_modules/klona": {
       "version": "2.0.5",
       "dev": true,
@@ -5274,6 +5608,44 @@
       "license": "MIT",
       "engines": {
         "node": "> 0.8"
+      }
+    },
+    "node_modules/lazystream": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz",
+      "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
+      "dependencies": {
+        "readable-stream": "^2.0.5"
+      },
+      "engines": {
+        "node": ">= 0.6.3"
+      }
+    },
+    "node_modules/lazystream/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/lazystream/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/lazystream/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
       }
     },
     "node_modules/less": {
@@ -5331,6 +5703,19 @@
       "engines": {
         "node": ">= 0.8.0"
       }
+    },
+    "node_modules/lie": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz",
+      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+      "dependencies": {
+        "immediate": "~3.0.5"
+      }
+    },
+    "node_modules/listenercount": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/listenercount/-/listenercount-1.0.1.tgz",
+      "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ=="
     },
     "node_modules/listr2": {
       "version": "3.14.0",
@@ -5414,6 +5799,61 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/lodash.defaults": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+      "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="
+    },
+    "node_modules/lodash.difference": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.difference/-/lodash.difference-4.5.0.tgz",
+      "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA=="
+    },
+    "node_modules/lodash.escaperegexp": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+      "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw=="
+    },
+    "node_modules/lodash.flatten": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+      "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g=="
+    },
+    "node_modules/lodash.groupby": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmmirror.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz",
+      "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw=="
+    },
+    "node_modules/lodash.isboolean": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+      "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+    },
+    "node_modules/lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+    },
+    "node_modules/lodash.isfunction": {
+      "version": "3.0.9",
+      "resolved": "https://registry.npmmirror.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
+      "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw=="
+    },
+    "node_modules/lodash.isnil": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/lodash.isnil/-/lodash.isnil-4.0.0.tgz",
+      "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng=="
+    },
+    "node_modules/lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+    },
+    "node_modules/lodash.isundefined": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz",
+      "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA=="
+    },
     "node_modules/lodash.merge": {
       "version": "4.6.2",
       "dev": true,
@@ -5423,6 +5863,16 @@
       "version": "4.1.1",
       "dev": true,
       "license": "MIT"
+    },
+    "node_modules/lodash.union": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmmirror.com/lodash.union/-/lodash.union-4.6.0.tgz",
+      "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw=="
+    },
+    "node_modules/lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
     },
     "node_modules/log-symbols": {
       "version": "4.1.0",
@@ -5621,7 +6071,6 @@
     },
     "node_modules/minimatch": {
       "version": "3.1.2",
-      "dev": true,
       "license": "ISC",
       "dependencies": {
         "brace-expansion": "^1.1.7"
@@ -5632,10 +6081,20 @@
     },
     "node_modules/minimist": {
       "version": "1.2.7",
-      "dev": true,
       "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+      "dependencies": {
+        "minimist": "^1.2.6"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
       }
     },
     "node_modules/ms": {
@@ -5697,7 +6156,6 @@
     },
     "node_modules/normalize-path": {
       "version": "3.0.0",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
@@ -5744,7 +6202,6 @@
     },
     "node_modules/once": {
       "version": "1.4.0",
-      "dev": true,
       "license": "ISC",
       "dependencies": {
         "wrappy": "1"
@@ -5827,6 +6284,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+    },
     "node_modules/parent-module": {
       "version": "1.0.1",
       "dev": true,
@@ -5867,7 +6329,6 @@
     },
     "node_modules/path-is-absolute": {
       "version": "1.0.1",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
@@ -5971,30 +6432,6 @@
         }
       }
     },
-    "node_modules/pinia/node_modules/vue-demi": {
-      "version": "0.13.11",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/postcss": {
       "version": "8.4.20",
       "funding": [
@@ -6064,6 +6501,11 @@
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
+    },
+    "node_modules/process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
     },
     "node_modules/proxy-from-env": {
       "version": "1.0.0",
@@ -6151,6 +6593,46 @@
       "peer": true,
       "dependencies": {
         "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/readdir-glob": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz",
+      "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
+      "dependencies": {
+        "minimatch": "^5.1.0"
+      }
+    },
+    "node_modules/readdir-glob/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/readdir-glob/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/readdirp": {
@@ -6308,7 +6790,6 @@
     },
     "node_modules/rimraf": {
       "version": "3.0.2",
-      "dev": true,
       "license": "ISC",
       "dependencies": {
         "glob": "^7.1.3"
@@ -6366,7 +6847,6 @@
     },
     "node_modules/safe-buffer": {
       "version": "5.2.1",
-      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -6462,6 +6942,11 @@
         "randombytes": "^2.1.0"
       }
     },
+    "node_modules/setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
+    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "dev": true,
@@ -6544,6 +7029,17 @@
       },
       "engines": {
         "node": "*"
+      }
+    },
+    "node_modules/ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "dependencies": {
+        "frac": "~1.1.2"
+      },
+      "engines": {
+        "node": ">=0.8"
       }
     },
     "node_modules/sshpk": {
@@ -6640,6 +7136,14 @@
       "license": "MIT",
       "dependencies": {
         "duplexer": "~0.1.1"
+      }
+    },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
       }
     },
     "node_modules/string-natural-compare": {
@@ -6740,6 +7244,21 @@
         "node": ">=6"
       }
     },
+    "node_modules/tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "dependencies": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/terser": {
       "version": "5.16.1",
       "dev": true,
@@ -6836,7 +7355,6 @@
     },
     "node_modules/tmp": {
       "version": "0.2.1",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "rimraf": "^3.0.0"
@@ -6885,6 +7403,14 @@
       },
       "engines": {
         "node": ">=12"
+      }
+    },
+    "node_modules/traverse": {
+      "version": "0.3.9",
+      "resolved": "https://registry.npmmirror.com/traverse/-/traverse-0.3.9.tgz",
+      "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==",
+      "engines": {
+        "node": "*"
       }
     },
     "node_modules/ts-api-utils": {
@@ -7178,6 +7704,55 @@
         "node": ">=8"
       }
     },
+    "node_modules/unzipper": {
+      "version": "0.10.14",
+      "resolved": "https://registry.npmmirror.com/unzipper/-/unzipper-0.10.14.tgz",
+      "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==",
+      "dependencies": {
+        "big-integer": "^1.6.17",
+        "binary": "~0.3.0",
+        "bluebird": "~3.4.1",
+        "buffer-indexof-polyfill": "~1.0.0",
+        "duplexer2": "~0.1.4",
+        "fstream": "^1.0.12",
+        "graceful-fs": "^4.2.2",
+        "listenercount": "~1.0.1",
+        "readable-stream": "~2.3.6",
+        "setimmediate": "~1.0.4"
+      }
+    },
+    "node_modules/unzipper/node_modules/bluebird": {
+      "version": "3.4.7",
+      "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz",
+      "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA=="
+    },
+    "node_modules/unzipper/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/unzipper/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/unzipper/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "node_modules/update-browserslist-db": {
       "version": "1.0.10",
       "dev": true,
@@ -7222,12 +7797,10 @@
     },
     "node_modules/util-deprecate": {
       "version": "1.0.2",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/uuid": {
       "version": "8.3.2",
-      "dev": true,
       "license": "MIT",
       "bin": {
         "uuid": "dist/bin/uuid"
@@ -7357,6 +7930,31 @@
         "@vue/runtime-dom": "3.2.45",
         "@vue/server-renderer": "3.2.45",
         "@vue/shared": "3.2.45"
+      }
+    },
+    "node_modules/vue-demi": {
+      "version": "0.14.6",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz",
+      "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
       }
     },
     "node_modules/vue-eslint-parser": {
@@ -7596,6 +8194,22 @@
         "node": ">= 8"
       }
     },
+    "node_modules/wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/word-wrap": {
       "version": "1.2.3",
       "dev": true,
@@ -7622,7 +8236,6 @@
     },
     "node_modules/wrappy": {
       "version": "1.0.2",
-      "dev": true,
       "license": "ISC"
     },
     "node_modules/ws": {
@@ -7645,6 +8258,26 @@
         }
       }
     },
+    "node_modules/xlsx": {
+      "version": "0.18.5",
+      "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz",
+      "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+      "dependencies": {
+        "adler-32": "~1.3.0",
+        "cfb": "~1.2.1",
+        "codepage": "~1.15.0",
+        "crc-32": "~1.2.1",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      },
+      "bin": {
+        "xlsx": "bin/xlsx.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/xml-name-validator": {
       "version": "4.0.0",
       "dev": true,
@@ -7655,7 +8288,6 @@
     },
     "node_modules/xmlchars": {
       "version": "2.2.0",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/yallist": {
@@ -7681,6 +8313,39 @@
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/zip-stream": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/zip-stream/-/zip-stream-4.1.1.tgz",
+      "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==",
+      "dependencies": {
+        "archiver-utils": "^3.0.4",
+        "compress-commons": "^4.1.2",
+        "readable-stream": "^3.6.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/zip-stream/node_modules/archiver-utils": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-3.0.4.tgz",
+      "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==",
+      "dependencies": {
+        "glob": "^7.2.3",
+        "graceful-fs": "^4.2.0",
+        "lazystream": "^1.0.0",
+        "lodash.defaults": "^4.2.0",
+        "lodash.difference": "^4.5.0",
+        "lodash.flatten": "^4.4.0",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.union": "^4.6.0",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^3.6.0"
+      },
+      "engines": {
+        "node": ">= 10"
       }
     }
   },
@@ -8827,6 +9492,33 @@
         "strip-json-comments": "^3.1.1"
       }
     },
+    "@fast-csv/format": {
+      "version": "4.3.5",
+      "resolved": "https://registry.npmmirror.com/@fast-csv/format/-/format-4.3.5.tgz",
+      "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==",
+      "requires": {
+        "@types/node": "^14.0.1",
+        "lodash.escaperegexp": "^4.1.2",
+        "lodash.isboolean": "^3.0.3",
+        "lodash.isequal": "^4.5.0",
+        "lodash.isfunction": "^3.0.9",
+        "lodash.isnil": "^4.0.0"
+      }
+    },
+    "@fast-csv/parse": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmmirror.com/@fast-csv/parse/-/parse-4.3.6.tgz",
+      "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==",
+      "requires": {
+        "@types/node": "^14.0.1",
+        "lodash.escaperegexp": "^4.1.2",
+        "lodash.groupby": "^4.6.0",
+        "lodash.isfunction": "^3.0.9",
+        "lodash.isnil": "^4.0.0",
+        "lodash.isundefined": "^3.0.1",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
     "@floating-ui/core": {
       "version": "1.0.4"
     },
@@ -9049,8 +9741,7 @@
       }
     },
     "@types/node": {
-      "version": "14.18.34",
-      "dev": true
+      "version": "14.18.34"
     },
     "@types/semver": {
       "version": "7.5.5",
@@ -9182,6 +9873,12 @@
       "dev": true,
       "requires": {}
     },
+    "@vue-office/excel": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmmirror.com/@vue-office/excel/-/excel-1.7.11.tgz",
+      "integrity": "sha512-LF3R9IV573Sf4qTu6Ik5Ee8UMfkrsZQ6HEQE25/2m1c0CMcHX6KanIy6Cz0b0Q+FrLH3TjIsLTm6oPcqAbDGSA==",
+      "requires": {}
+    },
     "@vue/compiler-core": {
       "version": "3.2.45",
       "requires": {
@@ -9278,12 +9975,6 @@
         "@vueuse/metadata": "9.7.0",
         "@vueuse/shared": "9.7.0",
         "vue-demi": "*"
-      },
-      "dependencies": {
-        "vue-demi": {
-          "version": "0.13.11",
-          "requires": {}
-        }
       }
     },
     "@vueuse/metadata": {
@@ -9293,12 +9984,6 @@
       "version": "9.7.0",
       "requires": {
         "vue-demi": "*"
-      },
-      "dependencies": {
-        "vue-demi": {
-          "version": "0.13.11",
-          "requires": {}
-        }
       }
     },
     "@webassemblyjs/ast": {
@@ -9473,6 +10158,11 @@
       "version": "8.2.0",
       "dev": true
     },
+    "adler-32": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
+      "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
+    },
     "agent-base": {
       "version": "6.0.2",
       "dev": true,
@@ -9544,6 +10234,66 @@
       "version": "2.2.0",
       "dev": true
     },
+    "archiver": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmmirror.com/archiver/-/archiver-5.3.2.tgz",
+      "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==",
+      "requires": {
+        "archiver-utils": "^2.1.0",
+        "async": "^3.2.4",
+        "buffer-crc32": "^0.2.1",
+        "readable-stream": "^3.6.0",
+        "readdir-glob": "^1.1.2",
+        "tar-stream": "^2.2.0",
+        "zip-stream": "^4.1.0"
+      }
+    },
+    "archiver-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-2.1.0.tgz",
+      "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
+      "requires": {
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.2.0",
+        "lazystream": "^1.0.0",
+        "lodash.defaults": "^4.2.0",
+        "lodash.difference": "^4.5.0",
+        "lodash.flatten": "^4.4.0",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.union": "^4.6.0",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^2.0.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "2.3.8",
+          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+          "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        }
+      }
+    },
     "arg": {
       "version": "5.0.2",
       "dev": true
@@ -9578,8 +10328,7 @@
       "dev": true
     },
     "async": {
-      "version": "3.2.4",
-      "dev": true
+      "version": "3.2.4"
     },
     "async-validator": {
       "version": "4.2.5"
@@ -9663,12 +10412,10 @@
       }
     },
     "balanced-match": {
-      "version": "1.0.2",
-      "dev": true
+      "version": "1.0.2"
     },
     "base64-js": {
-      "version": "1.5.1",
-      "dev": true
+      "version": "1.5.1"
     },
     "bcrypt-pbkdf": {
       "version": "1.0.2",
@@ -9677,9 +10424,33 @@
         "tweetnacl": "^0.14.3"
       }
     },
+    "big-integer": {
+      "version": "1.6.52",
+      "resolved": "https://registry.npmmirror.com/big-integer/-/big-integer-1.6.52.tgz",
+      "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="
+    },
+    "binary": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/binary/-/binary-0.3.0.tgz",
+      "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==",
+      "requires": {
+        "buffers": "~0.1.1",
+        "chainsaw": "~0.1.0"
+      }
+    },
     "binary-extensions": {
       "version": "2.2.0",
       "dev": true
+    },
+    "bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "requires": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
     },
     "blob-util": {
       "version": "2.0.2",
@@ -9695,7 +10466,6 @@
     },
     "brace-expansion": {
       "version": "1.1.11",
-      "dev": true,
       "requires": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
@@ -9720,20 +10490,28 @@
     },
     "buffer": {
       "version": "5.7.1",
-      "dev": true,
       "requires": {
         "base64-js": "^1.3.1",
         "ieee754": "^1.1.13"
       }
     },
     "buffer-crc32": {
-      "version": "0.2.13",
-      "dev": true
+      "version": "0.2.13"
     },
     "buffer-from": {
       "version": "1.1.2",
       "dev": true,
       "peer": true
+    },
+    "buffer-indexof-polyfill": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz",
+      "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A=="
+    },
+    "buffers": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/buffers/-/buffers-0.1.1.tgz",
+      "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ=="
     },
     "cachedir": {
       "version": "2.3.0",
@@ -9751,6 +10529,15 @@
       "version": "0.12.0",
       "dev": true
     },
+    "cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "requires": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      }
+    },
     "chai": {
       "version": "4.3.7",
       "dev": true,
@@ -9762,6 +10549,14 @@
         "loupe": "^2.3.1",
         "pathval": "^1.1.1",
         "type-detect": "^4.0.5"
+      }
+    },
+    "chainsaw": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/chainsaw/-/chainsaw-0.1.0.tgz",
+      "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==",
+      "requires": {
+        "traverse": ">=0.3.0 <0.4"
       }
     },
     "chalk": {
@@ -9853,6 +10648,11 @@
         "string-width": "^4.2.0"
       }
     },
+    "codepage": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
+      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
+    },
     "color-convert": {
       "version": "2.0.1",
       "dev": true,
@@ -9882,9 +10682,19 @@
       "version": "1.8.2",
       "dev": true
     },
+    "compress-commons": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/compress-commons/-/compress-commons-4.1.2.tgz",
+      "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==",
+      "requires": {
+        "buffer-crc32": "^0.2.13",
+        "crc32-stream": "^4.0.2",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^3.6.0"
+      }
+    },
     "concat-map": {
-      "version": "0.0.1",
-      "dev": true
+      "version": "0.0.1"
     },
     "convert-source-map": {
       "version": "1.9.0",
@@ -9905,8 +10715,21 @@
       }
     },
     "core-util-is": {
-      "version": "1.0.2",
-      "dev": true
+      "version": "1.0.2"
+    },
+    "crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
+    },
+    "crc32-stream": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/crc32-stream/-/crc32-stream-4.0.3.tgz",
+      "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==",
+      "requires": {
+        "crc-32": "^1.2.0",
+        "readable-stream": "^3.4.0"
+      }
     },
     "cross-spawn": {
       "version": "7.0.3",
@@ -10067,6 +10890,43 @@
       "version": "0.1.2",
       "dev": true
     },
+    "duplexer2": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz",
+      "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+      "requires": {
+        "readable-stream": "^2.0.2"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "2.3.8",
+          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+          "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        }
+      }
+    },
     "ecc-jsbn": {
       "version": "0.1.2",
       "dev": true,
@@ -10114,7 +10974,6 @@
     },
     "end-of-stream": {
       "version": "1.4.4",
-      "dev": true,
       "requires": {
         "once": "^1.4.0"
       }
@@ -10406,6 +11265,32 @@
       "dev": true,
       "peer": true
     },
+    "exceljs": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/exceljs/-/exceljs-4.4.0.tgz",
+      "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==",
+      "requires": {
+        "archiver": "^5.0.0",
+        "dayjs": "^1.8.34",
+        "fast-csv": "^4.3.1",
+        "jszip": "^3.10.1",
+        "readable-stream": "^3.6.0",
+        "saxes": "^5.0.1",
+        "tmp": "^0.2.0",
+        "unzipper": "^0.10.11",
+        "uuid": "^8.3.0"
+      },
+      "dependencies": {
+        "saxes": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmmirror.com/saxes/-/saxes-5.0.1.tgz",
+          "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+          "requires": {
+            "xmlchars": "^2.2.0"
+          }
+        }
+      }
+    },
     "execa": {
       "version": "4.1.0",
       "dev": true,
@@ -10445,6 +11330,15 @@
     "extsprintf": {
       "version": "1.3.0",
       "dev": true
+    },
+    "fast-csv": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmmirror.com/fast-csv/-/fast-csv-4.3.6.tgz",
+      "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==",
+      "requires": {
+        "@fast-csv/format": "4.3.5",
+        "@fast-csv/parse": "4.3.6"
+      }
     },
     "fast-deep-equal": {
       "version": "3.1.3",
@@ -10555,6 +11449,11 @@
         "mime-types": "^2.1.12"
       }
     },
+    "frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
+    },
     "fraction.js": {
       "version": "4.2.0",
       "dev": true
@@ -10562,6 +11461,11 @@
     "from": {
       "version": "0.1.7",
       "dev": true
+    },
+    "fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
     },
     "fs-extra": {
       "version": "9.1.0",
@@ -10578,8 +11482,28 @@
       "dev": true
     },
     "fs.realpath": {
-      "version": "1.0.0",
-      "dev": true
+      "version": "1.0.0"
+    },
+    "fstream": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmmirror.com/fstream/-/fstream-1.0.12.tgz",
+      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      },
+      "dependencies": {
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
     },
     "function-bind": {
       "version": "1.1.1",
@@ -10616,7 +11540,6 @@
     },
     "glob": {
       "version": "7.2.3",
-      "dev": true,
       "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -10675,8 +11598,7 @@
       }
     },
     "graceful-fs": {
-      "version": "4.2.10",
-      "dev": true
+      "version": "4.2.10"
     },
     "grapheme-splitter": {
       "version": "1.0.4",
@@ -10744,8 +11666,7 @@
       }
     },
     "ieee754": {
-      "version": "1.2.1",
-      "dev": true
+      "version": "1.2.1"
     },
     "ignore": {
       "version": "5.2.4",
@@ -10755,6 +11676,11 @@
       "version": "0.5.5",
       "dev": true,
       "optional": true
+    },
+    "immediate": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz",
+      "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
     },
     "immutable": {
       "version": "4.1.0",
@@ -10778,15 +11704,13 @@
     },
     "inflight": {
       "version": "1.0.6",
-      "dev": true,
       "requires": {
         "once": "^1.3.0",
         "wrappy": "1"
       }
     },
     "inherits": {
-      "version": "2.0.4",
-      "dev": true
+      "version": "2.0.4"
     },
     "ini": {
       "version": "2.0.0",
@@ -10868,6 +11792,11 @@
     "is-what": {
       "version": "3.14.1",
       "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
     },
     "isexe": {
       "version": "2.0.0",
@@ -11026,6 +11955,46 @@
         "verror": "1.10.0"
       }
     },
+    "jszip": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz",
+      "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
+      "requires": {
+        "lie": "~3.3.0",
+        "pako": "~1.0.2",
+        "readable-stream": "~2.3.6",
+        "setimmediate": "^1.0.5"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "2.3.8",
+          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+          "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        }
+      }
+    },
     "klona": {
       "version": "2.0.5",
       "dev": true
@@ -11033,6 +12002,43 @@
     "lazy-ass": {
       "version": "1.6.0",
       "dev": true
+    },
+    "lazystream": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz",
+      "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
+      "requires": {
+        "readable-stream": "^2.0.5"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "2.3.8",
+          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+          "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        }
+      }
     },
     "less": {
       "version": "4.1.3",
@@ -11064,6 +12070,19 @@
         "prelude-ls": "^1.2.1",
         "type-check": "~0.4.0"
       }
+    },
+    "lie": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz",
+      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+      "requires": {
+        "immediate": "~3.0.5"
+      }
+    },
+    "listenercount": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/listenercount/-/listenercount-1.0.1.tgz",
+      "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ=="
     },
     "listr2": {
       "version": "3.14.0",
@@ -11109,6 +12128,61 @@
       "version": "4.0.8",
       "dev": true
     },
+    "lodash.defaults": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+      "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="
+    },
+    "lodash.difference": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.difference/-/lodash.difference-4.5.0.tgz",
+      "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA=="
+    },
+    "lodash.escaperegexp": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+      "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw=="
+    },
+    "lodash.flatten": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+      "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g=="
+    },
+    "lodash.groupby": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmmirror.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz",
+      "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw=="
+    },
+    "lodash.isboolean": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+      "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+    },
+    "lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+    },
+    "lodash.isfunction": {
+      "version": "3.0.9",
+      "resolved": "https://registry.npmmirror.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
+      "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw=="
+    },
+    "lodash.isnil": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/lodash.isnil/-/lodash.isnil-4.0.0.tgz",
+      "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng=="
+    },
+    "lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+    },
+    "lodash.isundefined": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz",
+      "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA=="
+    },
     "lodash.merge": {
       "version": "4.6.2",
       "dev": true
@@ -11116,6 +12190,16 @@
     "lodash.once": {
       "version": "4.1.1",
       "dev": true
+    },
+    "lodash.union": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmmirror.com/lodash.union/-/lodash.union-4.6.0.tgz",
+      "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw=="
+    },
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
     },
     "log-symbols": {
       "version": "4.1.0",
@@ -11246,14 +12330,20 @@
     },
     "minimatch": {
       "version": "3.1.2",
-      "dev": true,
       "requires": {
         "brace-expansion": "^1.1.7"
       }
     },
     "minimist": {
-      "version": "1.2.7",
-      "dev": true
+      "version": "1.2.7"
+    },
+    "mkdirp": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+      "requires": {
+        "minimist": "^1.2.6"
+      }
     },
     "ms": {
       "version": "2.1.2",
@@ -11296,8 +12386,7 @@
       "dev": true
     },
     "normalize-path": {
-      "version": "3.0.0",
-      "dev": true
+      "version": "3.0.0"
     },
     "normalize-range": {
       "version": "0.1.2",
@@ -11326,7 +12415,6 @@
     },
     "once": {
       "version": "1.4.0",
-      "dev": true,
       "requires": {
         "wrappy": "1"
       }
@@ -11375,6 +12463,11 @@
         "aggregate-error": "^3.0.0"
       }
     },
+    "pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+    },
     "parent-module": {
       "version": "1.0.1",
       "dev": true,
@@ -11398,8 +12491,7 @@
       "dev": true
     },
     "path-is-absolute": {
-      "version": "1.0.1",
-      "dev": true
+      "version": "1.0.1"
     },
     "path-key": {
       "version": "3.1.1",
@@ -11450,12 +12542,6 @@
       "requires": {
         "@vue/devtools-api": "^6.4.5",
         "vue-demi": "*"
-      },
-      "dependencies": {
-        "vue-demi": {
-          "version": "0.13.11",
-          "requires": {}
-        }
       }
     },
     "postcss": {
@@ -11491,6 +12577,11 @@
     "pretty-bytes": {
       "version": "5.6.0",
       "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
     },
     "proxy-from-env": {
       "version": "1.0.0",
@@ -11542,6 +12633,42 @@
       "peer": true,
       "requires": {
         "safe-buffer": "^5.1.0"
+      }
+    },
+    "readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "requires": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      }
+    },
+    "readdir-glob": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz",
+      "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
+      "requires": {
+        "minimatch": "^5.1.0"
+      },
+      "dependencies": {
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+          "requires": {
+            "balanced-match": "^1.0.0"
+          }
+        },
+        "minimatch": {
+          "version": "5.1.6",
+          "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
+          "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        }
       }
     },
     "readdirp": {
@@ -11648,7 +12775,6 @@
     },
     "rimraf": {
       "version": "3.0.2",
-      "dev": true,
       "requires": {
         "glob": "^7.1.3"
       }
@@ -11675,8 +12801,7 @@
       }
     },
     "safe-buffer": {
-      "version": "5.2.1",
-      "dev": true
+      "version": "5.2.1"
     },
     "safer-buffer": {
       "version": "2.1.2",
@@ -11727,6 +12852,11 @@
       "requires": {
         "randombytes": "^2.1.0"
       }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
     },
     "shebang-command": {
       "version": "2.0.0",
@@ -11779,6 +12909,14 @@
       "dev": true,
       "requires": {
         "through": "2"
+      }
+    },
+    "ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "requires": {
+        "frac": "~1.1.2"
       }
     },
     "sshpk": {
@@ -11842,6 +12980,14 @@
         "duplexer": "~0.1.1"
       }
     },
+    "string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "requires": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
     "string-natural-compare": {
       "version": "3.0.1",
       "dev": true
@@ -11896,6 +13042,18 @@
       "version": "2.2.1",
       "dev": true,
       "peer": true
+    },
+    "tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "requires": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      }
     },
     "terser": {
       "version": "5.16.1",
@@ -11953,7 +13111,6 @@
     },
     "tmp": {
       "version": "0.2.1",
-      "dev": true,
       "requires": {
         "rimraf": "^3.0.0"
       }
@@ -11983,6 +13140,11 @@
       "requires": {
         "punycode": "^2.1.1"
       }
+    },
+    "traverse": {
+      "version": "0.3.9",
+      "resolved": "https://registry.npmmirror.com/traverse/-/traverse-0.3.9.tgz",
+      "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ=="
     },
     "ts-api-utils": {
       "version": "1.0.3",
@@ -12154,6 +13316,57 @@
       "version": "4.0.0",
       "dev": true
     },
+    "unzipper": {
+      "version": "0.10.14",
+      "resolved": "https://registry.npmmirror.com/unzipper/-/unzipper-0.10.14.tgz",
+      "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==",
+      "requires": {
+        "big-integer": "^1.6.17",
+        "binary": "~0.3.0",
+        "bluebird": "~3.4.1",
+        "buffer-indexof-polyfill": "~1.0.0",
+        "duplexer2": "~0.1.4",
+        "fstream": "^1.0.12",
+        "graceful-fs": "^4.2.2",
+        "listenercount": "~1.0.1",
+        "readable-stream": "~2.3.6",
+        "setimmediate": "~1.0.4"
+      },
+      "dependencies": {
+        "bluebird": {
+          "version": "3.4.7",
+          "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz",
+          "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA=="
+        },
+        "readable-stream": {
+          "version": "2.3.8",
+          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+          "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        }
+      }
+    },
     "update-browserslist-db": {
       "version": "1.0.10",
       "dev": true,
@@ -12178,12 +13391,10 @@
       }
     },
     "util-deprecate": {
-      "version": "1.0.2",
-      "dev": true
+      "version": "1.0.2"
     },
     "uuid": {
-      "version": "8.3.2",
-      "dev": true
+      "version": "8.3.2"
     },
     "verror": {
       "version": "1.10.0",
@@ -12234,6 +13445,12 @@
         "@vue/server-renderer": "3.2.45",
         "@vue/shared": "3.2.45"
       }
+    },
+    "vue-demi": {
+      "version": "0.14.6",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz",
+      "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+      "requires": {}
     },
     "vue-eslint-parser": {
       "version": "9.3.2",
@@ -12385,6 +13602,16 @@
         "isexe": "^2.0.0"
       }
     },
+    "wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
+    },
+    "word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
+    },
     "word-wrap": {
       "version": "1.2.3",
       "dev": true
@@ -12399,21 +13626,33 @@
       }
     },
     "wrappy": {
-      "version": "1.0.2",
-      "dev": true
+      "version": "1.0.2"
     },
     "ws": {
       "version": "8.11.0",
       "dev": true,
       "requires": {}
     },
+    "xlsx": {
+      "version": "0.18.5",
+      "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz",
+      "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+      "requires": {
+        "adler-32": "~1.3.0",
+        "cfb": "~1.2.1",
+        "codepage": "~1.15.0",
+        "crc-32": "~1.2.1",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      }
+    },
     "xml-name-validator": {
       "version": "4.0.0",
       "dev": true
     },
     "xmlchars": {
-      "version": "2.2.0",
-      "dev": true
+      "version": "2.2.0"
     },
     "yallist": {
       "version": "4.0.0",
@@ -12430,6 +13669,35 @@
     "yocto-queue": {
       "version": "0.1.0",
       "dev": true
+    },
+    "zip-stream": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/zip-stream/-/zip-stream-4.1.1.tgz",
+      "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==",
+      "requires": {
+        "archiver-utils": "^3.0.4",
+        "compress-commons": "^4.1.2",
+        "readable-stream": "^3.6.0"
+      },
+      "dependencies": {
+        "archiver-utils": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-3.0.4.tgz",
+          "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==",
+          "requires": {
+            "glob": "^7.2.3",
+            "graceful-fs": "^4.2.0",
+            "lazystream": "^1.0.0",
+            "lodash.defaults": "^4.2.0",
+            "lodash.difference": "^4.5.0",
+            "lodash.flatten": "^4.4.0",
+            "lodash.isplainobject": "^4.0.6",
+            "lodash.union": "^4.6.0",
+            "normalize-path": "^3.0.0",
+            "readable-stream": "^3.6.0"
+          }
+        }
+      }
     }
   }
 }
diff --git a/package.json b/package.json
index 0f208cb..7308c77 100644
--- a/package.json
+++ b/package.json
@@ -16,16 +16,20 @@
     "@amap/amap-jsapi-loader": "^1.0.1",
     "@ctrl/tinycolor": "^4.0.2",
     "@element-plus/icons-vue": "^2.0.10",
+    "@vue-office/excel": "^1.7.11",
     "@vueuse/core": "^9.7.0",
     "axios": "^1.2.1",
     "dayjs": "^1.11.13",
     "element-plus": "^2.8.3",
+    "exceljs": "^4.4.0",
     "js-base64": "^3.7.5",
     "md5": "^2.3.0",
     "pinia": "^2.0.26",
     "vue": "^3.2.45",
+    "vue-demi": "^0.14.6",
     "vue-i18n": "^9.8.0",
-    "vue-router": "^4.1.6"
+    "vue-router": "^4.1.6",
+    "xlsx": "^0.18.5"
   },
   "devDependencies": {
     "@babel/cli": "^7.19.3",
diff --git a/src/api/fysp/dataproductApi.js b/src/api/fysp/dataproductApi.js
new file mode 100644
index 0000000..994fc55
--- /dev/null
+++ b/src/api/fysp/dataproductApi.js
@@ -0,0 +1,34 @@
+import { Base64 } from 'js-base64';
+import { $fysp } from '../index';
+
+export default {
+  /**
+   * 涓嬭浇鏁版嵁浜у搧
+   */
+  downloadProduct(area, type, forceUpdate) {
+    return $fysp
+      .post(`dataProduct/download?`, area, {
+        responseType: 'blob',
+        params: { type, forceUpdate }
+      })
+      .then((res) => {
+        // 鏂囨。鏈敓鎴愶紝宸插惎鍔ㄦ枃妗g敓鎴愬悗鍙颁换鍔�
+        if (res.data.type == 'application/json') {
+          return false;
+        }
+        // 鏂囨。宸插瓨鍦紝杩斿洖鏂囦欢鏁版嵁娴�
+        else {
+          return res.data
+          // const name = Base64.decode(res.headers.get('filename'));
+          // const url = window.URL.createObjectURL(res.data);
+          // const link = document.createElement('a');
+          // link.href = url;
+          // link.setAttribute('download', name);
+          // document.body.appendChild(link);
+          // link.click();
+          // document.body.removeChild(link);
+          // window.URL.revokeObjectURL(url);
+        }
+      });
+  }
+};
diff --git a/src/api/fysp/subtaskApi.js b/src/api/fysp/subtaskApi.js
new file mode 100644
index 0000000..bf890c2
--- /dev/null
+++ b/src/api/fysp/subtaskApi.js
@@ -0,0 +1,20 @@
+import { $fysp } from '../index';
+
+export default {
+  /**
+   * 璋冩暣瀛愪换鍔′俊鎭�
+   * @param {Object} subtask
+   * @returns
+   */
+  adjustSubtask(subtask) {
+    return $fysp.post(`subtask/adjust`, subtask).then((res) => res.data);
+  },
+
+  putSubtasks(subtaskList) {
+    return $fysp.put(`subtask/addlist`, subtaskList).then((res) => res.data);
+  },
+
+  deleteSubtask(stGuid) {
+    return $fysp.delete(`subtask/${stGuid}`).then((res) => res.data);
+  }
+};
diff --git a/src/api/index.js b/src/api/index.js
index 243b99c..231eaba 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -11,7 +11,7 @@
 let ip2_file = 'https://fyami.com.cn/';
 
 if (debug) {
-  ip1 = 'http://192.168.0.138:8080/';
+  ip1 = 'http://192.168.0.138:9001/';
   // ip1_file = 'http://192.168.0.138:8080/';
   // ip2 = 'http://192.168.0.138:8080/';
   // ip2_file = 'https://fyami.com.cn/';
diff --git a/src/components.d.ts b/src/components.d.ts
index 124cacb..37e7435 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -12,18 +12,23 @@
     BasePanelLayout: typeof import('./components/core/BasePanelLayout.vue')['default']
     CompQuickSet: typeof import('./components/search-option/CompQuickSet.vue')['default']
     Content: typeof import('./components/core/Content.vue')['default']
+    ElAffix: typeof import('element-plus/es')['ElAffix']
     ElAside: typeof import('element-plus/es')['ElAside']
     ElAvatar: typeof import('element-plus/es')['ElAvatar']
     ElBadge: typeof import('element-plus/es')['ElBadge']
     ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
     ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
     ElButton: typeof import('element-plus/es')['ElButton']
+    ElCalendar: typeof import('element-plus/es')['ElCalendar']
     ElCard: typeof import('element-plus/es')['ElCard']
+    ElCascader: typeof import('element-plus/es')['ElCascader']
+    ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElCollapse: typeof import('element-plus/es')['ElCollapse']
     ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
     ElContainer: typeof import('element-plus/es')['ElContainer']
+    ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
     ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
     ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
     ElDialog: typeof import('element-plus/es')['ElDialog']
@@ -36,6 +41,7 @@
     ElIcon: typeof import('element-plus/es')['ElIcon']
     ElImage: typeof import('element-plus/es')['ElImage']
     ElInput: typeof import('element-plus/es')['ElInput']
+    ElLink: typeof import('element-plus/es')['ElLink']
     ElMain: typeof import('element-plus/es')['ElMain']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
@@ -44,6 +50,7 @@
     ElPopover: typeof import('element-plus/es')['ElPopover']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
+    ElSegmented: typeof import('element-plus/es')['ElSegmented']
     ElSelect: typeof import('element-plus/es')['ElSelect']
     ElSpace: typeof import('element-plus/es')['ElSpace']
     ElStep: typeof import('element-plus/es')['ElStep']
@@ -55,6 +62,7 @@
     ElTabs: typeof import('element-plus/es')['ElTabs']
     ElTag: typeof import('element-plus/es')['ElTag']
     ElText: typeof import('element-plus/es')['ElText']
+    ElTooltip: typeof import('element-plus/es')['ElTooltip']
     ElTree: typeof import('element-plus/es')['ElTree']
     ElUpload: typeof import('element-plus/es')['ElUpload']
     Footer: typeof import('./components/core/Footer.vue')['default']
diff --git a/src/components/core/SiderMenu.vue b/src/components/core/SiderMenu.vue
index abe2269..4e53868 100644
--- a/src/components/core/SiderMenu.vue
+++ b/src/components/core/SiderMenu.vue
@@ -77,7 +77,7 @@
   data() {
     return {
       popVisible: false,
-      menuHeight: '800px',
+      menuHeight: '600px',
       title: '鐢熸�佺幆澧冪嚎涓婄洃绠�',
       subTitle: '漏涓婃捣椋炵窘鐜繚绉戞妧鏈夐檺鍏徃',
       sysIndex: 0,
@@ -139,7 +139,7 @@
     this.navPage(...this.menuPath(this.menus[0]));
   },
   mounted() {
-    // this.menuHeight = this.calMenuHeight();
+    this.menuHeight = this.calMenuHeight();
   }
 };
 </script>
@@ -179,7 +179,7 @@
 .el-menu-vertical-demo:not(.el-menu--collapse) {
   /* width: 200px; */
   min-height: 100vh;
-  /* max-height: 100vh; */
+  max-height: 100vh;
 }
 
 .el-menu--collapse {
diff --git a/src/components/form/FYForm.vue b/src/components/form/FYForm.vue
index f8654cc..ef4cbb8 100644
--- a/src/components/form/FYForm.vue
+++ b/src/components/form/FYForm.vue
@@ -120,15 +120,13 @@
       'submit',
       formObj,
       () => {
-        loading.value = false;
         resolve();
       },
       (err) => {
-        loading.value = false;
         reject(err ? err : '');
       }
     );
-  });
+  }).finally(() => (loading.value = false));
 }
 
 //鍙栨秷鎸夐挳瑙﹀彂
diff --git a/src/components/list-item/ItemSubTask.vue b/src/components/list-item/ItemSubTask.vue
index 58abf2b..ac1f3ab 100644
--- a/src/components/list-item/ItemSubTask.vue
+++ b/src/components/list-item/ItemSubTask.vue
@@ -1,27 +1,68 @@
 <template>
   <div class="wrapper">
-    <div>
-      <el-text truncated class="w-250px" size="large">{{ item.name }}</el-text>
-    </div>
-    <div>
-      <el-text truncated class="w-250px" size="small">{{ item.scenseaddress }}</el-text>
-    </div>
-    <div>
-      <el-text truncated size="small">{{
-        $fm.formatYMDH(item.planstarttime)
-      }}</el-text>
-    </div>
-    <div>
-      <el-text truncated class="w-250px" size="small">{{
-        item.executorrealtimes
-      }}</el-text>
-    </div>
-    <el-row justify="end" style="margin-top: 4px">
-      <slot :item="item"></slot>
+    <el-row justify="space-between" class="m-t-4">
+      <el-col :span="20">
+        <div class="text-title">
+          <el-tag
+            size="small"
+            :type="statusType.type"
+            effect="plain"
+            class="m-r-4 m-b-4"
+          >
+            <el-space :size="4">
+              <el-icon size="16">
+                <component :is="statusType.icon"></component>
+              </el-icon>
+              {{ item.status }}
+            </el-space>
+          </el-tag>
+          {{ item.name }}
+        </div>
+        <div class="text-info">
+          <div class="text-label">
+            <el-icon class="m-r-4" size="16"><LocationInformation /></el-icon>
+            <span>浠诲姟鍦板潃锛�</span>
+          </div>
+          {{ item.scenseaddress }}
+        </div>
+        <div class="text-info">
+          <div class="text-label">
+            <!-- <el-icon><Clock /></el-icon> -->
+            <el-icon class="m-r-4" size="16"><AlarmClock /></el-icon>
+            <span>浠诲姟鏃堕棿锛�</span>
+          </div>
+          {{ $fm.formatYMD(item.planstarttime) }}
+        </div>
+        <div class="text-info">
+          <div class="text-label">
+            <el-icon class="m-r-4" size="16"><User /></el-icon>
+            浠诲姟浜哄憳锛�
+          </div>
+          {{ item.executorrealtimes }}
+        </div>
+        <el-space class="m-t-4">
+          <el-tag size="small" type="info" effect=""
+            >闂锛歿{ status.proNum }}</el-tag
+          >
+          <el-tag size="small" type="info" effect=""
+            >鏁存敼锛歿{ status.changeNum }}</el-tag
+          >
+          <el-tag size="small" :type="changePerType" effect=""
+            >鏁存敼鐜囷細{{ status.changePer }}</el-tag
+          >
+        </el-space>
+      </el-col>
+      <el-col :span="4">
+        <slot :item="item"></slot>
+      </el-col>
     </el-row>
   </div>
 </template>
 <script setup>
+import { ref, watch, computed } from 'vue';
+import taskApi from '@/api/fysp/taskApi';
+import ProCheckProxy from '@/views/fysp/check/ProCheckProxy';
+
 /**
  * 鐩戠瀵硅薄
  */
@@ -31,12 +72,98 @@
     default: () => {}
   }
 });
+
+const loading = ref(false);
+const proList = ref([]);
+const status = ref({});
+
+const statusType = computed(() => {
+  switch (props.item.status) {
+    case '鏈墽琛�':
+      return {
+        type: 'danger',
+        icon: 'WarningFilled'
+      };
+    case '姝e湪鎵ц':
+      return {
+        type: 'success',
+        icon: 'Timer'
+      };
+    case '宸茬粨鏉�':
+      return {
+        type: 'info',
+        icon: 'SuccessFilled'
+      };
+    default:
+      return {
+        type: 'danger',
+        icon: 'Warning'
+      };
+  }
+});
+
+const changePerType = computed(() => {
+  if (status.value.changeNum == 0) {
+    if (status.value.proNum == 0) {
+      return 'success';
+    } else {
+      return 'danger';
+    }
+  } else if (status.value.proNum == status.value.changeNum) {
+    return 'success';
+  } else {
+    return 'warning';
+  }
+});
+
+watch(
+  () => props.item,
+  (nV, oV) => {
+    if (nV != oV) {
+      fetchProblems(nV);
+    }
+  },
+  { immediate: true }
+);
+
+function fetchProblems(subtask) {
+  loading.value = true;
+  taskApi
+    .getProBySubtask(subtask.stguid)
+    .then((res) => {
+      proList.value = res;
+      status.value = ProCheckProxy.calProStatus(res);
+    })
+    .finally(() => {
+      loading.value = false;
+    });
+}
 </script>
 <style scoped>
 .wrapper {
   /* width: 300px; */
+  width: 100%;
   border: 1px solid var(--el-border-color);
   border-radius: var(--el-border-radius-base);
   padding: 4px 8px;
 }
+
+.text-title {
+  font-weight: var(--el-font-weight-primary);
+  color: var(--el-text-color-primary);
+  font-size: var(--el-font-size-medium);
+}
+
+.text-info {
+  display: flex;
+  align-items: flex-start;
+  color: var(--el-text-color-secondary);
+  font-size: var(--el-font-size-small);
+}
+
+.text-label {
+  display: flex;
+  align-items: center;
+  white-space: nowrap;
+}
 </style>
diff --git a/src/views/fysp/data-product/ProdProAnalysis.vue b/src/views/fysp/data-product/ProdProAnalysis.vue
index 78b8c00..2a102cf 100644
--- a/src/views/fysp/data-product/ProdProAnalysis.vue
+++ b/src/views/fysp/data-product/ProdProAnalysis.vue
@@ -1,9 +1,11 @@
 <template>
-  <div>DailyReport</div>
+  <BaseDataProduct product-type="3"></BaseDataProduct>
 </template>
+<script setup>
+/**
+ * 闂鏁存敼鍒嗘瀽
+ */
+import BaseDataProduct from './components/BaseDataProduct.vue';
 
-<script>
-export default {
-  name: 'DailyReport',
-};
+
 </script>
diff --git a/src/views/fysp/data-product/ProdProFollow.vue b/src/views/fysp/data-product/ProdProFollow.vue
index 78b8c00..9819de8 100644
--- a/src/views/fysp/data-product/ProdProFollow.vue
+++ b/src/views/fysp/data-product/ProdProFollow.vue
@@ -1,9 +1,11 @@
 <template>
-  <div>DailyReport</div>
+  <BaseDataProduct product-type="1"></BaseDataProduct>
 </template>
+<script setup>
+/**
+ * 闂鍔ㄦ�佽窡韪�
+ */
+import BaseDataProduct from './components/BaseDataProduct.vue';
 
-<script>
-export default {
-  name: 'DailyReport',
-};
+
 </script>
diff --git a/src/views/fysp/data-product/ProdSceneReport.vue b/src/views/fysp/data-product/ProdSceneReport.vue
index 78b8c00..c2d8d05 100644
--- a/src/views/fysp/data-product/ProdSceneReport.vue
+++ b/src/views/fysp/data-product/ProdSceneReport.vue
@@ -1,9 +1,3 @@
 <template>
-  <div>DailyReport</div>
+  鍦烘櫙鎶ュ憡绠$悊
 </template>
-
-<script>
-export default {
-  name: 'DailyReport',
-};
-</script>
diff --git a/src/views/fysp/data-product/ProdStandardJudge.vue b/src/views/fysp/data-product/ProdStandardJudge.vue
index 78b8c00..257e617 100644
--- a/src/views/fysp/data-product/ProdStandardJudge.vue
+++ b/src/views/fysp/data-product/ProdStandardJudge.vue
@@ -1,9 +1,11 @@
 <template>
-  <div>DailyReport</div>
+  <BaseDataProduct product-type="2"></BaseDataProduct>
 </template>
+<script setup>
+/**
+ * 瑙勮寖鎬ц瘎浼�
+ */
+import BaseDataProduct from './components/BaseDataProduct.vue';
 
-<script>
-export default {
-  name: 'DailyReport',
-};
+
 </script>
diff --git a/src/views/fysp/data-product/components/BaseDataProduct.vue b/src/views/fysp/data-product/components/BaseDataProduct.vue
new file mode 100644
index 0000000..b53953e
--- /dev/null
+++ b/src/views/fysp/data-product/components/BaseDataProduct.vue
@@ -0,0 +1,353 @@
+<template>
+  <FYSearchBar ref="searchRef" @search="handleSearch">
+    <template #options>
+      <!-- 鍖哄幙 -->
+      <FYOptionLocation
+        :allOption="false"
+        :level="3"
+        :checkStrictly="false"
+        v-model:value="formSearch.locations"
+      ></FYOptionLocation>
+      <!-- 鍦烘櫙绫诲瀷 -->
+      <FYOptionScene
+        :allOption="false"
+        :type="2"
+        v-model:value="formSearch.scenetype"
+      ></FYOptionScene>
+      <!-- 鏃堕棿 -->
+      <FYOptionTime
+        :initValue="false"
+        type="month"
+        v-model:value="formSearch.time"
+      ></FYOptionTime>
+    </template>
+    <template #buttons>
+      <CompReportDownloadDialog
+        name="闂涓庢暣鏀规眹鎬诲垎鏋愪笌鍔ㄦ�佽窡韪竻鍗�"
+        :locations="formSearch.locations"
+        :scenetype="formSearch.scenetype"
+        :time="formSearch.time"
+        @submit="handleSearch"
+      ></CompReportDownloadDialog>
+    </template>
+  </FYSearchBar>
+  <el-form ref="expandRef" :inline="true">
+    <CompQuickSet @quick-set="setOptions"></CompQuickSet>
+  </el-form>
+  <el-space ref="segmentedRef">
+    <el-segmented
+      :model-value="activeSheet"
+      :options="sheetNames"
+      @change="tabChange"
+    />
+  </el-space>
+  <el-table
+    ref="tableRef"
+    :data="activeExcelData.data"
+    v-loading="loading"
+    table-layout="auto"
+    size="small"
+    :height="tableHeight"
+    fit
+    flexible
+    stripe
+    border
+  >
+    <template v-if="activeExcelData.head">
+      <el-table-column
+        v-for="(item, index) in activeExcelData.head"
+        :key="index"
+        :prop="item.name"
+        :label="item.name"
+      >
+        <template v-if="item.children" #default="{ row }">
+          <span v-html="row[item.name]"></span>
+          <el-table-column
+            v-for="(item1, index1) in item.children"
+            :key="index1"
+            :prop="item1.name"
+            :label="item1.name"
+          >
+            <template v-if="item1.children" #default="{ row1 }">
+              <span v-html="row1[item1.name]"></span>
+              <el-table-column
+                v-for="(item2, index2) in item1.children"
+                :key="index2"
+                :prop="item2.name"
+                :label="item2.name"
+              >
+                <template v-if="item2.children" #default="{ row2 }">
+                  <span v-html="row2[item2.name]"></span>
+                </template>
+              </el-table-column>
+            </template>
+          </el-table-column>
+        </template>
+      </el-table-column>
+    </template>
+  </el-table>
+  <!-- <vue-office-excel
+    :src="excel"
+    :style="'height: ' + tableHeight"
+    @rendered="renderedHandler"
+    @error="errorHandler"
+  /> -->
+</template>
+<script setup>
+/**
+ * 闂鍔ㄦ�佽窡韪�
+ */
+//寮曞叆VueOfficeExcel缁勪欢
+import VueOfficeExcel from '@vue-office/excel';
+//寮曞叆鐩稿叧鏍峰紡
+import '@vue-office/excel/lib/index.css';
+
+import { ref, onMounted } from 'vue';
+import dayjs from 'dayjs';
+import * as XLSX from 'xlsx';
+import * as ExcelJS from 'exceljs';
+import dataproductApi from '@/api/fysp/dataproductApi';
+import CompReportDownloadDialog from './CompReportDownloadDialog.vue';
+
+const emit = defineEmits(['search']);
+
+const props = defineProps({
+  // 鏁版嵁浜у搧绫诲瀷锛�1锛氶棶棰樺姩鎬佽窡韪紱2锛氳鑼冩�ц瘎浼帮紱3锛氶棶棰樻暣鏀瑰垎鏋�
+  productType: Number,
+  // 鍦ㄦ暟鎹睍绀轰箣鍓嶏紝鍋氶澶勭悊锛堜富瑕佹槸澶勭悊鍚堝苟琛ㄥご锛�
+  beforeDataShow: {
+    type: Function,
+    default: (data) => {
+      return data;
+    }
+  },
+  // 鏁版嵁琛ㄦ牸鐨勮〃澶磋鏁�
+  headNum: {
+    type: Number,
+    default: 1
+  }
+});
+
+const formSearch = ref({
+  locations: {},
+  scenetype: {},
+  time: dayjs().add(-1, 'M').date(1).toDate()
+});
+const loading = ref(false);
+const tableHeight = ref('500');
+let workbook;
+const sheetNames = ref();
+const excelDatas = ref(new Map());
+const activeSheet = ref();
+const activeExcelData = ref({});
+const excel = ref('');
+
+const searchRef = ref(null);
+const expandRef = ref(null);
+const segmentedRef = ref(null);
+
+function setOptions(param) {
+  formSearch.value.locations = param.locations;
+  formSearch.value.scenetype = param.scenetype;
+  formSearch.value.sourceType = param.sourceType;
+  handleSearch(false);
+}
+
+function tabChange(tabName) {
+  activeSheet.value = tabName;
+  getTable(activeSheet.value);
+}
+
+function handleSearch(forceUpdate) {
+  const locations = formSearch.value.locations;
+  const time = formSearch.value.time;
+  const scenetype = formSearch.value.scenetype;
+  const area = {
+    provincecode: locations.pCode,
+    provincename: locations.pName,
+    citycode: locations.cCode,
+    cityname: locations.cName,
+    districtcode: locations.dCode,
+    districtname: locations.dName,
+    starttime: dayjs(time).format('YYYY-MM-DD HH:mm:ss'),
+    scensetypeid: scenetype.value
+  };
+
+  excelDatas.value.clear();
+  loading.value = true;
+  dataproductApi
+    .downloadProduct(area, props.productType, forceUpdate ? forceUpdate : false)
+    .then(async (res) => {
+      // const data = new Uint8Array(res);
+      res.arrayBuffer().then((data) => {
+        workbook = XLSX.read(data, { type: 'array' });
+        sheetNames.value = workbook.SheetNames;
+        activeSheet.value = sheetNames.value[0];
+        getTable(activeSheet.value);
+      });
+
+      // const workbook = new ExcelJS.Workbook();
+      // await workbook.xlsx.load(res);
+      // workbook.eachSheet(function (worksheet, sheetId) {
+      //   console.log(worksheet.name);
+      // });
+      // const sheet1 = workbook.worksheets[0]
+      // const row = sheet1.getRow(1)
+      // console.log(row);
+
+      // console.log(res);
+      // console.log(new ArrayBuffer(res));
+      // res.arrayBuffer().then(r=>{
+      //   excel.value = r
+      // })
+
+      // excel.value = new ArrayBuffer(res)
+    })
+    .finally(() => (loading.value = false));
+}
+
+function getTable(sheetName) {
+  if (!excelDatas.value.has(sheetName)) {
+    const worksheet = workbook.Sheets[sheetName];
+    // const tableData = XLSX.utils.sheet_to_json(worksheet, { header: 3 });
+    let tableData = XLSX.utils.sheet_to_txt(worksheet);
+    // console.log(tableData);
+
+    const regx = new RegExp(/"([^"]|\n)+"/, 'g');
+    let matchTxt = tableData.match(regx);
+
+    if (matchTxt) {
+      matchTxt.forEach((txt) => {
+        let newTxt = txt.replace(new RegExp(/\n/, 'g'), '<br />');
+        newTxt = newTxt.replace(new RegExp(/"/, 'g'), '');
+        tableData = tableData.replace(txt, newTxt);
+      });
+      // console.log(tableData);
+    }
+
+    const t = strToTableObj(tableData);
+    // console.log(head);
+    // console.log(data);
+    excelDatas.value.set(sheetName, t);
+  }
+  activeExcelData.value = excelDatas.value.get(sheetName);
+
+  // activeExcelData.value = props.beforeDataShow(tableData);
+}
+
+// 鏍规嵁琛ㄥご鐨勮鏁帮紝鍚堝苟琛ㄥご
+function combineTableHead(excelData) {
+  if (excelData.length < props.headNum) return;
+
+  // const newHead = {};
+  // excelData.splice(0, props.headNum).forEach((row) => {
+  //   for (const key in row) {
+  //     console.log(key);
+  //   }
+  // });
+}
+
+function calcTableHeight() {
+  const h1 = searchRef.value.$el.offsetHeight;
+  const h2 = expandRef.value.$el.offsetHeight;
+  const h3 = segmentedRef.value.$el.offsetHeight;
+
+  const h = h1 + h2 + h3;
+  return `calc(100vh - ${h}px - 60px - var(--el-main-padding) * 2)`;
+}
+
+function renderedHandler() {
+  console.log('娓叉煋瀹屾垚');
+}
+function errorHandler(e) {
+  console.log('娓叉煋澶辫触', e);
+}
+
+function strToTableObj(data, headNum) {
+  const rows = data.split('\n').map((r) => r.split('\t'));
+  if (rows.length == 0) return;
+
+  let header = 1;
+  for (let i = 1; i < rows.length; i++) {
+    const row = rows[i];
+    if (row.length == 0) {
+      break;
+    }
+    if (row[0] == '') {
+      header++;
+    } else {
+      break;
+    }
+  }
+
+  if (rows.length < header) {
+    throw new Error(`鏂囦欢琛屾暟灏忎簬${header}`);
+  }
+  // 琛ㄥご
+  let lastHead = [];
+  // 灞炴�у悕
+  const dataKeys = [];
+  let offset = 1;
+  for (let i = header - 1; i >= 0; i--) {
+    const row = rows[i];
+    if (lastHead.length == 0) {
+      row.forEach((r, y) => {
+        lastHead.push({ name: r });
+        dataKeys.push(r);
+      });
+    } else {
+      const newHead = [];
+      row.forEach((r, y) => {
+        if (dataKeys[y] == '') {
+          dataKeys[y] = r;
+        }
+
+        const last = lastHead[y];
+        if (!last) {
+          console.log(last);
+        }
+        if (last.name == '') {
+          newHead.push({ name: r });
+          offset++;
+        } else if (r != '') {
+          newHead.push({
+            name: r,
+            children: [last]
+          });
+          offset = 1;
+        } else {
+          newHead.push({ name: '' });
+          let _index = newHead.length - 1 - offset;
+          _index = _index >= 0 ? _index : 0;
+          newHead[_index].children.push(last);
+          offset++;
+        }
+      });
+      lastHead = newHead;
+    }
+  }
+  const heads = [];
+  lastHead.forEach((h) => {
+    if (h && h.name != '') {
+      heads.push(h);
+    }
+  });
+
+  const tableData = [];
+  for (let i = header; i < rows.length; i++) {
+    const row = rows[i];
+    const data = {};
+    row.forEach((r, y) => {
+      data[dataKeys[y]] = r;
+    });
+    tableData.push(data);
+  }
+
+  return { head: heads, data: tableData };
+}
+
+onMounted(() => {
+  tableHeight.value = calcTableHeight();
+  // handleSearch()
+});
+</script>
diff --git a/src/views/fysp/data-product/components/CompReportDownloadDialog.vue b/src/views/fysp/data-product/components/CompReportDownloadDialog.vue
new file mode 100644
index 0000000..985f669
--- /dev/null
+++ b/src/views/fysp/data-product/components/CompReportDownloadDialog.vue
@@ -0,0 +1,80 @@
+<template>
+  <el-button icon="Download" type="success" @click="dialogVisible = true"
+    >瀵煎嚭鎶ュ憡</el-button
+  >
+  <el-dialog v-model="dialogVisible" :title="name" width="500">
+    <el-text tag="b" size="large">鏁版嵁鑼冨洿纭</el-text>
+    <el-text tag="div">鍖哄煙锛歿{ locationText }}</el-text>
+    <el-text tag="div">绫诲瀷锛歿{ scenetype.label }}</el-text>
+    <el-text tag="div">鏃堕棿锛歿{ timeText }}</el-text>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-row align="middle">
+          <el-checkbox v-model="forceUpdate" label="寮哄埗鐢熸垚鏂版姤鍛�" />
+          <el-tooltip placement="bottom-start" effect="light">
+            <template #content>
+              <el-text tag="b" size="small">涓嶅嬀閫夛細</el-text><br />
+              <el-text size="small"
+                >涓嶅嬀閫夋椂锛屽鏋滃凡鐢熸垚杩囩浉鍚屽尯鍩熺殑鎶ュ憡锛屽垯鐩存帴鑾峰彇璇ヤ唤鎶ュ憡璁板綍</el-text
+              ><br />
+              <el-text tag="b" size="small">鍕鹃�夛細</el-text><br />
+              <el-text size="small"
+                >鍕鹃�夋椂锛屾棤璁烘槸鍚︽湁鍘嗗彶璁板綍锛岄兘浼氬惎鍔ㄦ姤鍛婄敓鎴愪换鍔¤鐩栨棫璁板綍锛屽彲鍦ㄥ悗鍙颁换鍔$晫闈㈡煡鐪嬩换鍔¤繘搴�</el-text
+              ><br />
+            </template>
+            <el-icon
+              class="m-l-8 cursor-p"
+              :size="16"
+              color="var(--el-color-warning)"
+              ><QuestionFilled
+            /></el-icon>
+          </el-tooltip>
+        </el-row>
+        <div>
+          <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+          <el-button type="primary" @click="handleSubmit">纭畾</el-button>
+        </div>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import dayjs from 'dayjs';
+
+export default {
+  props: ['name', 'locations', 'time', 'scenetype'],
+  emits: ['submit'],
+  data() {
+    return {
+      dialogVisible: false,
+      forceUpdate: false
+    };
+  },
+  computed: {
+    locationText() {
+      const loc = this.locations;
+      let text = '';
+      text = loc.pName == loc.cName ? loc.pName : loc.pName + loc.cName;
+      text += loc.dName;
+      return text;
+    },
+    timeText() {
+      return dayjs(this.time).format('YYYY骞碝M鏈�');
+    }
+  },
+  methods: {
+    handleSubmit() {
+      this.$emit('submit', this.forceUpdate);
+    }
+  }
+};
+</script>
+<style scoped>
+.dialog-footer {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  gap: 2px;
+}
+</style>
diff --git a/src/views/fysp/task/TaskManage.vue b/src/views/fysp/task/TaskManage.vue
index 68efe34..5685aa5 100644
--- a/src/views/fysp/task/TaskManage.vue
+++ b/src/views/fysp/task/TaskManage.vue
@@ -39,24 +39,28 @@
           <el-tabs model-value="first">
             <el-tab-pane label="鐩戠璁″垝" name="first">
               <el-row>
-                <el-col :span="curSubTaskList.length > 0 ? 16 : 24">
+                <el-col :span="curSubTaskList ? 16 : 24">
                   <CompMonitorPlan
+                    ref="planRef"
                     :task="curTask.data"
                     @date-change="onDateChange"
                   ></CompMonitorPlan>
                 </el-col>
-                <el-col v-if="curSubTaskList.length > 0" :span="8">
+                <el-col v-if="curSubTaskList" :span="8">
                   <CompSubTaskList
-                    :data="curSubTaskList"
+                    create
+                    v-model="curSubTaskList"
+                    :loading="subTaskLoading"
                     height="56vh"
                     @add="subTaskDrawer = true"
+                    @submit="handleSubtaskSubmit"
                   ></CompSubTaskList>
                 </el-col>
               </el-row>
             </el-tab-pane>
-            <el-tab-pane label="鐩戠鍦板浘" name="second">
+            <!-- <el-tab-pane label="鐩戠鍦板浘" name="second">
               <CompTaskMap></CompTaskMap>
-            </el-tab-pane>
+            </el-tab-pane> -->
           </el-tabs>
         </el-row>
         <el-divider></el-divider>
@@ -91,6 +95,7 @@
     <CompDayTask
       :day-task="curDayTask"
       :mObjList="curMonitorObjList"
+      @submit="handleSubtaskSubmit"
     ></CompDayTask>
   </el-drawer>
   <el-dialog
@@ -177,7 +182,8 @@
       // 褰撳墠閫夋嫨鐨勬棩浠诲姟
       curDayTask: {},
       // 褰撳墠閫夋嫨鐨勬棩浠诲姟涓嬬殑瀛愪换鍔�
-      curSubTaskList: [],
+      curSubTaskList: undefined,
+      subTaskLoading: false,
       // 鎬讳换鍔℃柊澧炲脊鍑烘
       topTaskAddVisible: false
     };
@@ -238,12 +244,12 @@
       this.task = task;
       this.sideLoading = false;
       this.mainLoading = true;
-      this.curSubTaskList = []
+      this.curSubTaskList = undefined;
+      this.curTask = task;
       taskApi
         .fetchMonitorObjectVersion(task.data.tguid)
         .then((res) => {
           this.curMonitorObjList = res;
-          this.curTask = task;
         })
         .finally(() => {
           this.mainLoading = false;
@@ -268,11 +274,19 @@
       });
     },
     onDateChange(dayTask) {
-      // this.subTaskDrawer = true;
-      this.curDayTask = dayTask;
-      taskApi.fetchSubtaskByDayTask(dayTask.guid).then((res) => {
-        this.curSubTaskList = res;
-      });
+      if (dayTask) {
+        this.subTaskLoading = true;
+        // this.subTaskDrawer = true;
+        this.curDayTask = dayTask;
+        taskApi
+          .fetchSubtaskByDayTask(dayTask.guid)
+          .then((res) => {
+            this.curSubTaskList = res;
+          })
+          .finally(() => (this.subTaskLoading = false));
+      } else {
+        this.curSubTaskList = [];
+      }
     },
     navToTaskCreate(value) {
       this.topTaskAddVisible = false;
@@ -282,6 +296,12 @@
           task: encodeURIComponent(JSON.stringify(value))
         }
       });
+    },
+    handleSubtaskSubmit() {
+      this.subTaskLoading = true;
+      this.$refs.planRef
+        .fetchDayTasks()
+        .finally(() => (this.subTaskLoading = false));
     }
   },
   mounted() {
diff --git a/src/views/fysp/task/TaskProxy.js b/src/views/fysp/task/TaskProxy.js
index 076fcbb..7433661 100644
--- a/src/views/fysp/task/TaskProxy.js
+++ b/src/views/fysp/task/TaskProxy.js
@@ -4,5 +4,28 @@
    */
   ceateSubTask(){
 
+  },
+
+  /**
+   * 鏍规嵁澶氶�変笅鎷夋鐨勯�夐」鍊硷紝杩斿洖浠诲姟鎵ц浜哄璞�
+   * @returns 
+   */
+  getExecutors(data, executorOptions) {
+    const ids = [];
+    const uNames = [];
+    const rNames = [];
+    executorOptions.forEach((e) => {
+      const index = data.indexOf(e.value);
+      if (index != -1) {
+        ids.push(e.data.guid);
+        uNames.push(e.data.acountname);
+        rNames.push(e.data.realname);
+      }
+    });
+    return {
+      id: ids.join('#'),
+      uName: uNames.join('#'),
+      rName: rNames.join('#')
+    };
   }
 }
\ No newline at end of file
diff --git a/src/views/fysp/task/components/CompDayTask.vue b/src/views/fysp/task/components/CompDayTask.vue
index db5bab8..15a2797 100644
--- a/src/views/fysp/task/components/CompDayTask.vue
+++ b/src/views/fysp/task/components/CompDayTask.vue
@@ -9,56 +9,40 @@
         :data="seletedSceneList"
         :dayTask="dayTask"
         @delete="deleteScene"
+        @submit="createSubtasks"
       ></CompSubTaskSelect>
       <div>
         <!-- <el-scrollbar height="50vh"> -->
-          <CompMonitorObj :data="curMonitorObjList" height="50vh">
-            <template #default="{ item }">
-              <el-button
-                v-if="item.select"
-                size="small"
-                type="info"
-                plain
-                disabled
-                icon="select"
-                >閫夋嫨</el-button
-              >
-              <el-button
-                v-else
-                size="small"
-                type="primary"
-                plain
-                @click="selectScene(item)"
-                >閫夋嫨</el-button
-              >
-            </template>
-          </CompMonitorObj>
+        <CompMonitorObj :data="curMonitorObjList" height="50vh">
+          <template #default="{ item }">
+            <el-button
+              v-if="item.select"
+              size="small"
+              type="info"
+              plain
+              disabled
+              icon="select"
+              >閫夋嫨</el-button
+            >
+            <el-button
+              v-else
+              size="small"
+              type="primary"
+              plain
+              @click="selectScene(item)"
+              >閫夋嫨</el-button
+            >
+          </template>
+        </CompMonitorObj>
         <!-- </el-scrollbar> -->
       </div>
     </el-col>
     <el-col :span="8">
-      <el-row justify="space-between">
-        <el-text>鍗曟棩璁″垝</el-text>
-        <el-button type="success" size="small" @click="editTask"
-          >鏂板</el-button
-        >
-      </el-row>
-      <el-divider />
-      <div>
-        <el-scrollbar :height="height">
-          <ItemSubTask
-            v-for="stask in curSubTaskList"
-            :key="stask.guid"
-            :item="stask"
-          >
-            <template #default="{ item }">
-              <el-button type="danger" size="small" @click="editTask"
-                >绉婚櫎</el-button
-              >
-            </template>
-          </ItemSubTask>
-        </el-scrollbar>
-      </div>
+      <CompSubTaskList
+        v-model="curSubTaskList"
+        :height="height"
+        @submit="deleteSubtasks"
+      ></CompSubTaskList>
     </el-col>
   </el-row>
 </template>
@@ -66,11 +50,15 @@
 import { ref, watch, onMounted } from 'vue';
 import { useCloned } from '@vueuse/core';
 import { useRoute, useRouter } from 'vue-router';
+import { ElMessage, ElNotification, ElMessageBox } from 'element-plus';
 import taskApi from '@/api/fysp/taskApi';
+import subtaskApi from '@/api/fysp/subtaskApi';
 import TaskProxy from '../TaskProxy';
 
 import CompMonitorObj from './CompMonitorObj.vue';
 import CompSubTaskSelect from './CompSubTaskSelect.vue';
+import CompSubTaskList from './CompSubTaskList.vue';
+import dayjs from 'dayjs';
 
 const route = useRoute();
 
@@ -79,6 +67,8 @@
   dayTask: Object,
   mObjList: Array
 });
+
+const emit = defineEmits(['submit'])
 
 /*************************** 鏁版嵁鍒濆鍖� ************************************/
 // 宸℃煡瀛愪换鍔¢泦鍚�
@@ -137,5 +127,62 @@
   const index = seletedSceneList.value.indexOf(item);
   seletedSceneList.value.splice(index, 1);
 }
+
+function createSubtasks(executors) {
+  const dt = props.dayTask;
+  const subtasks = seletedSceneList.value.map((_) => {
+    const s = _.scene;
+    return {
+      // 涓婚敭鐢辨湇鍔$鍒涘缓
+      stguid: undefined,
+      tguid: dt.tsGuid,
+      tsguid: dt.guid,
+      name: `${s.name}宸℃煡`,
+      typeno: 1,
+      type: '宸℃煡',
+      provincecode: s.provincecode,
+      provincename: s.provincename,
+      citycode: s.citycode,
+      cityname: s.cityname,
+      districtcode: s.districtcode,
+      districtname: s.districtname,
+      scensename: s.name,
+      scenseid: s.guid,
+      scenseaddress: s.location,
+      planstarttime: dt.date,
+      planendtime: dayjs(dt.date).endOf('day').set('millisecond', 0).toDate(),
+      deployerguid: 'rAR0A4gJdlOZEqZs',
+      deployerusername: 'ccheck',
+      deployerrealname: '鏁存敼瀹℃牳',
+      executorguids: executors.ids,
+      executorusernames: executors.uName,
+      executorrealtimes: executors.rName,
+      status: '鏈墽琛�',
+      remark: undefined
+    };
+  });
+
+  // 鏇存柊鍦烘櫙鐩戠娆℃暟
+  seletedSceneList.value.forEach((s) => {
+    s.extension1 = s.extension1 ? parseInt(s.extension1) + 1 + '' : '1';
+  });
+  taskApi.updateMonitorObject(seletedSceneList.value).then((res) => {
+    if (res > 0) {
+      subtaskApi.putSubtasks(subtasks).then((res) => {
+        seletedSceneList.value = [];
+        fetchSubTask(props.dayTask.guid);
+        ElMessage({
+          message: '宸℃煡浠诲姟娣诲姞鎴愬姛',
+          type: 'success'
+        });
+        emit('submit')
+      });
+    }
+  });
+}
+
+function deleteSubtasks() {
+  emit('submit')
+}
 </script>
 <style scoped></style>
diff --git a/src/views/fysp/task/components/CompMonitorPlan.vue b/src/views/fysp/task/components/CompMonitorPlan.vue
index e59c37a..5b86666 100644
--- a/src/views/fysp/task/components/CompMonitorPlan.vue
+++ b/src/views/fysp/task/components/CompMonitorPlan.vue
@@ -22,15 +22,15 @@
           <el-row justify="space-between" class="m-t-16">
             <el-space direction="vertical">
               <el-text size="small">鎬昏</el-text>
-              <el-text>{{computeDayTask(data.day).totalTaskNum}}</el-text>
+              <el-text>{{ computeDayTask(data.day).totalTaskNum }}</el-text>
             </el-space>
             <el-space direction="vertical">
               <el-text size="small">瀹屾垚</el-text>
-              <el-text>{{computeDayTask(data.day).completeTaskNum}}</el-text>
+              <el-text>{{ computeDayTask(data.day).completeTaskNum }}</el-text>
             </el-space>
             <el-space direction="vertical">
               <el-text size="small">鏁存敼</el-text>
-              <el-text>{{computeDayTask(data.day).changedTaskNum}}</el-text>
+              <el-text>{{ computeDayTask(data.day).changedTaskNum }}</el-text>
             </el-space>
             <!-- <el-statistic title="鎬昏" :value="computeDayTask(data.day).totalTaskNum" />
             <el-statistic title="瀹屾垚" :value="computeDayTask(data.day).completeTaskNum" />
@@ -55,9 +55,9 @@
     default: () => {}
   }
 });
-const emit = defineEmits(['dateChange'])
+const emit = defineEmits(['dateChange']);
 // 閫変腑鏃ユ湡
-const dateValue = ref(new Date());
+const dateValue = ref();
 // 鏃ュ巻鏍囬
 const title = computed(() => {
   if (props.task) {
@@ -70,18 +70,27 @@
 // 鏃ュ巻鑼冨洿
 const startDay = computed(() => dayjs(props.task.starttime));
 const endDay = computed(() => dayjs(props.task.endtime));
-const dateRange = computed(() => [startDay.value.toDate(), endDay.value.toDate()]);
+const dateRange = computed(() => [
+  startDay.value.toDate(),
+  endDay.value.toDate()
+]);
 // const dateRange = computed(() => [new Date(2024, 4, 27), new Date(2024, 5, 30)]);
 
 // 鏃ユ湡鏄惁鍦ㄤ换鍔¤寖鍥村唴
 function isDayEnable(day) {
   const _day = dayjs(day);
-  return _day.isSameOrAfter(startDay.value, 'day') && _day.isSameOrBefore(endDay.value, 'day');
+  return (
+    _day.isSameOrAfter(startDay.value, 'day') &&
+    _day.isSameOrBefore(endDay.value, 'day')
+  );
 }
 
 /********************** 鏃ユ湡鏍峰紡 *********************************/
 function calendarDayClz(day) {
-  return 'calendar-day ' + (isDayEnable(day) ? 'calendar-day-enable' : 'calendar-day-disable');
+  return (
+    'calendar-day ' +
+    (isDayEnable(day) ? 'calendar-day-enable' : 'calendar-day-disable')
+  );
 }
 function getDay(day) {
   return day.split('-').splice(1, 2).join('-');
@@ -92,12 +101,16 @@
 // 鑾峰彇鏃ヤ换鍔$粺璁′俊鎭�
 const dayTaskLoading = ref(false);
 const dayTaskList = ref([]);
-function fetchDayTasks(topTaskId) {
+function fetchDayTasks() {
   dayTaskLoading.value = true;
-  taskApi
-    .fetchDayTasks(topTaskId)
+  return taskApi
+    .fetchDayTasks(props.task.tguid)
     .then((res) => {
       dayTaskList.value = res;
+      // 濡傛灉宸查�夋棩鏈熷瓨鍦紝鍦ㄩ噸鏂拌幏鍙栨棩浠诲姟缁熻淇℃伅鍚庯紝鍐嶆瑙﹀彂鐐瑰嚮浜嬩欢
+      if (dateValue.value) {
+        onDateChange(dateValue.value) 
+      }
     })
     .finally(() => (dayTaskLoading.value = false));
 }
@@ -119,11 +132,11 @@
 }
 
 function onDateChange(e) {
-  const day = dayjs(e).format('YYYY-MM-DD')
-  const t = computeDayTask(day)
-  console.log(t);
-  
-  emit('dateChange', t)
+  if (isDayEnable(e)) {
+    const day = dayjs(e).format('YYYY-MM-DD');
+    const t = computeDayTask(day);
+    emit('dateChange', t);
+  }
 }
 
 // 鎬讳换鍔$粺璁�
@@ -141,12 +154,14 @@
 watch(
   () => props.task,
   (nV) => {
-    if (nV.tguid) {
-      fetchDayTasks(nV.tguid);      
+    if (nV && nV.tguid) {
+      fetchDayTasks();
     }
   },
   { immediate: true }
 );
+
+defineExpose({ fetchDayTasks });
 </script>
 <style scoped>
 .li-01 {
@@ -185,7 +200,7 @@
   border: 1px solid rgb(172, 165, 165);
   border-radius: 50%; */
   padding: 8px;
-  height: var(--el-calendar-cell-width);
+  /* min-height: var(--el-calendar-cell-width); */
 }
 
 .calendar-day-enable {
diff --git a/src/views/fysp/task/components/CompSubTaskEdit.vue b/src/views/fysp/task/components/CompSubTaskEdit.vue
new file mode 100644
index 0000000..f80a20a
--- /dev/null
+++ b/src/views/fysp/task/components/CompSubTaskEdit.vue
@@ -0,0 +1,170 @@
+<template>
+  <FYForm
+    ref="formRef"
+    :form-info="formInfo"
+    :rules="rules"
+    :useCancel="true"
+    @submit="submit"
+    @cancel="cancel"
+  >
+    <template #form-item="{ formObj }">
+      <el-form-item label="浠诲姟鍚嶇О" prop="name">
+        <el-input disabled v-model="formObj.name" placeholder="浠诲姟鍚嶇О" />
+      </el-form-item>
+      <el-form-item label="鍦烘櫙鍦板潃" prop="name">
+        <el-input
+          disabled
+          v-model="formObj.scenseaddress"
+          placeholder="鍦烘櫙鍦板潃"
+        />
+      </el-form-item>
+      <FYOptionTime
+        label="璁″垝鏃堕棿"
+        prop="planstarttime"
+        :initValue="false"
+        type="date"
+        v-model:value="formObj.planstarttime"
+        @change="handleTimeChange"
+      ></FYOptionTime>
+      <el-form-item label="鎵ц浜�" prop="_executors">
+        <el-select
+          v-model="formObj._executors"
+          multiple
+          clearable
+          collapse-tags
+          placeholder="閫夋嫨鎵ц浜�"
+          :max-collapse-tags="3"
+          style="width: 300px"
+        >
+          <el-option
+            v-for="s in executorOptions"
+            :key="s.value"
+            :label="s.label"
+            :value="s.value"
+          />
+        </el-select>
+      </el-form-item>
+    </template>
+  </FYForm>
+</template>
+<script setup>
+import { ref, computed, onMounted, reactive } from 'vue';
+import subtaskApi from '@/api/fysp/subtaskApi';
+import userApi from '@/api/fysp/userApi';
+import dayjs from 'dayjs';
+
+const props = defineProps({
+  //鍩烘湰淇℃伅
+  modelValue: Object,
+  //鏄垱寤烘垨鑰呮洿鏂�
+  create: Boolean
+});
+
+const emit = defineEmits(['submit', 'cancel', 'update:modelValue']);
+
+const formRef = ref(null);
+// 浠诲姟鎵ц浜洪�夐」
+const executorOptions = ref([]);
+const formInfo = computed(() => {
+  return {
+    ...props.modelValue,
+    _executors: props.modelValue
+      ? props.modelValue.executorguids.split('#')
+      : []
+  };
+});
+
+const rules = reactive({
+  name: [
+    {
+      required: true,
+      message: '鍦烘櫙鍚嶇О涓嶈兘涓虹┖',
+      trigger: 'blur'
+    }
+  ],
+  _scenetype: [
+    {
+      required: true,
+      message: '鍦烘櫙绫诲瀷涓嶈兘涓虹┖',
+      trigger: 'change'
+    }
+  ]
+});
+
+function handleTimeChange(time) {
+  formRef.value.formObj.planendtime = dayjs(time).endOf('day').set('millisecond', 0)
+}
+
+function getExecutors(data) {
+  const ids = [];
+  const uNames = [];
+  const rNames = [];
+  executorOptions.value.forEach((e) => {
+    const index = data._executors.indexOf(e.value);
+    if (index != -1) {
+      ids.push(e.data.guid);
+      uNames.push(e.data.acountname);
+      rNames.push(e.data.realname);
+    }
+  });
+  return {
+    id: ids.join('#'),
+    uName: uNames.join('#'),
+    rName: rNames.join('#')
+  };
+}
+
+// 鍒涘缓鏂板満鏅�
+function createScene(v, success, fail) {
+  // return sceneApi
+  //   .createScene(v)
+  //   .then(() => {
+  //     emit('onSubmit', v);
+  //     success();
+  //   })
+  //   .catch((err) => {
+  //     fail(err);
+  //   });
+}
+// 鏇存柊鍦烘櫙
+function updateScene(v, success, fail) {
+  return subtaskApi
+    .adjustSubtask(v)
+    .then(() => {
+      emit('update:modelValue', v)
+      emit('submit', v);
+      success();
+    })
+    .catch((err) => {
+      fail(err);
+    });
+}
+function submit(v, success, fail) {
+  const executors = getExecutors(v.value);
+  v.value.executorguids = executors.id
+  v.value.executorusernames = executors.uName
+  v.value.executorrealtimes = executors.rName
+  return props.create
+    ? createScene(v.value, success, fail)
+    : updateScene(v.value, success, fail);
+}
+function cancel() {
+  emit('cancel');
+}
+
+function initOptions() {
+  userApi.getUserByType(1).then((res) => {
+    executorOptions.value = res.map((v) => {
+      return {
+        label: v.realname,
+        value: v.guid,
+        data: v
+      };
+    });
+  });
+}
+
+onMounted(() => {
+  initOptions();
+});
+</script>
diff --git a/src/views/fysp/task/components/CompSubTaskList.vue b/src/views/fysp/task/components/CompSubTaskList.vue
index d6cc205..ef20ca8 100644
--- a/src/views/fysp/task/components/CompSubTaskList.vue
+++ b/src/views/fysp/task/components/CompSubTaskList.vue
@@ -1,42 +1,137 @@
 <template>
   <el-row justify="space-between">
     <el-text>鍗曟棩璁″垝</el-text>
-    <el-button type="success" size="small" @click="add">鏂板</el-button>
+    <el-button
+      v-show="create && data && data.length > 0"
+      type="success"
+      size="small"
+      @click="add"
+      >浠诲姟璋冩暣</el-button
+    >
   </el-row>
   <el-divider />
   <div>
-    <el-scrollbar :height="height">
-      <el-space fill direction="vertical">
+    <el-scrollbar v-loading="loading" :height="height">
+      <el-space
+        v-if="data && data.length > 0"
+        fill
+        :fill-ratio="100"
+        direction="vertical"
+        style="width: 100%"
+      >
         <ItemSubTask v-for="s in data" :key="s.guid" :item="s">
           <template #default="{ item }">
-            <el-button type="danger" size="small" @click="remove(item)"
-              >绉婚櫎</el-button
-            >
+            <el-space direction="vertical">
+              <el-button
+                :disabled="item.status != '鏈墽琛�'"
+                plain
+                type="primary"
+                size="small"
+                @click="edit(item)"
+                >缂栬緫</el-button
+              >
+              <el-button
+                :disabled="item.status != '鏈墽琛�'"
+                type="default"
+                size="small"
+                @click="remove(item)"
+                >绉婚櫎</el-button
+              >
+            </el-space>
           </template>
         </ItemSubTask>
       </el-space>
+      <div v-else>
+        <el-empty description="鏃犱换鍔¤褰�" />
+        <el-row v-if="create" justify="center">
+          <el-button type="success" size="small" @click="add"
+            >娣诲姞浠诲姟</el-button
+          >
+        </el-row>
+      </div>
     </el-scrollbar>
   </div>
+  <el-dialog
+    v-model="dialogVisible"
+    width="600"
+    title="宸℃煡浠诲姟缂栬緫"
+    destroy-on-close
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :show-close="false"
+  >
+    <CompSubTaskEdit
+      v-model="activeItem"
+      @submit="onEditSubmit"
+      @cancel="dialogVisible = false"
+    ></CompSubTaskEdit>
+  </el-dialog>
 </template>
 <script setup>
-import { ref, watch, onMounted } from 'vue';
+import { ref, computed, watch, onMounted, onUnmounted } from 'vue';
+import { ElMessageBox, ElNotification, ElMessage } from 'element-plus';
+import CompSubTaskEdit from './CompSubTaskEdit.vue';
+import subtaskApi from '@/api/fysp/subtaskApi';
 
 const props = defineProps({
-  data: Array,
+  modelValue: Array,
   height: {
     type: String,
     default: '70vh'
-  }
+  },
+  // 鏄惁鏄剧ず娣诲姞浠诲姟鎸夐挳
+  create: Boolean,
+  loading: Boolean
 });
-const curSubTaskList = ref([]);
 
-const emit = defineEmits(['add', 'remove']);
+const dialogVisible = ref(false);
+const activeItem = ref(null);
+const data = computed(() => props.modelValue);
+
+const emit = defineEmits(['submit', 'add', 'remove', 'update:modelValue']);
 
 function remove(item) {
-  emit('remove', item);
+  if (item.status == '鏈墽琛�') {
+    ElMessageBox.confirm('鏄惁绉婚櫎鐩戠浠诲姟', `绉婚櫎纭`, {
+      confirmButtonText: '纭',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning'
+    }).then(() => {
+      return subtaskApi.deleteSubtask(item.stguid).then(res=>{
+        if (res == 1) {
+          const index = data.value.indexOf(item);
+          data.value.splice(index, 1); 
+
+          emit('update:modelValue', data.value);
+          emit('remove', item);
+        } else {
+          Promise.reject('鍒犻櫎宸℃煡浠诲姟澶辫触')
+        }
+      })
+    });
+  }
+}
+
+function edit(item) {
+  activeItem.value = item;
+  dialogVisible.value = true;
+}
+
+function onEditSubmit(item) {
+  dialogVisible.value = false;
+  const index = data.value.findIndex((v) => {
+    return item.stguid == v.stguid;
+  });
+  data.value.splice(index, 1, item);
+  emit('update:modelValue', data.value);
+  emit('submit');
 }
 
 function add() {
   emit('add');
 }
+
+onUnmounted(() => {
+  dialogVisible.value = false;
+});
 </script>
diff --git a/src/views/fysp/task/components/CompSubTaskSelect.vue b/src/views/fysp/task/components/CompSubTaskSelect.vue
index cdf66b9..53a4e03 100644
--- a/src/views/fysp/task/components/CompSubTaskSelect.vue
+++ b/src/views/fysp/task/components/CompSubTaskSelect.vue
@@ -73,6 +73,7 @@
 import { ref, reactive, watch, computed, onMounted } from 'vue';
 import { ElMessageBox, ElNotification, ElMessage } from 'element-plus';
 import taskApi from '@/api/fysp/taskApi';
+import TaskProxy from '../TaskProxy';
 
 onMounted(() => {
   // if (props.height) {
@@ -91,7 +92,7 @@
   dayTask: Object
 });
 
-const emit = defineEmits(['delete']);
+const emit = defineEmits(['submit', 'delete']);
 
 const scrollHeight = ref('14vh');
 
@@ -120,6 +121,9 @@
     fail('鏈�夋嫨鐩戠鍦烘櫙');
   } else {
     success();
+    // 灏嗕换鍔℃墽琛屼汉鏍煎紡鍖栧苟浼犻��
+    const param = TaskProxy.getExecutors(v.value.executor, executors.value)
+    emit('submit', param)
   }
 }
 
diff --git a/src/views/fysp/task/components/CompTaskEdit.vue b/src/views/fysp/task/components/CompTaskEdit.vue
index 3058aec..6833d9f 100644
--- a/src/views/fysp/task/components/CompTaskEdit.vue
+++ b/src/views/fysp/task/components/CompTaskEdit.vue
@@ -87,7 +87,7 @@
       <el-form-item>
         <el-row justify="center">
           <el-link type="primary" @click="showMore = !showMore">
-            {{ showMore ? '鏀惰捣' : '鏌ョ湅鏇村閫夐」' }}
+            {{ showMore ? '鏀惰捣' : '鏇村閫夐」' }}
             <el-icon v-if="showMore"><ArrowUp /></el-icon>
             <el-icon v-else><ArrowDown /></el-icon>
           </el-link>

--
Gitblit v1.9.3