浏览代码

Merge branch 'v1.2.0-ga' into 1.9.0-fm

# Conflicts:
#	src/api/floder.ts
#	src/api/folder-type.ts
#	src/components/static-preview/index.vue
#	src/components/static-preview/resource.vue
#	src/store/floder-type.ts
#	src/views/folder/floder-view.vue
#	src/views/folder/index.vue
#	src/views/folder/modal-floder-view.vue
#	src/views/record/sign.vue
wangfumin 3 月之前
父节点
当前提交
f1b32d6ae7
共有 100 个文件被更改,包括 115347 次插入64800 次删除
  1. 5 0
      .env
  2. 5 0
      .env.development
  3. 4 0
      .offline.env
  4. 7 2
      package.json
  5. 252 104
      pnpm-lock.yaml
  6. 二进制
      public/animation/Man.glb
  7. 二进制
      public/animation/Soldier.glb
  8. 二进制
      public/animation/Xbot.glb
  9. 二进制
      public/animation/dog.glb
  10. 二进制
      public/animation/kid.glb
  11. 二进制
      public/animation/man--running.glb
  12. 二进制
      public/animation/man--walk.glb
  13. 二进制
      public/favicon.ico
  14. 二进制
      public/images/point.png
  15. 二进制
      public/images/satellite.jpg
  16. 二进制
      public/images/standard.jpg
  17. 二进制
      public/images/video.png
  18. 二进制
      public/images/应急预案.jpg
  19. 二进制
      public/images/新对话-豆包@3x.png
  20. 二进制
      public/images/菜市场应急预案.pdf
  21. 二进制
      public/images/路径@1x (2).png
  22. 10698 10388
      public/lib/Cesium/Cesium.js
  23. 26911 0
      public/lib/other/hls.js
  24. 25149 17310
      public/lib/potree/potree.js
  25. 1 1
      public/lib/potree/potree.js.map
  26. 二进制
      public/lib/potree/resources/models/glb/87b3a367bc3e4273832cb4fa398782e5.glb
  27. 二进制
      public/lib/potree/resources/models/glb/87ecd10fb0374ea6b3e0bf24c6459e3c.glb
  28. 二进制
      public/lib/potree/resources/models/glb/ModernJPHouseSofa44105209.glb
  29. 二进制
      public/lib/potree/resources/models/glb/coffeemat.glb
  30. 二进制
      public/lib/potree/resources/models/glb/monitor.glb
  31. 0 13
      public/lib/potree/resources/models/stanford_bunny_reduced.mtl
  32. 0 22384
      public/lib/potree/resources/models/stanford_bunny_reduced.obj
  33. 二进制
      public/lib/potree/resources/models/stanford_bunny_reduced.ply
  34. 0 378
      public/lib/potree/resources/models/t-YLZ5XAALl7/pipe.mtl
  35. 0 508
      public/lib/potree/resources/models/t-e2Kb2iU/pipe.mtl
  36. 0 13370
      public/lib/potree/resources/models/t-e2Kb2iU/pipe.obj
  37. 二进制
      public/lib/potree/resources/textures/arrow.png
  38. 二进制
      public/lib/potree/resources/textures/arrows.png
  39. 3 0
      public/lib/shapefile/shapefile.js
  40. 16 35
      public/lib/three.js/loaders/draco/draco_decoder.js
  41. 3 3
      public/lib/three.js/loaders/draco/draco_wasm_wrapper.js
  42. 14 0
      public/xfile-viewer/.prettierrc
  43. 247 0
      public/xfile-viewer/index.html
  44. 二进制
      public/xfile-viewer/publish/20231025172413.dcm
  45. 二进制
      public/lib/potree/resources/models/glb/ModernJPHouseSofa44216499.glb
  46. 9084 0
      public/xfile-viewer/publish/lib/cornerstone.js
  47. 3 0
      public/xfile-viewer/publish/lib/cornerstoneMath.min.js
  48. 38415 0
      public/xfile-viewer/publish/lib/cornerstoneTools.js
  49. 2 0
      public/xfile-viewer/publish/lib/cornerstoneWADOImageLoader.bundle.min.js
  50. 3 0
      public/xfile-viewer/publish/lib/cornerstoneWebImageLoader.min.js
  51. 3 0
      public/xfile-viewer/publish/lib/dicomParser.min.js
  52. 2643 0
      public/xfile-viewer/publish/lib/hammer.js
  53. 150 0
      src/api/animation.ts
  54. 36 8
      src/api/constant.ts
  55. 1 3
      src/api/floder.ts
  56. 58 0
      src/api/floder_BACKUP_1461.ts
  57. 58 0
      src/api/floder_BACKUP_1524.ts
  58. 58 0
      src/api/floder_BACKUP_1600.ts
  59. 58 0
      src/api/floder_BACKUP_1668.ts
  60. 77 0
      src/api/floder_BASE_1461.ts
  61. 77 0
      src/api/floder_BASE_1524.ts
  62. 77 0
      src/api/floder_BASE_1600.ts
  63. 77 0
      src/api/floder_BASE_1668.ts
  64. 60 0
      src/api/floder_LOCAL_1461.ts
  65. 60 0
      src/api/floder_LOCAL_1524.ts
  66. 60 0
      src/api/floder_LOCAL_1600.ts
  67. 60 0
      src/api/floder_LOCAL_1668.ts
  68. 58 0
      src/api/floder_REMOTE_1461.ts
  69. 58 0
      src/api/floder_REMOTE_1524.ts
  70. 58 0
      src/api/floder_REMOTE_1600.ts
  71. 58 0
      src/api/floder_REMOTE_1668.ts
  72. 19 11
      src/api/folder-type.ts
  73. 12 7
      src/api/fuse-model.ts
  74. 4 0
      src/api/guide-path.ts
  75. 15 0
      src/api/guide.ts
  76. 3 1
      src/api/index.ts
  77. 58 40
      src/api/instance.ts
  78. 24 0
      src/api/map-tile.ts
  79. 93 64
      src/api/material.ts
  80. 65 0
      src/api/monitor.ts
  81. 23 3
      src/api/offline.ts
  82. 5 12
      src/api/path.ts
  83. 17 8
      src/api/scene.ts
  84. 20 6
      src/api/setting.ts
  85. 4 5
      src/api/setup.ts
  86. 32 30
      src/api/sys.ts
  87. 19 4
      src/api/tagging-position.ts
  88. 2 2
      src/api/tagging-style.ts
  89. 8 5
      src/api/tagging.ts
  90. 22 0
      src/api/user.ts
  91. 85 23
      src/app.vue
  92. 0 12
      src/assets/style/criminal.less
  93. 0 3
      src/assets/style/fire.css
  94. 0 12
      src/assets/style/fire.less
  95. 3 0
      src/assets/style/global.css
  96. 4 0
      src/assets/style/global.less
  97. 90 0
      src/components/actions-merge/index.vue
  98. 52 44
      src/components/actions/index.vue
  99. 1 1
      src/components/bill-ui/assets/scss/_base-vars.scss
  100. 0 0
      src/components/bill-ui/assets/scss/editor/_toolbar.scss

+ 5 - 0
.env

@@ -0,0 +1,5 @@
+VITE_LASER_HOST=
+VITE_LASER_OSS=/laser-data
+VITE_OSS=/oss
+VITE_PANO_OSS=/oss
+VITE_MAP_PLATFORM=jm

+ 5 - 0
.env.development

@@ -0,0 +1,5 @@
+VITE_LASER_HOST=
+VITE_LASER_OSS=/laser-data
+VITE_OSS=/oss
+VITE_PANO_OSS=/oss
+VITE_MAP_PLATFORM=gaode

+ 4 - 0
.offline.env

@@ -0,0 +1,4 @@
+VITE_LASER_HOST=
+VITE_LASER_OSS=/laser-data
+VITE_PANO_OSS=/laser-data
+

+ 7 - 2
package.json

@@ -11,17 +11,22 @@
   },
   "dependencies": {
     "@ant-design/icons-vue": "^7.0.1",
+    "@types/three": "^0.169.0",
     "ant-design-vue": "^4.2.6",
     "axios": "^0.27.2",
     "coordtransform": "^2.1.2",
+    "konva": "^9.3.18",
     "less": "^4.1.3",
     "mitt": "^3.0.0",
     "simaqcore": "^1.2.0",
     "swiper": "^11.1.15",
+    "three": "^0.169.0",
+    "uuid": "^11.0.2",
     "vite-plugin-mkcert": "^1.10.1",
-    "vue": "^3.2.37",
+    "vue": "3.2.47",
     "vue-cropper": "1.0.2",
-    "vue-router": "^4.1.3",
+    "vue-konva": "^3.2.0",
+    "vue-router": "^4.5.0",
     "vuedraggable": "^4.1.0"
   },
   "devDependencies": {

+ 252 - 104
pnpm-lock.yaml

@@ -3,42 +3,52 @@ lockfileVersion: 5.4
 specifiers:
   '@ant-design/icons-vue': ^7.0.1
   '@types/node': ^18.6.5
+  '@types/three': ^0.169.0
   '@vitejs/plugin-vue': ^3.0.0
   ant-design-vue: ^4.2.6
   axios: ^0.27.2
   coordtransform: ^2.1.2
+  konva: ^9.3.18
   less: ^4.1.3
   mitt: ^3.0.0
   sass: ^1.54.3
   simaqcore: ^1.2.0
   swiper: ^11.1.15
+  three: ^0.169.0
   typescript: ^4.6.4
+  uuid: ^11.0.2
   vite: ^3.0.0
   vite-plugin-mkcert: ^1.10.1
-  vue: ^3.2.37
+  vue: 3.2.47
   vue-cropper: 1.0.2
-  vue-router: ^4.1.3
+  vue-konva: ^3.2.0
+  vue-router: ^4.5.0
   vue-tsc: ^0.38.4
   vuedraggable: ^4.1.0
 
 dependencies:
-  '@ant-design/icons-vue': 7.0.1_vue@3.2.37
-  ant-design-vue: 4.2.6_vue@3.2.37
+  '@ant-design/icons-vue': 7.0.1_vue@3.2.47
+  '@types/three': 0.169.0
+  ant-design-vue: 4.2.6_vue@3.2.47
   axios: 0.27.2
   coordtransform: 2.1.2
+  konva: 9.3.20
   less: 4.1.3
   mitt: 3.0.0
   simaqcore: 1.2.0
   swiper: 11.1.15
+  three: 0.169.0
+  uuid: 11.1.0
   vite-plugin-mkcert: 1.10.1_vite@3.0.4
-  vue: 3.2.37
+  vue: 3.2.47
   vue-cropper: 1.0.2
-  vue-router: 4.1.3_vue@3.2.37
-  vuedraggable: 4.1.0_vue@3.2.37
+  vue-konva: 3.2.0_konva@9.3.20+vue@3.2.47
+  vue-router: 4.5.0_vue@3.2.47
+  vuedraggable: 4.1.0_vue@3.2.47
 
 devDependencies:
   '@types/node': 18.6.5
-  '@vitejs/plugin-vue': 3.0.1_vite@3.0.4+vue@3.2.37
+  '@vitejs/plugin-vue': 3.0.1_vite@3.0.4+vue@3.2.47
   sass: 1.54.3
   typescript: 4.7.4
   vite: 3.0.4_less@4.1.3+sass@1.54.3
@@ -56,30 +66,30 @@ packages:
     resolution: {integrity: sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==}
     dev: false
 
-  /@ant-design/icons-vue/7.0.1_vue@3.2.37:
+  /@ant-design/icons-vue/7.0.1_vue@3.2.47:
     resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==}
     peerDependencies:
       vue: '>=3.0.3'
     dependencies:
       '@ant-design/colors': 6.0.0
       '@ant-design/icons-svg': 4.2.1
-      vue: 3.2.37
+      vue: 3.2.47
     dev: false
 
-  /@babel/helper-string-parser/7.18.10:
-    resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==}
+  /@babel/helper-string-parser/7.25.9:
+    resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
     engines: {node: '>=6.9.0'}
 
-  /@babel/helper-validator-identifier/7.18.6:
-    resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==}
+  /@babel/helper-validator-identifier/7.25.9:
+    resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
     engines: {node: '>=6.9.0'}
 
-  /@babel/parser/7.18.11:
-    resolution: {integrity: sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==}
+  /@babel/parser/7.26.3:
+    resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==}
     engines: {node: '>=6.0.0'}
     hasBin: true
     dependencies:
-      '@babel/types': 7.18.13
+      '@babel/types': 7.26.3
 
   /@babel/runtime/7.18.9:
     resolution: {integrity: sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==}
@@ -88,13 +98,12 @@ packages:
       regenerator-runtime: 0.13.9
     dev: false
 
-  /@babel/types/7.18.13:
-    resolution: {integrity: sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==}
+  /@babel/types/7.26.3:
+    resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/helper-string-parser': 7.18.10
-      '@babel/helper-validator-identifier': 7.18.6
-      to-fast-properties: 2.0.0
+      '@babel/helper-string-parser': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
 
   /@ctrl/tinycolor/3.6.1:
     resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
@@ -117,6 +126,10 @@ packages:
     requiresBuild: true
     optional: true
 
+  /@jridgewell/sourcemap-codec/1.5.0:
+    resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+    dev: true
+
   /@octokit/auth-token/3.0.2:
     resolution: {integrity: sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==}
     engines: {node: '>= 14'}
@@ -240,11 +253,34 @@ packages:
       nanopop: 2.1.0
     dev: false
 
+  /@tweenjs/tween.js/23.1.3:
+    resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==}
+    dev: false
+
   /@types/node/18.6.5:
     resolution: {integrity: sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==}
     dev: true
 
