diff --git a/src/pages/index/index.vue b/src/pages/index/index.vue index cda4413..7f7ff0e 100644 --- a/src/pages/index/index.vue +++ b/src/pages/index/index.vue @@ -382,6 +382,7 @@ const topTabFromHash = () => { const launchOverlayMinDisplayMs = 700 const launchOverlayGuideTimeoutMs = 12000 const launchOverlayNonGuideTimeoutMs = 900 +const launchOverlayDefaultText = '正在进入自然导览' const shouldShowLaunchOverlay = () => { if (typeof window === 'undefined') return false @@ -407,7 +408,7 @@ const currentTab = ref(initialTopTab()) const launchOverlayVisible = ref(shouldShowLaunchOverlay()) const launchOverlayLeaving = ref(false) const launchProgress = ref(8) -const launchLoadingText = ref('正在初始化三维场景') +const launchLoadingText = ref(launchOverlayDefaultText) const launchInitialModelSettled = ref(false) const launchOverlayRecoverable = ref(false) const launchImageLoaded = ref(false) @@ -499,6 +500,26 @@ const shouldWaitForLaunchModel = () => ( && is3DMode.value ) +const continueLaunchWithoutInitialModel = (reason: string, event?: { view: GuideIndoorView; floorId?: string; message?: string; elapsedMs?: number }) => { + if (!launchOverlayVisible.value || launchOverlayLeaving.value) return + + console.warn('首页前置加载页未等待初始三维模型,已进入馆外导览:', { + reason, + event + }) + + launchInitialModelSettled.value = true + launchOverlayRecoverable.value = false + launchLoadingText.value = launchOverlayDefaultText + launchProgress.value = Math.max(launchProgress.value, 96) + is3DMode.value = false + guideOutdoorState.value = 'home' + selectedGuidePoi.value = null + isPoiCardCollapsed.value = false + isSimulatingRoute.value = false + hideLaunchOverlay() +} + const startLaunchOverlay = () => { if (!launchOverlayVisible.value) return @@ -507,9 +528,7 @@ const startLaunchOverlay = () => { launchOverlayRecoverable.value = false launchOverlayStartedAt = Date.now() launchProgress.value = shouldWaitForLaunchModel() ? 8 : 68 - launchLoadingText.value = shouldWaitForLaunchModel() - ? '正在初始化三维场景' - : '正在进入自然导览' + launchLoadingText.value = launchOverlayDefaultText const timeoutMs = shouldWaitForLaunchModel() ? launchOverlayGuideTimeoutMs @@ -517,10 +536,7 @@ const startLaunchOverlay = () => { launchOverlayFallbackTimer = setTimeout(() => { if (shouldWaitForLaunchModel() && !launchInitialModelSettled.value) { - launchOverlayRecoverable.value = true - launchProgress.value = Math.min(96, Math.max(launchProgress.value, 92)) - launchLoadingText.value = '三维场景加载较慢,仍在等待模型就绪' - console.warn(`首页前置加载页等待模型超过 ${timeoutMs}ms,继续等待真实模型 ready`) + continueLaunchWithoutInitialModel('timeout') return } hideLaunchOverlay() @@ -532,7 +548,7 @@ const handleInitialModelProgress = (event: { progress: number; message: string; launchOverlayRecoverable.value = false launchProgress.value = Math.min(99, Math.max(8, event.progress)) - launchLoadingText.value = event.message || '正在加载三维场景' + launchLoadingText.value = launchOverlayDefaultText } const settleLaunchOverlayByModel = (status: 'ready' | 'failed', event?: { view: GuideIndoorView; floorId?: string; message?: string; elapsedMs?: number }) => { @@ -540,13 +556,11 @@ const settleLaunchOverlayByModel = (status: 'ready' | 'failed', event?: { view: launchOverlayRecoverable.value = status === 'failed' if (status === 'failed') { - launchProgress.value = Math.min(launchProgress.value, 96) - launchLoadingText.value = event?.message || '三维场景加载失败' - console.warn('首页前置加载页收到初始模型加载失败,等待用户选择重试或进入降级首页:', event) + continueLaunchWithoutInitialModel('failed', event) return } else { launchProgress.value = 100 - launchLoadingText.value = '三维场景已就绪' + launchLoadingText.value = launchOverlayDefaultText console.log('首页前置加载页收到初始模型加载完成:', event) } @@ -571,6 +585,10 @@ const handleLaunchImageError = () => { const handleLaunchContinue = () => { launchOverlayRecoverable.value = false + if (shouldWaitForLaunchModel() && !launchInitialModelSettled.value) { + continueLaunchWithoutInitialModel('manual') + return + } hideLaunchOverlay() }