修复点位楼层跳转并优化模型加载缓存

This commit is contained in:
lyf
2026-07-02 16:42:38 +08:00
parent 7cda427de9
commit 9b1f855515
8 changed files with 750 additions and 41 deletions

View File

@@ -32,6 +32,11 @@ import {
type StaticNavAssetsProvider,
type StaticNavPoiPayload
} from '@/data/providers/staticNavAssetsProvider'
import {
mapWithConcurrency
} from '@/utils/concurrency'
const SDK_FLOOR_BUNDLE_CONCURRENCY = 2
const toRenderPoi = (poi: StaticNavPoiPayload): GuideRenderPoi => ({
id: poi.id,
@@ -105,6 +110,10 @@ const resolveSgsAssetUrl = (url?: string | null) => {
return origin ? `${origin}${normalizedUrl}` : normalizedUrl
}
const uniqueModelUrls = (urls: Array<string | undefined | null>) => Array.from(new Set(
urls.map(resolveSgsAssetUrl).filter(Boolean)
))
const sortSgsFloors = (floors: SgsSdkFloorSummaryPayload[]) => [...floors]
.sort(compareFloorsTopToBottom)
@@ -224,13 +233,36 @@ export class SgsSdkGuideModelRepository implements GuideModelRepository {
const floors = allFloors.filter(isIndoorNavigableFloor)
this.floorsCache = floors
const bundles = await Promise.all(
floors.map((floor) => this.provider.getFloorBundle(String(floor.floorId)))
const bundleResults = await mapWithConcurrency(
floors,
SDK_FLOOR_BUNDLE_CONCURRENCY,
async (floor) => {
try {
return {
floor,
bundle: await this.provider.getFloorBundle(String(floor.floorId)),
error: null
}
} catch (error) {
warnSgsGuideModelDiagnostics('floor bundle request failed', {
floorId: String(floor.floorId),
floorCode: floor.floorCode,
error: error instanceof Error ? error.message : String(error)
})
return {
floor,
bundle: null,
error
}
}
}
)
const floorModelItems = floors
.map((floor, index) => {
const bundle = bundles[index]
const floorModelItems: GuideModelFloorAsset[] = bundleResults
.map((result): GuideModelFloorAsset | null => {
const { floor, bundle } = result
if (!bundle) return null
const bundleFloor = bundle.floor
if (bundleFloor && String(bundleFloor.floorId) !== String(floor.floorId)) {
warnSgsGuideModelDiagnostics('floor bundle metadata does not match requested floor', {
@@ -241,7 +273,11 @@ export class SgsSdkGuideModelRepository implements GuideModelRepository {
})
}
const modelUrl = resolveSgsAssetUrl(bundle.model?.modelUrl || bundle.model?.fallbackModelUrl)
const modelUrls = uniqueModelUrls([
bundle.model?.modelUrl,
bundle.model?.fallbackModelUrl
])
const modelUrl = modelUrls[0] || ''
const label = formatSgsFloorLabel(floor.floorCode, floor.floorName)
return {
@@ -249,18 +285,22 @@ export class SgsSdkGuideModelRepository implements GuideModelRepository {
label,
order: Number(floor.sortOrder || 0),
modelUrl,
modelUrls,
modelMatchKeys: getSgsFloorModelMatchKeys(floor, label)
}
})
.filter((asset) => asset.modelUrl)
.filter((asset): asset is GuideModelFloorAsset => Boolean(asset?.modelUrl))
const overviewFloor = allFloors.find((floor) => !isIndoorNavigableFloor(floor))
const overviewBundle = overviewFloor
? await this.provider.getFloorBundle(String(overviewFloor.floorId)).catch(() => null)
: null
const overviewModelUrl = resolveSgsAssetUrl(
overviewBundle?.model?.modelUrl || overviewBundle?.model?.fallbackModelUrl
) || floorModelItems[0]?.modelUrl || ''
const overviewModelUrls = uniqueModelUrls([
overviewBundle?.model?.modelUrl,
overviewBundle?.model?.fallbackModelUrl,
floorModelItems[0]?.modelUrl
])
const overviewModelUrl = overviewModelUrls[0] || ''
const floorModelUrls = floorModelItems.map((asset) => asset.modelUrl)
const floorAssets: GuideModelFloorAsset[] = floorModelItems.map((asset) => ({
...asset,
@@ -269,6 +309,7 @@ export class SgsSdkGuideModelRepository implements GuideModelRepository {
return {
overviewModelUrl,
overviewModelUrls,
floors: floorAssets
}
}