Files
device-voice-h5/utils/networkSignal.js
sexygoat d679cad55f
All checks were successful
构建并部署前端到生产环境 / build-and-deploy (push) Successful in 51s
fix: singer
2026-04-29 17:09:39 +08:00

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));