This commit is contained in:
lai
2024-01-31 16:17:24 +08:00
8 changed files with 130 additions and 51 deletions

View File

@@ -7,7 +7,7 @@ import { parseObjLineToHump } from '@/utils/parse-utils';
* @param query 查询参数 * @param query 查询参数
* @returns object * @returns object
*/ */
export async function listIMS(query: Record<string, any>) { export async function listUEInfoByIMS(query: Record<string, any>) {
query.nbId = query.id; query.nbId = query.id;
const result = await request({ const result = await request({
url: '/api/rest/ueManagement/v1/elementType/ims/objectType/ueInfo', url: '/api/rest/ueManagement/v1/elementType/ims/objectType/ueInfo',
@@ -40,3 +40,25 @@ export async function listIMS(query: Record<string, any>) {
// ]; // ];
return data; return data;
} }
/**
* 首页查询IMS在线用户数
* @param query 查询参数
* @returns neId
*/
export async function listUENumByIMS(neId: String) {
const result = await request({
url: `/api/rest/ueManagement/v1/elementType/ims/objectType/ueNum?neId=${neId}`,
method: 'get',
});
if (result.code === RESULT_CODE_SUCCESS) {
return Object.assign(result, {
data: result.data['ueNum'],
});
}
// 模拟数据
// { "ueNum": 0 }
// result.data = 0
return result;
}

View File

@@ -7,7 +7,7 @@ import { parseObjLineToHump } from '@/utils/parse-utils';
* @param query * @param query
* @returns object * @returns object
*/ */
export async function listUE(query: Record<string, any>) { export async function listUEInfoBySMF(query: Record<string, any>) {
query.nbId = query.id; query.nbId = query.id;
const result = await request({ const result = await request({
url: '/api/rest/ueManagement/v1/elementType/smf/objectType/ueInfo', url: '/api/rest/ueManagement/v1/elementType/smf/objectType/ueInfo',
@@ -62,21 +62,24 @@ export async function listUE(query: Record<string, any>) {
return data; return data;
} }
//
/** /**
* SMF在线用户数 * SMF在线用户数
* @param query * @param query
* @returns neId * @returns neId
*/ */
export async function listUENum(neId: String) { export async function listUENumBySMF(neId: String) {
const result = await request({ const result = await request({
url: `/api/rest/ueManagement/v1/elementType/smf/objectType/ueNum?neId=${neId}`, url: `/api/rest/ueManagement/v1/elementType/smf/objectType/ueNum?neId=${neId}`,
method: 'get', method: 'get',
}); });
if (result.code === RESULT_CODE_SUCCESS) { if (result.code === RESULT_CODE_SUCCESS) {
let data = result.data.data;
return Object.assign(result, { return Object.assign(result, {
data: parseObjLineToHump(data['ueNum']), data: result.data.data['ueNum'],
}); });
} }
// 模拟数据
// { "data": { "ueNum": 0 } }
// result.data = 0
return result;
} }

View File

@@ -64,6 +64,9 @@ export const graphNodeStateNum = computed(() => {
return [normal, abnormal]; return [normal, abnormal];
}); });
/**网元状态请求标记 */
export const neStateRequestMap = ref<Map<string, boolean>>(new Map());
/**neStateParse 网元状态 数据解析 */ /**neStateParse 网元状态 数据解析 */
export function neStateParse(neType: string, data: Record<string, any>) { export function neStateParse(neType: string, data: Record<string, any>) {
const { combos, edges, nodes } = graphState.data; const { combos, edges, nodes } = graphState.data;
@@ -151,4 +154,7 @@ export function neStateParse(neType: string, data: Record<string, any>) {
graphG6.value.setItemState(edge.id, 'line-path', neT.neState.online); graphG6.value.setItemState(edge.id, 'line-path', neT.neState.online);
} }
} }
// 请求标记复位
neStateRequestMap.value.set(neType, false);
} }

View File

@@ -6,6 +6,8 @@ type TFType = {
up: string; up: string;
/**下行 N6 */ /**下行 N6 */
down: string; down: string;
/**请求标记 */
requestFlag: boolean;
}; };
/**UPF-总流量数 */ /**UPF-总流量数 */
@@ -14,14 +16,17 @@ export const upfTotalFlow = ref<TFType[]>([
{ {
up: '0 B', up: '0 B',
down: '0 B', down: '0 B',
requestFlag: false,
}, },
{ {
up: '0 B', up: '0 B',
down: '0 B', down: '0 B',
requestFlag: false,
}, },
{ {
up: '0 B', up: '0 B',
down: '0 B', down: '0 B',
requestFlag: false,
}, },
]); ]);

View File

@@ -75,16 +75,19 @@ export default function useWS() {
const v0 = upfTFParse(data); const v0 = upfTFParse(data);
upfTotalFlow.value[0].up = v0.up; upfTotalFlow.value[0].up = v0.up;
upfTotalFlow.value[0].down = v0.down; upfTotalFlow.value[0].down = v0.down;
upfTotalFlow.value[0].requestFlag = false;
break; break;
case '1030_7': case '1030_7':
const v7 = upfTFParse(data); const v7 = upfTFParse(data);
upfTotalFlow.value[1].up = v7.up; upfTotalFlow.value[1].up = v7.up;
upfTotalFlow.value[1].down = v7.down; upfTotalFlow.value[1].down = v7.down;
upfTotalFlow.value[1].requestFlag = false;
break; break;
case '1030_30': case '1030_30':
const v30 = upfTFParse(data); const v30 = upfTFParse(data);
upfTotalFlow.value[2].up = v30.up; upfTotalFlow.value[2].up = v30.up;
upfTotalFlow.value[2].down = v30.down; upfTotalFlow.value[2].down = v30.down;
upfTotalFlow.value[2].requestFlag = false;
break; break;
} }
@@ -126,6 +129,20 @@ export default function useWS() {
/**UPF-总流量数 发消息*/ /**UPF-总流量数 发消息*/
function upfTFSend(day: 0 | 7 | 30) { function upfTFSend(day: 0 | 7 | 30) {
// 请求标记检查避免重复发送
let index = 0;
if (day === 0) {
index = 0;
} else if (day === 7) {
index = 1;
} else if (day === 30) {
index = 2;
}
if (upfTotalFlow.value[index].requestFlag) {
return;
}
upfTotalFlow.value[index].requestFlag = true;
ws.send({ ws.send({
requestId: `1030_${day}`, requestId: `1030_${day}`,
type: 'upf_tf', type: 'upf_tf',

View File

@@ -7,7 +7,8 @@ import UserActivity from './components/UserActivity/index.vue';
import AlarnTypeBar from './components/AlarnTypeBar/index.vue'; import AlarnTypeBar from './components/AlarnTypeBar/index.vue';
import UPFFlow from './components/UPFFlow/index.vue'; import UPFFlow from './components/UPFFlow/index.vue';
import { listSub } from '@/api/neUser/sub'; import { listSub } from '@/api/neUser/sub';
import { listUENum } from '@/api/neUser/ue'; import { listUENumBySMF } from '@/api/neUser/smf';
import { listUENumByIMS } from '@/api/neUser/ims';
import { listBase5G } from '@/api/neUser/base5G'; import { listBase5G } from '@/api/neUser/base5G';
import { import {
@@ -15,31 +16,36 @@ import {
graphState, graphState,
notNeNodes, notNeNodes,
graphNodeStateNum, graphNodeStateNum,
neStateRequestMap,
} from './hooks/useTopology'; } from './hooks/useTopology';
import { upfTotalFlow, upfTFActive } from './hooks/useUPFTotalFlow'; import { upfTotalFlow, upfTFActive } from './hooks/useUPFTotalFlow';
import { useFullscreen } from '@vueuse/core'; import { useFullscreen } from '@vueuse/core';
import useWS from './hooks/useWS'; import useWS from './hooks/useWS';
import useAppStore from '@/store/modules/app'; import useAppStore from '@/store/modules/app';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
const appStore = useAppStore(); const appStore = useAppStore();
const { t } = useI18n(); const { t } = useI18n();
const { wsSend, cdrEventSend, ueEventSend, upfTFSend } = useWS(); const { wsSend, cdrEventSend, ueEventSend, upfTFSend } = useWS();
/**用户在线信息 */ /**概览状态类型 */
let onlineInfo: { type SkimStateType = {
/**签约用户数量 */ /**UDM签约用户数量 */
subNum: number; udmSubNum: number;
/**在线用户数 */ /**SMF在线用户数 */
ueNum: any; smfUeNum: number;
/**IMS在线用户数 */
imsUeNum: number;
/**基站数量 */ /**基站数量 */
nbNum: number; nbNum: number;
/**原始严重程度 */ };
activeAlarmSeverity: DictType[];
} = reactive({ /**概览状态信息 */
subNum: 0, let skimState: SkimStateType = reactive({
ueNum: 0, udmSubNum: 0,
smfUeNum: 0,
imsUeNum: 0,
nbNum: 0, nbNum: 0,
activeAlarmSeverity: [],
}); });
/**总览节点 */ /**总览节点 */
@@ -53,13 +59,17 @@ const stateInterval = ref<any>(null);
const stateTimeout = ref<any>(null); const stateTimeout = ref<any>(null);
/**查询网元状态 */ /**查询网元状态 */
async function fnGetState() { function fnGetState() {
clearTimeout(stateTimeout.value); clearTimeout(stateTimeout.value);
// 获取节点状态 // 获取节点状态
for (const node of graphState.data.nodes) { for (const node of graphState.data.nodes) {
if (notNeNodes.includes(node.id)) continue; if (notNeNodes.includes(node.id)) continue;
const { neType, neId } = node.neInfo; const { neType, neId } = node.neInfo;
if (!neType || !neId) continue; if (!neType || !neId) continue;
// 请求标记检查避免重复发送
if (neStateRequestMap.value.get(neType)) continue;
neStateRequestMap.value.set(neType, true);
wsSend({ wsSend({
requestId: `neState_${neType}_${neId}`, requestId: `neState_${neType}_${neId}`,
type: 'ne_state', type: 'ne_state',
@@ -70,7 +80,7 @@ async function fnGetState() {
}); });
} }
// stateTimeout.value = setTimeout(() => fnGetState(), 5_000); stateTimeout.value = setTimeout(() => fnGetState(), 5_000);
} }
/**初始数据函数 */ /**初始数据函数 */
@@ -97,11 +107,9 @@ function InitData() {
onMounted(() => { onMounted(() => {
Promise.allSettled([ Promise.allSettled([
listSub({ listSub({
neid: '003', neid: '001',
sortField: 'imsi', pageNum: 1,
sortOrder: 'asc', pageSize: 1,
pageNum: '1',
pageSize: '20',
}), }),
listBase5G({ listBase5G({
// //
@@ -112,11 +120,15 @@ onMounted(() => {
/**每页条数 */ /**每页条数 */
pageSize: 20, pageSize: 20,
}), }),
listUENum('001'), listUENumBySMF('001'),
listUENumByIMS('001'),
]) ])
.then(resArr => { .then(resArr => {
if (resArr[0].status === 'fulfilled') { if (resArr[0].status === 'fulfilled') {
onlineInfo.subNum = resArr[0].value.total; const res = resArr[0].value;
if (res.code === RESULT_CODE_SUCCESS) {
skimState.udmSubNum = res.total;
}
} }
if ( if (
@@ -124,14 +136,21 @@ onMounted(() => {
resArr[1].value.code === RESULT_CODE_SUCCESS && resArr[1].value.code === RESULT_CODE_SUCCESS &&
Array.isArray(resArr[1].value.rows) Array.isArray(resArr[1].value.rows)
) { ) {
onlineInfo.nbNum = resArr[1].value.rows.length; skimState.nbNum = resArr[1].value.rows.length;
} }
if ( if (resArr[2].status === 'fulfilled') {
resArr[2].status === 'fulfilled' && const res = resArr[2].value;
resArr[2].value?.code === RESULT_CODE_SUCCESS if (res.code === RESULT_CODE_SUCCESS) {
) { skimState.smfUeNum = res.data;
onlineInfo.ueNum = resArr[2].value?.data; }
}
if (resArr[3].status === 'fulfilled') {
const res = resArr[3].value;
if (res.code === RESULT_CODE_SUCCESS) {
skimState.imsUeNum = res.data;
}
} }
}) })
.finally(() => { .finally(() => {
@@ -165,33 +184,33 @@ onBeforeUnmount(() => {
<div class="skim panel"> <div class="skim panel">
<div class="inner"> <div class="inner">
<div class="item"> <div class="item">
<h4>{{ onlineInfo.subNum }}</h4> <h4>{{ skimState.udmSubNum }}</h4>
<span> <span>
<UserOutlined style="color: #006cff" /> <UserOutlined style="color: #006cff" />
{{ t('views.dashboard.overview.skim.users') }} {{ t('views.dashboard.overview.skim.users') }}
</span> </span>
</div> </div>
<div class="item"> <div class="item">
<h4>{{ onlineInfo.nbNum }}</h4> <h4>{{ skimState.nbNum }}</h4>
<span> <span>
<GlobalOutlined style="color: #edcb35" /> <GlobalOutlined style="color: #edcb35" />
{{ t('views.dashboard.overview.skim.base') }} {{ t('views.dashboard.overview.skim.base') }}
</span> </span>
</div> </div>
<div class="item"> <div class="item">
<h4>{{ onlineInfo.ueNum }}</h4> <h4>{{ skimState.imsUeNum }}</h4>
<span>
<UserSwitchOutlined style="color: #6acca3" />
Data {{ t('views.dashboard.overview.skim.session') }}
</span>
</div>
<div class="item">
<h4>0</h4>
<span> <span>
<UserSwitchOutlined style="color: #6acca3" /> <UserSwitchOutlined style="color: #6acca3" />
IMS {{ t('views.dashboard.overview.skim.session') }} IMS {{ t('views.dashboard.overview.skim.session') }}
</span> </span>
</div> </div>
<div class="item">
<h4>{{ skimState.smfUeNum }}</h4>
<span>
<UserSwitchOutlined style="color: #6acca3" />
Data {{ t('views.dashboard.overview.skim.session') }}
</span>
</div>
</div> </div>
</div> </div>

View File

@@ -5,7 +5,7 @@ import { message } from 'ant-design-vue/lib';
import { SizeType } from 'ant-design-vue/lib/config-provider'; import { SizeType } from 'ant-design-vue/lib/config-provider';
import { MenuInfo } from 'ant-design-vue/lib/menu/src/interface'; import { MenuInfo } from 'ant-design-vue/lib/menu/src/interface';
import { ColumnsType } from 'ant-design-vue/lib/table'; import { ColumnsType } from 'ant-design-vue/lib/table';
import { listIMS } from '@/api/neUser/ims'; import { listUEInfoByIMS } from '@/api/neUser/ims';
import useNeInfoStore from '@/store/modules/neinfo'; import useNeInfoStore from '@/store/modules/neinfo';
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
@@ -154,7 +154,7 @@ function fnGetList(pageNum?: number) {
if (pageNum) { if (pageNum) {
queryParams.pageNum = pageNum; queryParams.pageNum = pageNum;
} }
listIMS(toRaw(queryParams)).then(res => { listUEInfoByIMS(toRaw(queryParams)).then(res => {
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.rows)) { if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.rows)) {
// 取消勾选 // 取消勾选
if (tableState.selectedRowKeys.length > 0) { if (tableState.selectedRowKeys.length > 0) {
@@ -162,7 +162,11 @@ function fnGetList(pageNum?: number) {
} }
tablePagination.total = res.total; tablePagination.total = res.total;
tableState.data = res.rows; tableState.data = res.rows;
if (tablePagination.total <=(queryParams.pageNum - 1) * tablePagination.pageSize &&queryParams.pageNum !== 1) { if (
tablePagination.total <=
(queryParams.pageNum - 1) * tablePagination.pageSize &&
queryParams.pageNum !== 1
) {
tableState.loading = false; tableState.loading = false;
fnGetList(queryParams.pageNum - 1); fnGetList(queryParams.pageNum - 1);
} }

View File

@@ -5,7 +5,7 @@ import { message } from 'ant-design-vue/lib';
import { SizeType } from 'ant-design-vue/lib/config-provider'; import { SizeType } from 'ant-design-vue/lib/config-provider';
import { MenuInfo } from 'ant-design-vue/lib/menu/src/interface'; import { MenuInfo } from 'ant-design-vue/lib/menu/src/interface';
import { ColumnsType } from 'ant-design-vue/lib/table'; import { ColumnsType } from 'ant-design-vue/lib/table';
import { listUE } from '@/api/neUser/ue'; import { listUEInfoBySMF } from '@/api/neUser/smf';
import useNeInfoStore from '@/store/modules/neinfo'; import useNeInfoStore from '@/store/modules/neinfo';
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
@@ -82,7 +82,6 @@ let tableColumns: ColumnsType = [
return opt.value; return opt.value;
}, },
width: 150, width: 150,
}, },
{ {
title: 'MSISDN', title: 'MSISDN',
@@ -233,7 +232,7 @@ function fnGetList(pageNum?: number) {
if (pageNum) { if (pageNum) {
queryParams.pageNum = pageNum; queryParams.pageNum = pageNum;
} }
listUE(toRaw(queryParams)).then(res => { listUEInfoBySMF(toRaw(queryParams)).then(res => {
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.rows)) { if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.rows)) {
// 取消勾选 // 取消勾选
if (tableState.selectedRowKeys.length > 0) { if (tableState.selectedRowKeys.length > 0) {
@@ -241,7 +240,11 @@ function fnGetList(pageNum?: number) {
} }
tablePagination.total = res.total; tablePagination.total = res.total;
tableState.data = res.rows; tableState.data = res.rows;
if (tablePagination.total <=(queryParams.pageNum - 1) * tablePagination.pageSize &&queryParams.pageNum !== 1) { if (
tablePagination.total <=
(queryParams.pageNum - 1) * tablePagination.pageSize &&
queryParams.pageNum !== 1
) {
tableState.loading = false; tableState.loading = false;
fnGetList(queryParams.pageNum - 1); fnGetList(queryParams.pageNum - 1);
} }