Przeglądaj źródła

工作面瓦斯抽采绘制

hongrunxia 1 rok temu
rodzic
commit
8e69387177

+ 4 - 0
mock/sys/menu.ts

@@ -12,6 +12,7 @@ const dashboardRoute = {
     title: 'routes.dashboard.dashboard',
     hideChildrenInMenu: true,
     icon: 'bx:bx-home',
+    ver: 1,
   },
   children: [
     {
@@ -24,6 +25,7 @@ const dashboardRoute = {
         title: 'routes.dashboard.analysis',
         currentActiveMenu: '/dashboard',
         icon: 'bx:bx-home',
+        ver: 1,
       },
     },
     {
@@ -36,6 +38,7 @@ const dashboardRoute = {
         title: 'routes.dashboard.workbench',
         currentActiveMenu: '/dashboard',
         icon: 'bx:bx-home',
+        ver: 1,
       },
     },
   ],
@@ -46,6 +49,7 @@ const backRoute = {
   name: 'PermissionBackDemo',
   meta: {
     title: 'routes.demo.permission.back',
+    ver: 1,
   },
 
   children: [

+ 1 - 1
package.json

@@ -70,7 +70,7 @@
     "resize-observer-polyfill": "^1.5.1",
     "showdown": "^2.1.0",
     "sortablejs": "^1.15.0",
-    "three": "^0.155.0",
+    "three": "^0.158.0",
     "tinymce": "^5.10.3",
     "vditor": "^3.9.5",
     "vue": "^3.3.4",

+ 130 - 54
pnpm-lock.yaml

@@ -1,9 +1,5 @@
 lockfileVersion: '6.0'
 
-settings:
-  autoInstallPeers: true
-  excludeLinksFromLockfile: false
-
 dependencies:
   '@ant-design/colors':
     specifier: ^7.0.0
@@ -31,7 +27,7 @@ dependencies:
     version: 1.2.17(ts-node@10.9.1)
   '@qiaoqiaoyun/drag-free':
     specifier: ^1.1.4
-    version: 1.1.4(@aesoper/normal-utils@0.1.5)(@interactjs/core@1.10.19)(@interactjs/utils@1.10.19)(@popperjs/core@2.11.8)(gradient-parser@1.0.2)(tinycolor2@1.6.0)(typescript@4.9.5)
+    version: 1.1.4(typescript@4.9.5)
   '@vue/runtime-core':
     specifier: ^3.3.4
     version: 3.3.6
@@ -52,7 +48,7 @@ dependencies:
     version: 3.2.20(vue@3.3.6)
   axios:
     specifier: ^1.5.0
-    version: 1.5.1(debug@4.3.4)
+    version: 1.5.1
   china-area-data:
     specifier: ^5.0.1
     version: 5.0.1
@@ -153,8 +149,8 @@ dependencies:
     specifier: ^1.15.0
     version: 1.15.0
   three:
-    specifier: ^0.155.0
-    version: 0.155.0
+    specifier: ^0.158.0
+    version: 0.158.0
   tinymce:
     specifier: ^5.10.3
     version: 5.10.8
@@ -273,7 +269,7 @@ devDependencies:
     version: 6.8.0(eslint@8.52.0)(typescript@4.9.5)
   '@vitejs/plugin-legacy':
     specifier: ^2.0.0
-    version: 2.3.1(terser@5.22.0)(vite@4.5.0)
+    version: 2.3.1(vite@4.5.0)
   '@vitejs/plugin-vue':
     specifier: ^4.3.3
     version: 4.4.0(vite@4.5.0)(vue@3.3.6)
@@ -405,7 +401,7 @@ devDependencies:
     version: 6.0.3(stylelint@15.11.0)
   ts-jest:
     specifier: ^29.1.1
-    version: 29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@4.9.5)
+    version: 29.1.1(jest@29.7.0)(typescript@4.9.5)
   ts-node:
     specifier: ^10.9.1
     version: 10.9.1(@types/node@20.8.7)(typescript@4.9.5)
@@ -417,7 +413,7 @@ devDependencies:
     version: 0.55.7(postcss@8.4.31)(rollup@3.29.4)(vite@4.5.0)
   vite:
     specifier: ^4.4.9
-    version: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+    version: 4.5.0(@types/node@20.8.7)(less@4.2.0)
   vite-plugin-compression:
     specifier: ^0.5.1
     version: 0.5.1(vite@4.5.0)
@@ -1012,7 +1008,7 @@ packages:
       '@commitlint/types': 18.0.0
       '@types/node': 18.18.6
       chalk: 4.1.2
-      cosmiconfig: 8.3.6(typescript@4.9.5)
+      cosmiconfig: 8.3.6(typescript@5.2.2)
       cosmiconfig-typescript-loader: 4.4.0(@types/node@18.18.6)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@5.2.2)
       lodash.isplainobject: 4.0.6
       lodash.merge: 4.6.2
@@ -1512,6 +1508,15 @@ packages:
       - supports-color
     dev: true
 
