From 97788a3e9ff1b564ba2dda9007fb767d88beb9b1 Mon Sep 17 00:00:00 2001 From: lyf <2514544224@qq.com> Date: Sun, 19 Jul 2026 16:37:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=B8=AD=E9=97=B4=E5=B1=82?= =?UTF-8?q?=E6=A5=BC=E5=B1=82=E5=B1=95=E7=A4=BA=E4=B8=BAMF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/adapters/navAssetsAdapter.ts | 2 ++ src/data/adapters/sgsSdkGuideAdapter.ts | 4 ++-- src/domain/guideFloor.ts | 4 +++- tests/unit/floorPresentation.spec.ts | 17 +++++++++++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 tests/unit/floorPresentation.spec.ts diff --git a/src/data/adapters/navAssetsAdapter.ts b/src/data/adapters/navAssetsAdapter.ts index 5412a7e..a47b616 100644 --- a/src/data/adapters/navAssetsAdapter.ts +++ b/src/data/adapters/navAssetsAdapter.ts @@ -19,11 +19,13 @@ export const formatNavFloorLabel = (floorId: string) => { const value = Number(match[1]) if (Number.isNaN(value)) return floorId + if (value === 1.5) return 'MF' return value < 0 ? `B${Math.abs(value)}` : `${value}F` } export const navFloorIdFromLabel = (labelOrId: string) => { if (floorIdPattern.test(labelOrId)) return labelOrId + if (labelOrId.trim().toUpperCase() === 'MF') return 'L1.5' const basementMatch = labelOrId.match(/^B(\d+(?:\.\d+)?)$/i) if (basementMatch) return `L-${basementMatch[1]}` diff --git a/src/data/adapters/sgsSdkGuideAdapter.ts b/src/data/adapters/sgsSdkGuideAdapter.ts index 814ada3..b3d6a7f 100644 --- a/src/data/adapters/sgsSdkGuideAdapter.ts +++ b/src/data/adapters/sgsSdkGuideAdapter.ts @@ -225,8 +225,8 @@ export const formatSgsFloorLabel = (floorCode?: string | null, floorName?: strin const basementMatch = floorCode?.match(/^L-(\d+(?:\.\d+)?)$/) if (basementMatch) return `B${basementMatch[1]}` - const floorMatch = floorCode?.match(/^L(\d+(?:\.\d+)?)$/) - if (floorMatch) return `${floorMatch[1]}F` + const floorMatch = floorCode?.match(/^L(\d+(?:\.\d+)?)$/) + if (floorMatch) return floorMatch[1] === '1.5' ? 'MF' : `${floorMatch[1]}F` return floorName || floorCode || '未知楼层' } diff --git a/src/domain/guideFloor.ts b/src/domain/guideFloor.ts index b9bcf08..7ed293d 100644 --- a/src/domain/guideFloor.ts +++ b/src/domain/guideFloor.ts @@ -16,7 +16,7 @@ interface FloorLike { } const indoorFloorCodePattern = /^L-?\d+(?:\.\d+)?$/i -const indoorFloorLabelPattern = /^(?:B\d+(?:\.\d+)?|\d+(?:\.\d+)?F)$/i +const indoorFloorLabelPattern = /^(?:B\d+(?:\.\d+)?|\d+(?:\.\d+)?F|MF)$/i const rawNumericIdPattern = /^\d{6,}$/ const nonNavigableFloorPattern = /(EXTERIOR|OUTDOOR|BUILDING|FACADE|EXTERNAL|外立面|建筑外观|建筑外立面|馆外模型|馆外场景|馆外底图|馆外建筑|馆外外观|馆外)$/i @@ -37,6 +37,8 @@ const parseFloorLevelFromToken = (value: unknown) => { const labelMatch = normalized.match(/^(\d+(?:\.\d+)?)F$/) if (labelMatch) return Number(labelMatch[1]) + if (normalized === 'MF') return 1.5 + const codeMatch = normalized.match(/^L(-?\d+(?:\.\d+)?)$/) if (codeMatch) return Number(codeMatch[1]) diff --git a/tests/unit/floorPresentation.spec.ts b/tests/unit/floorPresentation.spec.ts new file mode 100644 index 0000000..d9fc20a --- /dev/null +++ b/tests/unit/floorPresentation.spec.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'vitest' +import { formatNavFloorLabel, navFloorIdFromLabel } from '@/data/adapters/navAssetsAdapter' +import { formatSgsFloorLabel } from '@/data/adapters/sgsSdkGuideAdapter' +import { getFloorSortLevel, isIndoorNavigableFloor } from '@/domain/guideFloor' + +describe('中间层游客展示', () => { + it('将稳定层 ID L1.5 显示为 MF,并可反向解析', () => { + expect(formatNavFloorLabel('L1.5')).toBe('MF') + expect(navFloorIdFromLabel('MF')).toBe('L1.5') + expect(formatSgsFloorLabel('L1.5')).toBe('MF') + }) + + it('MF 保持可导航和正确的楼层排序', () => { + expect(isIndoorNavigableFloor({ label: 'MF' })).toBe(true) + expect(getFloorSortLevel({ label: 'MF' })).toBe(1.5) + }) +})