-  /@vitejs/plugin-vue/3.0.1_vite@3.0.4+vue@3.2.37:
+  /@types/stats.js/0.17.3:
+    resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==}
+    dev: false
+
+  /@types/three/0.169.0:
+    resolution: {integrity: sha512-oan7qCgJBt03wIaK+4xPWclYRPG9wzcg7Z2f5T8xYTNEF95kh0t0lklxLLYBDo7gQiGLYzE6iF4ta7nXF2bcsw==}
+    dependencies:
+      '@tweenjs/tween.js': 23.1.3
+      '@types/stats.js': 0.17.3
+      '@types/webxr': 0.5.21
+      '@webgpu/types': 0.1.59
+      fflate: 0.8.2
+      meshoptimizer: 0.18.1
+    dev: false
+
+  /@types/webxr/0.5.21:
+    resolution: {integrity: sha512-geZIAtLzjGmgY2JUi6VxXdCrTb99A7yP49lxLr2Nm/uIK0PkkxcEi4OGhoGDO4pxCf3JwGz2GiJL2Ej4K2bKaA==}
+    dev: false
+
+  /@vitejs/plugin-vue/3.0.1_vite@3.0.4+vue@3.2.47:
     resolution: {integrity: sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
@@ -252,7 +288,7 @@ packages:
       vue: ^3.2.25
     dependencies:
       vite: 3.0.4_less@4.1.3+sass@1.54.3
-      vue: 3.2.37
+      vue: 3.2.47
     dev: true
 
   /@volar/code-gen/0.38.9:
@@ -270,9 +306,9 @@ packages:
     dependencies:
       '@volar/code-gen': 0.38.9
       '@volar/source-map': 0.38.9
-      '@vue/compiler-core': 3.2.37
-      '@vue/compiler-dom': 3.2.37
-      '@vue/shared': 3.2.37
+      '@vue/compiler-core': 3.5.13
+      '@vue/compiler-dom': 3.5.13
+      '@vue/shared': 3.5.13
     dev: true
 
   /@volar/vue-typescript/0.38.9:
@@ -281,54 +317,92 @@ packages:
       '@volar/code-gen': 0.38.9
       '@volar/source-map': 0.38.9
       '@volar/vue-code-gen': 0.38.9
-      '@vue/compiler-sfc': 3.2.37
+      '@vue/compiler-sfc': 3.5.13
       '@vue/reactivity': 3.2.37
     dev: true
 
-  /@vue/compiler-core/3.2.37:
-    resolution: {integrity: sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==}
+  /@vue/compiler-core/3.2.47:
+    resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==}
     dependencies:
-      '@babel/parser': 7.18.11
-      '@vue/shared': 3.2.37
+      '@babel/parser': 7.26.3
+      '@vue/shared': 3.2.47
       estree-walker: 2.0.2
       source-map: 0.6.1
 
-  /@vue/compiler-dom/3.2.37:
-    resolution: {integrity: sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==}
+  /@vue/compiler-core/3.5.13:
+    resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
     dependencies:
-      '@vue/compiler-core': 3.2.37
-      '@vue/shared': 3.2.37
+      '@babel/parser': 7.26.3
+      '@vue/shared': 3.5.13
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+    dev: true
 
-  /@vue/compiler-sfc/3.2.37:
-    resolution: {integrity: sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==}
+  /@vue/compiler-dom/3.2.47:
+    resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==}
     dependencies:
-      '@babel/parser': 7.18.11
-      '@vue/compiler-core': 3.2.37
-      '@vue/compiler-dom': 3.2.37
-      '@vue/compiler-ssr': 3.2.37
-      '@vue/reactivity-transform': 3.2.37
-      '@vue/shared': 3.2.37
+      '@vue/compiler-core': 3.2.47
+      '@vue/shared': 3.2.47
+
+  /@vue/compiler-dom/3.5.13:
+    resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
+    dependencies:
+      '@vue/compiler-core': 3.5.13
+      '@vue/shared': 3.5.13
+    dev: true
+
+  /@vue/compiler-sfc/3.2.47:
+    resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==}
+    dependencies:
+      '@babel/parser': 7.26.3
+      '@vue/compiler-core': 3.2.47
+      '@vue/compiler-dom': 3.2.47
+      '@vue/compiler-ssr': 3.2.47
+      '@vue/reactivity-transform': 3.2.47
+      '@vue/shared': 3.2.47
       estree-walker: 2.0.2
       magic-string: 0.25.9
-      postcss: 8.4.16
+      postcss: 8.4.49
       source-map: 0.6.1
 
-  /@vue/compiler-ssr/3.2.37:
-    resolution: {integrity: sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==}
+  /@vue/compiler-sfc/3.5.13:
+    resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
     dependencies:
-      '@vue/compiler-dom': 3.2.37
-      '@vue/shared': 3.2.37
+      '@babel/parser': 7.26.3
+      '@vue/compiler-core': 3.5.13
+      '@vue/compiler-dom': 3.5.13
+      '@vue/compiler-ssr': 3.5.13
+      '@vue/shared': 3.5.13
+      estree-walker: 2.0.2
+      magic-string: 0.30.17
+      postcss: 8.4.49
+      source-map-js: 1.2.1
+    dev: true
+
+  /@vue/compiler-ssr/3.2.47:
+    resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==}
+    dependencies:
+      '@vue/compiler-dom': 3.2.47
+      '@vue/shared': 3.2.47
 
-  /@vue/devtools-api/6.2.1:
-    resolution: {integrity: sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==}
+  /@vue/compiler-ssr/3.5.13:
+    resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
+    dependencies:
+      '@vue/compiler-dom': 3.5.13
+      '@vue/shared': 3.5.13
+    dev: true
+
+  /@vue/devtools-api/6.6.4:
+    resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
     dev: false
 
-  /@vue/reactivity-transform/3.2.37:
-    resolution: {integrity: sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==}
+  /@vue/reactivity-transform/3.2.47:
+    resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==}
     dependencies:
-      '@babel/parser': 7.18.11
-      '@vue/compiler-core': 3.2.37
-      '@vue/shared': 3.2.37
+      '@babel/parser': 7.26.3
+      '@vue/compiler-core': 3.2.47
+      '@vue/shared': 3.2.47
       estree-walker: 2.0.2
       magic-string: 0.25.9
 
@@ -336,40 +410,58 @@ packages:
     resolution: {integrity: sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==}
     dependencies:
       '@vue/shared': 3.2.37
+    dev: true
 
-  /@vue/runtime-core/3.2.37:
-    resolution: {integrity: sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==}
+  /@vue/reactivity/3.2.47:
+    resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==}
     dependencies:
-      '@vue/reactivity': 3.2.37
-      '@vue/shared': 3.2.37
+      '@vue/shared': 3.2.47
 
-  /@vue/runtime-dom/3.2.37:
-    resolution: {integrity: sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==}
+  /@vue/runtime-core/3.2.47:
+    resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==}
     dependencies:
-      '@vue/runtime-core': 3.2.37
-      '@vue/shared': 3.2.37
-      csstype: 2.6.20
+      '@vue/reactivity': 3.2.47
+      '@vue/shared': 3.2.47
+
+  /@vue/runtime-dom/3.2.47:
+    resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==}
+    dependencies:
+      '@vue/runtime-core': 3.2.47
+      '@vue/shared': 3.2.47
+      csstype: 2.6.21
 
-  /@vue/server-renderer/3.2.37_vue@3.2.37:
-    resolution: {integrity: sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==}
+  /@vue/server-renderer/3.2.47_vue@3.2.47:
+    resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==}
     peerDependencies:
-      vue: 3.2.37
+      vue: 3.2.47
     dependencies:
-      '@vue/compiler-ssr': 3.2.37
-      '@vue/shared': 3.2.37
-      vue: 3.2.37
+      '@vue/compiler-ssr': 3.2.47
+      '@vue/shared': 3.2.47
+      vue: 3.2.47
 
   /@vue/shared/3.2.37:
     resolution: {integrity: sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==}
+    dev: true
+
+  /@vue/shared/3.2.47:
+    resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==}
+
+  /@vue/shared/3.5.13:
+    resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
+    dev: true
+
+  /@webgpu/types/0.1.59:
+    resolution: {integrity: sha512-jZJ6ipNli+rn++/GAPqsZXfsgjx951wlCW7vNAg+oGdp0ZYidTOkbVTVeK2frzowuD5ch7MRz7leOEX1PMv43A==}
+    dev: false
 
-  /ant-design-vue/4.2.6_vue@3.2.37:
+  /ant-design-vue/4.2.6_vue@3.2.47:
     resolution: {integrity: sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==}
     engines: {node: '>=12.22.0'}
     peerDependencies:
       vue: '>=3.2.0'
     dependencies:
       '@ant-design/colors': 6.0.0
-      '@ant-design/icons-vue': 7.0.1_vue@3.2.37
+      '@ant-design/icons-vue': 7.0.1_vue@3.2.47
       '@babel/runtime': 7.18.9
       '@ctrl/tinycolor': 3.6.1
       '@emotion/hash': 0.9.2
@@ -388,8 +480,8 @@ packages:
       shallow-equal: 1.2.1
       stylis: 4.3.4
       throttle-debounce: 5.0.2
-      vue: 3.2.37
-      vue-types: 3.0.2_vue@3.2.37
+      vue: 3.2.47
+      vue-types: 3.0.2_vue@3.2.47
       warning: 4.0.3
     dev: false
 
@@ -482,8 +574,8 @@ packages:
     requiresBuild: true
     dev: false
 
-  /csstype/2.6.20:
-    resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==}
+  /csstype/2.6.21:
+    resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
 
   /csstype/3.1.3:
     resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
@@ -533,6 +625,11 @@ packages:
     resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==}
     dev: false
 
+  /entities/4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+    dev: true
+
   /errno/0.1.8:
     resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
     hasBin: true
@@ -736,6 +833,10 @@ packages:
     resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
     dev: false
 
+  /fflate/0.8.2:
+    resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
+    dev: false
+
   /fill-range/7.0.1:
     resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
     engines: {node: '>=8'}
@@ -770,8 +871,8 @@ packages:
     requiresBuild: true
     optional: true
 
-  /function-bind/1.1.1:
-    resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+  /function-bind/1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
 
   /glob-parent/5.1.2:
     resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
@@ -788,7 +889,7 @@ packages:
     resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
     engines: {node: '>= 0.4.0'}
     dependencies:
-      function-bind: 1.1.1
+      function-bind: 1.1.2
 
   /iconv-lite/0.6.3:
     resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
@@ -849,6 +950,10 @@ packages:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
     dev: false
 
+  /konva/9.3.20:
+    resolution: {integrity: sha512-7XPD/YtgfzC8b1c7z0hhY5TF1IO/pBYNa29zMTA2PeBaqI0n5YplUeo4JRuRcljeAF8lWtW65jePZZF7064c8w==}
+    dev: false
+
   /less/4.1.3:
     resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==}
     engines: {node: '>=6'}
@@ -888,6 +993,12 @@ packages:
     dependencies:
       sourcemap-codec: 1.4.8
 
+  /magic-string/0.30.17:
+    resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.0
+    dev: true
+
   /make-dir/2.1.0:
     resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
     engines: {node: '>=6'}
@@ -897,6 +1008,10 @@ packages:
       semver: 5.7.1
     optional: true
 
+  /meshoptimizer/0.18.1:
+    resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==}
+    dev: false
+
   /mime-db/1.52.0:
     resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
     engines: {node: '>= 0.6'}
@@ -928,8 +1043,8 @@ packages:
     resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
     optional: true
 
-  /nanoid/3.3.4:
-    resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
+  /nanoid/3.3.8:
+    resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     hasBin: true
 
@@ -981,6 +1096,10 @@ packages:
 
   /picocolors/1.0.0:
     resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+    dev: false
+
+  /picocolors/1.1.1:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
 
   /picomatch/2.3.1:
     resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@@ -995,9 +1114,17 @@ packages:
     resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==}
     engines: {node: ^10 || ^12 || >=14}
     dependencies:
-      nanoid: 3.3.4
-      picocolors: 1.0.0
-      source-map-js: 1.0.2
+      nanoid: 3.3.8
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  /postcss/8.4.49:
+    resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.8
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
 
   /prr/1.0.1:
     resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
@@ -1085,12 +1212,17 @@ packages:
     resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
     engines: {node: '>=0.10.0'}
 
+  /source-map-js/1.2.1:
+    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+    engines: {node: '>=0.10.0'}
+
   /source-map/0.6.1:
     resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
     engines: {node: '>=0.10.0'}
 
   /sourcemap-codec/1.4.8:
     resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+    deprecated: Please use @jridgewell/sourcemap-codec instead
 
   /stylis/4.3.4:
     resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==}
@@ -1105,15 +1237,15 @@ packages:
     engines: {node: '>= 4.7.0'}
     dev: false
 
+  /three/0.169.0:
+    resolution: {integrity: sha512-Ed906MA3dR4TS5riErd4QBsRGPcx+HBDX2O5yYE5GqJeFQTPU+M56Va/f/Oph9X7uZo3W3o4l2ZhBZ6f6qUv0w==}
+    dev: false
+
   /throttle-debounce/5.0.2:
     resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
     engines: {node: '>=12.22'}
     dev: false
 
-  /to-fast-properties/2.0.0:
-    resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
-    engines: {node: '>=4'}
-
   /to-regex-range/5.0.1:
     resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
     engines: {node: '>=8.0'}
@@ -1137,6 +1269,11 @@ packages:
     resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==}
     dev: false
 
+  /uuid/11.1.0:
+    resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
+    hasBin: true
+    dev: false
+
   /vite-plugin-mkcert/1.10.1_vite@3.0.4:
     resolution: {integrity: sha512-fNNC0z+AcBZExKedjWC7bWlDMf4+WZJqO/4aYf7C/vYY1dqYVOM+zowwTYV0xSx5ZQgplfangPkZk+RwdUlpBg==}
     engines: {node: '>=v16.0.0'}
@@ -1185,13 +1322,24 @@ packages:
     resolution: {integrity: sha512-ZD1kl8OMMrDXJOS1ZRdnohh2BFfYjTeq+r7+yAahydQvrVOKbzXixx6f8LCoMjB+AgAf5BXnlWsZxmu964wJYA==}
     dev: false
 
-  /vue-router/4.1.3_vue@3.2.37:
-    resolution: {integrity: sha512-XvK81bcYglKiayT7/vYAg/f36ExPC4t90R/HIpzrZ5x+17BOWptXLCrEPufGgZeuq68ww4ekSIMBZY1qdUdfjA==}
+  /vue-konva/3.2.0_konva@9.3.20+vue@3.2.47:
+    resolution: {integrity: sha512-n1KcOJDvTsgBRy/9HNAEm+5mNgvIxatImIjeuietH5Qt3yHbIK8mp1sP6TQL+a3Pne45UiMO9W+Gwrq1cjptkw==}
+    engines: {node: '>= 4.0.0', npm: '>= 3.0.0'}
+    peerDependencies:
+      konva: '>7'
+      vue: ^3
+    dependencies:
+      konva: 9.3.20
+      vue: 3.2.47
+    dev: false
+
+  /vue-router/4.5.0_vue@3.2.47:
+    resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==}
     peerDependencies:
       vue: ^3.2.0
     dependencies:
