Просмотр исходного кода

Merge branch 'zdnew' into 'master'

场景模块

See merge request tian-group/skyeye-admin-fe!7
楼航飞 2 лет назад
Родитель
Сommit
1adbe086e4

+ 1 - 1
package.json

@@ -108,7 +108,7 @@
     "tailwindcss": "3.3.2",
     "ts-node": "10.9.1",
     "typescript": "4.7.4",
-    "vite": "3.2.7",
+    "vite": "5.0.10",
     "vite-plugin-compression": "0.5.1",
     "vite-plugin-html": "3.2.0",
     "vite-plugin-mock": "2.9.6",

+ 394 - 242
pnpm-lock.yaml

@@ -87,7 +87,7 @@ dependencies:
     specifier: 3.3.4
     version: 3.3.4
   vue-hooks-plus:
-    specifier: ^1.8.6
+    specifier: 1.8.6
     version: 1.8.6(vue@3.3.4)
   vue-router:
     specifier: 4.1.2
@@ -132,7 +132,7 @@ devDependencies:
     version: 5.30.7(eslint@8.20.0)(typescript@4.7.4)
   '@vitejs/plugin-vue':
     specifier: 2.3.3
-    version: 2.3.3(vite@3.2.7)(vue@3.3.4)
+    version: 2.3.3(vite@5.0.10)(vue@3.3.4)
   '@vitejs/plugin-vue-jsx':
     specifier: 1.3.10
     version: 1.3.10
@@ -233,23 +233,23 @@ devDependencies:
     specifier: 4.7.4
     version: 4.7.4
   vite:
-    specifier: 3.2.7
-    version: 3.2.7(@types/node@17.0.45)(sass@1.53.0)
+    specifier: 5.0.10
+    version: 5.0.10(@types/node@17.0.45)(sass@1.53.0)
   vite-plugin-compression:
     specifier: 0.5.1
-    version: 0.5.1(vite@3.2.7)
+    version: 0.5.1(vite@5.0.10)
   vite-plugin-html:
     specifier: 3.2.0
-    version: 3.2.0(vite@3.2.7)
+    version: 3.2.0(vite@5.0.10)
   vite-plugin-mock:
     specifier: 2.9.6
-    version: 2.9.6(mockjs@1.1.0)(vite@3.2.7)
+    version: 2.9.6(mockjs@1.1.0)(vite@5.0.10)
   vite-plugin-style-import:
     specifier: 2.0.0
-    version: 2.0.0(vite@3.2.7)
+    version: 2.0.0(vite@5.0.10)
   vite-plugin-vue-setup-extend:
     specifier: 0.4.0
-    version: 0.4.0(vite@3.2.7)
+    version: 0.4.0(vite@5.0.10)
   vue-eslint-parser:
     specifier: 9.0.3
     version: 9.0.3(eslint@8.20.0)
@@ -788,8 +788,26 @@ packages:
       get-tsconfig: 4.2.0
     dev: true
 
