修正楼层显示顺序

This commit is contained in:
lyf
2026-06-28 19:23:27 +08:00
parent 32c98723e2
commit c4d819021f
5 changed files with 74 additions and 17 deletions

View File

@@ -11,6 +11,8 @@ interface FloorLike {
floorName?: string | null
name?: string | null
modelGroup?: string | null
order?: number | null
sortOrder?: number | null
}
const indoorFloorCodePattern = /^L-?\d+(?:\.\d+)?$/i
@@ -22,6 +24,63 @@ const normalizeValue = (value: unknown) => (
value === null || typeof value === 'undefined' ? '' : String(value).trim()
)
const parseFloorLevelFromToken = (value: unknown) => {
const normalized = normalizeValue(value).toUpperCase()
if (!normalized || isNonNavigableFloorToken(normalized)) return Number.NaN
const basementMatch = normalized.match(/^B(\d+(?:\.\d+)?)$/)
if (basementMatch) return -Number(basementMatch[1])
const prefixedFloorMatch = normalized.match(/^F(\d+(?:\.\d+)?)$/)
if (prefixedFloorMatch) return Number(prefixedFloorMatch[1])
const labelMatch = normalized.match(/^(\d+(?:\.\d+)?)F$/)
if (labelMatch) return Number(labelMatch[1])
const codeMatch = normalized.match(/^L(-?\d+(?:\.\d+)?)$/)
if (codeMatch) return Number(codeMatch[1])
return Number.NaN
}
export const getFloorSortLevel = (floor: FloorLike | null | undefined) => {
if (!floor) return Number.NaN
const semanticTokens = [
floor.label,
floor.floorCode,
floor.floorName,
floor.name,
floor.modelGroup,
floor.id,
floor.floorId
]
for (const token of semanticTokens) {
const level = parseFloorLevelFromToken(token)
if (Number.isFinite(level)) return level
}
const order = Number(floor.order ?? floor.sortOrder)
return Number.isFinite(order) ? order : Number.NaN
}
export const compareFloorsTopToBottom = (a: FloorLike, b: FloorLike) => {
const aLevel = getFloorSortLevel(a)
const bLevel = getFloorSortLevel(b)
if (Number.isFinite(aLevel) && Number.isFinite(bLevel) && aLevel !== bLevel) {
return bLevel - aLevel
}
if (Number.isFinite(aLevel) && !Number.isFinite(bLevel)) return -1
if (!Number.isFinite(aLevel) && Number.isFinite(bLevel)) return 1
const aLabel = normalizeValue(a.label || a.floorCode || a.floorName || a.id || a.floorId)
const bLabel = normalizeValue(b.label || b.floorCode || b.floorName || b.id || b.floorId)
return aLabel.localeCompare(bLabel, 'zh-Hans-CN')
}
export const isNonNavigableFloorToken = (value: unknown) => {
const normalized = normalizeValue(value)
return Boolean(normalized && nonNavigableFloorPattern.test(normalized))