修复导览位置预览与楼层状态
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
lyf
2026-07-19 21:04:57 +08:00
parent 3cba97b786
commit 47dd4c7c87
9 changed files with 128 additions and 28 deletions

View File

@@ -1573,9 +1573,7 @@ const resetGuideModelToFloorBaseline = async ({
indoorView.value = 'floor'
activeGuideFloor.value = floorId || initial.defaultActiveFloorId || activeGuideFloor.value
closeArrivalPanel()
await homeSearchPanelRef.value?.resetSearchState?.()
if (!guideModelState.isCurrentRequest(resetRequest.requestId)) return
closeHomeSearchDock()
const resetResult = await guideMapShellRef.value?.resetToViewBaseline?.({
view: 'floor',
@@ -1600,6 +1598,7 @@ onShow(async () => {
rendererReason: 'poi-detail-close',
floorId: detailReturnContext.floorId
})
await homeSearchPanelRef.value?.restoreResultListScroll?.()
return
}

View File

@@ -89,7 +89,18 @@
</view>
</template>
<view v-if="!hasRouteTarget" class="target-required-card">
<view v-if="routeResolveState === 'loading'" class="target-required-card" role="status" aria-live="polite">
<text class="target-required-title">正在解析目标位置</text>
<text class="target-required-desc">正在加载所需的三维位置数据</text>
</view>
<view v-else-if="routeResolveState === 'error'" class="target-required-card" role="alert">
<text class="target-required-title">目标位置加载失败</text>
<text class="target-required-desc">{{ routeResolveError || '请检查网络后重试。' }}</text>
<button class="target-required-btn" @tap="retryRouteOptions">重新加载</button>
</view>
<view v-else-if="!hasRouteTarget" class="target-required-card">
<text class="target-required-title">请选择目标位置</text>
<text class="target-required-desc">需要先选择展厅或设施才能查看馆内三维位置</text>
<view class="target-required-btn" @tap="handleSelectTarget">
@@ -132,7 +143,7 @@
<view v-if="routePlanError" class="indoor-guide-error">
<text class="indoor-guide-error-text">{{ routePlanError }}</text>
</view>
<view class="start-point-select" @tap="openStartPointPicker">
<view v-if="routeReady" class="start-point-select" role="button" tabindex="0" aria-label="选择位置关系起点" @tap="openStartPointPicker">
<text class="start-point-select-label">起点</text>
<text class="start-point-select-value" :class="{ placeholder: !selectedStartPoint }">
{{ selectedStartPoint ? `${selectedStartPoint.name} · ${selectedStartPoint.floorLabel}` : '请选择起点' }}
@@ -140,6 +151,7 @@
</view>
<view class="indoor-guide-actions">
<view
v-if="routeReady"
class="indoor-guide-btn secondary"
@tap="handleReturnToPreview"
>
@@ -241,6 +253,9 @@ const normalizeGuideFloorId = (labelOrId: string) => guideUseCase.normalizeFloor
const route = ref<RoutePlan>(initialLocationPreviewPlan())
const hasRouteTarget = ref(false)
const routeResolveState = ref<'idle' | 'loading' | 'success' | 'error'>('idle')
const routeResolveError = ref('')
const lastRouteOptions = ref<Record<string, unknown>>({})
const routeViewState = ref<RouteViewState>('preview')
const activeFloor = ref('1F')
const targetFocusRequest = ref<TargetPoiFocusRequest | null>(null)
@@ -388,8 +403,8 @@ const indoorGuideDesc = computed(() => {
}
return routeReady.value
? '可选择起点查看馆内位置关系,当前不作为正式室内导航。'
: routeReadinessMessage.value || '当前可查看位置预览,暂不提供正式室内导航。'
? '可选择明确起点查看位置关系。'
: routeReadinessMessage.value || '当前可查看馆内三维位置预览和馆外入口参考。'
})
const indoorGuideDragOffset = computed(() => Math.max(
@@ -508,9 +523,7 @@ const requestTargetFocus = (target: Partial<RouteTargetLocation> | null, fallbac
const applyRouteOptions = async (options: Record<string, unknown> = {}) => {
const requestSequence = ++routeOptionsSequence
await loadGuideFloors()
await refreshRouteReadinessState()
if (requestSequence !== routeOptionsSequence) return false
lastRouteOptions.value = options
const facilityId = normalizeStringOption(options.facilityId)
const target = normalizeStringOption(options.target)
@@ -518,6 +531,7 @@ const applyRouteOptions = async (options: Record<string, unknown> = {}) => {
const startLocation = createStartLocationFromOptions(options)
if (!facilityId && !target) {
await Promise.all([loadGuideFloors(), refreshRouteReadinessState()])
clearLastGuideLocationPreviewUrl()
hasRouteTarget.value = false
route.value = initialLocationPreviewPlan()
@@ -527,10 +541,22 @@ const applyRouteOptions = async (options: Record<string, unknown> = {}) => {
activeRoutePreview.value = null
isManualLocationPanelOpen.value = false
isIndoorGuidePanelHidden.value = false
routeResolveState.value = 'idle'
return false
}
const matchedPoi = facilityId ? await guideUseCase.getPoiById(facilityId) : null
routeResolveState.value = 'loading'
routeResolveError.value = ''
let matchedPoi: Awaited<ReturnType<typeof guideUseCase.getPoiById>> = null
try {
matchedPoi = facilityId ? await guideUseCase.getPoiById(facilityId) : null
await Promise.all([loadGuideFloors(), refreshRouteReadinessState()])
} catch (error) {
if (requestSequence !== routeOptionsSequence) return false
routeResolveState.value = 'error'
routeResolveError.value = error instanceof Error ? error.message : '目标位置加载失败'
return false
}
if (requestSequence !== routeOptionsSequence) return false
if (!matchedPoi) {
@@ -542,6 +568,7 @@ const applyRouteOptions = async (options: Record<string, unknown> = {}) => {
activeRoutePreview.value = null
isManualLocationPanelOpen.value = false
isIndoorGuidePanelHidden.value = false
routeResolveState.value = 'success'
return false
}
@@ -564,11 +591,15 @@ const applyRouteOptions = async (options: Record<string, unknown> = {}) => {
setLocationPreviewTitle()
saveCurrentLocationPreviewUrl()
routeResolveState.value = 'success'
return true
}
let routeOptionsSequence = 0
const retryRouteOptions = () => {
void applyRouteOptions(lastRouteOptions.value)
}
onLoad((options: any) => {
setLocationPreviewTitle()