-  /@esbuild/android-arm@0.15.14:
-    resolution: {integrity: sha512-+Rb20XXxRGisNu2WmNKk+scpanb7nL5yhuI1KR9wQFiC43ddPj/V1fmNyzlFC9bKiG4mYzxW7egtoHVcynr+OA==}
+  /@esbuild/aix-ppc64@0.19.10:
+    resolution: {integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [aix]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm64@0.19.10:
+    resolution: {integrity: sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm@0.19.10:
+    resolution: {integrity: sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [android]
@@ -797,6 +815,78 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/android-x64@0.19.10:
+    resolution: {integrity: sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-arm64@0.19.10:
+    resolution: {integrity: sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-x64@0.19.10:
+    resolution: {integrity: sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-arm64@0.19.10:
+    resolution: {integrity: sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-x64@0.19.10:
+    resolution: {integrity: sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm64@0.19.10:
+    resolution: {integrity: sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm@0.19.10:
+    resolution: {integrity: sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ia32@0.19.10:
+    resolution: {integrity: sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@esbuild/linux-loong64@0.14.54:
     resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==}
     engines: {node: '>=12'}
@@ -806,8 +896,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-loong64@0.15.14:
-    resolution: {integrity: sha512-eQi9rosGNVQFJyJWV0HCA5WZae/qWIQME7s8/j8DMvnylfBv62Pbu+zJ2eUDqNf2O4u3WB+OEXyfkpBoe194sg==}
+  /@esbuild/linux-loong64@0.19.10:
+    resolution: {integrity: sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==}
     engines: {node: '>=12'}
     cpu: [loong64]
     os: [linux]
@@ -815,6 +905,105 @@ packages:
     dev: true
     optional: true
 
+  /@esbuild/linux-mips64el@0.19.10:
+    resolution: {integrity: sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ppc64@0.19.10:
+    resolution: {integrity: sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-riscv64@0.19.10:
+    resolution: {integrity: sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-s390x@0.19.10:
+    resolution: {integrity: sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-x64@0.19.10:
+    resolution: {integrity: sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/netbsd-x64@0.19.10:
+    resolution: {integrity: sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/openbsd-x64@0.19.10:
+    resolution: {integrity: sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/sunos-x64@0.19.10:
+    resolution: {integrity: sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-arm64@0.19.10:
+    resolution: {integrity: sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32@0.19.10:
+    resolution: {integrity: sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-x64@0.19.10:
+    resolution: {integrity: sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@eslint/eslintrc@1.3.0:
     resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -997,6 +1186,110 @@ packages:
       picomatch: 2.3.1
     dev: true
 
+  /@rollup/rollup-android-arm-eabi@4.9.1:
+    resolution: {integrity: sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-android-arm64@4.9.1:
+    resolution: {integrity: sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-darwin-arm64@4.9.1:
+    resolution: {integrity: sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-darwin-x64@4.9.1:
+    resolution: {integrity: sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm-gnueabihf@4.9.1:
+    resolution: {integrity: sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm64-gnu@4.9.1:
+    resolution: {integrity: sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm64-musl@4.9.1:
+    resolution: {integrity: sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-riscv64-gnu@4.9.1:
+    resolution: {integrity: sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-x64-gnu@4.9.1:
+    resolution: {integrity: sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-x64-musl@4.9.1:
+    resolution: {integrity: sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-arm64-msvc@4.9.1:
+    resolution: {integrity: sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-ia32-msvc@4.9.1:
+    resolution: {integrity: sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-x64-msvc@4.9.1:
+    resolution: {integrity: sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@sxzz/popperjs-es@2.11.7:
     resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
     dev: false
@@ -1297,14 +1590,14 @@ packages:
       - supports-color
     dev: true
 
-  /@vitejs/plugin-vue@2.3.3(vite@3.2.7)(vue@3.3.4):
+  /@vitejs/plugin-vue@2.3.3(vite@5.0.10)(vue@3.3.4):
     resolution: {integrity: sha512-SmQLDyhz+6lGJhPELsBdzXGc+AcaT8stgkbiTFGpXPe8Tl1tJaBw1A6pxDqDuRsVkD8uscrkx3hA7QDOoKYtyw==}
     engines: {node: '>=12.0.0'}
     peerDependencies:
       vite: ^2.5.10
       vue: ^3.2.25
     dependencies:
-      vite: 3.2.7(@types/node@17.0.45)(sass@1.53.0)
+      vite: 5.0.10(@types/node@17.0.45)(sass@1.53.0)
       vue: 3.3.4
     dev: true
 
@@ -3016,15 +3309,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-android-64@0.15.14:
-    resolution: {integrity: sha512-HuilVIb4rk9abT4U6bcFdU35UHOzcWVGLSjEmC58OVr96q5UiRqzDtWjPlCMugjhgUGKEs8Zf4ueIvYbOStbIg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-android-arm64@0.14.54:
     resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==}
     engines: {node: '>=12'}
@@ -3034,15 +3318,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-android-arm64@0.15.14:
-    resolution: {integrity: sha512-/QnxRVxsR2Vtf3XottAHj7hENAMW2wCs6S+OZcAbc/8nlhbAL/bCQRCVD78VtI5mdwqWkVi3wMqM94kScQCgqg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-darwin-64@0.14.54:
     resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==}
     engines: {node: '>=12'}
@@ -3052,15 +3327,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-darwin-64@0.15.14:
-    resolution: {integrity: sha512-ToNuf1uifu8hhwWvoZJGCdLIX/1zpo8cOGnT0XAhDQXiKOKYaotVNx7pOVB1f+wHoWwTLInrOmh3EmA7Fd+8Vg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-darwin-arm64@0.14.54:
     resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==}
     engines: {node: '>=12'}
@@ -3070,15 +3336,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-darwin-arm64@0.15.14:
-    resolution: {integrity: sha512-KgGP+y77GszfYJgceO0Wi/PiRtYo5y2Xo9rhBUpxTPaBgWDJ14gqYN0+NMbu+qC2fykxXaipHxN4Scaj9tUS1A==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-freebsd-64@0.14.54:
     resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==}
     engines: {node: '>=12'}
@@ -3088,15 +3345,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-freebsd-64@0.15.14:
-    resolution: {integrity: sha512-xr0E2n5lyWw3uFSwwUXHc0EcaBDtsal/iIfLioflHdhAe10KSctV978Te7YsfnsMKzcoGeS366+tqbCXdqDHQA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-freebsd-arm64@0.14.54:
     resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==}
     engines: {node: '>=12'}
@@ -3106,15 +3354,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-freebsd-arm64@0.15.14:
-    resolution: {integrity: sha512-8XH96sOQ4b1LhMlO10eEWOjEngmZ2oyw3pW4o8kvBcpF6pULr56eeYVP5radtgw54g3T8nKHDHYEI5AItvskZg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-32@0.14.54:
     resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==}
     engines: {node: '>=12'}
@@ -3124,15 +3363,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-32@0.15.14:
-    resolution: {integrity: sha512-6ssnvwaTAi8AzKN8By2V0nS+WF5jTP7SfuK6sStGnDP7MCJo/4zHgM9oE1eQTS2jPmo3D673rckuCzRlig+HMA==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-64@0.14.54:
     resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==}
     engines: {node: '>=12'}
@@ -3142,15 +3372,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-64@0.15.14:
-    resolution: {integrity: sha512-ONySx3U0wAJOJuxGUlXBWxVKFVpWv88JEv0NZ6NlHknmDd1yCbf4AEdClSgLrqKQDXYywmw4gYDvdLsS6z0hcw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-arm64@0.14.54:
     resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==}
     engines: {node: '>=12'}
@@ -3160,15 +3381,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-arm64@0.15.14:
-    resolution: {integrity: sha512-kle2Ov6a1e5AjlHlMQl1e+c4myGTeggrRzArQFmWp6O6JoqqB9hT+B28EW4tjFWgV/NxUq46pWYpgaWXsXRPAg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-arm@0.14.54:
     resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==}
     engines: {node: '>=12'}
@@ -3178,15 +3390,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-arm@0.15.14:
-    resolution: {integrity: sha512-D2LImAIV3QzL7lHURyCHBkycVFbKwkDb1XEUWan+2fb4qfW7qAeUtul7ZIcIwFKZgPcl+6gKZmvLgPSj26RQ2Q==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-mips64le@0.14.54:
     resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==}
     engines: {node: '>=12'}
@@ -3196,15 +3399,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-mips64le@0.15.14:
-    resolution: {integrity: sha512-FVdMYIzOLXUq+OE7XYKesuEAqZhmAIV6qOoYahvUp93oXy0MOVTP370ECbPfGXXUdlvc0TNgkJa3YhEwyZ6MRA==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-ppc64le@0.14.54:
     resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==}
     engines: {node: '>=12'}
@@ -3214,15 +3408,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-ppc64le@0.15.14:
-    resolution: {integrity: sha512-2NzH+iuzMDA+jjtPjuIz/OhRDf8tzbQ1tRZJI//aT25o1HKc0reMMXxKIYq/8nSHXiJSnYV4ODzTiv45s+h73w==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-riscv64@0.14.54:
     resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==}
     engines: {node: '>=12'}
@@ -3232,15 +3417,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-riscv64@0.15.14:
-    resolution: {integrity: sha512-VqxvutZNlQxmUNS7Ac+aczttLEoHBJ9e3OYGqnULrfipRvG97qLrAv9EUY9iSrRKBqeEbSvS9bSfstZqwz0T4Q==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-linux-s390x@0.14.54:
     resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==}
     engines: {node: '>=12'}
@@ -3250,15 +3426,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-linux-s390x@0.15.14:
-    resolution: {integrity: sha512-+KVHEUshX5n6VP6Vp/AKv9fZIl5kr2ph8EUFmQUJnDpHwcfTSn2AQgYYm0HTBR2Mr4d0Wlr0FxF/Cs5pbFgiOw==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-netbsd-64@0.14.54:
     resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==}
     engines: {node: '>=12'}
@@ -3268,15 +3435,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-netbsd-64@0.15.14:
-    resolution: {integrity: sha512-6D/dr17piEgevIm1xJfZP2SjB9Z+g8ERhNnBdlZPBWZl+KSPUKLGF13AbvC+nzGh8IxOH2TyTIdRMvKMP0nEzQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-openbsd-64@0.14.54:
     resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==}
     engines: {node: '>=12'}
@@ -3286,15 +3444,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-openbsd-64@0.15.14:
-    resolution: {integrity: sha512-rREQBIlMibBetgr2E9Lywt2Qxv2ZdpmYahR4IUlAQ1Efv/A5gYdO0/VIN3iowDbCNTLxp0bb57Vf0LFcffD6kA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-sunos-64@0.14.54:
     resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==}
     engines: {node: '>=12'}
@@ -3304,15 +3453,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-sunos-64@0.15.14:
-    resolution: {integrity: sha512-DNVjSp/BY4IfwtdUAvWGIDaIjJXY5KI4uD82+15v6k/w7px9dnaDaJJ2R6Mu+KCgr5oklmFc0KjBjh311Gxl9Q==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-windows-32@0.14.54:
     resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==}
     engines: {node: '>=12'}
@@ -3322,15 +3462,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-32@0.15.14:
-    resolution: {integrity: sha512-pHBWrcA+/oLgvViuG9FO3kNPO635gkoVrRQwe6ZY1S0jdET07xe2toUvQoJQ8KT3/OkxqUasIty5hpuKFLD+eg==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-windows-64@0.14.54:
     resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==}
     engines: {node: '>=12'}
@@ -3340,15 +3471,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-64@0.15.14:
-    resolution: {integrity: sha512-CszIGQVk/P8FOS5UgAH4hKc9zOaFo69fe+k1rqgBHx3CSK3Opyk5lwYriIamaWOVjBt7IwEP6NALz+tkVWdFog==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild-windows-arm64@0.14.54:
     resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==}
     engines: {node: '>=12'}
@@ -3358,15 +3480,6 @@ packages:
     dev: true
     optional: true
 
-  /esbuild-windows-arm64@0.15.14:
-    resolution: {integrity: sha512-KW9W4psdZceaS9A7Jsgl4WialOznSURvqX/oHZk3gOP7KbjtHLSsnmSvNdzagGJfxbAe30UVGXRe8q8nDsOSQw==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild@0.11.3:
     resolution: {integrity: sha512-BzVRHcCtFepjS9WcqRjqoIxLqgpK21a8J4Zi4msSGxDxiXVO1IbcqT1KjhdDDnJxKfe7bvzZrvMEX+bVO0Elcw==}
     hasBin: true
@@ -3402,34 +3515,35 @@ packages:
       esbuild-windows-arm64: 0.14.54
     dev: true
 
-  /esbuild@0.15.14:
-    resolution: {integrity: sha512-pJN8j42fvWLFWwSMG4luuupl2Me7mxciUOsMegKvwCmhEbJ2covUdFnihxm0FMIBV+cbwbtMoHgMCCI+pj1btQ==}
+  /esbuild@0.19.10:
+    resolution: {integrity: sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==}
     engines: {node: '>=12'}
     hasBin: true
     requiresBuild: true
     optionalDependencies:
-      '@esbuild/android-arm': 0.15.14
-      '@esbuild/linux-loong64': 0.15.14
-      esbuild-android-64: 0.15.14
-      esbuild-android-arm64: 0.15.14
-      esbuild-darwin-64: 0.15.14
-      esbuild-darwin-arm64: 0.15.14
-      esbuild-freebsd-64: 0.15.14
-      esbuild-freebsd-arm64: 0.15.14
-      esbuild-linux-32: 0.15.14
-      esbuild-linux-64: 0.15.14
-      esbuild-linux-arm: 0.15.14
-      esbuild-linux-arm64: 0.15.14
-      esbuild-linux-mips64le: 0.15.14
-      esbuild-linux-ppc64le: 0.15.14
-      esbuild-linux-riscv64: 0.15.14
-      esbuild-linux-s390x: 0.15.14
-      esbuild-netbsd-64: 0.15.14
-      esbuild-openbsd-64: 0.15.14
-      esbuild-sunos-64: 0.15.14
-      esbuild-windows-32: 0.15.14
-      esbuild-windows-64: 0.15.14
-      esbuild-windows-arm64: 0.15.14
+      '@esbuild/aix-ppc64': 0.19.10
+      '@esbuild/android-arm': 0.19.10
+      '@esbuild/android-arm64': 0.19.10
+      '@esbuild/android-x64': 0.19.10
+      '@esbuild/darwin-arm64': 0.19.10
+      '@esbuild/darwin-x64': 0.19.10
+      '@esbuild/freebsd-arm64': 0.19.10
+      '@esbuild/freebsd-x64': 0.19.10
+      '@esbuild/linux-arm': 0.19.10
+      '@esbuild/linux-arm64': 0.19.10
+      '@esbuild/linux-ia32': 0.19.10
+      '@esbuild/linux-loong64': 0.19.10
+      '@esbuild/linux-mips64el': 0.19.10
+      '@esbuild/linux-ppc64': 0.19.10
+      '@esbuild/linux-riscv64': 0.19.10
+      '@esbuild/linux-s390x': 0.19.10
+      '@esbuild/linux-x64': 0.19.10
+      '@esbuild/netbsd-x64': 0.19.10
+      '@esbuild/openbsd-x64': 0.19.10
+      '@esbuild/sunos-x64': 0.19.10
+      '@esbuild/win32-arm64': 0.19.10
+      '@esbuild/win32-ia32': 0.19.10
+      '@esbuild/win32-x64': 0.19.10
     dev: true
 
   /escalade@3.1.1:
@@ -3987,6 +4101,14 @@ packages:
     dev: true
     optional: true
 
+  /fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /function-bind@1.1.1:
     resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
 
@@ -5186,6 +5308,12 @@ packages:
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     hasBin: true
 
+  /nanoid@3.3.7:
+    resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+    dev: true
+
   /natural-compare@1.4.0:
     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
     dev: true
@@ -5706,6 +5834,15 @@ packages:
       source-map-js: 1.0.2
     dev: true
 
+  /postcss@8.4.32:
+    resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.7
+      picocolors: 1.0.0
+      source-map-js: 1.0.2
+    dev: true
+
   /preact@10.11.3:
     resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==}
     dev: false
@@ -6008,12 +6145,25 @@ packages:
       yargs: 17.5.1
     dev: true
 
-  /rollup@2.79.1:
-    resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==}
-    engines: {node: '>=10.0.0'}
+  /rollup@4.9.1:
+    resolution: {integrity: sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
     optionalDependencies:
-      fsevents: 2.3.2
+      '@rollup/rollup-android-arm-eabi': 4.9.1
+      '@rollup/rollup-android-arm64': 4.9.1
+      '@rollup/rollup-darwin-arm64': 4.9.1
+      '@rollup/rollup-darwin-x64': 4.9.1
+      '@rollup/rollup-linux-arm-gnueabihf': 4.9.1
+      '@rollup/rollup-linux-arm64-gnu': 4.9.1
+      '@rollup/rollup-linux-arm64-musl': 4.9.1
+      '@rollup/rollup-linux-riscv64-gnu': 4.9.1
+      '@rollup/rollup-linux-x64-gnu': 4.9.1
+      '@rollup/rollup-linux-x64-musl': 4.9.1
+      '@rollup/rollup-win32-arm64-msvc': 4.9.1
+      '@rollup/rollup-win32-ia32-msvc': 4.9.1
+      '@rollup/rollup-win32-x64-msvc': 4.9.1
+      fsevents: 2.3.3
     dev: true
 
   /run-async@2.4.1:
@@ -6873,7 +7023,7 @@ packages:
       spdx-expression-parse: 3.0.1
     dev: true
 
-  /vite-plugin-compression@0.5.1(vite@3.2.7):
+  /vite-plugin-compression@0.5.1(vite@5.0.10):
     resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
     peerDependencies:
       vite: '>=2.0.0'
@@ -6881,12 +7031,12 @@ packages:
       chalk: 4.1.2
       debug: 4.3.4
       fs-extra: 10.1.0
-      vite: 3.2.7(@types/node@17.0.45)(sass@1.53.0)
+      vite: 5.0.10(@types/node@17.0.45)(sass@1.53.0)
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /vite-plugin-html@3.2.0(vite@3.2.7):
+  /vite-plugin-html@3.2.0(vite@5.0.10):
     resolution: {integrity: sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==}
     peerDependencies:
       vite: '>=2.0.0'
@@ -6903,10 +7053,10 @@ packages:
       html-minifier-terser: 6.1.0
       node-html-parser: 5.3.3
       pathe: 0.2.0
-      vite: 3.2.7(@types/node@17.0.45)(sass@1.53.0)
+      vite: 5.0.10(@types/node@17.0.45)(sass@1.53.0)
     dev: true
 
-  /vite-plugin-mock@2.9.6(mockjs@1.1.0)(vite@3.2.7):
+  /vite-plugin-mock@2.9.6(mockjs@1.1.0)(vite@5.0.10):
     resolution: {integrity: sha512-/Rm59oPppe/ncbkSrUuAxIQihlI2YcBmnbR4ST1RA2VzM1C0tEQc1KlbQvnUGhXECAGTaQN2JyasiwXP6EtKgg==}
     engines: {node: '>=12.0.0'}
     peerDependencies:
@@ -6923,13 +7073,13 @@ packages:
       fast-glob: 3.2.12
       mockjs: 1.1.0
       path-to-regexp: 6.2.1
-      vite: 3.2.7(@types/node@17.0.45)(sass@1.53.0)
+      vite: 5.0.10(@types/node@17.0.45)(sass@1.53.0)
     transitivePeerDependencies:
       - rollup
       - supports-color
     dev: true
 
-  /vite-plugin-style-import@2.0.0(vite@3.2.7):
+  /vite-plugin-style-import@2.0.0(vite@5.0.10):
     resolution: {integrity: sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==}
     peerDependencies:
       vite: '>=2.0.0'
@@ -6941,26 +7091,27 @@ packages:
       fs-extra: 10.1.0
       magic-string: 0.25.9
       pathe: 0.2.0
-      vite: 3.2.7(@types/node@17.0.45)(sass@1.53.0)
+      vite: 5.0.10(@types/node@17.0.45)(sass@1.53.0)
     dev: true
 
-  /vite-plugin-vue-setup-extend@0.4.0(vite@3.2.7):
+  /vite-plugin-vue-setup-extend@0.4.0(vite@5.0.10):
     resolution: {integrity: sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==}
     peerDependencies:
       vite: '>=2.0.0'
     dependencies:
       '@vue/compiler-sfc': 3.3.4
       magic-string: 0.25.9
-      vite: 3.2.7(@types/node@17.0.45)(sass@1.53.0)
+      vite: 5.0.10(@types/node@17.0.45)(sass@1.53.0)
     dev: true
 
-  /vite@3.2.7(@types/node@17.0.45)(sass@1.53.0):
-    resolution: {integrity: sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==}
-    engines: {node: ^14.18.0 || >=16.0.0}
+  /vite@5.0.10(@types/node@17.0.45)(sass@1.53.0):
+    resolution: {integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==}
+    engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
     peerDependencies:
-      '@types/node': '>= 14'
+      '@types/node': ^18.0.0 || >=20.0.0
       less: '*'
+      lightningcss: ^1.21.0
       sass: '*'
       stylus: '*'
       sugarss: '*'
@@ -6970,6 +7121,8 @@ packages:
         optional: true
       less:
         optional: true
+      lightningcss:
+        optional: true
       sass:
         optional: true
       stylus:
@@ -6980,13 +7133,12 @@ packages:
         optional: true
     dependencies:
       '@types/node': 17.0.45
-      esbuild: 0.15.14
-      postcss: 8.4.23
-      resolve: 1.22.2
-      rollup: 2.79.1
+      esbuild: 0.19.10
+      postcss: 8.4.32
+      rollup: 4.9.1
       sass: 1.53.0
     optionalDependencies:
-      fsevents: 2.3.2
+      fsevents: 2.3.3
     dev: true
 
   /vue-demi@0.13.11(vue@3.3.4):

+ 39 - 22
src/api/scene/sceneOperate.ts

@@ -1,5 +1,5 @@
 import { http } from '@/utils/http/axios';
-import { workShopTempleteType } from './secene-templet';
+import { WorkShopTempleteType } from './secene-templet';
 
 // 传入参数类型    还缺个场景list
 export interface ComAddDatas {
@@ -7,14 +7,14 @@ export interface ComAddDatas {
   createdAt?: string; //创建时间
   id?: number; //新增后返回的唯一com的id
   isDeleted?: number; //是否删除
-  name?: string; //公司名字
+  name: string; //公司名字
   parentId?: number; //上级公司id  无上级为0
   remark?: string; //描述
   status?: number; //状态  0-启动  1-禁用
   updatedAt?: string;
   serial?: number; //排序
-  // tag?: string; //场景标签   自定义  后面需要修改
   labelList?: string[]; //创建的多个场景标签   自定义后面需要修改 这里没
+  parent?: null | ComAddDatas;
 }
 
 /**
@@ -50,17 +50,21 @@ export const delCompany = (companyId: number) => {
 };
 
 // 传入参数类型
-export interface workshopAddDatas {
+export interface WorkshopAddDatas {
   code?: string;
   companyId?: number; //公司id
   sceneLabelId?: number; //类型  1-车间  2-危险点  3-物流  4-生活园区
   createdAt?: string;
   id?: number;
   isDeleted?: number;
-  name?: string;
+  name: string;
   remark?: string;
   status?: number;
   updatedAt?: string;
+  serial?: number;
+  parent?: null | WorkshopAddDatas;
+  workshopModule?: WorkShopTempleteType;
+  labelList?: WorkShopTempleteType[];
   // templete?: string; //车间模板
   // tag?: string; //场景标签
 }
@@ -68,7 +72,7 @@ export interface workshopAddDatas {
 /**
  * @description: 添加车间
  */
-export const addWorkshop = (data: workshopAddDatas): Promise<number> => {
+export const addWorkshop = (data: WorkshopAddDatas): Promise<number> => {
   return http.request({
     url: '/scene/saveWorkshop',
     method: 'post',
@@ -79,7 +83,7 @@ export const addWorkshop = (data: workshopAddDatas): Promise<number> => {
 /**
  * @description: 编辑车间
  */
-export const editWorkshop = (data: workshopAddDatas): Promise<number> => {
+export const editWorkshop = (data: WorkshopAddDatas): Promise<number> => {
   return http.request({
     url: '/scene/updateWorkshop',
     method: 'put',
@@ -90,34 +94,34 @@ export const editWorkshop = (data: workshopAddDatas): Promise<number> => {
 /**
  * @description: 删除车间
  */
-export const delWorkshop = (data: number): Promise<number> => {
+export const delWorkshop = (workshopId: number) => {
   return http.request({
-    url: '/scene/deleteWorkshop',
+    url: `/scene/deleteWorkshop?workshopId=${workshopId}`,
     method: 'DELETE',
-    data,
   });
 };
 
 // 传入参数类型
-export interface workspaceAddDatas {
+export interface WorkspaceAddDatas {
   code?: string;
   createdAt?: string;
   id?: number;
   isDeleted?: number;
-  name?: string;
+  name: string;
   principal?: string; //工位负责人
   remark?: string;
   status?: number;
-  serial: number;
+  serial?: number;
   updatedAt?: string;
   workshopId?: number; //车间id
+  parent?: null | WorkspaceAddDatas;
   // tag?: string; //场景标签
 }
 
 /**
  * @description: 添加工位
  */
-export const addWorkspace = (data: workspaceAddDatas): Promise<number> => {
+export const addWorkspace = (data: WorkspaceAddDatas): Promise<number> => {
   return http.request({
     url: '/scene/saveWorkspace',
     method: 'post',
@@ -128,7 +132,7 @@ export const addWorkspace = (data: workspaceAddDatas): Promise<number> => {
 /**
  * @description: 编辑工位
  */
-export const editWorkspace = (data: workspaceAddDatas): Promise<number> => {
+export const editWorkspace = (data: WorkspaceAddDatas): Promise<number> => {
   return http.request({
     url: '/scene/updateWorkspace',
     method: 'put',
@@ -139,17 +143,16 @@ export const editWorkspace = (data: workspaceAddDatas): Promise<number> => {
 /**
  * @description: 删除工位
  */
-export const delWorkspace = (data: number): Promise<number> => {
+export const delWorkspace = (workspaceId: number) => {
   return http.request({
-    url: '/scene/deleteWorkspace',
+    url: `/scene/deleteWorkspace?workspaceId=${workspaceId}`,
     method: 'DELETE',
-    data,
   });
 };
 
 //获取列表
 // 传入参数类型
-export interface sceneListType<T, S> {
+export interface SceneListType<T, S> {
   code?: string;
   createdAt?: string;
   id?: number;
@@ -165,7 +168,7 @@ export interface sceneListType<T, S> {
   moduleList?: S[]; //创建得多个模板
 }
 
-export interface labelModuleListType {
+export interface LabelModuleListType {
   code?: string;
   createdAt?: string;
   id?: number;
@@ -176,7 +179,7 @@ export interface labelModuleListType {
   updatedAt?: string;
 }
 
-export interface getListWorkshop<U, A> {
+export interface GetListWorkshop<U, A> {
   code?: string;
   companyId?: number; //公司id
   sceneLabelId?: number; //类型  1-车间  2-危险点  3-物流  4-生活园区
@@ -195,10 +198,24 @@ export interface getListWorkshop<U, A> {
 }
 
 export const getSceneList = (): Promise<
-  sceneListType<getListWorkshop<workspaceAddDatas, workShopTempleteType>, labelModuleListType>[]
+  SceneListType<GetListWorkshop<WorkspaceAddDatas, WorkShopTempleteType>, LabelModuleListType>[]
 > => {
   return http.request({
     url: '/scene/getList',
     method: 'get',
   });
 };
+
+//排序列表
+export const sortSceneList = (
+  data: SceneListType<
+    GetListWorkshop<WorkspaceAddDatas, WorkShopTempleteType>,
+    LabelModuleListType
+  >[],
+) => {
+  return http.request({
+    url: '/scene/updateSort',
+    method: 'put',
+    data,
+  });
+};

+ 18 - 10
src/api/scene/secene-templet.ts

@@ -2,7 +2,7 @@ import { http } from '@/utils/http/axios';
 
 //查询场景标签
 
-export interface sceneLabelType {
+export interface SceneLabelType {
   code?: string;
   createdAt?: string;
   id?: number;
@@ -13,16 +13,16 @@ export interface sceneLabelType {
   updatedAt?: string;
 }
 
-export const querySceneLabel = (): Promise<sceneLabelType[]> => {
+export const querySceneLabel = (): Promise<SceneLabelType[]> => {
   return http.request({
-    url: '/template/findSceneLabel',
+    url: '/template/getSceneLabelList',
     method: 'get',
   });
 };
 
 //查询场景模板
 
-export interface templateType {
+export interface TemplateType {
   code?: string;
   createdAt?: string;
   id?: number;
@@ -33,9 +33,9 @@ export interface templateType {
   updatedAt?: string;
 }
 
-export const querytemplate = (): Promise<templateType[]> => {
+export const querytemplate = (): Promise<TemplateType[]> => {
   return http.request({
-    url: '/template/findSceneModule',
+    url: '/template/getSceneModuleList',
     method: 'get',
   });
 };
@@ -104,26 +104,34 @@ export const addCompanyModuleLabel = (data: SceneTempleteType[]) => {
 export const editCompanyModuleLabel = (data: SceneTempleteType[]) => {
   return http.request({
     url: '/template/updateCompanyModuleLabelRel',
-    method: 'put',
+    method: 'post',
     data,
   });
 };
 
 //保存车间-车间模板关系
-export interface workShopTempleteType {
+export interface WorkShopTempleteType {
   id?: number;
   workshopId?: number;
   workshopModuleId?: number;
   remark?: string;
-  createdAt: string;
+  createdAt?: string;
   isDeleted?: number;
   updatedAt?: string;
 }
 
-export const addWorkshopModuleLabel = (data: workShopTempleteType): Promise<number> => {
+export const addWorkshopModuleLabel = (data: WorkShopTempleteType) => {
   return http.request({
     url: '/template/saveWorkshopModuleRel',
     method: 'post',
     data,
   });
 };
+
+export const editWorkshopModuleLabel = (data: WorkShopTempleteType) => {
+  return http.request({
+    url: '/template/updateWorkshopModuleRel',
+    method: 'post',
+    data,
+  });
+};

+ 329 - 0
src/views/dashboard/monitor/CompanyDrawer.vue

@@ -0,0 +1,329 @@
+<template>
+  <div>
+    <el-drawer
+      ref="companyDrawerRef"
+      class="test"
+      :model-value="true"
+      @close="() => emit('onClose')"
+      with-header="true"
+      size="35%"
+    >
+      <template #header="{ titleId }">
+        <p :id="titleId">{{ title }}</p>
+      </template>
+      <el-form
+        ref="ruleFormRef"
+        :model="ruleForm"
+        :rules="rules"
+        label-width="90px"
+        class="demo-ruleForm"
+        size="default"
+        status-icon
+      >
+        <el-form-item label="公司名称" prop="name">
+          <el-input v-model="ruleForm.name" style="width: 200px" />
+        </el-form-item>
+        <el-form-item label="上级场景" prop="seniorScene">
+          <el-input v-model="ruleForm.seniorScene" style="width: 200px" disabled />
+        </el-form-item>
+        <el-form-item label="公司代码" prop="code">
+          <el-input v-model="ruleForm.code" style="width: 200px" />
+        </el-form-item>
+        <el-form-item label="标签&模板" prop="sceneCode">
+          <div style="width: 200px; height: 30px"></div>
+          <div
+            v-for="(item, index) in ruleForm.selectItems"
+            :key="index"
+            style="margin-bottom: 16px; display: flex"
+          >
+            <el-select v-model="item.tag" placeholder="请选择标签" style="width: 126px">
+              <el-option
+                v-for="item1 in props.sceneList"
+                :key="item1.id"
+                :label="item1.name"
+                :value="item1.id"
+              />
+            </el-select>
+            <img
+              src="@/assets/icons/link.png"
+              alt=""
+              style="width: 16px; margin-left: 2px; margin-right: 2px" />
+            <el-select v-model="item.template" placeholder="请选择模板" style="width: 126px">
+              <el-option
+                v-for="item2 in props.templateList"
+                :key="item2.id"
+                :label="item2.name"
+                :value="item2.id"
+              />
+            </el-select>
+            <img
+              src="@/assets/icons/close.png"
+              @click="deleScene(index)"
+              alt=""
+              style="
+                width: 13px;
+                height: 13px;
+                margin-top: 10px;
+                margin-left: 3px;
+                cursor: pointer;
+              "
+          /></div>
+          <div style="width: 200px">
+            <el-icon size="28px" @click="addChange" style="cursor: pointer"><CirclePlus /></el-icon
+          ></div>
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-switch
+            v-model="ruleForm.addEnable"
+            :active-value="ENABLED.TRUE"
+            :inactive-value="ENABLED.FALSE"
+            class="switchUse"
+          />
+        </el-form-item>
+      </el-form>
+      <div style="position: absolute; left: 108px; bottom: 67px">
+        <el-button v-if="!props.comEdit" type="warning" @click="resetDrawCom">重置</el-button>
+        <el-button type="primary" v-if="!props.comEdit" @click="newCompanyAdd"> 提交 </el-button>
+        <el-button type="primary" v-if="props.comEdit" @click="editedSub"> 提交 </el-button>
+      </div>
+    </el-drawer></div
+  >
+</template>
+
+<script setup lang="ts">
+  import { computed, reactive, ref, defineProps, defineEmits, watch } from 'vue';
+  import {
+    addCompanyModuleLabel,
+    editCompanyModuleLabel,
+    SceneLabelType,
+    TemplateType,
+  } from '@/api/scene/secene-templet';
+  import { ENABLED } from './constant';
+  import type { FormInstance, FormRules } from 'element-plus';
+  import { ElMessageBox } from 'element-plus';
+  import { CirclePlus } from '@element-plus/icons-vue';
+  import { addCompany, editCompany } from '@/api/scene/sceneOperate';
+
+  interface SelectItemType {
+    tag: string;
+    template: string;
+  }
+
+  const props = defineProps<{
+    sceneList: SceneLabelType[];
+    templateList: TemplateType[];
+    allCodes: string[];
+    comEdit: boolean;
+    detail: {
+      id?: number;
+      name?: string;
+      code?: string;
+      seniorScene?: string;
+      addEnable?: ENABLED;
+      selectItems?: SelectItemType[];
+    };
+  }>();
+
+  const title = computed(() => {
+    if (props.comEdit) {
+      return '编辑公司';
+    }
+    return '添加公司';
+  });
+  const emit = defineEmits<{
+    (e: 'onOk'): unknown;
+    (e: 'onClose'): unknown;
+  }>();
+
+  //表格中的规则
+  const ruleFormRef = ref<FormInstance>();
+
+  interface RuleForm {
+    name: string; //名称
+    seniorScene: string; //上级场景
+    code: string; //代码
+    sceneCode: string; //场景代码
+    tagCom?: string[]; //公司场景标签 可选多个
+    templateCom?: string[]; //公司场景模板 可选多个
+    tagWorkshop?: number; //场景标签  车间
+    templateWorkshop?: number; //车间模板
+    selectItems?: SelectItemType[];
+    addEnable?: ENABLED;
+  }
+
+  const ruleForm = reactive<RuleForm>({
+    name: '',
+    seniorScene: '顶级场景',
+    code: '',
+    sceneCode: '',
+    tagCom: [],
+    templateCom: [],
+    tagWorkshop: undefined,
+    templateWorkshop: undefined,
+    selectItems: [{ tag: '', template: '' }],
+    addEnable: ENABLED.TRUE,
+  });
+  const rules = reactive<FormRules>({
+    name: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 3 to 5', trigger: 'blur' },
+    ],
+    seniorScene: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
+    ],
+    code: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
+    ],
+  });
+
+  //增加空的场景&模板
+  const addChange = () => {
+    ruleForm.selectItems!.push({
+      tag: '',
+      template: '',
+    });
+  };
+
+  //编辑时需要传入子组件的数据
+  watch(
+    () => props.detail,
+    (data) => {
+      ruleForm.name = data.name!;
+      ruleForm.code = data.code!;
+      ruleForm.seniorScene = data.seniorScene!;
+      ruleForm.addEnable = data.addEnable;
+      ruleForm.selectItems = data.selectItems;
+    },
+    { immediate: true },
+  );
+
+  //删除场景&模板
+  const deleScene = (index) => {
+    ElMessageBox.confirm('请确认是否关闭该场景?', '状态关闭', {
+      confirmButtonText: '确认',
+      cancelButtonText: '取消',
+      type: 'warning',
+    })
+      .then(() => {
+        ruleForm.selectItems!.splice(index, 1);
+      })
+      .catch(() => {
+        console.log('取消删除物件');
+      });
+  };
+  //添加新公司的提交
+  const newCompanyAdd = (formEl: FormInstance | undefined) => {
+    if (!formEl) return;
+    if (props.allCodes.indexOf(ruleForm.code) > -1) {
+      ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'error',
+      })
+        .then(() => {
+          // ruleFormCom.code = '';
+          console.log('场景代码重复,请重新填写');
+        })
+        .catch(() => {
+          console.log('取消删除物件');
+        });
+    } else {
+      const newComData = {
+        name: ruleForm.name,
+        code: ruleForm.code,
+        status: Number(ruleForm.addEnable),
+        isDeleted: 0,
+        parentId: 0,
+        serial: 0,
+      };
+      //提交数据并重置关闭el-draw
+      addCompany(newComData)
+        .then((res) => {
+          //选出不为空字符串的数据
+          ruleForm.selectItems = ruleForm.selectItems!.filter((item) => {
+            return item.tag && item.template;
+          });
+          //将selectItems加工成保存公司-模板的数据类型
+          const newModuleLabel = ruleForm.selectItems!.map((item) => {
+            return {
+              companyId: res,
+              isDeleted: 0,
+              sceneLabelId: Number(item.tag), //item.tag
+              sceneModuleId: Number(item.template), ///item.template
+            };
+          });
+
+          //保存公司-场景标签-场景模板关系
+          return addCompanyModuleLabel(newModuleLabel);
+        })
+        .catch((err) => {
+          console.log(err);
+        })
+        .finally(() => {
+          emit('onOk');
+        });
+    }
+  };
+
+  //编辑公司时的提交
+  const editedSub = (formEl: FormInstance | undefined) => {
+    if (!formEl) return;
+    if (props.allCodes.indexOf(ruleForm.code) > -1) {
+      if (props.detail.code !== ruleForm.code) {
+        ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+          confirmButtonText: '确认',
+          cancelButtonText: '取消',
+          type: 'error',
+        })
+          .then(() => {
+            console.log('代码重复');
+          })
+          .catch(() => {
+            console.log('取消删除物件');
+          });
+        return;
+      }
+    }
+
+    ruleForm.selectItems = ruleForm.selectItems!.filter((item) => {
+      return item.tag && item.template;
+    });
+
+    //新增的数据
+    const editNewCom = {
+      id: props.detail.id,
+      name: ruleForm.name,
+      code: ruleForm.code,
+      status: Number(ruleForm.addEnable),
+    };
+    // 编辑上传
+    editCompany(editNewCom)
+      .then(() => {
+        //保存公司-场景标签-场景模板关系
+        const editModuleLabel = ruleForm.selectItems!.map((item) => {
+          return {
+            companyId: props.detail.id,
+            isDeleted: 0,
+            sceneLabelId: Number(item.tag), //item.tag
+            sceneModuleId: Number(item.template), ///item.template
+          };
+        });
+        return editCompanyModuleLabel(editModuleLabel);
+      })
+      .finally(() => {
+        emit('onOk');
+      });
+  };
+
+  //重置编辑框
+  const resetDrawCom = () => {
+    ruleForm.name = '';
+    ruleForm.code = '';
+    ruleForm.addEnable = ENABLED.TRUE;
+    ruleForm.selectItems = [{ tag: '', template: '' }];
+  };
+</script>
+
+<style scoped></style>

+ 288 - 0
src/views/dashboard/monitor/WorkshopDrawer.vue

@@ -0,0 +1,288 @@
+<template>
+  <div>
+    <el-drawer
+      class="test"
+      :model-value="true"
+      @close="() => emit('onClose')"
+      with-header="true"
+      size="35%"
+    >
+      <template #header="{ titleId }">
+        <p :id="titleId">{{ title }}</p>
+      </template>
+      <el-form
+        ref="ruleFormRef"
+        :model="ruleForm"
+        :rules="rules"
+        label-width="120px"
+        class="demo-ruleForm"
+        size="default"
+        status-icon
+      >
+        <el-form-item label="车间名称" prop="name">
+          <el-input v-model="ruleForm.name" />
+        </el-form-item>
+        <el-form-item label="上级场景" prop="seniorScene">
+          <el-input v-model="ruleForm.seniorScene" disabled />
+        </el-form-item>
+        <el-form-item label="车间代码" prop="code">
+          <el-input v-model="ruleForm.code" />
+        </el-form-item>
+        <el-form-item label="场景标签" prop="tagWorkshop">
+          <el-radio-group
+            v-model="ruleForm.tagWorkshop"
+            size="10px"
+            style="display: flex; justify-content: space-between"
+          >
+            <el-radio-button
+              v-for="item in props.detail.tagList"
+              :key="item.id"
+              :label="item.id!"
+              class="tag-select"
+              style="margin-right: 10px"
+              >{{ item.name }}</el-radio-button
+            >
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="车间模板" prop="templateWorkshop">
+          <el-radio-group
+            v-model="ruleForm.templateWorkshop"
+            size="10px"
+            style="display: flex; justify-content: space-between"
+          >
+            <el-radio-button
+              v-for="item in props.workshopTemplateList"
+              :key="item.id"
+              :label="item.id!"
+              class="tag-select"
+              >{{ item.name }}</el-radio-button
+            >
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-switch
+            v-model="ruleForm.addEnable"
+            :active-value="ENABLED.TRUE"
+            :inactive-value="ENABLED.FALSE"
+            class="switchUse"
+          />
+        </el-form-item>
+      </el-form>
+      <div style="position: absolute; left: 108px; bottom: 67px">
+        <el-button v-if="!props.detail.companyId" type="warning" @click="resetDraw">重置</el-button>
+        <el-button v-if="!props.detail.companyId" type="primary" @click="addNewType">
+          提交
+        </el-button>
+        <el-button v-if="props.detail.companyId" type="primary" @click="editedSub">
+          提交
+        </el-button>
+      </div>
+    </el-drawer></div
+  >
+</template>
+
+<script setup lang="ts">
+  import { computed, reactive, ref, defineProps, defineEmits, watch } from 'vue';
+  import { ENABLED } from './constant';
+  import { ElMessageBox, type FormInstance, type FormRules } from 'element-plus';
+  import { LabelModuleListType, addWorkshop, editWorkshop } from '@/api/scene/sceneOperate';
+  import {
+    WorkshopModuleType,
+    addWorkshopModuleLabel,
+    editWorkshopModuleLabel,
+  } from '@/api/scene/secene-templet';
+
+  const props = defineProps<{
+    allCodes: string[];
+    workshopTemplateList: WorkshopModuleType[];
+    detail: {
+      id?: number;
+      name?: string;
+      code?: string;
+      seniorScene?: string;
+      tagWorkshop?: number;
+      templateWorkshop?: number;
+      addEnable?: ENABLED;
+      tagList?: LabelModuleListType[];
+      companyId?: number;
+    };
+  }>();
+
+  //将表单数据传至父组件
+  const emit = defineEmits<{
+    (e: 'onOk'): unknown;
+    (e: 'onClose'): unknown;
+  }>();
+
+  //表格中的规则
+  const ruleFormRef = ref<FormInstance>();
+
+  const title = computed(() => {
+    if (props.detail.companyId) {
+      return '编辑车间';
+    }
+    return '添加车间';
+  });
+
+  interface RuleForm {
+    name: string; //名称
+    seniorScene: string; //上级场景
+    code: string; //代码
+    tagWorkshop?: number | null; //场景标签  车间
+    templateWorkshop?: number | null; //车间模板
+    addEnable?: ENABLED; //状态
+  }
+  const ruleForm = reactive<RuleForm>({
+    name: '',
+    seniorScene: '',
+    code: '',
+    tagWorkshop: null,
+    templateWorkshop: null,
+    addEnable: ENABLED.TRUE,
+    // principal: '',
+  });
+  const rules = reactive<FormRules>({
+    name: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 3 to 5', trigger: 'blur' },
+    ],
+    seniorScene: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
+    ],
+    code: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
+    ],
+    tagWorkshop: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
+    ],
+    templateWorkshop: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
+    ],
+  });
+
+  //编辑时需要传入子组件的数据
+  watch(
+    () => props.detail,
+    (data) => {
+      ruleForm.name = data.name!;
+      ruleForm.seniorScene = data.seniorScene!;
+      ruleForm.code = data.code!;
+      ruleForm.tagWorkshop = data.tagWorkshop;
+      ruleForm.templateWorkshop = data.templateWorkshop;
+      ruleForm.addEnable = data.addEnable;
+    },
+    { immediate: true },
+  );
+
+  //添加新车间的提交
+  const addNewType = (formEl: FormInstance | undefined) => {
+    if (!formEl) return;
+
+    const newAddData = {
+      code: ruleForm.code,
+      companyId: props.detail.id,
+      sceneLabelId: ruleForm.tagWorkshop!,
+      isDeleted: 0,
+      name: ruleForm.name,
+      status: Number(ruleForm.addEnable),
+      serial: 0,
+    };
+
+    if (props.allCodes.includes(ruleForm.code)) {
+      ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'error',
+      })
+        .then(() => {
+          console.log('场景代码重复,请重新填写');
+        })
+        .catch(() => {
+          console.log('取消删除物件');
+        });
+    } else {
+      addWorkshop(newAddData)
+        .then((res) => {
+          const newWorkshopModule = {
+            workshopId: res,
+            isDeleted: 0,
+            workshopModuleId: ruleForm.templateWorkshop!,
+          };
+          return addWorkshopModuleLabel(newWorkshopModule);
+        })
+        .catch((err) => {
+          console.log(err);
+        })
+        .finally(() => {
+          emit('onOk');
+        });
+    }
+  };
+
+  //编辑公司时的提交
+  const editedSub = (formEl: FormInstance | undefined) => {
+    if (!formEl) return;
+    if (props.allCodes.includes(ruleForm.code)) {
+      if (props.detail.code !== ruleForm.code) {
+        ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+          confirmButtonText: '确认',
+          cancelButtonText: '取消',
+          type: 'error',
+        })
+          .then(() => {
+            console.log('代码重复');
+          })
+          .catch(() => {
+            console.log('取消删除物件');
+          });
+        return;
+      }
+    }
+
+    const editNewWorkshopData = {
+      code: ruleForm.code,
+      sceneLabelId: ruleForm.tagWorkshop!,
+      name: ruleForm.name,
+      status: Number(ruleForm.addEnable),
+      id: props.detail.id,
+    };
+
+    editWorkshop(editNewWorkshopData)
+      .then(() => {
+        const editWorkshopModule = {
+          isDeleted: 0,
+          workshopId: props.detail.id,
+          workshopModuleId: ruleForm.templateWorkshop!,
+        };
+        return editWorkshopModuleLabel(editWorkshopModule);
+      })
+      .catch((err) => {
+        console.log(err);
+      })
+      .finally(() => {
+        emit('onOk');
+      });
+  };
+
+  //重置编辑框
+  const resetDraw = () => {
+    ruleForm.name = '';
+    ruleForm.code = '';
+    ruleForm.addEnable = ENABLED.TRUE;
+    ruleForm.templateWorkshop = null;
+    ruleForm.tagWorkshop = null;
+  };
+</script>
+
+<style scoped>
+  .tag-select {
+    margin-right: 10px;
+    margin-bottom: 10px;
+    border-radius: 4px;
+    border: 1px solid rgba(0, 0, 0, 0.15);
+  }
+</style>

+ 231 - 0
src/views/dashboard/monitor/WorkspaceDrawer.vue

@@ -0,0 +1,231 @@
+<template>
+  <div>
+    <el-drawer
+      class="test"
+      :model-value="true"
+      @close="() => emit('onClose')"
+      with-header="true"
+      size="35%"
+    >
+      <template #header="{ titleId }">
+        <p :id="titleId">{{ title }}</p>
+      </template>
+      <el-form
+        ref="ruleFormRef"
+        :model="ruleForm"
+        :rules="rules"
+        label-width="120px"
+        class="demo-ruleForm"
+        size="default"
+        status-icon
+      >
+        <el-form-item label="工位名称" prop="name">
+          <el-input v-model="ruleForm.name" />
+        </el-form-item>
+        <el-form-item label="上级场景" prop="seniorScene">
+          <el-input v-model="ruleForm.seniorScene" disabled />
+        </el-form-item>
+        <el-form-item label="工位代码" prop="code">
+          <el-input v-model="ruleForm.code" />
+        </el-form-item>
+        <el-form-item label="负责人" prop="principal">
+          <el-input v-model="ruleForm.principal" />
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-switch
+            v-model="ruleForm.addEnable"
+            :active-value="ENABLED.TRUE"
+            :inactive-value="ENABLED.FALSE"
+            class="switchUse"
+          />
+        </el-form-item>
+      </el-form>
+      <div style="position: absolute; left: 108px; bottom: 67px">
+        <el-button v-if="!props.detail.principal" type="warning" @click="resetDraw">重置</el-button>
+        <el-button v-if="!props.detail.principal" type="primary" @click="addNewType">
+          提交
+        </el-button>
+        <el-button v-if="props.detail.principal" type="primary" @click="editedSub">
+          提交
+        </el-button>
+      </div>
+    </el-drawer></div
+  >
+</template>
+
+<script setup lang="ts">
+  import { computed, reactive, ref, defineProps, defineEmits, watch } from 'vue';
+  import { ENABLED } from './constant';
+  import { ElMessageBox, type FormInstance, type FormRules } from 'element-plus';
+  import { addWorkspace, editWorkspace } from '@/api/scene/sceneOperate';
+
+  const props = defineProps<{
+    allCodes: string[];
+    detail: {
+      id?: number;
+      name?: string;
+      code?: string;
+      seniorScene?: string;
+      principal?: string;
+      addEnable?: ENABLED;
+    };
+  }>();
+
+  const emit = defineEmits<{
+    (e: 'onOk'): unknown;
+    (e: 'onClose'): unknown;
+  }>();
+
+  const title = computed(() => {
+    if (props.detail.principal) {
+      return '编辑工位';
+    }
+    return '添加工位';
+  });
+
+  //表格中的规则
+  const ruleFormRef = ref<FormInstance>();
+
+  interface RuleForm {
+    name: string; //名称
+    seniorScene: string; //上级场景
+    code: string; //代码
+    principal?: string; //负责人
+    addEnable?: ENABLED;
+  }
+  const ruleForm = reactive<RuleForm>({
+    name: '',
+    seniorScene: '',
+    code: '',
+    principal: '',
+    addEnable: ENABLED.TRUE,
+  });
+  const rules = reactive<FormRules>({
+    name: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 3 to 5', trigger: 'blur' },
+    ],
+    seniorScene: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
+    ],
+    code: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
+    ],
+    principal: [
+      { required: true, message: '', trigger: 'blur' },
+      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
+    ],
+  });
+
+  watch(
+    () => props.detail,
+    (data) => {
+      ruleForm.name = data.name!;
+      ruleForm.seniorScene = data.seniorScene!;
+      ruleForm.code = data.code!;
+      ruleForm.principal = data.principal;
+      ruleForm.addEnable = data.addEnable;
+    },
+    { immediate: true },
+  );
+
+  //添加新公司的提交
+  const addNewType = (formEl: FormInstance | undefined) => {
+    if (!formEl) return;
+
+    if (props.allCodes.indexOf(ruleForm.code) > -1) {
+      ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'error',
+      })
+        .then(() => {
+          console.log('场景代码重复,请重新填写');
+        })
+        .catch(() => {
+          console.log('取消删除物件');
+        });
+    } else {
+      const newAddData = {
+        code: ruleForm.code,
+        workshopId: props.detail.id,
+        isDeleted: 0,
+        name: ruleForm.name,
+        principal: ruleForm.principal,
+        status: Number(ruleForm.addEnable),
+        serial: 0,
+      };
+      addWorkspace(newAddData)
+        .catch((err) => {
+          console.log(err);
+        })
+        .catch((err) => {
+          console.log(err);
+        })
+        .finally(() => {
+          emit('onOk');
+        });
+    }
+  };
+
+  //编辑公司时的提交
+  const editedSub = (formEl: FormInstance | undefined) => {
+    if (!formEl) return;
+
+    if (props.allCodes.indexOf(ruleForm.code) > -1) {
+      if (props.detail.code !== ruleForm.code) {
+        ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+          confirmButtonText: '确认',
+          cancelButtonText: '取消',
+          type: 'error',
+        })
+          .then(() => {
+            console.log('代码重复');
+          })
+          .catch(() => {
+            console.log('取消删除物件');
+          });
+        return;
+      }
+    }
+
+    const editNewWorkspaceData = {
+      code: ruleForm.code,
+      name: ruleForm.name,
+      status: Number(ruleForm.addEnable),
+      id: props.detail.id,
+      principal: ruleForm.principal,
+    };
+
+    //编辑车间并上传
+    editWorkspace(editNewWorkspaceData)
+      .catch((err) => {
+        console.log(err);
+      })
+      .catch((err) => {
+        console.log(err);
+      })
+      .finally(() => {
+        emit('onOk');
+      });
+  };
+
+  //重置编辑框
+  const resetDraw = () => {
+    ruleForm.name = '';
+    ruleForm.code = '';
+    ruleForm.addEnable = ENABLED.TRUE;
+    ruleForm.principal = '';
+  };
+</script>
+
+<style scoped>
+  .tag-select {
+    margin-right: 10px;
+    margin-bottom: 10px;
+    border-radius: 4px;
+    border: 1px solid rgba(0, 0, 0, 0.15);
+  }
+</style>

+ 2 - 9
src/views/dashboard/monitor/actionColomns.vue

@@ -2,7 +2,7 @@
   <div style="display: flex">
     <div style="display: flex; margin-right: 7px">
       <div
-        v-if="!props.subItem.parent"
+        v-if="props.subItem.parentId !== undefined"
         @click="changeConig"
         class="wordStyle"
         style="margin-right: 10px"
@@ -36,22 +36,17 @@
       style="margin-right: 10px; cursor: pointer"
       alt=""
     />
-
-    <!-- <el-button class="otp-btn" type="primary" @click="changeSubscribe">预约</el-button>
-    <el-button class="otp-btn" type="danger" @click="changeSubscribe">取消</el-button> -->
   </div>
 </template>
 
 <script setup lang="ts">
-  import { computed } from 'vue';
-  //   import { SubscribeItem } from '@/api/subscribe/subscribe';
-
   interface User {
     name?: string;
     tag?: string;
     code?: string;
     hasChildren?: boolean;
     children?: User[];
+    parentId?: number;
   }
 
   const props = defineProps<{
@@ -64,8 +59,6 @@
     handleDown: (row) => unknown;
   }>();
 
-  // const isBook = computed(() => (props.subscribeItem.booking === '0' ? true : false));
-
   const changeConig = () => {
     props.handleConig(props.subItem);
   };

+ 0 - 284
src/views/dashboard/monitor/addCompany.vue

@@ -1,284 +0,0 @@
-<template>
-  <div>
-    <el-drawer class="test" v-if="props.tableCom" with-header="true" size="35%">
-      <template #header="{ titleId }">
-        <p :id="titleId">{{ companyAddTitle }}</p>
-      </template>
-      <el-form
-        ref="ruleFormRef"
-        :model="ruleForm"
-        :rules="rules"
-        label-width="90px"
-        class="demo-ruleForm"
-        size="default"
-        status-icon
-      >
-        <el-form-item label="公司名称" prop="name">
-          <el-input v-model="ruleForm.name" style="width: 200px" />
-        </el-form-item>
-        <el-form-item label="上级场景" prop="seniorScene">
-          <el-input v-model="ruleForm.seniorScene" style="width: 200px" disabled />
-        </el-form-item>
-        <el-form-item label="公司代码" prop="code">
-          <el-input v-model="ruleForm.code" style="width: 200px" />
-        </el-form-item>
-        <el-form-item label="标签&模板" prop="sceneCode">
-          <div style="width: 200px; height: 30px"></div>
-          <div
-            v-for="(item, index) in selectItems"
-            :key="index"
-            style="margin-bottom: 16px; display: flex"
-          >
-            <el-select v-model="item.tag" placeholder="请选择标签" style="width: 126px">
-              <el-option
-                v-for="item1 in props.sceneList"
-                :key="item1.id"
-                :label="item1.name"
-                :value="item1.id"
-              />
-            </el-select>
-            <img
-              src="@/assets/icons/link.png"
-              alt=""
-              style="width: 16px; margin-left: 2px; margin-right: 2px" />
-            <el-select v-model="item.template" placeholder="请选择模板" style="width: 126px">
-              <el-option
-                v-for="item2 in props.templateList"
-                :key="item2.id"
-                :label="item2.name"
-                :value="item2.id"
-              />
-            </el-select>
-            <img
-              src="@/assets/icons/close.png"
-              @click="deleScene(index)"
-              alt=""
-              style="
-                width: 13px;
-                height: 13px;
-                margin-top: 10px;
-                margin-left: 3px;
-                cursor: pointer;
-              "
-          /></div>
-          <div style="width: 200px">
-            <el-icon size="28px" @click="addChange" style="cursor: pointer"><CirclePlus /></el-icon
-          ></div>
-        </el-form-item>
-        <el-form-item label="状态">
-          <el-switch v-model="addEnable" active-value="0" inactive-value="1" class="switchUse" />
-        </el-form-item>
-      </el-form>
-      <div style="position: absolute; left: 108px; bottom: 67px">
-        <el-button v-if="companyAddTitle === '添加公司'" type="warning" @click="props.resetDraw"
-          >重置</el-button
-        >
-        <el-button type="primary" v-if="companyAddTitle === '添加公司'" @click="newCompanyAdd">
-          提交
-        </el-button>
-        <el-button type="primary" v-if="companyAddTitle !== '添加公司'" @click="props.editedSub">
-          提交
-        </el-button>
-      </div>
-    </el-drawer></div
-  >
-</template>
-
-<script setup lang="ts">
-  import { computed, reactive, ref, defineProps, defineEmits } from 'vue';
-  import { sceneLabelType, templateType } from '@/api/scene/secene-templet';
-  import { ENABLED } from './use-method';
-  import type { FormInstance, FormRules } from 'element-plus';
-  import { ElMessageBox } from 'element-plus';
-  //   import { SubscribeItem } from '@/api/subscribe/subscribe';
-
-  interface RuleForm {
-    name: string; //名称
-    seniorScene: string; //上级场景
-    code: string; //代码
-    sceneCode: string; //场景代码
-    tagCom?: string[]; //公司场景标签 可选多个
-    templateCom?: string[]; //公司场景模板 可选多个
-    tagWorkshop?: number; //场景标签  车间
-    templateWorkshop?: string; //车间模板
-    principal?: string; //负责人
-  }
-
-  interface SelectItemType {
-    tag: string;
-    template: string;
-  }
-
-  const props = defineProps<{
-    tableCom: boolean;
-    companyAddTitle: string;
-    sceneList: sceneLabelType[];
-    templateList: templateType[];
-    resetDraw: () => unknown;
-    addNewTypeCom: (formEl) => unknown;
-    editedSub: () => unknown;
-  }>();
-
-  const addEnable = ref(ENABLED.TRUE);
-  const selectItems = ref<SelectItemType[]>([{ tag: '', template: '' }]);
-
-  //将表单数据传至父组件
-  const emit = defineEmits(['upload-data']);
-  //表格中的规则
-  const ruleFormRef = ref<FormInstance>();
-
-  interface RuleForm {
-    name: string; //名称
-    seniorScene: string; //上级场景
-    code: string; //代码
-    sceneCode: string; //场景代码
-    tagCom?: string[]; //公司场景标签 可选多个
-    templateCom?: string[]; //公司场景模板 可选多个
-    tagWorkshop?: number; //场景标签  车间
-    templateWorkshop?: string; //车间模板
-    principal?: string; //负责人
-  }
-  const ruleForm = reactive<RuleForm>({
-    name: '',
-    seniorScene: '',
-    code: '',
-    sceneCode: '',
-    tagCom: [],
-    templateCom: [],
-    tagWorkshop: 0,
-    templateWorkshop: '',
-    principal: '',
-  });
-  const rules = reactive<FormRules<RuleForm>>({
-    name: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 3 to 5', trigger: 'blur' },
-    ],
-    seniorScene: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-    code: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-    sceneCode: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-    tagCom: [{ required: true, message: '', trigger: 'blur' }],
-    templateCom: [{ required: true, message: '', trigger: 'blur' }],
-    tagWorkshop: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-    templateWorkshop: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-    principal: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-  });
-
-  //增加空的场景&模板
-  const addChange = () => {
-    selectItems.value.push({
-      tag: '',
-      template: '',
-    });
-    console.log(selectItems.value);
-  };
-
-  //删除场景&模板
-  const deleScene = (index) => {
-    // console.log('row', index);
-    ElMessageBox.confirm('请确认是否关闭该场景?', '状态关闭', {
-      confirmButtonText: '确认',
-      cancelButtonText: '取消',
-      type: 'warning',
-    })
-      .then(() => {
-        selectItems.value.splice(index, 1);
-      })
-      .catch(() => {
-        console.log('取消删除物件');
-      });
-  };
-
-  const formEl = ref<FormInstance>();
-
-  const newCompanyAdd = () => {
-    emit('upload-data', {
-      ruleFormCom: ruleForm,
-      selectItemsCom: selectItems,
-      addEnableCom: addEnable,
-    });
-    props.addNewTypeCom(formEl);
-  };
-
-  // //清空
-  // const resetDraw = () => {
-  //   ruleForm.name = '';
-  //   // ruleForm.seniorScene = '';
-  //   ruleForm.code = '';
-  //   ruleForm.sceneCode = '';
-  //   addEnable.value = 1;
-  //   selectItems.value = [{ tag: '', template: '' }];
-  //   ruleForm.principal = '';
-  //   ruleForm.templateWorkshop = '';
-  //   ruleForm.tagWorkshop = undefined;
-  // };
-
-  const isBook = computed(() => (props.subscribeItem.booking === '0' ? true : false));
-
-  const changeConig = () => {
-    props.handleConig(props.subItem);
-  };
-
-  const changeAdd = () => {
-    props.handleAdd(props.subItem);
-  };
-
-  const changeEdit = () => {
-    props.handleEdit(props.subItem);
-  };
-
-  const changeDelete = () => {
-    props.handleDelete(props.subItem);
-  };
-
-  const changeUp = () => {
-    props.handleUp(props.subItem);
-  };
-
-  const changeDown = () => {
-    props.handleDown(props.subItem);
-  };
-</script>
-
-<style scoped>
-  .wordStyle {
-    height: 22px;
-    font-size: 14px;
-    color: #1890ff;
-    line-height: 22px;
-    cursor: pointer;
-  }
-  .otp-btn {
-    width: 52px;
-    height: 26px;
-  }
-
-  :deep(.el-button--primary) {
-    --el-button-bg-color: #3f9eff;
-    --el-button-hover-bg-color: #64b0fe;
-    --el-button-active-bg-color: #2f8ae7;
-  }
-  :deep(.el-button--danger) {
-    --el-button-bg-color: #f56c6c;
-    --el-button-hover-bg-color: #f68888;
-    --el-button-active-bg-color: #c35353;
-  }
-</style>

+ 0 - 151
src/views/dashboard/monitor/addWorkshop.vue

@@ -1,151 +0,0 @@
-<template>
-  <el-drawer class="test" v-model="tableCom" with-header="true" size="35%">
-    <template #header="{ titleId }">
-      <p :id="titleId">{{ companyAddTitle }}</p>
-    </template>
-    <el-form
-      ref="ruleFormRef"
-      :model="ruleForm"
-      :rules="rules"
-      label-width="90px"
-      class="demo-ruleForm"
-      size="default"
-      status-icon
-    >
-      <el-form-item label="公司名称" prop="name">
-        <el-input v-model="ruleForm.name" style="width: 200px" />
-      </el-form-item>
-      <el-form-item label="上级场景" prop="seniorScene">
-        <el-input v-model="ruleForm.seniorScene" style="width: 200px" disabled />
-      </el-form-item>
-      <el-form-item label="公司代码" prop="code">
-        <el-input v-model="ruleForm.code" style="width: 200px" />
-      </el-form-item>
-      <el-form-item label="标签&模板" prop="sceneCode">
-        <div style="width: 200px; height: 30px"></div>
-        <div
-          v-for="(item, index) in selectItems"
-          :key="index"
-          style="margin-bottom: 16px; display: flex"
-        >
-          <el-select v-model="item.tag" placeholder="请选择标签" style="width: 126px">
-            <el-option
-              v-for="item1 in options"
-              :key="item1.value"
-              :label="item1.label"
-              :value="item1.value"
-            />
-          </el-select>
-          <img
-            src="@/assets/icons/link.png"
-            alt=""
-            style="width: 16px; margin-left: 2px; margin-right: 2px" />
-          <el-select v-model="item.template" placeholder="请选择模板" style="width: 126px">
-            <el-option
-              v-for="item2 in options"
-              :key="item2.value"
-              :label="item2.label"
-              :value="item2.value"
-            />
-          </el-select>
-          <img
-            src="../../../assets/icons/close.png"
-            @click="deleScene(index)"
-            alt=""
-            style="width: 13px; height: 13px; margin-top: 10px; margin-left: 3px; cursor: pointer"
-        /></div>
-        <div style="width: 200px">
-          <el-icon size="28px" @click="addChange" style="cursor: pointer"><CirclePlus /></el-icon
-        ></div>
-      </el-form-item>
-      <el-form-item label="状态">
-        <el-switch v-model="addEnable" active-value="1" inactive-value="0" class="switchUse" />
-      </el-form-item>
-    </el-form>
-    <div style="position: absolute; left: 108px; bottom: 67px">
-      <el-button v-if="companyAddTitle === '添加公司'" type="warning" @click="resetDraw"
-        >重置</el-button
-      >
-      <el-button type="primary" v-if="companyAddTitle === '添加公司'" @click="addNewTypeCom">
-        提交
-      </el-button>
-      <el-button type="primary" v-if="companyAddTitle !== '添加公司'" @click="editedSub">
-        提交
-      </el-button>
-    </div>
-  </el-drawer>
-</template>
-
-<script setup lang="ts">
-  import { computed } from 'vue';
-  //   import { SubscribeItem } from '@/api/subscribe/subscribe';
-
-  interface User {
-    name?: string;
-    tag?: string;
-    code?: string;
-    hasChildren?: boolean;
-    children?: User[];
-  }
-
-  const props = defineProps<{
-    subItem: User;
-    handleConig: (row) => unknown;
-    handleAdd: (row) => unknown;
-    handleEdit: (row) => unknown;
-    handleDelete: (row) => unknown;
-    handleUp: (row) => unknown;
-    handleDown: (row) => unknown;
-  }>();
-
-  const isBook = computed(() => (props.subscribeItem.booking === '0' ? true : false));
-
-  const changeConig = () => {
-    props.handleConig(props.subItem);
-  };
-
-  const changeAdd = () => {
-    props.handleAdd(props.subItem);
-  };
-
-  const changeEdit = () => {
-    props.handleEdit(props.subItem);
-  };
-
-  const changeDelete = () => {
-    props.handleDelete(props.subItem);
-  };
-
-  const changeUp = () => {
-    props.handleUp(props.subItem);
-  };
-
-  const changeDown = () => {
-    props.handleDown(props.subItem);
-  };
-</script>
-
-<style scoped>
-  .wordStyle {
-    height: 22px;
-    font-size: 14px;
-    color: #1890ff;
-    line-height: 22px;
-    cursor: pointer;
-  }
-  .otp-btn {
-    width: 52px;
-    height: 26px;
-  }
-
-  :deep(.el-button--primary) {
-    --el-button-bg-color: #3f9eff;
-    --el-button-hover-bg-color: #64b0fe;
-    --el-button-active-bg-color: #2f8ae7;
-  }
-  :deep(.el-button--danger) {
-    --el-button-bg-color: #f56c6c;
-    --el-button-hover-bg-color: #f68888;
-    --el-button-active-bg-color: #c35353;
-  }
-</style>

+ 0 - 151
src/views/dashboard/monitor/addWorkspace.vue

@@ -1,151 +0,0 @@
-<template>
-  <el-drawer class="test" v-model="tableCom" with-header="true" size="35%">
-    <template #header="{ titleId }">
-      <p :id="titleId">{{ companyAddTitle }}</p>
-    </template>
-    <el-form
-      ref="ruleFormRef"
-      :model="ruleForm"
-      :rules="rules"
-      label-width="90px"
-      class="demo-ruleForm"
-      size="default"
-      status-icon
-    >
-      <el-form-item label="公司名称" prop="name">
-        <el-input v-model="ruleForm.name" style="width: 200px" />
-      </el-form-item>
-      <el-form-item label="上级场景" prop="seniorScene">
-        <el-input v-model="ruleForm.seniorScene" style="width: 200px" disabled />
-      </el-form-item>
-      <el-form-item label="公司代码" prop="code">
-        <el-input v-model="ruleForm.code" style="width: 200px" />
-      </el-form-item>
-      <el-form-item label="标签&模板" prop="sceneCode">
-        <div style="width: 200px; height: 30px"></div>
-        <div
-          v-for="(item, index) in selectItems"
-          :key="index"
-          style="margin-bottom: 16px; display: flex"
-        >
-          <el-select v-model="item.tag" placeholder="请选择标签" style="width: 126px">
-            <el-option
-              v-for="item1 in options"
-              :key="item1.value"
-              :label="item1.label"
-              :value="item1.value"
-            />
-          </el-select>
-          <img
-            src="@/assets/icons/link.png"
-            alt=""
-            style="width: 16px; margin-left: 2px; margin-right: 2px" />
-          <el-select v-model="item.template" placeholder="请选择模板" style="width: 126px">
-            <el-option
-              v-for="item2 in options"
-              :key="item2.value"
-              :label="item2.label"
-              :value="item2.value"
-            />
-          </el-select>
-          <img
-            src="../../../assets/icons/close.png"
-            @click="deleScene(index)"
-            alt=""
-            style="width: 13px; height: 13px; margin-top: 10px; margin-left: 3px; cursor: pointer"
-        /></div>
-        <div style="width: 200px">
-          <el-icon size="28px" @click="addChange" style="cursor: pointer"><CirclePlus /></el-icon
-        ></div>
-      </el-form-item>
-      <el-form-item label="状态">
-        <el-switch v-model="addEnable" active-value="1" inactive-value="0" class="switchUse" />
-      </el-form-item>
-    </el-form>
-    <div style="position: absolute; left: 108px; bottom: 67px">
-      <el-button v-if="companyAddTitle === '添加公司'" type="warning" @click="resetDraw"
-        >重置</el-button
-      >
-      <el-button type="primary" v-if="companyAddTitle === '添加公司'" @click="addNewTypeCom">
-        提交
-      </el-button>
-      <el-button type="primary" v-if="companyAddTitle !== '添加公司'" @click="editedSub">
-        提交
-      </el-button>
-    </div>
-  </el-drawer>
-</template>
-
-<script setup lang="ts">
-  import { computed } from 'vue';
-  //   import { SubscribeItem } from '@/api/subscribe/subscribe';
-
-  interface User {
-    name?: string;
-    tag?: string;
-    code?: string;
-    hasChildren?: boolean;
-    children?: User[];
-  }
-
-  const props = defineProps<{
-    subItem: User;
-    handleConig: (row) => unknown;
-    handleAdd: (row) => unknown;
-    handleEdit: (row) => unknown;
-    handleDelete: (row) => unknown;
-    handleUp: (row) => unknown;
-    handleDown: (row) => unknown;
-  }>();
-
-  const isBook = computed(() => (props.subscribeItem.booking === '0' ? true : false));
-
-  const changeConig = () => {
-    props.handleConig(props.subItem);
-  };
-
-  const changeAdd = () => {
-    props.handleAdd(props.subItem);
-  };
-
-  const changeEdit = () => {
-    props.handleEdit(props.subItem);
-  };
-
-  const changeDelete = () => {
-    props.handleDelete(props.subItem);
-  };
-
-  const changeUp = () => {
-    props.handleUp(props.subItem);
-  };
-
-  const changeDown = () => {
-    props.handleDown(props.subItem);
-  };
-</script>
-
-<style scoped>
-  .wordStyle {
-    height: 22px;
-    font-size: 14px;
-    color: #1890ff;
-    line-height: 22px;
-    cursor: pointer;
-  }
-  .otp-btn {
-    width: 52px;
-    height: 26px;
-  }
-
-  :deep(.el-button--primary) {
-    --el-button-bg-color: #3f9eff;
-    --el-button-hover-bg-color: #64b0fe;
-    --el-button-active-bg-color: #2f8ae7;
-  }
-  :deep(.el-button--danger) {
-    --el-button-bg-color: #f56c6c;
-    --el-button-hover-bg-color: #f68888;
-    --el-button-active-bg-color: #c35353;
-  }
-</style>

+ 16 - 0
src/views/dashboard/monitor/constant.ts

@@ -0,0 +1,16 @@
+export enum ENABLED {
+  FALSE = 1,
+  TRUE = 0,
+}
+
+export enum DATA_LEVEL {
+  'company' = 0,
+  'workshop' = 1,
+  'workspace' = 2,
+}
+
+export enum DrawerType {
+  company = 'company',
+  workshop = 'workshop',
+  workspace = 'workspace',
+}

+ 0 - 919
src/views/dashboard/monitor/monitor copy.vue

@@ -1,919 +0,0 @@
-<template>
-  <page-wrapper>
-    <el-card :bordered="false" class="proCard" style="position: relative">
-      <BasicTable
-        :columns="colomns"
-        :data-source="tableData"
-        :row-key="(row) => row.name"
-        :action-column="actionColumn"
-        :pagination="{ total: total, pageSize: pageSize }"
-        :tableSetting="{
-          width: 200,
-          size: false,
-          redo: false,
-          fullscreen: false,
-          striped: false,
-          setting: false,
-          order: false,
-        }"
-        ref="tableRef"
-        @checked-row-change="onCheckedRow"
-        @order-change="orderByItem"
-        @page-num-change="handlePageNumChange"
-        @page-size-change="handlePageSizeChange"
-        style="height: 800px"
-      >
-        <template #tableTitle>
-          <el-button type="primary" @click="companyAdd">
-            <template #icon>
-              <el-icon>
-                <Plus />
-              </el-icon>
-            </template>
-            添加
-          </el-button>
-        </template>
-      </BasicTable>
-      <div v-if="tableData.length === 0" class="data-none"
-        ><img src="../../../assets/icons/no-content.png" alt="" />
-        <div class="data-none-word">目前无内容,请先添加场景</div></div
-      >
-    </el-card>
-
-    <!-- 添加的抽屉内容 -->
-
-    <!-- 公司 -->
-    <el-drawer class="test" v-model="tableCom" with-header="true" size="35%">
-      <template #header="{ titleId }">
-        <p :id="titleId">{{ companyAddTitle }}</p>
-      </template>
-      <el-form
-        ref="ruleFormRef"
-        :model="ruleForm"
-        :rules="rules"
-        label-width="90px"
-        class="demo-ruleForm"
-        size="default"
-        status-icon
-      >
-        <el-form-item label="公司名称" prop="name">
-          <el-input v-model="ruleForm.name" style="width: 200px" />
-        </el-form-item>
-        <el-form-item label="上级场景" prop="seniorScene">
-          <el-input v-model="ruleForm.seniorScene" style="width: 200px" disabled />
-        </el-form-item>
-        <el-form-item label="公司代码" prop="workshopCode">
-          <el-input v-model="ruleForm.workshopCode" style="width: 200px" />
-        </el-form-item>
-        <el-form-item label="标签&模板" prop="sceneCode">
-          <div style="width: 200px; height: 30px"></div>
-          <div
-            v-for="(item, index) in selectItems"
-            :key="index"
-            style="margin-bottom: 16px; display: flex"
-          >
-            <el-select v-model="item.tag" placeholder="请选择标签" style="width: 126px">
-              <el-option
-                v-for="item1 in options"
-                :key="item1.value"
-                :label="item1.label"
-                :value="item1.value"
-              />
-            </el-select>
-            <img
-              src="../../../assets/icons/link.png"
-              alt=""
-              style="width: 16px; margin-left: 2px; margin-right: 2px" />
-            <el-select v-model="item.template" placeholder="请选择模板" style="width: 126px">
-              <el-option
-                v-for="item2 in options"
-                :key="item2.value"
-                :label="item2.label"
-                :value="item2.value"
-              />
-            </el-select>
-            <img
-              src="../../../assets/icons/close.png"
-              @click="deleScene(index)"
-              alt=""
-              style="
-                width: 13px;
-                height: 13px;
-                margin-top: 10px;
-                margin-left: 3px;
-                cursor: pointer;
-              "
-          /></div>
-          <div style="width: 200px">
-            <el-icon size="28px" @click="addChange" style="cursor: pointer"><CirclePlus /></el-icon
-          ></div>
-        </el-form-item>
-        <el-form-item label="状态">
-          <el-switch v-model="addEnable" active-value="1" inactive-value="0" class="switchUse" />
-        </el-form-item>
-      </el-form>
-      <div style="position: absolute; left: 108px; bottom: 67px">
-        <el-button v-if="companyAddTitle === '添加公司'" type="warning" @click="resetDraw"
-          >重置</el-button
-        >
-        <el-button type="primary" v-if="companyAddTitle === '添加公司'" @click="addNewTypeCom">
-          提交
-        </el-button>
-        <el-button type="primary" v-if="companyAddTitle !== '添加公司'" @click="editedSub">
-          提交
-        </el-button>
-      </div>
-    </el-drawer>
-
-    <!-- 车间和工位 -->
-
-    <el-drawer class="test" v-model="table" with-header="true" size="35%">
-      <template #header="{ titleId }">
-        <p :id="titleId">{{ addTitle }}</p>
-      </template>
-      <el-form
-        ref="ruleFormRef"
-        :model="ruleForm"
-        :rules="rules"
-        label-width="120px"
-        class="demo-ruleForm"
-        size="default"
-        status-icon
-      >
-        <el-form-item :label="`${addName}`" prop="name">
-          <el-input v-model="ruleForm.name" />
-        </el-form-item>
-        <el-form-item label="上级场景" prop="seniorScene">
-          <el-input v-model="ruleForm.seniorScene" disabled />
-        </el-form-item>
-        <el-form-item label="车间代码" prop="workshopCode">
-          <el-input v-model="ruleForm.workshopCode" />
-        </el-form-item>
-        <el-form-item v-if="level === 0" label="场景标签" prop="tagWorkshop">
-          <el-radio-group
-            v-model="ruleForm.tagWorkshop"
-            size="10px"
-            style="display: flex; justify-content: space-between"
-          >
-            <el-radio-button :label="item" :key="item" v-for="item in tagList" class="tag-select" />
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item v-if="level === 0" label="车间模板" prop="templateWorkshop">
-          <el-radio-group
-            v-model="ruleForm.templateWorkshop"
-            size="10px"
-            style="display: flex; justify-content: space-between"
-          >
-            <el-radio-button
-              :label="item"
-              :key="item"
-              v-for="item in templateList"
-              class="tag-select"
-            />
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item v-if="level === 1" label="负责人" prop="leader">
-          <el-input v-model="ruleForm.leader" />
-        </el-form-item>
-        <el-form-item label="状态">
-          <el-switch v-model="addEnable" active-value="1" inactive-value="0" class="switchUse" />
-        </el-form-item>
-      </el-form>
-      <div style="position: absolute; left: 108px; bottom: 67px">
-        <el-button
-          v-if="addTitle === '添加车间' || addTitle === '添加工位'"
-          type="warning"
-          @click="resetDraw"
-          >重置</el-button
-        >
-        <el-button
-          v-if="addTitle === '添加车间' || addTitle === '添加工位'"
-          type="primary"
-          @click="addNewType"
-        >
-          提交
-        </el-button>
-        <el-button
-          v-if="addTitle === '编辑车间' || addTitle === '编辑工位'"
-          type="primary"
-          @click="editedSub"
-        >
-          提交
-        </el-button>
-      </div>
-    </el-drawer>
-
-    <!-- 编辑的抽屉内容 -->
-    <!-- <el-drawer class="test" v-model="editDrawerVisible" with-header="true" size="40%">
-      <template #header="{ titleId }">
-        <p :id="titleId">编辑场景</p>
-      </template>
-      <el-form
-        ref="ruleFormRef2"
-        :model="ruleForm2"
-        :rules="rules2"
-        label-width="120px"
-        class="demo-ruleForm"
-        size="default"
-        status-icon
-      >
-        <el-form-item label="场景名称" prop="name">
-          <el-input v-model="ruleForm2.name" />
-        </el-form-item>
-        <el-form-item v-if="level === 1" label="场景标签" prop="tag">
-          <el-input v-model="ruleForm2.tag" />
-        </el-form-item>
-        <el-form-item label="场景代码" prop="code">
-          <el-input v-model="ruleForm2.code" />
-        </el-form-item>
-      </el-form>
-      <div style="position: absolute; left: 108px; bottom: 67px">
-        <el-button type="primary" @click="editedSub"> 提交 </el-button>
-      </div>
-    </el-drawer> -->
-  </page-wrapper>
-</template>
-
-<script setup lang="ts">
-  import { ref, onMounted, reactive, h, watch } from 'vue';
-  import { Plus, CirclePlus } from '@element-plus/icons-vue';
-  import { BasicTable, BasicColumn } from '@/components/Table';
-  import type { FormInstance, FormRules } from 'element-plus';
-  import { ElMessageBox } from 'element-plus';
-  import ActionColomn from './actionColomns.vue';
-  import {
-    User,
-    colomns,
-    dataSourceWithParent,
-    deleteTableRow,
-    editTableRow,
-    findItemLevel,
-    options,
-    tableData,
-    updateData,
-  } from './constant';
-  import {
-    ComAddDatas,
-    companyAdd,
-    companyEdit,
-    companyDel,
-    workshopAddDatas,
-    workshopAdd,
-    workshopEdit,
-    workshopDel,
-    workspaceAddDatas,
-    workspaceAdd,
-    workspaceEdit,
-    workspaceDel,
-    sceneListType,
-    getListWorkshop,
-    getSceneList,
-  } from '@/api/scene/sceneOperate';
-
-  const total = ref<number>(100);
-  const pageSize = ref<number>(10);
-
-  onMounted(() => {
-    //添加父级,主要用于排序功能
-    dataSourceWithParent(tableData.value, null);
-    // console.log(tableData.value);
-  });
-
-  //用于新增数据后,将新增数据加入父级
-  watch(
-    tableData.value,
-    () => {
-      dataSourceWithParent(tableData.value, null);
-      console.log(tableData.value);
-    },
-    { deep: true },
-  );
-
-  function onCheckedRow(rowKeys) {
-    console.log(rowKeys);
-  }
-
-  const orderByItem = () => {};
-  const handlePageNumChange = () => {};
-  const handlePageSizeChange = () => {};
-
-  //添加组件的添加功能
-  const table = ref(false); //添加公司级的场景
-  const tableCom = ref(false); //添加车间或者工位
-
-  //添加公司级场景
-
-  const companyAddTitle = ref('添加公司');
-
-  const companyAdd = () => {
-    tableCom.value = true;
-    resetDraw();
-    ruleForm.seniorScene = '顶级场景';
-    companyAddTitle.value = '添加公司';
-  };
-
-  //重置编辑框
-  const resetDraw = () => {
-    ruleForm.name = '';
-    // ruleForm.seniorScene = '';
-    ruleForm.workshopCode = '';
-    ruleForm.sceneCode = '';
-    addEnable.value = '1';
-    selectItems.value = [{ tag: '', template: '' }];
-    ruleForm.leader = '';
-    ruleForm.templateWorkshop = '';
-    ruleForm.tagWorkshop = '';
-  };
-
-  //用于新增场景
-  const selectItems = ref([{ tag: '', template: '' }] as { tag: string; template: string }[]);
-  const addChange = () => {
-    selectItems.value.push({
-      tag: '',
-      template: '',
-    });
-    console.log(selectItems.value);
-  };
-
-  //删除顶级场景的场景
-  const deleScene = (index) => {
-    // console.log('row', index);
-    ElMessageBox.confirm('请确认是否关闭该场景?', '状态关闭', {
-      confirmButtonText: '确认',
-      cancelButtonText: '取消',
-      type: 'warning',
-    })
-      .then(() => {
-        selectItems.value.splice(index, 1);
-      })
-      .catch(() => {
-        console.log('取消删除物件');
-      });
-  };
-
-  //找出数据中的全部code
-  const flattenCodes = (data) => {
-    const codes = [];
-    const traverse = (node) => {
-      codes.push(node.code);
-      if (node.children && node.children.length > 0) {
-        node.children.forEach(traverse);
-      }
-    };
-    data.forEach(traverse);
-    return codes;
-  };
-
-  //添加公司场景的提交按钮
-  const addNewTypeCom = (formEl: FormInstance | undefined) => {
-    if (!formEl) return;
-
-    //选出不为空字符串的数据
-    selectItems.value = selectItems.value.filter((item) => {
-      return item.tag && item.template;
-    });
-    ruleForm.tagCom = selectItems.value.map((item) => {
-      return item.tag + '-' + item.template;
-    });
-
-    const newData = {
-      name: ruleForm.name,
-      Toptag: ruleForm.tagCom,
-      code: ruleForm.workshopCode,
-      status: addEnable.value,
-      seniorScene: ruleForm.seniorScene,
-    };
-
-    //取出数据中所有的code数据
-    const allCodes = flattenCodes(tableData.value);
-
-    //判断新数据中是否与原有的code重复
-    if (allCodes.indexOf(ruleForm.workshopCode) > -1) {
-      ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
-        confirmButtonText: '确认',
-        cancelButtonText: '取消',
-        type: 'error',
-      })
-        .then(() => {
-          ruleForm.workshopCode = '';
-        })
-        .catch(() => {
-          console.log('取消删除物件');
-        });
-    } else {
-      tableData.value.push(newData);
-      resetDraw();
-      tableCom.value = false;
-    }
-  };
-
-  //新增工位或者车间的提交按钮
-  const addNewType = (formEl: FormInstance | undefined) => {
-    if (!formEl) return;
-    const newData = {
-      name: ruleForm.name,
-      seniorScene: ruleForm.seniorScene,
-      tag: ruleForm.tagWorkshop,
-      code: ruleForm.workshopCode,
-      templeteRoom: ruleForm.templateWorkshop,
-      status: addEnable.value,
-      leader: ruleForm.leader,
-      Toptag: tagList.value,
-    };
-    const allCodes = flattenCodes(tableData.value);
-
-    if (allCodes.indexOf(ruleForm.workshopCode) > -1) {
-      ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
-        confirmButtonText: '确认',
-        cancelButtonText: '取消',
-        type: 'error',
-      })
-        .then(() => {
-          ruleForm.sceneCode = '';
-        })
-        .catch(() => {
-          console.log('取消删除物件');
-        });
-    } else {
-      updateData(tableData.value, ruleForm.seniorScene, newData);
-      resetDraw();
-      table.value = false;
-    }
-  };
-
-  // 新增类型的参数值
-  const addEnable = ref('1'); //启动按钮的值
-
-  //表格中的规则
-  const ruleFormRef = ref<FormInstance>();
-
-  interface RuleForm {
-    name: string; //名称
-    seniorScene: string; //上级场景
-    workshopCode: string; //代码
-    sceneCode: string; //场景代码
-    tagCom?: string[]; //公司场景标签 可选多个
-    templateCom?: string[]; //公司场景模板 可选多个
-    tagWorkshop?: string; //场景标签  车间
-    templateWorkshop?: string; //车间模板
-    leader?: string; //负责人
-  }
-  const ruleForm = reactive<RuleForm>({
-    name: '',
-    seniorScene: '',
-    workshopCode: '',
-    sceneCode: '',
-    tagCom: [],
-    templateCom: [],
-    tagWorkshop: '',
-    templateWorkshop: '',
-    leader: '',
-  });
-  const rules = reactive<FormRules<RuleForm>>({
-    name: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 3 to 5', trigger: 'blur' },
-    ],
-    seniorScene: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-    workshopCode: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-    sceneCode: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-    tagCom: [{ required: true, message: '', trigger: 'blur' }],
-    templateCom: [{ required: true, message: '', trigger: 'blur' }],
-    tagWorkshop: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-    templateWorkshop: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-    leader: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-  });
-
-  //编辑规则
-  const ruleFormRef2 = ref<FormInstance>();
-
-  interface RuleForm2 {
-    name: string;
-    tag: string;
-    code: string;
-  }
-  const ruleForm2 = reactive<RuleForm2>({
-    name: '',
-    tag: '',
-    code: '',
-  });
-  const rules2 = reactive<FormRules2<RuleForm2>>({
-    name: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 3 to 5', trigger: 'blur' },
-    ],
-    tag: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-    code: [
-      { required: true, message: '', trigger: 'blur' },
-      { min: 1, max: 100, message: 'Length should be 1 to 100', trigger: 'blur' },
-    ],
-  });
-
-  //操作列
-  const actionColumn: BasicColumn = reactive({
-    width: 350,
-    label: '操作',
-    prop: 'booking',
-    key: 'action',
-    fixed: 'right',
-    render(record) {
-      return h(ActionColomn, {
-        subItem: record.row,
-        handleConig: handleConfig,
-        handleAdd: handleAdd,
-        handleEdit: handleEdit,
-        handleDelete: handleDelete,
-        handleUp: rowUp,
-        handleDown: rowDown,
-      });
-    },
-  });
-
-  //表单中的Operations
-
-  //页面设置函数
-  const handleConfig = (row) => {
-    console.log(row);
-  };
-
-  const addTitle = ref('');
-  const addName = ref('');
-  const level = ref<number>();
-
-  const handleAdd = (row) => {
-    console.log(row);
-    console.log(row.code);
-
-    //得出当前的数据的层级
-    level.value = findItemLevel(tableData.value, row.code);
-    console.log('level', level.value);
-
-    if (level.value === 0) {
-      addTitle.value = '添加车间';
-      addName.value = '车间名称';
-    } else if (level.value === 1) {
-      addTitle.value = '添加工位';
-      addName.value = '工位名称';
-    } else {
-      return;
-    }
-    resetDraw();
-
-    table.value = true;
-    ruleForm.seniorScene = row.name;
-    tagList.value = row?.Toptag;
-  };
-
-  //添加车间中的场景标签
-  const tagList = ref(['生产安全', '安全环保', '物流安全', '园区生活']);
-  const templateList = ['厂房', '危险点', '食堂', '停车场'];
-
-  const editedItem = ref<User>({} as User);
-
-  // 在这里实现删除行的函数
-
-  const handleDelete = (row: Recordable) => {
-    console.log('row', row);
-    if (row.children?.length > 0) {
-      ElMessageBox.confirm('存在下级场景,无法删除该场景', '无法删除该条信息', {
-        confirmButtonText: '确认',
-        cancelButtonText: '取消',
-        type: 'error',
-      })
-        .then(() => {
-          console.log('存在子集');
-        })
-        .catch(() => {
-          console.log('取消删除物件');
-        });
-    } else {
-      ElMessageBox.confirm('确认要删除该场景吗', {
-        confirmButtonText: '确认',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          if (row && row.name) {
-            deleteTableRow(tableData.value, row.name);
-          }
-          // console.log('确认删除物件');
-          // const deleteData = {
-          //   partTypeId: row.partTypeId,
-          //   isDelete: '1',
-          // } as PartDeleteData;
-          // console.log(deleteData);
-          // deletePartType(deleteData);
-        })
-        .catch(() => {
-          console.log('取消删除物件');
-        });
-    }
-  };
-
-  const handleEdit = (row) => {
-    editedItem.value = { ...row }; // 将当前行的内容拷贝到 editedItem 中,以便编辑
-    level.value = findItemLevel(tableData.value, row.code);
-    if (level.value === 0) {
-      tableCom.value = true;
-      companyAddTitle.value = '编辑公司';
-      selectItems.value = [];
-
-      if (row.Toptag && Array.isArray(row.Toptag)) {
-        selectItems.value = row.Toptag.map((item) => ({
-          tag: item.split('-')[0],
-          template: item.split('-')[1],
-        }));
-      }
-      ruleForm.name = editedItem.value.name!;
-      ruleForm.seniorScene = editedItem.value.seniorScene!;
-      ruleForm.workshopCode = editedItem.value.code!;
-      addEnable.value = editedItem.value.status!;
-
-      // ruleForm.seniorScene = editedItem.value.Toptag!;
-    } else if (level.value === 1) {
-      level.value = level.value - 1;
-      addTitle.value = '编辑车间';
-      addName.value = '车间名称';
-      table.value = true;
-      ruleForm.name = editedItem.value.name!;
-      ruleForm.seniorScene = editedItem.value.seniorScene!;
-      ruleForm.workshopCode = editedItem.value.code!;
-      addEnable.value = editedItem.value.status!;
-      ruleForm.tagWorkshop = editedItem.value.tag;
-      ruleForm.templateWorkshop = editedItem.value.templeteRoom;
-      tagList.value = editedItem.value.Toptag!;
-    } else if (level.value === 2) {
-      level.value = level.value - 1;
-      addTitle.value = '编辑工位';
-      addName.value = '工位名称';
-      table.value = true;
-      ruleForm.name = editedItem.value.name!;
-      ruleForm.seniorScene = editedItem.value.seniorScene!;
-      ruleForm.workshopCode = editedItem.value.code!;
-      ruleForm.leader = editedItem.value.leader!;
-    }
-
-    // editedItem.value = { ...row }; // 将当前行的内容拷贝到 editedItem 中,以便编辑
-    // ruleForm2.name = editedItem.value.name!;
-    // ruleForm2.tag = editedItem.value.tag!;
-    // ruleForm2.code = editedItem.value.code!;
-    // level.value = findItemLevel(tableData.value, row.code);
-    // editDrawerVisible.value = true;
-  };
-
-  const editDrawerVisible = ref(false);
-
-  //编辑时的提交按钮功能
-
-  const editedSub = () => {
-    // const editedData = {
-    //   typeName: editedItem.value.typeName,
-    //   partTypeId: editedItem.value.partTypeId,
-    //   enable: editedItem.value.enable,
-    //   num: editedItem.value.num,
-    // } as PartEditData;
-    // console.log(editedData);
-    // editPartType(editedData);
-    // editDrawerVisible.value = false;
-    // level.value = findItemLevel(tableData.value, editedItem.value.code);
-    // console.log();
-
-    console.log(2222222222222);
-
-    const allCodes = flattenCodes(tableData.value);
-    console.log('editedItem.value.code', editedItem.value.code);
-    console.log('ruleForm.workshopCode', ruleForm.workshopCode);
-
-    if (allCodes.indexOf(ruleForm.workshopCode) > -1) {
-      if (editedItem.value.code !== ruleForm.workshopCode) {
-        ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
-          confirmButtonText: '确认',
-          cancelButtonText: '取消',
-          type: 'error',
-        })
-          .then(() => {
-            // ruleForm.workshopCode = '';
-            console.log('代码重复');
-          })
-          .catch(() => {
-            console.log('取消删除物件');
-          });
-        return;
-      }
-    }
-    console.log(11111111111);
-    level.value = findItemLevel(tableData.value, editedItem.value.code);
-    console.log('level', level.value);
-
-    if (level.value === 0) {
-      selectItems.value = selectItems.value.filter((item) => {
-        return item.tag && item.template;
-      });
-      ruleForm.tagCom = selectItems.value.map((item) => {
-        return item.tag + '-' + item.template;
-      });
-
-      editTableRow(
-        tableData.value,
-        level.value,
-        editedItem.value.name,
-        ruleForm.name,
-        ruleForm.workshopCode,
-        addEnable.value,
-        '',
-        '',
-        '',
-        ruleForm.tagCom!,
-      );
-
-      tableCom.value = false;
-    } else if (level.value === 1) {
-      console.log(111111, ruleForm.templateWorkshop, ruleForm.tagWorkshop);
-
-      editTableRow(
-        tableData.value,
-        level.value,
-        editedItem.value.name,
-        ruleForm.name,
-        ruleForm.workshopCode,
-        addEnable.value,
-        '',
-        ruleForm.templateWorkshop,
-        ruleForm.tagWorkshop,
-        [],
-      );
-      table.value = false;
-    } else if (level.value === 2) {
-      editTableRow(
-        tableData.value,
-        level.value,
-        editedItem.value.name,
-        ruleForm.name,
-        ruleForm.workshopCode,
-        addEnable.value,
-        ruleForm.leader,
-        '',
-        '',
-        [],
-      );
-      table.value = false;
-    }
-  };
-  //表单中的启动状态
-  // const handleSwitchChange = (_row: PartItem) => {
-  //   // row.enable = row.enable === '1' ? '0' : '1';
-  //   // const editData = {
-  //   //   partTypeId: row.partTypeId,
-  //   //   enable: row.enable,
-  //   // };
-  //   // console.log(editData);
-  //   // editPartType(editData);
-  // };
-
-  //向上排序
-  const rowUp = (row) => {
-    if (row.parent) {
-      const parentIndex = row.parent.children!.indexOf(row);
-      if (parentIndex > 0) {
-        const previousRow = row.parent.children![parentIndex - 1];
-        // 进行交换位置
-        row.parent.children!.splice(parentIndex - 1, 2, row, previousRow);
-      }
-    } else {
-      const index = tableData.value.indexOf(row);
-      if (index > 0) {
-        tableData.value.splice(index - 1, 2, row, tableData.value[index - 1]);
-      }
-    }
-  };
-
-  //向下排序
-  const rowDown = (row) => {
-    if (row.parent) {
-      const parentIndex = row.parent.children!.indexOf(row);
-      if (parentIndex < row.parent.children?.length - 1) {
-        const behindRow = row.parent.children![parentIndex + 1];
-        // 进行交换位置
-        row.parent.children!.splice(parentIndex, 2, behindRow, row);
-      }
-    } else {
-      const index = tableData.value.indexOf(row);
-      if (index < tableData.value.length - 1) {
-        tableData.value.splice(index, 2, tableData.value[index + 1], row);
-      }
-    }
-    // }
-  };
-</script>
-
-<style scoped>
-  /* .card{
-    displa;
-  } */
-
-  .data-none {
-    position: absolute;
-    /* left: 383px; */
-    right: 492px;
-    top: 200px;
-  }
-
-  .data-none-word {
-    width: 264px;
-    height: 30px;
-    font-size: 22px;
-    color: rgba(0, 0, 0, 0.45);
-    line-height: 30px;
-    margin-left: 61px;
-  }
-
-  .cark-line {
-    margin-top: 16px;
-  }
-  .caret-rotate {
-    transition: transform 0.3s linear;
-    transform: rotate(0deg);
-  }
-  .caret-collapse {
-    transform: rotate(180deg);
-  }
-  .space-collapse {
-    height: 0;
-    overflow: hidden;
-    transition: all 0.3s linear;
-  }
-  .space-open {
-    height: 100px;
-  }
-  .contentName {
-    margin-bottom: 50px;
-  }
-  .contentOne {
-    margin-right: 40px;
-  }
-  .contentNum {
-    margin-bottom: 50px;
-  }
-  .contentTwo {
-    margin-right: 12px;
-  }
-
-  .titleId {
-    font-size: 30px;
-    text-align: left;
-    margin-left: 20px;
-  }
-
-  .showBody {
-    display: flex;
-    width: 100%;
-    padding-bottom: 50px;
-    align-items: center;
-  }
-  .addContent {
-    width: 300px;
-  }
-
-  .showContent {
-    margin-right: 20px;
-  }
-
-  .switchContent {
-    display: flex;
-    margin-bottom: 50px;
-    align-items: center;
-  }
-
-  .tag-select {
-    margin-right: 10px;
-    margin-bottom: 10px;
-    /* background: #ffffff; */
-    border-radius: 4px;
-    border: 1px solid rgba(0, 0, 0, 0.15);
-  }
-  /* :deep(.el-table--default .cell) {
-        white-space: nowrap;
-        overflow: auto;
-      } */
-</style>

Разница между файлами не показана из-за своего большого размера
+ 160 - 859
src/views/dashboard/monitor/monitor.vue


+ 81 - 84
src/views/dashboard/monitor/use-method.ts

@@ -1,26 +1,25 @@
-import { ref } from 'vue';
 import {
-  sceneListType,
-  getListWorkshop,
-  workspaceAddDatas,
-  labelModuleListType,
+  SceneListType,
+  GetListWorkshop,
+  WorkspaceAddDatas,
+  LabelModuleListType,
 } from '@/api/scene/sceneOperate';
-import { workShopTempleteType } from '@/api/scene/secene-templet';
+import { WorkShopTempleteType } from '@/api/scene/secene-templet';
 
 export const colomns = [
   { label: '场景名称', prop: 'name', width: 300 },
-  { label: '场景标签', prop: 'companyLabelId', width: 300 },
+  { label: '场景标签', prop: 'labelName', width: 300 },
   { label: '代码', prop: 'code' },
 ];
 
 interface DataSourceUser
-  extends sceneListType<
-    getListWorkshop<workspaceAddDatas, workShopTempleteType>,
-    labelModuleListType
+  extends SceneListType<
+    GetListWorkshop<WorkspaceAddDatas, WorkShopTempleteType>,
+    LabelModuleListType
   > {
-  parent?: sceneListType<
-    getListWorkshop<workspaceAddDatas, workShopTempleteType>,
-    labelModuleListType
+  parent?: SceneListType<
+    GetListWorkshop<WorkspaceAddDatas, WorkShopTempleteType>,
+    LabelModuleListType
   > | null;
 }
 
@@ -36,16 +35,62 @@ export const dataSourceWithParent = (d: DataSourceUser[], parent: DataSourceUser
   return d;
 };
 
-export const options = [
-  {
-    value: 'Option1',
-    label: 'Option1',
-  },
-  {
-    value: 'Option2',
-    label: 'Option2',
-  },
-];
+export function removeParent(data) {
+  return data.map((item) => {
+    // 删除 tag 属性
+    delete item.parent;
+
+    // 递归处理子项
+    if (item.children && item.children.length > 0) {
+      item.children = removeParent(item.children);
+    }
+
+    return item;
+  });
+}
+
+//找到各个层级
+// export function findIndexByItem(data, targetItem, path = []) {
+//   for (let i = 0; i < data.length; i++) {
+//     const currentPath = path.concat(i);
+//     if (data[i].id === targetItem.id && data[i].name === targetItem.name) {
+//       return currentPath;
+//     }
+//     if (data[i].children && data[i].children.length > 0) {
+//       const childResult = findIndexByItem(data[i].children, targetItem, currentPath);
+//       if (childResult.length > 0) {
+//         return childResult;
+//       }
+//     }
+//   }
+//   return [];
+// }
+
+//用于重新修改serial
+export const updateSerials = (data) => {
+  for (let i = 0; i < data.length; i++) {
+    data[i].serial = i;
+
+    // if (currentItem.id === targetId) {
+    //   if (!currentItem.children) {
+    //     currentItem.children = [];
+    //   }
+    //   currentItem.children.push(newAdd);
+    //   return true; // 表示已经找到并修改
+    // }
+
+    // 如果有子项,递归查找
+    if (data[i].children && data[i].children.length > 0) {
+      updateSerials(data[i].children);
+
+      // if (found) {
+      //   return true; // 如果在子项中找到目标项,停止继续查找
+      // }
+    }
+  }
+  return data;
+  // return false; // 表示未找到目标项
+};
 
 //用于新增数据
 export const updateData = (data, targetId, newAdd) => {
@@ -76,8 +121,6 @@ export const updateData = (data, targetId, newAdd) => {
 //判断该条数据的层级
 export const findItemLevel = (data, targetId, targetName, currentLevel = 0) => {
   for (let i = 0; i < data.length; i++) {
-    console.log('i', i);
-
     const item = data[i];
 
     if (item.id === targetId && item.name === targetName) {
@@ -124,66 +167,20 @@ export const deleteTableRow = (dataSource, targetId) => {
   deleteRecursive(dataSource);
 };
 
-//行的编辑提交功能
-export const editTableRow = (
-  dataSource,
-  targetId,
-  level,
-  name,
-  newName,
-  newCode,
-  newStatus,
-  newLeader = '',
-  newTemplete = '',
-  newTag = 0,
-  newToptag = [] as unknown as string[],
-) => {
-  const editTRecursive = (data) => {
-    for (let i = 0; i < data.length; i++) {
-      const currentItem = data[i];
-
-      if (currentItem.id === targetId) {
-        // 修改
-        currentItem.name = newName;
-        currentItem.code = newCode;
-        currentItem.status = newStatus;
-        if (level === 0) {
-          currentItem.Toptag = newToptag;
-        } else if (level === 1) {
-          currentItem.companyLabelId = newTag;
-          currentItem.templete = newTemplete;
-        } else if (level === 2) {
-          currentItem.leader = newLeader;
-        }
-
-        return true;
-      }
-
-      // 如果有子项,递归查找
-      if (currentItem.children && currentItem.children.length > 0) {
-        const found = editTRecursive(currentItem.children);
-
-        if (found) {
-          return true; // 如果在子项中找到目标项,停止继续查找
-        }
-      }
+//找出数据中的全部code
+export const flattenCodes = (data) => {
+  const codes: string[] = [];
+  const traverse = (node: { code: string; children: any[] }) => {
+    codes.push(node.code);
+    if (node.children && node.children.length > 0) {
+      node.children.forEach(traverse);
     }
-    return false; // 表示未找到目标项
   };
-
-  editTRecursive(dataSource);
+  data.forEach(traverse);
+  return codes;
 };
 
-// export const convertArray = (inputArray) => {
-//   return inputArray.map((item) => {
-//     const [start, end] = item.split('-');
-//     console.log(start, end);
-
-//     return { tag: start, templete: end };
-//   });
-// };
-
-export enum ENABLED {
-  FALSE = 1,
-  TRUE = 0,
-}
+// export enum ENABLED {
+//   FALSE = 1,
+//   TRUE = 0,
+// }

+ 6 - 6
src/views/dashboard/monitor/use-scene.ts

@@ -1,17 +1,17 @@
 import {
-  workspaceAddDatas,
-  sceneListType,
-  getListWorkshop,
+  WorkspaceAddDatas,
+  SceneListType,
+  GetListWorkshop,
   getSceneList,
-  labelModuleListType,
+  LabelModuleListType,
 } from '@/api/scene/sceneOperate';
-import { workShopTempleteType } from '@/api/scene/secene-templet';
+import { WorkShopTempleteType } from '@/api/scene/secene-templet';
 import { ref } from 'vue';
 
 export function useScene() {
   //场景数据
   const tableData = ref<
-    sceneListType<getListWorkshop<workspaceAddDatas, workShopTempleteType>, labelModuleListType>[]
+    SceneListType<GetListWorkshop<WorkspaceAddDatas, WorkShopTempleteType>, LabelModuleListType>[]
   >([]);
 
   const getSceneDetail = () => {

+ 4 - 10
src/views/dashboard/monitor/use-sence-templete.ts

@@ -1,7 +1,7 @@
 import {
-  sceneLabelType,
+  SceneLabelType,
   querySceneLabel,
-  templateType,
+  TemplateType,
   querytemplate,
   queryWorkshopModule,
   WorkshopModuleType,
@@ -10,24 +10,18 @@ import { onMounted, ref } from 'vue';
 
 export function useSceneTemplete() {
   //场景标签
-  const sceneList = ref<sceneLabelType[]>([]);
+  const sceneList = ref<SceneLabelType[]>([]);
 
   const getSceneLabel = () => {
     querySceneLabel().then((res) => {
-      console.log(11111122);
       sceneList.value = res;
-      console.log('sceneList.value', sceneList.value);
-      // sceneList.value = sceneList.value.map((item) => {
-      //   return { id: item.id, name: item.name };
-      // });
     });
   };
 
   //场景模板
-  const templateList = ref<templateType[]>([]);
+  const templateList = ref<TemplateType[]>([]);
 
   const getTemplete = () => {
-    console.log(23333);
     querytemplate().then((res) => {
       templateList.value = res;
       console.log('templateList.value', templateList.value);