feat: wire guide data source and POI focus UI

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
lyf
2026-06-12 09:25:22 +08:00
parent a6bfda30e1
commit 2055b13b90
58 changed files with 5768 additions and 1898 deletions

View File

@@ -15,6 +15,9 @@
floor-top="208px"
tools-top="450px"
:tools="['回正', '2D']"
:indoor-model-source="indoorModelSource"
:floors="guideFloors"
:normalize-floor-id="normalizeGuideFloorId"
@search-tap="handleSearchTap"
@mode-change="handleModeChange"
@floor-change="handleFloorChange"
@@ -115,16 +118,19 @@ import { onLoad } from '@dcloudio/uni-app'
import GuidePageFrame from '@/components/navigation/GuidePageFrame.vue'
import GuideMapShell from '@/components/navigation/GuideMapShell.vue'
import {
NAV_FLOOR_OPTIONS,
NAV_ROUTE_UNAVAILABLE_MESSAGE,
formatNavFloorLabel,
isPoiAccessible,
loadCleanNavPoiById
} from '@/services/navAssets'
guideUseCase
} from '@/usecases/guideUseCase'
import {
toFacilityDetailViewModel,
type FacilityDetailViewModel
} from '@/view-models/guideViewModels'
import {
navigateToGuideTopTab,
type GuideTopTab
} from '@/utils/guideTopTabs'
import type {
MuseumFloor
} from '@/domain/museum'
interface ConfirmedStart {
label: string
@@ -132,19 +138,23 @@ interface ConfirmedStart {
source: 'facility-detail'
}
const facility = ref({
const indoorModelSource = guideUseCase.getModelSource()
const guideFloors = ref<MuseumFloor[]>([])
const normalizeGuideFloorId = (labelOrId: string) => guideUseCase.normalizeFloorId(labelOrId)
const facility = ref<FacilityDetailViewModel>({
id: '',
name: '目标位置',
status: '可预览',
location: 'clean 导览数据点位',
traffic: NAV_ROUTE_UNAVAILABLE_MESSAGE,
traffic: guideUseCase.getRouteReadiness().message,
tags: ['三维位置', 'clean 数据']
})
const isStartPanelOpen = ref(false)
const selectedStartFloor = ref('1F')
const selectedStartArea = ref('服务台附近')
const confirmedStart = ref<ConfirmedStart | null>(null)
const startFloors = NAV_FLOOR_OPTIONS.map((floor) => floor.label)
const startFloors = computed(() => guideFloors.value.map((floor) => floor.label))
const startAreas = ['主入口', '服务台附近', '停车场入口']
const pendingStartLabel = computed(() => `${selectedStartFloor.value} ${selectedStartArea.value}`)
@@ -165,7 +175,23 @@ const syncDraftStartSelection = () => {
selectedStartArea.value = resolveConfirmedStartArea()
}
const loadGuideFloors = async () => {
try {
const floors = await guideUseCase.getFloors()
guideFloors.value = floors
selectedStartFloor.value = floors.find((floor) => floor.label === selectedStartFloor.value)?.label
|| floors.find((floor) => floor.id === 'L1')?.label
|| floors[0]?.label
|| selectedStartFloor.value
} catch (error) {
console.error('加载导览楼层失败:', error)
guideFloors.value = []
}
}
onLoad(async (options: any) => {
void loadGuideFloors()
if (options.id) {
facility.value.id = options.id
}
@@ -177,22 +203,13 @@ onLoad(async (options: any) => {
if (!facility.value.id) return
try {
const poi = await loadCleanNavPoiById(facility.value.id)
const poi = await guideUseCase.getPoiById(facility.value.id)
if (!poi) return
const floor = formatNavFloorLabel(poi.floorId)
facility.value = {
id: poi.id,
name: poi.name,
status: '可预览',
location: `${floor} · ${poi.primaryCategoryZh}`,
traffic: NAV_ROUTE_UNAVAILABLE_MESSAGE,
tags: [
floor,
poi.primaryCategoryZh,
isPoiAccessible(poi) ? '无障碍相关' : '展示点位'
]
}
facility.value = toFacilityDetailViewModel(
poi,
guideUseCase.getRouteReadiness().message
)
} catch (error) {
console.error('加载 clean 设施详情失败:', error)
}