Browse Source

阻力路线

hongrunxia 2 years ago
parent
commit
ec07bfb7b5
46 changed files with 1519 additions and 482 deletions
  1. 1 0
      package.json
  2. 77 1
      pnpm-lock.yaml
  3. 9 0
      src/assets/icons/path-icon1.svg
  4. 17 0
      src/assets/icons/path-icon2.svg
  5. 22 0
      src/assets/icons/path-icon3.svg
  6. 27 0
      src/assets/icons/path-icon4.svg
  7. BIN
      src/assets/images/vent/path/bg.png
  8. BIN
      src/assets/images/vent/path/cicle01.png
  9. BIN
      src/assets/images/vent/path/cicle02.png
  10. BIN
      src/assets/images/vent/path/cicle03.png
  11. BIN
      src/assets/images/vent/path/cicle04.png
  12. BIN
      src/assets/images/vent/path/di.png
  13. BIN
      src/assets/images/vent/path/path-feature-bg.png
  14. BIN
      src/assets/images/vent/path/pie-line.png
  15. BIN
      src/assets/images/vent/path/zl-bg.png
  16. BIN
      src/assets/images/vent/path/zl-bg1.png
  17. BIN
      src/assets/images/vent/path/zl-bg2.png
  18. BIN
      src/assets/images/vent/path/zl-path-item-bg.png
  19. 1 0
      src/components/Container/src/Adaptive.vue
  20. 14 0
      src/design/vent/index.less
  21. 7 2
      src/layouts/default/content/index.vue
  22. 10 1
      src/layouts/default/header/index.vue
  23. 0 1
      src/layouts/default/menu/index.vue
  24. 25 3
      src/qiankun/apps.ts
  25. 3 1
      src/qiankun/index.ts
  26. 0 1
      src/router/guard/index.ts
  27. 44 3
      src/router/routes/basic.ts
  28. 1 1
      src/utils/threejs/loadModel.worker.js
  29. 790 296
      src/views/demo/threejs/damper.vue
  30. 218 0
      src/views/demo/threejs/network.data.ts
  31. 12 11
      src/views/system/menu/menu.api.ts
  32. 5 0
      src/views/vent/deviceManager/sensorTabel/sensor.data.ts
  33. 1 1
      src/views/vent/deviceManager/substationTabel/substation.data.ts
  34. 2 2
      src/views/vent/monitorManager/gateMonitor/gate.threejs.ts
  35. 18 13
      src/views/vent/monitorManager/gateMonitor/index.vue
  36. 0 2
      src/views/vent/monitorManager/mainFanMonitor/index.vue
  37. 3 3
      src/views/vent/monitorManager/windowMonitor/dandaoFc.threejs.ts
  38. 2 2
      src/views/vent/monitorManager/windowMonitor/shuangdaoFc.threejs.ts
  39. 42 23
      src/views/vent/monitorManager/windrectMonitor/components/resultTable.vue
  40. 36 39
      src/views/vent/monitorManager/windrectMonitor/duishe.threejs.ts
  41. 18 10
      src/views/vent/monitorManager/windrectMonitor/index.vue
  42. 64 50
      src/views/vent/monitorManager/windrectMonitor/longmen.threejs.ts
  43. 2 1
      src/views/vent/monitorManager/windrectMonitor/windrect.api.ts
  44. 32 5
      src/views/vent/monitorManager/windrectMonitor/windrect.data.ts
  45. 13 4
      src/views/vent/monitorManager/windrectMonitor/windrect.threejs.ts
  46. 3 6
      src/views/vent/monitorManager/windrectMonitor/zhedie.threejs.ts

+ 1 - 0
package.json

@@ -38,6 +38,7 @@
     "@ant-design/icons-vue": "^6.1.0",
     "@iconify/iconify": "^2.2.1",
     "@jeecg/online": "3.4.4-RC",
+    "@kjgl77/datav-vue3": "^1.4.2",
     "@liveqing/liveplayer-v3": "^3.1.9",
     "@logicflow/core": "^1.1.13",
     "@logicflow/extension": "^1.1.13",

+ 77 - 1
pnpm-lock.yaml

@@ -12,6 +12,7 @@ specifiers:
   '@iconify/iconify': ^2.2.1
   '@iconify/json': ^2.1.30
   '@jeecg/online': 3.4.4-RC
+  '@kjgl77/datav-vue3': ^1.4.2
   '@liveqing/liveplayer-v3': ^3.1.9
   '@logicflow/core': ^1.1.13
   '@logicflow/extension': ^1.1.13
@@ -158,6 +159,7 @@ dependencies:
   '@ant-design/icons-vue': 6.1.0_vue@3.2.45
   '@iconify/iconify': 2.2.1
   '@jeecg/online': 3.4.4-RC
+  '@kjgl77/datav-vue3': 1.4.2_vue@3.2.45
   '@liveqing/liveplayer-v3': 3.7.9
   '@logicflow/core': 1.1.31
   '@logicflow/extension': 1.1.31
@@ -2322,6 +2324,38 @@ packages:
       chalk: 4.1.2
     dev: true
 
+  /@jiaminghi/bezier-curve/0.0.9:
+    resolution: {integrity: sha512-u9xJPOEl6Dri2E9FfmJoGxYQY7vYJkURNX04Vj64tdi535tPrpkuf9Sm0lNr3QTKdHQh0DdNRsaa62FLQNQEEw==}
+    dependencies:
+      '@babel/runtime': 7.20.6
+    dev: false
+
+  /@jiaminghi/c-render/0.4.3:
+    resolution: {integrity: sha512-FJfzj5hGj7MLqqqI2D7vEzHKbQ1Ynnn7PJKgzsjXaZpJzTqs2Yw5OSeZnm6l7Qj7jyPAP53lFvEQNH4o4j6s+Q==}
+    dependencies:
+      '@babel/runtime': 7.20.6
+      '@jiaminghi/bezier-curve': 0.0.9
+      '@jiaminghi/color': 1.1.3
+      '@jiaminghi/transition': 1.1.11
+    dev: false
+
+  /@jiaminghi/charts/0.2.18:
+    resolution: {integrity: sha512-K+HXaOOeWG9OOY1VG6M4mBreeeIAPhb9X+khG651AbnwEwL6G2UtcAQ8GWCq6GzhczcLwwhIhuaHqRygwHC0sA==}
+    dependencies:
+      '@babel/runtime': 7.20.6
+      '@jiaminghi/c-render': 0.4.3
+    dev: false
+
+  /@jiaminghi/color/1.1.3:
+    resolution: {integrity: sha512-ZY3hdorgODk4OSTbxyXBPxAxHPIVf9rPlKJyK1C1db46a50J0reFKpAvfZG8zMG3lvM60IR7Qawgcu4ZDO3+Hg==}
+    dev: false
+
+  /@jiaminghi/transition/1.1.11:
+    resolution: {integrity: sha512-owBggipoHMikDHHDW5Gc7RZYlVuvxHADiU4bxfjBVkHDAmmck+fCkm46n2JzC3j33hWvP9nSCAeh37t6stgWeg==}
+    dependencies:
+      '@babel/runtime': 7.20.6
+    dev: false
+
   /@jridgewell/gen-mapping/0.1.1:
     resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==}
     engines: {node: '>=6.0.0'}
@@ -2374,6 +2408,19 @@ packages:
       '@jridgewell/sourcemap-codec': 1.4.14
     dev: true
 
+  /@kjgl77/datav-vue3/1.4.2_vue@3.2.45:
+    resolution: {integrity: sha512-2bwQtvPpRNSmWAUS/e81SLZdOabCdiF3wGkvLjkOa/n4grygNk0f8l7AwpaP0bUlc4ougPgFRIAy/wzkyNocoA==}
+    dependencies:
+      '@jiaminghi/c-render': 0.4.3
+      '@jiaminghi/charts': 0.2.18
+      '@jiaminghi/color': 1.1.3
+      '@vueuse/core': 9.13.0_vue@3.2.45
+      lodash-es: 4.17.21
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+    dev: false
+
   /@liveqing/liveplayer-v3/3.7.9:
     resolution: {integrity: sha512-BG+0D9o1xICFzywSsSvUBICKJGK8ByvkFyt2rh3fKkfntukggKFuR4Y0sxNnCLLOvZgtulqTiWTPgg4sujnKAQ==}
     dev: false
@@ -2981,6 +3028,10 @@ packages:
     resolution: {integrity: sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==}
     dev: false
 
+  /@types/web-bluetooth/0.0.16:
+    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
+    dev: false
+
   /@types/webxr/0.5.0:
     resolution: {integrity: sha512-IUMDPSXnYIbEO2IereEFcgcqfDREOgmbGqtrMpVPpACTU6pltYLwHgVkrnYv0XhWEcjio9sYEfIEzgn3c7nDqA==}
     dev: false
@@ -3360,10 +3411,26 @@ packages:
       vue-demi: 0.13.11_vue@3.2.45
     dev: false
 
+  /@vueuse/core/9.13.0_vue@3.2.45:
+    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
+    dependencies:
+      '@types/web-bluetooth': 0.0.16
+      '@vueuse/metadata': 9.13.0
+      '@vueuse/shared': 9.13.0_vue@3.2.45
+      vue-demi: 0.13.11_vue@3.2.45
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+    dev: false
+
   /@vueuse/metadata/8.9.4:
     resolution: {integrity: sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==}
     dev: false
 
+  /@vueuse/metadata/9.13.0:
+    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
+    dev: false
+
   /@vueuse/shared/8.9.4_vue@3.2.45:
     resolution: {integrity: sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==}
     peerDependencies:
@@ -3379,6 +3446,15 @@ packages:
       vue-demi: 0.13.11_vue@3.2.45
     dev: false
 
+  /@vueuse/shared/9.13.0_vue@3.2.45:
+    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
+    dependencies:
+      vue-demi: 0.13.11_vue@3.2.45
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+    dev: false
+
   /@windicss/config/1.8.8:
     resolution: {integrity: sha512-kNas/zMkwsDFMcJPmHoPDJlQi1MHvYwx8BSxo9JKcbCW7Gaj8Rg2CnEImX5YdT+ZcFQqQ+kUn0Vi/ScsAxhGEw==}
     dependencies:
@@ -11692,7 +11768,7 @@ packages:
     dev: true
 
   /three/0.149.0:
-    resolution: {integrity: sha512-tohpUxPDht0qExRLDTM8sjRLc5d9STURNrdnK3w9A+V4pxaTBfKWWT/IqtiLfg23Vfc3Z+ImNfvRw1/0CtxrkQ==}
+    resolution: {integrity: sha512-tohpUxPDht0qExRLDTM8sjRLc5d9STURNrdnK3w9A+V4pxaTBfKWWT/IqtiLfg23Vfc3Z+ImNfvRw1/0CtxrkQ==, tarball: three/-/three-0.149.0.tgz}
     dev: false
 
   /throat/6.0.1:

+ 9 - 0
src/assets/icons/path-icon1.svg

@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21.276" height="21.276" viewBox="0 0 21.276 21.276">
+  <defs>
+    <linearGradient id="linear-gradient" y1="0.5" x2="1" y2="0.5" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#00dcff"/>
+      <stop offset="1" stop-color="#dffdff"/>
+    </linearGradient>
+  </defs>
+  <path id="路径_45344" data-name="路径 45344" d="M74.138,64A10.138,10.138,0,1,0,84.276,74.138,10.14,10.14,0,0,0,74.138,64Zm0,15.931a1.086,1.086,0,1,1,1.086-1.086A1.088,1.088,0,0,1,74.138,79.931ZM75.224,74.5a1.086,1.086,0,0,1-2.172,0V69.431a1.086,1.086,0,0,1,2.172,0Z" transform="translate(-63.5 -63.5)" stroke="rgba(0,0,0,0)" stroke-miterlimit="10" stroke-width="1" fill="url(#linear-gradient)"/>
+</svg>

+ 17 - 0
src/assets/icons/path-icon2.svg