-      '@vue/devtools-api': 6.2.1
-      vue: 3.2.37
+      '@vue/devtools-api': 6.6.4
+      vue: 3.2.47
     dev: false
 
   /vue-tsc/0.38.9_typescript@4.7.4:
@@ -1204,32 +1352,32 @@ packages:
       typescript: 4.7.4
     dev: true
 
-  /vue-types/3.0.2_vue@3.2.37:
+  /vue-types/3.0.2_vue@3.2.47:
     resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==}
     engines: {node: '>=10.15.0'}
     peerDependencies:
       vue: ^3.0.0
     dependencies:
       is-plain-object: 3.0.1
-      vue: 3.2.37
+      vue: 3.2.47
     dev: false
 
-  /vue/3.2.37:
-    resolution: {integrity: sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==}
+  /vue/3.2.47:
+    resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==}
     dependencies:
-      '@vue/compiler-dom': 3.2.37
-      '@vue/compiler-sfc': 3.2.37
-      '@vue/runtime-dom': 3.2.37
-      '@vue/server-renderer': 3.2.37_vue@3.2.37
-      '@vue/shared': 3.2.37
+      '@vue/compiler-dom': 3.2.47
+      '@vue/compiler-sfc': 3.2.47
+      '@vue/runtime-dom': 3.2.47
+      '@vue/server-renderer': 3.2.47_vue@3.2.47
+      '@vue/shared': 3.2.47
 
-  /vuedraggable/4.1.0_vue@3.2.37:
+  /vuedraggable/4.1.0_vue@3.2.47:
     resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}
     peerDependencies:
       vue: ^3.0.1
     dependencies:
       sortablejs: 1.14.0
-      vue: 3.2.37
+      vue: 3.2.47
     dev: false
 
   /warning/4.0.3:

二进制
public/animation/Man.glb


二进制
public/animation/Soldier.glb


二进制
public/animation/Xbot.glb


二进制
public/animation/dog.glb


二进制
public/animation/kid.glb


二进制
public/animation/man--running.glb


二进制
public/animation/man--walk.glb


二进制
public/favicon.ico


二进制
public/images/point.png


二进制
public/images/satellite.jpg


二进制
public/images/standard.jpg


二进制
public/images/video.png


二进制
public/images/应急预案.jpg


二进制
public/images/新对话-豆包@3x.png


二进制
public/images/菜市场应急预案.pdf


二进制
public/images/路径@1x (2).png


文件差异内容过多而无法显示
+ 10698 - 10388
public/lib/Cesium/Cesium.js


文件差异内容过多而无法显示
+ 26911 - 0
public/lib/other/hls.js


文件差异内容过多而无法显示
+ 25149 - 17310
public/lib/potree/potree.js


文件差异内容过多而无法显示
+ 1 - 1
public/lib/potree/potree.js.map


二进制
public/lib/potree/resources/models/glb/87b3a367bc3e4273832cb4fa398782e5.glb


二进制
public/lib/potree/resources/models/glb/87ecd10fb0374ea6b3e0bf24c6459e3c.glb


二进制
public/lib/potree/resources/models/glb/ModernJPHouseSofa44105209.glb


二进制
public/lib/potree/resources/models/glb/coffeemat.glb


二进制
public/lib/potree/resources/models/glb/monitor.glb


+ 0 - 13
public/lib/potree/resources/models/stanford_bunny_reduced.mtl

@@ -1,13 +0,0 @@
-# Blender MTL File: 'None'
-# Material Count: 1
-
-newmtl Material.001
-Ns 96.078431
-Ka 1.000000 1.000000 1.000000
-Kd 0.640000 0.352654 0.488547
-Ks 0.500000 0.500000 0.500000
-Ke 0.000000 0.000000 0.000000
-Ni 1.000000
-d 1.000000
-illum 2
-map_Kd C:\\dev\\workspaces\\potree\\develop\\resources\\textures\\brick_pavement.jpg

文件差异内容过多而无法显示
+ 0 - 22384
public/lib/potree/resources/models/stanford_bunny_reduced.obj


二进制
public/lib/potree/resources/models/stanford_bunny_reduced.ply


+ 0 - 378
public/lib/potree/resources/models/t-YLZ5XAALl7/pipe.mtl

@@ -1,378 +0,0 @@
-newmtl initialShadingGroup
-illum 4
-Kd 0.50 0.50 0.50
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-Ni 1.00
-newmtl lambert2SG
-illum 4
-Kd 0.55 0.25 0.19
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-Ni 1.00
-newmtl lambert3SG
-illum 4
-Kd 0.09 0.25 0.36
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-Ni 1.00
-newmtl mesh_chunk001_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture1.jpg
-map_Ka texture1.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk002_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture2.jpg
-map_Ka texture2.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk003_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture3.jpg
-map_Ka texture3.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk004_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture4.jpg
-map_Ka texture4.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk005_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture5.jpg
-map_Ka texture5.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk006_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture6.jpg
-map_Ka texture6.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk007_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture7.jpg
-map_Ka texture7.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk008_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture8.jpg
-map_Ka texture8.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk009_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture9.jpg
-map_Ka texture9.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk010_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture10.jpg
-map_Ka texture10.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk011_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture11.jpg
-map_Ka texture11.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk012_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture12.jpg
-map_Ka texture12.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk013_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture13.jpg
-map_Ka texture13.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk014_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture14.jpg
-map_Ka texture14.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk015_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture15.jpg
-map_Ka texture15.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk016_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture16.jpg
-map_Ka texture16.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk017_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture17.jpg
-map_Ka texture17.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk018_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture18.jpg
-map_Ka texture18.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk019_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture19.jpg
-map_Ka texture19.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk020_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture20.jpg
-map_Ka texture20.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk021_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture21.jpg
-map_Ka texture21.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk022_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture22.jpg
-map_Ka texture22.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk023_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture23.jpg
-map_Ka texture23.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk024_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture24.jpg
-map_Ka texture24.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk025_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture25.jpg
-map_Ka texture25.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk026_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture26.jpg
-map_Ka texture26.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk027_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture27.jpg
-map_Ka texture27.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk028_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture28.jpg
-map_Ka texture28.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk029_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture29.jpg
-map_Ka texture29.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk030_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture30.jpg
-map_Ka texture30.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk031_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture31.jpg
-map_Ka texture31.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk032_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture32.jpg
-map_Ka texture32.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk033_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture33.jpg
-map_Ka texture33.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk034_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture34.jpg
-map_Ka texture34.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk035_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture35.jpg
-map_Ka texture35.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk036_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture36.jpg
-map_Ka texture36.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00

+ 0 - 508
public/lib/potree/resources/models/t-e2Kb2iU/pipe.mtl

@@ -1,508 +0,0 @@
-newmtl initialShadingGroup
-illum 4
-Kd 0.50 0.50 0.50
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-Ni 1.00
-newmtl lambert2SG
-illum 4
-Kd 0.55 0.25 0.19
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-Ni 1.00
-newmtl lambert3SG
-illum 4
-Kd 0.09 0.25 0.36
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-Ni 1.00
-newmtl mesh_chunk001_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture1.jpg
-map_Ka texture1.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk002_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture2.jpg
-map_Ka texture2.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk003_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture3.jpg
-map_Ka texture3.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk004_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture4.jpg
-map_Ka texture4.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk005_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture5.jpg
-map_Ka texture5.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk006_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture6.jpg
-map_Ka texture6.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk007_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture7.jpg
-map_Ka texture7.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk008_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture8.jpg
-map_Ka texture8.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk009_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture9.jpg
-map_Ka texture9.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk010_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture10.jpg
-map_Ka texture10.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk011_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture11.jpg
-map_Ka texture11.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk012_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture12.jpg
-map_Ka texture12.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk013_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture13.jpg
-map_Ka texture13.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk014_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture14.jpg
-map_Ka texture14.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk015_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture15.jpg
-map_Ka texture15.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk016_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture16.jpg
-map_Ka texture16.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk017_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture17.jpg
-map_Ka texture17.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk018_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture18.jpg
-map_Ka texture18.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk019_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture19.jpg
-map_Ka texture19.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk020_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture20.jpg
-map_Ka texture20.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk021_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture21.jpg
-map_Ka texture21.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk022_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture22.jpg
-map_Ka texture22.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk023_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture23.jpg
-map_Ka texture23.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk024_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture24.jpg
-map_Ka texture24.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk025_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture25.jpg
-map_Ka texture25.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk026_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture26.jpg
-map_Ka texture26.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk027_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture27.jpg
-map_Ka texture27.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk028_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture28.jpg
-map_Ka texture28.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk029_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture29.jpg
-map_Ka texture29.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk030_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture30.jpg
-map_Ka texture30.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk031_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture31.jpg
-map_Ka texture31.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk032_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture32.jpg
-map_Ka texture32.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk033_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture33.jpg
-map_Ka texture33.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk034_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture34.jpg
-map_Ka texture34.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk035_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture35.jpg
-map_Ka texture35.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk036_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture36.jpg
-map_Ka texture36.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk037_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture37.jpg
-map_Ka texture37.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk038_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture38.jpg
-map_Ka texture38.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk039_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture39.jpg
-map_Ka texture39.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk040_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture40.jpg
-map_Ka texture40.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk041_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture41.jpg
-map_Ka texture41.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk042_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture42.jpg
-map_Ka texture42.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk043_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture43.jpg
-map_Ka texture43.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk044_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture44.jpg
-map_Ka texture44.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk045_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture45.jpg
-map_Ka texture45.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk046_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture46.jpg
-map_Ka texture46.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk047_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture47.jpg
-map_Ka texture47.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk048_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture48.jpg
-map_Ka texture48.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00
-newmtl mesh_chunk049_group000_sub000
-illum 4
-Kd 0.00 0.00 0.00
-Ka 0.00 0.00 0.00
-Tf 1.00 1.00 1.00
-map_Kd texture49.jpg
-map_Ka texture49.jpg
-Ni 1.50
-Ks 0.00 0.00 0.00
-Ns 10.00

文件差异内容过多而无法显示
+ 0 - 13370
public/lib/potree/resources/models/t-e2Kb2iU/pipe.obj


二进制
public/lib/potree/resources/textures/arrow.png


二进制
public/lib/potree/resources/textures/arrows.png


+ 3 - 0
public/lib/shapefile/shapefile.js

