浏览代码

对接导览模块

bill 3 年之前
父节点
当前提交
9c01461b85

+ 1 - 1
src/api/fuse-model.ts

@@ -55,7 +55,7 @@ const serviceToLocal = (serviceModel: ServiceFuseModel): FuseModel => ({
   rotation: serviceModel.transform.rotation,
   id: serviceModel.fusionId.toString(),
   url: serviceModel.sceneData.type === SceneType.SWSS ? serviceModel.sceneData.num : serviceModel.sceneData.modelGlbUrl,
-  title: serviceModel.sceneData.name,
+  title: serviceModel.sceneData.name || serviceModel.sceneData.sceneName || serviceModel.sceneData.modelTitle,
   modelId: serviceModel.sceneData.modelId,
   fusionId: serviceModel.fusionId,
   type: serviceModel.sceneData.type,

+ 2 - 2
src/api/guide-path.ts

@@ -53,7 +53,7 @@ export const fetchGuidePaths = async (guideId: Guide['id']) => {
 }
 
 export const postAddGuidePath = async (path: GuidePath) => {
-  const addData = { ...localToService(path), caseId: params.caseId, fusionGuideId: undefined }
+  const addData = { ...localToService(path), caseId: params.caseId, guidePathId: undefined }
    const serviceData = await axios.post<ServiceGuidePath>(INSERT_GUIDE_PATH, addData)
    return serviceToLocal(serviceData)
 }
@@ -63,7 +63,7 @@ export const postUpdateGuidePath = async (guide: GuidePath) => {
 }
 
 export const postDeleteGuidePath = (id: GuidePath['id']) => {
-  return axios.post<undefined>(DELETE_GUIDE_PATH, { fusionGuideId: Number(id) })
+  return axios.post<undefined>(DELETE_GUIDE_PATH, { guidePathId: Number(id) })
 }
 
   

+ 9 - 2
src/api/scene.ts

@@ -37,5 +37,12 @@ export interface Scene {
 
 export type Scenes = Scene[]
 
-export const fetchScenes = () => 
-  axios.post<Scenes>(MODEL_LIST, { caseId: params.caseId })
+const toLocalScene = (scene: Scene) => ({
+  ...scene,
+  name: scene.name || scene.sceneName || scene.modelTitle,
+})
+
+export const fetchScenes = async () => {
+  const scenes = await axios.post<Scenes>(MODEL_LIST, { caseId: params.caseId })
+  return scenes.map(toLocalScene)
+}

+ 4 - 2
src/api/sys.ts

@@ -4,14 +4,16 @@ import { jsonToForm } from '@/utils'
 
 type UploadFile = LocalFile | string
 
-export const uploadFile = async (file: UploadFile) => {
+export const uploadFile = async (file: UploadFile, suffix = '.png') => {
   if (typeof file === 'string') {
     return file
   } else {
+    const uploadFile = file.blob instanceof File ? file.blob : new File([file.blob], `aaa${suffix}`)
+    console.log(uploadFile)
     const url = await axios<string>({
       method: 'POST',
       url: UPLOAD_FILE, 
-      data: jsonToForm({ file: file.blob }),
+      data: jsonToForm({ file: uploadFile }),
       headers: {...UPLOAD_HEADS}
     })
     return url

+ 2 - 2
src/layout/model-list/select.vue

@@ -58,8 +58,8 @@ const rowSelection: any = ref({
 const cloumns = [
   {
     title: '名称',
-    dataIndex: 'sceneName',
-    key: 'sceneName',
+    dataIndex: 'name',
+    key: 'name',
   },
   {
     title: '拍摄时间',

+ 1 - 1
src/layout/model-list/sign.vue

@@ -12,7 +12,7 @@
     </div>
   </div>
   <div class="model-desc" @click="$emit('click')" v-if="custom.currentModel === model">
-    <p><span>数据来源:</span>{{ ModelTypeDesc[model.type] }}</p>
+    <p><span>数据来源:</span>{{ SceneTypeDesc[model.type] }}</p>
     <p><span>数据大小:</span>{{ model.size }}</p>
     <p v-if="model.type === SceneType.SWSS"><span>拍摄时间:</span>{{ model.time }}</p>
   </div>

+ 37 - 10
src/store/guide.ts

@@ -1,6 +1,5 @@
 import { ref } from 'vue'
-import { createTemploraryID } from './sys'
-import { autoSetModeCallback } from './sys'
+import { autoSetModeCallback, createTemploraryID } from './sys'
 import { 
   fetchGuides, 
   postAddGuide, 
@@ -9,14 +8,23 @@ import {
   uploadFile,
 } from '@/api'
 import { 
+  togetherCallback,
   deleteStoreItem, 
   addStoreItem, 
   updateStoreItem, 
-  fetchStoreItems,
   saveStoreItems,
   recoverStoreItems
 } from '@/utils'
 
+import {
+  getGuidePaths, 
+  guidePaths,
+  recoverGuidePaths,
+  backupGuidePaths,
+  saveGuidePaths,
+  initialGuidePathsByGuide
+} from './guide-path'
+
 import type { Guide as SGuide } from '@/api'
 
 export type Guide = LocalMode<SGuide, 'cover'>
@@ -42,11 +50,27 @@ export const transformGuide = async (guide: Guide): Promise<SGuide> => {
   return { ...guide, cover: guideCover }
 }
 
+export const addGuide = addStoreItem(guides, async (guide) => {
+  const paths = getGuidePaths(guide)
+  const newGuide = await postAddGuide(guide)
+  paths.forEach(path => path.guideId = newGuide.id)
+  return newGuide
+}, transformGuide)
+
+export const deleteGuide = deleteStoreItem(guides, async guide => {
+  const paths = getGuidePaths(guide)
+  await postDeleteGuide(guide.id)
+  guidePaths.value = guidePaths.value.filter(path => !paths.includes(path))
+})
+
+export const initialGuides = async () => {
+  guides.value = await fetchGuides()
+  await Promise.all(guides.value.map(initialGuidePathsByGuide))
+  backupGuides()
+}
+
 export const recoverGuides = recoverStoreItems(guides, getBackupGuides)
-export const addGuide = addStoreItem(guides, postAddGuide, transformGuide)
 export const updateGuide = updateStoreItem(guides, postUpdateGuide, transformGuide)
-export const deleteGuide = deleteStoreItem(guides, guide => postDeleteGuide(guide.id))
-export const initialGuides = fetchStoreItems(guides, fetchGuides, backupGuides)
 export const saveGuides = saveStoreItems(
   guides,
   getBackupGuides,
@@ -56,8 +80,11 @@ export const saveGuides = saveStoreItems(
     delete: deleteGuide,
   }
 )
-export const autoSaveGuides = autoSetModeCallback(guides, {
-  backup: backupGuides,
-  recovery: recoverGuides,
-  save: saveGuides,
+export const autoSaveGuides = autoSetModeCallback([guides, guidePaths], {
+  backup: togetherCallback([backupGuides, backupGuidePaths]),
+  recovery: togetherCallback([recoverGuides, recoverGuidePaths]),
+  save: async () => {
+    await saveGuides()
+    await saveGuidePaths()
+  },
 })

+ 6 - 2
src/store/tagging.ts

@@ -75,15 +75,19 @@ export const transformTagging = async (tagging: Tagging): Promise<STagging> => {
 
 export const recoverTaggings = recoverStoreItems(taggings, () => bcTaggings)
 export const addTagging = addStoreItem(taggings, async (localTagging) => {
-  const serviceTagging = await postAddTagging(localTagging)
   const positions = getTaggingPositions(localTagging)
+  const serviceTagging = await postAddTagging(localTagging)
   for (const position of positions) {
     position.taggingId = serviceTagging.id
   }
   return serviceTagging
 }, transformTagging)
+export const deleteTagging = deleteStoreItem(taggings, async tagging => {
+  const positions = getTaggingPositions(tagging)
+  await postDeleteTagging(tagging.id)
+  taggingPositions.value.filter(position => !positions.includes(position))
+})
 export const updateTagging = updateStoreItem(taggings, postUpdateTagging, transformTagging)
-export const deleteTagging = deleteStoreItem(taggings, tagging => postDeleteTagging(tagging.id))
 export const initialTaggings = fetchStoreItems(taggings, async () => {
   const taggings = await fetchTaggings()
   await Promise.all(taggings.map(initTaggingPositionsByTagging))

+ 6 - 2
src/views/guide/edit-paths.vue

@@ -85,7 +85,7 @@
 <script setup lang="ts">
 import { loadPack, togetherCallback, getFileUrl, asyncTimeout } from '@/utils'
 import { sdk, playSceneGuide, pauseSceneGuide, isScenePlayIng } from '@/sdk'
-import { createGuidePath, isTemploraryID, useAutoSetMode, guides, getGuidePaths } from '@/store'
+import { createGuidePath, isTemploraryID, useAutoSetMode, guides, getGuidePaths, guidePaths } from '@/store'
 import { Dialog, Message } from 'bill/index'
 import { useViewStack } from '@/hook'
 import { nextTick, ref, toRaw, watchEffect } from 'vue'
@@ -104,7 +104,6 @@ const updatePathInfo = (index: number, calcInfo: CalcPathProps[1]) => {
     calcInfo
   )
   Object.assign(paths.value[index], info)
-  console.log(info)
 }
 
 useViewStack(() => 
@@ -122,7 +121,11 @@ useAutoSetMode(paths, {
       Dialog.alert('无法保存空路径导览!')
       throw '无法保存空路径导览!'
     }
+    const oldPaths = getGuidePaths(props.data)
     props.data.cover = paths.value[0].cover
+    guidePaths.value = guidePaths.value
+      .filter(path => !oldPaths.includes(path))
+      .concat(paths.value)
     if (isTemploraryID(props.data.id)) {
       guides.value.push(props.data)
     }
@@ -139,6 +142,7 @@ const addPath = () => {
     const index = paths.value.indexOf(current.value) + 1
     const path: GuidePath = createGuidePath({ 
       ...pose, 
+      guideId: props.data.id,
       cover: { url: dataURL, blob } 
     })
     paths.value.splice(index, 0, path)

+ 10 - 1
src/views/guide/index.vue

@@ -27,12 +27,21 @@
 
 <script lang="ts" setup>
 import { RightFillPano } from '@/layout'
-import { guides, Guide, createGuide, enterEdit, sysBus, autoSaveGuides, getGuidePaths } from '@/store'
 import { ref } from 'vue';
 import GuideSign from './sign.vue'
 import EditPaths from './edit-paths.vue'
 import { useViewStack } from '@/hook'
 import { playSceneGuide } from '@/sdk'
+import { 
+  guides, 
+  createGuide, 
+  enterEdit, 
+  sysBus, 
+  getGuidePaths,
+  autoSaveGuides
+} from '@/store'
+
+import type { Guide } from '@/store'
 
 const currentGuide = ref<Guide | null>()
 const leaveEdit = () => currentGuide.value = null

+ 5 - 5
src/views/tagging/index.vue

@@ -65,8 +65,8 @@ import {
   getTaggingPositions,
   taggingPositions,
   createTaggingPosition,
-FuseModel,
-fuseModels
+  FuseModel,
+  fuseModels
 } from '@/store'
 import { 
   custom, 
@@ -126,7 +126,6 @@ const flyTaggingPositions = (tagging: Tagging) => {
       distance: 3
     })
     
-    console.log('改变了', custom.showTaggingPositions.has(position))
     setTimeout(() => {
       pop()
       flyIndex(i + 1)
@@ -171,8 +170,8 @@ watch(selectTagging, (a, b, onCleanup) => {
     const clickHandler = async (ev: MouseEvent) => {
       await nextTick()
       await asyncTimeout()
-      const positions = fuseModels.value.
-        map(model => 
+      const positions = fuseModels.value
+        .map(model => 
           sdk.getPositionByScreen({
             x: ev.clientX,
             y: ev.clientY
@@ -180,6 +179,7 @@ watch(selectTagging, (a, b, onCleanup) => {
         )
         .filter(pos => pos)
 
+      console.log(fuseModels.value)
       if (!positions.length) {
         Message.error('当前位置无法添加')
       } else if (selectTagging.value) {