@@ -0,0 +1,17 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22.234" height="18.269" viewBox="0 0 22.234 18.269">
+  <defs>
+    <linearGradient id="linear-gradient" y1="0.5" x2="1" y2="0.5" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#00dcff"/>
+      <stop offset="1" stop-color="#dffdff"/>
+    </linearGradient>
+  </defs>
+  <g id="组_11688" data-name="组 11688" transform="translate(-670.17 -377.71)">
+    <path id="路径_45341" data-name="路径 45341" d="M691.615,385.911V385.9h-2.388v.011l-.789.789v.789H674.146V386.7l-.8-.789h-2.377l-.8.789v7.941l.8.8h2.377l.8-.8v-.789h14.293v.789l.789.8h2.388l.789-.8V386.7Z" transform="translate(0 0.539)" fill="url(#linear-gradient)"/>
+    <rect id="矩形_4050" data-name="矩形 4050" width="1.588" height="1.588" transform="translate(685.262 379.298)" fill="url(#linear-gradient)"/>
+    <rect id="矩形_4051" data-name="矩形 4051" width="1.588" height="1.588" transform="translate(678.91 379.298)" fill="url(#linear-gradient)"/>
+    <rect id="矩形_4052" data-name="矩形 4052" width="1.588" height="1.588" transform="translate(682.086 379.298)" fill="url(#linear-gradient)"/>
+    <path id="路径_45342" data-name="路径 45342" d="M688.1,382.474v-1.588h-.789V379.3h.789V377.71l3.176,2.388Z" transform="translate(1.129)" fill="url(#linear-gradient)"/>
+    <rect id="矩形_4053" data-name="矩形 4053" width="1.588" height="1.588" transform="translate(675.734 379.298)" fill="url(#linear-gradient)"/>
+    <path id="路径_45343" data-name="路径 45343" d="M673.346,379.3h.8v1.588h-.8v1.588L670.17,380.1l3.176-2.388Z" fill="url(#linear-gradient)"/>
+  </g>
+</svg>

+ 22 - 0
src/assets/icons/path-icon3.svg

@@ -0,0 +1,22 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21.226" height="18.187" viewBox="0 0 21.226 18.187">
+  <defs>
+    <linearGradient id="linear-gradient" y1="0.5" x2="1" y2="0.5" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#00dcff"/>
+      <stop offset="1" stop-color="#dffdff"/>
+    </linearGradient>
+  </defs>
+  <g id="组_11690" data-name="组 11690" transform="translate(-574.227 -261.657)">
+    <g id="组_11680" data-name="组 11680" transform="translate(575.477 261.657)">
+      <path id="路径_45337" data-name="路径 45337" d="M621.73,349.187H600.75V331h2.5v15.687h18.48Z" transform="translate(-602 -331)" fill="url(#linear-gradient)"/>
+      <path id="路径_45338" data-name="路径 45338" d="M624.724,366.31a17.716,17.716,0,0,1-3.879-2.22,16.546,16.546,0,0,1-5.8-7.531c-1.107-3.022-2.5-4.322-3.475-4.88a3.137,3.137,0,0,0-1.492-.473l-.059.006H606v-2.5h3.922a5.492,5.492,0,0,1,2.889.8c1.942,1.112,3.483,3.195,4.58,6.189,2.171,5.929,8.156,8.248,8.216,8.271Z" transform="translate(-605.632 -348.214)" fill="url(#linear-gradient)"/>
+    </g>
+    <g id="组_11681" data-name="组 11681" transform="translate(582.98 270.944) rotate(180)">
+      <path id="路径_45339" data-name="路径 45339" d="M0,0,2.443,2.046,0,4.093Z" transform="translate(2.971 0)" fill="url(#linear-gradient)"/>
+      <path id="路径_45340" data-name="路径 45340" d="M0,0H2.971V1.679H0Z" transform="translate(0 1.207)" fill="url(#linear-gradient)"/>
+    </g>
+    <g id="组_11691" data-name="组 11691" transform="translate(582.98 275.759) rotate(180)">
+      <path id="路径_45339-2" data-name="路径 45339" d="M0,0,2.443,2.046,0,4.093Z" transform="translate(2.971 0)" fill="url(#linear-gradient)"/>
+      <path id="路径_45340-2" data-name="路径 45340" d="M0,0H2.971V1.679H0Z" transform="translate(0 1.207)" fill="url(#linear-gradient)"/>
+    </g>
+  </g>
+</svg>

+ 27 - 0
src/assets/icons/path-icon4.svg

@@ -0,0 +1,27 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20.477" height="17.754" viewBox="0 0 20.477 17.754">
+  <defs>
+    <linearGradient id="linear-gradient" y1="0.5" x2="1" y2="0.5" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#00dcff"/>
+      <stop offset="1" stop-color="#dffdff"/>
+    </linearGradient>
+  </defs>
+  <g id="组_11692" data-name="组 11692" transform="translate(-548.479 -354.17)">
+    <g id="组_11683" data-name="组 11683" transform="translate(549.729 354.17)">
+      <g id="组_11680" data-name="组 11680">
+        <path id="路径_45337" data-name="路径 45337" d="M621.227,348.754H600.75V331h2.5v15.254h17.977Z" transform="translate(-602 -331)" fill="url(#linear-gradient)"/>
+      </g>
+    </g>
+    <g id="椭圆_2499" data-name="椭圆 2499" transform="translate(557.488 357.524)" fill="rgba(14,223,255,0.3)" stroke="#0edfff" stroke-width="1">
+      <circle cx="5.003" cy="5.003" r="5.003" stroke="none"/>
+      <circle cx="5.003" cy="5.003" r="4.503" fill="none"/>
+    </g>
+    <g id="椭圆_2500" data-name="椭圆 2500" transform="translate(556.82 362.861)" fill="rgba(14,223,255,0.1)" stroke="#0edfff" stroke-width="1">
+      <circle cx="3.002" cy="3.002" r="3.002" stroke="none"/>
+      <circle cx="3.002" cy="3.002" r="2.502" fill="none"/>
+    </g>
+    <g id="椭圆_2501" data-name="椭圆 2501" transform="translate(553.045 355.951)" fill="rgba(14,223,255,0.1)" stroke="#0edfff" stroke-width="0.5">
+      <circle cx="1.573" cy="1.573" r="1.573" stroke="none"/>
+      <circle cx="1.573" cy="1.573" r="1.323" fill="none"/>
+    </g>
+  </g>
+</svg>

BIN
src/assets/images/vent/path/bg.png


BIN
src/assets/images/vent/path/cicle01.png


BIN
src/assets/images/vent/path/cicle02.png


BIN
src/assets/images/vent/path/cicle03.png


BIN
src/assets/images/vent/path/cicle04.png


BIN
src/assets/images/vent/path/di.png


BIN
src/assets/images/vent/path/path-feature-bg.png


BIN
src/assets/images/vent/path/pie-line.png


BIN
src/assets/images/vent/path/zl-bg.png


BIN
src/assets/images/vent/path/zl-bg1.png


BIN
src/assets/images/vent/path/zl-bg2.png


BIN
src/assets/images/vent/path/zl-path-item-bg.png


+ 1 - 0
src/components/Container/src/Adaptive.vue

@@ -78,6 +78,7 @@
       };
 
       const updateScale = () => {
+        // debugger
         // 获取真实的视口尺寸
         const currentWidth = document.body.clientWidth;
         const currentHeight = document.body.clientHeight;

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

@@ -133,6 +133,12 @@
         color: #fff !important;
       }
     }
+    .ant-select-dropdown, .ant-select-tree{
+      background: #fff0 !important;
+    }
+    .ant-select-tree{
+      // backdrop-filter: blur(2px);
+    }
   }
 }
 .vent-modal {
@@ -370,6 +376,9 @@
     }
   }
 }
+.ant-table-row-expand-icon {
+  background: #fff0 !important;
+}
 
 .modal-container {
   min-height: 100px;
@@ -393,4 +402,9 @@
   }
 }
 
+input:-internal-autofill-previewed,
+input:-internal-autofill-selected {
+  // -webkit-text-fill-color: #2a2d33;
+  transition: background-color 5000s ease-out 0.5s;
+}
 

+ 7 - 2
src/layouts/default/content/index.vue

@@ -11,7 +11,7 @@
         </div>
       </div>
     </div>
-    <div id="content" class="app-view-box" style="position: relative" v-if="openQianKun == 'true'"> </div>
+    <div id="content" class="app-view-box" style="position: relative" v-if="openQianKun == 'true' && currentRoute.path !== '/micro-vent-3dModal/modelchannel/safety/VentanalyModel3D'"> </div>
     <!-- update-end-author:zyf date:20211129 for: qiankun 挂载子应用盒子-->
   </div>
 </template>
@@ -51,6 +51,10 @@
               if (newState[key] !== prev[key] && newState[key] === true) {
                 loading.value = false;
                 console.log('首页已经渲染完毕');
+                const route = unref(currentRoute);
+                if (route.path == '/micro-vent-3dModal/modelchannel/safety/VentanalyModel3D' && document.body.getAttribute('class')?.includes('style-styleTwo')) {
+                  document.body.removeAttribute('class', 'style-styleTwo');
+                }
               }
             }
           }
@@ -65,7 +69,7 @@
         } else {
           document.body.setAttribute('class', 'style-styleTwo');
         }
-        return getShowFullHeaderRef && !route.path.startsWith('/micro-');
+        return getShowFullHeaderRef.value && (!route.path.startsWith('/micro-') || route.path == '/micro-vent-3dModal/modelchannel/safety/VentanalyModel3D');
       });
       onBeforeMount(() => {});
       onMounted(() => {
@@ -86,6 +90,7 @@
         getPageLoading,
         getShowFullHeader,
         loading,
+        currentRoute
       };
     },
   });

+ 10 - 1
src/layouts/default/header/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <Header v-if="!getShowFullHeader" :class="[...getHeaderClass, { 'vent-header': currentRoute.path.startsWith('/monitorChannel/monitor-') }]">
+  <Header v-if="!getShowFullHeader || currentRoute.path.startsWith('/micro-vent-3dModal/modelchannel/')" :class="[...getHeaderClass, { 'vent-header': currentRoute.path.startsWith('/monitorChannel/monitor-'), 'normal-header': !currentRoute.path.startsWith('/monitorChannel/monitor-') }]">
     <!-- left start -->
     <div :class="`${prefixCls}-left`">
       <!-- logo -->
@@ -262,4 +262,13 @@
   //   border-bottom: 1px solid #81aabf01;
   //   padding-bottom: 2px;
   //   box-shadow: 0 0 20px #44caff55 inset;
+  .normal-header{
+    height: 52px !important;
+    line-height: 52px !important;
+    background: linear-gradient(#005177,#0a344c) !important;
+    border-bottom: 1px solid #81aabf01 !important;
+    padding-bottom: 2px !important;
+    box-shadow: 0 0 20px #44caff55 inset !important;
+    padding: 0 8px !important;
+  }
 </style>

+ 0 - 1
src/layouts/default/menu/index.vue

@@ -109,7 +109,6 @@
       //update-begin-author:taoyan date:2022-6-1 for: VUEN-1144 online 配置成菜单后,打开菜单,显示名称未展示为菜单名称
       const localeStore = useLocaleStore();
       function handleMenuClick(path: string, item) {
-        debugger
         if (item) {
           localeStore.setPathTitle(path, item.title || '');
         }

+ 25 - 3
src/qiankun/apps.ts

@@ -18,12 +18,34 @@ for (const key in import.meta.env) {
         container: '#content',
         activeRule: name,
       };
-      // if (name === 'micro-vent-3dModal') {
-      //   obj.container = '#vent-3D-content';
-      // }
+      if (name.startsWith('3d-modal-network')) {
+        obj.container = '#vent-3D-content';
+        
+      }
       _apps.push(obj);
     });
   }
 }
 console.log('子应用路由匹配规则', _apps);
+// const _apps: object[] = [
+//   {
+//     name: 'micro-need-air', // app name registered
+//     entry: '//localhost:8099/',
+//     container: '#content',
+//     activeRule: 'micro-need-air',
+//   },
+//   {
+//     name: 'micro-vent-3dModal', // app name registered
+//     entry: '//localhost:8091/',
+//     container: '#content',
+//     activeRule: 'micro-vent-3dModal',
+//   },
+//   // {
+//   //   name: 'micro-vent-3dModal', // app name registered
+//   //   entry: '//localhost:8091/',
+//   //   container: '#content',
+//   //   activeRule: 'micro-vent-3dModal',
+//   // },
+
+// ];
 export const apps = _apps;

+ 3 - 1
src/qiankun/index.ts

@@ -1,7 +1,7 @@
 /**
  * qiankun配置
  */
