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

@@ -13,6 +13,9 @@
search-top="60px"
mode-top="104px"
floor-top="208px"
:indoor-model-source="indoorModelSource"
:floors="guideFloors"
:normalize-floor-id="normalizeGuideFloorId"
@search-tap="handleSearchTap"
@mode-change="handleModeChange"
@floor-change="handleFloorChange"
@@ -100,31 +103,31 @@ import { onLoad } from '@dcloudio/uni-app'
import GuidePageFrame from '@/components/navigation/GuidePageFrame.vue'
import GuideMapShell from '@/components/navigation/GuideMapShell.vue'
import {
formatNavFloorLabel,
isPoiAccessible,
searchCleanNavPois,
type CleanNavPoi
} from '@/services/navAssets'
guideUseCase
} from '@/usecases/guideUseCase'
import {
toFacilityResultViewModel,
type FacilityResultViewModel
} from '@/view-models/guideViewModels'
import {
navigateToGuideTopTab,
type GuideTopTab
} from '@/utils/guideTopTabs'
import type {
MuseumFloor
} from '@/domain/museum'
interface FilterItem {
id: 'all' | 'accessible' | 'floor'
label: string
}
interface FacilityResult {
id: string
name: string
floor: string
meta: string
accessible: boolean
action: '查看'
}
interface FacilityResult extends FacilityResultViewModel {}
const searchKeyword = ref('卫生间')
const indoorModelSource = guideUseCase.getModelSource()
const guideFloors = ref<MuseumFloor[]>([])
const normalizeGuideFloorId = (labelOrId: string) => guideUseCase.normalizeFloorId(labelOrId)
const searchDraftKeyword = ref('')
const currentFilter = ref<FilterItem['id']>('all')
const isLoading = ref(false)
@@ -140,18 +143,6 @@ const filters: FilterItem[] = [
const facilities = ref<FacilityResult[]>([])
const toFacilityResult = (poi: CleanNavPoi): FacilityResult => {
const floor = formatNavFloorLabel(poi.floorId)
return {
id: poi.id,
name: poi.name,
floor,
meta: `${floor}${poi.primaryCategoryZh}${poi.navigationReadiness || '展示点位'}`,
accessible: isPoiAccessible(poi),
action: '查看'
}
}
const visibleFacilities = computed(() => {
if (currentFilter.value === 'accessible') {
return facilities.value.filter((item) => item.accessible)
@@ -170,10 +161,10 @@ const resultTitle = computed(() => {
const loadFacilityResults = async () => {
isLoading.value = true
try {
const pois = await searchCleanNavPois(searchKeyword.value)
const pois = await guideUseCase.searchPois(searchKeyword.value)
facilities.value = pois
.filter((poi) => poi.primaryCategory !== 'touring_poi')
.map(toFacilityResult)
.filter((poi) => poi.primaryCategory.id !== 'touring_poi')
.map(toFacilityResultViewModel)
} catch (error) {
console.error('加载 clean 导览搜索结果失败:', error)
facilities.value = []
@@ -186,11 +177,21 @@ const loadFacilityResults = async () => {
}
}
const loadGuideFloors = async () => {
try {
guideFloors.value = await guideUseCase.getFloors()
} catch (error) {
console.error('加载导览楼层失败:', error)
guideFloors.value = []
}
}
onLoad((options: any) => {
if (options.keyword) {
searchKeyword.value = decodeURIComponent(options.keyword)
}
searchDraftKeyword.value = searchKeyword.value
void loadGuideFloors()
void loadFacilityResults()
})