feat:语音仪表盘mos和cct显示修复和样式调整

This commit is contained in:
zhongzm
2025-09-19 17:44:41 +08:00
parent 80f72549a2
commit b98f2394b8
2 changed files with 129 additions and 119 deletions

View File

@@ -1096,7 +1096,7 @@ export default {
"tips":"Voice Call Statistics Per Minute", "tips":"Voice Call Statistics Per Minute",
"ne":"NE", "ne":"NE",
"now":"Now", "now":"Now",
"last":"Last", "last":"Past",
"calls":"Calls", "calls":"Calls",
"activeCall":"Active Calls", "activeCall":"Active Calls",
"callMOMT":"MO/MT Call Success Rate", "callMOMT":"MO/MT Call Success Rate",

View File

@@ -218,7 +218,7 @@
import { ref, onMounted, onBeforeUnmount, watch,nextTick } from 'vue' import { ref, onMounted, onBeforeUnmount, watch,nextTick } from 'vue'
import * as echarts from 'echarts/core' import * as echarts from 'echarts/core'
import { LineChart } from 'echarts/charts' import { LineChart } from 'echarts/charts'
import { GridComponent } from 'echarts/components' import { GridComponent ,GraphicComponent} from 'echarts/components'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import useNeInfoStore from '@/store/modules/neinfo' import useNeInfoStore from '@/store/modules/neinfo'
import { WS } from '@/plugins/ws-websocket' import { WS } from '@/plugins/ws-websocket'
@@ -226,7 +226,7 @@ import { listKPIData ,getbusyhour, getMosHour, getCctHour} from '@/api/perfManag
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants' import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
const { t } = useI18n(); const { t } = useI18n();
echarts.use([LineChart, GridComponent, CanvasRenderer]) echarts.use([LineChart, GridComponent, CanvasRenderer, GraphicComponent])
const callsChartRef = ref<HTMLDivElement | null>(null) const callsChartRef = ref<HTMLDivElement | null>(null)
const mosChartRef = ref<HTMLDivElement | null>(null) const mosChartRef = ref<HTMLDivElement | null>(null)
@@ -407,10 +407,14 @@ async function fetchMosData(neId: string) {
} else { } else {
console.warn('获取MOS数据失败或数据为空') console.warn('获取MOS数据失败或数据为空')
mosData.value = null mosData.value = null
// 确保图表也更新为空状态
updateMosChart()
} }
} catch (error) { } catch (error) {
console.error('获取MOS数据出错:', error) console.error('获取MOS数据出错:', error)
mosData.value = null mosData.value = null
// 确保图表也更新为空状态
updateMosChart()
} }
} }
@@ -444,10 +448,14 @@ async function fetchCctData(neId: string) {
} else { } else {
console.warn('获取CCT数据失败或数据为空') console.warn('获取CCT数据失败或数据为空')
cctData.value = null cctData.value = null
// 确保图表也更新为空状态
updateCctChart()
} }
} catch (error) { } catch (error) {
console.error('获取CCT数据出错:', error) console.error('获取CCT数据出错:', error)
cctData.value = null cctData.value = null
// 确保图表也更新为空状态
updateCctChart()
} }
} }
@@ -457,6 +465,9 @@ async function onImsNeChange() {
// 切换网元时,先清空旧数据 // 切换网元时,先清空旧数据
imsRealtimeRawData.value = [] imsRealtimeRawData.value = []
busyHourData.value = null
mosData.value = null
cctData.value = null
// 强制触发Vue响应式更新确保所有计算值立即更新为默认状态 // 强制触发Vue响应式更新确保所有计算值立即更新为默认状态
await nextTick() await nextTick()
@@ -466,6 +477,10 @@ async function onImsNeChange() {
updateFailedCallsChart() updateFailedCallsChart()
updateActiveRegistrationsChart() updateActiveRegistrationsChart()
updateFailedRegistrationsChart() updateFailedRegistrationsChart()
updateCallAttemptsChart()
updateCallCompletionsChart()
updateMosChart()
updateCctChart()
// 先获取历史数据和Busy Hour数据再订阅实时数据 // 先获取历史数据和Busy Hour数据再订阅实时数据
await fetchHistoryData(selectedImsNeId.value) await fetchHistoryData(selectedImsNeId.value)
@@ -1518,7 +1533,8 @@ function updateMosChart() {
type: 'line', symbol: 'none', type: 'line', symbol: 'none',
lineStyle: { width: 2, color: '#d9d9d9' }, lineStyle: { width: 2, color: '#d9d9d9' },
areaStyle: { color: 'rgba(217,217,217,0.1)' } areaStyle: { color: 'rgba(217,217,217,0.1)' }
}] }],
graphic: [] // 清除任何ECharts图形元素
}) })
// 清除所有旧标注 // 清除所有旧标注
@@ -1531,7 +1547,7 @@ function updateMosChart() {
} }
// 从MOS数据中提取MOS值 // 从MOS数据中提取MOS值
const chartData = mosData.value.map((item: any) => Number(item.mosAverage) || 0) const chartData = mosData.value.map((item: any) => Number(item.mosSum) || 0)
// 生成时间轴数据 // 生成时间轴数据
const xAxisData = Array.from({ length: chartData.length }, (_, i) => i + 1) const xAxisData = Array.from({ length: chartData.length }, (_, i) => i + 1)
@@ -1617,7 +1633,8 @@ function updateMosChart() {
z-index: 10; z-index: 10;
` `
// 使用第一个数据点的时间戳计算相对时间 // 使用第一个数据点的时间戳计算相对时间
const oldestTime = Number(mosData.value[0]?.timeGroup) || Date.now() // MOS时间戳是秒级需要转换为毫秒级
const oldestTime = (Number(mosData.value[0]?.timeGroup) || 0) * 1000 || Date.now()
oldestTimeLabel.textContent = calculateRelativeTime(oldestTime) oldestTimeLabel.textContent = calculateRelativeTime(oldestTime)
const nowTimeLabel = document.createElement('div') const nowTimeLabel = document.createElement('div')
@@ -1678,7 +1695,7 @@ function updateCctChart() {
} }
// 从CCT数据中提取CCT值 // 从CCT数据中提取CCT值
const chartData = cctData.value.map((item: any) => Number(item.callConnectionTime) || 0) const chartData = cctData.value.map((item: any) => Number(item.cctSum) || 0)
// 生成时间轴数据 // 生成时间轴数据
const xAxisData = Array.from({ length: chartData.length }, (_, i) => i + 1) const xAxisData = Array.from({ length: chartData.length }, (_, i) => i + 1)
@@ -1764,7 +1781,8 @@ function updateCctChart() {
z-index: 10; z-index: 10;
` `
// 使用第一个数据点的时间戳计算相对时间 // 使用第一个数据点的时间戳计算相对时间
const oldestTime = Number(cctData.value[0]?.timeGroup) || Date.now() // CCT时间戳是秒级需要转换为毫秒级
const oldestTime = (Number(cctData.value[0]?.timeGroup) || 0) * 1000 || Date.now()
oldestTimeLabel.textContent = calculateRelativeTime(oldestTime) oldestTimeLabel.textContent = calculateRelativeTime(oldestTime)
const nowTimeLabel = document.createElement('div') const nowTimeLabel = document.createElement('div')
@@ -1880,60 +1898,10 @@ onMounted(() => {
chart.setOption(defaultChartOption) chart.setOption(defaultChartOption)
} }
// MOS - 保持原有的模拟数据 // MOS
if (mosChartRef.value) { if (mosChartRef.value) {
const chart = echarts.init(mosChartRef.value) const chart = echarts.init(mosChartRef.value)
const mosData = [4.62, 4.50, 4.40, 4.35, 4.30] chart.setOption(defaultChartOption)
const maxValue = Math.max(...mosData)
const minValue = Math.min(...mosData)
const latestValue = mosData[mosData.length - 1]
chart.setOption({
grid: { left: 0, right: 30, top: 10, bottom: 10 }, // 增加右侧边距
xAxis: { type: 'category', show: false, data: [1,2,3,4,5] },
yAxis: { type: 'value', show: false },
series: [{
data: mosData,
type: 'line', symbol: 'none',
lineStyle: { width: 2, color: '#52c41a' },
areaStyle: { color: 'rgba(82,196,26,0.1)' }
}],
graphic: [
{
type: 'text',
right: 8,
top: 8,
style: {
text: maxValue.toFixed(2),
fontSize: 12,
fill: '#666',
fontWeight: 'bold'
}
},
{
type: 'text',
right: 8,
top: '50%',
style: {
text: latestValue.toFixed(2),
fontSize: 12,
fill: '#52c41a',
fontWeight: 'bold'
}
},
{
type: 'text',
right: 8,
bottom: 8,
style: {
text: minValue.toFixed(2),
fontSize: 12,
fill: '#666',
fontWeight: 'bold'
}
}
]
})
} }
// failed calls // failed calls
@@ -2017,13 +1985,13 @@ function calculateMTValue() {
// 计算MO变化值完善版本 // 计算MO变化值完善版本
function calculateMOChange() { function calculateMOChange() {
if (imsRealtimeRawData.value.length < 2) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (imsRealtimeRawData.value.length < 2) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
// 获取最新和上一个数据点 // 获取最新和上一个数据点
const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1] const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1]
const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2] const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2]
if (!latestData?.data || !previousData?.data) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (!latestData?.data || !previousData?.data) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const latestKpi = latestData.data const latestKpi = latestData.data
const previousKpi = previousData.data const previousKpi = previousData.data
@@ -2032,31 +2000,31 @@ function calculateMOChange() {
const previousMO = calculateMOValueFromData(previousKpi) const previousMO = calculateMOValueFromData(previousKpi)
// 检查MO是否有有效值 // 检查MO是否有有效值
if (latestMO === '-' || previousMO === '-') return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (latestMO === '-' || previousMO === '-') return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
// 计算变化幅度 // 计算变化幅度
const change = latestMO - previousMO const change = latestMO - previousMO
// 检查是否有变化 // 检查是否有变化
if (change === 0) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (change === 0) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const changeText = change > 0 ? `+${change.toFixed(2)}%` : `${change.toFixed(2)}%` const changeText = change > 0 ? `+${change.toFixed(2)}%` : `${change.toFixed(2)}%`
// 计算时间差 // 计算时间差
const timeDiff = calculateTimeDifference(latestData, previousData) const timeDiff = calculateTimeDifference(latestData, previousData)
return `${changeText} ${t('views.perfManage.voiceOverView.last')} ${timeDiff}` return `${t('views.perfManage.voiceOverView.last')} ${timeDiff} ${changeText}`
} }
// 计算MT变化值完善版本 // 计算MT变化值完善版本
function calculateMTChange() { function calculateMTChange() {
if (imsRealtimeRawData.value.length < 2) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (imsRealtimeRawData.value.length < 2) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
// 获取最新和上一个数据点 // 获取最新和上一个数据点
const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1] const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1]
const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2] const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2]
if (!latestData?.data || !previousData?.data) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (!latestData?.data || !previousData?.data) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const latestKpi = latestData.data const latestKpi = latestData.data
const previousKpi = previousData.data const previousKpi = previousData.data
@@ -2065,20 +2033,20 @@ function calculateMTChange() {
const previousMT = calculateMTValueFromData(previousKpi) const previousMT = calculateMTValueFromData(previousKpi)
// 检查MT是否有有效值 // 检查MT是否有有效值
if (latestMT === '-' || previousMT === '-') return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (latestMT === '-' || previousMT === '-') return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
// 计算变化幅度 // 计算变化幅度
const change = latestMT - previousMT const change = latestMT - previousMT
// 检查是否有变化 // 检查是否有变化
if (change === 0) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (change === 0) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const changeText = change > 0 ? `+${change.toFixed(2)}%` : `${change.toFixed(2)}%` const changeText = change > 0 ? `+${change.toFixed(2)}%` : `${change.toFixed(2)}%`
// 计算时间差 // 计算时间差
const timeDiff = calculateTimeDifference(latestData, previousData) const timeDiff = calculateTimeDifference(latestData, previousData)
return `${changeText} ${t('views.perfManage.voiceOverView.last')} ${timeDiff}` return `${t('views.perfManage.voiceOverView.last')} ${timeDiff} ${changeText}`
} }
// 计算时间差函数 // 计算时间差函数
@@ -2119,11 +2087,39 @@ function calculateRelativeTime(timestamp: number) {
const diffHours = Math.floor(diffMinutes / 60) const diffHours = Math.floor(diffMinutes / 60)
if (diffHours >= 1) { if (diffHours >= 1) {
return `${diffHours}h` return `${diffHours} Hour`
} else if (diffMinutes >= 1) { } else if (diffMinutes >= 1) {
return `${diffMinutes} Min`
} else {
return '1 Min'
}
}
// 计算MOS/CCT时间差函数处理秒级时间戳
function calculateMosCctTimeDifference(latestData: any, previousData: any) {
// MOS/CCT的时间戳是秒级需要转换为毫秒级
const latestTime = (Number(latestData.timeGroup) || 0) * 1000
const previousTime = (Number(previousData.timeGroup) || 0) * 1000
// 计算时间差(毫秒)
const diffMs = Math.abs(latestTime - previousTime)
// 转换为秒
const diffSeconds = Math.floor(diffMs / 1000)
// 转换为分钟
const diffMinutes = Math.floor(diffSeconds / 60)
// 转换为小时
const diffHours = Math.floor(diffMinutes / 60)
// 根据时间差返回合适的格式
if (diffHours > 0) {
return `${diffHours}h`
} else if (diffMinutes > 0) {
return `${diffMinutes}m` return `${diffMinutes}m`
} else { } else {
return '1m' return `${diffSeconds}s`
} }
} }
@@ -2161,13 +2157,13 @@ function calculateRegSuccessValue() {
// 计算registration success变化值 // 计算registration success变化值
function calculateRegSuccessChange() { function calculateRegSuccessChange() {
if (imsRealtimeRawData.value.length < 2) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (imsRealtimeRawData.value.length < 2) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
// 获取最新和上一个数据点 // 获取最新和上一个数据点
const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1] const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1]
const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2] const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2]
if (!latestData?.data || !previousData?.data) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (!latestData?.data || !previousData?.data) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const latestKpi = latestData.data const latestKpi = latestData.data
const previousKpi = previousData.data const previousKpi = previousData.data
@@ -2176,20 +2172,20 @@ function calculateRegSuccessChange() {
const previousRegSuccess = calculateRegSuccessValueFromData(previousKpi) const previousRegSuccess = calculateRegSuccessValueFromData(previousKpi)
// 检查registration success是否有有效值 // 检查registration success是否有有效值
if (latestRegSuccess === '-' || previousRegSuccess === '-') return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (latestRegSuccess === '-' || previousRegSuccess === '-') return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
// 计算变化幅度 // 计算变化幅度
const change = latestRegSuccess - previousRegSuccess const change = latestRegSuccess - previousRegSuccess
// 检查是否有变化 // 检查是否有变化
if (change === 0) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (change === 0) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const changeText = change > 0 ? `+${change.toFixed(2)}%` : `${change.toFixed(2)}%` const changeText = change > 0 ? `+${change.toFixed(2)}%` : `${change.toFixed(2)}%`
// 计算时间差 // 计算时间差
const timeDiff = calculateTimeDifference(latestData, previousData) const timeDiff = calculateTimeDifference(latestData, previousData)
return `${changeText} ${t('views.perfManage.voiceOverView.last')} ${timeDiff}` return ` ${t('views.perfManage.voiceOverView.last')} ${timeDiff} ${changeText}`
} }
// 辅助函数从数据中计算registration success值 // 辅助函数从数据中计算registration success值
@@ -2265,13 +2261,13 @@ function calculateActiveCallsArrow() {
// 计算active calls变化值 // 计算active calls变化值
function calculateActiveCallsChange() { function calculateActiveCallsChange() {
if (imsRealtimeRawData.value.length < 2) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (imsRealtimeRawData.value.length < 2) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
// 获取最新和上一个数据点 // 获取最新和上一个数据点
const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1] const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1]
const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2] const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2]
if (!latestData?.data || !previousData?.data) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (!latestData?.data || !previousData?.data) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const latestKpi = latestData.data const latestKpi = latestData.data
const previousKpi = previousData.data const previousKpi = previousData.data
@@ -2284,14 +2280,14 @@ function calculateActiveCallsChange() {
const change = latestActiveCalls - previousActiveCalls const change = latestActiveCalls - previousActiveCalls
// 检查是否有变化 // 检查是否有变化
if (change === 0) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (change === 0) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const changeText = change > 0 ? `+${change.toFixed(0)}` : `${change.toFixed(0)}` const changeText = change > 0 ? `+${change.toFixed(0)}` : `${change.toFixed(0)}`
// 计算时间差 // 计算时间差
const timeDiff = calculateTimeDifference(latestData, previousData) const timeDiff = calculateTimeDifference(latestData, previousData)
return `${changeText} ${t('views.perfManage.voiceOverView.last')} ${timeDiff}` return ` ${t('views.perfManage.voiceOverView.last')} ${timeDiff} ${changeText}`
} }
// 计算failed calls值 // 计算failed calls值
@@ -2370,13 +2366,13 @@ function calculateFailedCallsArrow() {
// 计算failed calls变化值 // 计算failed calls变化值
function calculateFailedCallsChange() { function calculateFailedCallsChange() {
if (imsRealtimeRawData.value.length < 2) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (imsRealtimeRawData.value.length < 2) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
// 获取最新和上一个数据点 // 获取最新和上一个数据点
const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1] const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1]
const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2] const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2]
if (!latestData?.data || !previousData?.data) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (!latestData?.data || !previousData?.data) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const latestKpi = latestData.data const latestKpi = latestData.data
const previousKpi = previousData.data const previousKpi = previousData.data
@@ -2393,14 +2389,14 @@ function calculateFailedCallsChange() {
const change = latestFailedCalls - previousFailedCalls const change = latestFailedCalls - previousFailedCalls
// 检查是否有变化 // 检查是否有变化
if (change === 0) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (change === 0) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const changeText = change > 0 ? `+${change.toFixed(0)}` : `${change.toFixed(0)}` const changeText = change > 0 ? `+${change.toFixed(0)}` : `${change.toFixed(0)}`
// 计算时间差 // 计算时间差
const timeDiff = calculateTimeDifference(latestData, previousData) const timeDiff = calculateTimeDifference(latestData, previousData)
return `${changeText} ${t('views.perfManage.voiceOverView.last')} ${timeDiff}` return `${t('views.perfManage.voiceOverView.last')} ${timeDiff} ${changeText}`
} }
// 计算active registrations值 // 计算active registrations值
@@ -2469,13 +2465,13 @@ function calculateActiveRegistrationsArrow() {
// 计算active registrations变化值 // 计算active registrations变化值
function calculateActiveRegistrationsChange() { function calculateActiveRegistrationsChange() {
if (imsRealtimeRawData.value.length < 2) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (imsRealtimeRawData.value.length < 2) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
// 获取最新和上一个数据点 // 获取最新和上一个数据点
const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1] const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1]
const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2] const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2]
if (!latestData?.data || !previousData?.data) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (!latestData?.data || !previousData?.data) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const latestKpi = latestData.data const latestKpi = latestData.data
const previousKpi = previousData.data const previousKpi = previousData.data
@@ -2488,14 +2484,14 @@ function calculateActiveRegistrationsChange() {
const change = latestActiveRegistrations - previousActiveRegistrations const change = latestActiveRegistrations - previousActiveRegistrations
// 检查是否有变化 // 检查是否有变化
if (change === 0) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (change === 0) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const changeText = change > 0 ? `+${change.toFixed(0)}` : `${change.toFixed(0)}` const changeText = change > 0 ? `+${change.toFixed(0)}` : `${change.toFixed(0)}`
// 计算时间差 // 计算时间差
const timeDiff = calculateTimeDifference(latestData, previousData) const timeDiff = calculateTimeDifference(latestData, previousData)
return `${changeText} ${t('views.perfManage.voiceOverView.last')} ${timeDiff}` return `${t('views.perfManage.voiceOverView.last')} ${timeDiff} ${changeText}`
} }
// 计算failed registrations值 // 计算failed registrations值
@@ -2574,13 +2570,13 @@ function calculateFailedRegistrationsArrow() {
// 计算failed registrations变化值 // 计算failed registrations变化值
function calculateFailedRegistrationsChange() { function calculateFailedRegistrationsChange() {
if (imsRealtimeRawData.value.length < 2) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (imsRealtimeRawData.value.length < 2) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
// 获取最新和上一个数据点 // 获取最新和上一个数据点
const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1] const latestData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 1]
const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2] const previousData = imsRealtimeRawData.value[imsRealtimeRawData.value.length - 2]
if (!latestData?.data || !previousData?.data) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (!latestData?.data || !previousData?.data) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const latestKpi = latestData.data const latestKpi = latestData.data
const previousKpi = previousData.data const previousKpi = previousData.data
@@ -2597,14 +2593,14 @@ function calculateFailedRegistrationsChange() {
const change = latestFailedRegistrations - previousFailedRegistrations const change = latestFailedRegistrations - previousFailedRegistrations
// 检查是否有变化 // 检查是否有变化
if (change === 0) return '±0.00%' +t('views.perfManage.voiceOverView.last') +'1m' if (change === 0) return t('views.perfManage.voiceOverView.last') +' 1 Min'+' Smooth'
const changeText = change > 0 ? `+${change.toFixed(0)}` : `${change.toFixed(0)}` const changeText = change > 0 ? `+${change.toFixed(0)}` : `${change.toFixed(0)}`
// 计算时间差 // 计算时间差
const timeDiff = calculateTimeDifference(latestData, previousData) const timeDiff = calculateTimeDifference(latestData, previousData)
return `${changeText} ${t('views.perfManage.voiceOverView.last')} ${timeDiff}` return `${t('views.perfManage.voiceOverView.last')} ${timeDiff} ${changeText}`
} }
// Call Attempts相关计算函数 // Call Attempts相关计算函数
@@ -2642,16 +2638,16 @@ function calculateCallAttemptsArrow() {
} }
function calculateCallAttemptsChange() { function calculateCallAttemptsChange() {
if (!busyHourData.value || busyHourData.value.length < 2) return '±0 ' + t('views.perfManage.voiceOverView.last') + ' 1h' if (!busyHourData.value || busyHourData.value.length < 2) return t('views.perfManage.voiceOverView.last') +' 1 Hour'+' Smooth'
const latestValue = Number(busyHourData.value[busyHourData.value.length - 1].callAttempts) || 0 const latestValue = Number(busyHourData.value[busyHourData.value.length - 1].callAttempts) || 0
const previousValue = Number(busyHourData.value[busyHourData.value.length - 2].callAttempts) || 0 const previousValue = Number(busyHourData.value[busyHourData.value.length - 2].callAttempts) || 0
const change = latestValue - previousValue const change = latestValue - previousValue
if (change === 0) return '±0 ' + t('views.perfManage.voiceOverView.last') + ' 1h' if (change === 0) return t('views.perfManage.voiceOverView.last') +' 1 Hour'+' Smooth'
const changeText = change > 0 ? `+${change}` : `${change}` const changeText = change > 0 ? `+${change}` : `${change}`
return `${changeText} ` + t('views.perfManage.voiceOverView.last') + ' 1h' return t('views.perfManage.voiceOverView.last') + ' 1 Hour'+ ` ${changeText}`
} }
// Call Completions相关计算函数 // Call Completions相关计算函数
@@ -2689,16 +2685,16 @@ function calculateCallCompletionsArrow() {
} }
function calculateCallCompletionsChange() { function calculateCallCompletionsChange() {
if (!busyHourData.value || busyHourData.value.length < 2) return '±0 ' + t('views.perfManage.voiceOverView.last') + ' 1h' if (!busyHourData.value || busyHourData.value.length < 2) return t('views.perfManage.voiceOverView.last') +' 1 Hour'+' Smooth'
const latestValue = Number(busyHourData.value[busyHourData.value.length - 1].callCompletions) || 0 const latestValue = Number(busyHourData.value[busyHourData.value.length - 1].callCompletions) || 0
const previousValue = Number(busyHourData.value[busyHourData.value.length - 2].callCompletions) || 0 const previousValue = Number(busyHourData.value[busyHourData.value.length - 2].callCompletions) || 0
const change = latestValue - previousValue const change = latestValue - previousValue
if (change === 0) return '±0 ' + t('views.perfManage.voiceOverView.last') + ' 1h' if (change === 0) return t('views.perfManage.voiceOverView.last') +' 1 Hour'+' Smooth'
const changeText = change > 0 ? `+${change}` : `${change}` const changeText = change > 0 ? `+${change}` : `${change}`
return `${changeText} ` + t('views.perfManage.voiceOverView.last') + ' 1h' return t('views.perfManage.voiceOverView.last') + ' 1 Hour' +` ${changeText}`
} }
// MOS相关计算函数 // MOS相关计算函数
@@ -2707,15 +2703,15 @@ function calculateMosValue() {
// 获取最新的MOS值数组最后一个元素 // 获取最新的MOS值数组最后一个元素
const latestData = mosData.value[mosData.value.length - 1] const latestData = mosData.value[mosData.value.length - 1]
const mosValue = Number(latestData.mosAverage) || 0 const mosValue = Number(latestData.mosAvg) || 0
return mosValue.toFixed(2) return mosValue.toFixed(2)
} }
function calculateMosArrowDirection() { function calculateMosArrowDirection() {
if (!mosData.value || mosData.value.length < 2) return 'up' if (!mosData.value || mosData.value.length < 2) return 'up'
const latestValue = Number(mosData.value[mosData.value.length - 1].mosAverage) || 0 const latestValue = Number(mosData.value[mosData.value.length - 1].mosAvg) || 0
const previousValue = Number(mosData.value[mosData.value.length - 2].mosAverage) || 0 const previousValue = Number(mosData.value[mosData.value.length - 2].mosAvg) || 0
const change = latestValue - previousValue const change = latestValue - previousValue
if (change > 0) return 'up' if (change > 0) return 'up'
@@ -2726,8 +2722,8 @@ function calculateMosArrowDirection() {
function calculateMosArrow() { function calculateMosArrow() {
if (!mosData.value || mosData.value.length < 2) return '→' if (!mosData.value || mosData.value.length < 2) return '→'
const latestValue = Number(mosData.value[mosData.value.length - 1].mosAverage) || 0 const latestValue = Number(mosData.value[mosData.value.length - 1].mosAvg) || 0
const previousValue = Number(mosData.value[mosData.value.length - 2].mosAverage) || 0 const previousValue = Number(mosData.value[mosData.value.length - 2].mosAvg) || 0
const change = latestValue - previousValue const change = latestValue - previousValue
if (change > 0) return '↗' if (change > 0) return '↗'
@@ -2736,16 +2732,23 @@ function calculateMosArrow() {
} }
function calculateMosChange() { function calculateMosChange() {
if (!mosData.value || mosData.value.length < 2) return '±0.00 ' + t('views.perfManage.voiceOverView.last') + ' 1h' if (!mosData.value || mosData.value.length < 2) return t('views.perfManage.voiceOverView.last') +' 1 Hour'+' Smooth'
const latestValue = Number(mosData.value[mosData.value.length - 1].mosAverage) || 0 const latestData = mosData.value[mosData.value.length - 1]
const previousValue = Number(mosData.value[mosData.value.length - 2].mosAverage) || 0 const previousData = mosData.value[mosData.value.length - 2]
const latestValue = Number(latestData.mosAvg) || 0
const previousValue = Number(previousData.mosAvg) || 0
const change = latestValue - previousValue const change = latestValue - previousValue
if (change === 0) return '±0.00 ' + t('views.perfManage.voiceOverView.last') + ' 1h' if (change === 0) return t('views.perfManage.voiceOverView.last') +' 1 Hour'+' Smooth'
const changeText = change > 0 ? `+${change.toFixed(2)}` : `${change.toFixed(2)}` const changeText = change > 0 ? `+${change.toFixed(2)}` : `${change.toFixed(2)}`
return `${changeText} ` + t('views.perfManage.voiceOverView.last') + ' 1h'
// 计算实际时间差
const timeDiff = calculateMosCctTimeDifference(latestData, previousData)
return t('views.perfManage.voiceOverView.last') + ' ' + timeDiff +` ${changeText}`
} }
// CCT相关计算函数 // CCT相关计算函数
@@ -2754,15 +2757,15 @@ function calculateCctValue() {
// 获取最新的CCT值数组最后一个元素 // 获取最新的CCT值数组最后一个元素
const latestData = cctData.value[cctData.value.length - 1] const latestData = cctData.value[cctData.value.length - 1]
const cctValue = Number(latestData.callConnectionTime) || 0 const cctValue = Number(latestData.cctAvg) || 0
return cctValue.toFixed(2) return cctValue.toFixed(2)
} }
function calculateCctArrowDirection() { function calculateCctArrowDirection() {
if (!cctData.value || cctData.value.length < 2) return 'up' if (!cctData.value || cctData.value.length < 2) return 'up'
const latestValue = Number(cctData.value[cctData.value.length - 1].callConnectionTime) || 0 const latestValue = Number(cctData.value[cctData.value.length - 1].cctAvg) || 0
const previousValue = Number(cctData.value[cctData.value.length - 2].callConnectionTime) || 0 const previousValue = Number(cctData.value[cctData.value.length - 2].cctAvg) || 0
const change = latestValue - previousValue const change = latestValue - previousValue
if (change > 0) return 'up' if (change > 0) return 'up'
@@ -2773,8 +2776,8 @@ function calculateCctArrowDirection() {
function calculateCctArrow() { function calculateCctArrow() {
if (!cctData.value || cctData.value.length < 2) return '→' if (!cctData.value || cctData.value.length < 2) return '→'
const latestValue = Number(cctData.value[cctData.value.length - 1].callConnectionTime) || 0 const latestValue = Number(cctData.value[cctData.value.length - 1].cctAvg) || 0
const previousValue = Number(cctData.value[cctData.value.length - 2].callConnectionTime) || 0 const previousValue = Number(cctData.value[cctData.value.length - 2].cctAvg) || 0
const change = latestValue - previousValue const change = latestValue - previousValue
if (change > 0) return '↗' if (change > 0) return '↗'
@@ -2783,16 +2786,23 @@ function calculateCctArrow() {
} }
function calculateCctChange() { function calculateCctChange() {
if (!cctData.value || cctData.value.length < 2) return '±0.00 ' + t('views.perfManage.voiceOverView.last') + ' 1h' if (!cctData.value || cctData.value.length < 2) return t('views.perfManage.voiceOverView.last') +' 1 Hour'+' Smooth'
const latestValue = Number(cctData.value[cctData.value.length - 1].callConnectionTime) || 0 const latestData = cctData.value[cctData.value.length - 1]
const previousValue = Number(cctData.value[cctData.value.length - 2].callConnectionTime) || 0 const previousData = cctData.value[cctData.value.length - 2]
const latestValue = Number(latestData.cctAvg) || 0
const previousValue = Number(previousData.cctAvg) || 0
const change = latestValue - previousValue const change = latestValue - previousValue
if (change === 0) return '±0.00 ' + t('views.perfManage.voiceOverView.last') + ' 1h' if (change === 0) return t('views.perfManage.voiceOverView.last') +' 1 Hour'+' Smooth'
const changeText = change > 0 ? `+${change.toFixed(2)}` : `${change.toFixed(2)}` const changeText = change > 0 ? `+${change.toFixed(2)}` : `${change.toFixed(2)}`
return `${changeText} ` + t('views.perfManage.voiceOverView.last') + ' 1h'
// 计算实际时间差
const timeDiff = calculateMosCctTimeDifference(latestData, previousData)
return t('views.perfManage.voiceOverView.last') + ' ' + timeDiff + ` ${changeText}`
} }
// 测试数据更新 // 测试数据更新