-import { registerMicroApps, start, runAfterFirstMounted, addGlobalUncaughtErrorHandler } from 'qiankun';
+import { registerMicroApps, start, runAfterFirstMounted, addGlobalUncaughtErrorHandler, loadMicroApp  } from 'qiankun';
 import { apps } from './apps';
 import { getProps, initGlState } from './state';
 import { getToken } from '/@/utils/auth';
@@ -33,6 +33,7 @@ function genActiveRule(routerPrefix) {
  * 微应用注册
  */
 function registerApps() {
+
   const _apps = filterApps();
 
   registerMicroApps(_apps, {
@@ -61,6 +62,7 @@ function registerApps() {
       },
     ],
   });
+
   // 设置默认子应用,与 genActiveRule中的参数保持一致
   // setDefaultMountApp();
   // 第一个微应用 mount 后需要调用的方法,比如开启一些监控或者埋点脚本。

+ 0 - 1
src/router/guard/index.ts

@@ -32,7 +32,6 @@ export function setupRouterGuard(router: Router) {
  */
 function createPageGuard(router: Router) {
   const loadedPageMap = new Map<string, boolean>();
-
   router.beforeEach(async (to) => {
     // The page has already been loaded, it will be faster to open it again, you don’t need to do loading and other processing
     to.meta.loaded = !!loadedPageMap.get(to.path);

+ 44 - 3
src/router/routes/basic.ts

@@ -47,16 +47,57 @@ export const QIANKUN_ROUTE: AppRouteRecordRaw = {
       },
     },
     {
-      path: '/micro-vent-3dModal/:path(.*)*',
+      path: '/micro-vent-3dModal/modelchannel/safety/VentanalyModel3D',
       name: QIANKUN_ROUTE_NAME,
-      component: import('/@/views/dashboard/Analysis/index.vue'),
-      // component: LAYOUT,
+      component: import('/@/views/demo/threejs/damper.vue'),
       meta: {
         title: '子应用',
         hideBreadcrumb: true,
         hideMenu: true,
       },
     },
+    // {
+    //   path: '/micro-vent-3dModal',
+    //   name: QIANKUN_ROUTE_NAME,
+    //   component: QIANKUN_COMPONENT,
+    //   meta: {
+    //     title: '子应用',
+    //     hideBreadcrumb: true,
+    //     hideMenu: true,
+    //   },
+    //   children: [
+    //     {
+    //       path: '/modelchannel/safety/VentanalyModel3D',
+    //       name: QIANKUN_ROUTE_NAME,
+    //       component: import('/@/views/demo/threejs/damper.vue'),
+    //       meta: {
+    //         title: '子应用',
+    //         hideBreadcrumb: true,
+    //         hideMenu: true,
+    //       },
+    //     },
+    //     {
+    //       path: ':path(.*)*',
+    //       name: QIANKUN_ROUTE_NAME,
+    //       component: QIANKUN_COMPONENT,
+    //       meta: {
+    //         title: '子应用',
+    //         hideBreadcrumb: true,
+    //         hideMenu: true,
+    //       },
+    //     },
+    //   ],
+    // },
+    // {
+    //   path: '/micro-3d-modal-network/:path(.*)*',
+    //   name: QIANKUN_ROUTE_NAME,
+    //   component: import('/@/views/demo/threejs/damper.vue'),
+    //   meta: {
+    //     title: '子应用',
+    //     hideBreadcrumb: true,
+    //     hideMenu: true,
+    //   },
+    // },
   ],
 };
 

+ 1 - 1
src/utils/threejs/loadModel.worker.js

@@ -14,7 +14,7 @@ gltfLoader.setPath('/model/glft/');
 
 
 async function loadModel(data) {
-    const { modalValue, modalName, message } = data
+    let { modalValue, modalName, message } = data
     if (!modalValue) {
         const db = window['CustomDB'];
         const modalArr = await db.modal.where('modalName').equals(modalName).toArray();

+ 790 - 296
src/views/demo/threejs/damper.vue

@@ -1,322 +1,816 @@
 <template>
-  <div style="width: 100%; height: calc(100vh - 200px); display: flex; justify-content: center; align-items: center">
-    <a-spin :spinning="loading" />
-    <div id="damper3D" v-show="!loading"> </div>
+  <div class="zl-box">
+    <div id="content" class="modal-box"></div>
+    <div class="zl-container-box">
+      <div class="top-box">
+        <div class="left-box lr-box">
+          <div class="analysis-box">
+            <div class="item-top-title">通风网络分析</div>
+            <BorderBox1 backgroundColor="#00bfff05">
+              <div class="pie-group">
+                <div class="item-pie">
+                  <div class="pie">
+                    <div class="qiu qiu1">
+                      <p>{{ totalEnterNum }}</p>
+                    </div>
+                  </div>
+                  <div class="pie-data">
+                      <span class="data-text">总进风量</span>
+                  </div>
+                </div>
+                <div class="item-pie">
+                  <div class="pie">
+                    <div class="qiu qiu2">
+                      <p>{{ totalToNum }}</p>
+                    </div>
+                  </div>
+                  <div class="pie-data">
+                      <span class="data-text">总回风量</span>
+                  </div>
+                </div>
+              </div>
+              <div class="detail-data-group">
+                <div class="container-item" v-for="(data, index) in analysisDetailDataList" :key="index">
+                  <div class="item-icon">
+                    <SvgIcon class="icon-style" size="18" :name="data.icon" />
+                  </div>
+                  <div class="item-name">{{ data.name }}</div>
+                  <div v-if="data.code !== 'level' && data.code !== 'resistance'" class="item-value">{{ data.value }}</div>
+                  <div v-if="data.code == 'level'" class="item-value">
+                    <span class="signal-round signal-round-run"></span>
+                  </div>
+                  <div v-if="data.code == 'resistance'" class="item-value">{{ totalPa }}</div>
+                </div>
+              </div>
+              <div class="feature-group">
+                <div class="feature-item">
+                  <div class="pie">
+                    <Progress
+                      type="circle"
+                      :width="50"
+                      :stroke-color="{
+                        '0%': '#FC9C1D',
+                        '100%': '#1FF8FB',
+                      }"
+                      :percent="Number(rate1)"
+                    ></Progress>
+                  </div>
+                  <div class="data">可靠度</div>
+                </div>
+                <div class="feature-item">
+                  <div class="pie">
+                    <Progress
+                      type="circle"
+                      :width="50"
+                      :stroke-color="{
+                        '0%': '#A02EFF',
+                        '100%': '#1FF8FB',
+                      }"
+                      :percent="Number(rate2)"
+                    ></Progress>
+                  </div>
+                  <div class="data">风阻合理度</div>
+                </div>
+                <div class="feature-item">
+                  <div class="pie">
+                    <Progress
+                      type="circle"
+                      :width="50"
+                      :stroke-color="{
+                        '0%': '#108ee9',
+                        '100%': '#1FF8FB',
+                      }"
+                      :percent="Number(rate3)"
+                    ></Progress>
+                  </div>
+                  <div class="data">有效风量率</div>
+                </div>
+              </div>  
+            </BorderBox1>
+          </div>
+        
+        </div>
+        <div class="right-box lr-box">
+          <div class="sensor-box">
+            <div class="item-top-title">传感器实时数据</div>
+            <BorderBox1 class="table-box">
+              <div class="table-container">
+                <a-table :columns="sensorColumns" :data-source="sensorDataList" :pagination="false" size="small" />
+              </div>
+            </BorderBox1>
+          </div>
+          <div class="warning-box">
+            <div class="item-top-title">预警报警信息</div>
+            <BorderBox1 class="table-box">
+              <div class="table-container">
+                <a-table :columns="warningColumns" :data-source="warningDataList" :pagination="false" size="small" >
+                  <template #bodyCell="{ column, record }">
+                    <div v-if="column.dataIndex == 'level'">
+                      <span class="signal-round" :class="{ 'signal-round-red': record['level'] == 1, 'signal-round-orange': record['level'] == 2, 'signal-round-yellow': record['level'] == 3 }"></span>
+                    </div>
+                  </template>
+                </a-table>
+              </div>
+            </BorderBox1>
+          </div> 
+        </div>
+      </div>
+      <div class="bottom-box">
+        <div class="bottom-left bottom-lr-box">
+           <BorderBox11 title="实时网络解算" :color="['#00FFFF']">
+              <div class="network-top">
+                <div class="network-top-left">
+                  <div>
+                    准确率:
+                    <span class="accuracy-rate">95%</span>
+                  </div>
+                  <div>
+                    迭代误差:
+                    <span class="error-rate">0.0941%</span>
+                  </div>
+                </div>
+                <div class="network-top-right">
+                  本次解算时间:
+                  <span class="time">{{ currentTime }}</span>
+                </div>
+              </div>
+              <div class="table-container">
+                <a-table :columns="networkColumns" :data-source="networkDataList" :pagination="false" size="small" />
+              </div>
+          </BorderBox11>
+        </div>
+        <div class="bottom-right bottom-lr-box">
+          <BorderBox11 title="最大阻力路线">
+            <div class="zl-top">
+              <div>
+                <span class="btn active">1号回风斜井</span>
+                <span class="btn">2号回风斜井</span>
+              </div>
+              <div>
+                路线阻力
+                <span class="data">{{ totalPa }}</span>
+                Pa
+              </div>
+            </div>
+            <div class="zl-container">
+              <div class="zl-path-item position1">
+                <div class="title">副平硐</div>
+              </div>
+              <div class="zl-path-item position2">
+                <div class="title">5煤组盘区辅运巷</div>
+              </div>
+              <div class="zl-path-item position3">
+                <div class="title">1521辅运顺槽</div>
+              </div>
+              <div class="zl-path-item position4">
+                <div class="title">15212综采工作面</div>
+              </div>
+              <div class="zl-path-item position5">
+                <div class="title">15211辅运顺槽</div>
+              </div>
+              <div class="zl-path-item position6">
+                <div class="title">15212胶运顺槽</div>
+              </div>
+              <div class="zl-path-item position7">
+                <div class="title">15212回风顺槽回风联巷</div>
+              </div>
+              <div class="zl-path-item position8">
+                <div class="title">5煤组盘曲回风大巷</div>
+              </div>
+              <div class="zl-path-item position9">
+                <div class="title">回风斜井联络巷</div>
+              </div>
+              <div class="zl-path-item position10">
+                <div class="title">1盘曲回风斜井</div>
+              </div>
+            </div>
+          </BorderBox11>
+        </div>
+      </div>
+    </div>
   </div>
 </template>
 
 <script setup lang="ts">
   import { ref, onMounted, onUnmounted } from 'vue';
-  import UseThree from '../../../utils/threejs/useThree';
-  import * as THREE from 'three';
-  import gsap from 'gsap';
+  import { SvgIcon } from '/@/components/Icon';
+  import { Progress } from 'ant-design-vue';
+  import { BorderBox11, BorderBox1  } from '@kjgl77/datav-vue3';
+  import { sensorColumns, sensorData, networkColumns, networkData, warningColumns, warningData } from './network.data'
+  import dayjs from 'dayjs'
 
-  const loading = ref(false);
-  let model;
+  // import { registerApps } from '/@/qiankun';
+  // import { useGlobSetting } from '/@/hooks/setting';
 
-  const setCustomMaterial = (group) => {
-    const cityMaterial = model.track(
-      new THREE.MeshBasicMaterial({
-        color: new THREE.Color(0x0c016f),
-      })
-    );
-    group?.traverse((item: THREE.Mesh) => {
-      if (item.type === 'Mesh') {
-        item.material = cityMaterial;
-        setMaterial(item);
-      }
-    });
-  };
+  // const globSetting = useGlobSetting();
+  // const openQianKun = globSetting.openQianKun;
 
-  /* 自定义材质 */
-  const setMaterial = (obj) => {
-    obj.geometry.computeBoundingBox();
-    const { max, min } = obj.geometry.boundingBox;
-    const distance = max.y - min.y + 2;
+  const sensorDataList = ref<any[]>([])
+  const networkDataList = ref<any[]>([])
+  const warningDataList = ref<any[]>([])
+  const currentTime = ref(dayjs().format('YYYY-MM-DD HH:mm:ss'))
 
-    obj.material.onBeforeCompile = (shader) => {
-      shader.uniforms.uDistance = {
-        value: distance,
-      };
-      shader.uniforms.uTopColor = {
-        value: new THREE.Color(0xaaaeff),
-      };
-      addGrad(shader);
-      addRadiusSpread(shader);
-      addLineSpread(shader);
-      addToSpread(shader);
-    };
-  };
-  /* 自定义着色器 */
-  const addGrad = (shader) => {
-    shader.vertexShader = shader.vertexShader.replace(
-      '#include <common>',
-      `
+  const totalEnterNum = ref(23855+'')
+  const totalToNum = ref(244436+'')
+  const totalPa = ref(1640+'')
+  const rate1 = ref(95+'')
+  const rate2 = ref(95+'')
+  const rate3 = ref(95+'')
 
-      #include <common>
-      varying vec3 vPosition;
-    `
-    );
-    shader.vertexShader = shader.vertexShader.replace(
-      '#include <fog_vertex>',
-      `
 
-      #include <fog_vertex>
-      vPosition = position;
-     `
-    );
-    shader.fragmentShader = shader.fragmentShader.replace(
-      '#include <common>',
-      `
-      #include <common>
-      uniform vec3 uTopColor;
-      uniform float uDistance;
-      varying vec3 vPosition;
+  const analysisDetailDataList = ref([
+    {
+      code:'',
+      name: '通风巷道规模(m)',
+      value: '21000',
+      icon: 'path-icon1'
+    },
+    {
+      code: 'level',
+      name: '通风难易程度',
+      value: '21000',
+      icon: 'path-icon2'
+    },
+    {
+      code: 'resistance',
+      name: '总阻力',
+      value: totalPa.value,
+      icon: 'path-icon3'
+    },
+    {
+      code: '',
+      name: '等积孔(㎡)',
+      value: '11.27',
+      icon: 'path-icon4'
+    },
+  ])
+  
   
-      `
-    );
-
-    shader.fragmentShader = shader.fragmentShader.replace(
-      '#include <dithering_fragment>',
-      `
-      #include <dithering_fragment>
-
-      vec4 distGradColor = gl_FragColor;
-      // 设置混合的百分比
-      float gradMix = (vPosition.y + (uDistance / 2.0)) / uDistance / 5.0;
-      // 设置混合颜色
-      vec3 colorMix = mix(distGradColor.xyz, uTopColor, gradMix);
-      gl_FragColor = vec4(colorMix, 1.0);
-      //#end#
-      `
-    );
-  };
-  /* 自定义着色器 */
-  const addRadiusSpread = (shader) => {
-    // 设置扩散中心店
-    shader.uniforms.uRadiusSpreadCenter = {
-      value: new THREE.Vector2(0, 0),
-    };
-    // 扩散时间
-    shader.uniforms.uRadiusSpreadTime = {
-      value: 0,
-    };
-
-    shader.uniforms.uRadiusSpreadWidth = {
-      value: 20,
-    };
-    shader.fragmentShader = shader.fragmentShader.replace(
-      '#include <common>',
-      `
-      #include <common>
-      uniform vec2 uRadiusSpreadCenter;
-      uniform float uRadiusSpreadTime;
-      uniform float uRadiusSpreadWidth;
-
-      `
-    );
-
-    shader.fragmentShader = shader.fragmentShader.replace(
-      '//#end#',
-      `
-      float spreadRadius = distance(vPosition.xz + vec2(-720, -550), uRadiusSpreadCenter);
-      // 扩散范围
-      float spreadIndex = -(spreadRadius - uRadiusSpreadTime) * (spreadRadius - uRadiusSpreadTime ) + uRadiusSpreadWidth;
-      if(spreadIndex > 0.0){
-        gl_FragColor = mix(gl_FragColor, vec4(1.0, 1.0, 1.0, 1.0), spreadIndex / uRadiusSpreadWidth );
-      }
-      //#end#
-      `
-    );
-    gsap.to(shader.uniforms.uRadiusSpreadTime, {
-      value: 250,
-      duration: 1,
-      ease: 'none',
-      repeat: -1,
-    });
-  };
-  /* 自定义着色器 */
-  const addLineSpread = (shader) => {
-    // 设置扩散中心店
-    shader.uniforms.uLineSpreadCenter = {
-      value: new THREE.Vector2(0, 0),
-    };
-    // 扩散时间
-    shader.uniforms.uLineSpreadTime = {
-      value: 0,
-    };
-
-    shader.uniforms.uLineSpreadWidth = {
-      value: 20,
-    };
-    shader.fragmentShader = shader.fragmentShader.replace(
-      '#include <common>',
-      `
-      #include <common>
-      uniform vec2 uLineSpreadCenter;
-      uniform float uLineSpreadTime;
-      uniform float uLineSpreadWidth;
-
-      `
-    );
-
-    shader.fragmentShader = shader.fragmentShader.replace(
-      '//#end#',
-      `
-      float spreadLine = vPosition.x - 400.0;
-      // 扩散范围
-      float spreadLineIndex = -(spreadLine - uLineSpreadTime * 5.0) * (spreadLine - uLineSpreadTime * 5.0) + uLineSpreadWidth;
-      if(spreadLineIndex > 0.0){
-        gl_FragColor = mix(gl_FragColor, vec4(1.0, 1.0, 1.0, 1.0), spreadLineIndex / uLineSpreadWidth );
-      }
-      //#end#
-      `
-    );
-    gsap.to(shader.uniforms.uLineSpreadTime, {
-      value: 150,
-      duration: 2,
-      ease: 'none',
-      repeat: -1,
-    });
-  };
-  /* 自定义着色器 */
-  const addToSpread = (shader) => {
-    // 设置扩散中心店
-    shader.uniforms.uTopSpreadCenter = {
-      value: new THREE.Vector2(0, 0),
-    };
-    // 扩散时间
-    shader.uniforms.uTopSpreadTime = {
-      value: 0,
-    };
-
-    shader.uniforms.uTopSpreadWidth = {
-      value: 20,
-    };
-    shader.fragmentShader = shader.fragmentShader.replace(
-      '#include <common>',
-      `
-      #include <common>
-      uniform vec2 uTopSpreadCenter;
-      uniform float uTopSpreadTime;
-      uniform float uTopSpreadWidth;
-
-      `
-    );
-
-    shader.fragmentShader = shader.fragmentShader.replace(
-      '//#end#',
-      `
-      float spreadTopLine = vPosition.y * 2.0;
-      // 扩散范围uTopSpreadWidth
-      float spreadTopIndex = -(spreadTopLine - uTopSpreadTime) * (spreadTopLine - uTopSpreadTime) + uTopSpreadWidth;
-      if(spreadTopIndex > 0.0){
-        gl_FragColor = mix(gl_FragColor, vec4(0.0, 1.0, 1.0, 1.0), spreadTopIndex / uTopSpreadWidth / uTopSpreadTime * 2.0);
-      }
-      //#end#
-      `
-    );
-    gsap.to(shader.uniforms.uTopSpreadTime, {
-      value: 200,
-      duration: 5,
-      ease: 'none',
-      repeat: -1,
-    });
-  };
-
-  /* 模型线框 */
-  const addLine = (geometry) => {
-    const edges = new THREE.EdgesGeometry(geometry);
-    const line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({ color: 0xff0000 }));
-    (model.scene as THREE.Scene).add(line);
-  };
-
-  const addLight = (scene) => {
-    const light = new THREE.PointLight(0xffffff, 1, 1000);
-    light.position.set(50, 10, 50);
-    // scene.add( light );
-
-    const pointLight = new THREE.PointLight(0xffffff, 1, 200);
-    pointLight.position.set(0, 0, 10);
-    // scene.add( pointLight );
-
-    const pointLight2 = new THREE.PointLight(0xffffff, 1, 100);
-    pointLight2.position.set(0, 3, 10);
-    // light2.castShadow = true
-    pointLight2.shadow.bias = 0.05;
-    scene.add(pointLight2);
-    // const pointLightHelper2 = new THREE.PointLightHelper( pointLight2, 1 );
-    // scene.add( pointLightHelper2 );
-
-    const pointLight3 = new THREE.PointLight(0xffffff, 1, 100);
-    pointLight3.position.set(-80, 3, 10);
-    // light2.castShadow = true
-    pointLight3.shadow.bias = 0.05;
-    scene.add(pointLight3);
-    // const pointLightHelper = new THREE.PointLightHelper( pointLight3, 1 );
-    // scene.add( pointLightHelper );
 
-    const pointLight4 = new THREE.PointLight(0xffffff, 1, 100);
-    pointLight4.position.set(37, 3, 10);
-    // light2.castShadow = true
-    pointLight4.shadow.bias = 0.05;
-    scene.add(pointLight4);
-    // const pointLightHelper4 = new THREE.PointLightHelper( pointLight4, 1 );
-    // scene.add( pointLightHelper4 );
+  let timer: null | NodeJS.Timeout = null;
+  function getMonitorData() {
+    if (Object.prototype.toString.call(timer) === '[object Null]') {
 
-    const pointLight5 = new THREE.PointLight(0xffffff, 1, 100);
-    pointLight5.position.set(100, 3, 10);
-    // light2.castShadow = true
-    pointLight5.shadow.bias = 0.05;
-    scene.add(pointLight5);
-    // const pointLightHelper5 = new THREE.PointLightHelper( pointLight5, 1 );
-    // scene.add( pointLightHelper5 );
 
-    pointLight2.shadow.mapSize.width = 10; // default
-    pointLight2.shadow.mapSize.height = 10; // default
-    pointLight2.shadow.camera.near = -0.0000001; // default
-    pointLight2.shadow.camera.far = 20; // default
 
-    const spotLight = new THREE.SpotLight();
-    spotLight.angle = Math.PI / 16;
-    spotLight.penumbra = 0;
-    spotLight.castShadow = true;
-    spotLight.intensity = 2;
-    spotLight.position.set(-400, 400, 400);
-    scene.add(spotLight);
+      timer = setTimeout(async () => {
+        sensorDataList.value = sensorData()
+        networkDataList.value = networkData()
+        warningDataList.value = warningData()
+        currentTime.value = dayjs().format('YYYY-MM-DD HH:mm:ss')
+        totalEnterNum.value = Number(Math.random() * 200 - 100 + 23855).toFixed(0)
+        totalToNum.value = Number(Math.random() * 200 - 100 + 244436).toFixed(0)
+        totalPa.value = Number(Math.random() * 50 - 25 + 1640).toFixed(0)
+        rate1.value = Number(Math.random() * 4 - 2 + 95).toFixed(0)
+        rate2.value = Number(Math.random() * 4 - 2 + 95).toFixed(0)
+        rate3.value = Number(Math.random() * 4 - 2 + 95).toFixed(0)
+        sensorDataList.value = sensorData()
+        networkDataList.value = networkData()
+        warningDataList.value = warningData()
+        if (timer) {
+          timer = null;
+        }
+        getMonitorData();
+      }, 1000)
+    }
+  }
 
-    spotLight.shadow.mapSize.width = 2000; // default
-    spotLight.shadow.mapSize.height = 1000; // default
-    spotLight.shadow.camera.near = 0.5; // default
-    spotLight.shadow.camera.far = 800; // default
-    spotLight.shadow.focus = 1;
-    spotLight.shadow.bias = -0.000001;
-  };
-  const resetCamera = () => {
-    model.camera.position.setZ(200);
-    model.camera.position.setY(120);
-    model.camera?.lookAt(-100, 0.1, 50);
-    model.camera.updateProjectionMatrix();
-    model.orbitControls.update();
-  };
 
   onMounted(() => {
-    model = new UseThree('#damper3D');
-    model.setEnvMap('test1');
-    model.setCustomMaterial = setCustomMaterial;
-    loading.value = true;
-    model.setModel('9f-processed').then(() => {
-      addLight(model.scene);
-      resetCamera();
-      // 模型加载成功
-      loading.value = false;
-    });
+    getMonitorData()
+    if (document.body.getAttribute('class')?.includes('style-styleTwo')) document.body.removeAttribute('class', 'style-styleTwo');
   });
 
   onUnmounted(() => {
-    if (model) {
-      model.deleteModal();
+    if (timer) {
+      clearTimeout(timer);
+      timer = undefined;
     }
   });
 </script>
-<style scoped lang="scss"></style>
+<style scoped lang="less">
+  .zl-box{
+    width: 100%;
+    height: 100%;
+    position: relative;
+    overflow: hidden;
+    color: #fff;
+    // background: url('/@/assets/images/vent/path/bg.png') no-repeat;
+    background-position: center;
+    background-size: cover;
+    .modal-box{
+      position: relative;
+      width: 100%;
+      height: 100%;
+      top: 0;
+      left: 0;
+    }
+  }
+  .zl-container-box{
+    width: 100%;
+    height: 100%;
+    top: 0;
+    position: absolute;
+    z-index: 99;
+    pointer-events: none;
+    .top-box{
+      display: flex;
+      justify-content: space-between;
+      height: calc(70% - 20px);
+      .lr-box{
+        width: 374px;
+        margin-top: 10px;
+      }
+      .left-box{
+        .analysis-box{
+          position: relative;
+          .pie-group{
+          display: flex;
+          flex-direction: row;
+          padding-top: 30px;
+          .item-pie{
+            flex: 1;
+            padding: 5px;
+            display: flex;
+            flex-direction: column;
+            justify-content: center;
+            align-items: center;
+            .pie{
+              width: 140px;
+              height: 80px;
+              background: url('/@/assets/images/vent/path/di.png') no-repeat;
+              background-size: contain;
+              display: flex;
+              justify-content: center;
+              .qiu1{
+                background: url('/@/assets/images/vent/path/cicle01.png') no-repeat center;
+              }
+              .qiu2{
+                background: url('/@/assets/images/vent/path/cicle04.png') no-repeat center;
+              }
+              .qiu{
+                position: relative;
+                width: 60px;
+                height: 60px;
+                background-size: 100%;
+                display: flex;
+                justify-content: center;
+                padding-top: 18px;
+                &::before{
+                  content: '';
+                  display: block;
+                  width: 60px;
+                  height: 60px;
+                  position: absolute;
+                  left: 50%;
+                  top: 50%;
+                  transform: translate(-50%, -50%);
+                  border-radius: 50%;
+                  border: 3px solid rgba(255, 255, 255, 0.5);
+                  animation: scale 2s linear infinite;
+                }
+              }
+            }
+            
+            .pie-data{
+              width: 140px;
+              height: 20px;
+              display: flex;
+              justify-content: center;
+              position: relative;
+              background: url('/@/assets/images/vent/path/pie-line.png');
+              .data-text{
+                display: block;
+                position: absolute;
+                top: -8px;
+              }
+            }
+          }
+        }
+        .detail-data-group{
+          width: 100%;;
+          display: flex;
+          flex-direction: column;
+          align-items: center;
+          margin-top: 15px;
+          .container-item {
+            width: 307px;
+            height: 63px;
+            display: flex;
+            position: relative;
+            background: url('/@/assets/images/vent/plane-bottom.png') no-repeat;
+            background-size: auto;
+            background-position: bottom;
+            padding: 10px 30px;
+            &::before {
+              content: '';
+              display: block;
+              width: 100%;
+              height: 5px;
+              position: absolute;
+              top: 62px;
+              left: 0;
+              background-color: #73f4ff66;
+              backdrop-filter: blur(5px);
+            }
+            .item-icon {
+              width: 60px;
+              height: 45px;
+              background: url('/@/assets/images/vent/plane-icon-bg.png') no-repeat;
+              background-size: cover;
+              .icon-style {
+                margin: 10px 0 0 18px;
+              }
+            }
+            .item-name {
+              width: 180px;
+              line-height: 60px;
+              margin-left: 5px;
+              text-align: left;
+            }
+            .item-value {
+              position: relative;
+              height: 26px;
+              line-height: 24px;
+              margin: 15px 0;
+              text-align: center;
+              width: 80px;
+              border: 1px solid #00f5fe;
+              border-radius: 13px;
+              background: linear-gradient(to right, #00f5fe44, #0090ff44);
+              &::before {
+                width: 6px;
+                height: 6px;
+                content: '';
+                position: absolute;
+                left: -3px;
+                top: 8px;
+                background: #ffa500;
+                border-radius: 3px;
+              }
+            }
+          }
+        }
+        .feature-group{
+          display: flex;
+          flex-direction: row;
+          padding: 20px;
+          margin-top: 15px;
+          .feature-item{
+            width: 108px;
+            height: 120px;
+            background: url('/@/assets/images/vent/path/path-feature-bg.png');
+            display: flex;
+            flex-direction: column;
+            // justify-content: center;
+
+            .pie{
+              display: flex;
+              justify-content: center;
+            }
+            .data{
+              margin-top: 15px;
+              font-size: 12px;
+              scale: 0.9;
+              text-align: center;
+            }
+          }
+        }
+        }
+      }
+      .right-box{
+        display: flex;
+        flex-direction: column;
+        .sensor-box, .warning-box{
+          position: relative;
+          // min-height: 220px;
+          // max-height: 250px;
+          .table-box{
+            height: 280px;
+            position: relative;
+            .table-container{
+              margin: 25px 20px 20px;
+              height: 250px;
+              position: absolute;
+            }
+          }
+        }
+        .sensor-box{
+          .item-top-title{
+            &::after{
+              left: 110px;
+            }
+            &::before{
+              left: 265px;
+            }
+          }
+        }
+        .warning-box{
+          margin-top: 10px;
+        }
+      }
+    }
+    .bottom-box{
+      width: 100%;
+      height: calc(30% - 20px);
+      display: flex;
+      justify-content: space-between;
+      margin-top: 20px;
+      .bottom-lr-box{
+        flex: 1;
+        display: flex;
+        justify-content: center;
+        
+      }
+      .bottom-left{
+        margin-right: 10px;
+        .network-top{
+          display: flex;
+          flex-direction: row;
+          justify-content: space-between;
+          position: relative;
+          top: 55px;
+          padding: 0 30px;
+          .network-top-left{
+            display: flex;
+            div{
+              margin-right: 20px;
+            }
+            span{
+              font-family: 'douyuFont';
+              font-size: 15px;
+            }
+            .accuracy-rate{
+              color: #FFA500;
+            }
+            .error-rate{
+              color: #00f5fe;
+            }
+          }
+          .time{
+            color: #949494;
+          }
+        }
+        .table-container{
+          height: 150px;
+          margin-top: 55px;
+          margin-left: 15px;
+          margin-right: 10px;
+        }
+      }
+      .bottom-right{
+        margin-left: 10px;
+        
+        .zl-top{
+          width: calc(100% - 30px);
+          padding: 0 20px;
+          display: flex;
+          flex-direction: row;
+          justify-content: space-between;
+          position: relative;
+          top: 35px;
+          z-index: 99;
+          margin: 10px;
+          border-bottom: 1px solid #00f5fe;
+          .btn{
+            padding: 3px 10px;
+            border-top: 1px solid #c6c6c6;
+            background-image: linear-gradient(#c2c2c2aa, #b3b3b388 20%, #5a5a5a88);
+            cursor: pointer;
+            margin-right: 5px;
+            &:hover, &:active{
+              border-top: 1px solid #00f5fe;
+              background-image: linear-gradient(#00f5feaa, #1adce288 20%, #00848988);
+            }
+          }
+          .active{
+            border-top: 1px solid #00f5fe;
+            background-image: linear-gradient(#00f5feaa, #1adce288 20%, #00848988);
+          }
+          .data{
+            font-family: 'douyuFont';
+            color: #FFA500;
+            font-size: 15px;
+          }
+        }
+        .zl-container{
+          width: 100%;
+          height: 100%;
+          margin: 0 15px;
+          background: url('/@/assets/images/vent/path/zl-bg1.png') no-repeat;
+          background-size: 920px 190px;
+          position: relative;
+          &::after{
+            content: '';
+            display: block;
+            position: absolute;
+            width: 100%;
+            height: 100%;
+            top: 85px;
+            background: url('/@/assets/images/vent/path/zl-bg2.png') no-repeat;
+            background-size: 920px 100px;
+          }
+        }
+        .zl-path-item{
+          height: 67px;
+          background: url('/@/assets/images/vent/path/zl-path-item-bg.png') no-repeat;
+          background-size: auto;
+          background-position:center bottom;
+          position: absolute;
+          scale: 0.9;
+          .title{
+            position: relative;
+            top: -20px;
+            text-align: center;
+            font-size: 12px;
+            background: #00f5fe33;
+            padding: 3px 5px;
+            backdrop-filter: blur(5px);
+          }
+        }
+        .position10{
+          top: 130px;
+          left: 0px;
+        }
+        .position9{
+          top: 52px;
+          left: 100px;
+        }
+        .position8{
+          top: 132px;
+          left: 220px;
+        }
+        .position7{
+          top: 128px;
+          left: 420px;
+        }
+        .position6{
+          top: 60px;
+          left: 320px;
+        }
+        .position5{
+          top: 120px;
+          left: 580px;
+        }
+        .position4{
+          top: 123px;
+          left: 690px;
+        }
+        .position3{
+          top: 103px;
+          left: 830px;
+        }
+        .position2{
+          top: 90px;
+          left: 740px;
+        }
+        .position1{
+          top: 80px;
+          left: 535px;
+        }
+      }
+    }
+  }
+
+  .item-top-title{
+    width: 374px;
+    height: 32px;
+    text-align: center;
+    line-height: 34px;
+    font-size: 15px;
+    font-weight: 600;
+    color: #fafafa;
+    position: absolute;
+    padding-top: 0px;
+    top: -9px;
+    &::before{
+      content: '';
+      display: block;
+      width: 40px;
+      height: 1px;
+      position: absolute;
+      left: 255px;
+      top:50%; 
+      transform:translateY(-50%);
+      -webkit-transform:translate(-50%,-50%);
+      background-color: #00d4fe88;
+    }
+    &::after{
+      content: '';
+      display: block;
+      width: 40px;
+      height: 1px;
+      position: absolute;
+      left: 120px;
+      top:50%; 
+      transform:translateY(-50%);
+      -webkit-transform:translate(-50%,-50%);
+      background-color: #00d4fe88;
+    }
+  }
+  .signal-round{
+    display: inline-block;
+    width: 4px;
+    height: 4px;
+    border-radius: 50%;
+    position: relative;
+    top: -3px;
+    &::after {
+      display: block;
+      content: '';
+      position: absolute;
+      width: 8px;
+      height: 8px;
+      top: -2px;
+      left: -2px;
+      border-radius: 50%;
+      background-color: #daffc044;
+      box-shadow: 0 0 1px 1px #c6ff7722;
+    }
+  }
+  .signal-round-run {
+    background-color: #67fc00;
+    &::after {
+      background-color: #daffc044;
+      box-shadow: 0 0 1px 1px #c6ff7722;
+    }
+  }
+  .signal-round-red {
+    background-color: #FF3823;
+    &::after {
+      background-color: #FF382344;
+      box-shadow: 0 0 1px 1px #FF382333;
+    }
+  }
+  .signal-round-orange {
+    background-color: #FF9B17;
+    &::after {
+      background-color: #FF9B1744;
+      box-shadow: 0 0 1px 1px #FF9B1733;
+    }
+  }
+  .signal-round-yellow {
+    background-color: #FFFF00;
+    &::after {
+      background-color: #FFFF0044;
+      box-shadow: 0 0 1px 1px #FFFF0033;
+    }
+  }
+  .table-container{
+    overflow-y: auto;
+    overflow-x: hidden;
+    pointer-events: auto;
+    &::-webkit-scrollbar {
+      width: 4px;
+      height: 8px;
+      background-color: #f5f5f500;
+    }
+    &::-webkit-scrollbar-track {
+      background-color: #ffffff33;
+      border-radius: 10px;
+    }
+    &::-webkit-scrollbar-thumb {
+      background-color: #cccccc44;
+      border-radius: 10px;
+    }
+  }
+  @keyframes scale {
+    0% {
+      transform: translate(-50%, -50%) scale(0.9);
+      opacity: 1;
+    }
+    100% {
+      transform: translate(-50%, -50%) scale(1.5);
+      opacity: 0;
+    }
+  }
+:deep(.ant-progress-text){
+  color: #fff !important;
+}
+:deep(.ant-table-thead){
+  background-color: transparent !important;
+  & > tr{
+    border: 1px solid #00f5fe !important;
+  }
+  & > tr > th{
+    // border: none !important;
+    color: #00f5fe !important;
+    border-top: 1px solid #00f5fe !important;
+    border-bottom: 1px solid #00f5fe !important;
+    border-left: none !important;
+    border-right: none !important;
+    font-size: 13px;
+  }
+}
+:deep(.ant-table-tbody){
+  & > tr > td{
+    font-size: 13px;
+  }
+}
+:deep(.ant-table-small){
+  border: none !important;
+}
+:deep(.ant-layout){
+  background: transparent !important;
+}
+</style>

+ 218 - 0
src/views/demo/threejs/network.data.ts

@@ -0,0 +1,218 @@
+import { BasicColumn } from '/@/components/Table';
+
+let sensor1 = Number(7.78).toFixed(2),
+  sensor2 = Number(1).toFixed(2),
+  sensor3 = Number(0.53).toFixed(2),
+  sensor4 = Number(0.62).toFixed(2),
+  sensor5 = Number(1.06).toFixed(2);
+
+export const sensorColumns: BasicColumn[] = [
+  {
+    title: '位置',
+    dataIndex: 'location',
+    width: 180,
+    align: 'center',
+  },
+  {
+    title: '数值',
+    dataIndex: 'value',
+    width: 100,
+    align: 'center',
+  },
+  {
+    title: '单位',
+    dataIndex: 'unit',
+    width: 100,
+    align: 'center',
+  },
+];
+export const sensorData = () => {
+  sensor1 = Number(Math.random() * 2 - 1 + 7.78).toFixed(2);
+  sensor2 = Number(Math.random() + 0.13).toFixed(2);
+  sensor3 = Number(Math.random() + 0.19).toFixed(2);
+  sensor4 = Number(Math.random() + 0.17).toFixed(2);
+  sensor5 = Number(Math.random() + 0.81).toFixed(2);
+  return [
+    {
+      location: '副平硐',
+      value: sensor1,
+      unit: 'm/s',
+    },
+    {
+      location: '5煤组盘区辅运巷',
+      value: sensor2,
+      unit: 'm/s',
+    },
+    {
+      location: '15212辅运顺槽',
+      value: sensor3,
+      unit: 'm/s',
+    },
+    {
+      location: '15212胶运顺槽',
+      value: sensor4,
+      unit: 'm/s',
+    },
+    {
+      location: '15212回风顺槽',
+      value: sensor5,
+      unit: 'm/s',
+    },
+  ];
+};
+
+export const networkColumns: BasicColumn[] = [
+  {
+    title: 'ID',
+    dataIndex: 'id',
+    width: 120,
+    align: 'center',
+  },
+  {
+    title: '名称',
+    dataIndex: 'name',
+    width: 120,
+    align: 'center',
+  },
+  {
+    title: '风量(m³/min)',
+    dataIndex: 'fl',
+    width: 120,
+    align: 'center',
+  },
+  {
+    title: '风速(m/s)',
+    dataIndex: 'fs',
+    width: 120,
+    align: 'center',
+  },
+  {
+    title: '阻力(Pa)',
+    dataIndex: 'zl',
+    width: 120,
+    align: 'center',
+  },
+  {
+    title: '面积(㎡)',
+    dataIndex: 'mj',
+    width: 120,
+    align: 'center',
+  },
+  {
+    title: '灵敏度',
+    dataIndex: 'lmd',
+    width: 120,
+    align: 'center',
+  },
+];
+export const networkData = () => {
+  return [
+    {
+      id: '40008',
+      name: '副平硐',
+      fl: Number(Math.random() * 100.68 + 10341.18).toFixed(2),
+      fs: sensor1,
+      zl: Number(Math.random() * 10 + 80).toFixed(2),
+      mj: '21.9',
+      lmd: Number(Math.random() * 0.2).toFixed(2),
+    },
+    {
+      id: '40009',
+      name: '5煤组盘区辅运巷',
+      fl: Number(Math.random() * 100.68 + 1212).toFixed(2),
+      fs: sensor2,
+      zl: Number(Math.random() * 10 + 90).toFixed(2),
+      mj: '20.2',
+      lmd: Number(Math.random() * 0.2).toFixed(2),
+    },
+    {
+      id: '40010',
+      name: '15212辅运顺槽',
+      fl: Number(Math.random() * 40.68 + 645.54).toFixed(2),
+      fs: sensor3,
+      zl: Number(Math.random() * 10 + 55).toFixed(2),
+      mj: '20.3',
+      lmd: Number(Math.random() * 0.2).toFixed(2),
+    },
+    {
+      id: '40011',
+      name: '15212胶运顺槽',
+      fl: Number(Math.random() * 40.68 + 645.64).toFixed(2),
+      fs: sensor4,
+      zl: Number(Math.random() * 10 + 52).toFixed(2),
+      mj: '18.7',
+      lmd: Number(Math.random() * 0.2).toFixed(2),
+    },
+    {
+      id: '40012',
+      name: '15212回风顺槽',
+      fl: Number(Math.random() * 100.68 + 1361.04).toFixed(2),
+      fs: sensor5,
+      zl: Number(Math.random() * 10 + 52).toFixed(2),
+      mj: '21.4',
+      lmd: Number(Math.random() * 0.2).toFixed(2),
+    },
+  ];
+};
+
+export const warningColumns: BasicColumn[] = [
+  {
+    title: '位置',
+    dataIndex: 'location',
+    width: 180,
+    align: 'center',
+  },
+  {
+    title: '类型',
+    dataIndex: 'type',
+    width: 100,
+    align: 'center',
+  },
+  {
+    title: '等级',
+    dataIndex: 'level',
+    width: 70,
+    align: 'center',
+  },
+  {
+    title: '信息',
+    dataIndex: 'msg',
+    width: 120,
+    align: 'center',
+  },
+];
+export const warningData = () => {
+  return [
+    {
+      location: '副平硐',
+      type: '风速',
+      level: '1',
+      msg: '风速超限',
+    },
+    {
+      location: '5煤组盘区辅运巷',
+      type: '风量',
+      level: '2',
+      msg: '风量不足',
+    },
+    {
+      location: '副平硐',
+      type: '瓦斯',
+      level: '2',
+      msg: '瓦斯超限',
+    },
+    {
+      location: '15212胶运顺槽',
+      type: 'CO',
+      level: '3',
+      msg: 'CO超限',
+    },
+    {
+      location: '15212回风顺槽',
+      type: '瓦斯',
+      level: '3',
+      msg: '瓦斯超限',
+    },
+  ];
+};
+

+ 12 - 11
src/views/system/menu/menu.api.ts

@@ -103,17 +103,18 @@ export const checkPermDuplication = (model, schema, required?) => {
           return Promise.reject(`请输入${schema.label}`);
         }
         return new Promise<void>((resolve, reject) => {
-          getCheckPermDuplication({
-            id: model.id,
-            url: model.url,
-            alwaysShow: model.alwaysShow,
-          })
-            .then((res) => {
-              res.success ? resolve() : reject(res.message || '校验失败');
-            })
-            .catch((err) => {
-              reject(err.message || '验证失败');
-            });
+          // getCheckPermDuplication({
+          //   id: model.id,
+          //   url: model.url,
+          //   alwaysShow: model.alwaysShow,
+          // })
+          //   .then((res) => {
+          //     res.success ? resolve() : reject(res.message || '校验失败');
+          //   })
+          //   .catch((err) => {
+          //     reject(err.message || '验证失败');
+          //   });
+          resolve()
         });
       },
     },

+ 5 - 0
src/views/vent/deviceManager/sensorTabel/sensor.data.ts

@@ -87,6 +87,11 @@ export const formSchema: FormSchema[] = [
     component: 'Input',
   },
   {
+    label: '分站内编号',
+    field: 'addrIndex',
+    component: 'Input',
+  },
+  {
     label: '距巷道起点长度',
     field: 'flength',
     component: 'InputNumber',

+ 1 - 1
src/views/vent/deviceManager/substationTabel/substation.data.ts

@@ -130,7 +130,7 @@ export const formSchema: FormSchema[] = [
     label: 'PLC类型',
     field: 'plcType',
     component: 'JDictSelectTag',
-    show: false,
+    show: true,
     componentProps: {
       dictCode: 'plcType',
       placeholder: '请选择PLC类型',

+ 2 - 2
src/views/vent/monitorManager/gateMonitor/gate.threejs.ts

@@ -158,11 +158,11 @@ export const addFmText = (selectData) => {
   const textArr = [
     {
       text: `煤矿巷道远程风门系统`,
-      font: 'normal 2.2rem Arial',
+      font: 'normal 30px Arial',
       color: '#009900',
       strokeStyle: '#002200',
       x: 80,
-      y: 95,
+      y: 100,
     },
     {
       text: `压力(Pa):`,

+ 18 - 13
src/views/vent/monitorManager/gateMonitor/index.vue

@@ -79,15 +79,17 @@
               </template>
               <template v-else>
                 <a-tag v-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 0" color="red">正在关闭</a-tag>
-                <a-tag v-else-if="column.dataIndex === 'frontGateOpen'" color="default">关闭</a-tag>
+                <a-tag v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 1" color="default">关闭</a-tag>
+                <a-tag v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 1 && record.frontGateClose == 0" color="default">打开</a-tag>
               </template>
               <template v-if="record.rearGateOpenCtrl">
                 <a-tag v-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 0" color="red">正在打开</a-tag>
                 <a-tag v-else-if="column.dataIndex === 'rearGateOpen'" color="processing">打开</a-tag>
               </template>
               <template v-else>
-                <a-tag v-if="column.dataIndex === 'rearGateOpen'  && record.rearGateOpen == 0 && record.rearGateClose == 0" color="red">正在关闭</a-tag>
-                <a-tag v-else-if="column.dataIndex === 'rearGateOpen'" color="default">关闭</a-tag>
+                <a-tag v-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 0" color="red">正在关闭</a-tag>
+                <a-tag v-else-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 1" color="default">关闭</a-tag>
+                <a-tag v-else-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 1 && record.rearGateClose == 0" color="default">打开</a-tag>
               </template>
               
               <a-tag v-if="column.dataIndex === 'warnFlag'" :color="record.warnFlag == 0 ? 'green' : 'red'">{{
@@ -407,16 +409,18 @@
   let rearDeviceState = 0 //记录设备状态,为了与下一次监测数据做比较  
   //backDoorIsOpen frontDoorIsOpen
   const monitorAnimation = (selectData) => {
-
+    debugger
+    
     const timeScale = 0.0003
     if (selectData.frontGateOpenCtrl) {
 
       if (selectData.frontGateOpen == 0 && selectData.frontGateClose == 0) {
         //打开前门1
         
-        frontDoorIsOpen.value = true
-        backDoorIsOpen.value = true
+        
         if(!isFrontRunning){
+          frontDoorIsOpen.value = true
+          backDoorIsOpen.value = true
           isFrontRunning = true
           play(1, timeScale)
           frontDeviceState = 1
@@ -435,12 +439,13 @@
     } else {
       if (selectData.frontGateOpen == 0 && selectData.frontGateClose == 0) {
         //关闭前门
-        frontDoorIsOpen.value = true
-        backDoorIsOpen.value = true
+        
         if(!isFrontRunning){
           isFrontRunning = true
           play(2, timeScale)
           frontDeviceState = 2
+          frontDoorIsOpen.value = true
+          backDoorIsOpen.value = true
         }
         
       }
@@ -458,12 +463,12 @@
     if (selectData.rearGateOpenCtrl) {
       if (selectData.rearGateOpen == 0 && selectData.rearGateClose == 0) {
         //打开后门
-        frontDoorIsOpen.value = true
-        backDoorIsOpen.value = true
         if(!isRearRunning){
           isRearRunning = true
           play(3, timeScale)
           rearDeviceState = 3
+          frontDoorIsOpen.value = true
+          backDoorIsOpen.value = true
         }
         
       }
@@ -482,12 +487,13 @@
       if (selectData.rearGateOpen == 0 && selectData.rearGateClose == 0) {
         //关闭后门
         
-        frontDoorIsOpen.value = true
-        backDoorIsOpen.value = true
+        
         if(!isRearRunning){
           isRearRunning = true
           play(4, timeScale)
           rearDeviceState = 4
+          frontDoorIsOpen.value = true
+          backDoorIsOpen.value = true
         }
         
       }
@@ -500,7 +506,6 @@
           // frontDoorIsOpen.value = false
           backDoorIsOpen.value = false
         }
-
       }
     }
     if(!(selectData.frontGateOpen == 0 && selectData.frontGateClose == 0 && selectData.rearGateOpen == 0 && selectData.rearGateClose == 0)) {

+ 0 - 2
src/views/vent/monitorManager/mainFanMonitor/index.vue

@@ -236,9 +236,7 @@
   import { list, pathList, deviceList, testWind } from './main.api';
   import { list as baseList } from '../../deviceManager/fanTabel/fan.api';
   import { getTableList } from '/@/views/vent/monitorManager/fanLocalMonitor/fanLocal.api';
-  import { message } from 'ant-design-vue';
   import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
-  import { log } from 'console';
 
   const modalTypeArr = reactive({
     centerBtnArr: [

+ 3 - 3
src/views/vent/monitorManager/windowMonitor/dandaoFc.threejs.ts

@@ -41,11 +41,11 @@ class singleWindow {
     const textArr = [
       {
         text: `煤矿巷道远程风窗系统`,
-        font: 'normal 2.2rem Arial',
+        font: 'normal 30px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 90,
-        y: 95,
+        x: 110,
+        y: 94,
       },
       {
         text: `过风量(m3/min):`,

+ 2 - 2
src/views/vent/monitorManager/windowMonitor/shuangdaoFc.threejs.ts

@@ -38,10 +38,10 @@ class doubleWindow {
     const textArr = [
       {
         text: `煤矿巷道远程风窗系统`,
-        font: 'normal 2.2rem Arial',
+        font: 'normal 30px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 90,
+        x: 95,
         y: 95,
       },
       {

+ 42 - 23
src/views/vent/monitorManager/windrectMonitor/components/resultTable.vue

@@ -1,15 +1,32 @@
 <template>
-  <a-table :columns="resultColumns" :data-source="dataSource" rowKey="id" class="components-table-demo-nested" :loading="loading" :pagination="false" size="small" >
+  <!-- <BasicTable @register="registerTable" @edit-change="handleEditChange">
+    <template #action="{ record, column }">
+      <TableAction :actions="createActions(record, column)" />
+    </template>
+  </BasicTable> -->
+  <a-table :columns="resultColumns" :data-source="dataSource" rowKey="id" class="components-table-demo-nested"  :loading="loading"  size="small" >
+    <template #bodyCell="{ record, column }">
+        <template v-if="column.dataIndex === 'action'">
+          <TableAction :actions="createActions(record, column)" />
+          <!-- <a href="javascript:void(0)" ><Icon icon="ant-design:delete-outlined"></Icon></a> -->
+        </template>
+      </template>
     <template #expandedRowRender="{record}">
-      <a-table :columns="innerResultColumns" :data-source="record.testDetail" rowKey="id" :pagination="false" size="small">
+      <a-empty v-if="record.testDetail && record.testDetail.length < 1"/>
+      <a-table v-else :columns="innerResultColumns" :data-source="record.testDetail" rowKey="id"  size="small">
       </a-table>
     </template>
+    <!-- <template></template> -->
+    
   </a-table>
 </template>
 <script lang="ts">
   import { resultList } from '/@/views/vent/monitorManager/windrectMonitor/windrect.api';
-  import { ref, onMounted, onUnmounted } from "vue";
+  import { ref, onMounted } from "vue";
   import { resultColumns, innerResultColumns } from '../windrect.data';
+  import { BasicTable, TableAction, BasicColumn, ActionItem, EditRecordRow } from '/@/components/Table';
+  import { getExportUrl } from '../windrect.api'
+  import { useMethods } from '/@/hooks/system/useMethods';
 
   export default {
     name: 'ResultTable',
@@ -19,42 +36,44 @@
         required: true,
       },
     },
+    components: { TableAction },
     setup() {
       const loading = ref(false)
       const dataSource = ref([]);
+      const { handleExportXls } = useMethods();
 
-      let timer: null | NodeJS.Timeout = null;
       const getMonitor = () => {
-        if (Object.prototype.toString.call(timer) === '[object Null]') {
-          timer = setTimeout(() => {
-            resultList({}).then((res) => {
-              loading.value = false
-              dataSource.value = res.records
-              if (timer) {
-                timer = null;
-              }
-              getMonitor();
-            });
-          }, 1000);
-        }
+        resultList({}).then((res) => {
+          loading.value = false
+          dataSource.value = res.records
+        });
       };
 
+
+      function createActions(record: EditRecordRow, column: BasicColumn): ActionItem[] {
+        return [
+          {
+            label: '导出',
+            onClick: handleExportXls.bind(null, '测风报表导出', getExportUrl, { testid : record.id}),
+          },
+          {
+            label: '删除',
+          },
+        ];
+      }
+
       onMounted(() => {
         loading.value = true
         getMonitor();
 
       });
-      onUnmounted(() => {
-        if(timer){
-          clearTimeout(timer)
-          timer = undefined
-        }
-      })
+      
       return {
         dataSource,
         resultColumns,
         innerResultColumns,
-        loading
+        loading,
+        createActions
       };
     },
   };

+ 36 - 39
src/views/vent/monitorManager/windrectMonitor/duishe.threejs.ts

@@ -305,48 +305,45 @@ class dsWindRect {
 
   // 播放动画
   play(flag, isDirect = false) {
-    const _this = this;
-    if (this.isRun) return;
     const dsTanTou = this.group?.getObjectByName('dsTanTou') as THREE.Group;
-    if (!dsTanTou) return;
-    if (flag === 'start') {
-      const toDownGsap = gsap.getById('toDown') || null;
-      const toUpGsap = gsap.getById('toUp') || null;
-      if (toDownGsap != null) {
-        toDownGsap.pause();
-        toDownGsap.kill();
-      }
-      if (toUpGsap != null) {
-        toUpGsap.pause();
-        toUpGsap.kill();
+    if (!dsTanTou && flag != 'start') return;
+    if (!isDirect) {
+      if (this.isRun) return;
+      dsTanTou.position.setY(0);
+      this.isRun = true;
+      gsap.to(dsTanTou['position'], {
+        id: 'dsDown',
+        y: -0.49,
+        duration: Math.abs(dsTanTou['position']['y'] - 0.49) * 21,
+        overwrite: true,
+        onComplete: function () {
+          setTimeout(() => {
+            gsap.to(dsTanTou['position'], {
+              id: 'dsUp',
+              y: 0,
+              duration: Math.abs(dsTanTou['position']['y']) * 21,
+              overwrite: true,
+              // onComplete: function () {
+              //   _this.isRun = false;
+              // },
+            });
+          }, 2000);
+        },
+      });
+    } else {
+      if (!this.isRun) return
+      const dsDown = gsap.getById('dsDown');
+      const dsUp = gsap.getById('dsUp');
+      if (dsDown) {
+        dsDown.pause();
+        dsDown.kill();
       }
-      if (!gsap.getById('toDown') && !gsap.getById('toUp')) {
-        dsTanTou.position.setY(0);
-        this.isRun = true;
-        gsap.to(dsTanTou['position'], {
-          id: 'toDown',
-          y: -0.49,
-          duration: Math.abs(dsTanTou['position']['y'] - 0.49) * 21,
-          overwrite: true,
-          onComplete: function () {
-            setTimeout(() => {
-              gsap.to(dsTanTou['position'], {
-                y: 0,
-                id: 'toUp',
-                duration: Math.abs(dsTanTou['position']['y']) * 21,
-                overwrite: true,
-                onComplete: function () {
-                  _this.isRun = false
-                },
-              });
-            }, 2000);
-          },
-        });
+      if (dsUp) {
+        dsUp.pause();
+        dsUp.kill();
       }
-
-      debugger;
-    } else {
-      gsap.getById('toDown').paused();
+      dsTanTou.position.setY(0);
+      this.isRun = false;
     }
   }
 

+ 18 - 10
src/views/vent/monitorManager/windrectMonitor/index.vue

@@ -53,7 +53,7 @@
     <div class="bottom-tabs-box">
       <div class="tabs-button-group">
         <a-button class="tabs-button" type="primary" @click="openModel">一键测风</a-button>
-        <a-button class="tabs-button" type="primary">导出报表</a-button>
+        <!-- <a-button class="tabs-button" type="primary" @click="exportExcel()">导出报表</a-button> -->
       </div>
       <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange">
         <a-tab-pane key="1" tab="实时监测">
@@ -70,7 +70,7 @@
               }}</a-tag>
               <template v-if="record && column && column.dataIndex === 'isRun' && record.isRun">
                 <a-tag v-if="record.isRun == -2 || record.isRun == -1" :color="record.isRun == -2 ? '#95CF65' : '#ED5700'">{{
-                  record.isRun === -2 ? '空闲' : '等待'
+                  record.isRun == -2 ? '空闲' : '等待'
                 }}</a-tag>
                 <a-tag v-else-if="record.isRun == 100" color="#4693FF">完成</a-tag>
                 <Progress v-else :percent="Number(record.isRun)" size="small" status="active" />
@@ -224,28 +224,32 @@
           Object.assign(selectData, data);
           addFmText(selectData);
           // 根据3个点位分别执行动画
+
           if(data.deviceType == "windrect_fold"){
-            if (selectData.apparatusRun == 1) {
+            if (selectData['apparatusRun'] == 1) {
               const flag = selectData.sign == 0 ? 'up' : selectData.sign == 1 ? 'center' : selectData.sign == 2 ? 'down' : null
               if (flag) play(flag);
             } else {
-              if (selectData.sign == 0) play('reset')
+              const flag = selectData.sign == 1 ? 'center' : selectData.sign == 2 ? 'down' : null
+              if (flag) play(flag, true);
             }
           }
+          
           if(data.deviceType == "windrect_rect"){
-            if (selectData.apparatusRun == 1) {
+            if (selectData['apparatusRun'] == 1) {
               const flag = selectData.sign == 0 ? 'center' : selectData.sign == 1 ? 'down' : selectData.sign == 2 ? 'up' : null
               if (flag) play(flag);
-            }
-            else {
-              const flag = selectData.sign == 1 ? 'down' : selectData.sign == 2 ? 'up' : null
+            } else {
+              const flag = selectData.sign == 1 ? 'center' : selectData.sign == 2 ? 'down' : selectData.sign == 0 ? 'up': null
               if (flag) play(flag, true);
             }
           }
 
           if (data.deviceType == "windrect_ds") {
-            if (selectData.apparatusRun == 1) {
+            if (selectData['apparatusRun'] == 1) {
               play('start')
+            }else{
+              play('start', true)
             }
           }
 
@@ -260,7 +264,6 @@
 
   // 自测动画方法
   const testPlay = (flag) => {
-    debugger
     play(flag);
     // play('start')
     // setTimeout(() => {
@@ -283,6 +286,7 @@
     selectRowIndex.value = index;
     // Object.assign(selectData, selectRow);
     const type = selectRow.deviceType == 'windrect_rect' ? 'lmWindRect' : selectRow.deviceType == 'windrect_fold' ? 'zdWindRect' : 'dsWindRect'; 
+    // const type = selectRowIndex.value >= 1 ? 'lmWindRect' : selectRowIndex.value <= 3 ? 'zdWindRect' : 'dsWindRect';
     await setModelType(type);
     loading.value = false;
   };
@@ -327,6 +331,10 @@
     setModalProps({ visible: true });
   };
 
+  const exportExcel = (id) => {
+    exportXls({ testid: id })
+  }
+
   /* 关闭一键测风弹窗 */
   const handleCancel = () => {
     setModalProps({ visible: false });

+ 64 - 50
src/views/vent/monitorManager/windrectMonitor/longmen.threejs.ts

@@ -79,99 +79,107 @@ class lmWindRect {
     }
     const textArr = [
       {
-        text: `煤矿巷道远程风系统`,
-        font: 'normal 2.2rem Arial',
+        text: `煤矿巷道远程风系统`,
+        font: 'normal 32px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 90,
-        y: 95,
+        x: 130,
+        y: 40,
       },
       {
-        text: `风量(m3/min):`,
-        font: 'normal 30px Arial',
+        text: `风量(m3/min):`,
+        font: 'normal 29px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 5,
+        x: 2,
         y: 115,
       },
       {
-        text: `${
-          selectData.frontRearDifference && selectData.rearPresentValue
-            ? Math.min(selectData.frontRearDifference, selectData.rearPresentValue)
-            : selectData.frontRearDifference || selectData.rearPresentValue || '-'
-        }`,
-        font: 'normal 30px Arial',
+        text: `${selectData.m3 ? selectData.m3 : '-'}`,
+        font: 'normal 29px Arial',
         color: '#009900',
         strokeStyle: '#002200',
         x: 235,
         y: 115,
       },
       {
-        text: `过风面积(m2): `,
-        font: 'normal 30px Arial',
+        text: `气源压力(MPa): `,
+        font: 'normal 29px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 5,
+        x: 2,
         y: 182,
       },
       {
-        text: `${
-          selectData.forntArea && selectData.rearArea
-            ? Math.min(selectData.forntArea, selectData.rearArea)
-            : selectData.forntArea || selectData.rearArea || '-'
-        }`,
-        font: 'normal 30px Arial',
+        text: `${selectData.temperature ? selectData.temperature : '-'}`,
+        font: 'normal 29px Arial',
         color: '#009900',
         strokeStyle: '#002200',
         x: 200,
         y: 182,
       },
       {
-        text: `风窗压差(Pa):`,
-        font: 'normal 30px Arial',
+        text: `Va(m/s):`,
+        font: 'normal 29px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 5,
+        x: 2,
         y: 245,
       },
       {
-        text: `${selectData.dataDh}`,
-        font: 'normal 30px Arial',
+        text: `${selectData.va ? selectData.va : '-'}`,
+        font: 'normal 29px Arial',
         color: '#009900',
         strokeStyle: '#002200',
         x: 200,
         y: 245,
       },
       {
-        text: `调节精度:`,
-        font: 'normal 30px Arial',
+        text: `V1(m/s):`,
+        font: 'normal 28px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 320,
+        x: 331,
         y: 115,
       },
       {
-        text: `1% FS`,
-        font: 'normal 30px Arial',
+        text: `${selectData.incipientWindSpeed1 ? selectData.incipientWindSpeed1 : '-'}`,
+        font: 'normal 28px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 460,
+        x: 455,
         y: 115,
       },
       {
-        text: `调节范围:`,
-        font: 'normal 30px Arial',
+        text: `V2(m/s):`,
+        font: 'normal 28px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 320,
+        x: 330,
         y: 182,
       },
       {
-        text: `${selectData.maxarea}`,
-        font: 'normal 30px Arial',
+        text: `${selectData.incipientWindSpeed2 ? selectData.incipientWindSpeed2 : '-'}`,
+        font: 'normal 28px Arial',
         color: '#009900',
         strokeStyle: '#002200',
-        x: 460,
+        x: 452,
+        y: 182,
+      },
+      {
+        text: `V3(m/s):`,
+        font: 'normal 28px Arial',
+        color: '#009900',
+        strokeStyle: '#002200',
+        x: 330,
+        y: 182,
+      },
+      {
+        text: `${selectData.incipientWindSpeed3 ? selectData.incipientWindSpeed3 : '-'}`,
+        font: 'normal 28px Arial',
+        color: '#009900',
+        strokeStyle: '#002200',
+        x: 452,
         y: 182,
       },
       {
@@ -289,7 +297,6 @@ class lmWindRect {
 
   // 播放动画
   play(flag, isDirect = false) {
-    debugger
     const cfTanTou = this.group?.getObjectByName('lmTanTou') as THREE.Group;
     if (!cfTanTou) return;
     switch (flag) {
@@ -297,10 +304,11 @@ class lmWindRect {
         if (this.deviceRunState == 'up' || this.deviceRunState == 'center') {
           return;
         }
-        this.deviceRunState = 'up';
-        cfTanTou.position.setY(-0.48);
         if (!isDirect) {
+          this.deviceRunState = 'up';
+          if (this.deviceRunState == 'down') cfTanTou.position.setY(-0.48);
           gsap.to(cfTanTou['position'], {
+            id: 'lm',
             y: 0,
             duration: Math.abs(cfTanTou['position']['y'] - 0) * 25,
             overwrite: true,
@@ -308,41 +316,47 @@ class lmWindRect {
         } else {
           cfTanTou.position.setY(0);
         }
-
         break;
+
       case 'center':
-        if (this.deviceRunState == 'center') {
+        if (this.deviceRunState) {
           return;
         }
-        this.deviceRunState = 'center';
-        cfTanTou.position.setY(0);
         if (!isDirect) {
+          this.deviceRunState = 'center';
+          cfTanTou.position.setY(0);
           gsap.to(cfTanTou['position'], {
+            id: 'lm',
             y: -0.24,
             duration: Math.abs(cfTanTou['position']['y'] + 0.24) * 50,
             overwrite: true,
           });
         } else {
+          this.deviceRunState = 'center';
           cfTanTou.position.setY(-0.24);
         }
 
         break;
       case 'down':
-        if (this.deviceRunState == 'down') {
+        debugger;
+        if (this.deviceRunState == 'down' || this.deviceRunState == 'up') {
           return;
         }
-        this.deviceRunState = 'down';
-        cfTanTou.position.setY(-0.24);
         if (!isDirect) {
+          if (this.deviceRunState == 'center') {
+            cfTanTou.position.setY(-0.24);
+          }
+          this.deviceRunState = 'down';
           gsap.to(cfTanTou['position'], {
+            id: 'lm',
             y: -0.48,
             duration: Math.abs(cfTanTou['position']['y'] + 0.48) * 50,
             overwrite: true,
           });
         } else {
+          this.deviceRunState = 'down';
           cfTanTou.position.setY(-0.48);
         }
-
         break;
     }
   }

+ 2 - 1
src/views/vent/monitorManager/windrectMonitor/windrect.api.ts

@@ -7,7 +7,7 @@ enum Api {
   deviceList = '/ventanaly-device/safety/ventanalyWind/list',
   resultList = '/ventanaly-device/safety/testwind/list',
   importExcel = '/sys/user/importExcel',
-  exportXls = '/sys/user/exportXls',
+  exportXls = 'safety/testwindDetail/exportXls',
 }
 /**
  * 导出api
@@ -45,3 +45,4 @@ export const pathList = (params) => defHttp.get({ url: Api.pathList, params });
  * 关键路线列表
  */
 export const deviceList = (params) => defHttp.get({ url: Api.deviceList, params });
+

+ 32 - 5
src/views/vent/monitorManager/windrectMonitor/windrect.data.ts

@@ -2,40 +2,54 @@ import { BasicColumn } from '/@/components/Table';
 import { FormSchema } from '/@/components/Table';
 import { rules } from '/@/utils/helper/validator';
 export const resultColumns: BasicColumn[] = [
-  {
-    title: '测风描述',
-    dataIndex: 'strremark',
-    width: 120,
-  },
+  // {
+  //   title: '测风描述',
+  //   dataIndex: 'strremark',
+  //   width: 120,
+  //   align: 'center',
+  // },
   {
     title: '测风设备数量',
     dataIndex: 'totalcount',
     width: 100,
+    align: 'center',
   },
   {
     title: '同时运行数量',
     dataIndex: 'count',
     width: 100,
+    align: 'center',
   },
   {
     title: '总时长',
     dataIndex: 'runtime',
     width: 100,
+    align: 'center',
   },
   {
     title: '开始测风时间',
     dataIndex: 'begintime',
     width: 80,
+    align: 'center',
   },
   {
     title: '结束测风时间',
     dataIndex: 'endtime',
     width: 100,
+    align: 'center',
+    sorter: (a: any, b: any) => new Date(a.endtime) - new Date(b.endtime),
   },
   {
     title: '用时(s)',
     dataIndex: 'runtime',
     width: 100,
+    align: 'center',
+  },
+  {
+    title: '操作',
+    dataIndex: 'action',
+    width: 100,
+    align: 'center',
   },
 ];
 
@@ -43,66 +57,79 @@ export const innerResultColumns: BasicColumn[] = [
   {
     title: '设备名称',
     dataIndex: 'strname',
+    align: 'center',
     width: 120,
   },
   {
     title: 'v1a',
     dataIndex: 'v1a',
+    align: 'center',
     width: 100,
   },
   {
     title: 'v1b',
     dataIndex: 'v1b',
+    align: 'center',
     width: 100,
   },
   {
     title: 'v1c',
     dataIndex: 'v1c',
+    align: 'center',
     width: 100,
   },
   {
     title: 'v2a',
     dataIndex: 'v2a',
+    align: 'center',
     width: 80,
   },
   {
     title: 'v2b',
     dataIndex: 'v2b',
+    align: 'center',
     width: 100,
   },
   {
     title: 'v2c',
     dataIndex: 'v2c',
+    align: 'center',
     width: 100,
   },
   {
     title: 'v3a',
     dataIndex: 'v3a',
+    align: 'center',
     width: 100,
   },
   {
     title: 'v3b',
     dataIndex: 'v3b',
+    align: 'center',
     width: 80,
   },
   {
     title: 'v3c',
     dataIndex: 'v3c',
+    align: 'center',
     width: 100,
   },
   {
     title: '平均风速',
     dataIndex: 'va',
+    align: 'center',
     width: 100,
   },
   {
     title: '风量',
     dataIndex: 'm3',
+    align: 'center',
     width: 100,
   },
   {
     title: '用时(s)',
     dataIndex: 'runtime',
+    align: 'center',
     width: 80,
   },
 ];

+ 13 - 4
src/views/vent/monitorManager/windrectMonitor/windrect.threejs.ts

@@ -149,14 +149,23 @@ export const setModelType = (type) => {
   windRectType = type;
   model.camera.position.set(-1000, 100, 500);
 
+  // 暂停龙门动画
+  const lmGsap = gsap.getById('lm') || null;
+  if (lmGsap != null) {
+    lmGsap.pause();
+    lmGsap.kill();
+  }
+  lmWindRectObj.deviceRunState = '';
+  dsWindRectObj.isRun = false;
+
   return new Promise((resolve) => {
     // 显示双道风窗
     if (windRectType === 'lmWindRect') {
       model.startAnimation = lmWindRectObj.render.bind(lmWindRectObj);
       group = lmWindRectObj.group;
-      // const cfTanTou = lmWindRectObj.group?.getObjectByName('lmTanTou') as THREE.Group;
-      // cfTanTou.position.setY(0);
-      lmWindRectObj.deviceRunState == '';
+
+      const cfTanTou = lmWindRectObj.group?.getObjectByName('lmTanTou') as THREE.Group;
+      cfTanTou.position.setY(0);
       if (model.scene.getObjectByName('zdcf')) {
         model.scene.remove(zdWindRectObj.group);
       }
@@ -204,7 +213,7 @@ export const setModelType = (type) => {
         );
       }, 300);
     } else if (windRectType === 'dsWindRect') {
-      dsWindRectObj.isRun = false
+      // dsWindRectObj.isRun = false;
       model.startAnimation = dsWindRectObj.render.bind(dsWindRectObj);
       group = dsWindRectObj.group;
       const dsTanTou = dsWindRectObj.group?.getObjectByName('dsTanTou') as THREE.Group;

+ 3 - 6
src/views/vent/monitorManager/windrectMonitor/zhedie.threejs.ts

@@ -276,7 +276,6 @@ class zdWindRect {
   // 播放动画
   play(flag, isDirect = false) {
     if (flag === 'up' && this.animationAction.time <= 0) {
-      debugger;
       this.animationAction?.reset();
       // @ts-ignore
       this.animationAction.time = 0;
@@ -284,18 +283,16 @@ class zdWindRect {
       this.mixers[0].timeScale = 0.15;
       this.animationAction?.play();
     } else if (flag === 'center' && this.animationAction.time <= 8) {
-      debugger;
       this.animationAction?.reset();
       // @ts-ignore
       this.animationAction.time = 200 / 25; // 8
-      this.animations[0].duration = 300 / 25;
+      this.animations[0].duration = 350 / 25;
       this.mixers[0].timeScale = 0.15;
       this.animationAction?.play();
-    } else if (flag === 'down' && this.animationAction.time <= 12) {
+    } else if (flag === 'down' && this.animationAction.time <= 14) {
       this.animationAction?.reset();
-      debugger;
       // @ts-ignore
-      this.animationAction.time = 300 / 25; // 12
+      this.animationAction.time = 350 / 25; // 14
       this.animations[0].duration = 530 / 25;
       this.mixers[0].timeScale = 0.12;
       this.animationAction?.play();