From 6d369a6c59395969ca3854c5611948be2f330861 Mon Sep 17 00:00:00 2001 From: lyf <2514544224@qq.com> Date: Tue, 7 Jul 2026 02:16:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=82=B9=E4=BD=8D=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E5=BF=AB=E6=8D=B7=E5=85=A5=E5=8F=A3=E8=81=94=E5=8A=A8?= =?UTF-8?q?=E5=93=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/search/PoiSearchPanel.vue | 56 +++++++++++++++++++++--- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/src/components/search/PoiSearchPanel.vue b/src/components/search/PoiSearchPanel.vue index ec2254d..580e099 100644 --- a/src/components/search/PoiSearchPanel.vue +++ b/src/components/search/PoiSearchPanel.vue @@ -234,6 +234,7 @@ const activeFloor = ref('1F') const pois = ref([]) const isLoading = ref(false) const initialSpaceLoadError = ref('') +let searchRequestSeq = 0 const showSearchContent = computed(() => props.variant === 'page' || homeExpanded.value) const collapseDragThreshold = 48 @@ -313,6 +314,24 @@ const syncActiveFloor = () => { || displayFloors.value[0].label } +const syncActiveFloorToResults = (items: MuseumPoi[]) => { + if (!displayFloors.value.length) { + activeFloor.value = '' + return + } + + const resultFloorLabels = new Set(items.map((poi) => poi.floorLabel).filter(Boolean)) + if (activeFloor.value && resultFloorLabels.has(activeFloor.value)) return + + const firstFloorWithResult = displayFloors.value.find((floor) => resultFloorLabels.has(floor.label)) + if (firstFloorWithResult) { + activeFloor.value = firstFloorWithResult.label + return + } + + syncActiveFloor() +} + const loadFloors = async () => { try { floors.value = await guideUseCase.getFloors() @@ -325,12 +344,18 @@ const loadFloors = async () => { } const loadPois = async (keyword = '') => { + const requestSeq = ++searchRequestSeq isLoading.value = true initialSpaceLoadError.value = '' + pois.value = [] try { const result = await guideUseCase.searchPois(keyword) - pois.value = result.filter(isVisiblePoi) + if (requestSeq !== searchRequestSeq) return + const visiblePois = result.filter(isVisiblePoi) + pois.value = visiblePois + syncActiveFloorToResults(visiblePois) } catch (error) { + if (requestSeq !== searchRequestSeq) return console.error('加载点位搜索结果失败:', error) pois.value = [] uni.showToast({ @@ -338,18 +363,26 @@ const loadPois = async (keyword = '') => { icon: 'none' }) } finally { - isLoading.value = false + if (requestSeq === searchRequestSeq) { + isLoading.value = false + } } } const loadInitialSpacePoints = async () => { + const requestSeq = ++searchRequestSeq isLoading.value = true initialSpaceLoadError.value = '' + pois.value = [] try { const result = await guideUseCase.getInitialSearchSpacePoints() - pois.value = result.filter(isVisiblePoi) + if (requestSeq !== searchRequestSeq) return + const visiblePois = result.filter(isVisiblePoi) + pois.value = visiblePois + syncActiveFloorToResults(visiblePois) } catch (error) { + if (requestSeq !== searchRequestSeq) return console.error('加载 SDK 空间点位失败:', error) pois.value = [] initialSpaceLoadError.value = '空间点位读取失败' @@ -358,7 +391,9 @@ const loadInitialSpacePoints = async () => { icon: 'none' }) } finally { - isLoading.value = false + if (requestSeq === searchRequestSeq) { + isLoading.value = false + } } } @@ -581,17 +616,24 @@ const handleSearchConfirm = async (event?: any) => { } const searchShortcut = async (shortcut: PoiSearchShortcut) => { + const requestSeq = ++searchRequestSeq searchKeyword.value = shortcut.label searchDraftKeyword.value = shortcut.label expandHomePanel() isLoading.value = true + initialSpaceLoadError.value = '' + pois.value = [] try { const groups = await Promise.all(shortcut.keywords.map((keyword) => guideUseCase.searchPois(keyword))) - pois.value = dedupePois(groups.flat()) + if (requestSeq !== searchRequestSeq) return + const matchedPois = dedupePois(groups.flat()) .filter(isVisiblePoi) .filter((poi) => isPoiMatchingKeywords(poi, shortcut.keywords)) + pois.value = matchedPois + syncActiveFloorToResults(matchedPois) } catch (error) { + if (requestSeq !== searchRequestSeq) return console.error('加载点位分类搜索结果失败:', error) pois.value = [] uni.showToast({ @@ -599,7 +641,9 @@ const searchShortcut = async (shortcut: PoiSearchShortcut) => { icon: 'none' }) } finally { - isLoading.value = false + if (requestSeq === searchRequestSeq) { + isLoading.value = false + } } }