+  /@interactjs/actions@1.10.19:
+    resolution: {integrity: sha512-mZyx1MZx5/IoLj9zg/5IZ8LmO98XGUQ3IJoDfSM7sY5yTo/WgHY0v4fdLCy8ssx5X2n1VEPV889J7u8+42kavw==, tarball: http://registry.npm.taobao.org/@interactjs/actions/-/actions-1.10.19.tgz}
+    peerDependencies:
+      '@interactjs/core': 1.10.19
+      '@interactjs/utils': 1.10.19
+    optionalDependencies:
+      '@interactjs/interact': 1.10.19
+    dev: false
+
   /@interactjs/actions@1.10.19(@interactjs/core@1.10.19)(@interactjs/utils@1.10.19):
     resolution: {integrity: sha512-mZyx1MZx5/IoLj9zg/5IZ8LmO98XGUQ3IJoDfSM7sY5yTo/WgHY0v4fdLCy8ssx5X2n1VEPV889J7u8+42kavw==, tarball: http://registry.npm.taobao.org/@interactjs/actions/-/actions-1.10.19.tgz}
     peerDependencies:
@@ -1534,6 +1539,15 @@ packages:
       '@interactjs/interact': 1.10.19
     dev: false
 
+  /@interactjs/auto-start@1.10.19:
+    resolution: {integrity: sha512-WifIomXIV9MWWHEz3zrMN6n+wl+9IshMVIUsbvx13AM4oiL4832A0JUNrCkL5m6BUTn7iw5CpIdwtnBh+OCYSQ==, tarball: http://registry.npm.taobao.org/@interactjs/auto-start/-/auto-start-1.10.19.tgz}
+    peerDependencies:
+      '@interactjs/core': 1.10.19
+      '@interactjs/utils': 1.10.19
+    optionalDependencies:
+      '@interactjs/interact': 1.10.19
+    dev: false
+
   /@interactjs/auto-start@1.10.19(@interactjs/core@1.10.19)(@interactjs/utils@1.10.19):
     resolution: {integrity: sha512-WifIomXIV9MWWHEz3zrMN6n+wl+9IshMVIUsbvx13AM4oiL4832A0JUNrCkL5m6BUTn7iw5CpIdwtnBh+OCYSQ==, tarball: http://registry.npm.taobao.org/@interactjs/auto-start/-/auto-start-1.10.19.tgz}
     peerDependencies:
@@ -1554,6 +1568,17 @@ packages:
       '@interactjs/utils': 1.10.19
     dev: false
 
+  /@interactjs/dev-tools@1.10.19(@interactjs/modifiers@1.10.19):
+    resolution: {integrity: sha512-FfsOp8nQ/Gduhz25axLzezOnrMl1V+1gkKBCIXaEwlBzFOycJ+YOjgolajPVgC/26UjHMSKy4vIXfD6hLTJpfw==, tarball: http://registry.npm.taobao.org/@interactjs/dev-tools/-/dev-tools-1.10.19.tgz}
+    peerDependencies:
+      '@interactjs/modifiers': 1.10.19
+      '@interactjs/utils': 1.10.19
+    dependencies:
+      '@interactjs/modifiers': 1.10.19
+    optionalDependencies:
+      '@interactjs/interact': 1.10.19
+    dev: false
+
   /@interactjs/dev-tools@1.10.19(@interactjs/modifiers@1.10.19)(@interactjs/utils@1.10.19):
     resolution: {integrity: sha512-FfsOp8nQ/Gduhz25axLzezOnrMl1V+1gkKBCIXaEwlBzFOycJ+YOjgolajPVgC/26UjHMSKy4vIXfD6hLTJpfw==, tarball: http://registry.npm.taobao.org/@interactjs/dev-tools/-/dev-tools-1.10.19.tgz}
     peerDependencies:
@@ -1605,6 +1630,17 @@ packages:
       '@interactjs/utils': 1.10.19
     dev: false
 
+  /@interactjs/modifiers@1.10.19:
+    resolution: {integrity: sha512-qkUHwgTxlC4W4rLFaz64WyBOo/laVz+s0uUJsHDCzdzAz5ZGguMM6Cvnt8EJ04eZWqrZ2zGAF1dzHFe07XB6Qg==, tarball: http://registry.npm.taobao.org/@interactjs/modifiers/-/modifiers-1.10.19.tgz}
+    peerDependencies:
+      '@interactjs/core': 1.10.19
+      '@interactjs/utils': 1.10.19
+    dependencies:
+      '@interactjs/snappers': 1.10.19
+    optionalDependencies:
+      '@interactjs/interact': 1.10.19
+    dev: false
+
   /@interactjs/modifiers@1.10.19(@interactjs/core@1.10.19)(@interactjs/utils@1.10.19):
     resolution: {integrity: sha512-qkUHwgTxlC4W4rLFaz64WyBOo/laVz+s0uUJsHDCzdzAz5ZGguMM6Cvnt8EJ04eZWqrZ2zGAF1dzHFe07XB6Qg==, tarball: http://registry.npm.taobao.org/@interactjs/modifiers/-/modifiers-1.10.19.tgz}
     peerDependencies:
@@ -1654,6 +1690,14 @@ packages:
       '@interactjs/interact': 1.10.19
     dev: false
 
+  /@interactjs/snappers@1.10.19:
+    resolution: {integrity: sha512-JZUSecoiSx96Z1x8BYg8ZPPicgFt6KKHAQ578x4oEuqMQqpHz9SbWk2PdW9b0JcrkdxPx42Ot01eTDFyGmPq3g==, tarball: http://registry.npm.taobao.org/@interactjs/snappers/-/snappers-1.10.19.tgz}
+    peerDependencies:
+      '@interactjs/utils': 1.10.19
+    optionalDependencies:
+      '@interactjs/interact': 1.10.19
+    dev: false
+
   /@interactjs/snappers@1.10.19(@interactjs/utils@1.10.19):
     resolution: {integrity: sha512-JZUSecoiSx96Z1x8BYg8ZPPicgFt6KKHAQ578x4oEuqMQqpHz9SbWk2PdW9b0JcrkdxPx42Ot01eTDFyGmPq3g==, tarball: http://registry.npm.taobao.org/@interactjs/snappers/-/snappers-1.10.19.tgz}
     peerDependencies:
@@ -2453,7 +2497,7 @@ packages:
       '@iconify/iconify': 3.1.1
     dev: true
 
-  /@qiaoqiaoyun/drag-free@1.1.4(@aesoper/normal-utils@0.1.5)(@interactjs/core@1.10.19)(@interactjs/utils@1.10.19)(@popperjs/core@2.11.8)(gradient-parser@1.0.2)(tinycolor2@1.6.0)(typescript@4.9.5):
+  /@qiaoqiaoyun/drag-free@1.1.4(typescript@4.9.5):
     resolution: {integrity: sha512-eH4fVMj4GtGN4Ix4XZirTwqRHziRFHPTZ4cVDXItRAB8jWIMy21en0magxQmy+hhJaQxjc0W9LfmQXyaM8H67g==, tarball: http://registry.npm.taobao.org/@qiaoqiaoyun/drag-free/-/drag-free-1.1.4.tgz}
     dependencies:
       '@ant-design/colors': 7.0.0
@@ -2465,7 +2509,7 @@ packages:
       '@fullcalendar/vue3': 5.10.1(vue@3.3.6)
       '@vueuse/core': 6.9.2(vue@3.3.6)
       ant-design-vue: 3.2.20(vue@3.3.6)
-      axios: 1.5.1(debug@4.3.4)
+      axios: 1.5.1
       china-area-data: 5.0.1
       codemirror: 5.65.15
       core-js: 3.33.1
@@ -2484,20 +2528,16 @@ packages:
       vue: 3.3.6(typescript@4.9.5)
       vue-clipboard3: 2.0.0
       vue-count-to2: 1.0.6(vue@3.3.6)
-      vue-grid-layout: 3.0.0-beta1(@interactjs/core@1.10.19)(@interactjs/utils@1.10.19)
+      vue-grid-layout: 3.0.0-beta1
       vue-types: 4.2.1(vue@3.3.6)
-      vue3-colorpicker: 2.2.2(@aesoper/normal-utils@0.1.5)(@popperjs/core@2.11.8)(@vueuse/core@6.9.2)(gradient-parser@1.0.2)(lodash-es@4.17.21)(tinycolor2@1.6.0)(vue-types@4.2.1)(vue@3.3.6)
+      vue3-colorpicker: 2.2.2(@vueuse/core@6.9.2)(lodash-es@4.17.21)(vue-types@4.2.1)(vue@3.3.6)
       vuedraggable: 4.1.0(vue@3.3.6)
       xlsx: 0.17.5
     transitivePeerDependencies:
-      - '@aesoper/normal-utils'
       - '@interactjs/core'
       - '@interactjs/utils'
-      - '@popperjs/core'
       - '@vue/composition-api'
       - debug
-      - gradient-parser
-      - tinycolor2
       - typescript
     dev: false
 
@@ -2549,7 +2589,7 @@ packages:
       esbuild: 0.11.23
       esbuild-plugin-alias: 0.1.2
       tinycolor2: 1.6.0
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -3190,7 +3230,7 @@ packages:
       '@unocss/core': 0.55.7
       '@unocss/reset': 0.55.7
       '@unocss/vite': 0.55.7(rollup@3.29.4)(vite@4.5.0)
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     transitivePeerDependencies:
       - rollup
     dev: true
@@ -3368,12 +3408,12 @@ packages:
       chokidar: 3.5.3
       fast-glob: 3.3.1
       magic-string: 0.30.5
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     transitivePeerDependencies:
       - rollup
     dev: true
 
-  /@vitejs/plugin-legacy@2.3.1(terser@5.22.0)(vite@4.5.0):
+  /@vitejs/plugin-legacy@2.3.1(vite@4.5.0):
     resolution: {integrity: sha512-J5KaGBlSt2tEYPVjM/C8dA6DkRzkFkbPe+Xb4IX5G+XOV5OGbVAfkMjKywdrkO3gGynO8S98i71Lmsff4cWkCQ==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
@@ -3385,8 +3425,7 @@ packages:
       magic-string: 0.26.7
       regenerator-runtime: 0.13.11
       systemjs: 6.14.2
-      terser: 5.22.0
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     dev: true
 
   /@vitejs/plugin-vue-jsx@3.0.2(vite@4.5.0)(vue@3.3.6):
@@ -3399,7 +3438,7 @@ packages:
       '@babel/core': 7.23.2
       '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.2)
       '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.23.2)
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
       vue: 3.3.6(typescript@4.9.5)
     transitivePeerDependencies:
       - supports-color
@@ -3412,7 +3451,7 @@ packages:
       vite: ^4.0.0
       vue: ^3.2.25
     dependencies:
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
       vue: 3.3.6(typescript@4.9.5)
     dev: true
 
@@ -3966,6 +4005,16 @@ packages:
       - debug
     dev: true
 
+  /axios@1.5.1:
+    resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==, tarball: http://registry.npm.taobao.org/axios/-/axios-1.5.1.tgz}
+    dependencies:
+      follow-redirects: 1.15.3
+      form-data: 4.0.0
+      proxy-from-env: 1.1.0
+    transitivePeerDependencies:
+      - debug
+    dev: false
+
   /axios@1.5.1(debug@4.3.4):
     resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==, tarball: http://registry.npm.taobao.org/axios/-/axios-1.5.1.tgz}
     dependencies:
@@ -3974,6 +4023,7 @@ packages:
       proxy-from-env: 1.1.0
     transitivePeerDependencies:
       - debug
+    dev: true
 
   /babel-jest@27.5.1(@babel/core@7.23.2):
     resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==, tarball: http://registry.npm.taobao.org/babel-jest/-/babel-jest-27.5.1.tgz}
@@ -4930,7 +4980,7 @@ packages:
       typescript: '>=4'
     dependencies:
       '@types/node': 18.18.6
-      cosmiconfig: 8.3.6(typescript@4.9.5)
+      cosmiconfig: 8.3.6(typescript@5.2.2)
       ts-node: 10.9.1(@types/node@18.18.6)(typescript@5.2.2)
       typescript: 5.2.2
     dev: true
@@ -4967,6 +5017,23 @@ packages:
       typescript: 4.9.5
     dev: true
 
+  /cosmiconfig@8.3.6(typescript@5.2.2):
+    resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==, tarball: http://registry.npm.taobao.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz}
+    engines: {node: '>=14'}
+    peerDependencies:
+      typescript: '>=4.9.5'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      import-fresh: 3.3.0
+      js-yaml: 4.1.0
+      parse-json: 5.2.0
+      path-type: 4.0.0
+      typescript: 5.2.2
+    dev: true
+    optional: true
+
   /crc-32@1.2.2:
     resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, tarball: http://registry.npm.taobao.org/crc-32/-/crc-32-1.2.2.tgz}
     engines: {node: '>=0.8'}
@@ -6549,6 +6616,16 @@ packages:
     resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, tarball: http://registry.npm.taobao.org/flatted/-/flatted-3.2.9.tgz}
     dev: true
 
+  /follow-redirects@1.15.3:
+    resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==, tarball: http://registry.npm.taobao.org/follow-redirects/-/follow-redirects-1.15.3.tgz}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+    dev: false
+
   /follow-redirects@1.15.3(debug@4.3.4):
     resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==, tarball: http://registry.npm.taobao.org/follow-redirects/-/follow-redirects-1.15.3.tgz}
     engines: {node: '>=4.0'}
@@ -6559,6 +6636,7 @@ packages:
         optional: true
     dependencies:
       debug: 4.3.4
+    dev: true
 
   /for-each@0.3.3:
     resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, tarball: http://registry.npm.taobao.org/for-each/-/for-each-0.3.3.tgz}
@@ -11482,8 +11560,8 @@ packages:
     resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, tarball: http://registry.npm.taobao.org/text-table/-/text-table-0.2.0.tgz}
     dev: true
 
-  /three@0.155.0:
-    resolution: {integrity: sha512-sNgCYmDijnIqkD/bMfk+1pHg3YzsxW7V2ChpuP6HCQ8NiZr3RufsXQr8M3SSUMjW4hG+sUk7YbyuY0DncaDTJQ==}
+  /three@0.158.0:
+    resolution: {integrity: sha512-TALj4EOpdDPF1henk2Q+s17K61uEAAWQ7TJB68nr7FKxqwyDr3msOt5IWdbGm4TaWKjrtWS8DJJWe9JnvsWOhQ==}
     dev: false
 
   /throat@6.0.2:
@@ -11617,7 +11695,7 @@ packages:
       typescript: 4.9.5
     dev: true
 
-  /ts-jest@29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@4.9.5):
+  /ts-jest@29.1.1(jest@29.7.0)(typescript@4.9.5):
     resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==, tarball: http://registry.npm.taobao.org/ts-jest/-/ts-jest-29.1.1.tgz}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     hasBin: true
@@ -11638,7 +11716,6 @@ packages:
       esbuild:
         optional: true
     dependencies:
-      '@babel/core': 7.23.2
       bs-logger: 0.2.6
       fast-json-stable-stringify: 2.1.0
       jest: 29.7.0(@types/node@20.8.7)(ts-node@10.9.1)
@@ -11969,7 +12046,7 @@ packages:
       '@unocss/transformer-directives': 0.55.7
       '@unocss/transformer-variant-group': 0.55.7
       '@unocss/vite': 0.55.7(rollup@3.29.4)(vite@4.5.0)
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     transitivePeerDependencies:
       - postcss
       - rollup
@@ -12120,7 +12197,7 @@ packages:
       chalk: 4.1.2
       debug: 4.3.4
       fs-extra: 10.1.0
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -12142,7 +12219,7 @@ packages:
       html-minifier-terser: 6.1.0
       node-html-parser: 5.4.2
       pathe: 0.2.0
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     dev: true
 
   /vite-plugin-mkcert@1.16.0(vite@4.5.0):
@@ -12155,7 +12232,7 @@ packages:
       axios: 1.5.1(debug@4.3.4)
       debug: 4.3.4
       picocolors: 1.0.0
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     transitivePeerDependencies:
       - encoding
       - supports-color
@@ -12177,7 +12254,7 @@ packages:
       fast-glob: 3.3.1
       mockjs: 1.1.0
       path-to-regexp: 6.2.1
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -12191,7 +12268,7 @@ packages:
       '@purge-icons/core': 0.9.1
       '@purge-icons/generated': 0.9.0
       rollup-plugin-purge-icons: 0.9.1
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     transitivePeerDependencies:
       - encoding
       - supports-color
@@ -12209,7 +12286,7 @@ packages:
       fs-extra: 10.1.0
       magic-string: 0.25.9
       pathe: 0.2.0
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     dev: true
 
   /vite-plugin-svg-icons@2.0.1(vite@4.5.0):
@@ -12225,7 +12302,7 @@ packages:
       pathe: 0.2.0
       svg-baker: 1.7.0
       svgo: 2.8.0
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -12238,7 +12315,7 @@ packages:
       '@rollup/plugin-virtual': 3.0.2(rollup@3.29.4)
       '@swc/core': 1.3.96
       uuid: 9.0.1
-      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0)
+      vite: 4.5.0(@types/node@20.8.7)(less@4.2.0)
     transitivePeerDependencies:
       - '@swc/helpers'
       - rollup
@@ -12248,7 +12325,7 @@ packages:
     resolution: {integrity: sha512-pa27KIsHIBvBMv4xz9uB3UCfAuP2tr7PLlFhCS9vw+aXd326LEHsvhqd3hCQDOR5MjlQVyQH6vwuGr3u+KRiiw==, tarball: http://registry.npm.taobao.org/vite-plugin-vue-setup-extend-plus/-/vite-plugin-vue-setup-extend-plus-0.1.0.tgz}
     dev: true
 
-  /vite@4.5.0(@types/node@20.8.7)(less@4.2.0)(terser@5.22.0):
+  /vite@4.5.0(@types/node@20.8.7)(less@4.2.0):
     resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==, tarball: http://registry.npm.taobao.org/vite/-/vite-4.5.0.tgz}
     engines: {node: ^14.18.0 || >=16.0.0}
     hasBin: true
@@ -12281,7 +12358,6 @@ packages:
       less: 4.2.0
       postcss: 8.4.31
       rollup: 3.29.4
-      terser: 5.22.0
     optionalDependencies:
       fsevents: 2.3.3
     dev: true
@@ -12356,14 +12432,14 @@ packages:
       - supports-color
     dev: true
 
-  /vue-grid-layout@3.0.0-beta1(@interactjs/core@1.10.19)(@interactjs/utils@1.10.19):
+  /vue-grid-layout@3.0.0-beta1:
     resolution: {integrity: sha512-MsW0yfYNtnAO/uDhfZvkP6effxSJxvhAFbIL37x6Rn3vW9xf0WHVefKaSbQMLpSq3mXnR6ut0pg2Cd5lqIIZzg==, tarball: http://registry.npm.taobao.org/vue-grid-layout/-/vue-grid-layout-3.0.0-beta1.tgz}
     dependencies:
-      '@interactjs/actions': 1.10.19(@interactjs/core@1.10.19)(@interactjs/utils@1.10.19)
-      '@interactjs/auto-start': 1.10.19(@interactjs/core@1.10.19)(@interactjs/utils@1.10.19)
-      '@interactjs/dev-tools': 1.10.19(@interactjs/modifiers@1.10.19)(@interactjs/utils@1.10.19)
+      '@interactjs/actions': 1.10.19
+      '@interactjs/auto-start': 1.10.19
+      '@interactjs/dev-tools': 1.10.19(@interactjs/modifiers@1.10.19)
       '@interactjs/interactjs': 1.10.19
-      '@interactjs/modifiers': 1.10.19(@interactjs/core@1.10.19)(@interactjs/utils@1.10.19)
+      '@interactjs/modifiers': 1.10.19
       element-resize-detector: 1.2.4
       mitt: 2.1.0
     transitivePeerDependencies:
@@ -12464,15 +12540,11 @@ packages:
       vue: 3.3.6(typescript@4.9.5)
     dev: false
 
-  /vue3-colorpicker@2.2.2(@aesoper/normal-utils@0.1.5)(@popperjs/core@2.11.8)(@vueuse/core@6.9.2)(gradient-parser@1.0.2)(lodash-es@4.17.21)(tinycolor2@1.6.0)(vue-types@4.2.1)(vue@3.3.6):
+  /vue3-colorpicker@2.2.2(@vueuse/core@6.9.2)(lodash-es@4.17.21)(vue-types@4.2.1)(vue@3.3.6):
     resolution: {integrity: sha512-gHFMGsw9FkpNLFEwbxeG/yM5eLKK3AxLIjebT0bm4U3LnKpEti+UcP729nwTl+Puq2BzvoqWLaWxXpM0KVsL+A==, tarball: http://registry.npm.taobao.org/vue3-colorpicker/-/vue3-colorpicker-2.2.2.tgz}
     peerDependencies:
-      '@aesoper/normal-utils': ^0.1.5
-      '@popperjs/core': ^2.11.8
       '@vueuse/core': ^10.1.2
-      gradient-parser: ^1.0.2
       lodash-es: ^4.17.21
-      tinycolor2: ^1.4.2
       vue: ^3.2.6
       vue-types: ^4.1.0
     dependencies:
@@ -12868,3 +12940,7 @@ packages:
     dependencies:
       tslib: 2.3.0
     dev: false
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false

+ 0 - 12
src/design/vent/index.less

@@ -144,19 +144,7 @@
     }
     /** 下拉框 */
     .@{ventSpace}-select-dropdown {
-      // border-bottom: 1px solid #ececec66;
-      // background: transparent !important;
       border: 1px solid #ececec66;
-      // background: #ffffff !important;
-      // // left: 0px !important;
-      // backdrop-filter: blur(50px);
-      // color: #fff !important;
-      // background: transparent !important;
-      backdrop-filter: blur(50px);
-      .@{ventSpace}-select-item{
-        color: #fff !important;
-      }
-
       .@{ventSpace}-select-item-option-selected,
       .@{ventSpace}-select-item-option-active {
         background-color: #ffffff33 !important;

+ 8 - 0
src/design/vent/modal.less

@@ -95,6 +95,14 @@
         background: #d35d00;
       }
     }
+    .gas_unit_text {
+      writing-mode: vertical-lr;
+      /*垂直展示*/
+      writing-mode: tb-lr;
+      /*兼容IE*/
+      color: #fff;
+      text-orientation: upright;
+    }
   }
   .hot-point {
     .status {

+ 7 - 4
src/layouts/default/sider/bottomSideder.vue

@@ -86,7 +86,12 @@
       }
 
       function handleMenuClick(path: Menu) {
-        
+        if(path.path.includes('sw/monitor-fanmain')) {
+          var url = window.open('_blank') as Window; //打开一个窗口,然后用
+          url.location = 'https://swkhmi.shendong.vip:9043/#SW_PW_NORTH';//使这个窗口跳转到。
+          return
+        }
+
         if (route.path.startsWith('/micro-')) { 
           if (route.path.startsWith(glob.homePath || PageEnum.BASE_HOME)){
             if (!path.path.startsWith(glob.homePath || PageEnum.BASE_HOME)) {
@@ -98,11 +103,8 @@
             go(path.path);
           }
         } else {
-          // micro-vent-3dModal 
           if(route.path.startsWith('/subSysmodal/')) {
             router.replace('/micro-vent-3dModal' + path.path)
-          }else if(path.path == '/sw/monitor-fanmain') {
-            window.open('https://swkhmi.shendong.vip:9043/#SW_PW_NORTH', '_blank')
           }else{
             go(path.path);
           }
@@ -128,6 +130,7 @@
 
       onMounted(async () => {
         menuModules.value = await getMenus();
+        debugger
         currentParentRoute.value = menuModules.value[1];
       });
       return {

+ 4 - 1
src/store/modules/permission.ts

@@ -229,7 +229,10 @@ export const usePermissionStore = defineStore({
             for (const menuItem of routeList) {
               // 条件1:判断组件是否是 layouts/default/index
               if (!hasIndex) {
-                hasIndex = menuItem.component === 'layouts/default/index' || menuItem.path === '/dashboard/analysis';
+                hasIndex =
+                  menuItem.component === 'layouts/default/index' ||
+                  menuItem.component === 'layouts/RouteView' ||
+                  menuItem.path === '/dashboard/analysis';
               }
               // 条件2:判断图标是否带有 冒号
               if (!hasIcon) {

+ 0 - 1
src/utils/encryption/signMd5Utils.js

@@ -33,7 +33,6 @@ export default class signMd5Utils {
     let jsonObj = this.mergeObject(urlParams, requestParams);
     let requestBody = this.sortAsc(jsonObj);
     delete requestBody._t;
-    console.log('sign requestBody:', requestBody);
     return md5(JSON.stringify(requestBody) + signatureSecret).toUpperCase();
   }
 

+ 18 - 4
src/utils/threejs/util.ts

@@ -5,7 +5,7 @@ import { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass.js';
 import { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader.js';
 import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';
 import TWEEN from 'three/examples/jsm/libs/tween.module.js';
-
+import { CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer.js';
 import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';
 import gsap from 'gsap';
 import { useAppStore } from '/@/store/modules/app';
@@ -275,8 +275,8 @@ export const renderVideo = (group, player, playerMeshName) => {
   //加载视频贴图;
   const texture = new THREE.VideoTexture(player);
   console.log('视频贴图------------>', texture);
-  if(texture && texture['data'] && !texture['data'].currentSrc){
-    console.log('摄像头纹理为空。。。。')
+  if (texture && texture['data'] && !texture['data'].currentSrc) {
+    console.log('摄像头纹理为空。。。。');
   }
   if (texture && group?.getObjectByName(playerMeshName)) {
     const player = group.getObjectByName(playerMeshName);
@@ -482,7 +482,21 @@ export const addEnvMap = (hdr, modal) => {
       texture.dispose();
     });
 
-    loader.dispose()
+    loader.dispose();
   });
 };
 
+export const setTag3D = (text, className) => {
+  var div = document.createElement('div') as HTMLElement;
+  div.innerHTML = text;
+  div.classList.add(className);
+  //div元素包装为CSS3模型对象CSS3DObject
+  var label = new CSS3DObject(div);
+  div.style.pointerEvents = 'none'; //避免HTML标签遮挡三维场景的鼠标事件
+  // 设置HTML元素标签在three.js世界坐标中位置
+  // label.position.set(x, y, z);
+  //缩放CSS3DObject模型对象
+  // label.rotateY(Math.PI / 2); //控制HTML标签CSS3对象姿态角度
+  label.rotateX(-Math.PI / 2);
+  return label; //返回CSS3模型标签
+};

+ 0 - 3
src/views/vent/comment/components/customHeader.vue

@@ -64,9 +64,6 @@ export default defineComponent({
   .@{ventSpace}-select-item-option-active {
     background-color: #ffffff33 !important;
   }
-  .zxm-select-item{
-    color: #fff;
-  }
   .@{ventSpace}-select-item:hover {
     background-color: #ffffff33 !important;
   }

+ 10 - 0
src/views/vent/deviceManager/comment/pointTabel/PointTable.vue

@@ -18,6 +18,10 @@
         </div>
         <div v-if="record.editable && column.dataIndex === 'link_id'">
           <Select
+            show-search
+            :default-active-first-option="false"
+            :filter-option="false"
+            @search="handleSearch"
             @change="handleChange($event, index)"
             :options="options"
             :fieldNames="{ label: 'deviceName', value: 'deviceID' }"
@@ -124,6 +128,11 @@
           console.log(res);
         });
       }
+      function handleSearch(val: string){
+        return options.value.map(item => {
+          return (item['deviceName'] as string).includes(val)
+        })
+      };
 
       function handleChangeDeviceType(e, index?) {
         if (!e) return;
@@ -221,6 +230,7 @@
         onEditChange,
         addRow,
         handleChange,
+        handleSearch,
         handleChangeDeviceType,
         handleChangeLinkCode,
         getOptions,

+ 1 - 1
src/views/vent/deviceManager/comment/pointTabel/point.data.ts

@@ -18,7 +18,7 @@ export const columns: BasicColumn[] = [
     width: 100,
   },
   {
-    title: '关联设备',
+    title: '关联设备1',
     dataIndex: 'link_id',
     editRow: true,
     width: 100,

+ 5 - 1
src/views/vent/monitorManager/alarmMonitor/index.vue

@@ -588,6 +588,7 @@
         // align-items: start ;
         &:hover {
           overflow-y: auto;
+          overflow-x: auto;
           & > .icon-item{
             animation-play-state: paused;
             animation: move1 2s linear;
@@ -600,6 +601,9 @@
           justify-content: center;
           padding: 3px;
           animation: move 10s linear infinite;
+          &:nth-child(even){
+            padding-right: 0px;
+          }
 
           .level-text{
             position: absolute;
@@ -631,7 +635,7 @@
             text-shadow: 2px 2px 4px #200000;
           }
           img{
-            width: 227px;
+            width: 225px;
             height: 79px;
           }
         }

+ 80 - 8
src/views/vent/monitorManager/workFaceMonitor/components/workFaceGasHome.vue

@@ -1,5 +1,21 @@
 <template>
   <a-spin tip="Loading..." :spinning="loading">
+    <div id="gasUnitBox" class="modal-monitor vent-flex-row">
+      <div v-for="groupNum in monitorDataGroupNum" :key="groupNum" style="margin: 0 5px;">
+        <FourBorderBg class="four-border-bg">
+          <div class="title">抽采单元{{ groupNum }}</div>
+          <div class="monitor-item" v-for="(gasUnit, index) in gasUnitDetail" :key="index">
+            <span class="monitor-title">{{ gasUnit.title }}:</span>
+            <span class="monitor-val">
+              <span class="val">
+                {{ selectData[groupNum - 1] && selectData[groupNum - 1][gasUnit.code] ? selectData[groupNum - 1][gasUnit.code] : '-'}}
+              </span>
+              <!-- <span class="unit">{{ gasUnit.unit }}</span> -->
+            </span>
+          </div>
+        </FourBorderBg>
+      </div>
+    </div>
     <div class="monitor-container">
       <div class="lr left-box">
         <ventBox1>
@@ -102,18 +118,24 @@
 </template>
 
 <script setup lang="ts">
-
-import { onBeforeMount, ref, onMounted, onUnmounted, reactive, defineProps } from 'vue';
-import { ArrowRightOutlined } from '@ant-design/icons-vue';
+import FourBorderBg from '/@/components/vent/fourBorderBg.vue';
+import { onBeforeMount, ref, onMounted, onUnmounted, defineProps, watch } from 'vue';
+// import { ArrowRightOutlined } from '@ant-design/icons-vue';
 import ventBox1 from '/@/components/vent/ventBox1.vue'
 import { SvgIcon } from '/@/components/Icon';
 import { list } from '../workFace.api';
-import { gasMonitor, gasParamData, currentGasMonitor, gasPumpValve, gasPump, gasExtractionUnit, highTensionNum, lowTensionNum, gasPumpCtr } from '../workFace.data'
+import { gasMonitor, gasParamData, currentGasMonitor, gasPumpValve, gasPump, gasExtractionUnit, highTensionNum, lowTensionNum, gasPumpCtr, gasUnitDetail } from '../workFace.data'
+import {setCss3D, changeCss3D } from '../wokeFace.threejs'
+import { nextTick } from 'vue';
 
 const props = defineProps({
   deviceId: {
     type: String,
     require: true
+  },
+  gasUnitNum: {
+    type: Number,
+    default: 0
   }
 })
 
@@ -128,10 +150,9 @@ const windDataSource = ref([]);
 const temperatureDataSource = ref([]);
 const fireDataSource = ref([]);
 
-
 // 监测数据
-const selectData = reactive({});
-
+const selectData = ref([]);
+const monitorDataGroupNum = ref(props.gasUnitNum)
 // https获取监测数据
 let timer: null | NodeJS.Timeout = null;
 function getMonitor(flag?) {
@@ -139,7 +160,7 @@ function getMonitor(flag?) {
     timer = setTimeout(async () => {
       if (props.deviceId) {
         const data = await getDataSource(props.deviceId)
-        Object.assign(selectData, data);
+        // Object.assign(selectData, data);
       }
       if (timer) {
         timer = null;
@@ -210,6 +231,12 @@ function toDetail() {
 
 }
 
+watch(() => props.gasUnitNum, (val) => {
+  monitorDataGroupNum.value = val
+  nextTick(() => {
+    setCss3D()
+  })
+})
 
 onBeforeMount(() => {
 
@@ -219,8 +246,14 @@ onMounted(async () => {
   loading.value = true;
   timer = null
   await getMonitor(true)
+  nextTick(() => {
+    setCss3D()
+  })
+  
+  // changeCss3D(true)
 });
 onUnmounted(() => {
+  // changeCss3D(false)
   if (timer) {
     clearTimeout(timer);
     timer = undefined;
@@ -251,7 +284,46 @@ onUnmounted(() => {
   @ventSpace: zxm;
   @import '/@/design/vent/modal.less';
   @import '../../comment/less/workFace.less';
+  .modal-monitor{
+    position: absolute;
+    z-index: -1;
+    flex-direction: row-reverse;
+    :deep(.main-container){
+      background-color: #00000078
+    }
+    .monitor-item {
+      width: 180px;
+      display: flex;
+      flex-direction: row;
+      width: auto;
+      margin-bottom: 3px;
+      .monitor-title {
+        width: 120px;
+        color: #7af5ff;
+        font-weight: 400;
+        font-size: 13px;
+      }
+      .monitor-val {
+        color: #ffb700;
+        display: flex;
+        width: auto;
 
+        .val {
+          width: 60px;
+          font-size: 13px;
+          text-align: center;
+        }
+
+        .unit {
+          color: #ffffffbb;
+          font-size: 13px;
+        }
+      }
+    }
+    .title{
+      text-align: center;
+    }
+  }
   .left-box{
     width: 360px;
   }

+ 21 - 12
src/views/vent/monitorManager/workFaceMonitor/index.vue

@@ -4,14 +4,15 @@
     class="bg"
     style="width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; overflow: hidden">
     <a-spin :spinning="loading" />
-    <div
-        id="workFace3DCSS"
-        class="threejs-Object-CSS"
-        v-show="!loading"
-        style="width: 100%; height: 100%; position: absolute; pointer-events: none; overflow: hidden; z-index: 1; top: 0"
-      >
-    </div>
+    
     <div id="workFace3D" style="width: 100%; height: 100%; position: absolute; overflow: hidden"> </div>
+    <div
+          id="workFace3DCSS"
+          class="threejs-Object-CSS"
+          v-show="!loading"
+          style="width: 100%; height: 100%; position: absolute; pointer-events: none; overflow: hidden; z-index: 1; top: 0"
+        >
+      </div>
   </div>
   <div class="scene-box">
     <customHeader :fieldNames="{ label: 'systemname', value: 'id', options: 'children' }" :options = 'options' @change="getSelectRow" :optionValue="optionValue">回采工作面智能管控</customHeader>
@@ -27,7 +28,7 @@
         <workFaceVentHome v-if="monitorActive == 1" :deviceId = 'optionValue' />
         <workFaceFireHome v-if="monitorActive == 2" :deviceId = 'optionValue'/>
         <workFaceDustHome v-if="monitorActive == 3" :deviceId = 'optionValue'/>
-        <workFaceGasHome v-if="monitorActive == 4" :deviceId = 'optionValue'/>
+        <workFaceGasHome v-if="monitorActive == 4" :deviceId = 'optionValue' :gas-unit-num="gasUnitNum"/>
       </template>
       <div v-else class="history-group">
         <div class="device-button-group" v-if="deviceList.length > 0 && activeKey !== 'faultRecord'">
@@ -46,7 +47,7 @@
 
 <script setup lang="ts">
 import { onBeforeMount, ref, onMounted, onUnmounted, nextTick } from 'vue';
-import { mountedThree, destroy, setModelType } from './wokeFace.threejs';
+import { mountedThree, destroy, setModelType, clearCss3D } from './wokeFace.threejs';
 import { getTableList, systemList } from './workFace.api';
 import { monitorNav } from './workFace.data'
 import customHeader from '/@/views/vent/comment/components/customHeader.vue';
@@ -83,6 +84,7 @@ const deviceType = ref('')
 
 const options = ref()
 const optionValue = ref('')
+const gasUnitNum = ref(0)
 
 const isRefresh = ref(true)
 
@@ -90,14 +92,15 @@ function changeActive(activeValue) {
   activeKey.value = activeValue
   loading.value = true
   if(activeKey.value === 'monitor'){
-    // refreshModal()
-    setModelType(modalType)
+    gasUnitNum.value = Math.ceil(Math.random() * 10)
+    setModelType(modalType, gasUnitNum.value)
     setTimeout(() =>{
       loading.value = false
     }, 600)
     
   }else{
     loading.value = false
+    clearCss3D()
   }
 }
 
@@ -166,6 +169,8 @@ function changeModalType(currentData) {
     // 双进双回
     modalType = 'workFace4'
   }
+  gasUnitNum.value = Math.ceil(Math.random() * 10)
+  setModelType(modalType, gasUnitNum.value)
 }
 
 function changeMonitor(nav) {
@@ -175,6 +180,9 @@ function changeMonitor(nav) {
       item.isShow = false
     }else{
       monitorActive.value = index
+      if (monitorActive.value != 4) {
+        clearCss3D()
+      }
     }
   })
 }
@@ -188,7 +196,8 @@ onMounted(async() => {
   await getSysDataSource()
   loading.value = true;
   mountedThree().then(async () => {
-    setModelType(modalType)
+    gasUnitNum.value = Math.ceil(Math.random() * 10)
+    setModelType(modalType, gasUnitNum.value)
     loading.value = false;
   });
 });

+ 22 - 23
src/views/vent/monitorManager/workFaceMonitor/wokeFace.threejs.ts

@@ -47,31 +47,33 @@ const render = () => {
     model.stats?.update();
     model.orbitControls?.update();
     model.camera?.updateMatrixWorld();
+    workFaceObj?.render();
   }
 };
 
-export const refreshModal = () => {
-  workFaceObj.render();
+export const setCss3D = () => {
+  workFaceObj?.setCss3D();
+};
+export const clearCss3D = () => {
+  workFaceObj?.clearCss3D();
 };
 
 // 切换风窗类型
-export const setModelType = (type) => {
+export const setModelType = (type, n = Math.ceil(Math.random() * 10)) => {
+  debugger;
   fiberType = type;
   return new Promise((resolve) => {
     if (workFaceObj) {
+      workFaceObj.clearPlanes();
       group = workFaceObj.group;
 
-      if (!model.scene.getObjectByName('workFace')) {
-        model.scene.add(workFaceObj.group);
-      }
-
       workFaceObj.setModalType(type);
       // 判断模型类型
       if (type == 'workFace1') {
         var oldControlsPosition = { x: 0.055, y: 0.062, z: 0.117 };
         var oldCameraPosition = { x: 0.055, y: 0.062, z: 0.117 };
-        var newCameraPosition = { x: -0.03, y: 0.91, z: 0.239 };
-        var newControlsPosition = { x: -0.03, y: 0.114, z: 0.007 };
+        var newCameraPosition = { x: -0.17182200678070425, y: 1.7188311320712673, z: 1.787394450495768 };
+        var newControlsPosition = { x: -0.171622930063528, y: -0.1442344658741759, z: 0.032110784753260874 };
       } else if (type == 'workFace2') {
         var oldControlsPosition = { x: 0.055, y: 0.062, z: 0.117 };
         var oldCameraPosition = { x: 1.403, y: 3.354, z: 2.873 };
@@ -85,23 +87,20 @@ export const setModelType = (type) => {
       } else {
         var oldControlsPosition = { x: 0.055, y: 0.062, z: 0.117 };
         var oldCameraPosition = { x: 1.403, y: 3.354, z: 2.873 };
-        var newCameraPosition = { x: -0.03126, y: 0.81725, z: 0.6104 };
-        var newControlsPosition = { x: -0.0312, y: 0.0648, z: 0.0852 };
+        var newCameraPosition = { x: -0.17182200678070425, y: 1.7188311320712673, z: 1.787394450495768 };
+        var newControlsPosition = { x: -0.171622930063528, y: -0.1442344658741759, z: 0.032110784753260874 };
+      }
+      if (model.scene.getObjectByName('workFace')) {
+        model.camera.position.set(oldCameraPosition.x, oldCameraPosition.y, oldCameraPosition.z+20);
+        model.orbitControls.target.set(oldControlsPosition.x, oldControlsPosition.y, oldControlsPosition.z);
       }
-
-      model.orbitControls.addEventListener('change', workFaceObj.render.bind(workFaceObj));
-
       setTimeout(async () => {
         resolve(null);
-        await animateCamera(
-          oldCameraPosition,
-          oldControlsPosition,
-          newCameraPosition,
-          newControlsPosition,
-          model,
-          0.8,
-          workFaceObj.render.bind(workFaceObj)
-        );
+        if (!model.scene.getObjectByName('workFace')) {
+          model.scene.add(workFaceObj?.group);
+        }
+        workFaceObj?.setPlanes(n);
+        await animateCamera(oldCameraPosition, oldControlsPosition, newCameraPosition, newControlsPosition, model, 0.8);
       }, 600);
     }
   });

+ 32 - 1
src/views/vent/monitorManager/workFaceMonitor/workFace.data.ts

@@ -703,6 +703,37 @@ export const gasPump = [
 ];
 export const gasPumpCtr = reactive({
   gasPump1Open: '0',
-  gasPump2Open: '0'
+  gasPump2Open: '0',
 });
+export const gasUnitDetail = [
+  {
+    title: '抽采负压(kPa)',
+    code: 'nPressure',
+    // unit: 'kPa',
+  },
+  {
+    title: '甲烷浓度(%)',
+    code: 'CH4  ',
+    // unit: '%',
+  },
+  {
+    title: '气体温度(℃)',
+    code: 'temperature',
+    // unit: '℃',
+  },
+  {
+    title: '瞬时流量(万m³)',
+    code: 'flowRate',
+    // unit: '万m³',
+  },
+  {
+    title: '实时累计纯量(万m³)',
+    code: 'scalarRate',
+    // unit: '万m³',
+  },
+  // {
+  //   title: '累计抽采量 (m³)',
+  //   code: 'unitTotalMass',
+  // },
+];
 

+ 69 - 2
src/views/vent/monitorManager/workFaceMonitor/workFace.threejs.base.ts

@@ -6,7 +6,8 @@ import { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass.js';
 import { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader.js';
 import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js';
 import { OutputPass } from 'three/examples/jsm/postprocessing/OutputPass.js';
-import { setModalCenter } from '/@/utils/threejs/util';
+import { setModalCenter, setTag3D } from '/@/utils/threejs/util';
+import { CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer.js';
 
 // import * as dat from 'dat.gui';
 // const gui = new dat.GUI();
@@ -33,6 +34,7 @@ class WorkFace {
   errorLocationTexture: THREE.Texture | null = null;
   playerStartClickTime1 = new Date().getTime();
   playerStartClickTime2 = new Date().getTime();
+  planeNum = 0;
 
   constructor(model) {
     this.model = model;
@@ -75,6 +77,69 @@ class WorkFace {
     }
   }
 
+  setPlanes = (n, colors = new Array(n).fill(new THREE.Color('rgb(100%, 0%, 0%)'))) => {
+    this.planeNum = n;
+    const lenScale = 0.77 / n;
+    const planeGeo = new THREE.PlaneGeometry();
+    planeGeo.applyMatrix4(new THREE.Matrix4().makeTranslation(-1, 0, 0));
+    for (let i = 0; i < n; i++) {
+      const material = new THREE.MeshBasicMaterial({ color: colors[i], transparent: true, opacity: 0.6, depthTest: false, depthWrite: false });
+      const plane = new THREE.Mesh(planeGeo, material);
+      plane.name = 'unit' + i;
+      plane.rotation.x = -Math.PI / 2;
+      plane.scale.set(lenScale - 0.001, 0.375, 1.0);
+      plane.position.set(0.282 - lenScale * (i - 0.5), 0.015, 0.142);
+      this.group.add(plane);
+      const label = setTag3D(`抽采单元${i + 1}`, 'gas_unit_text');
+      label.scale.set(0.0018, 0.0018, 1); //根据相机渲染范围控制HTML 3D标签尺寸
+      label.position.set(0.282 - lenScale * (i + 0.5), 0.015, 0.142);
+      label.name = 'planeText' + i;
+      this.group.add(label);
+    }
+  };
+
+  clearPlanes = () => {
+    for (let i = 0; i < this.planeNum; i++) {
+      const plane = this.group.getObjectByName(`unit${i}`);
+      const label = this.group.getObjectByName(`planeText${i}`);
+      if (plane) this.group.remove(plane);
+      if (label) this.group.remove(label);
+    }
+  };
+
+  setCss3D = () => {
+    const obj = this.group.getObjectByName(`unitText`);
+    if (!obj) {
+      const element = document.getElementById(`gasUnitBox`) as HTMLElement;
+      if (element) {
+        const gasUnitCSS3D = new CSS3DObject(element);
+        gasUnitCSS3D.name = `unitText`;
+        gasUnitCSS3D.scale.set(0.0009, 0.0009, 0.0009);
+        gasUnitCSS3D.position.set(-0.1, 0.11, 0.05);
+        gasUnitCSS3D.lookAt(-0.1, 0.5, 1);
+        this.group.add(gasUnitCSS3D);
+      }
+    }
+  };
+
+  changeCss3D = (isHide) => {
+    for (let i = 0; i < this.planeNum; i++) {
+      const obj = this.group.getObjectByName(`unitText${i}`);
+      if (obj) {
+        obj.visible = isHide;
+      }
+    }
+  };
+
+  clearCss3D = () => {
+    const obj = this.group.getObjectByName(`unitText`);
+    if (obj) this.group.remove(obj);
+    const element = document.getElementById(`gasUnitBox`) as HTMLElement;
+    if(element){
+      element.remove()
+    }
+  };
+
   setRenderPass = () => {
     this.bloomLayer.set(this.glob.BLOOM_SCENE);
 
@@ -305,12 +370,14 @@ class WorkFace {
       this.model.orbitControls.update();
       this.model.setGLTFModel([this.modelName]).then(async (gltf) => {
         this.group = gltf[0];
+        this.setPlanes(7);
         // this.group.position.set(-0.06, 0.28, 0.07);
-        // this.group.scale.set(2.5, 2.5, 2.5);
+        this.group.scale.set(2.5, 2.5, 2.5);
         this.resetMesh();
         this.getPositions(this.glob.N);
         this.addLight();
         this.drawSpheres();
+
         resolve(null);
       });
     });

+ 1 - 0
types/vue-router.d.ts

@@ -41,5 +41,6 @@ declare module 'vue-router' {
     ignoreRoute?: boolean;
     // Hide path for children
     hidePathForChildren?: boolean;
+    ver?: string
   }
 }