const isEmptyValue = (value) => value === null || value === undefined || value === '' || value === '-'; const toFiniteNumber = (value) => { if (isEmptyValue(value)) return null; const numericValue = Number(value); return Number.isFinite(numericValue) ? numericValue : null; }; const clampScore = (value) => Math.min(Math.max(value, 0), 100); export const getNetworkScore = (rsrp, rsrq, sinr) => { const rsrpValue = toFiniteNumber(rsrp); const rsrqValue = toFiniteNumber(rsrq); const sinrValue = toFiniteNumber(sinr); const metrics = [ { score: rsrpValue === null ? null : clampScore((rsrpValue + 120) * 2), weight: 0.5 }, { score: sinrValue === null ? null : clampScore(sinrValue * 5), weight: 0.3 }, { score: rsrqValue === null ? null : clampScore((rsrqValue + 20) * 5), weight: 0.2 } ].filter(item => item.score !== null); if (!metrics.length) return null; const totalWeight = metrics.reduce((sum, item) => sum + item.weight, 0); return metrics.reduce((sum, item) => sum + item.score * item.weight, 0) / totalWeight; }; export const getNetworkLevel = (score) => { if (score === null || score === undefined || !Number.isFinite(score)) return '-'; if (score >= 85) return '极好'; if (score >= 70) return '良好'; if (score >= 50) return '一般'; if (score >= 30) return '较差'; return '很差'; }; export const getNetworkLevelByMetrics = (rsrp, rsrq, sinr) => getNetworkLevel(getNetworkScore(rsrp, rsrq, sinr));