feat:仪表盘增加volte、voip显示

This commit is contained in:
zhongzm
2025-09-04 18:13:23 +08:00
parent 4293c611be
commit 828c640307
2 changed files with 142 additions and 41 deletions

View File

@@ -371,7 +371,7 @@ export default {
Alarmjump:"Click to jump to the Active Alarms", Alarmjump:"Click to jump to the Active Alarms",
skim: { skim: {
users: "Users", users: "Subscriber",
userTitle:'User Information', userTitle:'User Information',
imsUeNum: "VoNR/VoLTE", imsUeNum: "VoNR/VoLTE",
smfUeNum: "User Sessions", smfUeNum: "User Sessions",
@@ -383,6 +383,9 @@ export default {
enbUeNum:'4G Active Users', enbUeNum:'4G Active Users',
baseTitle:'Online Information', baseTitle:'Online Information',
nodeBInfo: 'NodeB Information', nodeBInfo: 'NodeB Information',
onlineinfo:'Online Information',
ims:'IMS',
voip:'VoIP'
}, },
upfFlow:{ upfFlow:{
title: "UPF Throughput", title: "UPF Throughput",

View File

@@ -13,6 +13,8 @@ import { listUDMSub } from '@/api/neData/udm_sub';
import { listUENumBySMF } from '@/api/neUser/smf'; import { listUENumBySMF } from '@/api/neUser/smf';
import { listUENumByIMS } from '@/api/neUser/ims'; import { listUENumByIMS } from '@/api/neUser/ims';
import { listBase5G } from '@/api/neUser/base5G'; import { listBase5G } from '@/api/neUser/base5G';
import { listIMSSub } from '@/api/neData/ims_sub';
import { listUDMAuth } from '@/api/neData/voip_auth';
import { import {
graphNodeClickID, graphNodeClickID,
graphState, graphState,
@@ -52,6 +54,10 @@ type SkimStateType = {
enbNum: number; enbNum: number;
/**4G在线用户数量 */ /**4G在线用户数量 */
enbUeNum: number; enbUeNum: number;
/**IMS用户数量 */
imsUserNum: number;
/**VOIP用户数量 */
voipUserNum: number;
}; };
/**概览状态信息 */ /**概览状态信息 */
@@ -63,6 +69,8 @@ let skimState: SkimStateType = reactive({
gnbUeNum: 0, gnbUeNum: 0,
enbNum: 0, enbNum: 0,
enbUeNum: 0, enbUeNum: 0,
imsUserNum: 0,
voipUserNum: 0,
}); });
/**网元参数 */ /**网元参数 */
@@ -171,9 +179,9 @@ async function fnGetSkim() {
const handler = neHandlers.get(child.neType); const handler = neHandlers.get(child.neType);
return handler return handler
? { ? {
promise: handler.request(child.neId), promise: handler.request(child.neId),
process: handler.process, process: handler.process,
} }
: null; : null;
}) })
.filter(Boolean) || [] .filter(Boolean) || []
@@ -190,6 +198,8 @@ async function fnGetSkim() {
gnbUeNum: 0, gnbUeNum: 0,
enbNum: 0, enbNum: 0,
enbUeNum: 0, enbUeNum: 0,
imsUserNum: 0,
voipUserNum: 0,
}); });
results.forEach((result: any, index: any) => { results.forEach((result: any, index: any) => {
if (result.status === 'fulfilled') { if (result.status === 'fulfilled') {
@@ -205,6 +215,20 @@ async function fnGetSkim() {
skimState.udmSubNum = res.total; skimState.udmSubNum = res.total;
} }
}); });
// IMS用户数
listIMSSub({ neId: udmNeId.value, pageNum: 1, pageSize: 1 }).then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
skimState.imsUserNum = res.total;
}
});
// VOIP用户数
listUDMAuth({ neId: udmNeId.value, pageNum: 1, pageSize: 1 }).then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
skimState.voipUserNum = res.total;
}
});
} }
/**初始数据函数 */ /**初始数据函数 */
@@ -272,6 +296,20 @@ function fnSelectUDM(e: any) {
skimState.udmSubNum = res.total; skimState.udmSubNum = res.total;
} }
}); });
// 更新IMS用户数
listIMSSub({ neId: udmNeId.value, pageNum: 1, pageSize: 1 }).then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
skimState.imsUserNum = res.total;
}
});
// 更新VOIP用户数
listUDMAuth({ neId: udmNeId.value, pageNum: 1, pageSize: 1 }).then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
skimState.voipUserNum = res.total;
}
});
} }
/**资源控制-选择NE */ /**资源控制-选择NE */
function fnSelectNeRe(e: any) { function fnSelectNeRe(e: any) {
@@ -401,10 +439,33 @@ onBeforeUnmount(() => {
<div class="column"> <div class="column">
<!--概览--> <!--概览-->
<div class="skim panel"> <div class="skim panel">
<div class="inner"> <div class="inner" style="padding: 0.8rem 1.5rem">
<h3> <h3 style="display: flex; align-items: center; justify-content: space-between; margin: 0 0 0.3rem 0; padding: 0; line-height: 1; height: 20px; font-size: 0.833rem">
<span style="display: flex; align-items: center">
<IdcardOutlined style="color: #68d8fe" />&nbsp;&nbsp; <IdcardOutlined style="color: #68d8fe" />&nbsp;&nbsp;
{{ t('views.dashboard.overview.skim.userTitle') }} {{ t('views.dashboard.overview.skim.userTitle') }}
</span>
<a-dropdown
:trigger="['click']"
:get-Popup-Container="getPopupContainer"
style="margin-left: 8px"
>
<div class="toDeep-text" style="padding: 2px 6px; font-size: 0.7rem; line-height: 1; height: 16px; display: inline-flex; align-items: center">
{{ udmOtions.find(item => item.value === udmNeId)?.label || 'UDM' }}
<DownOutlined style="margin-left: 4px; font-size: 9px" />
</div>
<template #overlay>
<a-menu @click="fnSelectUDM">
<a-menu-item
v-for="v in udmOtions"
:key="v.value"
:disabled="udmNeId === v.value"
>
{{ v.label }}
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</h3> </h3>
<div class="data"> <div class="data">
<div <div
@@ -417,61 +478,64 @@ onBeforeUnmount(() => {
/> />
{{ skimState.udmSubNum }} {{ skimState.udmSubNum }}
</div> </div>
<span> <span>{{ t('views.dashboard.overview.skim.users') }}
<a-dropdown <!-- <a-dropdown-->
:trigger="['click']" <!-- :trigger="['click']"-->
:get-Popup-Container="getPopupContainer" <!-- :get-Popup-Container="getPopupContainer"-->
> <!-- >-->
<div class="toDeep-text"> <!-- <div class="toDeep-text">-->
{{ t('views.dashboard.overview.skim.users') }} <!-- {{ t('views.dashboard.overview.skim.users') }}-->
<DownOutlined style="margin-left: 12px; font-size: 12px" /> <!-- <DownOutlined style="margin-left: 12px; font-size: 12px" />-->
</div> <!-- </div>-->
<template #overlay> <!-- <template #overlay>-->
<a-menu @click="fnSelectUDM"> <!-- <a-menu @click="fnSelectUDM">-->
<a-menu-item <!-- <a-menu-item-->
v-for="v in udmOtions" <!-- v-for="v in udmOtions"-->
:key="v.value" <!-- :key="v.value"-->
:disabled="udmNeId === v.value" <!-- :disabled="udmNeId === v.value"-->
> <!-- >-->
{{ v.label }} <!-- {{ v.label }}-->
</a-menu-item> <!-- </a-menu-item>-->
</a-menu> <!-- </a-menu>-->
</template> <!-- </template>-->
</a-dropdown> <!-- </a-dropdown>-->
</span> </span>
</div> </div>
<div <div
class="item toRouter" class="item toRouter"
@click="fnToRouter('Ims_2080')" @click="fnToRouter('ImsUDM_2050')"
:title="t('views.dashboard.overview.VoNR')" :title="t('views.dashboard.overview.IMSUsers')"
style="margin: 0 12px" style="margin: 0 12px"
v-perms:has="['dashboard:overview:imsUeNum']"
> >
<div> <div>
<img :src="svgUserIMS" style="width: 18px; margin-right: 8px" /> <UserOutlined
{{ skimState.imsUeNum }} style="color: #4096ff; margin-right: 8px; font-size: 1.1rem"
/>
{{ skimState.imsUserNum }}
</div> </div>
<span> <span>
{{ t('views.dashboard.overview.skim.imsUeNum') }} IMS
</span> </span>
</div> </div>
<div <div
class="item toRouter" class="item toRouter"
@click="fnToRouter('Ue_2081')" @click="fnToRouter('Voip_2051')"
:title="t('views.dashboard.overview.sessions')" :title="t('views.dashboard.overview.VoIPUsers')"
v-perms:has="['dashboard:overview:smfUeNum']"
> >
<div> <div>
<img :src="svgUserSMF" style="width: 18px; margin-right: 8px" /> <UserOutlined
{{ skimState.smfUeNum }} style="color: #4096ff; margin-right: 8px; font-size: 1.1rem"
/>
{{ skimState.voipUserNum }}
</div> </div>
<span> <span>
{{ t('views.dashboard.overview.skim.smfUeNum') }} VoIP
</span> </span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="skim panel base" v-perms:has="['dashboard:overview:gnbBase']"> <div class="skim panel base" v-perms:has="['dashboard:overview:gnbBase']">
<div class="inner"> <div class="inner">
<h3> <h3>
@@ -547,6 +611,40 @@ onBeforeUnmount(() => {
</div> </div>
</div> </div>
<!-- Online Information -->
<div class="skim panel base" v-perms:has="['dashboard:overview:onlineInfo']">
<div class="inner">
<h3>
<IdcardOutlined style="color: #68d8fe" />&nbsp;&nbsp; {{ t('views.dashboard.overview.skim.onlineinfo') }}
</h3>
<div class="data">
<div
class="item toRouter"
@click="fnToRouter('Ims_2080')"
:title="t('views.dashboard.overview.VoNR')"
>
<div style="align-items: flex-start">
<img :src="svgUserIMS" style="width: 18px; margin-right: 8px; height: 2rem" />
{{ skimState.imsUeNum }}
</div>
<span>{{ t('views.dashboard.overview.skim.imsUeNum') }}</span>
</div>
<div
class="item toRouter"
@click="fnToRouter('Ue_2081')"
:title="t('views.dashboard.overview.sessions')"
v-perms:has="['dashboard:overview:smfUeNum']"
>
<div style="align-items: flex-start">
<img :src="svgUserSMF" style="width: 18px; margin-right: 8px; height: 2rem" />
{{ skimState.smfUeNum }}
</div>
<span>{{ t('views.dashboard.overview.skim.smfUeNum') }}</span>
</div>
</div>
</div>
</div>
<!-- 用户行为 --> <!-- 用户行为 -->
<div class="userActivity panel"> <div class="userActivity panel">
<div class="inner"> <div class="inner">
@@ -571,8 +669,8 @@ onBeforeUnmount(() => {
> >
<AreaChartOutlined style="color: #68d8fe" />&nbsp;&nbsp; <AreaChartOutlined style="color: #68d8fe" />&nbsp;&nbsp;
<span @click="fnToRouter('GoldTarget_2104')">{{ <span @click="fnToRouter('GoldTarget_2104')">{{
t('views.dashboard.overview.upfFlow.title') t('views.dashboard.overview.upfFlow.title')
}}</span> }}</span>
<a-select <a-select
v-model:value="upfWhoId" v-model:value="upfWhoId"
:options="neOtions" :options="neOtions"