feat: 添加UPF N3 Ping测试功能
This commit is contained in:
@@ -8,3 +8,12 @@ export function pingV(data: Record<string, string>) {
|
|||||||
params: data,
|
params: data,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ping RTT 时延抖动
|
||||||
|
export function pingRTT(data: Record<string, string>) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/ping/rtt',
|
||||||
|
method: 'POST',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,12 +12,13 @@ import useI18n from '@/hooks/useI18n';
|
|||||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
||||||
import TableColumnsDnd from '@/components/TableColumnsDnd/index.vue';
|
import TableColumnsDnd from '@/components/TableColumnsDnd/index.vue';
|
||||||
import { listTenant } from '@/api/system/tenant';
|
import { listTenant } from '@/api/system/tenant';
|
||||||
import useUserStore from '@/store/modules/user';
|
import { pingRTT } from '@/api/tool/ping';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
/**网元参数 */
|
/**网元参数 */
|
||||||
let neOtions = ref<Record<string, any>[]>([]);
|
let neOtions = ref<Record<string, any>[]>([]);
|
||||||
|
let upfOtions = ref<Record<string, any>[]>([]);
|
||||||
|
|
||||||
/**查询参数 */
|
/**查询参数 */
|
||||||
let queryParams = reactive({
|
let queryParams = reactive({
|
||||||
@@ -188,6 +189,9 @@ type ModalStateType = {
|
|||||||
from: Record<string, any>;
|
from: Record<string, any>;
|
||||||
/**确定按钮 loading */
|
/**确定按钮 loading */
|
||||||
confirmLoading: boolean;
|
confirmLoading: boolean;
|
||||||
|
/**ping测试参数 */
|
||||||
|
pingArgs: Record<string, any>;
|
||||||
|
pingResult: Record<string, any>[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**对话框对象信息状态 */
|
/**对话框对象信息状态 */
|
||||||
@@ -198,10 +202,24 @@ let modalState: ModalStateType = reactive({
|
|||||||
from: {
|
from: {
|
||||||
imsi: '',
|
imsi: '',
|
||||||
msisdn: '',
|
msisdn: '',
|
||||||
pduSessionInfo: undefined,
|
pduSessionInfo: [],
|
||||||
ratType: '',
|
ratType: '',
|
||||||
},
|
},
|
||||||
confirmLoading: false,
|
confirmLoading: false,
|
||||||
|
pingArgs: {
|
||||||
|
neType: 'UPF',
|
||||||
|
neId: '001',
|
||||||
|
ping: {
|
||||||
|
desAddr: '',
|
||||||
|
srcAddr: '',
|
||||||
|
interval: 1,
|
||||||
|
ttl: 255,
|
||||||
|
count: 5,
|
||||||
|
size: 56,
|
||||||
|
timeout: 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
pingResult: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -233,6 +251,7 @@ function fnModalVisibleByVive(row: Record<string, any>) {
|
|||||||
function fnModalCancel() {
|
function fnModalCancel() {
|
||||||
modalState.openByEdit = false;
|
modalState.openByEdit = false;
|
||||||
modalState.openByView = false;
|
modalState.openByView = false;
|
||||||
|
modalState.pingResult = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**查询列表, pageNum初始页数 */
|
/**查询列表, pageNum初始页数 */
|
||||||
@@ -262,7 +281,36 @@ function fnGetList(pageNum?: number) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试ping
|
||||||
|
*/
|
||||||
|
function fnPingTest() {
|
||||||
|
modalState.pingResult = [];
|
||||||
|
modalState.confirmLoading = true;
|
||||||
|
let args = [];
|
||||||
|
for (const v of modalState.from.pduSessionInfo) {
|
||||||
|
const data = Object.assign({}, modalState.pingArgs);
|
||||||
|
data.ping.desAddr = v.ipv4;
|
||||||
|
data.ping.srcAddr = v.upfN3IP;
|
||||||
|
args.push(data);
|
||||||
|
}
|
||||||
|
Promise.all(args.map(v => pingRTT(v)))
|
||||||
|
.then(resArr => {
|
||||||
|
resArr.forEach((v, i) => {
|
||||||
|
if (v.code === RESULT_CODE_SUCCESS) {
|
||||||
|
v.data.dnn = modalState.from.pduSessionInfo[i].dnn;
|
||||||
|
v.data.latency = Number(v.data.avg_rtt || 0).toFixed(3);
|
||||||
|
v.data.jitter = Number(v.data.max_rtt - v.data.min_rtt || 0).toFixed(
|
||||||
|
3
|
||||||
|
);
|
||||||
|
modalState.pingResult.push(v.data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
modalState.confirmLoading = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// 获取网元网元列表
|
// 获取网元网元列表
|
||||||
@@ -276,6 +324,9 @@ onMounted(() => {
|
|||||||
if (i.neType === 'SMF') {
|
if (i.neType === 'SMF') {
|
||||||
arr.push({ value: i.neId, label: i.neName });
|
arr.push({ value: i.neId, label: i.neName });
|
||||||
}
|
}
|
||||||
|
if (i.neType === 'UPF') {
|
||||||
|
upfOtions.value.push({ value: i.neId, label: i.neName });
|
||||||
|
}
|
||||||
});
|
});
|
||||||
neOtions.value = arr;
|
neOtions.value = arr;
|
||||||
if (arr.length > 0) {
|
if (arr.length > 0) {
|
||||||
@@ -437,7 +488,7 @@ onMounted(() => {
|
|||||||
:scroll="{ x: true, y: 400 }"
|
:scroll="{ x: true, y: 400 }"
|
||||||
>
|
>
|
||||||
<template #bodyCell="{ column, record }">
|
<template #bodyCell="{ column, record }">
|
||||||
<template v-if="column.key === 'imsi'">
|
<template v-if="column?.key === 'imsi'">
|
||||||
<a-space :size="8" align="center">
|
<a-space :size="8" align="center">
|
||||||
<a-tooltip>
|
<a-tooltip>
|
||||||
<template #title>{{ t('common.viewText') }}</template>
|
<template #title>{{ t('common.viewText') }}</template>
|
||||||
@@ -458,6 +509,7 @@ onMounted(() => {
|
|||||||
<ProModal
|
<ProModal
|
||||||
:drag="true"
|
:drag="true"
|
||||||
:width="800"
|
:width="800"
|
||||||
|
:body-style="{ maxHeight: '600px', 'overflow-y': 'auto' }"
|
||||||
:open="modalState.openByView"
|
:open="modalState.openByView"
|
||||||
:title="modalState.title"
|
:title="modalState.title"
|
||||||
@cancel="fnModalCancel"
|
@cancel="fnModalCancel"
|
||||||
@@ -512,6 +564,41 @@ onMounted(() => {
|
|||||||
{{ v.activeTime }}
|
{{ v.activeTime }}
|
||||||
</a-descriptions-item>
|
</a-descriptions-item>
|
||||||
</a-descriptions>
|
</a-descriptions>
|
||||||
|
|
||||||
|
<a-divider orientation="left">Ping Test UPF N3 -> IPv4</a-divider>
|
||||||
|
<a-form-item label="Select UPF" name="ping">
|
||||||
|
<a-input-group compact>
|
||||||
|
<a-select
|
||||||
|
v-model:value="modalState.pingArgs.neId"
|
||||||
|
:options="upfOtions"
|
||||||
|
:placeholder="t('common.selectPlease')"
|
||||||
|
:disabled="modalState.confirmLoading"
|
||||||
|
/>
|
||||||
|
<a-button
|
||||||
|
type="primary"
|
||||||
|
@click="fnPingTest()"
|
||||||
|
:loading="modalState.confirmLoading"
|
||||||
|
>
|
||||||
|
Ping
|
||||||
|
</a-button>
|
||||||
|
</a-input-group>
|
||||||
|
</a-form-item>
|
||||||
|
<a-descriptions
|
||||||
|
:title="v.dnn"
|
||||||
|
:column="2"
|
||||||
|
size="small"
|
||||||
|
bordered
|
||||||
|
v-if="modalState.pingResult.length > 0"
|
||||||
|
v-for="v in modalState.pingResult"
|
||||||
|
:key="v.dnn"
|
||||||
|
>
|
||||||
|
<a-descriptions-item label="Latency">
|
||||||
|
{{ v.latency }} ms
|
||||||
|
</a-descriptions-item>
|
||||||
|
<a-descriptions-item label="Jitter">
|
||||||
|
{{ v.jitter }} ms
|
||||||
|
</a-descriptions-item>
|
||||||
|
</a-descriptions>
|
||||||
</a-form>
|
</a-form>
|
||||||
</ProModal>
|
</ProModal>
|
||||||
</PageContainer>
|
</PageContainer>
|
||||||
|
|||||||
Reference in New Issue
Block a user