修正楼层显示顺序
This commit is contained in:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user