@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user