修复点位楼层跳转并优化模型加载缓存
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user