@@ -29,6 +29,9 @@ ArraySource.prototype.cancel = array_cancel;
 
 var fetchPath = function(url) {
   return fetch(url).then(function(response) {
+    if(!response.ok){//xzw add 
+        return false
+    }
     return response.body && response.body.getReader
         ? response.body.getReader()
         : response.arrayBuffer().then(array);

文件差异内容过多而无法显示
+ 16 - 35
public/lib/three.js/loaders/draco/draco_decoder.js


文件差异内容过多而无法显示
+ 3 - 3
public/lib/three.js/loaders/draco/draco_wasm_wrapper.js


+ 14 - 0
public/xfile-viewer/.prettierrc

@@ -0,0 +1,14 @@
+{
+    "printWidth": 200,
+    "tabWidth": 4,
+    "useTabs": false,
+    "semi": false,
+    "singleQuote": true,
+    "arrowParens": "avoid",
+    "bracketSpacing": true,
+    "disableLanguages": [],
+    "eslintIntegration": false,
+    "stylelintIntegration": false,
+    "tslintIntegration": false,
+    "proseWrap": "preserve"
+}

+ 247 - 0
public/xfile-viewer/index.html

@@ -0,0 +1,247 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="UTF-8" />
+        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+        <title>文档浏览</title>
+        <script src="./publish/lib/hammer.js"></script>
+        <script src="./publish/lib/cornerstone.js"></script>
+        <script src="./publish/lib/cornerstoneMath.min.js"></script>
+        <script src="./publish/lib/cornerstoneWADOImageLoader.bundle.min.js"></script>
+        <script src="./publish/lib/cornerstoneWebImageLoader.min.js"></script>
+        <script src="./publish/lib/cornerstoneTools.js"></script>
+        <script src="./publish/lib/dicomParser.min.js"></script>
+        <style>
+            .disabled {
+                opacity: 0.5;
+                pointer-events: none;
+            }
+            select {
+                outline: none;
+            }
+            html,
+            body {
+                width: 100%;
+                height: 100%;
+            }
+            body {
+                margin: 0;
+                overflow: hidden;
+            }
+            #dicomImage {
+                width: 100%;
+                height: 100%;
+            }
+            #toolbar {
+                position: absolute;
+                left: 50%;
+                top: 24px;
+                padding: 10px;
+                transform: translateX(-50%);
+                background-color: #fff;
+                border: solid 1px #e5e5e5;
+                border-radius: 6px;
+                z-index: 999;
+                display: flex;
+                align-items: center;
+                justify-content: space-around;
+                box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.3);
+                font-size: 12px;
+            }
+            #toolbar > div {
+                cursor: pointer;
+                padding: 0 5px;
+            }
+            #toolbar > div.active {
+                color: #1779ed;
+            }
+            #statbar {
+                cursor: pointer;
+                position: absolute;
+                left: 50%;
+                bottom: 24px;
+                padding: 10px;
+                transform: translateX(-50%);
+                background-color: #fff;
+                border: solid 1px #e5e5e5;
+                border-radius: 6px;
+                z-index: 999;
+                display: none;
+                align-items: center;
+                justify-content: space-around;
+                box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.3);
+                font-size: 12px;
+            }
+        </style>
+    </head>
+    <body>
+        <div id="dicomImage"></div>
+        <div id="toolbar">
+            <div id="Length">
+                标注:
+                <select onchange="tools.annotation(this.value)">
+                    <option value="">请选择</option>
+                    <option value="ArrowAnnotate">箭头</option>
+                    <option value="Length">长度</option>
+                    <option value="Angle">角度</option>
+                    <option value="RectangleRoi">矩形</option>
+                    <option value="EllipticalRoi">椭圆</option>
+                    <option value="FreehandRoi">面积</option>
+                    <option value="Probe">针探</option>
+                </select>
+            </div>
+            <div id="Wwwc" onclick="tools.wwwc()">调整窗宽窗高</div>
+            <div onclick="tools.download()">下载</div>
+        </div>
+        <div id="statbar" onclick="tools.annotation('')">退出</div>
+        <script>
+            const urlParams = key => {
+                let querys = window.location.search.substr(1).split('&')
+                for (let i = 0; i < querys.length; i++) {
+                    let keypair = querys[i].split('=')
+                    if (keypair.length === 2 && keypair[0] === key) {
+                        return keypair[1]
+                    }
+                }
+                return ''
+            }
+
+            const tools = {
+                name: '',
+                set active(name) {
+                    document.querySelectorAll('#toolbar >div').forEach(el => el.classList.remove('active'))
+                    if (name) {
+                        this.name = name
+                        document.getElementById(name).classList.add('active')
+                    } else {
+                        this.name = ''
+                    }
+                },
+                download() {
+                    var link = document.createElement('a')
+                    link.download = 'preview.png'
+                    link.href = document.querySelector('canvas').toDataURL('image/png').replace('image/png', 'image/octet-stream')
+                    link.click()
+                },
+                wwwc() {
+                    const name = 'Wwwc'
+                    if (this.name == name) {
+                        cornerstoneTools.setToolActive('Pan', {
+                            mouseButtonMask: 1,
+                        })
+                        this.active = ''
+                    } else {
+                        cornerstoneTools.setToolActive('Wwwc', {
+                            mouseButtonMask: 1,
+                        })
+                        this.active = name
+                    }
+                },
+                annotation(name) {
+                    const wwwc = document.getElementById('Wwwc')
+                    const leave = document.getElementById('statbar')
+                    const select = document.querySelector('select')
+                    if (name) {
+                        if (this.name == 'Wwwc') {
+                            this.wwwc()
+                        }
+                        wwwc.classList.add('disabled')
+                        leave.style.display = 'flex'
+                        select.disabled = true
+                        cornerstoneTools.setToolActive(name, { mouseButtonMask: 1 })
+                    } else {
+                        wwwc.classList.remove('disabled')
+                        leave.style.display = 'none'
+                        select.disabled = false
+                        document.querySelector('select').value = ''
+                        cornerstoneTools.setToolPassive(this.name)
+                        cornerstoneTools.setToolActive('Pan', {
+                            mouseButtonMask: 1,
+                        })
+                    }
+                    this.name = name
+                },
+            }
+            // 注册并挂载cornerstone及其cornerstoneTools,固定操作
+            cornerstoneTools.external.cornerstone = cornerstone
+            cornerstoneTools.external.cornerstoneMath = cornerstoneMath
+            cornerstoneTools.external.Hammer = Hammer
+            cornerstoneWADOImageLoader.external.dicomParser = dicomParser
+            cornerstoneWADOImageLoader.external.cornerstone = cornerstone
+            var file = urlParams('file')
+            if (!file) {
+                alert('文档不能为空')
+            } else {
+                var imageId = 'wadouri: ' + decodeURIComponent(file) //http://192.168.0.11:80/20231025172413.dcm'
+                // 初始化cornerstoneTools工具
+                cornerstoneTools.init([
+                    {
+                        moduleName: 'globalConfiguration',
+                        configuration: {
+                            showSVGCursors: true,
+                        },
+                    },
+                    {
+                        moduleName: 'segmentation',
+                        configuration: {
+                            outlineWidth: 2,
+                        },
+                    },
+                ])
+
+                // 获取要用于加载图片的div区域
+                var element = document.getElementById('dicomImage')
+                //激活获取到的用于图片加载的区域
+                cornerstone.enable(element)
+                //   // 从cornerstoneTools库中获取窗宽,窗高工具
+                //   const WwwcTool = cornerstoneTools.WwwcTool;
+                //   //添加获取到的窗宽,窗高工具
+                //   cornerstoneTools.addTool(WwwcTool);
+                //   // 绑定工具操作功能到鼠标左键
+                //   cornerstoneTools.setToolActive("Wwwc", {
+                //     mouseButtonMask: 1,
+                //   });
+                //使用loadAndCacheImage()方法加载并缓存图片,然后使用displayImage()方法显示图片。
+                cornerstone.loadAndCacheImage(imageId).then(function (image) {
+                    cornerstone.displayImage(element, image)
+                })
+
+                /* 平移、缩放  */
+                const PanTool = cornerstoneTools.PanTool
+                cornerstoneTools.addTool(PanTool)
+                cornerstoneTools.setToolActive('Pan', { mouseButtonMask: 1 })
+
+                const ZoomMouseWheelTool = cornerstoneTools.ZoomMouseWheelTool
+                cornerstoneTools.addTool(ZoomMouseWheelTool)
+                cornerstoneTools.setToolActive('ZoomMouseWheel', { mouseButtonMask: 1 })
+
+                /*  标注工具 */
+                // 长度标注
+                const LengthTool = cornerstoneTools.LengthTool
+                cornerstoneTools.addTool(LengthTool)
+
+                const AngleTool = cornerstoneTools.AngleTool
+                cornerstoneTools.addTool(AngleTool)
+
+                const ArrowAnnotateTool = cornerstoneTools.ArrowAnnotateTool
+                cornerstoneTools.addTool(ArrowAnnotateTool)
+
+                const RectangleRoiTool = cornerstoneTools.RectangleRoiTool
+                cornerstoneTools.addTool(RectangleRoiTool)
+
+                const EllipticalRoiTool = cornerstoneTools.EllipticalRoiTool
+                cornerstoneTools.addTool(EllipticalRoiTool)
+
+                const FreehandRoiTool = cornerstoneTools.FreehandRoiTool
+                cornerstoneTools.addTool(FreehandRoiTool)
+
+                const ProbeTool = cornerstoneTools.ProbeTool
+                cornerstoneTools.addTool(ProbeTool)
+
+                const WwwcTool = cornerstoneTools.WwwcTool
+                //添加获取到的窗宽,窗高工具
+                cornerstoneTools.addTool(WwwcTool)
+            }
+        </script>
+    </body>
+</html>

二进制
public/xfile-viewer/publish/20231025172413.dcm


二进制
public/lib/potree/resources/models/glb/ModernJPHouseSofa44216499.glb


文件差异内容过多而无法显示
+ 9084 - 0
public/xfile-viewer/publish/lib/cornerstone.js


文件差异内容过多而无法显示
+ 3 - 0
public/xfile-viewer/publish/lib/cornerstoneMath.min.js


文件差异内容过多而无法显示
+ 38415 - 0
public/xfile-viewer/publish/lib/cornerstoneTools.js


文件差异内容过多而无法显示
+ 2 - 0
public/xfile-viewer/publish/lib/cornerstoneWADOImageLoader.bundle.min.js


文件差异内容过多而无法显示
+ 3 - 0
public/xfile-viewer/publish/lib/cornerstoneWebImageLoader.min.js


文件差异内容过多而无法显示
+ 3 - 0
public/xfile-viewer/publish/lib/dicomParser.min.js


文件差异内容过多而无法显示
+ 2643 - 0
public/xfile-viewer/publish/lib/hammer.js


+ 150 - 0
src/api/animation.ts

@@ -0,0 +1,150 @@
+import axios from "./instance";
+import { params } from "@/env";
+import {
+  AM_MODEL_LIST,
+  INSERT_AM_MODEL,
+  UPDATE_AM_MODEL,
+  DELETE_AM_MODEL,
+} from "./constant";
+
+type ServiceAnimationModel = {
+  key?: string
+  id: string;
+  title: string;
+  url: string;
+  showTitle: boolean;
+  fontSize: number;
+  globalVisibility: boolean;
+  visibilityRange: number;
+  frames: string
+  actions: string
+  subtitles: string
+  paths: string
+  mat?: string
+}
+
+export type AnimationModelAction = {
+  amplitude: number;
+  speed: number;
+  time: number;
+  duration: number;
+  id: string;
+  key: string;
+  name: string;
+};
+export type AnimationModelSubtitle = {
+  content: string;
+  duration: number;
+  time: number;
+  id: string;
+  background: string;
+  name: string;
+};
+export type AnimationModelFrame = {
+  time: number;
+  id: string;
+  name: string;
+  mat?: {
+    position?: SceneLocalPos;
+    scale?: number;
+    rotation?: SceneLocalPos;
+    originPosition?: SceneLocalPos;
+  };
+  duration?: number;
+};
+export type AnimationModelPath = {
+  reverse: boolean;
+  pathId?: string;
+  time: number;
+  duration: number;
+  id: string;
+  name: string;
+};
+
+export interface AnimationModel {
+  key?: string
+  id: string;
+  title: string;
+  url: string;
+  showTitle: boolean;
+  fontSize: number;
+  globalVisibility: boolean;
+  visibilityRange: number;
+  frames: AnimationModelFrame[];
+  actions: AnimationModelAction[];
+  subtitles: AnimationModelSubtitle[];
+  paths: AnimationModelPath[];
+  mat?: {
+    position?: SceneLocalPos;
+    quaAtPath?: any
+    scale?: number;
+    rotation?: SceneLocalPos & {w: number};
+    quaternion?: SceneLocalPos & {w: number};
+    originPosition?: SceneLocalPos;
+  };
+}
+
+export type AnimationModels = AnimationModel[];
+
+const serviceToLocal = (serviceAM: ServiceAnimationModel): AnimationModel => ({
+  ...serviceAM,
+  frames: JSON.parse(serviceAM.frames),
+  actions: JSON.parse(serviceAM.actions),
+  subtitles: JSON.parse(serviceAM.subtitles),
+  paths: JSON.parse(serviceAM.paths),
+  mat: serviceAM.mat && JSON.parse(serviceAM.mat) 
+});
+
+const localToService = (am: AnimationModel): ServiceAnimationModel => ({
+  ...am,
+  frames: JSON.stringify(am.frames),
+  actions: JSON.stringify(am.actions),
+  subtitles: JSON.stringify(am.subtitles),
+  paths: JSON.stringify(am.paths),
+  mat: am.mat ? JSON.stringify(am.mat) : undefined
+});
+
+export const fetchAnimationModels = async () => {
+  const ams = await axios.get<ServiceAnimationModel[]>(AM_MODEL_LIST, {
+    params: { caseId: params.caseId },
+  });
+  return ams.map(serviceToLocal);
+};
+
+export const fetchAnimationActions = async () => {
+  return [
+    { id: "1", action: "Walk", title: "走", url: "" },
+    { id: "2", action: "Run", title: "跑", url: "" },
+    { id: "3", action: "Climb", title: "爬", url: "" },
+    { id: "2", action: "JumpUp", title: "向上跳", url: "" },
+    { id: "3", action: "JumpDown", title: "向下跳", url: "" },
+    { id: "2", action: "TurnLeft", title: "左转", url: "" },
+    { id: "3", action: "TurnRight", title: "右转", url: "" },
+    { id: "3", action: "FallForward", title: "向前倒地", url: "" },
+    { id: "3", action: "FallBackward", title: "向后倒地", url: "" },
+  ];
+};
+
+export const postInsertAnimationModel = async (am: AnimationModel) => {
+  const addData = {
+    ...localToService(am),
+    caseId: params.caseId,
+    id: undefined,
+  };
+  console.log('add', addData)
+  const serviceData = await axios.post<ServiceAnimationModel>(
+    INSERT_AM_MODEL,
+    addData
+  );
+  return serviceToLocal(serviceData);
+};
+
+export const postUpdateAnimationModel = async (guide: AnimationModel) => {
+  console.log('set', guide)
+  const data = await axios.post<ServiceAnimationModel>(UPDATE_AM_MODEL, { ...localToService(guide) });
+  return {...guide, id: data.id}
+};
+
+export const postDeleteAnimationModel = (id: AnimationModel["id"]) => {
+  return axios.post<undefined>(DELETE_AM_MODEL, { id: Number(id) });
+};

+ 36 - 8
src/api/constant.ts

@@ -2,10 +2,12 @@ import {namespace} from '@/env'
 
 export enum ResCode {
   TOKEN_INVALID = 4008,
+  UN_AUTH = 4010,
   SUCCESS = 0
 }
 
 export const ResCodeDesc: { [key in ResCode]: string } = {
+  [ResCode.UN_AUTH] : '您没有访问权限',
   [ResCode.TOKEN_INVALID]: 'token已失效',
   [ResCode.SUCCESS]: '请求成功'
 }
@@ -14,7 +16,12 @@ export const UPLOAD_HEADS = {
   'Content-Type': 'multipart/form-data'
 }
 
+
+export const USER_INFO = `${namespace}/web/user/getUserInfo`;
+
 export const CASE_INFO = `${namespace}/case/getInfo`
+export const CASE_FIRE_INFO = `${namespace}/caseInquestInfo/info`
+
 // 校验密码
 export const AUTH_PWD = `${namespace}/web/fireProject/getDetailWithoutAuth`
 
@@ -27,6 +34,7 @@ export const FUSE_DELETE_MODEL = `${namespace}/caseFusion/delete`
 export const SCENE_LIST_ALL = `${namespace}/api/scene/list`
 export const MODEL_LIST = `${namespace}/case/sceneList`
 export const MODEL_SIGN = `${namespace}/model/getInfo`
+export const SYNC_INFO = `${namespace}/caseLive/getTakeLookRoom`;
 
 // 标签列表
 export const TAGGING_LIST = `${namespace}/caseTag/allList`
@@ -34,11 +42,12 @@ export const INSERT_TAGGING = `${namespace}/caseTag/add`
 export const UPDATE_TAGGING = `${namespace}/caseTag/update`
 export const DELETE_TAGGING = `${namespace}/caseTag/delete`
 
+
 // 路线列表
-export const PATH_LIST = `${namespace}/path/allList`
-export const INSERT_PATH = `${namespace}/path/add`
-export const UPDATE_PATH = `${namespace}/path/update`
-export const DELETE_PATH = `${namespace}/path/delete`
+export const PATH_LIST = `${namespace}/casePath/info`
+export const INSERT_PATH = `${namespace}/casePath/saveOrUpdate`
+export const UPDATE_PATH = `${namespace}/casePath/saveOrUpdate`
+export const DELETE_PATH = `${namespace}/casePath/del`
 
 // 标签放置列表
 export const TAGGING_POINT_LIST = `${namespace}/caseTagPoint/allList`
