修复馆内模型初始视图与点位返回复位
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
lyf
2026-07-15 18:20:18 +08:00
parent 1072b25c46
commit 6566d38cb0
11 changed files with 568 additions and 44 deletions

View File

@@ -918,11 +918,9 @@ const loadGuideFloors = async () => {
? normalizeGuideFloorId(activeGuideFloor.value)
: ''
activeGuideFloor.value = floors.find((floor) => floor.id === normalizedActiveFloorId)?.id
|| floors.find((floor) => floor.label === '1F')?.id
|| floors[0]?.id
|| activeGuideFloor.value
renderedFloorId.value = activeGuideFloor.value
guideModelState.initializeModel(activeGuideFloor.value)
} catch (error) {
console.error('加载导览楼层失败:', error)
guideFloors.value = []
@@ -1038,7 +1036,12 @@ const handleAutoSwitch = (event: { from: 'overview' | 'floor'; to: 'overview' |
}
const handleInitialModelReady = (event: { view: GuideIndoorView; floorId?: string; elapsedMs?: number }) => {
guideModelState.initializeModel(event.floorId || activeGuideFloor.value)
const readyFloorId = event.floorId || activeGuideFloor.value
if (event.view === 'overview' && readyFloorId) {
activeGuideFloor.value = readyFloorId
renderedFloorId.value = readyFloorId
guideModelState.initializeModel({ view: event.view, floorId: readyFloorId })
}
settleLaunchOverlayByModel('ready', event)
if (pendingGuideModelResetUntilReady) {
const context = pendingGuideModelResetUntilReady
@@ -1127,12 +1130,49 @@ const resolveSelectedPoiHall = async (): Promise<MuseumHall | null> => {
}) || null
}
const navigateToHallDetail = (hallId: string) => {
const navigateToPoiDetail = ({
url,
floorId,
failureMessage
}: {
url: string
floorId: string
failureMessage: string
}) => {
const returnContext = guideModelState.beginPoiDetailReturn(floorId)
uni.navigateTo({
url: `/pages/hall/detail?id=${encodeURIComponent(hallId)}&tab=explain`
url,
success: () => {
guideModelState.confirmPoiDetailReturn(returnContext.requestId)
},
fail: () => {
guideModelState.cancelPoiDetailReturn(returnContext.requestId)
uni.showToast({
title: failureMessage,
icon: 'none'
})
}
})
}
const navigateFromSelectedPoiToDetail = (url: string) => {
const poi = selectedGuidePoi.value
if (!poi) return
// Detail pages do not own the mounted renderer. The homepage consumes this once on return.
navigateToPoiDetail({
url,
floorId: poi.floorId,
failureMessage: '讲解详情打开失败,请重试'
})
}
const navigateToHallDetail = (hallId: string) => {
navigateFromSelectedPoiToDetail(
`/pages/hall/detail?id=${encodeURIComponent(hallId)}&tab=explain`
)
}
const handleViewSelectedHall = async () => {
const hall = await resolveSelectedPoiHall()
if (!hall) {
@@ -1166,9 +1206,9 @@ const handleSelectedPoiRelated = async () => {
}
if (firstExhibit?.exhibitId) {
uni.navigateTo({
url: `/pages/exhibit/detail?id=${encodeURIComponent(firstExhibit.exhibitId)}&tab=explain`
})
navigateFromSelectedPoiToDetail(
`/pages/exhibit/detail?id=${encodeURIComponent(firstExhibit.exhibitId)}&tab=explain`
)
return
}
@@ -1470,7 +1510,7 @@ const resetGuideModelToInitial = async ({
floorId: string
}) => {
const initial = guideModelState.initialState.value
guideModelState.invalidatePendingRequests()
const resetRequestId = guideModelState.invalidatePendingRequests()
searchTargetFocusRequest.value = null
searchVisiblePoiIds.value = null
homeCategoryModeActive.value = false
@@ -1490,7 +1530,6 @@ const resetGuideModelToInitial = async ({
guideOutdoorState.value = 'home'
indoorView.value = 'floor'
activeGuideFloor.value = floorId || initial.defaultActiveFloorId || activeGuideFloor.value
renderedFloorId.value = activeGuideFloor.value
closeArrivalPanel()
await homeSearchPanelRef.value?.resetSearchState?.()
closeHomeSearchDock()
@@ -1500,12 +1539,15 @@ const resetGuideModelToInitial = async ({
floorId: activeGuideFloor.value,
reason: 'poi-detail-close'
})
if (!resetApplied) {
if (resetApplied) {
renderedFloorId.value = activeGuideFloor.value
pendingGuideModelResetUntilReady = null
} else {
// The renderer is still becoming ready; retain only the latest requested reset.
pendingGuideModelResetUntilReady = Object.freeze({
floorId: activeGuideFloor.value,
resetMode: 'floor-baseline',
requestId: guideModelState.invalidatePendingRequests()
requestId: resetRequestId
})
}
console.info('馆内三维模型已恢复统一初始状态:', { reason })
@@ -1617,16 +1659,10 @@ const createSearchDetailUrl = (poi: MuseumPoi, context: PoiSearchContext) => {
const handleHomeSearchResultTap = async (poi: MuseumPoi, context: PoiSearchContext) => {
// The homepage keeps its renderer mounted; detail close is consumed by onShow once.
searchTargetFocusRequest.value = null
guideModelState.beginPoiDetailReturn(poi.floorId)
uni.navigateTo({
navigateToPoiDetail({
url: createSearchDetailUrl(poi, context),
fail: () => {
guideModelState.cancelPoiDetailReturn()
uni.showToast({
title: '点位详情打开失败,请重试',
icon: 'none'
})
}
floorId: poi.floorId,
failureMessage: '点位详情打开失败,请重试'
})
}