Merge remote-tracking branch 'origin/main' into lichang
This commit is contained in:
@@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network EMS"
|
|||||||
VITE_APP_CODE = "CN EMS"
|
VITE_APP_CODE = "CN EMS"
|
||||||
|
|
||||||
# 应用版本
|
# 应用版本
|
||||||
VITE_APP_VERSION = "2.240418.1"
|
VITE_APP_VERSION = "2.240425.1"
|
||||||
|
|
||||||
# 接口基础URL地址-不带/后缀
|
# 接口基础URL地址-不带/后缀
|
||||||
VITE_API_BASE_URL = "/omc-api"
|
VITE_API_BASE_URL = "/omc-api"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network EMS"
|
|||||||
VITE_APP_CODE = "CN EMS"
|
VITE_APP_CODE = "CN EMS"
|
||||||
|
|
||||||
# 应用版本
|
# 应用版本
|
||||||
VITE_APP_VERSION = "2.240418.1"
|
VITE_APP_VERSION = "2.240425.1"
|
||||||
|
|
||||||
# 接口基础URL地址-不带/后缀
|
# 接口基础URL地址-不带/后缀
|
||||||
VITE_API_BASE_URL = "/omc-api"
|
VITE_API_BASE_URL = "/omc-api"
|
||||||
|
|||||||
@@ -462,3 +462,144 @@ export async function updateNeConfigReload(neType: string, neId: string) {
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从参数配置PCF中获取对应信息提供给PCC用户策略输入框
|
||||||
|
* @param neType 网元类型
|
||||||
|
* @param topTag
|
||||||
|
* @param neId
|
||||||
|
* @returns object { wrRule, dataArr }
|
||||||
|
*/
|
||||||
|
export async function getPCCRule(neId: any) {
|
||||||
|
return await Promise.allSettled([
|
||||||
|
// 获取参数规则
|
||||||
|
request({
|
||||||
|
url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/pccRules`,
|
||||||
|
method: 'get',
|
||||||
|
params: {
|
||||||
|
ne_id: neId,
|
||||||
|
},
|
||||||
|
timeout: 1_000,
|
||||||
|
}),
|
||||||
|
// 获取对应信息
|
||||||
|
request({
|
||||||
|
url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/sessionRules`,
|
||||||
|
method: 'get',
|
||||||
|
params: {
|
||||||
|
ne_id: neId,
|
||||||
|
},
|
||||||
|
timeout: 1_000,
|
||||||
|
}),
|
||||||
|
request({
|
||||||
|
url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/qosTemplate`,
|
||||||
|
method: 'get',
|
||||||
|
params: {
|
||||||
|
ne_id: neId,
|
||||||
|
},
|
||||||
|
timeout: 1_000,
|
||||||
|
}),
|
||||||
|
request({
|
||||||
|
url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/headerEnrichTemplate`,
|
||||||
|
method: 'get',
|
||||||
|
params: {
|
||||||
|
ne_id: neId,
|
||||||
|
},
|
||||||
|
timeout: 1_000,
|
||||||
|
}),
|
||||||
|
request({
|
||||||
|
url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/serviceAreaRestriction`,
|
||||||
|
method: 'get',
|
||||||
|
params: {
|
||||||
|
ne_id: neId,
|
||||||
|
},
|
||||||
|
timeout: 1_000,
|
||||||
|
}),
|
||||||
|
]).then(resArr => {
|
||||||
|
let pccJson: any = new Map();
|
||||||
|
let sessJson: any = new Map();
|
||||||
|
let qosJson: any = new Map();
|
||||||
|
let headerJson: any = new Map();
|
||||||
|
let sarJson: any = new Map();
|
||||||
|
// 规则数据
|
||||||
|
if (resArr[0].status === 'fulfilled') {
|
||||||
|
const itemV = resArr[0].value;
|
||||||
|
// 解析数据
|
||||||
|
if (
|
||||||
|
itemV.code === RESULT_CODE_SUCCESS &&
|
||||||
|
Array.isArray(itemV.data?.data)
|
||||||
|
) {
|
||||||
|
let itemData = itemV.data.data;
|
||||||
|
itemData.forEach((item: any) => {
|
||||||
|
pccJson.set(item.ruleId,{ value: item.ruleId, label: item.ruleId });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resArr[1].status === 'fulfilled') {
|
||||||
|
const itemV = resArr[1].value;
|
||||||
|
// 解析数据
|
||||||
|
if (
|
||||||
|
itemV.code === RESULT_CODE_SUCCESS &&
|
||||||
|
Array.isArray(itemV.data?.data)
|
||||||
|
) {
|
||||||
|
let itemData = itemV.data.data;
|
||||||
|
itemData.forEach((item: any) => {
|
||||||
|
sessJson.set(item.ruleId,{ value: item.ruleId, label: item.ruleId });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resArr[2].status === 'fulfilled') {
|
||||||
|
const itemV = resArr[2].value;
|
||||||
|
// 解析数据
|
||||||
|
if (
|
||||||
|
itemV.code === RESULT_CODE_SUCCESS &&
|
||||||
|
Array.isArray(itemV.data?.data)
|
||||||
|
) {
|
||||||
|
let itemData = itemV.data.data;
|
||||||
|
itemData.forEach((item: any) => {
|
||||||
|
qosJson.set(item.qosId,{ value: item.qosId, label: item.qosId });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resArr[3].status === 'fulfilled') {
|
||||||
|
const itemV = resArr[3].value;
|
||||||
|
// 解析数据
|
||||||
|
if (
|
||||||
|
itemV.code === RESULT_CODE_SUCCESS &&
|
||||||
|
Array.isArray(itemV.data?.data)
|
||||||
|
) {
|
||||||
|
let itemData = itemV.data.data;
|
||||||
|
itemData.forEach((item: any) => {
|
||||||
|
headerJson.set(item.templateName,{
|
||||||
|
value: item.templateName,
|
||||||
|
label: item.templateName,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resArr[4].status === 'fulfilled') {
|
||||||
|
const itemV = resArr[4].value;
|
||||||
|
// 解析数据
|
||||||
|
if (
|
||||||
|
itemV.code === RESULT_CODE_SUCCESS &&
|
||||||
|
Array.isArray(itemV.data?.data)
|
||||||
|
) {
|
||||||
|
let itemData = itemV.data.data;
|
||||||
|
itemData.forEach((item: any) => {
|
||||||
|
sarJson.set(item.name,{ value: item.name, label: item.name });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pccJson = Array.from(pccJson.values());
|
||||||
|
sessJson = Array.from(sessJson.values());
|
||||||
|
qosJson = Array.from(qosJson.values());
|
||||||
|
headerJson = Array.from(headerJson.values());
|
||||||
|
sarJson = Array.from(sarJson.values());
|
||||||
|
|
||||||
|
return { pccJson, sessJson, qosJson, headerJson, sarJson };
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -241,6 +241,7 @@ export async function uploadFileToNE(
|
|||||||
neType,
|
neType,
|
||||||
neId,
|
neId,
|
||||||
},
|
},
|
||||||
|
timeout: 30_000,
|
||||||
});
|
});
|
||||||
return transferToNeFileRes;
|
return transferToNeFileRes;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1012,11 +1012,12 @@ export default {
|
|||||||
neId:'NE UID',
|
neId:'NE UID',
|
||||||
alarmId:'Alarm ID',
|
alarmId:'Alarm ID',
|
||||||
alarmSeq:'Sequence Number',
|
alarmSeq:'Sequence Number',
|
||||||
alarmObj:'Object',
|
alarmObj:'Forward Users',
|
||||||
|
alarmInter:'Forward Interface',
|
||||||
alarmTitle:'Alarm Title',
|
alarmTitle:'Alarm Title',
|
||||||
alarmInfo:'Alarm Content',
|
alarmInfo:'Operation Results',
|
||||||
eventTime:'Generation Time',
|
eventTime:'Event Time',
|
||||||
logTime:'Record Time'
|
logTime:'Log Time'
|
||||||
},
|
},
|
||||||
neFile: {
|
neFile: {
|
||||||
neType:'NE Type',
|
neType:'NE Type',
|
||||||
|
|||||||
@@ -1013,8 +1013,9 @@ export default {
|
|||||||
alarmId:'告警唯一标识',
|
alarmId:'告警唯一标识',
|
||||||
alarmSeq:'告警流水号',
|
alarmSeq:'告警流水号',
|
||||||
alarmObj:'告警前转对象',
|
alarmObj:'告警前转对象',
|
||||||
|
alarmInter:'告警前转接口',
|
||||||
alarmTitle:'告警标题',
|
alarmTitle:'告警标题',
|
||||||
alarmInfo:'告警内容',
|
alarmInfo:'操作结果',
|
||||||
eventTime:'告警产生时间',
|
eventTime:'告警产生时间',
|
||||||
logTime:'记录时间'
|
logTime:'记录时间'
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -80,6 +80,24 @@ let tableColumns: ColumnsType = [
|
|||||||
align: 'center',
|
align: 'center',
|
||||||
width: 3,
|
width: 3,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: t('views.logManage.forwarding.alarmInter'),
|
||||||
|
dataIndex: 'interface',
|
||||||
|
align: 'center',
|
||||||
|
width: 5,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t('views.logManage.forwarding.alarmObj'),
|
||||||
|
dataIndex: 'toUser',
|
||||||
|
align: 'center',
|
||||||
|
width: 5,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t('views.logManage.forwarding.alarmInfo'),
|
||||||
|
dataIndex: 'operResult',
|
||||||
|
align: 'center',
|
||||||
|
width: 6,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: t('views.logManage.forwarding.type'),
|
title: t('views.logManage.forwarding.type'),
|
||||||
dataIndex: 'neType',
|
dataIndex: 'neType',
|
||||||
@@ -104,24 +122,12 @@ let tableColumns: ColumnsType = [
|
|||||||
align: 'center',
|
align: 'center',
|
||||||
width: 4,
|
width: 4,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: t('views.logManage.forwarding.alarmObj'),
|
|
||||||
dataIndex: 'toUser',
|
|
||||||
align: 'center',
|
|
||||||
width: 5,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: t('views.logManage.forwarding.alarmTitle'),
|
title: t('views.logManage.forwarding.alarmTitle'),
|
||||||
dataIndex: 'alarmTitle',
|
dataIndex: 'alarmTitle',
|
||||||
align: 'left',
|
align: 'center',
|
||||||
width: 5,
|
width: 5,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: t('views.logManage.forwarding.alarmInfo'),
|
|
||||||
dataIndex: 'operResult',
|
|
||||||
align: 'left',
|
|
||||||
width: 6,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: t('views.logManage.forwarding.eventTime'),
|
title: t('views.logManage.forwarding.eventTime'),
|
||||||
dataIndex: 'eventTime',
|
dataIndex: 'eventTime',
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import {
|
|||||||
batchDelRule,
|
batchDelRule,
|
||||||
batchUpdateRule,
|
batchUpdateRule,
|
||||||
} from '@/api/neUser/pcf';
|
} from '@/api/neUser/pcf';
|
||||||
|
import { getPCCRule } from '@/api/configManage/configParam';
|
||||||
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';
|
||||||
@@ -27,6 +28,15 @@ const { t } = useI18n();
|
|||||||
/**网元参数 */
|
/**网元参数 */
|
||||||
let neOtions = ref<Record<string, any>[]>([]);
|
let neOtions = ref<Record<string, any>[]>([]);
|
||||||
|
|
||||||
|
/**表单中多选的OPTION */
|
||||||
|
const pcfRuleOption = reactive({
|
||||||
|
pccOpt: [],
|
||||||
|
sessOpt: [],
|
||||||
|
qosOpt: [],
|
||||||
|
headerOpt: [],
|
||||||
|
sarOpt: [],
|
||||||
|
});
|
||||||
|
|
||||||
/**查询参数 */
|
/**查询参数 */
|
||||||
let queryParams = reactive({
|
let queryParams = reactive({
|
||||||
/**网元ID */
|
/**网元ID */
|
||||||
@@ -102,13 +112,13 @@ let tableColumns = ref<TableColumnsType>([
|
|||||||
width: 50,
|
width: 50,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'QOS Video',
|
title: 'QoS Video',
|
||||||
dataIndex: 'qosVideo',
|
dataIndex: 'qosVideo',
|
||||||
align: 'left',
|
align: 'left',
|
||||||
width: 100,
|
width: 100,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'QOS Audio',
|
title: 'QoS Audio',
|
||||||
dataIndex: 'qosAudio',
|
dataIndex: 'qosAudio',
|
||||||
align: 'left',
|
align: 'left',
|
||||||
resizable: true,
|
resizable: true,
|
||||||
@@ -214,10 +224,10 @@ let modalState: ModalStateType = reactive({
|
|||||||
imsi: '',
|
imsi: '',
|
||||||
msisdn: '',
|
msisdn: '',
|
||||||
qosAudio: '',
|
qosAudio: '',
|
||||||
pccRules: 'internet|ims_sig',
|
pccRules: undefined,
|
||||||
rfsp: 0,
|
rfsp: 0,
|
||||||
uePolicy: '',
|
uePolicy: '',
|
||||||
sessRules: 'internet|ims_sig',
|
sessRules: undefined,
|
||||||
sar: '',
|
sar: '',
|
||||||
hdrEnrich: '',
|
hdrEnrich: '',
|
||||||
qosVideo: '',
|
qosVideo: '',
|
||||||
@@ -247,35 +257,66 @@ const modalStateFrom = Form.useForm(
|
|||||||
* @param noticeId 网元id, 不传为新增
|
* @param noticeId 网元id, 不传为新增
|
||||||
*/
|
*/
|
||||||
function fnModalVisibleByEdit(row?: Record<string, any>) {
|
function fnModalVisibleByEdit(row?: Record<string, any>) {
|
||||||
modalState.isBatch = false;
|
getPCCRule(queryParams.neId)
|
||||||
if (!row) {
|
.then((res: any) => {
|
||||||
modalStateFrom.resetFields(); //重置表单
|
pcfRuleOption.pccOpt = res.pccJson;
|
||||||
modalState.title = t('views.neUser.pcf.addTitle');
|
pcfRuleOption.sessOpt = res.sessJson;
|
||||||
modalState.visibleByEdit = true;
|
pcfRuleOption.qosOpt = res.qosJson;
|
||||||
modalState.type = 'add';
|
pcfRuleOption.headerOpt = res.headerJson;
|
||||||
} else {
|
pcfRuleOption.sarOpt = res.sarJson;
|
||||||
if (modalState.confirmLoading) return;
|
})
|
||||||
const hide = message.loading(t('common.loading'), 0);
|
.finally(() => {
|
||||||
modalState.confirmLoading = true;
|
modalState.isBatch = false;
|
||||||
const neID = queryParams.neId || '-';
|
if (!row) {
|
||||||
getRule(neID, row.imsi)
|
modalStateFrom.resetFields(); //重置表单
|
||||||
.then(res => {
|
modalState.title = t('views.neUser.pcf.addTitle');
|
||||||
if (res.code === RESULT_CODE_SUCCESS) {
|
modalState.visibleByEdit = true;
|
||||||
modalState.from = Object.assign(modalState.from, res.data);
|
modalState.type = 'add';
|
||||||
modalState.title = t('views.neUser.pcf.updateTitle', {
|
} else {
|
||||||
imsi: row.imsi,
|
if (modalState.confirmLoading) return;
|
||||||
|
const hide = message.loading(t('common.loading'), 0);
|
||||||
|
modalState.confirmLoading = true;
|
||||||
|
const neID = queryParams.neId || '-';
|
||||||
|
getRule(neID, row.imsi)
|
||||||
|
.then(res => {
|
||||||
|
if (res.code === RESULT_CODE_SUCCESS) {
|
||||||
|
Object.assign(modalState.from, res.data);
|
||||||
|
|
||||||
|
let pccRules = res.data.pccRules;
|
||||||
|
if (!pccRules) {
|
||||||
|
pccRules = [];
|
||||||
|
} else if (pccRules.includes('|')) {
|
||||||
|
pccRules = pccRules.split('|');
|
||||||
|
} else {
|
||||||
|
pccRules = [pccRules];
|
||||||
|
}
|
||||||
|
modalState.from.pccRules = pccRules;
|
||||||
|
let sessRules = res.data.sessRules;
|
||||||
|
if (!sessRules) {
|
||||||
|
sessRules = [];
|
||||||
|
} else if (sessRules.includes('|')) {
|
||||||
|
sessRules = sessRules.split('|');
|
||||||
|
} else {
|
||||||
|
sessRules = [sessRules];
|
||||||
|
}
|
||||||
|
modalState.from.sessRules = sessRules;
|
||||||
|
console.log(modalState.from);
|
||||||
|
|
||||||
|
modalState.title = t('views.neUser.pcf.updateTitle', {
|
||||||
|
imsi: row.imsi,
|
||||||
|
});
|
||||||
|
modalState.visibleByEdit = true;
|
||||||
|
modalState.type = 'update';
|
||||||
|
} else {
|
||||||
|
message.error(t('common.getInfoFail'), 2);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
hide();
|
||||||
|
modalState.confirmLoading = false;
|
||||||
});
|
});
|
||||||
modalState.visibleByEdit = true;
|
}
|
||||||
modalState.type = 'update';
|
});
|
||||||
} else {
|
|
||||||
message.error(t('common.getInfoFail'), 2);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
hide();
|
|
||||||
modalState.confirmLoading = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -283,9 +324,25 @@ function fnModalVisibleByEdit(row?: Record<string, any>) {
|
|||||||
* 进行表达规则校验
|
* 进行表达规则校验
|
||||||
*/
|
*/
|
||||||
function fnModalOk() {
|
function fnModalOk() {
|
||||||
const from = toRaw(modalState.from);
|
const from = JSON.parse(JSON.stringify(modalState.from));
|
||||||
from.neId = queryParams.neId || '-';
|
from.neId = queryParams.neId || '-';
|
||||||
from.rfsp = Number(from.rfsp) || 0;
|
from.rfsp = Number(from.rfsp) || 0;
|
||||||
|
console.log(from);
|
||||||
|
let pccRules = modalState.from.pccRules;
|
||||||
|
if (Array.isArray(pccRules)) {
|
||||||
|
pccRules = pccRules.join('|');
|
||||||
|
} else {
|
||||||
|
pccRules = '';
|
||||||
|
}
|
||||||
|
from.pccRules = pccRules;
|
||||||
|
|
||||||
|
let sessRules = modalState.from.sessRules;
|
||||||
|
if (Array.isArray(sessRules)) {
|
||||||
|
sessRules = sessRules.join('|');
|
||||||
|
} else {
|
||||||
|
sessRules = '';
|
||||||
|
}
|
||||||
|
from.sessRules = sessRules;
|
||||||
|
|
||||||
let validateArr = ['imsi', 'msisdn'];
|
let validateArr = ['imsi', 'msisdn'];
|
||||||
if (modalState.isBatch) {
|
if (modalState.isBatch) {
|
||||||
@@ -382,21 +439,31 @@ function fnModalCancel() {
|
|||||||
* @param type 类型
|
* @param type 类型
|
||||||
*/
|
*/
|
||||||
function fnModalVisibleByBatch(type: 'delete' | 'add' | 'update') {
|
function fnModalVisibleByBatch(type: 'delete' | 'add' | 'update') {
|
||||||
modalStateFrom.resetFields(); //重置表单
|
getPCCRule(queryParams.neId)
|
||||||
modalState.isBatch = true;
|
.then((res: any) => {
|
||||||
modalState.type = type;
|
pcfRuleOption.pccOpt = res.pccJson;
|
||||||
if (type === 'add') {
|
pcfRuleOption.sessOpt = res.sessJson;
|
||||||
modalState.title = t('views.neUser.pcf.batchAddText');
|
pcfRuleOption.qosOpt = res.qosJson;
|
||||||
modalState.visibleByEdit = true;
|
pcfRuleOption.headerOpt = res.headerJson;
|
||||||
}
|
pcfRuleOption.sarOpt = res.sarJson;
|
||||||
if (type === 'update') {
|
})
|
||||||
modalState.title = t('views.neUser.pcf.batchUpdateText');
|
.finally(() => {
|
||||||
modalState.visibleByEdit = true;
|
modalStateFrom.resetFields(); //重置表单
|
||||||
}
|
modalState.isBatch = true;
|
||||||
if (type === 'delete') {
|
modalState.type = type;
|
||||||
modalState.title = t('views.neUser.pcf.batchDelText');
|
if (type === 'add') {
|
||||||
modalState.visibleByEdit = true;
|
modalState.title = t('views.neUser.pcf.batchAddText');
|
||||||
}
|
modalState.visibleByEdit = true;
|
||||||
|
}
|
||||||
|
if (type === 'update') {
|
||||||
|
modalState.title = t('views.neUser.pcf.batchUpdateText');
|
||||||
|
modalState.visibleByEdit = true;
|
||||||
|
}
|
||||||
|
if (type === 'delete') {
|
||||||
|
modalState.title = t('views.neUser.pcf.batchDelText');
|
||||||
|
modalState.visibleByEdit = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -551,6 +618,11 @@ function fnModalUploadImportUpload(file: File) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**使其忽略大小写 */
|
||||||
|
function filterOption(value: any, option: any) {
|
||||||
|
return option.value.toUpperCase().indexOf(value.toUpperCase()) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// 获取网元网元列表
|
// 获取网元网元列表
|
||||||
useNeInfoStore()
|
useNeInfoStore()
|
||||||
@@ -664,7 +736,7 @@ onMounted(() => {
|
|||||||
{{ t('views.neUser.pcf.checkDel') }}
|
{{ t('views.neUser.pcf.checkDel') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
|
|
||||||
<a-dropdown>
|
<a-dropdown trigger="click">
|
||||||
<a-button>
|
<a-button>
|
||||||
{{ t('views.neUser.pcf.batchOper') }}
|
{{ t('views.neUser.pcf.batchOper') }}
|
||||||
<DownOutlined />
|
<DownOutlined />
|
||||||
@@ -945,77 +1017,47 @@ onMounted(() => {
|
|||||||
<a-row :gutter="16">
|
<a-row :gutter="16">
|
||||||
<a-col :lg="12" :md="12" :xs="24">
|
<a-col :lg="12" :md="12" :xs="24">
|
||||||
<a-form-item label="PCC Rules" name="pccRules">
|
<a-form-item label="PCC Rules" name="pccRules">
|
||||||
<a-input
|
<a-select
|
||||||
v-model:value="modalState.from.pccRules"
|
v-model:value="modalState.from.pccRules"
|
||||||
allow-clear
|
allow-clear
|
||||||
:maxlength="64"
|
mode="tags"
|
||||||
>
|
:options="pcfRuleOption.pccOpt"
|
||||||
<template #prefix>
|
:title="t('views.neUser.pcf.pccRuleTip')"
|
||||||
<a-tooltip placement="topLeft">
|
/>
|
||||||
<template #title>
|
|
||||||
{{ t('views.neUser.pcf.pccRuleTip') }}
|
|
||||||
</template>
|
|
||||||
<InfoCircleOutlined style="color: rgba(0, 0, 0, 0.45)" />
|
|
||||||
</a-tooltip>
|
|
||||||
</template>
|
|
||||||
</a-input>
|
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="12" :md="12" :xs="24">
|
<a-col :lg="12" :md="12" :xs="24">
|
||||||
<a-form-item label="SESS Rules" name="sessRules">
|
<a-form-item label="SESS Rules" name="sessRules">
|
||||||
<a-input
|
<a-select
|
||||||
v-model:value="modalState.from.sessRules"
|
v-model:value="modalState.from.sessRules"
|
||||||
allow-clear
|
allow-clear
|
||||||
:maxlength="64"
|
mode="tags"
|
||||||
>
|
:options="pcfRuleOption.sessOpt"
|
||||||
<template #prefix>
|
:title="t('views.neUser.pcf.sessRuleTip')"
|
||||||
<a-tooltip placement="topLeft">
|
/>
|
||||||
<template #title>
|
|
||||||
{{ t('views.neUser.pcf.sessRuleTip') }}
|
|
||||||
</template>
|
|
||||||
<InfoCircleOutlined style="color: rgba(0, 0, 0, 0.45)" />
|
|
||||||
</a-tooltip>
|
|
||||||
</template>
|
|
||||||
</a-input>
|
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
|
|
||||||
<a-row :gutter="16">
|
<a-row :gutter="16">
|
||||||
<a-col :lg="12" :md="12" :xs="24">
|
<a-col :lg="12" :md="12" :xs="24">
|
||||||
<a-form-item label="QOS Audio" name="qosAudio">
|
<a-form-item label="QoS Audio" name="qosAudio">
|
||||||
<a-input
|
<a-auto-complete
|
||||||
v-model:value="modalState.from.qosAudio"
|
v-model:value="modalState.from.qosAudio"
|
||||||
allow-clear
|
allow-clear
|
||||||
:maxlength="64"
|
:options="pcfRuleOption.qosOpt"
|
||||||
>
|
:filter-option="filterOption"
|
||||||
<template #prefix>
|
/>
|
||||||
<a-tooltip placement="topLeft">
|
|
||||||
<template #title>
|
|
||||||
{{ t('views.neUser.pcf.qosAudioTip') }}
|
|
||||||
</template>
|
|
||||||
<InfoCircleOutlined style="color: rgba(0, 0, 0, 0.45)" />
|
|
||||||
</a-tooltip>
|
|
||||||
</template>
|
|
||||||
</a-input>
|
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="12" :md="12" :xs="24">
|
<a-col :lg="12" :md="12" :xs="24">
|
||||||
<a-form-item label="QOS Video" name="qosVideo">
|
<a-form-item label="QoS Video" name="qosVideo">
|
||||||
<a-input
|
<a-auto-complete
|
||||||
v-model:value="modalState.from.qosVideo"
|
v-model:value="modalState.from.qosVideo"
|
||||||
allow-clear
|
allow-clear
|
||||||
:maxlength="64"
|
:options="pcfRuleOption.qosOpt"
|
||||||
>
|
:filter-option="filterOption"
|
||||||
<template #prefix>
|
/>
|
||||||
<a-tooltip placement="topLeft">
|
|
||||||
<template #title>
|
|
||||||
{{ t('views.neUser.pcf.qosVideoTip') }}
|
|
||||||
</template>
|
|
||||||
<InfoCircleOutlined style="color: rgba(0, 0, 0, 0.45)" />
|
|
||||||
</a-tooltip>
|
|
||||||
</template>
|
|
||||||
</a-input>
|
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
@@ -1023,20 +1065,12 @@ onMounted(() => {
|
|||||||
<a-row :gutter="16">
|
<a-row :gutter="16">
|
||||||
<a-col :lg="12" :md="12" :xs="24">
|
<a-col :lg="12" :md="12" :xs="24">
|
||||||
<a-form-item label="HDR Enrich" name="hdrEnrich">
|
<a-form-item label="HDR Enrich" name="hdrEnrich">
|
||||||
<a-input
|
<a-auto-complete
|
||||||
v-model:value="modalState.from.hdrEnrich"
|
v-model:value="modalState.from.hdrEnrich"
|
||||||
allow-clear
|
allow-clear
|
||||||
:maxlength="64"
|
:options="pcfRuleOption.headerOpt"
|
||||||
>
|
:filter-option="filterOption"
|
||||||
<template #prefix>
|
/>
|
||||||
<a-tooltip placement="topLeft">
|
|
||||||
<template #title>
|
|
||||||
{{ t('views.neUser.pcf.hdrTip') }}
|
|
||||||
</template>
|
|
||||||
<InfoCircleOutlined style="color: rgba(0, 0, 0, 0.45)" />
|
|
||||||
</a-tooltip>
|
|
||||||
</template>
|
|
||||||
</a-input>
|
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="12" :md="12" :xs="24">
|
<a-col :lg="12" :md="12" :xs="24">
|
||||||
@@ -1061,22 +1095,13 @@ onMounted(() => {
|
|||||||
|
|
||||||
<a-row :gutter="16">
|
<a-row :gutter="16">
|
||||||
<a-col :lg="12" :md="12" :xs="24">
|
<a-col :lg="12" :md="12" :xs="24">
|
||||||
<a-form-item label="Sar" name="sar">
|
<a-form-item label="SAR" name="sar">
|
||||||
<a-input
|
<a-auto-complete
|
||||||
v-model:value="modalState.from.sar"
|
v-model:value="modalState.from.sar"
|
||||||
allow-clear
|
allow-clear
|
||||||
:maxlength="64"
|
:options="pcfRuleOption.sarOpt"
|
||||||
>
|
:filter-option="filterOption"
|
||||||
<template #prefix>
|
/>
|
||||||
<a-tooltip placement="topLeft">
|
|
||||||
<template #title>
|
|
||||||
{{ t('views.neUser.pcf.sarTip1') }}<br />
|
|
||||||
{{ t('views.neUser.pcf.sarTip2') }}<br />
|
|
||||||
</template>
|
|
||||||
<InfoCircleOutlined style="color: rgba(0, 0, 0, 0.45)" />
|
|
||||||
</a-tooltip>
|
|
||||||
</template>
|
|
||||||
</a-input>
|
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="12" :md="12" :xs="24">
|
<a-col :lg="12" :md="12" :xs="24">
|
||||||
|
|||||||
@@ -493,10 +493,7 @@ const modalStateFrom = Form.useForm(
|
|||||||
*/
|
*/
|
||||||
function transformData(data: any) {
|
function transformData(data: any) {
|
||||||
let transformedData = data.map((item: any) => {
|
let transformedData = data.map((item: any) => {
|
||||||
if (
|
if (!item.sst || !item.smallRows.every((smallRow: any) => smallRow.dnn)) {
|
||||||
!item.sst ||
|
|
||||||
!item.smallRows.every((smallRow: any) => smallRow.dnn)
|
|
||||||
) {
|
|
||||||
message.error({
|
message.error({
|
||||||
content: `${t('views.neUser.sub.smDataArrTip')}`,
|
content: `${t('views.neUser.sub.smDataArrTip')}`,
|
||||||
duration: 3,
|
duration: 3,
|
||||||
@@ -504,7 +501,9 @@ function transformData(data: any) {
|
|||||||
throw new Error('sst, sd, and all dnn are required fields');
|
throw new Error('sst, sd, and all dnn are required fields');
|
||||||
}
|
}
|
||||||
|
|
||||||
let sstSd = item.sd?item.sst + '-' + item.sd:item.sst;
|
let sstSd = item.sd
|
||||||
|
? item.sst + '-' + item.sd.padStart(6, '0')
|
||||||
|
: item.sst + '-';
|
||||||
let smallRowData = item.smallRows
|
let smallRowData = item.smallRows
|
||||||
.map((smallRow: any) => {
|
.map((smallRow: any) => {
|
||||||
let parts = [smallRow.dnn];
|
let parts = [smallRow.dnn];
|
||||||
@@ -536,7 +535,9 @@ function transformFormData(data: any) {
|
|||||||
let json: any = {
|
let json: any = {
|
||||||
id: bigIDFlag++,
|
id: bigIDFlag++,
|
||||||
sst: item.split('&')[0].split('-')[0],
|
sst: item.split('&')[0].split('-')[0],
|
||||||
sd: item.split('&')[0].split('-')[1]?item.split('&')[0].split('-')[1]:'',
|
sd: item.split('&')[0].split('-')[1]
|
||||||
|
? item.split('&')[0].split('-')[1]
|
||||||
|
: '',
|
||||||
smallRows: [],
|
smallRows: [],
|
||||||
};
|
};
|
||||||
item
|
item
|
||||||
@@ -1543,17 +1544,21 @@ onMounted(() => {
|
|||||||
name="row.sst"
|
name="row.sst"
|
||||||
:label-col="{ span: 5 }"
|
:label-col="{ span: 5 }"
|
||||||
>
|
>
|
||||||
<a-input-group>
|
<div>
|
||||||
<a-row :gutter="8">
|
<a-input-number
|
||||||
<a-col :span="10">
|
v-model:value="row.sst"
|
||||||
<a-input v-model:value="row.sst" />
|
:min="1"
|
||||||
</a-col>
|
:max="3"
|
||||||
<span style="margin-top: 5px">-</span>
|
:step="1"
|
||||||
<a-col :span="12">
|
style="width: 30%"
|
||||||
<a-input v-model:value="row.sd" />
|
/>
|
||||||
</a-col>
|
<span style="padding: 0 8px">-</span>
|
||||||
</a-row>
|
<a-input
|
||||||
</a-input-group>
|
v-model:value="row.sd"
|
||||||
|
:maxlength="6"
|
||||||
|
style="width: 60%"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="12" :md="12" :xs="24">
|
<a-col :lg="12" :md="12" :xs="24">
|
||||||
@@ -2068,17 +2073,21 @@ onMounted(() => {
|
|||||||
<a-row :gutter="16">
|
<a-row :gutter="16">
|
||||||
<a-col :lg="12" :md="12" :xs="24">
|
<a-col :lg="12" :md="12" :xs="24">
|
||||||
<a-form-item label="SST-SD" name="row.sst">
|
<a-form-item label="SST-SD" name="row.sst">
|
||||||
<a-input-group>
|
<div>
|
||||||
<a-row :gutter="8">
|
<a-input-number
|
||||||
<a-col :span="10">
|
v-model:value="row.sst"
|
||||||
<a-input v-model:value="row.sst" />
|
:min="1"
|
||||||
</a-col>
|
:max="3"
|
||||||
<span style="margin-top: 5px">-</span>
|
:step="1"
|
||||||
<a-col :span="12">
|
style="width: 30%"
|
||||||
<a-input v-model:value="row.sd" />
|
/>
|
||||||
</a-col>
|
<span style="padding: 0 8px">-</span>
|
||||||
</a-row>
|
<a-input
|
||||||
</a-input-group>
|
v-model:value="row.sd"
|
||||||
|
:maxlength="6"
|
||||||
|
style="width: 60%"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="12" :md="12" :xs="24">
|
<a-col :lg="12" :md="12" :xs="24">
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ type TabeStateType = {
|
|||||||
let tableState: TabeStateType = reactive({
|
let tableState: TabeStateType = reactive({
|
||||||
loading: false,
|
loading: false,
|
||||||
size: 'middle',
|
size: 'middle',
|
||||||
seached: true,
|
seached: false,
|
||||||
data: [],
|
data: [],
|
||||||
selectedRowKeys: [],
|
selectedRowKeys: [],
|
||||||
});
|
});
|
||||||
@@ -290,7 +290,7 @@ onMounted(() => {
|
|||||||
<!-- 表格搜索栏 -->
|
<!-- 表格搜索栏 -->
|
||||||
<a-form :model="queryParams" name="queryParams" layout="horizontal">
|
<a-form :model="queryParams" name="queryParams" layout="horizontal">
|
||||||
<a-row :gutter="16">
|
<a-row :gutter="16">
|
||||||
<a-col :lg="6" :md="12" :xs="24">
|
<a-col :lg="8" :md="12" :xs="24">
|
||||||
<a-form-item :label="t('views.neUser.ue.neType')" name="neId ">
|
<a-form-item :label="t('views.neUser.ue.neType')" name="neId ">
|
||||||
<a-select
|
<a-select
|
||||||
v-model:value="queryParams.neId"
|
v-model:value="queryParams.neId"
|
||||||
@@ -299,17 +299,18 @@ onMounted(() => {
|
|||||||
/>
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="12" :xs="24">
|
<a-col :lg="8" :md="12" :xs="24">
|
||||||
<a-form-item label="IMSI" name="imsi">
|
<a-form-item label="IMSI" name="imsi">
|
||||||
<a-input v-model:value="queryParams.imsi" allow-clear></a-input>
|
<a-input v-model:value="queryParams.imsi" allow-clear></a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="12" :xs="24">
|
<a-col :lg="8" :md="12" :xs="24">
|
||||||
<a-form-item label="MSISDN" name="msisdn">
|
<a-form-item label="MSISDN" name="msisdn">
|
||||||
<a-input v-model:value="queryParams.msisdn" allow-clear></a-input>
|
<a-input v-model:value="queryParams.msisdn" allow-clear></a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6" :md="12" :xs="24">
|
|
||||||
|
<a-col :lg="8" :md="12" :xs="24">
|
||||||
<a-form-item>
|
<a-form-item>
|
||||||
<a-space :size="8">
|
<a-space :size="8">
|
||||||
<a-button type="primary" @click.prevent="fnGetList(1)">
|
<a-button type="primary" @click.prevent="fnGetList(1)">
|
||||||
@@ -440,24 +441,27 @@ onMounted(() => {
|
|||||||
v-for="v in modalState.from.pduSessionInfo"
|
v-for="v in modalState.from.pduSessionInfo"
|
||||||
:key="v.dnn"
|
:key="v.dnn"
|
||||||
>
|
>
|
||||||
|
<a-descriptions-item label="PDU Session ID">
|
||||||
|
{{ v.pduSessionID }}
|
||||||
|
</a-descriptions-item>
|
||||||
|
<a-descriptions-item label="User Plane State">
|
||||||
|
{{ v.upState }}
|
||||||
|
</a-descriptions-item>
|
||||||
<a-descriptions-item label="IPV4">{{ v.ipv4 }}</a-descriptions-item>
|
<a-descriptions-item label="IPV4">{{ v.ipv4 }}</a-descriptions-item>
|
||||||
<a-descriptions-item label="IPV6">{{ v.ipv6 }}</a-descriptions-item>
|
<a-descriptions-item label="IPV6">{{ v.ipv6 }}</a-descriptions-item>
|
||||||
<a-descriptions-item label="TAI">{{ v.tai }}</a-descriptions-item>
|
<a-descriptions-item label="TAI">{{ v.tai }}</a-descriptions-item>
|
||||||
<a-descriptions-item label="SST_SD">
|
<a-descriptions-item label="SST-SD">
|
||||||
{{ v.sstSD }}</a-descriptions-item
|
{{ v.sstSD }}</a-descriptions-item
|
||||||
>
|
>
|
||||||
<a-descriptions-item label="UPF_N3_IP">
|
<a-descriptions-item label="UPF N3 IP">
|
||||||
{{ v.upfN3IP }}
|
{{ v.upfN3IP }}
|
||||||
</a-descriptions-item>
|
</a-descriptions-item>
|
||||||
<a-descriptions-item label="RAN_N3_IP">
|
<a-descriptions-item label="RAN N3 IP">
|
||||||
{{ v.ranN3IP }}
|
{{ v.ranN3IP }}
|
||||||
</a-descriptions-item>
|
</a-descriptions-item>
|
||||||
<a-descriptions-item label="ActiveTime">
|
<a-descriptions-item label="Create Time">
|
||||||
{{ v.activeTime }}
|
{{ v.activeTime }}
|
||||||
</a-descriptions-item>
|
</a-descriptions-item>
|
||||||
<a-descriptions-item label="pduSessionId">
|
|
||||||
{{ v.pduSessionID }}
|
|
||||||
</a-descriptions-item>
|
|
||||||
</a-descriptions>
|
</a-descriptions>
|
||||||
</a-form>
|
</a-form>
|
||||||
</DraggableModal>
|
</DraggableModal>
|
||||||
|
|||||||
@@ -32,7 +32,20 @@ const { t } = useI18n();
|
|||||||
const { getDict } = useDictStore();
|
const { getDict } = useDictStore();
|
||||||
|
|
||||||
/**字体图标可选择数据 */
|
/**字体图标可选择数据 */
|
||||||
let icons = reactive(iconFonts.map(item => ({ value: item, label: item })));
|
let icons = reactive(
|
||||||
|
iconFonts.map((item, i) => {
|
||||||
|
if (i === 0) {
|
||||||
|
return {
|
||||||
|
value: item,
|
||||||
|
label: item,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
value: item,
|
||||||
|
label: 'icon-' + `${i}`.padStart(3, '0'),
|
||||||
|
};
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
/**字典数据 */
|
/**字典数据 */
|
||||||
let dict: {
|
let dict: {
|
||||||
@@ -1173,5 +1186,4 @@ onMounted(() => {
|
|||||||
</PageContainer>
|
</PageContainer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped></style>
|
||||||
</style>
|
|
||||||
|
|||||||
Reference in New Issue
Block a user