@@ -69,6 +78,13 @@ export const INSERT_GUIDE_PATH = `${namespace}/fusionGuidePath/add`
 export const UPDATE_GUIDE_PATH = `${namespace}/fusionGuidePath/update`
 export const DELETE_GUIDE_PATH = `${namespace}/fusionGuidePath/delete`
 
+
+// 监控
+export const GUIDE_MONITOR_LIST = `${namespace}/monitor/allList`
+export const UPDATE_MONITOR = `${namespace}/monitor/update`
+export const INSERT_MONITOR = `${namespace}/monitor/update`
+export const DELETE_MONITOR = `${namespace}/monitor/delete`
+
 // 屏幕录制
 export const RECORD_LIST = `${namespace}/caseVideoFolder/allList`
 export const RECORD_STATUS = `${namespace}/caseVideo/uploadAddVideoProgress`
@@ -94,13 +110,25 @@ export const UPDATE_SETTING = `${namespace}/caseSettings/saveOrUpdate`
 export const FOLDER_TYPE_LIST = `${namespace}/caseFilesType/allList`
 
 // 卷宗
+// export const FLODER_LIST = `${namespace}/caseFiles/allList`
 export const FLODER_LIST = `${namespace}/caseFiles/allList`
 
+
 // 文件上传
 export const UPLOAD_FILE = `${namespace}/upload/file`
 
 // 素材库分页
-export const MATERIAL_PAG = `${namespace}/material/allList`
-export const ADD_MATERIAL = `${namespace}/material/add`
-export const DEL_MATERIAL = `${namespace}/material/del`
-export const MATERIAL_GROUP_LIST = `${namespace}/material/allList`
+export const MATERIAL_PAG = `/service/manage/dictFile/pageList/media-library`
+export const ADD_MATERIAL = `/service/manage/common/upload/fileNew`
+export const DEL_MATERIAL = `/service/manage/dictFile/del/media-library`
+export const MATERIAL_GROUP_LIST = `/service/manage/dict/getByKey/media-library`
+
+
+// 动画模块
+export const AM_MODEL_LIST = `${namespace}/caseAnimation/list`
+export const INSERT_AM_MODEL = `${namespace}/caseAnimation/addOrUpdate`
+export const UPDATE_AM_MODEL = `${namespace}/caseAnimation/addOrUpdate`
+export const DELETE_AM_MODEL = `${namespace}/caseAnimation/delete`
+
+
+export const MAP_TILE_LIST = `${namespace}/notAuth/getMapConfig`

+ 1 - 3
src/api/floder.ts

@@ -35,7 +35,7 @@ export const fetchFloders = async () => {
     res.data.data.forEach((item:any, ndx: any) => {
       floders.push({
         filesId: 100 + ndx,
-        filesTypeId: 100,
+        filesTypeId: -1,
         filesTitle: '照片制卷图',
         caseId: params.caseId.toString(),
         filesUrl: item.imgUrl
@@ -54,7 +54,5 @@ export const fetchFloders = async () => {
       })
     }
   }))
-
-
   return floders
 }

+ 58 - 0
src/api/floder_BACKUP_1461.ts

@@ -0,0 +1,58 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: -1,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+  return floders
+}

+ 58 - 0
src/api/floder_BACKUP_1524.ts

@@ -0,0 +1,58 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: -1,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+  return floders
+}

+ 58 - 0
src/api/floder_BACKUP_1600.ts

@@ -0,0 +1,58 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: -1,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+  return floders
+}

+ 58 - 0
src/api/floder_BACKUP_1668.ts

@@ -0,0 +1,58 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: -1,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+  return floders
+}

+ 77 - 0
src/api/floder_BASE_1461.ts

@@ -0,0 +1,77 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: 100,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+
+
+  // floders.forEach(item => item.filesTypeId = 102)
+  // floders.push(...floders.map(item => {
+  //   return {...item, filesTypeId: 101 }
+  // }))
+
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1000 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1001 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1002 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1005 }
+  }))
+  return floders
+}

+ 77 - 0
src/api/floder_BASE_1524.ts

@@ -0,0 +1,77 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: 100,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+
+
+  // floders.forEach(item => item.filesTypeId = 102)
+  // floders.push(...floders.map(item => {
+  //   return {...item, filesTypeId: 101 }
+  // }))
+
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1000 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1001 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1002 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1005 }
+  }))
+  return floders
+}

+ 77 - 0
src/api/floder_BASE_1600.ts

@@ -0,0 +1,77 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: 100,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+
+
+  // floders.forEach(item => item.filesTypeId = 102)
+  // floders.push(...floders.map(item => {
+  //   return {...item, filesTypeId: 101 }
+  // }))
+
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1000 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1001 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1002 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1005 }
+  }))
+  return floders
+}

+ 77 - 0
src/api/floder_BASE_1668.ts

@@ -0,0 +1,77 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: 100,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+
+
+  // floders.forEach(item => item.filesTypeId = 102)
+  // floders.push(...floders.map(item => {
+  //   return {...item, filesTypeId: 101 }
+  // }))
+
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1000 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1001 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1002 }
+  }))
+  floders.push(...floders.map(item => {
+    return {...item, filesTypeId: 1005 }
+  }))
+  return floders
+}

+ 60 - 0
src/api/floder_LOCAL_1461.ts

@@ -0,0 +1,60 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: 100,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+
+
+  return floders
+}

+ 60 - 0
src/api/floder_LOCAL_1524.ts

@@ -0,0 +1,60 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: 100,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+
+
+  return floders
+}

+ 60 - 0
src/api/floder_LOCAL_1600.ts

@@ -0,0 +1,60 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: 100,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+
+
+  return floders
+}

+ 60 - 0
src/api/floder_LOCAL_1668.ts

@@ -0,0 +1,60 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: 100,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+
+
+  return floders
+}

+ 58 - 0
src/api/floder_REMOTE_1461.ts

@@ -0,0 +1,58 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: -1,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+  return floders
+}

+ 58 - 0
src/api/floder_REMOTE_1524.ts

@@ -0,0 +1,58 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: -1,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+  return floders
+}

+ 58 - 0
src/api/floder_REMOTE_1600.ts

@@ -0,0 +1,58 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: -1,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+  return floders
+}

+ 58 - 0
src/api/floder_REMOTE_1668.ts

@@ -0,0 +1,58 @@
+import { params } from '@/env'
+import { FLODER_LIST } from './constant'
+import { addUnsetResErrorURLS,axios } from './instance'
+import {namespace} from '@/env'
+
+export interface Floder {
+  filesId:	number,
+  caseId:	string,
+  filesTypeId: number,
+  filesTitle:	string,
+  filesUrl:	string,
+}
+
+export type Floders = Floder[]
+
+
+addUnsetResErrorURLS(`${namespace}/caseInquest/downDocx`, `${namespace}/caseExtractDetail/downDocx`, `${namespace}/caseImg/getFfmpegImage`)
+export const fetchFloders = async () => {
+  const floders = await axios.get<Floders>(FLODER_LIST, { params: { caseId: params.caseId } })
+  const otherFloders = [{
+    filesId: 88,
+    filesTypeId: 100,
+    filesTitle: '勘验笔录',
+    ex: `${namespace}/caseInquest/info`,
+    bex: `${namespace}/caseInquest/downDocx`
+  }, {
+    filesId: 89,
+    filesTypeId: 100,
+    filesTitle: '提取清单',
+    ex: `${namespace}/caseExtractDetail/info`,
+    bex: `${namespace}/caseExtractDetail/downDocx`
+  }, ]
+  const res = await axios.get(`${namespace}/caseImg/getFfmpegImage`, {params: {caseId: params.caseId}})
+  if (res.data.data.length) {
+    res.data.data.forEach((item:any, ndx: any) => {
+      floders.push({
+        filesId: 100 + ndx,
+        filesTypeId: -1,
+        filesTitle: '照片制卷图',
+        caseId: params.caseId.toString(),
+        filesUrl: item.imgUrl
+      })
+    })
+  }
+  await Promise.all(otherFloders.map(async of => {
+    const kybl = await axios.get(of.ex, { params: { caseId: params.caseId } })
+    if (kybl) {
+      const data = await axios.get(of.bex, { params: { caseId: params.caseId }, responseType: 'blob' })
+      const blob = data.data
+      floders.push({
+        ...of,
+        caseId: params.caseId.toString(),
+        filesUrl: URL.createObjectURL(blob)
+      })
+    }
+  }))
+  return floders
+}

+ 19 - 11
src/api/folder-type.ts

@@ -1,18 +1,26 @@
-import { FOLDER_TYPE_LIST } from './constant'
-import axios from './instance'
+import { FOLDER_TYPE_LIST } from "./constant";
+import axios from "./instance";
 
 export interface FloderType {
-  filesTypeId: number,
-  filesTypeName: string,
   parentFilesTypeId?: number,
-  modalShow?: boolean
-  flatShow?: boolean
+  filesTypeId: number;
+  filesTypeName: string;
+  parentId: number;
+  modalShow?: boolean;
+  flatShow?: boolean;
 }
 
-export type FloderTypes = FloderType[]
-
+export type FloderTypes = FloderType[];
 
 export const fetchFloderTypes = async () => {
-  const types =await axios.get<FloderTypes>(FOLDER_TYPE_LIST)
-  return types
-}
+
+  const types = await axios.get<FloderTypes>(FOLDER_TYPE_LIST);
+  types.push({
+    filesTypeId: -1,
+    filesTypeName: "照片制卷",
+    flatShow: false,
+    modalShow: false,
+    parentId: 39,
+  });
+  return types;
+};

+ 12 - 7
src/api/fuse-model.ts

@@ -47,9 +47,13 @@ interface ServiceFuseModel {
   sceneData: Scene;
 }
 
