修复导览楼层默认进入与模型复位状态
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
lyf
2026-07-17 11:54:08 +08:00
parent 19ecca84e8
commit 122013ccfb
7 changed files with 407 additions and 69 deletions

View File

@@ -93,7 +93,7 @@
<view class="poi-card-soft-action" @tap="collapsePoiCard">
<text class="poi-card-soft-text">收起</text>
</view>
<view class="poi-card-close" @tap="handleGuideSelectionClear">
<view class="poi-card-close" @tap="handleGuidePoiCardClose">
<text class="poi-card-close-text">×</text>
</view>
</view>
@@ -327,7 +327,12 @@ import type {
import {
type TargetPoiFocusRequestViewModel
} from '@/view-models/guideViewModels'
import { useGuideModelState, type PoiDetailReturnContext } from '@/composables/useGuideModelState'
import {
useGuideModelState,
type GuideModelResetReason,
type GuideModelResetRequest
} from '@/composables/useGuideModelState'
import type { ResetViewBaselineResult } from '@/components/map/ThreeMap.vue'
import {
ARRIVAL_TARGETS_BY_TYPE,
type ArrivalSearchTarget,
@@ -422,7 +427,7 @@ const guideMapShellRef = ref<{
view: 'overview' | 'floor'
floorId?: string
reason: 'poi-detail-close' | 'manual-reset' | 'floor-reset'
}) => Promise<boolean> | boolean
}) => Promise<ResetViewBaselineResult> | ResetViewBaselineResult
resetToInitialState?: () => Promise<boolean> | boolean
} | null>(null)
const homeSearchPanelRef = ref<{
@@ -435,8 +440,6 @@ const homeSearchExpanded = ref(false)
const homeCategoryModeActive = ref(false)
const searchVisiblePoiIds = ref<string[] | null>(null)
const searchTargetFocusRequest = ref<TargetPoiFocusRequestViewModel | null>(null)
let pendingGuideModelResetUntilReady: PoiDetailReturnContext | null = null
type PoiSearchOverlayHistoryState = {
museumGuideOverlay?: 'poi-search'
[key: string]: unknown
@@ -578,6 +581,14 @@ const indoorNavAssetBaseUrl = guideUseCase.getAssetBaseUrl()
const indoorModelSource = guideUseCase.getModelSource()
const guideFloors = ref<MuseumFloor[]>([])
const normalizeGuideFloorId = (labelOrId: string) => guideUseCase.normalizeFloorId(labelOrId)
const getPreferredInitialGuideFloorId = (floors: MuseumFloor[]) => (
floors.find((floor) => (
normalizeGuideFloorId(floor.id) === 'L1'
|| normalizeGuideFloorId(floor.label) === 'L1'
))?.id
|| floors[0]?.id
|| ''
)
const getGuideFloorById = (floorId: string) => (
guideFloors.value.find((floor) => floor.id === floorId)
)
@@ -923,7 +934,7 @@ const loadGuideFloors = async () => {
? normalizeGuideFloorId(activeGuideFloor.value)
: ''
activeGuideFloor.value = floors.find((floor) => floor.id === normalizedActiveFloorId)?.id
|| floors[0]?.id
|| getPreferredInitialGuideFloorId(floors)
|| activeGuideFloor.value
renderedFloorId.value = activeGuideFloor.value
} catch (error) {
@@ -1048,10 +1059,13 @@ const handleInitialModelReady = (event: { view: GuideIndoorView; floorId?: strin
guideModelState.initializeModel({ view: event.view, floorId: readyFloorId })
}
settleLaunchOverlayByModel('ready', event)
if (pendingGuideModelResetUntilReady) {
const context = pendingGuideModelResetUntilReady
pendingGuideModelResetUntilReady = null
void resetGuideModelToInitial({ reason: 'queued-poi-detail-close', floorId: context.floorId })
const context = guideModelState.consumePendingViewBaselineReset()
if (context) {
void resetGuideModelToFloorBaseline({
rendererReason: context.rendererReason,
floorId: context.floorId,
request: context
})
}
}
@@ -1086,6 +1100,19 @@ const handleGuideSelectionClear = () => {
isPoiCardCollapsed.value = false
}
const handleGuidePoiCardClose = () => {
const floorId = selectedGuidePoi.value?.floorId
if (!floorId) {
handleGuideSelectionClear()
return
}
void resetGuideModelToFloorBaseline({
rendererReason: 'floor-reset',
floorId
})
}
const collapsePoiCard = () => {
isPoiCardCollapsed.value = true
}
@@ -1507,15 +1534,17 @@ const closeHomeSearchDock = () => {
homeSearchExpanded.value = false
}
const resetGuideModelToInitial = async ({
reason,
floorId
const resetGuideModelToFloorBaseline = async ({
rendererReason,
floorId,
request
}: {
reason: 'poi-detail-close' | 'queued-poi-detail-close'
rendererReason: GuideModelResetReason
floorId: string
request?: GuideModelResetRequest
}) => {
const initial = guideModelState.initialState.value
const resetRequestId = guideModelState.invalidatePendingRequests()
const resetRequest = request || guideModelState.beginViewBaselineReset({ floorId, rendererReason })
searchTargetFocusRequest.value = null
searchVisiblePoiIds.value = null
homeCategoryModeActive.value = false
@@ -1537,32 +1566,32 @@ const resetGuideModelToInitial = async ({
activeGuideFloor.value = floorId || initial.defaultActiveFloorId || activeGuideFloor.value
closeArrivalPanel()
await homeSearchPanelRef.value?.resetSearchState?.()
if (!guideModelState.isCurrentRequest(resetRequest.requestId)) return
closeHomeSearchDock()
const resetApplied = await guideMapShellRef.value?.resetToViewBaseline?.({
const resetResult = await guideMapShellRef.value?.resetToViewBaseline?.({
view: 'floor',
floorId: activeGuideFloor.value,
reason: 'poi-detail-close'
reason: rendererReason
})
if (resetApplied) {
if (!guideModelState.isCurrentRequest(resetRequest.requestId)) return
if (resetResult === 'applied') {
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: resetRequestId
})
guideModelState.completeViewBaselineReset(resetRequest)
console.info('馆内三维模型已恢复楼层视觉基线:', { rendererReason })
} else if (resetResult === 'not-ready' || resetResult === undefined) {
guideModelState.queueViewBaselineReset(resetRequest)
}
console.info('馆内三维模型已恢复统一初始状态:', { reason })
}
onShow(async () => {
await nextTick()
const detailReturnContext = guideModelState.consumePoiDetailReturn()
if (detailReturnContext) {
await resetGuideModelToInitial({ reason: 'poi-detail-close', floorId: detailReturnContext.floorId })
await resetGuideModelToFloorBaseline({
rendererReason: 'poi-detail-close',
floorId: detailReturnContext.floorId
})
return
}