40 lines
1.4 KiB
JavaScript
40 lines
1.4 KiB
JavaScript
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));
|