+export const uploadMaterialToModel = async (uploadId: number) => {
+  const model = await axios.post<{modelId: number}>('/fusion/model/addByMediaLibrary', {caseId: params.caseId, uploadId})
+  return model
+}
+
 export const getSceneUrl = (sceneData: Scene) => {
   let url: any = [""];
-  console.log(sceneData, sceneData.type);
   if (
     [SceneType.SWSS, SceneType.SWYDSS].includes(sceneData.type)
   ) {
@@ -60,14 +64,17 @@ export const getSceneUrl = (sceneData: Scene) => {
         url = sceneData.model3dgsUrl;
         break;
       case "shp":
-        url = sceneData.modelShpUrl;
+        url = sceneData.modelGlbUrl;
         break;
       default:
-        url = sceneData.modelGlbUrl;
+        url = sceneData.modelGlbUrl || sceneData.modelObjUrl;
     }
     try {
       url = JSON.parse(url);
     } catch (e) {
+      if (typeof url === 'string') {
+        url = [url]
+      }
       console.error(url, e);
     }
   }
@@ -97,7 +104,7 @@ const serviceToLocal = (
       : "-",
     modelId: serviceModel.sceneData?.modelId,
     fusionId: serviceModel.fusionId,
-    type: serviceModel.sceneData?.type,
+    type: serviceModel.sceneData?.type === SceneType.DSFXJ ? SceneType.SWKK : serviceModel.sceneData?.type,
     size: serviceModel.sceneData?.modelSize,
     raw: serviceModel.sceneData,
     time: serviceModel.sceneData?.createTime,
@@ -128,9 +135,7 @@ export const fetchFuseModels = async () => {
   const serviceModels = await axios.get<ServiceFuseModel[]>(FUSE_MODEL_LIST, {
     params: { caseId: params.caseId },
   });
-  console.error(
-    serviceModels.map((item, index) => serviceToLocal(item, index == 0))
-  );
+  console.log('===>', serviceModels.map((item, index) => serviceToLocal(item, index == 0)))
   return serviceModels.map((item, index) => serviceToLocal(item, index == 0));
 };
 

+ 4 - 0
src/api/guide-path.ts

@@ -19,6 +19,8 @@ interface ServiceGuidePath {
   speed: number
   panoInfo?: string
   cover: string
+
+  playAnimation?: boolean
 }
 
 export interface GuidePath {
@@ -36,6 +38,8 @@ export interface GuidePath {
   sort: number
   speed: number
   cover: string
+
+  playAnimation?: boolean
 }
 
 export type GuidePaths = GuidePath[]

+ 15 - 0
src/api/guide.ts

@@ -11,6 +11,10 @@ interface ServiceGuide {
   fusionGuideId: number
   cover: string
   title: string
+  showTaggings?: boolean
+  showMeasure?: boolean
+  showMonitor?: boolean
+  showPath?: boolean
 }
 
 export interface Guide {
@@ -18,17 +22,28 @@ export interface Guide {
   cover: string
   title: string
   recoveryContent?: string
+  changeAnimationStatus?: boolean
+
+  showTagging: boolean
+  showMeasure: boolean
+  showMonitor: boolean
+  showPath: boolean
 }
 
 export type Guides = Guide[]
 
 const serviceToLocal = (serviceGuide: ServiceGuide): Guide => ({
+  showMeasure: true,
+  showMonitor: true,
+  showPath: true,
   ...serviceGuide,
+  showTagging: serviceGuide.showTaggings === undefined ? true : serviceGuide.showTaggings,
   id: serviceGuide.fusionGuideId.toString(),
 })
 
 const localToService = (guide: Guide): ServiceGuide => ({
   ...guide,
+  showTaggings: guide.showTagging,
   fusionGuideId: Number(guide.id),
 })
 

+ 3 - 1
src/api/index.ts

@@ -35,4 +35,6 @@ export * from './view'
 export * from './folder-type'
 export * from './floder'
 export * from './setting'
-export * from './path'
+export * from './path'
+export * from './animation'
+export * from './monitor'

+ 58 - 40
src/api/instance.ts

@@ -1,14 +1,15 @@
-import { axiosFactory } from './setup'
-import { Message } from 'bill/index'
-import { showLoad, hideLoad } from '@/utils'
-import * as URL from './constant'
-import { ResCode, ResCodeDesc } from './constant'
-import { appBackRoot, appType, baseURL, params } from '@/env'
+import { axiosFactory } from "./setup";
+import { Dialog, Message } from "bill/index";
+import { showLoad, hideLoad } from "@/utils";
+import * as URL from "./constant";
+import { ResCode, ResCodeDesc } from "./constant";
+import { baseURL, params } from "@/env";
+import GAxios from "axios";
 
-const instance = axiosFactory()
+const instance = axiosFactory();
 
 export const {
-  axios,
+  axios, 
   addUnsetTokenURLS,
   delUnsetTokenURLS,
   addReqErrorHandler,
@@ -22,50 +23,67 @@ export const {
   setDefaultURI,
   addHook,
   delHook,
-  setHook
-} = instance
+  setHook,
+} = instance;
 
 const gotoLogin = () => {
-  const loginHref = import.meta.env.DEV ? 'http://localhost:5174' : appBackRoot[params.app]
-  location.href = loginHref + '?redirect=' + escape(location.href) + '#/login'
-}
+  if (import.meta.env.DEV) {
+    GAxios.post("/service/manage/login", {
+      password: "MRinIEn3ExMjM0NTY=Q5Lm39urQWzN7k4oCG",
+      userName: "super-admin",
+      username: "super-admin",
+    }).then((res) => {
+      setToken(res.data.data.token)
+      setTimeout(() => location.reload())
+    });
+  } else {
+    const loginHref = `/admin/#/statistics/scene`
+    location.href = loginHref + '?redirect=' + escape(location.href)
+  }
+};
 
-addReqErrorHandler(err => {
+addReqErrorHandler((err) => {
   // Message.error(err.message)
-  console.error(err)
-  hideLoad()
-  // gotoLogin()
-})
+  console.error(err);
+  hideLoad();
+  gotoLogin();
+});
 
-addResErrorHandler(
-  (response, data) => {
-    if (response && response.status !== 200) {
-      Message.error(response.statusText)
-    } else if (data) {
-      const msg = data.code && ResCodeDesc[data.code] ? ResCodeDesc[data.code] : (data?.message || data?.msg)
-      if (data.code === ResCode.TOKEN_INVALID) {
-        gotoLogin()
-      } else {
-        Message.error(msg)
-      }
+addResErrorHandler((response, data) => {
+  if (response && response.status !== 200) {
+    Message.error(response.statusText);
+  } else if (data) {
+    const msg =
+      data.code && ResCodeDesc[data.code]
+        ? ResCodeDesc[data.code]
+        : data?.message || data?.msg;
+    if (data.code === ResCode.TOKEN_INVALID) {
+      gotoLogin();
+    } else if (data.code === ResCode.UN_AUTH) {
+      Dialog.alert({content: msg, okText: '我知道了'}).then(() => {
+        gotoLogin();
+      })
+      throw msg
+    } else {
+      Message.error(msg || '服务出现异常,请稍后再试');
     }
   }
-)
+});
 
-addHook({ 
+addHook({
   before: (config) => {
     if (config.url !== URL.RECORD_STATUS) {
-      showLoad()
+      showLoad();
     }
-  }, 
+  },
   after: (config) => {
     if (!config || config.url !== URL.RECORD_STATUS) {
-      hideLoad()
+      hideLoad();
     }
-  } 
-})
-
-setDefaultURI(baseURL)
-params.token && setToken(params.token)
+  },
+});
 
-export default axios
+setDefaultURI(baseURL);
+const token = params.token || localStorage.getItem('token')
+token && setToken(token);
+export default axios;

+ 24 - 0
src/api/map-tile.ts

@@ -0,0 +1,24 @@
+import axios from "./instance";
+import { MAP_TILE_LIST } from "./constant";
+
+type ServiceMapTile = {
+  id: number;
+  name: string,
+  mapUrl: string;
+  coord: string;
+};
+
+export type MapTile = {
+  id: number;
+  name: string,
+  mapUrls: {tempUrl: string, maximumLevel: number}[];
+  coord: string;
+};
+
+export const fetchMapTiles = async () => {
+  const items = await axios.get<ServiceMapTile[]>(MAP_TILE_LIST);
+  return items.map((item) => ({
+    ...item,
+    mapUrls: JSON.parse(item.mapUrl),
+  }));
+};

+ 93 - 64
src/api/material.ts

@@ -1,11 +1,41 @@
 import { asyncTimeout, jsonToForm } from "@/utils";
 import { PagingRequest, PagingResult } from ".";
-import { ADD_MATERIAL, DEL_MATERIAL, MATERIAL_GROUP_LIST, MATERIAL_PAG, UPLOAD_HEADS } from "./constant";
+import {
+  ADD_MATERIAL,
+  DEL_MATERIAL,
+  MATERIAL_GROUP_LIST,
+  MATERIAL_PAG,
+  UPLOAD_HEADS,
+} from "./constant";
 import axios from "./instance";
 
+type ServiceMaterialGroup = {
+  dictKey: string;
+  dictName: string;
+  useType: string
+  id: number;
+};
+type ServiceMaterial = {
+  createTime: string;
+  dictId: number;
+  status: number,
+  dictName: string;
+  fileFormat: string;
+  fileName: string;
+  fileSize: string;
+  fileType: string;
+  fileUrl: string;
+  id: number;
+  name: string;
+  newFileName: string;
+  typeKey: string;
+  updateTime: string;
+  uploadId: number;
+};
 export type MaterialGroup = {
   id: number;
   name: string;
+  useType: string,
 };
 
 export type Material = {
@@ -15,84 +45,83 @@ export type Material = {
   url: string;
   size: number;
   groupId: number;
+  status: number;
   group: string;
-  modelId?: number
+  uploadId?: number;
+  isSystem?: number
+  modelId?: number;
 };
 
-export type MaterialPageProps = PagingRequest<Partial<Material> & {groupIds: number[]}>;
+export type MaterialPageProps = PagingRequest<
+  Partial<Material> & { groupIds: number[], formats: string[] }
+>;
 export const fetchMaterialPage = async (params: MaterialPageProps) => {
-  await asyncTimeout(160)
-  let materials: PagingResult<Material[]> = {
-    ...params,
-    total: 100,
-    list: [
-      {
-        id: params.pageNum,
-        name: "test",
-        format: params.format || "png",
-        url: "icon/h_default_64.png",
-        groupId: 1,
-        group: "分组1",
-        size: 1024,
-      },
-      {
-        id: params.pageNum + 100,
-        name: "test",
-        format: params.format || "mp3",
-        url: "icon/h_default_64.png",
-        groupId: 1,
-        group: "分组1",
-        size: 1024,
-      },
-      {
-        id: params.pageNum + 200,
-        name: "test",
-        format: params.format || "mp4",
-        url: "icon/h_default_64.png",
-        groupId: 1,
-        group: "分组1",
-        size: 1024,
-      },
-      {
-        id: params.pageNum + 300,
-        name: "mesh",
-        format: "obj",
-        url: "icon/h_default_64.png",
-        groupId: 2,
-        group: "分组2",
-        modelId: 1055,
-        size: 254.58 * 1024 * 1024,
-      },
-    ],
-  };
-  if (params.groupIds) {
-    materials.list =  materials.list.filter(i => params.groupIds.includes(i.groupId))
+  //
+  const material = await axios.post<PagingResult<ServiceMaterial[]>>(MATERIAL_PAG, {
+    pageNum: params.pageNum,
+    pageSize: params.pageSize,
+    name: params.name,
+    dictIds: params.groupIds,
+    
+    fileFormats: params.formats
+  });
+  const nm = {
+    ...material,
+    list: material.list.map((item): Material => ({
+      ...item,
+      id: item.id,
+      name: item.name,
+      format: item.fileFormat,
+      url: item.fileUrl,
+      size: Number(item.fileSize),
+      groupId: item.dictId,
+      status: item.status,
+      group: item.dictName,
+      uploadId: item.uploadId
+    }))
   }
-  return materials
-  // const material = await axios.get<PagingResult<Material[]>>(MATERIAL_PAG, { params })
-  // return material
+
+  // const testUrls = [
+  //   'dog.glb', 'man--running.glb', 'man--walk.glb', 'Soldier.glb', 'Xbot.glb', 'Man.glb'
+  // ]
+  // nm.list.unshift(
+  //   ...testUrls.map((item, ndx) => ({
+  //     id: ndx,
+  //     name: item,
+  //     format: 'glb',
+  //     url: `/animation/${item}`,
+  //     size: 1,
+  //     groupId: 1,
+  //     status: 1,
+  //     group: '动画模型',
+  //     uploadId: 1
+  //   }))
+  // )
+  
+  return nm;
 };
 
 export const fetchMaterialGroups = async () => {
-  await asyncTimeout(160)
-  const groups: MaterialGroup[] = [
-    {id: 1, name: '分组1'},
-    {id: 2, name: '分组2'},
-  ]
-  return groups
-  // return axios.get<MaterialGroup[]>(MATERIAL_GROUP_LIST);
+  return (await axios.get<ServiceMaterialGroup[]>(MATERIAL_GROUP_LIST)).map(
+    (item) => ({
+      name: item.dictName,
+      useType: item.useType,
+      key: item.dictKey,
+      id: item.id,
+    })
+  ) as MaterialGroup[];
 };
 
 export const addMaterial = (file: File) => {
-  console.log(file)
   return axios<string>({
     method: "POST",
     url: ADD_MATERIAL,
     data: jsonToForm({ file }),
     headers: { ...UPLOAD_HEADS },
   });
-}
+  
+};
 
-export const delMaterial = (id: Material['id']) => {
-  return axios.post(DEL_MATERIAL, { id })
-}
+export const delMaterial = (id: Material["id"]) => {
+  return axios.post(DEL_MATERIAL, { id });
+};

+ 65 - 0
src/api/monitor.ts

@@ -0,0 +1,65 @@
+import axios from "./instance";
+import { params } from "@/env";
+import {
+  GUIDE_MONITOR_LIST,
+  UPDATE_MONITOR,
+  DELETE_MONITOR,
+  INSERT_MONITOR,
+} from "./constant";
+
+import type { Guide } from "./guide";
+
+interface ServiceMonitor {
+  id: string;
+  title: string;
+  content: string;
+}
+
+export interface Monitor {
+  id: string;
+  title: string;
+  content: string;
+}
+
+export type Monitors = Monitor[];
+
+const serviceToLocal = (servicePath: ServiceMonitor): Monitor => ({
+  ...servicePath,
+});
+
+const localToService = (path: Monitor): ServiceMonitor => ({
+  ...path,
+});
+
+export const fetchMonitors = async () => {
+  return [
+    {
+      id: 1,
+      title: "室内监控",
+      content: "",
+    },
+    {
+      id: 2,
+      title: "室内监控",
+      content: "",
+    },
+  ];
+
+  const monitors = await axios.get<ServiceMonitor[]>(GUIDE_MONITOR_LIST);
+  return monitors.map(serviceToLocal);
+};
+export const postInsertMonitor = async (monitor: Monitor) => {
+  const smonitor = await axios.post<ServiceMonitor>(INSERT_MONITOR, {
+    ...localToService(monitor),
+    caseId: params.caseId,
+  });
+  return serviceToLocal(smonitor);
+};
+
+export const postUpdateMonitor = async (monitor: Monitor) => {
+  return axios.post<undefined>(UPDATE_MONITOR, { ...localToService(monitor) });
+};
+
+export const postDeleteMonitor = (id: Monitor["id"]) => {
+  return axios.post<undefined>(DELETE_MONITOR, { id: Number(id) });
+};

+ 23 - 3
src/api/offline.ts

@@ -4,12 +4,31 @@ import { AxiosInstance } from "axios";
 import {namespace} from '@/env'
 import Axios from 'axios'
 
+export const offlinePrev = import.meta.env.DEV ? './offlineData/' : './'
 export const setOfflineAxios = (axios: AxiosInstance) => {
   const data: {[key in string]: any} = {}
-  const prev = import.meta.env.DEV ? '__offline/' : ''
-  Axios.get(`./${prev}package/data.json`, {headers: { Accept: "application/json"}}).then(res => {
+  Axios.get(`./${offlinePrev}package/data.json`, {headers: { Accept: "application/json"}}).then(res => {
     Object.assign(data, res.data)
-    ;(window as any).offlineData = data
+    const prev = import.meta.env.DEV ? offlinePrev : offlinePrev.substring(0, offlinePrev.length - 1)
+    for (const key in data) {
+      data[prev + key] = data[key]
+    }
+    ;(window as any).__data = data
+    ;(window as any).offlineData = new Proxy({}, {
+      get(t, key) {
+        if (key in data) {
+          return data[key as any]
+        } else {
+          console.log('请求', key)
+          return Axios.get(key as any, {headers: { Accept: "application/json"}})
+            .then((res) => {
+              data[key as any] = res.data
+              return res.data
+            })
+        }
+      }
+    })
+    
   })
 
   // 流接口
@@ -27,6 +46,7 @@ export const setOfflineAxios = (axios: AxiosInstance) => {
         params.caseId = envParams.caseId
       }
       let item = data[config.url!+ paramsToStr(params)] 
+      console.log(data, item)
       if (!item) {
         delete params.caseId
         item = data[config.url!+ paramsToStr(params)] 

+ 5 - 12
src/api/path.ts

@@ -1,7 +1,6 @@
 import axios from "./instance";
 import { params } from "@/env";
 import { PATH_LIST, DELETE_PATH, INSERT_PATH, UPDATE_PATH } from "./constant";
-import { createPath } from "@/store";
 
 interface ServerPath {
   id: number;
@@ -44,16 +43,10 @@ const localToService = (path: Path): ServerPath => ({
 });
 
 export const fetchPaths = async () => {
-  const paths: Paths = [
-    // createPath({ name: "路径1" }),
-    // createPath({ name: "路径3" }),
-  ];
-
-  return paths;
-  // const staggings = await axios.get<ServerPath[]>(PATH_LIST, {
-  //   params: { caseId: params.caseId },
-  // });
-  // return staggings.map(serviceToLocal);
+  const staggings = await axios.get<ServerPath[]>(PATH_LIST, {
+    params: { caseId: params.caseId },
+  });
+  return staggings.map(serviceToLocal);
 };
 
 export const postAddPath = async (path: Path) => {
@@ -72,5 +65,5 @@ export const postUpdatePath = (path: Path) => {
 };
 
 export const postDeletePath = (id: Path["id"]) => {
-  return axios.post<undefined>(DELETE_PATH, { pathId: id });
+  return axios.post<undefined>(DELETE_PATH, { id: id });
 };

+ 17 - 8
src/api/scene.ts

@@ -1,5 +1,5 @@
 import axios from './instance'
-import { MODEL_LIST, MODEL_SIGN, SCENE_LIST_ALL } from './constant'
+import { MODEL_LIST, MODEL_SIGN, SCENE_LIST_ALL, SYNC_INFO } from './constant'
 import { params } from '@/env'
 
 export enum SceneStatus {
@@ -19,15 +19,17 @@ export enum SceneType {
   SWSSMX = 4,
   SWYDSS = 5,
   SWYDMX = 6,
+  DSFXJ = 7,
 }
 export const SceneTypeDesc: Record<SceneType, string>  = {
-  [SceneType.SWKK]: '八目',
-  [SceneType.SWKJ]: '双目转台',
-  [SceneType.SWSS]: '激光转台点云场景',
-  [SceneType.SWMX]: '三维模型',
-  [SceneType.SWSSMX]: '激光转台Mesh场景',
-  [SceneType.SWYDSS]: '激光移动点云场景',
-  [SceneType.SWYDMX]: '激光移动Mesh场景'
+  [SceneType.SWKK]: '四维看看/Mesh',
+  [SceneType.SWKJ]: '四维看见/Mesh',
+  [SceneType.SWSS]: '四维深时/点云',
+  [SceneType.SWMX]: '媒体库',
+  [SceneType.SWSSMX]: '四维深时/Mesh',
+  [SceneType.SWYDSS]: '四维深光/点云',
+  [SceneType.SWYDMX]: '四维深光/Mesh',
+  [SceneType.DSFXJ]: '圆周率/Mesh'
 }
 
 
@@ -38,6 +40,7 @@ export interface Scene {
   isLaser: boolean
   modelDateType: string
   modelGlbUrl: string
+  raw: any,
   model3dgsUrl: string;
   modelShpUrl: string;
   modelId: number
@@ -62,6 +65,12 @@ const toLocalScene = (scene: Scene) => ({
   name: scene.name || scene.sceneName || scene.modelTitle,
 })
 
+
+
+export const getSyncSceneInfo = async (scene: Scene) => {
+  return (await axios.post<string>(SYNC_INFO, { caseId: params.caseId, num: scene.raw.num }));
+};
+
 export const fetchScenes = async () => {
   const scenes = await axios.get<Scenes>(MODEL_LIST, { params: { caseId: params.caseId } })
   return scenes.map(toLocalScene)

+ 20 - 6
src/api/setting.ts

@@ -2,12 +2,15 @@ import { GET_SETTING, UPDATE_SETTING } from "./constant";
 import defaultCover from "@/assets/cover.png";
 import { params } from "@/env";
 import axios from "./instance";
+import { fetchMapTiles } from "./map-tile";
 
 type ServeSetting = {
   settingsId?: string;
   pose?: string;
   cover?: string;
-  back?: string;
+  mapType?: 'satellite' | 'standard',
+  back?: string | null;
+  mapId?: number | null
 };
 
 export type Setting = {
@@ -22,31 +25,42 @@ export type Setting = {
       rotInModel: SceneLocalPos;
     };
   };
+  mapType: 'satellite' | 'standard',
   cover: string;
-  back: string;
+  back?: string | null;
   fov?: number;
   openCompass?: boolean;
+  mapId?: number | null
 };
 
 const toLocal = (serviceSetting: ServeSetting): Setting => ({
   id: serviceSetting.settingsId,
   pose: serviceSetting.pose && JSON.parse(serviceSetting.pose),
   cover: serviceSetting.cover || defaultCover,
-  back: serviceSetting.back || "map",
+  back: serviceSetting.back || undefined,
+  mapType: serviceSetting.mapType || 'satellite',
+  mapId: serviceSetting.mapId || undefined,
 });
 
 const toService = (setting: Setting): ServeSetting => ({
   settingsId: setting.id,
+  mapId: setting.mapId  || null,
   pose: setting.pose && JSON.stringify(setting.pose),
   cover: setting.cover,
-  back: setting.back,
+  back: setting.back  || null,
+  mapType: setting.mapType,
 });
 
 export const fetchSetting = async () => {
-  const data = await axios.get<ServeSetting[]>(GET_SETTING, {
+  let data = await axios.get<ServeSetting[]>(GET_SETTING, {
     params: { caseId: params.caseId },
   });
-  return toLocal(data[0] || {});
+  const tData = toLocal(data[0] || {})
+  if (!tData.back && !tData.mapId) {
+    const tiles = await fetchMapTiles()
+    tData.mapId = tiles[0].id
+  }
+  return tData
 };
 
 export const updateSetting = async (setting: Setting) => {

+ 4 - 5
src/api/setup.ts

@@ -15,7 +15,7 @@ export type Hook = {
 export const axiosFactory = () => {
   const axiosRaw = Axios.create()
   const axiosConfig = {
-    token: localStorage.getItem('fuseCodeToken'),
+    token: localStorage.getItem('token'),
     unTokenSet: [] as string[],
     unReqErrorSet: [] as string[],
     unResErrorSet: [] as string[],
@@ -66,11 +66,11 @@ export const axiosFactory = () => {
 
   const getToken = () => axiosConfig.token
   const setToken = (token: string) => {
-    localStorage.setItem('fuseCodeToken', token)
+    localStorage.setItem('token', token)
     axiosConfig.token = token
   }
   const delToken = () => {
-    localStorage.removeItem('fuseCodeToken')
+    localStorage.removeItem('token')
     axiosConfig.token = null
   }
   
@@ -133,8 +133,7 @@ export const axiosFactory = () => {
 
       if (!matchURL(axiosConfig.unTokenSet, config)) {
         if (!axiosConfig.token) {
-          if (!matchURL(axiosConfig.unReqErrorSet, config)) {
-            console.log(config.url)
+          if (!offline && !matchURL(axiosConfig.unReqErrorSet, config)) {
             const error = new Error('缺少token')
             callErrorHandler('req', error, config)
             throw error

+ 32 - 30
src/api/sys.ts

@@ -1,4 +1,4 @@
-import { UPLOAD_FILE, UPLOAD_HEADS, CASE_INFO, AUTH_PWD } from "./constant";
+import { UPLOAD_FILE, UPLOAD_HEADS, CASE_INFO, AUTH_PWD, CASE_FIRE_INFO } from "./constant";
 import { axios } from "./instance";
 import { jsonToForm } from "@/utils";
 import { params } from "@/env";
@@ -30,43 +30,45 @@ export enum FireStatus {
 }
 
 export type FireProject = {
-  accidentDate: string;
-  createTime: string;
-  creatorDeptId: string;
-  caseId: number;
-  creatorId: string;
-  creatorName: string;
-  deptId: string;
-  editTime: string;
-  editorId: string;
-  editorName: string;
-  fireReason: string;
-  id: string;
-  isTeached: number;
-  organizerDeptName: string;
-  organizerUsers: string;
-  projectAddress: string;
-  projectName: string;
-  projectSite: string;
-  projectSiteCode: string;
-  projectSn: string;
-  
-  status: FireStatus;
-  statusDesc: string;
-  updateTime: string;
-  isDelete?: number;
+  "id": number,
+  "caseId": number,
+  "commandTime": string,
+  "alarmTime": string,
+  "alarmName": string,
+  "inquestDept": string,
+  "assignDept": string,
+  "assignType": string,
+  "times": string[],
+  "inquestAddress": string,
+  "tbStatus": number,
+  "createTime": string,
+  "updateTime": string
 };
 
 export interface Case {
   caseTitle: string;
-  latAndLong: string,
-  mapUrl: string
+  latAndLong: string;
+  mapUrl: string;
+  showScenes: boolean
+  caseNum: string;
+  caseCategory: string;
+  caseRegion: string;
+  caseAddress: string;
+  homicideCase: number;
+  criminalCase: number;
   tmProject?: FireProject;
 }
 
-export const getCaseInfo = () =>
-  axios.get<Case>(CASE_INFO, { params: { caseId: params.caseId } });
+export const getCaseInfo = async () => {
+  const [caseInfo, fireInfo] = await Promise.all([
+    axios.get<Case>(CASE_INFO, { params: { caseId: params.caseId } }),
+    axios.get<FireProject>(CASE_FIRE_INFO, { params: { caseId: params.caseId } })
+  ])
+  caseInfo.tmProject = fireInfo
+  return caseInfo
+}
 
 // 校验密码
 export const authSharePassword = (randCode: string) =>
   axios<boolean>(AUTH_PWD, { params: { randCode, caseId: params.caseId } });
+

+ 19 - 4
src/api/tagging-position.ts

@@ -18,12 +18,14 @@ interface ServicePosition {
   "tagPoint": string,
   normal: string
   
-  globalVisibility: boolean
+  globalVisibility: number
   type: string,
   mat: string
   fontSize: number,
   lineHeight: number,
   visibilityRange: number
+  pose?: string;
+  
 }
 
 export enum TaggingPositionType {
@@ -43,6 +45,16 @@ export interface TaggingPosition {
 
   type: TaggingPositionType
   mat: Tagging3DProps['mat']
+  pose?: {
+    position: SceneLocalPos;
+    target: SceneLocalPos;
+    panoInfo?: {
+      panoId: any;
+      modelId: string;
+      posInModel: SceneLocalPos;
+      rotInModel: SceneLocalPos;
+    };
+  };
 }
 
 export type TaggingPositions = TaggingPosition[]
@@ -54,7 +66,7 @@ const serviceToLocal = (position: ServicePosition, taggingId?: Tagging['id']): T
   taggingId: taggingId || position.tagId.toString(),
   localPos: JSON.parse(position.tagPoint),
   type: (position.type || TaggingPositionType['2d']) as TaggingPositionType,
-  globalVisibility: position.globalVisibility,
+  globalVisibility: Boolean(position.globalVisibility),
   normal: position.normal ? JSON.parse(position.normal) : { x: 0, y: 0, z: 1 },
   mat: position.mat ? JSON.parse(position.mat) : {
     scale: 1,
@@ -63,6 +75,7 @@ const serviceToLocal = (position: ServicePosition, taggingId?: Tagging['id']): T
   visibilityRange: position.visibilityRange || 30,
   fontSize: position.fontSize || 12,
   lineHeight: position.lineHeight || 1,
+  pose: position.pose && JSON.parse(position.pose)
 })
 
 const localToService = (position: TaggingPosition, update = false): PartialProps<ServicePosition, 'tagPointId'> => ({
@@ -70,13 +83,14 @@ const localToService = (position: TaggingPosition, update = false): PartialProps
   "tagId": Number(position.taggingId),
   "fusionNumId": Number(position.modelId),
   "tagPoint": JSON.stringify(position.localPos),
-  globalVisibility: position.globalVisibility,
+  globalVisibility: Number(position.globalVisibility),
   type: position.type,
   mat: position.mat && JSON.stringify(position.mat),
   normal: JSON.stringify(position.normal),
   fontSize: position.fontSize,
   lineHeight: position.lineHeight,
-  visibilityRange: position.visibilityRange 
+  visibilityRange: position.visibilityRange ,
+  pose: position.pose && JSON.stringify(position.pose)
 })
 
 
@@ -86,6 +100,7 @@ export const fetchTaggingPositions = async (taggingId: Tagging['id']) => {
 }
 
 export const postAddTaggingPosition = async (position: TaggingPosition) => {
+  console.log(localToService(position))
   const servicePosition = await axios.post<ServicePosition>(INSERT_TAGGING_POINT, localToService(position))
   return serviceToLocal(servicePosition)
 }

+ 2 - 2
src/api/tagging-style.ts

@@ -68,7 +68,7 @@ const toLocal = (serviceStyle: ServiceStyle): TaggingStyle => ({
   id: serviceStyle.iconId.toString(),
   lastUse: serviceStyle.lastUse,
   typeId: Number(serviceStyle.iconTitle) || defStyleType.id,
-  icon: serviceStyle.isSystem ? '/icon/h_default_64.png' :serviceStyle.iconUrl,
+  icon: serviceStyle.iconUrl,
   default: Boolean(serviceStyle.isSystem),
 });
 
@@ -100,7 +100,7 @@ export const postAddTaggingStyle = async (props: {
     url: INSERT_TAGGING_STYLE,
     data: jsonToForm({
       file: new File([props.file], `${props.iconTitle}.png`),
-      iconTitle: props.iconTitle,
+      iconTitle: props.iconTitle.toString(),
       caseId: params.caseId,
     }),
   });

+ 8 - 5
src/api/tagging.ts

@@ -23,9 +23,9 @@ interface ServerTagging {
   "tagDescribe": string,
   "tagTitle": string,
 
-  show3dTitle: boolean
+  show3dTitle: number
   audio: string
-
+  fileName: string
 }
 
 export interface Tagging {
@@ -39,6 +39,7 @@ export interface Tagging {
   principal: string
   images: string[],
   audio: string
+  audioName: string
 }
 
 export type Taggings = Tagging[]
@@ -50,8 +51,9 @@ const serviceToLocal = (serviceTagging: ServerTagging): Tagging => ({
   title: serviceTagging.tagTitle,
   desc: serviceTagging.tagDescribe,
   part: serviceTagging.leaveBehind,
-  show3dTitle: true, 
-  // show3dTitle: serviceTagging.show3dTitle,
+  // show3dTitle: true, 
+  audioName: serviceTagging.fileName,
+  show3dTitle: Boolean(serviceTagging.show3dTitle),
   method: serviceTagging.getMethod,
   principal: serviceTagging.getUser,
   audio: serviceTagging.audio,
@@ -62,8 +64,9 @@ const localToService = (tagging: Tagging, update = false): PartialProps<ServerTa
   "hotIconId": Number(tagging.styleId),
   "fusionId": params.caseId,
   "getMethod": tagging.method,
-  show3dTitle: tagging.show3dTitle,
+  show3dTitle: Number(tagging.show3dTitle),
   "getUser": tagging.principal,
+  fileName: tagging.audioName,
   "hotIconUrl": "static/img_default/lQLPDhrvVzvNvTswMLAOU-UNqYnnZQG1YPJUwLwA_48_48.png",
   "tagId": update ? Number(tagging.id) : undefined,
   "tagImgUrl": JSON.stringify(tagging.images),

+ 22 - 0
src/api/user.ts

@@ -0,0 +1,22 @@
+import { USER_INFO } from "./constant"
+import axios from "./instance"
+
+export type UserInfo = {
+  avatar: string;
+  deptId: string;
+  deptName: string;
+  id: string;
+  deptLevel: number;
+  departmentId: string;
+  cameraSns: string[];
+  status: 1 | 0;
+  isAdmin: 1 | 0;
+  permsList: string[];
+  nickName: string;
+  roleId: string;
+  password: string;
+  userName: string;
+};
+export const getUserInfo = () => {
+  return axios.get<UserInfo>(USER_INFO)
+}

+ 85 - 23
src/app.vue

@@ -1,44 +1,75 @@
 <template>
   <ConfigProvider v-bind="config">
+    <template v-for="needMount in needMounts">
+      <Teleport :to="needMount[0]">
+        <component
+          :is="needMount[1]"
+          v-bind="needMount[2]"
+          :ref="(v: any) => needMount[3] && needMount[3](v)"
+        />
+      </Teleport>
+    </template>
+
     <ui-editor-layout
       @click.stop
+      @contextmenu.prevent
       id="layout-app"
       class="editor-layout"
       :style="layoutStyles"
       :class="layoutClassNames"
     >
-      <div :ref="(el: any) => appEl = (el as HTMLDivElement)" v-if="loaded">
+      <div
+        :ref="(el: any) => appEl = (el as HTMLDivElement)"
+        v-if="loaded"
+        class="app-con"
+      >
         <router-view v-slot="{ Component }">
           <!-- <keep-alive> -->
           <component :is="Component" />
           <!-- </keep-alive> -->
         </router-view>
       </div>
+
+      <!-- <span
+        v-if="fuseModels.length > 0 || scenes.length === 0"
+        class="taggle map-type"
+        @click="isStandard = !isStandard"
+        @touchend="isStandard = !isStandard"
+      >
+        <img :src="isStandard ? 'images/satellite.jpg' : 'images/standard.jpg'" />
+      </span> -->
     </ui-editor-layout>
 
     <PwdModel v-if="inputPwd" @close="inputPwd = false" />
-
-    <template v-for="needMount in needMounts">
-      <Teleport :to="needMount[0]">
-        <component
-          :is="needMount[1]"
-          v-bind="needMount[2]"
-          :ref="(v: any) => needMount[3] && needMount[3](v)"
-        />
-      </Teleport>
-    </template>
   </ConfigProvider>
 </template>
 
 <script lang="ts" setup>
 import { custom, params } from "@/env";
 import { computed, ref, watch, watchEffect, nextTick } from "vue";
-import { isEdit, prefix, appEl, initialSetting, caseProject, refreshCase } from "@/store";
+import {
+  isEdit,
+  prefix,
+  appEl,
+  initialSetting,
+  caseProject,
+  refreshCase,
+  fuseModels,
+  scenes,
+} from "@/store";
 import router, { currentLayout, RoutesName } from "./router";
 import { loadPack, needMounts } from "@/utils";
 import { ConfigProvider } from "ant-design-vue";
 import PwdModel from "@/layout/pwd.vue";
 import { config } from "./config";
+import { sdk, sdkLoaded } from "./sdk";
+// https://192.168.0.13:7173/index.html?caseId=509&sign=vGxCu4X5321fkWpZN6HnqYBiE6iI71DDWzdgjEaUKIh7vDWo3o5yhqHdHhGr4Z3W#/show
+const isStandard = ref(true);
+watchEffect(() => {
+  if (sdkLoaded.value && !params.testMap) {
+    // sdk.switchMapType(isStandard.value ? "satellite" : "standard");
+  }
+});
 
 const loaded = ref(false);
 const inputPwd = ref(false);
@@ -53,17 +84,17 @@ const stopWatch = watch(
     }
 
     // 单页面 非自己查看需要密码校验
-    if (currentLayout.value === RoutesName.show && !params.share) {
-      inputPwd.value = true;
-      await new Promise<void>((resolve) => {
-        const stopInputWatch = watchEffect(() => {
-          if (!inputPwd.value) {
-            stopInputWatch();
-            resolve();
-          }
-        });
-      });
-    }
+    // if (currentLayout.value === RoutesName.show && !params.share) {
+    //   inputPwd.value = true;
+    //   await new Promise<void>((resolve) => {
+    //     const stopInputWatch = watchEffect(() => {
+    //       if (!inputPwd.value) {
+    //         stopInputWatch();
+    //         resolve();
+    //       }
+    //     });
+    //   });
+    // }
 
     params.share = true;
     await refreshCase();
@@ -103,6 +134,7 @@ const layoutStyles = computed(() => {
 <style scoped lang="scss">
 .editor-layout {
   --editor-menu-bottom: 0px;
+  background: #000;
   --left-pano-left: calc(var(--editor-menu-left) + var(--editor-menu-width));
 }
 
@@ -146,4 +178,34 @@ const layoutStyles = computed(() => {
     background-color: #ccc;
   }
 }
+
+.taggle {
+  position: absolute;
+  font-size: 16px;
+  color: #fff;
+  background: rgba(0, 0, 0, 0.2);
+  z-index: 9999999;
+  width: 30px;
+  height: 30px;
+  display: flex;
+  align-items: center;
+  overflow: hidden;
+  justify-content: center;
+  border-radius: 3px;
+  cursor: pointer;
+
+  &.map-type {
+    transition: all 0.3s ease;
+    top: calc(var(--header-top) + var(--editor-head-height) + 10px);
+    right: calc(var(--editor-toolbox-width) + var(--editor-menu-right) + 30px);
+    width: 42px;
+    height: 42px;
+
+    img {
+      width: 100%;
+      height: 100%;
+      object-fit: cover;
+    }
+  }
+}
 </style>

+ 0 - 12
src/assets/style/criminal.less

@@ -1,12 +0,0 @@
-.ant-modal-root {
-  @import 'ant-design-vue/dist/antd.less';
-  @primary-color: #26559B;
-  @menu-item-active-bg: #E6F7FF;
-  @table-selected-row-bg: #E6F7FF;
-  // .ant-table-tbody > tr.ant-table-row-selected > td {
-  //   background: none;
-  // }
-  .model-header .header-desc span {
-    color: @primary-color;
-  }
-}

+ 0 - 3
src/assets/style/fire.css

@@ -1,3 +0,0 @@
-.ant-modal-root .model-header .header-desc span {
-  color: #D8000A;
-}

+ 0 - 12
src/assets/style/fire.less

@@ -1,12 +0,0 @@
-.ant-modal-root {
-  // @import 'ant-design-vue/dist/antd.less';
-  @primary-color: #D8000A;
-  @menu-item-active-bg: #E6F7FF;
-  @table-selected-row-bg: #E6F7FF;
-  // .ant-table-tbody > tr.ant-table-row-selected > td {
-  //   background: none;
-  // }
-  .model-header .header-desc span {
-    color: @primary-color;
-  }
-}

+ 3 - 0
src/assets/style/global.css

@@ -33,3 +33,6 @@ textarea {
 .ant-input-number {
   background: var(--colors-normal-back) !important;
 }
+.cesium-widget-credits {
+  display: none !important;
+}

+ 4 - 0
src/assets/style/global.less

@@ -43,4 +43,8 @@ button, input, select, textarea {
 }
 .ant-input-number {
   background: var(--colors-normal-back) !important;
+}
+
+.cesium-widget-credits {
+  display: none !important;
 }

+ 90 - 0
src/components/actions-merge/index.vue

@@ -0,0 +1,90 @@
+<template>
+  <div class="actions">
+    <span
+      v-for="(action, i) in items"
+      :class="{ active: equal(current as any, action), disabled: action.disabled }"
+      :key="action.key || i"
+      @click="emit('update:current', current === action ? null : action)"
+    >
+      <ui-icon :type="action.icon" class="icon" :tip="action.text" />
+    </span>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { useActive } from "@/hook";
+import { ref, toRaw, watchEffect, onBeforeUnmount, nextTick, watch } from "vue";
+
+export type ActionsItem<T = any> = {
+  icon: string;
+  key?: T;
+  text: string;
+  disabled?: boolean;
+  action?: () => (() => void) | void;
+};
+export type ActionsProps = {
+  items: ActionsItem[];
+  current?: ActionsItem | null;
+  single?: boolean;
+};
+
+const props = defineProps<ActionsProps>();
+const emit = defineEmits<{ (e: "update:current", data: ActionsItem | null): void }>();
+const equal = (a: ActionsItem | null, b: ActionsItem | null) => toRaw(a) === toRaw(b);
+
+watch(
+  () => props.current,
+  (current) => {
+    if (!current) return;
+    if (props.single) {
+      emit("update:current", null);
+    }
+  },
+  { immediate: true }
+);
+watch(
+  () => props.current,
+  (current, p, onCleanup) => {
+    if (!current) return;
+    const fn = current.action && current.action();
+    fn && onCleanup(fn);
+  },
+  { immediate: true }
+);
+</script>
+
+<style lang="scss" scoped>
+.actions {
+  display: flex;
+  gap: 3px;
+  background: rgba(27, 27, 28, 0.8);
+  box-shadow: inset 0px 0px 0px 2px rgba(255, 255, 255, 0.1);
+  border-radius: 4px 4px 4px 4px;
+  padding: 4px 10px;
+
+  span {
+    flex: 1;
+    height: 32px;
+    width: 32px;
+    border-radius: 4px 4px 4px 4px;
+    opacity: 1;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    color: rgba(255, 255, 255, 0.6);
+    font-size: 14px;
+    cursor: pointer;
+    transition: all 0.3s ease;
+
+    .icon {
+      font-size: 22px;
+    }
+
+    &:hover,
+    &.active {
+      background: rgba(0, 200, 175, 0.16);
+      color: #00c8af;
+    }
+  }
+}
+</style>

+ 52 - 44
src/components/actions/index.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="actions">
-    <span 
-      v-for="(action, i) in items" 
-      :class="{active: equal(selected, action)}"
-      :key="action.key || i" 
+    <span
+      v-for="(action, i) in items"
+      :class="{ active: equal(selected, action) }"
+      :key="action.key || i"
       @click="clickHandler(action)"
     >
       <ui-icon :type="action.icon" class="icon" />
@@ -13,79 +13,87 @@
 </template>
 
 <script lang="ts" setup>
-import { useActive } from '@/hook';
-import { ref, toRaw, watchEffect, onBeforeUnmount, nextTick, watch } from 'vue'
+import { useActive } from "@/hook";
+import { ref, toRaw, watchEffect, onBeforeUnmount, nextTick, watch } from "vue";
 
-export type ActionsItem<T = any> = { 
-  icon: string, 
-  key?: T, 
-  text: string,
-  action?: () => (() => void) | void
-}
-export type ActionsProps = { items: ActionsItem[], current?: ActionsItem | null, single?: boolean, }
+export type ActionsItem<T = any> = {
+  icon: string;
+  key?: T;
+  text: string;
+  action?: () => (() => void) | void;
+};
+export type ActionsProps = {
+  items: ActionsItem[];
+  current?: ActionsItem | null;
+  single?: boolean;
+};
 
-const props = defineProps<ActionsProps>()
-const emit = defineEmits<{ (e: 'update:current', data: ActionsItem | null): void }>()
-const equal = (a: ActionsItem | null, b: ActionsItem | null) => toRaw(a) === toRaw(b)
-const selected = ref<ActionsItem | null>(null)
+const props = defineProps<ActionsProps>();
+const emit = defineEmits<{ (e: "update:current", data: ActionsItem | null): void }>();
+const equal = (a: ActionsItem | null, b: ActionsItem | null) => toRaw(a) === toRaw(b);
+const selected = ref<ActionsItem | null>(null);
 const clickHandler = (select: ActionsItem) => {
-  selected.value = equal(selected.value, select) ? null : select
-  emit('update:current', selected.value)
+  selected.value = equal(selected.value, select) ? null : select;
+  emit("update:current", selected.value);
+  console.log("update:current", selected.value);
   if (props.single) {
-    nextTick(() => selected.value && clickHandler(selected.value))
+    setTimeout(() => selected.value && clickHandler(selected.value), 16);
   }
-}
+};
+
+// watch(
+//   () => props.current,
+//   () => {
+//     if (!props.current && selected.value) {
+//       clickHandler(selected.value)
+//     }
+//   }
+// )
 
 watch(
-  () => props.current, 
-  () => {
-    if (!props.current && selected.value) {
-      clickHandler(selected.value)
+  selected,
+  (_n, _o, onCleanup) => {
+    if (selected.value?.action) {
+      const cleanup = selected.value.action();
+      cleanup && onCleanup(cleanup);
     }
-  }
-)
-
-watch(selected, (_n, _o, onCleanup) => {
-  if (selected.value?.action) {
-    const cleanup = selected.value.action()
-    cleanup && onCleanup(cleanup)
-  }
-}, { flush: 'sync' })
+  },
+  { flush: "sync" }
+);
 
 onBeforeUnmount(() => {
-  selected.value = null
-})
+  selected.value = null;
+});
 </script>
 
 <style lang="scss" scoped>
 .actions {
   display: flex;
   gap: 10px;
-  
+
   span {
     flex: 1;
     height: 34px;
-    background: rgba(255,255,255,0.1);
+    background: rgba(255, 255, 255, 0.1);
     border-radius: 4px 4px 4px 4px;
     opacity: 1;
     display: flex;
     align-items: center;
     justify-content: center;
-    color: rgba(255,255,255,0.6);
+    color: rgba(255, 255, 255, 0.6);
     font-size: 14px;
     cursor: pointer;
-    transition: all .3s ease;
+    transition: all 0.3s ease;
 
     .icon {
       margin-right: 4px;
     }
 
-
     &:hover,
     &.active {
-      background: rgba(0,200,175,0.16);
-      color: #00C8AF;
+      background: rgba(0, 200, 175, 0.16);
+      color: #00c8af;
     }
   }
 }
-</style>
+</style>

+ 1 - 1
src/components/bill-ui/assets/scss/_base-vars.scss

@@ -6,7 +6,7 @@
   --colors-primary-hover: #008B7A;
   --colors-primary-click: #005046;
 
-  --colors-color: #999;
+  --colors-color: rgba(255,255,255,0.7);
   --colors-border-color: rgba(var(--colors-primary-fill), 0.16);
   --colors-content-color: rgb(--colors-primary-fill);
   

+ 0 - 0
src/components/bill-ui/assets/scss/editor/_toolbar.scss


部分文件因为文件数量过多而无法显示