ref: v3变更,,完成整合,同步v2.2508.4 -250902

This commit is contained in:
TsMask
2025-09-06 11:27:57 +08:00
parent e943b4dedc
commit 6470ed5bc1
90 changed files with 1724 additions and 1361 deletions

View File

@@ -1,2 +1,3 @@
#imsi,msisdn,sess_rules,pcc_rules,hdr_enrich,rfsp,sar,qos_audio,qos_video,online,offline # !!! Remove lines containing the # symbol when importing files.
#imsi,msisdn,sess_rules,pcc_rules,hdr_enrich,rfsp,sar,qos_audio,qos_video
460996650000580,62357000580,internet|ims_sig,internet|ims_sig,dnn,1,def_sar,qos_audio,qos_video,0,0 460996650000580,62357000580,internet|ims_sig,internet|ims_sig,dnn,1,def_sar,qos_audio,qos_video,0,0

View File

@@ -1,2 +1,4 @@
# !!! Remove lines containing the # symbol when importing files.
#imsi,ki,aigoIndex,amf,opc
460996650000580,1234567890ABCDEF1234567890ABCDEF,0,8000 460996650000580,1234567890ABCDEF1234567890ABCDEF,0,8000
460996650000581,1234567890ABCDEF1234567890ABCDEF,0,8000 460996650000581,1234567890ABCDEF1234567890ABCDEF,0,8000

View File

@@ -1,2 +1,4 @@
# !!! Remove lines containing the # symbol when importing files.
#IMSI,MSISDN,UeAmbrTpl,NssaiTpl,AreaForbiddenTpl,ServiceAreaRestrictionTpl,RatRestrictions,CnTypeRestrictions,SmfSel,SmData,EPSDat
460996650000580,62357000580,def_ambr,def_nssai,def_arfb,def_sar,0,3,def_snssai,1-000001&content&ims,1,64,24,65,def_eps,1,010200000000,- 460996650000580,62357000580,def_ambr,def_nssai,def_arfb,def_sar,0,3,def_snssai,1-000001&content&ims,1,64,24,65,def_eps,1,010200000000,-
460996650000581,62357000581,def_ambr,def_nssai,def_arfb,def_sar,0,3,def_snssai,1-000001&content&ims,1,64,24,65,def_eps,1,010200000000,- 460996650000581,62357000581,def_ambr,def_nssai,def_arfb,def_sar,0,3,def_snssai,1-000001&content&ims,1,64,24,65,def_eps,1,010200000000,-

View File

@@ -1,3 +1,4 @@
# !!! Remove lines containing the # symbol when importing files.
#username,password #username,password
62357000580,123456 62357000580,123456
62357000581,123456 62357000581,123456

View File

@@ -1,3 +1,4 @@
# !!! Remove lines containing the # symbol when importing files.
#vlote=0 MSISDN and IMSI need to be filled in the same way. #vlote=0 MSISDN and IMSI need to be filled in the same way.
#imsi,msisdn,vlote,vni #imsi,msisdn,vlote,vni
460996650000580,62357000580,1,ims.mnc000.mcc460.3gppnetwork.org 460996650000580,62357000580,1,ims.mnc000.mcc460.3gppnetwork.org

View File

@@ -209,7 +209,7 @@ export async function origGet(coreUid: string) {
*/ */
export async function top3Sel(coreUid: string) { export async function top3Sel(coreUid: string) {
return await request({ return await request({
url: `/neData/alarm/count/ne`, url: `/neData/alarm/count/top`,
method: 'GET', method: 'GET',
params: { params: {
coreUid: coreUid, coreUid: coreUid,

View File

@@ -19,27 +19,61 @@ export async function getMMLByNE(neType: string) {
}); });
} }
/**
* 查询UDM可用cmd命令
* @returns object
*/
export async function getMMLByUDM() {
return request({
url: '/tool/mml/subscriber/list',
method: 'GET',
params: {
neType: 'UDM',
status: 'Active',
pageNum: 1,
pageSize: 1000,
},
timeout: 60_000,
});
}
/** /**
* 发送网元的mml命令 * 发送网元的mml命令
* @param neType 网元类型 * @param neType 网元类型
* @param coreUid 网元类型
* @param neId 网元ID * @param neId 网元ID
* @param objectType 接口类型 * @param objectType 接口类型
* @param cmdStr 命令串 * @param cmdStr 命令串
* @returns * @returns
*/ */
export async function sendMMlByNE( export async function sendMML(data: Record<string, any>) {
neType: string, return request({
neId: string, url: '/tool/mml/command',
objectType: string, method: 'POST',
data: data,
timeout: 180_000,
});
}
/**
* 发送网元的mml命令
* @param coreUid 网元类型
* @param neUid 网元ID
* @param cmdArr 命令数组
* @returns
*/
export async function sendMMlByGeneral(
coreUid: string,
neUid: string,
cmdArr: string[] cmdArr: string[]
) { ) {
return request({ return request({
url: '/tool/mml/command', url: '/tool/mml/command',
method: 'POST', method: 'POST',
data: { data: {
neType: neType, coreUid: coreUid,
neId: neId, neUid: neUid,
type: objectType, type: 'General',
command: cmdArr, command: cmdArr,
}, },
timeout: 180_000, timeout: 180_000,

View File

@@ -1,39 +0,0 @@
import { request } from '@/plugins/http-fetch';
/**
* 查询UDM可用cmd命令
* @returns object
*/
export async function getMMLByUDM() {
return request({
url: '/tool/mml/subscriber/list',
method: 'GET',
params: {
neType: 'UDM',
status: 'Active',
pageNum: 1,
pageSize: 1000,
},
timeout: 60_000,
});
}
/**
* 发送UDM的mml命令
* @param neId 网元ID
* @param cmdStr 命令串
* @returns
*/
export async function sendMMlByUDM(neId: string, cmdArr: string[]) {
return request({
url: '/tool/mml/command',
method: 'POST',
data: {
neType: 'UDM',
neId: neId,
type: 'General',
command: cmdArr,
},
timeout: 180_000,
});
}

View File

@@ -68,10 +68,11 @@ export function delNeConfigData(params: Record<string, any>) {
/** /**
* 从参数配置PCF中获取对应信息提供给PCF用户策略输入框 * 从参数配置PCF中获取对应信息提供给PCF用户策略输入框
* @param neId * @param coreUid 核心网标识
* @param neUid 网元标识
* @returns object {pccRules,sessionRules,qosTemplate,headerEnrichTemplate,serviceAreaRestriction} * @returns object {pccRules,sessionRules,qosTemplate,headerEnrichTemplate,serviceAreaRestriction}
*/ */
export async function getPCFRule(neId: any) { export async function getPCFRule(coreUid: string, neUid: string) {
const paramNameArr = [ const paramNameArr = [
'pccRules', 'pccRules',
'sessionRules', 'sessionRules',
@@ -84,7 +85,7 @@ export async function getPCFRule(neId: any) {
reqArr.push( reqArr.push(
request({ request({
url: `/ne/config/data`, url: `/ne/config/data`,
params: { neType: 'PCF', neId, paramName }, params: { neType: 'PCF', coreUid, neUid, paramName },
method: 'GET', method: 'GET',
}) })
); );

View File

@@ -47,11 +47,11 @@ export function getNeLicenseByNF(coreUid: string, neUid: string) {
* @param neId 网元id * @param neId 网元id
* @returns object * @returns object
*/ */
export function codeNeLicense(neType: string, neId: string) { export function codeNeLicense(coreUid: string, neUid: string) {
return request({ return request({
url: `/ne/license/code`, url: `/ne/license/code`,
method: 'GET', method: 'GET',
params: { neType, neId }, params: { coreUid, neUid },
}); });
} }

View File

@@ -44,7 +44,7 @@ export function exportAMFDataUE(query: Record<string, any>) {
/** /**
* AMF-接入基站信息列表 * AMF-接入基站信息列表
* @param query 查询参数 neId=001&id=1 * @param query 查询参数 coreUid=001&neUid=001&id=1
* @returns object * @returns object
*/ */
export function listAMFNblist(query: Record<string, any>) { export function listAMFNblist(query: Record<string, any>) {
@@ -58,12 +58,12 @@ export function listAMFNblist(query: Record<string, any>) {
/** /**
* AMF-接入基站状态信息列表 * AMF-接入基站状态信息列表
* @param query 查询参数 neId=001&state=1 * @param query 查询参数 coreUid=001&neUid=001&state=1
* @returns object * @returns object
*/ */
export function listAMFNbStatelist(query: Record<string, any>) { export function listAMFNbStatelist(query: Record<string, any>) {
return request({ return request({
url: '/neData/amf/nb/list-cfg', url: '/neData/amf/nb/addrs',
method: 'GET', method: 'GET',
params: query, params: query,
timeout: 60_000, timeout: 60_000,
@@ -76,13 +76,18 @@ export function listAMFNbStatelist(query: Record<string, any>) {
* @param data 数据 { "index": 1, "name": "Gnb", "address": "192.168.8.1", "position": "Area-B" } * @param data 数据 { "index": 1, "name": "Gnb", "address": "192.168.8.1", "position": "Area-B" }
* @returns object * @returns object
*/ */
export function addAMFNbState(neId: string, data: Record<string, any>) { export function addAMFNbState(
coreUid: string,
neUid: string,
data: Record<string, any>
) {
return request({ return request({
url: `/ne/config/data`, url: `/ne/config/data`,
method: 'POST', method: 'POST',
data: { data: {
neType: 'AMF', neType: 'AMF',
neId: neId, neUid: neUid,
coreUid: coreUid,
paramName: 'gnbList', paramName: 'gnbList',
paramData: data, paramData: data,
loc: `${data.index}`, loc: `${data.index}`,
@@ -92,17 +97,23 @@ export function addAMFNbState(neId: string, data: Record<string, any>) {
/** /**
* AMF-接入基站状态信息修改 * AMF-接入基站状态信息修改
* @param neId 网元ID * @param coreUid 核心网标识
* @param neUid 网元标识
* @param data 数据 { "index": 1, "name": "Gnb", "address": "192.168.8.1", "position": "Area-B" } * @param data 数据 { "index": 1, "name": "Gnb", "address": "192.168.8.1", "position": "Area-B" }
* @returns object * @returns object
*/ */
export function editAMFNbState(neId: string, data: Record<string, any>) { export function editAMFNbState(
coreUid: string,
neUid: string,
data: Record<string, any>
) {
return request({ return request({
url: `/ne/config/data`, url: `/ne/config/data`,
method: 'PUT', method: 'PUT',
data: { data: {
neType: 'AMF', neType: 'AMF',
neId: neId, neUid: neUid,
coreUid: coreUid,
paramName: 'gnbList', paramName: 'gnbList',
paramData: data, paramData: data,
loc: `${data.index}`, loc: `${data.index}`,
@@ -112,17 +123,23 @@ export function editAMFNbState(neId: string, data: Record<string, any>) {
/** /**
* AMF-接入基站状态信息删除 * AMF-接入基站状态信息删除
* @param neId 网元ID * @param coreUid 核心网标识
* @param neUid 网元标识
* @param index 数据index * @param index 数据index
* @returns object * @returns object
*/ */
export function delAMFNbState(neId: string, index: string | number) { export function delAMFNbState(
coreUid: string,
neUid: string,
index: string | number
) {
return request({ return request({
url: `/ne/config/data`, url: `/ne/config/data`,
method: 'DELETE', method: 'DELETE',
params: { params: {
neType: 'AMF', neType: 'AMF',
neId: neId, neUid: neUid,
coreUid: coreUid,
paramName: 'gnbList', paramName: 'gnbList',
loc: `${index}`, loc: `${index}`,
}, },

View File

@@ -47,17 +47,17 @@ export function exportIMSDataCDR(query: Record<string, any>) {
* @param query 查询参数 * @param query 查询参数
* @returns object * @returns object
*/ */
export function listIMSSessionNum(neId: string) { export function listIMSSessionNum(coreUid: string, neUid: string) {
return request({ return request({
url: '/neData/ims/session/num', url: '/neData/ims/session/num',
method: 'GET', method: 'GET',
params: { neId }, params: { coreUid, neUid },
}); });
} }
/** /**
* IMS-在线会话用户列表信息 * IMS-在线会话用户列表信息
* @param query 查询参数 {neId, imsi, msisdn} * @param query 查询参数 {coreUid, neUid, imsi, msisdn}
* @returns objectv * @returns objectv
*/ */
export function listIMSSessionList(query: Record<string, any>) { export function listIMSSessionList(query: Record<string, any>) {

View File

@@ -63,7 +63,7 @@ export function listMMENblist(query: Record<string, any>) {
*/ */
export function listMMENbStatelist(query: Record<string, any>) { export function listMMENbStatelist(query: Record<string, any>) {
return request({ return request({
url: '/neData/mme/nb/list-cfg', url: '/neData/mme/nb/addrs',
method: 'GET', method: 'GET',
params: query, params: query,
timeout: 60_000, timeout: 60_000,
@@ -72,17 +72,23 @@ export function listMMENbStatelist(query: Record<string, any>) {
/** /**
* MME-接入基站状态信息新增 * MME-接入基站状态信息新增
* @param neId 网元ID * @param coreUid 核心网标识
* @param neUid 网元标识
* @param data 数据 { "index": 1, "name": "Enb", "address": "192.168.8.1", "position": "Area-B" } * @param data 数据 { "index": 1, "name": "Enb", "address": "192.168.8.1", "position": "Area-B" }
* @returns object * @returns object
*/ */
export function addMMENbState(neId: string, data: Record<string, any>) { export function addMMENbState(
coreUid: string,
neUid: string,
data: Record<string, any>
) {
return request({ return request({
url: `/ne/config/data`, url: `/ne/config/data`,
method: 'POST', method: 'POST',
data: { data: {
neType: 'MME', neType: 'MME',
neId: neId, neUid: neUid,
coreUid: coreUid,
paramName: 'enbList', paramName: 'enbList',
paramData: data, paramData: data,
loc: `${data.index}`, loc: `${data.index}`,
@@ -92,17 +98,23 @@ export function addMMENbState(neId: string, data: Record<string, any>) {
/** /**
* MME-接入基站状态信息修改 * MME-接入基站状态信息修改
* @param neId 网元ID * @param coreUid 核心网标识
* @param neUid 网元标识
* @param data 数据 { "index": 1, "name": "Enb", "address": "192.168.8.1", "position": "Area-B" } * @param data 数据 { "index": 1, "name": "Enb", "address": "192.168.8.1", "position": "Area-B" }
* @returns object * @returns object
*/ */
export function editMMENbState(neId: string, data: Record<string, any>) { export function editMMENbState(
coreUid: string,
neUid: string,
data: Record<string, any>
) {
return request({ return request({
url: `/ne/config/data`, url: `/ne/config/data`,
method: 'PUT', method: 'PUT',
data: { data: {
neType: 'MME', neType: 'MME',
neId: neId, neUid: neUid,
coreUid: coreUid,
paramName: 'enbList', paramName: 'enbList',
paramData: data, paramData: data,
loc: `${data.index}`, loc: `${data.index}`,
@@ -112,17 +124,23 @@ export function editMMENbState(neId: string, data: Record<string, any>) {
/** /**
* MME-接入基站状态信息删除 * MME-接入基站状态信息删除
* @param neId 网元ID * @param coreUid 核心网标识
* @param neUid 网元标识
* @param index 数据index * @param index 数据index
* @returns object * @returns object
*/ */
export function delMMENbState(neId: string, index: string | number) { export function delMMENbState(
coreUid: string,
neUid: string,
index: string | number
) {
return request({ return request({
url: `/ne/config/data`, url: `/ne/config/data`,
method: 'DELETE', method: 'DELETE',
params: { params: {
neType: 'MME', neType: 'MME',
neId: neId, neUid: neUid,
coreUid: coreUid,
paramName: 'enbList', paramName: 'enbList',
loc: `${index}`, loc: `${index}`,
}, },

View File

@@ -7,7 +7,7 @@ import { request } from '@/plugins/http-fetch';
*/ */
export function listNBState(query: Record<string, any>) { export function listNBState(query: Record<string, any>) {
return request({ return request({
url: '/neData/nb-state/list', url: '/neData/state/nb/list',
method: 'GET', method: 'GET',
params: query, params: query,
timeout: 60_000, timeout: 60_000,
@@ -21,7 +21,7 @@ export function listNBState(query: Record<string, any>) {
*/ */
export function exportNBState(query: Record<string, any>) { export function exportNBState(query: Record<string, any>) {
return request({ return request({
url: '/neData/nb-state/export', url: '/neData/state/nb/export',
method: 'GET', method: 'GET',
params: query, params: query,
responseType: 'blob', responseType: 'blob',

View File

@@ -7,10 +7,11 @@ import { parseObjLineToHump } from '@/utils/parse-utils';
* @param query {imsi} * @param query {imsi}
* @returns object * @returns object
*/ */
export function listNSSFSubList() { export function listNSSFSubList(query: Record<string, any>) {
return request({ return request({
url: '/neData/nssf/sub/list', url: '/neData/nssf/sub/list',
method: 'GET', method: 'GET',
params: query,
}); });
} }
@@ -18,9 +19,10 @@ export function listNSSFSubList() {
* NSSF-AMF列表信息 * NSSF-AMF列表信息
* @returns object * @returns object
*/ */
export function listNSSFAmfList() { export function listNSSFAmfList(query: Record<string, any>) {
return request({ return request({
url: '/neData/nssf/amf/list', url: '/neData/nssf/amf/list',
method: 'GET', method: 'GET',
params: query,
}); });
} }

View File

@@ -47,17 +47,17 @@ export function exportSMFDataCDR(query: Record<string, any>) {
* @param query 查询参数 * @param query 查询参数
* @returns object * @returns object
*/ */
export function listSMFSubNum(neId: string) { export function listSMFSubNum(coreUid: string, neUid: string) {
return request({ return request({
url: '/neData/smf/sub/num', url: '/neData/smf/sub/num',
method: 'GET', method: 'GET',
params: { neId }, params: { coreUid, neUid },
}); });
} }
/** /**
* SMF-在线订阅用户列表信息 * SMF-在线订阅用户列表信息
* @param query 查询参数 {neId, pageNum, imsi, msisdn, upstate} * @param query 查询参数 {coreUid, neUid, pageNum, imsi, msisdn, upstate}
* @returns object * @returns object
*/ */
export function listSMFSubList(query: Record<string, any>) { export function listSMFSubList(query: Record<string, any>) {

View File

@@ -2,13 +2,15 @@ import { request } from '@/plugins/http-fetch';
/** /**
* UDM鉴权用户重载数据 * UDM鉴权用户重载数据
* @param neId 网元ID * @param coreUid 核心网标识
* @param neUid 网元标识
* @returns object * @returns object
*/ */
export function resetUDMAuth(neId: string) { export function resetUDMAuth(coreUid: string, neUid: string) {
return request({ return request({
url: `/neData/udm/auth/resetData/${neId}`, url: `/neData/udm/auth/reset`,
method: 'PUT', method: 'PUT',
params: { coreUid, neUid },
timeout: 180_000, timeout: 180_000,
}); });
} }
@@ -23,20 +25,21 @@ export function listUDMAuth(query: Record<string, any>) {
url: '/neData/udm/auth/list', url: '/neData/udm/auth/list',
method: 'GET', method: 'GET',
params: query, params: query,
timeout: 30_000, timeout: 60_000,
}); });
} }
/** /**
* UDM鉴权用户信息 * UDM鉴权用户信息
* @param neId 网元ID * @param neUid 网元标识
* @param imsi IMSI * @param imsi IMSI
* @returns object * @returns object
*/ */
export function getUDMAuth(neId: string, imsi: string) { export function getUDMAuth(query: Record<string, any>) {
return request({ return request({
url: `/neData/udm/auth/${neId}/${imsi}`, url: `/neData/udm/auth`,
method: 'GET', method: 'GET',
params: query,
}); });
} }
@@ -47,23 +50,9 @@ export function getUDMAuth(neId: string, imsi: string) {
*/ */
export function addUDMAuth(data: Record<string, any>) { export function addUDMAuth(data: Record<string, any>) {
return request({ return request({
url: `/neData/udm/auth/${data.neId}`, url: `/neData/udm/auth`,
method: 'POST',
data: data,
timeout: 180_000,
});
}
/**
* UDM鉴权用户批量新增
* @param data 鉴权对象
* @param num 数量
* @returns object
*/
export function batchAddUDMAuth(data: Record<string, any>, num: number) {
return request({
url: `/neData/udm/auth/${data.neId}/${num}`,
method: 'POST', method: 'POST',
params: { num: data.num },
data: data, data: data,
timeout: 180_000, timeout: 180_000,
}); });
@@ -76,7 +65,7 @@ export function batchAddUDMAuth(data: Record<string, any>, num: number) {
*/ */
export function updateUDMAuth(data: Record<string, any>) { export function updateUDMAuth(data: Record<string, any>) {
return request({ return request({
url: `/neData/udm/auth/${data.neId}`, url: `/neData/udm/auth`,
method: 'PUT', method: 'PUT',
data: data, data: data,
timeout: 180_000, timeout: 180_000,
@@ -85,29 +74,17 @@ export function updateUDMAuth(data: Record<string, any>) {
/** /**
* UDM鉴权用户删除 * UDM鉴权用户删除
* @param coreUid 核心网标识
* @param neId 网元ID * @param neId 网元ID
* @param imsi IMSI * @param imsi IMSI
* @param num 数量 大于1为批量
* @returns object * @returns object
*/ */
export function delUDMAuth(neId: string, imsi: string) { export function delUDMAuth(query: Record<string, any>) {
return request({ return request({
url: `/neData/udm/auth/${neId}/${imsi}`, url: `/neData/udm/auth`,
method: 'DELETE',
timeout: 180_000,
});
}
/**
* UDM鉴权用户批量删除
* @param neId 网元ID
* @param imsi IMSI
* @param num 数量
* @returns object
*/
export function batchDelUDMAuth(neId: string, imsi: string, num: number) {
return request({
url: `/neData/udm/auth/${neId}/${imsi}/${num}`,
method: 'DELETE', method: 'DELETE',
params: query,
timeout: 180_000, timeout: 180_000,
}); });
} }

View File

@@ -2,13 +2,15 @@ import { request } from '@/plugins/http-fetch';
/** /**
* UDM签约用户重载数据 * UDM签约用户重载数据
* @param neId 网元ID * @param coreUid 核心网ID
* @param neUid 网元ID
* @returns object * @returns object
*/ */
export function resetUDMSub(neId: string) { export function resetUDMSub(coreUid: string, neUid: string) {
return request({ return request({
url: `/neData/udm/sub/resetData/${neId}`, url: `/neData/udm/sub/reset`,
method: 'PUT', method: 'PUT',
params: { coreUid, neUid },
timeout: 180_000, timeout: 180_000,
}); });
} }
@@ -23,20 +25,21 @@ export function listUDMSub(query: Record<string, any>) {
url: '/neData/udm/sub/list', url: '/neData/udm/sub/list',
method: 'GET', method: 'GET',
params: query, params: query,
timeout: 30_000, timeout: 60_000,
}); });
} }
/** /**
* UDM签约用户信息 * UDM签约用户信息
* @param neId 网元ID * @param neUid 网元标识
* @param imsi IMSI * @param imsi IMSI
* @returns object * @returns object
*/ */
export function getUDMSub(neId: string, imsi: string) { export function getUDMSub(query: Record<string, any>) {
return request({ return request({
url: `/neData/udm/sub/${neId}/${imsi}`, url: `/neData/udm/sub`,
method: 'GET', method: 'GET',
params: query,
}); });
} }
@@ -47,23 +50,9 @@ export function getUDMSub(neId: string, imsi: string) {
*/ */
export function addUDMSub(data: Record<string, any>) { export function addUDMSub(data: Record<string, any>) {
return request({ return request({
url: `/neData/udm/sub/${data.neId}`, url: `/neData/udm/sub`,
method: 'POST',
data: data,
timeout: 180_000,
});
}
/**
* UDM签约用户批量新增
* @param data 签约对象
* @param num 数量
* @returns object
*/
export function batchAddUDMSub(data: Record<string, any>, num: number) {
return request({
url: `/neData/udm/sub/${data.neId}/${num}`,
method: 'POST', method: 'POST',
params: { num: data.num },
data: data, data: data,
timeout: 180_000, timeout: 180_000,
}); });
@@ -76,7 +65,7 @@ export function batchAddUDMSub(data: Record<string, any>, num: number) {
*/ */
export function updateUDMSub(data: Record<string, any>) { export function updateUDMSub(data: Record<string, any>) {
return request({ return request({
url: `/neData/udm/sub/${data.neId}`, url: `/neData/udm/sub`,
method: 'PUT', method: 'PUT',
data: data, data: data,
timeout: 180_000, timeout: 180_000,
@@ -88,25 +77,11 @@ export function updateUDMSub(data: Record<string, any>) {
* @param data 签约对象 * @param data 签约对象
* @returns object * @returns object
*/ */
export function delUDMSub(neId: string, imsi: string) { export function delUDMSub(query: Record<string, any>) {
return request({ return request({
url: `/neData/udm/sub/${neId}/${imsi}`, url: `/neData/udm/sub`,
method: 'DELETE',
timeout: 180_000,
});
}
/**
* UDM签约用户批量删除
* @param neId 网元ID
* @param imsi IMSI
* @param num 数量
* @returns object
*/
export function batchDelUDMSub(neId: string, imsi: string, num: number) {
return request({
url: `/neData/udm/sub/${neId}/${imsi}/${num}`,
method: 'DELETE', method: 'DELETE',
params: query,
timeout: 180_000, timeout: 180_000,
}); });
} }

View File

@@ -1,115 +1,83 @@
import { request } from '@/plugins/http-fetch'; import { request } from '@/plugins/http-fetch';
/** /**
* UDMVOIP用户重载数据 * UDMVoIP用户重载数据
* @param neId 网元ID * @param coreUid 核心网ID
* @param neUid 网元ID
* @returns object * @returns object
*/ */
export function resetUDMVOIP(neId: string) { export function resetUDMVoIP(coreUid: string, neUid: string) {
return request({ return request({
url: `/neData/udm/voip/resetData/${neId}`, url: `/neData/udm/voip/reset`,
method: 'PUT', method: 'PUT',
params: { coreUid, neUid },
timeout: 180_000, timeout: 180_000,
}); });
} }
/** /**
* UDMVOIP用户列表 * UDMVoIP用户列表
* @param query 查询参数 * @param query 查询参数
* @returns object * @returns object
*/ */
export function listUDMVOIP(query: Record<string, any>) { export function listUDMVoIP(query: Record<string, any>) {
return request({ return request({
url: '/neData/udm/voip/list', url: '/neData/udm/voip/list',
method: 'GET', method: 'GET',
params: query, params: query,
timeout: 30_000, timeout: 60_000,
}); });
} }
/** /**
* UDMVOIP用户信息 * UDMVoIP用户信息
* @param neId 网元ID * @param neUid 网元标识
* @param username username * @param username username
* @returns object * @returns object
*/ */
export function getUDMVOIP(neId: string, username: string) { export function getUDMVoIP(query: Record<string, any>) {
return request({ return request({
url: `/neData/udm/voip/${neId}/${username}`, url: `/neData/udm/voip`,
method: 'GET', method: 'GET',
params: query,
}); });
} }
/** /**
* UDMVOIP用户新增 * UDMVoIP用户新增
* @param data VOIP对象 * @param data VoIP对象 username password
* @returns object * @returns object
*/ */
export function addUDMVOIP( export function addUDMVoIP(data: Record<string, any>) {
neId: string,
data: { username: string; password: string }
) {
return request({ return request({
url: `/neData/udm/voip/${neId}`, url: `/neData/udm/voip`,
method: 'POST', method: 'POST',
params: { num: data.num },
data: data, data: data,
timeout: 180_000, timeout: 180_000,
}); });
} }
/** /**
* UDMVOIP用户批量新增 * UDMVoIP用户删除
* @param data VOIP对象 * @param data VoIP对象
* @param num 数量
* @returns object * @returns object
*/ */
export function batchAddUDMVOIP( export function delUDMVoIP(query: Record<string, any>) {
neId: string,
data: { username: string; password: string },
num: number
) {
return request({ return request({
url: `/neData/udm/voip/${neId}/${num}`, url: `/neData/udm/voip`,
method: 'POST',
data: data,
timeout: 180_000,
});
}
/**
* UDMVOIP用户删除
* @param data VOIP对象
* @returns object
*/
export function delUDMVOIP(neId: string, username: string) {
return request({
url: `/neData/udm/voip/${neId}/${username}`,
method: 'DELETE', method: 'DELETE',
params: query,
timeout: 180_000, timeout: 180_000,
}); });
} }
/** /**
* UDMVOIP用户批量删除 * UDMVoIP用户导出
* @param neId 网元ID
* @param username username
* @param num 数量
* @returns object
*/
export function batchDelUDMVOIP(neId: string, username: string, num: number) {
return request({
url: `/neData/udm/voip/${neId}/${username}/${num}`,
method: 'DELETE',
timeout: 180_000,
});
}
/**
* UDMVOIP用户导出
* @param data 数据参数 * @param data 数据参数
* @returns bolb * @returns bolb
*/ */
export function exportUDMVOIP(data: Record<string, any>) { export function exportUDMVoIP(data: Record<string, any>) {
return request({ return request({
url: '/neData/udm/voip/export', url: '/neData/udm/voip/export',
method: 'GET', method: 'GET',
@@ -120,11 +88,11 @@ export function exportUDMVOIP(data: Record<string, any>) {
} }
/** /**
* UDMVOIP用户导入 * UDMVoIP用户导入
* @param data 表单数据对象 * @param data 表单数据对象
* @returns object * @returns object
*/ */
export function importUDMVOIP(data: Record<string, any>) { export function importUDMVoIP(data: Record<string, any>) {
return request({ return request({
url: `/neData/udm/voip/import`, url: `/neData/udm/voip/import`,
method: 'POST', method: 'POST',

View File

@@ -2,13 +2,15 @@ import { request } from '@/plugins/http-fetch';
/** /**
* UDMVolteIMS用户重载数据 * UDMVolteIMS用户重载数据
* @param neId 网元ID * @param coreUid 核心网ID
* @param neUid 网元ID
* @returns object * @returns object
*/ */
export function resetUDMVolteIMS(neId: string) { export function resetUDMVolteIMS(coreUid: string, neUid: string) {
return request({ return request({
url: `/neData/udm/volte-ims/resetData/${neId}`, url: `/neData/udm/volte-ims/reset`,
method: 'PUT', method: 'PUT',
params: { coreUid, neUid },
timeout: 180_000, timeout: 180_000,
}); });
} }
@@ -23,7 +25,7 @@ export function listUDMVolteIMS(query: Record<string, any>) {
url: '/neData/udm/volte-ims/list', url: '/neData/udm/volte-ims/list',
method: 'GET', method: 'GET',
params: query, params: query,
timeout: 30_000, timeout: 60_000,
}); });
} }
@@ -33,10 +35,11 @@ export function listUDMVolteIMS(query: Record<string, any>) {
* @param imsi IMSI * @param imsi IMSI
* @returns object * @returns object
*/ */
export function getUDMVolteIMS(neId: string, imsi: string) { export function getUDMVolteIMS(query: Record<string, any>) {
return request({ return request({
url: `/neData/udm/volte-ims/${neId}/${imsi}`, url: `/neData/udm/volte-ims`,
method: 'GET', method: 'GET',
params: query,
}); });
} }
@@ -47,23 +50,9 @@ export function getUDMVolteIMS(neId: string, imsi: string) {
*/ */
export function addUDMVolteIMS(data: Record<string, any>) { export function addUDMVolteIMS(data: Record<string, any>) {
return request({ return request({
url: `/neData/udm/volte-ims/${data.neId}`, url: `/neData/udm/volte-ims`,
method: 'POST',
data: data,
timeout: 180_000,
});
}
/**
* UDMVolteIMS用户批量新增
* @param data 签约对象
* @param num 数量
* @returns object
*/
export function batchAddUDMVolteIMS(data: Record<string, any>, num: number) {
return request({
url: `/neData/udm/volte-ims/${data.neId}/${num}`,
method: 'POST', method: 'POST',
params: { num: data.num },
data: data, data: data,
timeout: 180_000, timeout: 180_000,
}); });
@@ -71,38 +60,19 @@ export function batchAddUDMVolteIMS(data: Record<string, any>, num: number) {
/** /**
* UDMVolteIMS用户删除 * UDMVolteIMS用户删除
* @param neId 网元ID * @param coreUid 核心网ID
* @param imsi_msisdn IMSI/MSISDN * @param neUid 网元ID
* @param tag 标签 0-voip 1-volte
* @returns object
*/
export function delUDMVolteIMS(neId: string, imsi_msisdn: string, tag: string) {
return request({
url: `/neData/udm/volte-ims/${neId}/${imsi_msisdn}`,
method: 'DELETE',
params: { volte: tag },
timeout: 180_000,
});
}
/**
* UDMVolteIMS用户批量删除
* @param neId 网元ID
* @param imsi IMSI * @param imsi IMSI
* @param msisdn MSISDN
* @param volte 标签 0-voip 1-volte
* @param num 数量 * @param num 数量
* @param tag 标签 0-voip 1-volte
* @returns object * @returns object
*/ */
export function batchDelUDMVolteIMS( export function delUDMVolteIMS(query: Record<string, any>) {
neId: string,
imsi: string,
num: number,
tag: string
) {
return request({ return request({
url: `/neData/udm/volte-ims/${neId}/${imsi}/${num}`, url: `/neData/udm/volte-ims`,
method: 'DELETE', method: 'DELETE',
params: { volte: tag }, params: query,
timeout: 180_000, timeout: 180_000,
}); });
} }

View File

@@ -277,19 +277,21 @@ export function transferStaticFile(data: Record<string, any>) {
*/ */
export async function uploadFileToNE( export async function uploadFileToNE(
neType: string, neType: string,
neId: string, neuid: string,
coreUid: string,
fileData: File, fileData: File,
chunkSize: number = 1 chunkSize: number = 1
) { ) {
const uploadChunkRes = await uploadFileChunk(fileData, chunkSize, 'import'); const uploadChunkRes = await uploadFileChunk(fileData, chunkSize, 'import');
if (uploadChunkRes.code === RESULT_CODE_SUCCESS) { if (uploadChunkRes.code === RESULT_CODE_SUCCESS) {
const transferToNeFileRes = await request({ const transferToNeFileRes = await request({
url: `/ne/action/pushFile`, url: `/ne/action/file/push`,
method: 'POST', method: 'POST',
data: { data: {
uploadPath: uploadChunkRes.data.filePath, uploadPath: uploadChunkRes.data.filePath,
neType, neType,
neId, neuid,
coreUid,
delTemp: true, delTemp: true,
}, },
timeout: 60_000, timeout: 60_000,

View File

@@ -8,13 +8,3 @@ export function iperfV(data: Record<string, string>) {
params: data, params: data,
}); });
} }
// iperf 软件安装
export function iperfI(data: Record<string, string>) {
return request({
url: '/tool/iperf/i',
method: 'POST',
data: data,
timeout: 60_000,
});
}

View File

@@ -36,3 +36,36 @@ export const NE_TYPE_LIST = [
* UDM-adb/kvdb * UDM-adb/kvdb
*/ */
export const NE_EXPAND_LIST = ['ADB', 'KVDB', 'RTPROXY', 'MF']; export const NE_EXPAND_LIST = ['ADB', 'KVDB', 'RTPROXY', 'MF'];
// 组号-其他
export const WS_GROUP_OTHER = '0';
// 组号-跟踪任务网元数据变更 2_traceId
export const WS_GROUP_TRACE_NE = '2';
// 组号-信令跟踪Packet 4_taskNo
export const WS_GROUP_TRACE_PACKET = '4';
// 组号-网元状态 8_neType_neId
export const WS_GROUP_NE_STATE = '8';
// 组号-指标通用 10_coreUid_neUid
export const WS_GROUP_KPI = '10';
// 组号-自定义KPI指标 20_coreUid_neUid
export const WS_GROUP_KPI_C = '20';
// 组号-IMS_CDR会话事件 1005_coreUid_neUid
export const WS_GROUP_IMS_CDR = '1005';
// 组号-SMF_CDR会话事件 1006_coreUid_neUid
export const WS_GROUP_SMF_CDR = '1006';
// 组号-SMSC_CDR会话事件 1007_coreUid_neUid
export const WS_GROUP_SMSC_CDR = '1007';
// 组号-SGWC_CDR会话事件 1008_coreUid_neUid
export const WS_GROUP_SGWC_CDR = '1008';
// 组号-AMF_UE会话事件 1010_coreUid_neUid
export const WS_GROUP_AMF_UE = '1010';
// 组号-MME_UE会话事件 1011_coreUid_neUid
export const WS_GROUP_MME_UE = '1011';
// 组号-AMF_NB状态事件 1014_coreUid_neUid
export const WS_GROUP_AMF_NB = '1014';
// 组号-MME_NB状态事件 1015_coreUid_neUid
export const WS_GROUP_MME_NB = '1015';
// 组号-告警 2000_coreUid_neUid
export const WS_GROUP_ALARM = '2000';
// 组号-告警事件 2002_coreUid_neUid
export const WS_GROUP_ALARM_EVENT = '2002';

View File

@@ -818,7 +818,7 @@ export default {
checkDel:'Check Delete', checkDel:'Check Delete',
importTemplate: 'Download Template', importTemplate: 'Download Template',
}, },
udmVOIP: { udmVoIP: {
startUsername: 'Starting username', startUsername: 'Starting username',
username: 'username', username: 'username',
usernamePlease: "Please enter your username correctly", usernamePlease: "Please enter your username correctly",
@@ -957,21 +957,6 @@ export default {
smDataTip:'The IP in sm_data=1-000001&internet-1.2.3.4&ims-1.2.3.5: 1.2.3.4 is the static IP assigned to the APN of 5G user internet, and 1.2.3.5 is the static IP assigned to the APN of 5G user ims. If it is dynamic allocation, just remove the IP and the previous connector. Need to support multiple dnn uses & connections', smDataTip:'The IP in sm_data=1-000001&internet-1.2.3.4&ims-1.2.3.5: 1.2.3.4 is the static IP assigned to the APN of 5G user internet, and 1.2.3.5 is the static IP assigned to the APN of 5G user ims. If it is dynamic allocation, just remove the IP and the previous connector. Need to support multiple dnn uses & connections',
smDataArrTip:'SST,DNN/APN is required', smDataArrTip:'SST,DNN/APN is required',
}, },
base5G: {
neType: 'NE Object',
},
n3iwf: {
neType: 'N3IWF Object',
},
ue: {
neType: 'SMF Object',
},
ims: {
neType: 'IMS Object',
},
nssf:{
neType: 'NSSF Object',
},
}, },
perfManage: { perfManage: {
taskManage:{ taskManage:{

View File

@@ -818,7 +818,7 @@ export default {
checkDel:'勾选删除', checkDel:'勾选删除',
importTemplate: '导入模板', importTemplate: '导入模板',
}, },
udmVOIP: { udmVoIP: {
startUsername: '起始用户名', startUsername: '起始用户名',
username: '用户名', username: '用户名',
usernamePlease: "请正确输入用户名", usernamePlease: "请正确输入用户名",
@@ -957,21 +957,6 @@ export default {
smDataTip:'sm_data=1-000001&internet-1.2.3.4&ims-1.2.3.5中的IP1.2.3.4为5G用户internet这个APN分配的静态IP1.2.3.5为5G用户ims这个APN分配的静态IP。如果是动态分配把IP以及前面一个连接符去掉即可。需支持多个dnn用&连接', smDataTip:'sm_data=1-000001&internet-1.2.3.4&ims-1.2.3.5中的IP1.2.3.4为5G用户internet这个APN分配的静态IP1.2.3.5为5G用户ims这个APN分配的静态IP。如果是动态分配把IP以及前面一个连接符去掉即可。需支持多个dnn用&连接',
smDataArrTip:'SST,DNN/APN为必填项', smDataArrTip:'SST,DNN/APN为必填项',
}, },
base5G: {
neType: '网元对象',
},
n3iwf: {
neType: 'N3IWF网元对象',
},
ue: {
neType: 'SMF网元对象',
},
ims: {
neType: 'IMS网元对象',
},
nssf:{
neType: 'NSSF网元对象',
},
}, },
perfManage: { perfManage: {
taskManage:{ taskManage:{

View File

@@ -7,9 +7,10 @@ import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils'; import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils';
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
import { getMMLByNE, sendMMlByNE } from '@/api/mmlManage/neOperate'; import { getMMLByNE, sendMML } from '@/api/mmlManage/neOperate';
import { uploadFileToNE } from '@/api/tool/file'; import { uploadFileToNE } from '@/api/tool/file';
import { UploadRequestOption } from 'ant-design-vue/es/vc-upload/interface'; import { UploadRequestOption } from 'ant-design-vue/es/vc-upload/interface';
import { currentCoreUid } from '@/hooks/useCoreUid';
const neStore = useNeStore(); const neStore = useNeStore();
const { t } = useI18n(); const { t } = useI18n();
@@ -177,8 +178,14 @@ function fnSendMML() {
// 发送 // 发送
state.from.sendLoading = true; state.from.sendLoading = true;
const [neType, neId] = state.neType; const [neType, neUid] = state.neType;
sendMMlByNE(neType, neId, objectType, cmdArr) sendMML({
coreUid: currentCoreUid(),
neUid: neUid,
neType: neType,
type: objectType,
command: cmdArr,
})
.then(res => { .then(res => {
state.from.sendLoading = false; state.from.sendLoading = false;
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
@@ -210,8 +217,8 @@ function fnUpload(up: UploadRequestOption, name: string) {
onOk() { onOk() {
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
state.from.uploadLoading = true; state.from.uploadLoading = true;
const [neType, neId] = state.neType; const [neType, neUid] = state.neType;
uploadFileToNE(neType, neId, up.file as File, 5) uploadFileToNE(neType, neUid, currentCoreUid(), up.file as File, 5)
.then(res => { .then(res => {
// 文件转存 // 文件转存
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
@@ -459,6 +466,9 @@ function fnAutoCompleteSearch(value: string) {
/**自动完成搜索选择 */ /**自动完成搜索选择 */
function fnAutoCompleteSelect(_: any, option: any) { function fnAutoCompleteSelect(_: any, option: any) {
if (Object.keys(option).length === 0) {
return;
}
state.mmlSelect = { state.mmlSelect = {
title: option.value, title: option.value,
key: option.key, key: option.key,
@@ -510,7 +520,7 @@ function fnAutoCompleteChange(value: any, _: any) {
key: '', key: '',
operation: '', operation: '',
object: '', object: '',
objectType: state.mmlSelect.objectType, objectType: 'General',
param: [], param: [],
}; };
} }
@@ -518,16 +528,16 @@ function fnAutoCompleteChange(value: any, _: any) {
} }
/**自动完成按键触发 */ /**自动完成按键触发 */
function fnAutoCompleteKeydown(evt: any) { function fnAutoCompleteKeydown(evt: KeyboardEvent) {
if (evt.key === 'Enter') { if (evt.key === 'Enter') {
// 阻止默认的换行行为 // 阻止默认的换行行为
evt.preventDefault(); evt.preventDefault();
// 按下 Shift + Enter 键时换行 // 按下 Shift + Enter 键时换行
if (evt.shiftKey) { if (evt.shiftKey && evt.target) {
// 插入换行符 // 插入换行符
const textarea = evt.target; const textarea = evt.target as HTMLInputElement;
const start = textarea.selectionStart; const start = textarea.selectionStart || 0;
const end = textarea.selectionEnd; const end = textarea.selectionEnd || 0;
const text = textarea.value; const text = textarea.value;
textarea.value = text.substring(0, start) + '\n' + text.substring(end); textarea.value = text.substring(0, start) + '\n' + text.substring(end);
state.autoCompleteValue = textarea.value; state.autoCompleteValue = textarea.value;
@@ -541,11 +551,9 @@ function fnAutoCompleteKeydown(evt: any) {
onMounted(() => { onMounted(() => {
// 获取网元网元列表 // 获取网元网元列表
neCascaderOptions.value = neStore.getNeCascaderOptions.filter( neCascaderOptions.value = neStore.getNeCascaderOptions.filter((item: any) => {
(item: any) => { return !['OMC', 'CBC', 'SGWC'].includes(item.value); // 过滤不可用的网元
return !['OMC', 'CBC', 'SGWC'].includes(item.value); // 过滤不可用的网元 });
}
);
if (neCascaderOptions.value.length === 0) { if (neCascaderOptions.value.length === 0) {
message.warning({ message.warning({
content: t('common.noData'), content: t('common.noData'),
@@ -557,10 +565,10 @@ onMounted(() => {
const item = neCascaderOptions.value.find(s => s.value === 'AMF'); const item = neCascaderOptions.value.find(s => s.value === 'AMF');
if (item && item.children) { if (item && item.children) {
const info = item.children[0]; const info = item.children[0];
state.neType = [info.neType, info.neId]; state.neType = [info.neType, info.neUid];
} else { } else {
const info = neCascaderOptions.value[0].children[0]; const info = neCascaderOptions.value[0].children[0];
state.neType = [info.neType, info.neId]; state.neType = [info.neType, info.neUid];
} }
// 列表 // 列表

View File

@@ -10,6 +10,7 @@ import useI18n from '@/hooks/useI18n';
import { getMMLByOMC, sendMMlByOMC } from '@/api/mmlManage/omcOperate'; import { getMMLByOMC, sendMMlByOMC } from '@/api/mmlManage/omcOperate';
import { uploadFileToNE } from '@/api/tool/file'; import { uploadFileToNE } from '@/api/tool/file';
import { UploadRequestOption } from 'ant-design-vue/es/vc-upload/interface'; import { UploadRequestOption } from 'ant-design-vue/es/vc-upload/interface';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
/**网元参数 */ /**网元参数 */
@@ -18,7 +19,7 @@ let neOptions = ref<Record<string, any>[]>([]);
/**对象信息状态类型 */ /**对象信息状态类型 */
type StateType = { type StateType = {
/**网元ID */ /**网元ID */
neId: string | undefined; neUid: string | undefined;
/**命令数据 tree */ /**命令数据 tree */
mmlTreeData: any[]; mmlTreeData: any[];
/**命令选中 */ /**命令选中 */
@@ -37,7 +38,7 @@ type StateType = {
/**对象信息状态 */ /**对象信息状态 */
let state: StateType = reactive({ let state: StateType = reactive({
neId: undefined, neUid: undefined,
mmlTreeData: [], mmlTreeData: [],
mmlSelect: { mmlSelect: {
title: '', title: '',
@@ -108,7 +109,7 @@ function fnSendMML() {
if (state.from.sendLoading) { if (state.from.sendLoading) {
return; return;
} }
if (!state.neId) { if (!state.neUid) {
message.warning({ message.warning({
content: t('views.mmlManage.udmOpesrate.noOMC'), content: t('views.mmlManage.udmOpesrate.noOMC'),
duration: 5, duration: 5,
@@ -177,7 +178,7 @@ function fnSendMML() {
// 发送 // 发送
state.from.sendLoading = true; state.from.sendLoading = true;
sendMMlByOMC(state.neId, cmdArr) sendMMlByOMC(state.neUid, cmdArr)
.then(res => { .then(res => {
state.from.sendLoading = false; state.from.sendLoading = false;
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
@@ -203,8 +204,8 @@ function fnSendMML() {
/**上传变更 */ /**上传变更 */
function fnUpload(up: UploadRequestOption, name: string) { function fnUpload(up: UploadRequestOption, name: string) {
const neId = state.neId; const neUid = state.neUid;
if (!neId) { if (!neUid) {
message.warning({ message.warning({
content: t('views.mmlManage.udmOpesrate.noOMC'), content: t('views.mmlManage.udmOpesrate.noOMC'),
duration: 5, duration: 5,
@@ -217,7 +218,7 @@ function fnUpload(up: UploadRequestOption, name: string) {
onOk() { onOk() {
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
state.from.uploadLoading = true; state.from.uploadLoading = true;
uploadFileToNE('OMC', neId, up.file as File, 5) uploadFileToNE('OMC', neUid, currentCoreUid(), up.file as File, 5)
.then(res => { .then(res => {
// 文件转存 // 文件转存
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
@@ -518,7 +519,7 @@ onMounted(() => {
return; return;
} }
if (neOptions.value.length > 0) { if (neOptions.value.length > 0) {
state.neId = neOptions.value[0].value; state.neUid = neOptions.value[0].value;
} }
// 获取列表数据 // 获取列表数据
@@ -537,9 +538,9 @@ onMounted(() => {
:title="t('views.mmlManage.cmdTitle')" :title="t('views.mmlManage.cmdTitle')"
> >
<a-form layout="vertical" autocomplete="off"> <a-form layout="vertical" autocomplete="off">
<a-form-item name="neId "> <a-form-item name="neUid ">
<a-select <a-select
v-model:value="state.neId" v-model:value="state.neUid"
:options="neOptions" :options="neOptions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
/> />

View File

@@ -7,9 +7,10 @@ import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils'; import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils';
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
import { getMMLByUDM, sendMMlByUDM } from '@/api/mmlManage/udmOperate'; import { getMMLByUDM, sendMMlByGeneral } from '@/api/mmlManage/neOperate';
import { UploadRequestOption } from 'ant-design-vue/es/vc-upload/interface'; import { UploadRequestOption } from 'ant-design-vue/es/vc-upload/interface';
import { uploadFileToNE } from '@/api/tool/file'; import { uploadFileToNE } from '@/api/tool/file';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
/**网元参数 */ /**网元参数 */
@@ -18,7 +19,7 @@ let neOptions = ref<Record<string, any>[]>([]);
/**对象信息状态类型 */ /**对象信息状态类型 */
type StateType = { type StateType = {
/**网元ID */ /**网元ID */
neId: string | undefined; neUid: string | undefined;
/**命令数据 tree */ /**命令数据 tree */
mmlTreeData: any[]; mmlTreeData: any[];
/**命令选中 */ /**命令选中 */
@@ -37,7 +38,7 @@ type StateType = {
/**对象信息状态 */ /**对象信息状态 */
let state: StateType = reactive({ let state: StateType = reactive({
neId: undefined, neUid: undefined,
mmlTreeData: [], mmlTreeData: [],
mmlSelect: { mmlSelect: {
title: '', title: '',
@@ -108,7 +109,7 @@ function fnSendMML() {
if (state.from.sendLoading) { if (state.from.sendLoading) {
return; return;
} }
if (!state.neId) { if (!state.neUid) {
message.warning({ message.warning({
content: t('views.mmlManage.udmOpesrate.noUDM'), content: t('views.mmlManage.udmOpesrate.noUDM'),
duration: 5, duration: 5,
@@ -177,7 +178,7 @@ function fnSendMML() {
// 发送 // 发送
state.from.sendLoading = true; state.from.sendLoading = true;
sendMMlByUDM(state.neId, cmdArr) sendMMlByGeneral(currentCoreUid(), state.neUid, cmdArr)
.then(res => { .then(res => {
state.from.sendLoading = false; state.from.sendLoading = false;
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
@@ -203,8 +204,8 @@ function fnSendMML() {
/**上传变更 */ /**上传变更 */
function fnUpload(up: UploadRequestOption, name: string) { function fnUpload(up: UploadRequestOption, name: string) {
const neId = state.neId; const neUid = state.neUid;
if (!neId) { if (!neUid) {
message.warning({ message.warning({
content: t('views.mmlManage.udmOpesrate.noUDM'), content: t('views.mmlManage.udmOpesrate.noUDM'),
duration: 5, duration: 5,
@@ -217,7 +218,7 @@ function fnUpload(up: UploadRequestOption, name: string) {
onOk() { onOk() {
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
state.from.uploadLoading = true; state.from.uploadLoading = true;
uploadFileToNE('UDM', neId, up.file as File, 5) uploadFileToNE('UDM', neUid, currentCoreUid(), up.file as File, 5)
.then(res => { .then(res => {
// 文件转存 // 文件转存
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
@@ -425,6 +426,9 @@ function fnAutoCompleteSearch(value: string) {
/**自动完成搜索选择 */ /**自动完成搜索选择 */
function fnAutoCompleteSelect(_: any, option: any) { function fnAutoCompleteSelect(_: any, option: any) {
if (Object.keys(option).length === 0) {
return;
}
state.mmlSelect = { state.mmlSelect = {
title: option.value, title: option.value,
key: option.key, key: option.key,
@@ -518,7 +522,7 @@ onMounted(() => {
return; return;
} }
if (neOptions.value.length > 0) { if (neOptions.value.length > 0) {
state.neId = neOptions.value[0].value; state.neUid = neOptions.value[0].value;
} }
// 获取列表数据 // 获取列表数据
@@ -537,9 +541,9 @@ onMounted(() => {
:title="t('views.mmlManage.cmdTitle')" :title="t('views.mmlManage.cmdTitle')"
> >
<a-form layout="vertical" autocomplete="off"> <a-form layout="vertical" autocomplete="off">
<a-form-item name="neId "> <a-form-item name="neUid ">
<a-select <a-select
v-model:value="state.neId" v-model:value="state.neUid"
:options="neOptions" :options="neOptions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
/> />

View File

@@ -53,11 +53,11 @@ const graphNodeTooltip = new Tooltip({
${neState.refreshTime ?? '--'} ${neState.refreshTime ?? '--'}
</span></div> </span></div>
<div>========================</div> <div>========================</div>
<div><strong>ID</strong><span>${neState.neId}</span></div> <div><strong>ID</strong><span>${neState.neUid}</span></div>
<div><strong>${t('views.monitor.topology.name')}</strong><span> <div><strong>${t('views.monitor.topology.name')}</strong><span>
${neState.neName ?? '--'} ${neState.neName ?? '--'}
</span></div> </span></div>
<div><strong>IP</strong><span>${neState.neIP}</span></div> <div><strong>IP</strong><span>${neState.ipAddr}</span></div>
<div><strong>${t('views.monitor.topology.version')}</strong><span> <div><strong>${t('views.monitor.topology.version')}</strong><span>
${neState.version ?? '--'} ${neState.version ?? '--'}
</span></div> </span></div>

View File

@@ -16,7 +16,8 @@ import { CanvasRenderer } from 'echarts/renderers';
import { markRaw } from 'vue'; import { markRaw } from 'vue';
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';
import { upfFlowData, upfFlowParse } from '../../hooks/useUPFTotalFlow'; import { upfNeUId, upfFlowData, upfFlowParse } from '../../hooks/useUPFTotalFlow';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
@@ -206,8 +207,9 @@ function fnGetInitData() {
const nowDate = new Date().getTime(); const nowDate = new Date().getTime();
listKPIData({ listKPIData({
coreUid: currentCoreUid(),
neUid: upfNeUId.value,
neType: 'UPF', neType: 'UPF',
neId: '001',
beginTime: nowDate - 5 * 60 * 1000, beginTime: nowDate - 5 * 60 * 1000,
endTime: nowDate, endTime: nowDate,
interval: 5, // 5秒 interval: 5, // 5秒
@@ -250,7 +252,9 @@ watch(
); );
onMounted(() => { onMounted(() => {
fnGetInitData(); setTimeout(() => {
fnGetInitData();
}, 1000);
}); });
</script> </script>

View File

@@ -52,8 +52,8 @@ export const graphNodeStateNum = computed(() => {
let normal = 0; let normal = 0;
let abnormal = 0; let abnormal = 0;
for (const item of graphState.data.nodes) { for (const item of graphState.data.nodes) {
const neId = item.neState.neId; const neUid = item.neState.neUid;
if (neId) { if (neUid) {
if (item.neState.online) { if (item.neState.online) {
normal += 1; normal += 1;
} else { } else {

View File

@@ -2,6 +2,9 @@ import { parseDateToStr } from '@/utils/date-utils';
import { parseSizeFromByte, parseSizeFromKbs } from '@/utils/parse-utils'; import { parseSizeFromByte, parseSizeFromKbs } from '@/utils/parse-utils';
import { ref } from 'vue'; import { ref } from 'vue';
/**当前选的upf的neUid */
export const upfNeUId = ref<any>('');
type FDType = { type FDType = {
/**时间 */ /**时间 */
lineXTime: string[]; lineXTime: string[];

View File

@@ -1,5 +1,12 @@
import { ref } from 'vue'; import { ref } from 'vue';
/**当前选的事件的neUid */
export const eventNeUid = ref<Record<string, any>>({
AMF: '',
MME: '',
IMS: '',
});
/**ueEventAMFParse UE会话事件AMF 数据解析 */ /**ueEventAMFParse UE会话事件AMF 数据解析 */
function ueEventAMFParse( function ueEventAMFParse(
item: Record<string, any> item: Record<string, any>

View File

@@ -1,13 +1,15 @@
import { RESULT_CODE_ERROR } from '@/constants/result-constants'; import { RESULT_CODE_ERROR } from '@/constants/result-constants';
import { OptionsType, WS } from '@/plugins/ws-websocket'; import { OptionsType, WS } from '@/plugins/ws-websocket';
import { onBeforeUnmount, ref } from 'vue'; import { onBeforeUnmount } from 'vue';
import { import {
eventData, eventData,
eventListParse, eventListParse,
eventItemParseAndPush, eventItemParseAndPush,
userActivityReset, userActivityReset,
eventNeUid,
} from './useUserActivity'; } from './useUserActivity';
import { import {
upfNeUId,
upfTotalFlow, upfTotalFlow,
upfTFParse, upfTFParse,
upfFlowParse, upfFlowParse,
@@ -15,9 +17,13 @@ import {
} from './useUPFTotalFlow'; } from './useUPFTotalFlow';
import { topologyReset, neStateParse, neStateRequestMap } from './useTopology'; import { topologyReset, neStateParse, neStateRequestMap } from './useTopology';
import PQueue from 'p-queue'; import PQueue from 'p-queue';
import {
/**UPF-的Id */ WS_GROUP_AMF_UE,
export const upfWhoId = ref<any>(''); WS_GROUP_IMS_CDR,
WS_GROUP_KPI,
WS_GROUP_MME_UE,
} from '@/constants/ne-constants';
import { currentCoreUid } from '@/hooks/useCoreUid';
/**websocket连接 */ /**websocket连接 */
export default function useWS() { export default function useWS() {
@@ -39,10 +45,11 @@ export default function useWS() {
} }
// 网元状态 // 网元状态
if (requestId && requestId.startsWith('neState')) { if (requestId && requestId.startsWith('neState')) {
const neType = requestId.split('_')[1]; const neType = requestId.split('_')[3];
neStateParse(neType, data); neStateParse(neType, data);
return; return;
} }
const coreUid = currentCoreUid();
// 普通信息 // 普通信息
switch (requestId) { switch (requestId) {
@@ -68,13 +75,13 @@ export default function useWS() {
} }
break; break;
//UPF-总流量数 //UPF-总流量数
case `upf_${upfWhoId.value}_0`: case `upf_${upfNeUId.value}_0`:
upfTFParse('0', data); upfTFParse('0', data);
break; break;
case `upf_${upfWhoId.value}_7`: case `upf_${upfNeUId.value}_7`:
upfTFParse('7', data); upfTFParse('7', data);
break; break;
case `upf_${upfWhoId.value}_30`: case `upf_${upfNeUId.value}_30`:
upfTFParse('30', data); upfTFParse('30', data);
break; break;
} }
@@ -84,25 +91,25 @@ export default function useWS() {
} }
switch (data.groupId) { switch (data.groupId) {
// kpiEvent 指标UPF // kpiEvent 指标UPF
case `10_UPF_${upfWhoId.value}`: case `${WS_GROUP_KPI}_${coreUid}_${upfNeUId.value}`:
if (data.data) { if (data.data) {
upfFlowParse(data.data); upfFlowParse(data.data);
} }
break; break;
// AMF_UE会话事件 // AMF_UE会话事件
case '1010_001': case `${WS_GROUP_AMF_UE}_${coreUid}_${eventNeUid.value.AMF}`:
if (data.data) { if (data.data) {
queue.add(() => eventItemParseAndPush('amf_ue', data.data)); queue.add(() => eventItemParseAndPush('amf_ue', data.data));
} }
break; break;
// MME_UE会话事件 // MME_UE会话事件
case '1011_001': case `${WS_GROUP_MME_UE}_${coreUid}_${eventNeUid.value.MME}`:
if (data.data) { if (data.data) {
queue.add(() => eventItemParseAndPush('mme_ue', data.data)); queue.add(() => eventItemParseAndPush('mme_ue', data.data));
} }
break; break;
// IMS_CDR会话事件 // IMS_CDR会话事件
case '1005_001': case `${WS_GROUP_IMS_CDR}_${coreUid}_${eventNeUid.value.IMS}`:
if (data.data) { if (data.data) {
queue.add(() => eventItemParseAndPush('ims_cdr', data.data)); queue.add(() => eventItemParseAndPush('ims_cdr', data.data));
} }
@@ -117,13 +124,13 @@ export default function useWS() {
return; return;
} }
upfTotalFlow.value[day].requestFlag = true; upfTotalFlow.value[day].requestFlag = true;
ws.send({ ws.send({
requestId: `upf_${upfWhoId.value}_${day}`, requestId: `upf_${upfNeUId.value}_${day}`,
type: 'upf_tf', type: 'upf_tf',
data: { data: {
coreUid: currentCoreUid(),
neUid: upfNeUId.value,
neType: 'UPF', neType: 'UPF',
neId: upfWhoId.value,
day: Number(day), day: Number(day),
}, },
}); });
@@ -136,8 +143,9 @@ export default function useWS() {
requestId: 'amf_1010_001', requestId: 'amf_1010_001',
type: 'amf_ue', type: 'amf_ue',
data: { data: {
coreUid: currentCoreUid(),
neUid: eventNeUid.value.AMF,
neType: 'AMF', neType: 'AMF',
neId: '001',
sortField: 'timestamp', sortField: 'timestamp',
sortOrder: 'desc', sortOrder: 'desc',
pageNum: 1, pageNum: 1,
@@ -149,8 +157,9 @@ export default function useWS() {
requestId: 'mme_1011_001', requestId: 'mme_1011_001',
type: 'mme_ue', type: 'mme_ue',
data: { data: {
coreUid: currentCoreUid(),
neUid: eventNeUid.value.MME,
neType: 'MME', neType: 'MME',
neId: '001',
sortField: 'timestamp', sortField: 'timestamp',
sortOrder: 'desc', sortOrder: 'desc',
pageNum: 1, pageNum: 1,
@@ -162,8 +171,9 @@ export default function useWS() {
requestId: 'ims_1005_001', requestId: 'ims_1005_001',
type: 'ims_cdr', type: 'ims_cdr',
data: { data: {
coreUid: currentCoreUid(),
neUid: eventNeUid.value.IMS,
neType: 'IMS', neType: 'IMS',
neId: '001',
recordType: 'MOC', recordType: 'MOC',
sortField: 'timestamp', sortField: 'timestamp',
sortOrder: 'desc', sortOrder: 'desc',
@@ -174,8 +184,7 @@ export default function useWS() {
} }
/**重新发送至UPF 10_UPF_neId */ /**重新发送至UPF 10_UPF_neId */
function reSendUPF(neId: string) { function reSendUPF() {
upfWhoId.value = neId;
//初始时时无需还原全部属性以及关闭 //初始时时无需还原全部属性以及关闭
if (ws.state() === WebSocket.OPEN) { if (ws.state() === WebSocket.OPEN) {
ws.close(); ws.close();
@@ -184,6 +193,14 @@ export default function useWS() {
neStateRequestMap.value = new Map(); neStateRequestMap.value = new Map();
//topologyReset(); //topologyReset();
} }
const coreUid = currentCoreUid();
let subGroupIDArr: string[] = [];
subGroupIDArr.push(`${WS_GROUP_KPI}_${coreUid}_${upfNeUId.value}`);
subGroupIDArr.push(`${WS_GROUP_AMF_UE}_${coreUid}_${eventNeUid.value.AMF}`);
subGroupIDArr.push(`${WS_GROUP_MME_UE}_${coreUid}_${eventNeUid.value.MME}`);
subGroupIDArr.push(
`${WS_GROUP_IMS_CDR}_${coreUid}_${eventNeUid.value.IMS}`
);
const options: OptionsType = { const options: OptionsType = {
url: '/ws', url: '/ws',
params: { params: {
@@ -194,7 +211,7 @@ export default function useWS() {
* MME_UE会话事件(GroupID:1011_neId) * MME_UE会话事件(GroupID:1011_neId)
* IMS_CDR会话事件(GroupID:1005_neId) * IMS_CDR会话事件(GroupID:1005_neId)
*/ */
subGroupID: `10_UPF_${neId},1010_001,1011_001,1005_001`, subGroupID: subGroupIDArr.join(','),
}, },
onmessage: wsMessage, onmessage: wsMessage,
onerror: (ev: any) => { onerror: (ev: any) => {
@@ -209,7 +226,7 @@ export default function useWS() {
userActivityReset(); userActivityReset();
upfTotalFlowReset(); upfTotalFlowReset();
topologyReset(); topologyReset();
upfWhoId.value = ''; upfNeUId.value = '';
}); });
return { return {

View File

@@ -21,7 +21,7 @@ import {
graphNodeStateNum, graphNodeStateNum,
neStateRequestMap, neStateRequestMap,
} from './hooks/useTopology'; } from './hooks/useTopology';
import { upfTotalFlow, upfTFActive } from './hooks/useUPFTotalFlow'; import { upfNeUId, 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';
@@ -29,7 +29,8 @@ import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
import { upfWhoId } from './hooks/useWS'; import { currentCoreUid } from '@/hooks/useCoreUid';
import { eventNeUid } from './hooks/useUserActivity';
const router = useRouter(); const router = useRouter();
const appStore = useAppStore(); const appStore = useAppStore();
@@ -84,18 +85,19 @@ function fnGetNeState() {
// 获取节点状态 // 获取节点状态
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, coreUid, neUid } = node.neInfo;
if (!neType || !neId) continue; if (!neType || !neUid) continue;
// 请求标记检查避免重复发送 // 请求标记检查避免重复发送
if (neStateRequestMap.value.get(neType)) continue; if (neStateRequestMap.value.get(neType)) continue;
neStateRequestMap.value.set(neType, true); neStateRequestMap.value.set(neType, true);
wsSend({ wsSend({
requestId: `neState_${neType}_${neId}`, requestId: `neState_${coreUid}_${neUid}_${neType}`,
type: 'ne_state', type: 'ne_state',
data: { data: {
coreUid: coreUid,
neType: neType, neType: neType,
neId: neId, neUid: neUid,
}, },
}); });
} }
@@ -107,8 +109,8 @@ async function fnGetSkim() {
// [ // [
// 'UDM', // 'UDM',
// { // {
// request: (neId: string) => // request: (coreUid: string, neUid: string) =>
// listUDMSub({ neId: neId, pageNum: 1, pageSize: 1 }), // listUDMSub({ coreUid, neUid, pageNum: 1, pageSize: 1 }),
// process: (res: any) => // process: (res: any) =>
// res.code === RESULT_CODE_SUCCESS && // res.code === RESULT_CODE_SUCCESS &&
// (skimState.udmSubNum += res.data.total), // (skimState.udmSubNum += res.data.total),
@@ -117,7 +119,10 @@ async function fnGetSkim() {
[ [
'SMF', 'SMF',
{ {
request: (neId: string) => listSMFSubNum(neId), request: (coreUid: string, neUid: string) => {
eventNeUid.value.SMF = neUid;
return listSMFSubNum(coreUid, neUid);
},
process: (res: any) => { process: (res: any) => {
if ( if (
res.code === RESULT_CODE_SUCCESS && res.code === RESULT_CODE_SUCCESS &&
@@ -131,7 +136,10 @@ async function fnGetSkim() {
[ [
'IMS', 'IMS',
{ {
request: (neId: string) => listIMSSessionNum(neId), request: (coreUid: string, neUid: string) => {
eventNeUid.value.IMS = neUid;
return listIMSSessionNum(coreUid, neUid);
},
process: (res: any) => { process: (res: any) => {
if ( if (
res.code === RESULT_CODE_SUCCESS && res.code === RESULT_CODE_SUCCESS &&
@@ -145,7 +153,10 @@ async function fnGetSkim() {
[ [
'AMF', 'AMF',
{ {
request: (neId: string) => listAMFNblist({ neId }), request: (coreUid: string, neUid: string) => {
eventNeUid.value.AMF = neUid;
return listAMFNblist({ coreUid, neUid });
},
process: (res: any) => { process: (res: any) => {
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) { if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
skimState.gnbNum += res.data.length; skimState.gnbNum += res.data.length;
@@ -160,7 +171,10 @@ async function fnGetSkim() {
[ [
'MME', 'MME',
{ {
request: (neId: string) => listMMENblist({ neId }), request: (coreUid: string, neUid: string) => {
eventNeUid.value.MME = neUid;
return listMMENblist({ coreUid, neUid });
},
process: (res: any) => { process: (res: any) => {
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) { if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
skimState.enbNum += res.data.length; skimState.enbNum += res.data.length;
@@ -181,7 +195,7 @@ 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.coreUid, child.neUid),
process: handler.process, process: handler.process,
} }
: null; : null;
@@ -210,7 +224,12 @@ async function fnGetSkim() {
}); });
// UDM // UDM
listUDMSub({ neId: udmNeId.value, pageNum: 1, pageSize: 1 }).then(res => { listUDMSub({
coreUid: currentCoreUid(),
neUid: udmNeUid.value,
pageNum: 1,
pageSize: 1,
}).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
skimState.udmSubNum = res.data.total; skimState.udmSubNum = res.data.total;
} }
@@ -254,12 +273,12 @@ function fnToRouter(name: string, query?: any) {
} }
/**网元参数 */ /**网元参数 */
let neOtions = ref<Record<string, any>[]>([]); let upfOtions = ref<Record<string, any>[]>([]);
// UPF实时流量下拉框选择 // UPF实时流量下拉框选择
function fnSelectNe(value: any, option: any) { function fnSelectNe(value: any, option: any) {
upfWhoId.value = value; upfNeUId.value = value;
reSendUPF(value); reSendUPF();
// upfTotalFlow.value.map((item: any) => { // upfTotalFlow.value.map((item: any) => {
// item.requestFlag = false; // item.requestFlag = false;
// }); // });
@@ -270,12 +289,17 @@ function fnSelectNe(value: any, option: any) {
// loadData(); // loadData();
} }
let udmNeId = ref<string>('001'); let udmNeUid = ref<string>('');
let udmOtions = ref<Record<string, any>[]>([]); let udmOtions = ref<Record<string, any>[]>([]);
/**用户数量-选择UDM */ /**用户数量-选择UDM */
function fnSelectUDM(e: any) { function fnSelectUDM(e: any) {
udmNeId.value = e.key; udmNeUid.value = e.key;
listUDMSub({ neId: udmNeId.value, pageNum: 1, pageSize: 1 }).then(res => { listUDMSub({
coreUid: currentCoreUid(),
neUid: e.key,
pageNum: 1,
pageSize: 1,
}).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
skimState.udmSubNum = res.data.total; skimState.udmSubNum = res.data.total;
} }
@@ -294,14 +318,14 @@ onMounted(() => {
// 获取网元网元列表 // 获取网元网元列表
neStore.neCascaderOptions.forEach(item => { neStore.neCascaderOptions.forEach(item => {
if (item.value === 'UPF') { if (item.value === 'UPF') {
neOtions.value = JSON.parse(JSON.stringify(item.children)); upfOtions.value = JSON.parse(JSON.stringify(item.children));
} }
if (item.value === 'UDM') { if (item.value === 'UDM') {
udmOtions.value = JSON.parse(JSON.stringify(item.children)); udmOtions.value = JSON.parse(JSON.stringify(item.children));
} }
}); });
if (neOtions.value.length > 0) { if (upfOtions.value.length > 0) {
fnSelectNe(neOtions.value[0].value, neOtions.value[0]); fnSelectNe(upfOtions.value[0].value, upfOtions.value[0]);
} }
if (udmOtions.value.length > 0) { if (udmOtions.value.length > 0) {
fnSelectUDM({ key: udmOtions.value[0].value }); fnSelectUDM({ key: udmOtions.value[0].value });
@@ -382,7 +406,7 @@ onBeforeUnmount(() => {
<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="udmNeUid === v.value"
> >
{{ v.label }} {{ v.label }}
</a-menu-item> </a-menu-item>
@@ -535,8 +559,8 @@ onBeforeUnmount(() => {
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="upfNeUId"
:options="neOtions" :options="upfOtions"
:get-Popup-Container="getPopupContainer" :get-Popup-Container="getPopupContainer"
class="toDeep" class="toDeep"
style="width: 100px; color: #fff; margin-left: auto" style="width: 100px; color: #fff; margin-left: auto"

View File

@@ -23,6 +23,7 @@ import { markRaw, onMounted, ref } from 'vue';
import { origGet, top3Sel } from '@/api/faultManage/actAlarm'; import { origGet, top3Sel } from '@/api/faultManage/actAlarm';
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';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
@@ -85,7 +86,8 @@ const alarmTypeTypeTop = ref<any>([
// //
function initPicture() { function initPicture() {
Promise.allSettled([origGet(), top3Sel()]) const coreUid = currentCoreUid()
Promise.allSettled([origGet(coreUid), top3Sel(coreUid)])
.then(resArr => { .then(resArr => {
if (resArr[0].status === 'fulfilled') { if (resArr[0].status === 'fulfilled') {
const res0 = resArr[0].value; const res0 = resArr[0].value;

View File

@@ -61,11 +61,11 @@ const graphNodeTooltip = new Tooltip({
${neState.refreshTime ?? '--'} ${neState.refreshTime ?? '--'}
</span></div> </span></div>
<div>========================</div> <div>========================</div>
<div><strong>ID</strong><span>${neState.neId}</span></div> <div><strong>ID</strong><span>${neState.neUid}</span></div>
<div><strong>${t('views.monitor.topology.name')}</strong><span> <div><strong>${t('views.monitor.topology.name')}</strong><span>
${neState.neName ?? '--'} ${neState.neName ?? '--'}
</span></div> </span></div>
<div><strong>IP</strong><span>${neState.neIP ?? '--'}</span></div> <div><strong>IP</strong><span>${neState.ipAddr ?? '--'}</span></div>
<div><strong>${t('views.monitor.topology.version')}</strong><span> <div><strong>${t('views.monitor.topology.version')}</strong><span>
${neState.version ?? '--'} ${neState.version ?? '--'}
</span></div> </span></div>
@@ -104,15 +104,15 @@ const graphNodeTooltip = new Tooltip({
sameTypeNes.forEach((ne: any, index: number) => { sameTypeNes.forEach((ne: any, index: number) => {
// 获取该网元的状态信息 // 获取该网元的状态信息
const neStateInfo = const neStateInfo =
neStateMap?.[ne.neId] || (ne.neId === neState.neId ? neState : {}); neStateMap?.[ne.neUid] || (ne.neUid === neState.neUid ? neState : {});
content += ` content += `
<div style="margin-top: 8px;"><strong>${t( <div style="margin-top: 8px;"><strong>${t(
'views.monitor.topology.name' 'views.monitor.topology.name'
)}${ne.neName || id + '_' + ne.neId}</strong></div> )}${ne.neName || id + '_' + ne.neUid}</strong></div>
<div><strong>ID</strong><span>${ne.neId || '--'}</span></div> <div><strong>ID</strong><span>${ne.neUid || '--'}</span></div>
<div><strong>IP</strong><span>${ <div><strong>IP</strong><span>${
neStateInfo.neIP || ne.neIP || '--' neStateInfo.ipAddr || ne.ipAddr || '--'
}</span></div> }</span></div>
<div><strong>${t('views.monitor.topology.version')}</strong><span> <div><strong>${t('views.monitor.topology.version')}</strong><span>
${neStateInfo.version || ne.version || '--'} ${neStateInfo.version || ne.version || '--'}

View File

@@ -16,8 +16,12 @@ import { CanvasRenderer } from 'echarts/renderers';
import { markRaw } from 'vue'; import { markRaw } from 'vue';
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';
import { upfFlowData, upfFlowParse } from '../../hooks/useUPFTotalFlow'; import {
import { upfWhoId } from '../../hooks/useWS'; upfNeUId,
upfFlowData,
upfFlowParse,
} from '../../hooks/useUPFTotalFlow';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
@@ -207,8 +211,9 @@ function fnGetInitData() {
const nowDate = new Date().getTime(); const nowDate = new Date().getTime();
listKPIData({ listKPIData({
coreUid: currentCoreUid(),
neUid: upfNeUId.value,
neType: 'UPF', neType: 'UPF',
neId: '001',
beginTime: nowDate - 5 * 60 * 1000, beginTime: nowDate - 5 * 60 * 1000,
endTime: nowDate, endTime: nowDate,
interval: 5, // 5秒 interval: 5, // 5秒
@@ -251,7 +256,9 @@ watch(
); );
onMounted(() => { onMounted(() => {
fnGetInitData(); setTimeout(() => {
fnGetInitData();
}, 1000);
// setInterval(() => { // setInterval(() => {
// upfFlowData.value.lineXTime.push(parseDateToStr(new Date())); // upfFlowData.value.lineXTime.push(parseDateToStr(new Date()));

View File

@@ -56,8 +56,8 @@ export const graphNodeStateNum = computed(() => {
let normal = 0; let normal = 0;
let abnormal = 0; let abnormal = 0;
for (const item of graphState.data.nodes) { for (const item of graphState.data.nodes) {
const neId = item.neState.neId; const neUid = item.neState.neUid;
if (neId) { if (neUid) {
if (item.neState.online) { if (item.neState.online) {
normal += 1; normal += 1;
} else { } else {
@@ -72,8 +72,8 @@ export const graphNodeStateNum = computed(() => {
export const neStateRequestMap = ref<Map<string, boolean>>(new Map()); export const neStateRequestMap = ref<Map<string, boolean>>(new Map());
/**neStateParse 网元状态 数据解析 */ /**neStateParse 网元状态 数据解析 */
export function neStateParse(neType: string, data: Record<string, any>,neId: string) { export function neStateParse(neType: string, data: Record<string, any>,neUid: string) {
// console.log('neStateParse',neType, data, neId); // console.log('neStateParse',neType, data, neUid);
const { combos, edges, nodes } = graphState.data; const { combos, edges, nodes } = graphState.data;
@@ -90,16 +90,16 @@ export function neStateParse(neType: string, data: Record<string, any>,neId: str
...data, // 先展开data对象 ...data, // 先展开data对象
refreshTime: parseDateToStr(data.refreshTime, 'HH:mm:ss'), refreshTime: parseDateToStr(data.refreshTime, 'HH:mm:ss'),
online: !!data.cpu, online: !!data.cpu,
neId: neId neUid: neUid
}; };
// 如果是001更新节点状态。neInfo为主要的网元信息 // 如果是001更新节点状态。neInfo为主要的网元信息
if (node.neInfo && node.neInfo.neId === neId) { if (node.neInfo && node.neInfo.neUid === neUid) {
Object.assign(node.neState, newNeState); Object.assign(node.neState, newNeState);
} }
//console.log(node.neState) //console.log(node.neState)
// 无论是否为主要网元,都更新状态映射 // 无论是否为主要网元,都更新状态映射
node.neStateMap[neId] = {...newNeState}; node.neStateMap[neUid] = {...newNeState};
// 通过 ID 查询节点实例 // 通过 ID 查询节点实例
const item = graphG6.value.findById(node.id); const item = graphG6.value.findById(node.id);
if (item) { if (item) {

View File

@@ -2,6 +2,9 @@ import { parseDateToStr } from '@/utils/date-utils';
import { parseSizeFromByte, parseSizeFromKbs } from '@/utils/parse-utils'; import { parseSizeFromByte, parseSizeFromKbs } from '@/utils/parse-utils';
import { ref } from 'vue'; import { ref } from 'vue';
/**当前选的upf的neUid */
export const upfNeUId = ref<any>('');
type FDType = { type FDType = {
/**时间 */ /**时间 */
lineXTime: string[]; lineXTime: string[];
@@ -23,7 +26,9 @@ export const upfFlowData = ref<FDType>({
/**UPF-流量数据 数据解析 */ /**UPF-流量数据 数据解析 */
export function upfFlowParse(data: Record<string, string>) { export function upfFlowParse(data: Record<string, string>) {
upfFlowData.value.lineXTime.push(parseDateToStr(+data['timeGroup'], 'HH:mm:ss')); upfFlowData.value.lineXTime.push(
parseDateToStr(+data['timeGroup'], 'HH:mm:ss')
);
const upN3 = parseSizeFromKbs(+data['UPF.03'], 5); const upN3 = parseSizeFromKbs(+data['UPF.03'], 5);
upfFlowData.value.lineYUp.push(upN3[0]); upfFlowData.value.lineYUp.push(upN3[0]);
const downN6 = parseSizeFromKbs(+data['UPF.06'], 5); const downN6 = parseSizeFromKbs(+data['UPF.06'], 5);

View File

@@ -1,5 +1,12 @@
import { ref } from 'vue'; import { ref } from 'vue';
/**当前选的事件的neUid */
export const eventNeUid = ref<Record<string, any>>({
AMF: '',
MME: '',
IMS: '',
});
/**ueEventAMFParse UE会话事件AMF 数据解析 */ /**ueEventAMFParse UE会话事件AMF 数据解析 */
function ueEventAMFParse( function ueEventAMFParse(
item: Record<string, any> item: Record<string, any>

View File

@@ -6,18 +6,24 @@ import {
eventListParse, eventListParse,
eventItemParseAndPush, eventItemParseAndPush,
userActivityReset, userActivityReset,
eventNeUid,
} from './useUserActivity'; } from './useUserActivity';
import { import {
upfTotalFlow, upfTotalFlow,
upfTFParse, upfTFParse,
upfFlowParse, upfFlowParse,
upfTotalFlowReset, upfTotalFlowReset,
upfNeUId,
} from './useUPFTotalFlow'; } from './useUPFTotalFlow';
import { topologyReset, neStateParse, neStateRequestMap } from './useTopology'; import { topologyReset, neStateParse, neStateRequestMap } from './useTopology';
import PQueue from 'p-queue'; import PQueue from 'p-queue';
import {
/**UPF-的Id */ WS_GROUP_KPI,
export const upfWhoId = ref<any>(''); WS_GROUP_AMF_UE,
WS_GROUP_MME_UE,
WS_GROUP_IMS_CDR,
} from '@/constants/ne-constants';
import { currentCoreUid } from '@/hooks/useCoreUid';
/**websocket连接 */ /**websocket连接 */
export default function useWS() { export default function useWS() {
@@ -39,11 +45,12 @@ export default function useWS() {
} }
// 网元状态 // 网元状态
if (requestId && requestId.startsWith('neState')) { if (requestId && requestId.startsWith('neState')) {
const neType = requestId.split('_')[1]; const neType = requestId.split('_')[3];
const neId = requestId.split('_')[2]; const neUid = requestId.split('_')[2];
neStateParse(neType, data,neId); neStateParse(neType, data, neUid);
return; return;
} }
const coreUid = currentCoreUid();
// 普通信息 // 普通信息
switch (requestId) { switch (requestId) {
@@ -69,13 +76,13 @@ export default function useWS() {
} }
break; break;
//UPF-总流量数 //UPF-总流量数
case `upf_${upfWhoId.value}_0`: case `upf_${upfNeUId.value}_0`:
upfTFParse('0', data); upfTFParse('0', data);
break; break;
case `upf_${upfWhoId.value}_7`: case `upf_${upfNeUId.value}_7`:
upfTFParse('7', data); upfTFParse('7', data);
break; break;
case `upf_${upfWhoId.value}_30`: case `upf_${upfNeUId.value}_30`:
upfTFParse('30', data); upfTFParse('30', data);
break; break;
} }
@@ -85,25 +92,25 @@ export default function useWS() {
} }
switch (data.groupId) { switch (data.groupId) {
// kpiEvent 指标UPF // kpiEvent 指标UPF
case `10_UPF_${upfWhoId.value}`: case `${WS_GROUP_KPI}_${coreUid}_${upfNeUId.value}`:
if (data.data) { if (data.data) {
upfFlowParse(data.data); upfFlowParse(data.data);
} }
break; break;
// AMF_UE会话事件 // AMF_UE会话事件
case '1010_001': case `${WS_GROUP_AMF_UE}_${coreUid}_${eventNeUid.value.AMF}`:
if (data.data) { if (data.data) {
queue.add(() => eventItemParseAndPush('amf_ue', data.data)); queue.add(() => eventItemParseAndPush('amf_ue', data.data));
} }
break; break;
// MME_UE会话事件 // MME_UE会话事件
case '1011_001': case `${WS_GROUP_MME_UE}_${coreUid}_${eventNeUid.value.MME}`:
if (data.data) { if (data.data) {
queue.add(() => eventItemParseAndPush('mme_ue', data.data)); queue.add(() => eventItemParseAndPush('mme_ue', data.data));
} }
break; break;
// IMS_CDR会话事件 // IMS_CDR会话事件
case '1005_001': case `${WS_GROUP_IMS_CDR}_${coreUid}_${eventNeUid.value.IMS}`:
if (data.data) { if (data.data) {
queue.add(() => eventItemParseAndPush('ims_cdr', data.data)); queue.add(() => eventItemParseAndPush('ims_cdr', data.data));
} }
@@ -120,11 +127,12 @@ export default function useWS() {
upfTotalFlow.value[day].requestFlag = true; upfTotalFlow.value[day].requestFlag = true;
ws.send({ ws.send({
requestId: `upf_${upfWhoId.value}_${day}`, requestId: `upf_${upfNeUId.value}_${day}`,
type: 'upf_tf', type: 'upf_tf',
data: { data: {
coreUid: currentCoreUid(),
neUid: upfNeUId.value,
neType: 'UPF', neType: 'UPF',
neId: upfWhoId.value,
day: Number(day), day: Number(day),
}, },
}); });
@@ -137,8 +145,9 @@ export default function useWS() {
requestId: 'amf_1010_001', requestId: 'amf_1010_001',
type: 'amf_ue', type: 'amf_ue',
data: { data: {
coreUid: currentCoreUid(),
neUid: eventNeUid.value.AMF,
neType: 'AMF', neType: 'AMF',
neId: '001',
sortField: 'timestamp', sortField: 'timestamp',
sortOrder: 'desc', sortOrder: 'desc',
pageNum: 1, pageNum: 1,
@@ -150,8 +159,9 @@ export default function useWS() {
requestId: 'mme_1011_001', requestId: 'mme_1011_001',
type: 'mme_ue', type: 'mme_ue',
data: { data: {
coreUid: currentCoreUid(),
neUid: eventNeUid.value.MME,
neType: 'MME', neType: 'MME',
neId: '001',
sortField: 'timestamp', sortField: 'timestamp',
sortOrder: 'desc', sortOrder: 'desc',
pageNum: 1, pageNum: 1,
@@ -163,8 +173,9 @@ export default function useWS() {
requestId: 'ims_1005_001', requestId: 'ims_1005_001',
type: 'ims_cdr', type: 'ims_cdr',
data: { data: {
coreUid: currentCoreUid(),
neUid: eventNeUid.value.IMS,
neType: 'IMS', neType: 'IMS',
neId: '001',
recordType: 'MOC', recordType: 'MOC',
sortField: 'timestamp', sortField: 'timestamp',
sortOrder: 'desc', sortOrder: 'desc',
@@ -174,9 +185,8 @@ export default function useWS() {
}); });
} }
/**重新发送至UPF 10_UPF_neId */ /**重新发送至UPF 10_UPF_neUid */
function reSendUPF(neId: string) { function reSendUPF() {
upfWhoId.value = neId;
//初始时时无需还原全部属性以及关闭 //初始时时无需还原全部属性以及关闭
if (ws.state() === WebSocket.OPEN) { if (ws.state() === WebSocket.OPEN) {
ws.close(); ws.close();
@@ -185,17 +195,25 @@ export default function useWS() {
neStateRequestMap.value = new Map(); neStateRequestMap.value = new Map();
//topologyReset(); //topologyReset();
} }
const coreUid = currentCoreUid();
let subGroupIDArr: string[] = [];
subGroupIDArr.push(`${WS_GROUP_KPI}_${coreUid}_${upfNeUId.value}`);
subGroupIDArr.push(`${WS_GROUP_AMF_UE}_${coreUid}_${eventNeUid.value.AMF}`);
subGroupIDArr.push(`${WS_GROUP_MME_UE}_${coreUid}_${eventNeUid.value.MME}`);
subGroupIDArr.push(
`${WS_GROUP_IMS_CDR}_${coreUid}_${eventNeUid.value.IMS}`
);
const options: OptionsType = { const options: OptionsType = {
url: '/ws', url: '/ws',
params: { params: {
/**订阅通道组 /**订阅通道组
* *
* 指标UPF (GroupID:10_neType_neId) * 指标UPF (GroupID:10_neType_neUid)
* AMF_UE会话事件(GroupID:1010_neId) * AMF_UE会话事件(GroupID:1010_neUid)
* MME_UE会话事件(GroupID:1011_neId) * MME_UE会话事件(GroupID:1011_neUid)
* IMS_CDR会话事件(GroupID:1005_neId) * IMS_CDR会话事件(GroupID:1005_neUid)
*/ */
subGroupID: `10_UPF_${neId},1010_001,1011_001,1005_001`, subGroupID: subGroupIDArr.join(','),
}, },
onmessage: wsMessage, onmessage: wsMessage,
onerror: (ev: any) => { onerror: (ev: any) => {
@@ -210,7 +228,7 @@ export default function useWS() {
userActivityReset(); userActivityReset();
upfTotalFlowReset(); upfTotalFlowReset();
topologyReset(); topologyReset();
upfWhoId.value = ''; upfNeUId.value = '';
}); });
return { return {

View File

@@ -16,14 +16,8 @@ import { listIMSSessionNum } from '@/api/neData/ims';
import { listAMFNblist } from '@/api/neData/amf'; import { listAMFNblist } from '@/api/neData/amf';
import { listMMENblist } from '@/api/neData/mme'; import { listMMENblist } from '@/api/neData/mme';
import { import { graphNodeClickID, graphState, notNeNodes } from './hooks/useTopology';
graphNodeClickID, import { upfNeUId, upfTotalFlow, upfTFActive } from './hooks/useUPFTotalFlow';
graphState,
notNeNodes,
graphNodeStateNum,
neStateRequestMap,
} from './hooks/useTopology';
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';
@@ -31,9 +25,10 @@ import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
import { upfWhoId } from './hooks/useWS';
import { listAMFNbStatelist } from '@/api/neData/amf'; import { listAMFNbStatelist } from '@/api/neData/amf';
import { listMMENbStatelist } from '@/api/neData/mme'; import { listMMENbStatelist } from '@/api/neData/mme';
import { eventNeUid } from './hooks/useUserActivity';
import { currentCoreUid } from '@/hooks/useCoreUid';
const neStore = useNeStore(); const neStore = useNeStore();
const router = useRouter(); const router = useRouter();
@@ -99,14 +94,15 @@ function fnGetNeState() {
if (neInfoList.length === 0) continue; if (neInfoList.length === 0) continue;
for (const neInfo of neInfoList) { for (const neInfo of neInfoList) {
if (!neInfo.neType || !neInfo.neId) continue; if (!neInfo.neType || !neInfo.neUid) continue;
wsSend({ wsSend({
requestId: `neState_${neInfo.neType}_${neInfo.neId}`, requestId: `neState_${neInfo.coreUid}_${neInfo.neUid}_${neInfo.neType}`,
type: 'ne_state', type: 'ne_state',
data: { data: {
coreUid: neInfo.coreUid,
neType: neInfo.neType, neType: neInfo.neType,
neId: neInfo.neId, neUid: neInfo.neUid,
}, },
}); });
} }
@@ -131,7 +127,10 @@ async function fnGetSkim() {
[ [
'SMF', 'SMF',
{ {
request: (neId: string) => listSMFSubNum(neId), request: (coreUid: string, neUid: string) => {
eventNeUid.value.SMF = neUid;
return listSMFSubNum(coreUid, neUid);
},
process: (res: any) => { process: (res: any) => {
if ( if (
res.code === RESULT_CODE_SUCCESS && res.code === RESULT_CODE_SUCCESS &&
@@ -145,7 +144,10 @@ async function fnGetSkim() {
[ [
'IMS', 'IMS',
{ {
request: (neId: string) => listIMSSessionNum(neId), request: (coreUid: string, neUid: string) => {
eventNeUid.value.IMS = neUid;
return listIMSSessionNum(coreUid, neUid);
},
process: (res: any) => { process: (res: any) => {
if ( if (
res.code === RESULT_CODE_SUCCESS && res.code === RESULT_CODE_SUCCESS &&
@@ -174,17 +176,18 @@ async function fnGetSkim() {
[ [
'AMF', 'AMF',
{ {
request: (neId: string) => listAMFNblist({ neId }), request: (coreUid: string, neUid: string) => {
process: async (res: any, neId: any) => { eventNeUid.value.AMF = neUid;
console.log(neId); return listAMFNblist({ coreUid, neUid });
},
process: async (res: any, coreUid: any, neUid: any) => {
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) { if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
skimState.gnbNum += res.data.length; skimState.gnbNum += res.data.length;
skimState.gnbUeNum += res.data.reduce( skimState.gnbUeNum += res.data.reduce(
(sum: number, item: any) => sum + item.ueNum, (sum: number, item: any) => sum + item.ueNum,
0 0
); );
const amfNbRes = await listAMFNbStatelist({ neId }); const amfNbRes = await listAMFNbStatelist({ coreUid, neUid });
console.log(amfNbRes);
if ( if (
amfNbRes.code === RESULT_CODE_SUCCESS && amfNbRes.code === RESULT_CODE_SUCCESS &&
Array.isArray(amfNbRes.data) Array.isArray(amfNbRes.data)
@@ -214,8 +217,11 @@ async function fnGetSkim() {
[ [
'MME', 'MME',
{ {
request: (neId: string) => listMMENblist({ neId }), request: (coreUid: string, neUid: string) => {
process: async (res: any, neId: any) => { eventNeUid.value.MME = neUid;
return listMMENblist({ coreUid, neUid });
},
process: async (res: any, coreUid: any, neUid: any) => {
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) { if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
skimState.enbNum += res.data.length; skimState.enbNum += res.data.length;
skimState.enbUeNum += res.data.reduce( skimState.enbUeNum += res.data.reduce(
@@ -223,14 +229,12 @@ async function fnGetSkim() {
0 0
); );
const mmeNbRes = await listMMENbStatelist({ neId }); const mmeNbRes = await listMMENbStatelist({ coreUid, neUid });
console.log(mmeNbRes);
if ( if (
mmeNbRes.code === RESULT_CODE_SUCCESS && mmeNbRes.code === RESULT_CODE_SUCCESS &&
Array.isArray(mmeNbRes.data) Array.isArray(mmeNbRes.data)
) { ) {
// skimState.eNbSumNum += mmeNbRes.data.length; // skimState.eNbSumNum += mmeNbRes.data.length;
console.log(mmeNbRes);
tempEnbSumNum += mmeNbRes.data.length; tempEnbSumNum += mmeNbRes.data.length;
} }
} }
@@ -244,13 +248,13 @@ async function fnGetSkim() {
(ne: any) => (ne: any) =>
ne.children ne.children
?.map((child: any) => { ?.map((child: any) => {
console.log(child.neId);
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.coreUid, child.neUid),
process: handler.process, process: handler.process,
neId: child.neId, // 这里加上neId coreUid: child.coreUid,
neUid: child.neUid,
} }
: null; : null;
}) })
@@ -280,9 +284,9 @@ async function fnGetSkim() {
const processPromises = results.map((result: any, index: any) => { const processPromises = results.map((result: any, index: any) => {
const req = requests[index]; const req = requests[index];
if (result.status === 'fulfilled') { if (result.status === 'fulfilled') {
return req.process(result.value, req.neId); return req.process(result.value, req.coreUid, req.neUid);
} else { } else {
return req.process(0, req.neId); return req.process(0, req.coreUid, req.neUid);
} }
}); });
@@ -291,7 +295,12 @@ async function fnGetSkim() {
skimState.eNbSumNum = tempEnbSumNum; skimState.eNbSumNum = tempEnbSumNum;
// UDM // UDM
listUDMSub({ neId: udmNeId.value, pageNum: 1, pageSize: 1 }).then(res => { listUDMSub({
coreUid: currentCoreUid(),
neUid: udmNeUid.value,
pageNum: 1,
pageSize: 1,
}).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
skimState.udmSubNum = res.data.total; skimState.udmSubNum = res.data.total;
} }
@@ -335,12 +344,12 @@ function fnToRouter(name: string, query?: any) {
} }
/**网元参数 */ /**网元参数 */
let neOtions = ref<Record<string, any>[]>([]); let upfOtions = ref<Record<string, any>[]>([]);
// UPF实时流量下拉框选择 // UPF实时流量下拉框选择
function fnSelectNe(value: any, option: any) { function fnSelectNe(value: any, option: any) {
upfWhoId.value = value; upfNeUId.value = value;
reSendUPF(value); reSendUPF();
// upfTotalFlow.value.map((item: any) => { // upfTotalFlow.value.map((item: any) => {
// item.requestFlag = false; // item.requestFlag = false;
// }); // });
@@ -353,35 +362,30 @@ function fnSelectNe(value: any, option: any) {
// UPF实时流量下拉菜单选择 // UPF实时流量下拉菜单选择
function fnSelectUPF(e: any) { function fnSelectUPF(e: any) {
upfWhoId.value = e.key; upfNeUId.value = e.key;
reSendUPF(e.key); reSendUPF();
for (var key in upfTotalFlow.value) { for (var key in upfTotalFlow.value) {
upfTotalFlow.value[key].requestFlag = false; upfTotalFlow.value[key].requestFlag = false;
} }
} }
let udmNeId = ref<string>('001'); let udmNeUid = ref<string>('001');
let udmOtions = ref<Record<string, any>[]>([]); let udmOtions = ref<Record<string, any>[]>([]);
let onlineOtions = ref<Record<string, any>[]>([]); let onlineOtions = ref<Record<string, any>[]>([]);
/**用户数量-选择UDM */ /**用户数量-选择UDM */
async function fnSelectUDM(e: any) { async function fnSelectUDM(e: any) {
udmNeId.value = e.key; udmNeUid.value = e.key;
try { try {
const res = await listUDMSub({ const res = await listUDMSub({
neId: udmNeId.value, coreUid: currentCoreUid(),
neUid: udmNeUid.value,
pageNum: 1, pageNum: 1,
pageSize: 1, pageSize: 1,
}); });
console.log(res); if (res.code === RESULT_CODE_SUCCESS) {
// listUDMSub({ neId: udmNeId.value, pageNum: 1, pageSize: 1 }).then(res => {
if (
res.code === RESULT_CODE_SUCCESS &&
typeof res.data.total === 'number'
) {
skimState.udmSubNum = res.data.total; skimState.udmSubNum = res.data.total;
console.log(res);
} else { } else {
skimState.udmSubNum = 0; skimState.udmSubNum = 0;
} }
@@ -411,14 +415,15 @@ onMounted(() => {
neStore.getNeCascaderOptions.forEach(item => { neStore.getNeCascaderOptions.forEach(item => {
console.log(item); console.log(item);
if (item.value === 'UPF') { if (item.value === 'UPF') {
neOtions.value = JSON.parse(JSON.stringify(item.children)); upfOtions.value = JSON.parse(JSON.stringify(item.children));
} }
if (item.value === 'UDM') { if (item.value === 'UDM') {
udmOtions.value = JSON.parse(JSON.stringify(item.children)); udmOtions.value = JSON.parse(JSON.stringify(item.children));
} }
}); });
if (neOtions.value.length > 0) { if (upfOtions.value.length > 0) {
fnSelectNe(neOtions.value[0].value, neOtions.value[0]); fnSelectNe(upfOtions.value[0].value, upfOtions.value[0]);
graphNodeClickID.value = `${upfOtions.value[0].neType}_${upfOtions.value[0].neUid}`;
} }
if (udmOtions.value.length > 0) { if (udmOtions.value.length > 0) {
fnSelectUDM({ key: udmOtions.value[0].value }); fnSelectUDM({ key: udmOtions.value[0].value });
@@ -459,7 +464,7 @@ onMounted(() => {
].includes(v.neType) ].includes(v.neType)
) { ) {
onlineArr.push({ onlineArr.push({
value: v.neType + '_' + v.neId, value: v.neType + '_' + v.neUid,
label: v.neName, label: v.neName,
rmUid: v.rmUid, rmUid: v.rmUid,
}); });
@@ -532,7 +537,7 @@ onBeforeUnmount(() => {
<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="udmNeUid === v.value"
> >
{{ v.label }} {{ v.label }}
</a-menu-item> </a-menu-item>
@@ -631,14 +636,14 @@ onBeforeUnmount(() => {
> >
<div class="toDeep-text"> <div class="toDeep-text">
{{ {{
neOtions.find(item => item.value === upfWhoId)?.label || upfOtions.find(item => item.value === upfNeUId)?.label ||
'Select UPF' 'Select UPF'
}} }}
<DownOutlined style="margin-left: -2px; font-size: 12px" /> <DownOutlined style="margin-left: -2px; font-size: 12px" />
</div> </div>
<template #overlay> <template #overlay>
<a-menu @click="fnSelectUPF"> <a-menu @click="fnSelectUPF">
<a-menu-item v-for="v in neOtions" :key="v.value"> <a-menu-item v-for="v in upfOtions" :key="v.value">
{{ v.label }} {{ v.label }}
</a-menu-item> </a-menu-item>
</a-menu> </a-menu>

View File

@@ -5,12 +5,11 @@ import { message, Form, Modal } from 'ant-design-vue/es';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { NE_TYPE_LIST } from '@/constants/ne-constants'; import { NE_TYPE_LIST } from '@/constants/ne-constants';
import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils'; import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils';
import { addNeInfo, updateNeInfo } from '@/api/ne/neInfo'; import { addNeInfo, updateNeInfo, getNeInfo } from '@/api/ne/neInfo';
import { neHostAuthorizedRSA, testNeHost } from '@/api/ne/neHost'; import { neHostAuthorizedRSA, testNeHost } from '@/api/ne/neHost';
import useDictStore from '@/store/modules/dict'; import useDictStore from '@/store/modules/dict';
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
import { currentCoreUid } from '@/hooks/useCoreUid'; import { currentCoreUid } from '@/hooks/useCoreUid';
import { getNeInfoByNF } from '@/api/ne/neAction';
const { getDict } = useDictStore(); const { getDict } = useDictStore();
const { t } = useI18n(); const { t } = useI18n();
const emit = defineEmits(['ok', 'cancel', 'update:open']); const emit = defineEmits(['ok', 'cancel', 'update:open']);
@@ -19,18 +18,14 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false, default: false,
}, },
id: {
type: Number,
default: 0,
},
coreUid: { coreUid: {
type: String, type: String,
default: '', default: '',
}, },
neUid: {
type: String,
default: '',
},
neType: {
type: String,
default: '',
},
}); });
/**字典数据 */ /**字典数据 */
@@ -210,8 +205,8 @@ function modalStateFromEqualIPV4AndIPV6(
* @param coreUid 核心网ID * @param coreUid 核心网ID
* @param neUid 网元ID * @param neUid 网元ID
*/ */
function fnModalVisibleByEdit(coreUid: string, neUid: string) { function fnModalVisibleByEdit(coreUid: string, id: number) {
if (!coreUid || !neUid) { if (!coreUid || !id) {
modalStateFrom.resetFields(); modalStateFrom.resetFields();
modalState.title = t('views.ne.neInfo.addTitle'); modalState.title = t('views.ne.neInfo.addTitle');
modalState.openByEdit = true; modalState.openByEdit = true;
@@ -219,7 +214,7 @@ function fnModalVisibleByEdit(coreUid: string, neUid: string) {
if (modalState.confirmLoading) return; if (modalState.confirmLoading) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
modalState.confirmLoading = true; modalState.confirmLoading = true;
getNeInfoByNF(coreUid, neUid).then(res => { getNeInfo(coreUid, id).then(res => {
modalState.confirmLoading = false; modalState.confirmLoading = false;
hide(); hide();
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
@@ -334,7 +329,7 @@ function fnNeIPChange(e: any) {
watch( watch(
() => props.open, () => props.open,
val => { val => {
if (val) fnModalVisibleByEdit(props.coreUid, props.neUid); if (val) fnModalVisibleByEdit(props.coreUid, props.id);
} }
); );

View File

@@ -99,6 +99,12 @@ let tableState: TabeStateType = reactive({
/**表格字段列 */ /**表格字段列 */
let tableColumns: ColumnsType = [ let tableColumns: ColumnsType = [
{
title: t('views.ne.common.neUid'),
dataIndex: 'neUid',
align: 'left',
width: 100,
},
{ {
title: t('views.ne.common.neType'), title: t('views.ne.common.neType'),
dataIndex: 'neType', dataIndex: 'neType',
@@ -192,7 +198,7 @@ type ModalStateType = {
/**新增框或修改框是否显示 */ /**新增框或修改框是否显示 */
openByEdit: boolean; openByEdit: boolean;
/**新增框或修改框ID */ /**新增框或修改框ID */
/**网元修改框 */ id: number;
coreUid: string; coreUid: string;
neUid: string; neUid: string;
neType: string; neType: string;
@@ -205,6 +211,7 @@ let modalState: ModalStateType = reactive({
openByBackConf: false, openByBackConf: false,
openByOAM: false, openByOAM: false,
openByEdit: false, openByEdit: false,
id: 0,
coreUid: '', coreUid: '',
neUid: '', neUid: '',
neType: '', neType: '',
@@ -217,10 +224,12 @@ let modalState: ModalStateType = reactive({
*/ */
function fnModalVisibleByEdit(row?: Record<string, any>) { function fnModalVisibleByEdit(row?: Record<string, any>) {
if (!row) { if (!row) {
modalState.id = 0;
modalState.coreUid = ''; modalState.coreUid = '';
modalState.neUid = ''; modalState.neUid = '';
modalState.neType = ''; modalState.neType = '';
} else { } else {
modalState.id = row.id;
modalState.coreUid = row.coreUid; modalState.coreUid = row.coreUid;
modalState.neUid = row.neUid; modalState.neUid = row.neUid;
modalState.neType = row.neType; modalState.neType = row.neType;
@@ -295,7 +304,6 @@ function fnRecordDelete(id: string) {
let msg = t('views.ne.neInfo.delTip'); let msg = t('views.ne.neInfo.delTip');
if (id === '0') { if (id === '0') {
msg = `${msg} ...${tableState.selectedRowKeys.length}`; msg = `${msg} ...${tableState.selectedRowKeys.length}`;
id = tableState.selectedRowKeys.join(',');
} }
Modal.confirm({ Modal.confirm({
@@ -743,8 +751,7 @@ onMounted(() => {
<EditModal <EditModal
v-model:open="modalState.openByEdit" v-model:open="modalState.openByEdit"
:core-uid="modalState.coreUid" :core-uid="modalState.coreUid"
:ne-uid="modalState.neUid" :id="modalState.id"
:ne-type="modalState.neType"
@ok="fnModalEditOk" @ok="fnModalEditOk"
@cancel="fnModalEditCancel" @cancel="fnModalEditCancel"
></EditModal> ></EditModal>

View File

@@ -269,7 +269,6 @@ function fnModalVisibleByTypeAndId(coreUid: string, neUid: string) {
watch( watch(
() => props.open, () => props.open,
val => { val => {
console.log(props);
if (val && props.coreUid) { if (val && props.coreUid) {
if (props.neUid) { if (props.neUid) {
fnModalVisibleByTypeAndId(props.coreUid, props.neUid); fnModalVisibleByTypeAndId(props.coreUid, props.neUid);

View File

@@ -230,8 +230,7 @@ type ModalStateType = {
/**新增框或修改框是否显示 */ /**新增框或修改框是否显示 */
openByEdit: boolean; openByEdit: boolean;
coreUid: string; coreUid: string;
neUid: string; id: number;
neType: string;
/**确定按钮 loading */ /**确定按钮 loading */
confirmLoading: boolean; confirmLoading: boolean;
}; };
@@ -240,8 +239,7 @@ type ModalStateType = {
let modalState: ModalStateType = reactive({ let modalState: ModalStateType = reactive({
openByEdit: false, openByEdit: false,
coreUid: '', coreUid: '',
neUid: '', id: 0,
neType: '',
confirmLoading: false, confirmLoading: false,
}); });
@@ -251,8 +249,7 @@ let modalState: ModalStateType = reactive({
*/ */
function fnModalVisibleByEdit(row: Record<string, any>) { function fnModalVisibleByEdit(row: Record<string, any>) {
modalState.coreUid = row.coreUid; modalState.coreUid = row.coreUid;
modalState.neUid = row.neUid; modalState.id = row.id;
modalState.neType = row.neType;
nextTick(() => { nextTick(() => {
modalState.openByEdit = true; modalState.openByEdit = true;
}); });
@@ -275,8 +272,7 @@ function fnModalOk(e: any) {
function fnModalCancel() { function fnModalCancel() {
modalState.openByEdit = false; modalState.openByEdit = false;
modalState.coreUid = ''; modalState.coreUid = '';
modalState.neUid = ''; modalState.id = 0;
modalState.neType = '';
} }
/**刷新网元授权状态 */ /**刷新网元授权状态 */
@@ -508,8 +504,7 @@ onMounted(() => {
<EditModal <EditModal
v-model:open="modalState.openByEdit" v-model:open="modalState.openByEdit"
:core-uid="modalState.coreUid" :core-uid="modalState.coreUid"
:ne-uid="modalState.neUid" :id="modalState.id"
:ne-type="modalState.neType"
@ok="fnModalOk" @ok="fnModalOk"
@cancel="fnModalCancel" @cancel="fnModalCancel"
></EditModal> ></EditModal>

View File

@@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { Form, Modal, message } from 'ant-design-vue/es'; import { Form, Modal, message } from 'ant-design-vue/es';
import { onMounted, reactive, toRaw } from 'vue'; import { onMounted, reactive, toRaw } from 'vue';
import { addNeInfo, updateNeInfo } from '@/api/ne/neInfo'; import { addNeInfo, getNeInfo, updateNeInfo } from '@/api/ne/neInfo';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { NE_TYPE_LIST } from '@/constants/ne-constants'; import { NE_TYPE_LIST } from '@/constants/ne-constants';
import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils'; import { regExpIPv4, regExpIPv6 } from '@/utils/regular-utils';
@@ -47,13 +47,13 @@ let modalState: ModalStateType = reactive({
title: '网元', title: '网元',
from: { from: {
id: undefined, id: undefined,
neId: '', coreUid: currentCoreUid(),
neUid: '',
neType: '', neType: '',
neName: '', neName: '',
ip: '', ipAddr: '',
port: 33030, port: 33030,
pvFlag: 'PNF', pvFlag: 'PNF',
coreUid: currentCoreUid(),
macAddr: '', macAddr: '',
dn: '-', dn: '-',
vendorName: '-', vendorName: '-',
@@ -101,13 +101,13 @@ const modalStateFrom = Form.useForm(
message: t('views.ne.common.neTypePlease'), message: t('views.ne.common.neTypePlease'),
}, },
], ],
neId: [ neName: [
{ {
required: true, required: true,
message: t('views.ne.common.neUidPlease'), message: t('views.ne.common.neNamePlease'),
}, },
], ],
ip: [ ipAddr: [
{ {
required: true, required: true,
validator: modalStateFromEqualIPV4AndIPV6, validator: modalStateFromEqualIPV4AndIPV6,
@@ -146,79 +146,50 @@ function fnModalOk() {
const from = toRaw(modalState.from); const from = toRaw(modalState.from);
modalStateFrom modalStateFrom
.validate() .validate()
.then(e => { .then(() => {
modalState.confirmLoading = true; // 清除更新必要信息
return getNeInfoByNF(from.coreUid, from.neUid); from.id = undefined;
}) from.hostIds = '';
.then(res => { for (let index = 0; index < from.hosts.length; index++) {
if (res.code === RESULT_CODE_SUCCESS) { from.hosts[index].id = undefined;
// 补充更新必要信息
from.id = res.data.id;
from.hostIds = res.data.hostIds;
const hostIds = res.data.hostIds.split(',');
if (hostIds.length == 2) {
from.hosts[0].id = parseInt(hostIds[0]);
from.hosts[1].id = parseInt(hostIds[1]);
}
return true;
} else {
// 清除更新必要信息
from.id = undefined;
from.hostIds = '';
for (let index = 0; index < from.hosts.length; index++) {
from.hosts[index].id = undefined;
}
return false;
} }
}) const hide = message.loading(t('common.loading'), 0);
.then(isUpdate => { addNeInfo(from)
let confirmTitle = t('views.ne.neQuickSetup.configAddTitle'); .then(res => {
let confirmContent = t('views.ne.neQuickSetup.configAddTip'); if (res.code === RESULT_CODE_SUCCESS) {
if (isUpdate) { message.success({
confirmTitle = t('views.ne.neQuickSetup.configUpdateTitle'); content: `${t('common.operateOk')}`,
confirmContent = t('views.ne.neQuickSetup.configUpdateTip'); duration: 3,
}
Modal.confirm({
title: confirmTitle,
content: confirmContent,
onCancel: () => {
// 清除更新必要信息
from.id = undefined;
from.hostIds = '';
for (let index = 0; index < from.hosts.length; index++) {
from.hosts[index].id = undefined;
}
},
onOk: () => {
from.rmUid = `4400HX${from.neType}${from.neId}`; // 4400HX1AMF001
from.neName = `${from.neType}_${from.neId}`; // AMF_001
const hide = message.loading(t('common.loading'), 0);
const result =
isUpdate && from.id ? updateNeInfo(from) : addNeInfo(from);
result
.then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
message.success({
content: `${t('common.operateOk')}`,
duration: 3,
});
neStore.fnNelistRefresh(); // 刷新缓存的网元信息
stepState.neInfo = from; // 保存网元信息
modalState.stepNext = true; // 开启下一步
} else {
message.error({
content: res.msg,
duration: 3,
});
}
})
.finally(() => {
hide();
modalState.confirmLoading = false;
}); });
}, return res.data;
}); }
message.error({
content: res.msg,
duration: 3,
});
return 0;
})
.then(neId => {
if (neId === 0) {
return;
}
neStore.fnNelistRefresh(); // 刷新缓存的网元信息
getNeInfo(from.coreUid, neId).then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
stepState.neInfo = res.data; // 保存网元信息
modalState.stepNext = true; // 开启下一步
} else {
message.error({
content: res.msg,
duration: 3,
});
}
});
})
.finally(() => {
hide();
modalState.confirmLoading = false;
});
}) })
.catch(e => { .catch(e => {
message.error(t('common.errorFields', { num: e.errorFields.length }), 3); message.error(t('common.errorFields', { num: e.errorFields.length }), 3);
@@ -327,10 +298,10 @@ onMounted(() => {
if (stepState.neInfo.id) { if (stepState.neInfo.id) {
Object.assign(modalState.from, stepState.neInfo); Object.assign(modalState.from, stepState.neInfo);
} else { } else {
modalState.from.ip = stepState.neHost.addr; modalState.from.ipAddr = stepState.neHost.addr;
Object.assign(modalState.from.hosts[0], stepState.neHost); Object.assign(modalState.from.hosts[0], stepState.neHost);
Object.assign(modalState.from.hosts[1], { Object.assign(modalState.from.hosts[1], {
addr: modalState.from.ip, addr: modalState.from.ipAddr,
user: 'admin', user: 'admin',
password: 'admin', password: 'admin',
}); });
@@ -344,119 +315,95 @@ onMounted(() => {
<a-form <a-form
name="modalStateFrom" name="modalStateFrom"
layout="horizontal" layout="horizontal"
:label-col="{ span: 6 }" :label-col="{ span: 3 }"
:wrapper-col="{ span: 9 }"
:labelWrap="true" :labelWrap="true"
> >
<a-row> <a-form-item
<a-col :lg="6" :md="6" :xs="24" :offset="6"> :label="t('views.ne.common.ipAddr')"
<a-form-item name="ip"
:label="t('views.ne.common.neType')" v-bind="modalStateFrom.validateInfos.ipAddr"
name="neType" >
v-bind="modalStateFrom.validateInfos.neType" <a-input
> v-model:value="modalState.from.ipAddr"
<a-auto-complete allow-clear
v-model:value="modalState.from.neType" :placeholder="t('common.inputPlease')"
:options=" :maxlength="128"
NE_TYPE_LIST.filter(s => s !== 'OMC').map(v => ({ value: v })) @change="fnNeIPChange"
" :disabled="true"
@change="fnNeTypeChange" >
> <template #prefix>
<a-input <a-tooltip placement="topLeft">
allow-clear <template #title>
:placeholder="t('common.inputPlease')" <div>
:maxlength="32" {{ t('views.ne.common.ipAddrTip') }}
> </div>
<template #prefix>
<a-tooltip placement="topLeft">
<template #title>
{{ t('views.ne.common.neTypeTip') }}
</template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" />
</a-tooltip>
</template>
</a-input>
</a-auto-complete>
</a-form-item>
</a-col>
<a-col :lg="6" :md="6" :xs="24">
<a-form-item
:label="t('views.ne.common.neUid')"
name="neId"
v-bind="modalStateFrom.validateInfos.neId"
>
<a-input
v-model:value="modalState.from.neId"
allow-clear
:placeholder="t('common.inputPlease')"
:maxlength="24"
>
<template #prefix>
<a-tooltip placement="topLeft">
<template #title>
{{ t('views.ne.common.neUidTip') }}
</template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" />
</a-tooltip>
</template> </template>
</a-input> <InfoCircleOutlined style="opacity: 0.45; color: inherit" />
</a-form-item> </a-tooltip>
</a-col> </template>
</a-row> </a-input>
</a-form-item>
<a-row> <a-form-item
<a-col :lg="6" :md="6" :xs="24" :offset="6"> :label="t('views.ne.common.port')"
<a-form-item name="port"
:label="t('views.ne.common.ipAddr')" v-bind="modalStateFrom.validateInfos.port"
name="ip" :help="t('views.ne.common.portTip')"
v-bind="modalStateFrom.validateInfos.ip" >
<a-input-number
v-model:value="modalState.from.port"
style="width: 100%"
:min="1"
:max="65535"
:maxlength="5"
placeholder="<=65535"
>
</a-input-number>
</a-form-item>
<a-form-item
:label="t('views.ne.common.neType')"
name="neType"
v-bind="modalStateFrom.validateInfos.neType"
>
<a-auto-complete
v-model:value="modalState.from.neType"
:options="
NE_TYPE_LIST.filter(s => s !== 'OMC').map(v => ({ value: v }))
"
@change="fnNeTypeChange"
>
<a-input
allow-clear
:placeholder="t('common.inputPlease')"
:maxlength="32"
> >
<a-input <template #prefix>
v-model:value="modalState.from.ip" <a-tooltip placement="topLeft">
allow-clear <template #title>
:placeholder="t('common.inputPlease')" {{ t('views.ne.common.neTypeTip') }}
:maxlength="128" </template>
@change="fnNeIPChange" <InfoCircleOutlined style="opacity: 0.45; color: inherit" />
:disabled="true" </a-tooltip>
> </template>
<template #prefix> </a-input>
<a-tooltip placement="topLeft"> </a-auto-complete>
<template #title> </a-form-item>
<div>
{{ t('views.ne.common.ipAddrTip') }} <a-form-item
</div> :label="t('views.ne.common.neName')"
</template> name="neName"
<InfoCircleOutlined style="opacity: 0.45; color: inherit" /> v-bind="modalStateFrom.validateInfos.neName"
</a-tooltip> >
</template> <a-input
</a-input> v-model:value="modalState.from.neName"
</a-form-item> allow-clear
</a-col> :placeholder="t('common.inputPlease')"
<a-col :lg="6" :md="6" :xs="24"> :maxlength="24"
<a-form-item >
:label="t('views.ne.common.port')" </a-input>
name="port" </a-form-item>
v-bind="modalStateFrom.validateInfos.port"
>
<a-input-number
v-model:value="modalState.from.port"
style="width: 100%"
:min="1"
:max="65535"
:maxlength="5"
placeholder="<=65535"
>
<template #prefix>
<a-tooltip placement="topLeft">
<template #title>
<div>{{ t('views.ne.common.portTip') }}</div>
</template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" />
</a-tooltip>
</template>
</a-input-number>
</a-form-item>
</a-col>
</a-row>
</a-form> </a-form>
<div class="ne-oper"> <div class="ne-oper">

View File

@@ -132,7 +132,7 @@ function fnGetList(pageNum?: number) {
tableState.queryParams.pageNum = pageNum; tableState.queryParams.pageNum = pageNum;
} }
listNeSoftware(toRaw(tableState.queryParams)).then(res => { listNeSoftware(toRaw(tableState.queryParams)).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
// 取消勾选 // 取消勾选
if (tableState.selectedRowKeys.length > 0) { if (tableState.selectedRowKeys.length > 0) {
tableState.selectedRowKeys = []; tableState.selectedRowKeys = [];
@@ -158,7 +158,8 @@ type StateType = {
/**软件包信息数据 */ /**软件包信息数据 */
from: { from: {
neType: string; // 版本需要 neType: string; // 版本需要
neId: string; // 版本需要 coreUid: string; // 版本需要
neUid: string; // 版本需要
name: string; // 软件需要 name: string; // 软件需要
path: string; path: string;
version: string; // 软件需要 version: string; // 软件需要
@@ -177,7 +178,8 @@ let state: StateType = reactive({
from: { from: {
id: undefined, id: undefined,
neType: '', neType: '',
neId: '', coreUid: '',
neUid: '',
name: '', name: '',
path: '', path: '',
version: '', version: '',
@@ -243,8 +245,9 @@ function fnRecordInstall() {
preinput = { pisCSCF: 'y', updateMFetc: 'No', updateMFshare: 'No' }; preinput = { pisCSCF: 'y', updateMFetc: 'No', updateMFshare: 'No' };
} }
const res = await operateNeVersion({ const res = await operateNeVersion({
coreUid: from.coreUid,
neUid: from.neUid,
neType: from.neType, neType: from.neType,
neId: from.neId,
action: 'install', action: 'install',
preinput: preinput, preinput: preinput,
}); });
@@ -287,11 +290,12 @@ function fnStepNext() {
} }
onMounted(() => { onMounted(() => {
const { neType, neId } = stepState.neInfo; const { neType,neUid, coreUid } = stepState.neInfo;
if (neId) { if (neType && neUid && coreUid) {
tableState.queryParams.neType = neType; tableState.queryParams.neType = neType;
state.from.neUid = neUid;
state.from.neType = neType; state.from.neType = neType;
state.from.neId = neId; state.from.coreUid = coreUid;
fnGetList(1); fnGetList(1);
} }
}); });

View File

@@ -16,11 +16,14 @@ type StateType = {
openByFile: boolean; openByFile: boolean;
/**授权信息数据 */ /**授权信息数据 */
from: { from: {
coreUid: string;
neUid: string;
neType: string; neType: string;
neId: string;
// 下面是状态检查结果 // 下面是状态检查结果
expire: string; expire: string;
sn: string; sn: string;
ueNumber: string;
nbNumber: string;
}; };
/**确定按钮 loading */ /**确定按钮 loading */
confirmLoading: boolean; confirmLoading: boolean;
@@ -33,10 +36,14 @@ type StateType = {
let state: StateType = reactive({ let state: StateType = reactive({
openByFile: false, openByFile: false,
from: { from: {
coreUid: '',
neUid: '',
neType: '', neType: '',
neId: '', // 下面是状态检查结果
expire: '', expire: '',
sn: '', sn: '',
ueNumber: '',
nbNumber: '',
}, },
confirmLoading: false, confirmLoading: false,
timeInterval: null, timeInterval: null,
@@ -59,6 +66,8 @@ function fnModalOk(e: any) {
if (res.code === RESULT_CODE_SUCCESS && res.data) { if (res.code === RESULT_CODE_SUCCESS && res.data) {
state.from.sn = res.data.sn; state.from.sn = res.data.sn;
state.from.expire = res.data.expire; state.from.expire = res.data.expire;
state.from.ueNumber = res.data.ueNumber;
state.from.nbNumber = res.data.ueNumber;
clearInterval(state.timeInterval); clearInterval(state.timeInterval);
state.timeInterval = null; state.timeInterval = null;
@@ -88,18 +97,18 @@ function fnStepEnd() {
} }
onMounted(() => { onMounted(() => {
const { neType, neId } = stepState.neInfo; const { coreUid, neUid } = stepState.neInfo;
if (neId) { if (coreUid && neUid) {
state.from.neType = neType; state.from.coreUid = coreUid;
state.from.neId = neId; state.from.neUid = neUid;
state.confirmLoading = true; state.confirmLoading = true;
stateNeLicense(neType, neId) stateNeLicense(coreUid, neUid)
.then(res => { .then(res => {
if (res.code === RESULT_CODE_SUCCESS && res.data) { if (res.code === RESULT_CODE_SUCCESS && res.data) {
state.from.sn = res.data.sn; state.from.sn = res.data.sn;
state.from.expire = res.data.expire; state.from.expire = res.data.expire;
} else { } else {
return codeNeLicense(neType, neId); return codeNeLicense(coreUid, neUid);
} }
}) })
.finally(() => { .finally(() => {
@@ -160,9 +169,11 @@ onUnmounted(() => {
</div> </div>
<div v-if="state.from.sn !== ''" style="font-size: 16px"> <div v-if="state.from.sn !== ''" style="font-size: 16px">
<p>{{ t('views.ne.common.neType') }}{{ state.from.neType }}</p> <p>{{ t('views.ne.common.neType') }}{{ state.from.neType }}</p>
<p>{{ t('views.ne.common.neUid') }}{{ state.from.neId }}</p> <p>{{ t('views.ne.common.neUid') }}{{ state.from.neUid }}</p>
<p>{{ t('views.ne.common.serialNum') }}{{ state.from.sn }}</p> <p>{{ t('views.ne.common.serialNum') }}{{ state.from.sn }}</p>
<p>{{ t('views.ne.common.expiryDate') }}{{ state.from.expire }}</p> <p>{{ t('views.ne.common.expiryDate') }}{{ state.from.expire }}</p>
<p>{{ t('views.ne.common.ueNumber') }}{{ state.from.ueNumber }}</p>
<p>{{ t('views.ne.common.nbNumber') }}{{ state.from.nbNumber }}</p>
</div> </div>
</a-result> </a-result>
@@ -170,7 +181,8 @@ onUnmounted(() => {
<EditModal <EditModal
v-model:open="state.openByFile" v-model:open="state.openByFile"
:ne-type="state.from.neType" :ne-type="state.from.neType"
:ne-id="state.from.neId" :ne-uid="state.from.neUid"
:core-uid="state.from.coreUid"
:reload="true" :reload="true"
@ok="fnModalOk" @ok="fnModalOk"
@cancel="fnModalCancel" @cancel="fnModalCancel"

View File

@@ -50,61 +50,62 @@ export function usePara5G() {
Array.isArray(resArr[1].data) Array.isArray(resArr[1].data)
) { ) {
for (const item of resArr[1].data) { for (const item of resArr[1].data) {
const ipAddr = item.ipAddr;
// 公共配置文件sbi的各网元IP // 公共配置文件sbi的各网元IP
switch (item.neType) { switch (item.neType) {
case 'OMC': case 'OMC':
state.from.sbi.omc_ip = item.ip; state.from.sbi.omc_ip = ipAddr;
Object.assign(state.omcInfo, item); // 主动改OMC_IP Object.assign(state.omcInfo, item); // 主动改OMC_IP
break; break;
case 'IMS': case 'IMS':
state.from.sbi.ims_ip = item.ip; state.from.sbi.ims_ip = ipAddr;
state.hasNE.ims = true; state.hasNE.ims = true;
break; break;
case 'AMF': case 'AMF':
state.from.sbi.amf_ip = item.ip; state.from.sbi.amf_ip = ipAddr;
state.hasNE.amf = true; state.hasNE.amf = true;
break; break;
case 'AUSF': case 'AUSF':
state.from.sbi.ausf_ip = item.ip; state.from.sbi.ausf_ip = ipAddr;
break; break;
case 'UDM': case 'UDM':
state.from.sbi.udm_ip = item.ip; state.from.sbi.udm_ip = ipAddr;
state.from.sbi.db_ip = '0.0.0.0'; state.from.sbi.db_ip = '0.0.0.0';
break; break;
case 'SMF': case 'SMF':
state.from.sbi.smf_ip = item.ip; state.from.sbi.smf_ip = ipAddr;
break; break;
case 'PCF': case 'PCF':
state.from.sbi.pcf_ip = item.ip; state.from.sbi.pcf_ip = ipAddr;
break; break;
case 'NSSF': case 'NSSF':
state.from.sbi.nssf_ip = item.ip; state.from.sbi.nssf_ip = ipAddr;
break; break;
case 'NRF': case 'NRF':
state.from.sbi.nrf_ip = item.ip; state.from.sbi.nrf_ip = ipAddr;
break; break;
case 'UPF': case 'UPF':
state.from.sbi.upf_ip = item.ip; state.from.sbi.upf_ip = ipAddr;
state.hasNE.upf = true; state.hasNE.upf = true;
break; break;
case 'LMF': case 'LMF':
state.from.sbi.lmf_ip = item.ip; state.from.sbi.lmf_ip = ipAddr;
break; break;
case 'NEF': case 'NEF':
state.from.sbi.nef_ip = item.ip; state.from.sbi.nef_ip = ipAddr;
break; break;
case 'MME': case 'MME':
state.from.sbi.mme_ip = item.ip; state.from.sbi.mme_ip = ipAddr;
if (item.ip.includes('.')) { if (ipAddr.includes('.')) {
state.from.external.mmes11_ip = item.ip + '/24'; state.from.external.mmes11_ip = ipAddr + '/24';
} }
state.hasNE.mme = true; state.hasNE.mme = true;
break; break;
case 'N3IWF': case 'N3IWF':
state.from.sbi.n3iwf_ip = item.ip; state.from.sbi.n3iwf_ip = ipAddr;
break; break;
case 'SMSC': case 'SMSC':
state.from.sbi.smsc_ip = item.ip; state.from.sbi.smsc_ip = ipAddr;
break; break;
} }
} }

View File

@@ -1,10 +1,4 @@
import { import { defineAsyncComponent, reactive, shallowRef, watch } from 'vue';
defineAsyncComponent,
onMounted,
reactive,
shallowRef,
watch,
} from 'vue';
/**步骤信息状态类型 */ /**步骤信息状态类型 */
type StepStateType = { type StepStateType = {

View File

@@ -191,7 +191,7 @@ function fnBeforeUploadFile(file: FileType) {
modalState.from.neType = neType; modalState.from.neType = neType;
// 根据给定的软件名取版本号 ims-r2.2312.x-ub22.deb // 根据给定的软件名取版本号 ims-r2.2312.x-ub22.deb
const matches = fileName.match(/([0-9.]+[0-9x]+)/); const matches = fileName.match(/([0-9.]+[0-9a-zA-Z]+)/);
if (matches) { if (matches) {
modalState.from.version = matches[0]; modalState.from.version = matches[0];
} }

View File

@@ -70,7 +70,7 @@ onMounted(() => {
<template #content> <template #content>
<div> <div>
<strong>{{ t('views.ne.common.neType') }}:&nbsp;</strong> <strong>{{ t('views.ne.common.neType') }}:&nbsp;</strong>
<span v-for="v in task.neList"> {{ v }} &nbsp;&nbsp; </span> <span v-for="v in task.neList"> {{ v }} &nbsp; </span>
</div> </div>
<div> <div>
<strong> {{ t('views.traceManage.task.startTime') }}:&nbsp; </strong> <strong> {{ t('views.traceManage.task.startTime') }}:&nbsp; </strong>

View File

@@ -236,7 +236,6 @@ function fnRecordDelete(id: string) {
if (id === '0') { if (id === '0') {
const mun = `...${tableState.selectedRowKeys.length}`; const mun = `...${tableState.selectedRowKeys.length}`;
msg = `${t('views.traceManage.task.delTaskTip', { id: mun })} `; msg = `${t('views.traceManage.task.delTaskTip', { id: mun })} `;
id = tableState.selectedRowKeys.join(',');
} }
Modal.confirm({ Modal.confirm({

View File

@@ -19,6 +19,8 @@ import dayjs, { Dayjs } from 'dayjs';
import saveAs from 'file-saver'; import saveAs from 'file-saver';
import PQueue from 'p-queue'; import PQueue from 'p-queue';
import { useClipboard } from '@vueuse/core'; import { useClipboard } from '@vueuse/core';
import { currentCoreUid } from '@/hooks/useCoreUid';
import { WS_GROUP_AMF_UE } from '@/constants/ne-constants';
const { copy } = useClipboard({ legacy: true }); const { copy } = useClipboard({ legacy: true });
const { t } = useI18n(); const { t } = useI18n();
const { getDict } = useDictStore(); const { getDict } = useDictStore();
@@ -65,9 +67,10 @@ let rangePickerPresets = ref([
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元类型 */ /**核心网标识 */
neType: 'AMF', coreUid: currentCoreUid(),
neId: '001', /**网元标识 */
neUid: undefined,
eventType: '', eventType: '',
imsi: '', imsi: '',
sortField: 'timestamp', sortField: 'timestamp',
@@ -387,6 +390,8 @@ const realTimeData = ref<boolean>(false);
function fnRealTime() { function fnRealTime() {
realTimeData.value = !realTimeData.value; realTimeData.value = !realTimeData.value;
if (realTimeData.value) { if (realTimeData.value) {
const neUid = queryParams.neUid;
const coreUid = queryParams.coreUid;
tableState.seached = false; tableState.seached = false;
// 建立链接 // 建立链接
const options: OptionsType = { const options: OptionsType = {
@@ -394,9 +399,9 @@ function fnRealTime() {
params: { params: {
/**订阅通道组 /**订阅通道组
* *
* AMF_UE会话事件(GroupID:1010_neId) * AMF_UE会话事件(GroupID:1010_coreUid_neUid)
*/ */
subGroupID: `1010_${queryParams.neId}`, subGroupID: `${WS_GROUP_AMF_UE}_${coreUid}_${neUid}`,
}, },
onmessage: wsMessage, onmessage: wsMessage,
onerror: (ev: any) => { onerror: (ev: any) => {
@@ -423,8 +428,10 @@ function wsMessage(res: Record<string, any>) {
if (!data?.groupId) { if (!data?.groupId) {
return; return;
} }
const neUid = queryParams.neUid;
const coreUid = queryParams.coreUid;
// ueEvent AMF_UE会话事件 // ueEvent AMF_UE会话事件
if (data.groupId === `1010_${queryParams.neId}`) { if (data.groupId === `${WS_GROUP_AMF_UE}_${coreUid}_${neUid}`) {
const ueEvent = data.data; const ueEvent = data.data;
queue.add(async () => { queue.add(async () => {
modalState.maxId += 1; modalState.maxId += 1;
@@ -478,7 +485,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} else { } else {
message.warning({ message.warning({
content: t('common.noData'), content: t('common.noData'),
@@ -508,9 +515,9 @@ onBeforeUnmount(() => {
<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="6" :md="12" :xs="24">
<a-form-item label="AMF" name="neId "> <a-form-item label="AMF" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
@change="fnGetList(1)" @change="fnGetList(1)"

View File

@@ -92,7 +92,7 @@ let queryParams = reactive({
/**当前页数 */ /**当前页数 */
pageNum: 1, pageNum: 1,
/**每页条数 */ /**每页条数 */
pageSize: 20, pageSize: 10,
}); });
/**表格状态类型 */ /**表格状态类型 */
@@ -169,9 +169,9 @@ let tablePagination = reactive({
/**当前页数 */ /**当前页数 */
current: 1, current: 1,
/**每页条数 */ /**每页条数 */
pageSize: 20, pageSize: 10,
/**默认的每页条数 */ /**默认的每页条数 */
defaultPageSize: 20, defaultPageSize: 10,
/**指定每页可以显示多少条 */ /**指定每页可以显示多少条 */
pageSizeOptions: ['10', '20', '50', '100'], pageSizeOptions: ['10', '20', '50', '100'],
/**只有一页时是否隐藏分页器 */ /**只有一页时是否隐藏分页器 */

View File

@@ -10,6 +10,7 @@ import useNeStore from '@/store/modules/ne';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { listAMFNblist } from '@/api/neData/amf'; import { listAMFNblist } from '@/api/neData/amf';
import { listMMENblist } from '@/api/neData/mme'; import { listMMENblist } from '@/api/neData/mme';
import { currentCoreUid } from '@/hooks/useCoreUid';
const neStore = useNeStore(); const neStore = useNeStore();
const route = useRoute(); const route = useRoute();
const { t } = useI18n(); const { t } = useI18n();
@@ -19,8 +20,10 @@ let neCascaderOptions = ref<Record<string, any>[]>([]);
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元ID */ /**核心网标识 */
neId: '', coreUid: currentCoreUid(),
/**网元标识 */
neUid: '',
/**网元类型 */ /**网元类型 */
neType: ['', ''], neType: ['', ''],
/**GNB_ID */ /**GNB_ID */
@@ -34,7 +37,6 @@ let queryParams = reactive({
/**查询参数重置 */ /**查询参数重置 */
function fnQueryReset() { function fnQueryReset() {
queryParams = Object.assign(queryParams, { queryParams = Object.assign(queryParams, {
neId: '',
id: '', id: '',
pageNum: 1, pageNum: 1,
pageSize: 20, pageSize: 20,
@@ -156,7 +158,8 @@ function fnGetList(pageNum?: number) {
item.children.forEach((child: any) => { item.children.forEach((child: any) => {
let resq = null; let resq = null;
let s = { let s = {
neId: child.neId, coreUid: queryParams.coreUid,
neUid: child.neUid,
neType: child.neType, neType: child.neType,
nbId: queryParams.id, nbId: queryParams.id,
pageNum: queryParams.pageNum, pageNum: queryParams.pageNum,
@@ -173,9 +176,9 @@ function fnGetList(pageNum?: number) {
resq.then(res => { resq.then(res => {
// 添加 neName 字段到每一项数据 // 添加 neName 字段到每一项数据
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
res.data.forEach((row: any) => { // res.data.forEach((row: any) => {
row.neName = `${child.neType}_${child.neId}`; // row.neName = `${child.neType}_${child.neUid}`;
}); // });
} }
return res; return res;
}) })
@@ -218,7 +221,8 @@ function fnGetList(pageNum?: number) {
let toBack: Record<string, any> = { let toBack: Record<string, any> = {
neType: queryParams.neType[0], neType: queryParams.neType[0],
neId: queryParams.neType[1], neUid: queryParams.neType[1],
coreUid: queryParams.coreUid,
nbId: queryParams.id, nbId: queryParams.id,
pageNum: queryParams.pageNum, pageNum: queryParams.pageNum,
pageSize: queryParams.pageSize, pageSize: queryParams.pageSize,
@@ -290,10 +294,10 @@ onMounted(() => {
const item = neCascaderOptions.value.find(s => s.value === queryNeType); const item = neCascaderOptions.value.find(s => s.value === queryNeType);
if (item && item.children) { if (item && item.children) {
const info = item.children[0]; const info = item.children[0];
queryParams.neType = [info.neType, info.neId]; queryParams.neType = [info.neType, info.neUid];
} else { } else {
const info = neCascaderOptions.value[0].children[0]; const info = neCascaderOptions.value[0].children[0];
queryParams.neType = [info.neType, info.neId]; queryParams.neType = [info.neType, info.neUid];
} }
// 获取列表数据 // 获取列表数据
@@ -312,7 +316,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="6" :md="12" :xs="24">
<a-form-item name="neId" :label="t('views.neUser.base5G.neType')"> <a-form-item name="neUid" :label="t('views.ne.common.neType')">
<a-cascader <a-cascader
v-model:value="queryParams.neType" v-model:value="queryParams.neType"
:options="neCascaderOptions" :options="neCascaderOptions"

View File

@@ -9,6 +9,7 @@ import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
import { exportNBState, listNBState } from '@/api/neData/nb-state'; import { exportNBState, listNBState } from '@/api/neData/nb-state';
import { Dayjs } from 'dayjs'; import { Dayjs } from 'dayjs';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
const emit = defineEmits(['cancel', 'update:open']); const emit = defineEmits(['cancel', 'update:open']);
const props = defineProps({ const props = defineProps({
@@ -21,13 +22,15 @@ const props = defineProps({
default: false, default: false,
}, },
/**网元ID */ /**网元ID */
neId: { neUid: {
type: String, type: String,
default: false, default: '',
required: true,
}, },
neType: { coreUid: {
type: String, type: String,
default: false, default: '',
required: true,
}, },
}); });
@@ -51,9 +54,10 @@ const nbStateOptions = ref<DictType[]>([
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元 */ /**核心网标识 */
neType: '', coreUid: props.coreUid,
neId: '', /**网元标识 */
neUid: props.neUid,
/**排序字段 */ /**排序字段 */
sortField: 'id', sortField: 'id',
sortOrder: 'desc', sortOrder: 'desc',
@@ -209,7 +213,10 @@ function fnExportList() {
content: t('common.operateOk'), content: t('common.operateOk'),
duration: 3, duration: 3,
}); });
saveAs(res.data, `nb_state_history_records_export_${Date.now()}.xlsx`); saveAs(
res.data,
`nb_state_history_records_export_${Date.now()}.xlsx`
);
} else { } else {
message.error({ message.error({
content: `${res.msg}`, content: `${res.msg}`,
@@ -245,7 +252,7 @@ function fnGetList(pageNum?: number) {
} }
listNBState(toRaw(queryParams)).then(res => { listNBState(toRaw(queryParams)).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
// 取消勾选 // 取消勾选
if (tableState.selectedRowKeys.length > 0) { if (tableState.selectedRowKeys.length > 0) {
tableState.selectedRowKeys = []; tableState.selectedRowKeys = [];
@@ -278,8 +285,8 @@ watch(
() => props.open, () => props.open,
val => { val => {
if (val) { if (val) {
queryParams.neType = props.neType; queryParams.coreUid = props.coreUid;
queryParams.neId = props.neId; queryParams.neUid = props.neUid;
// 获取列表数据 // 获取列表数据
fnGetList(); fnGetList();
} }

View File

@@ -31,6 +31,7 @@ import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import saveAs from 'file-saver'; import saveAs from 'file-saver';
import { readSheet, writeSheet } from '@/utils/execl-utils'; import { readSheet, writeSheet } from '@/utils/execl-utils';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { currentCoreUid } from '@/hooks/useCoreUid';
const route = useRoute(); const route = useRoute();
const neStore = useNeStore(); const neStore = useNeStore();
@@ -60,8 +61,10 @@ let neCascaderOptions = ref<Record<string, any>[]>([]);
let neTypeAndId = ref<string[]>([]); let neTypeAndId = ref<string[]>([]);
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元ID */ /**核心网标识 */
neId: '', coreUid: currentCoreUid(),
/**网元标识 */
neUid: '',
/**IMSI */ /**IMSI */
state: undefined, state: undefined,
}); });
@@ -208,8 +211,8 @@ function fnTableSelectedRowKeys(keys: (string | number)[]) {
* @param index ID * @param index ID
*/ */
function fnRecordDelete(index: string) { function fnRecordDelete(index: string) {
const [neType, neId] = neTypeAndId.value; const [neType, neUid] = neTypeAndId.value;
if (!neId) return; if (!neUid) return;
let msg = `Delete index as:${index}`; let msg = `Delete index as:${index}`;
if (index === '0') { if (index === '0') {
msg = `Remove the index checkbox:${tableState.selectedRowKeys.length}`; msg = `Remove the index checkbox:${tableState.selectedRowKeys.length}`;
@@ -219,6 +222,7 @@ function fnRecordDelete(index: string) {
title: t('common.tipTitle'), title: t('common.tipTitle'),
content: msg, content: msg,
onOk() { onOk() {
const coreUid = currentCoreUid();
const reqArr = []; const reqArr = [];
if (index === '0') { if (index === '0') {
if (tableState.selectedRowKeys.length <= 0) { if (tableState.selectedRowKeys.length <= 0) {
@@ -226,18 +230,18 @@ function fnRecordDelete(index: string) {
} }
for (const v of tableState.selectedRowKeys) { for (const v of tableState.selectedRowKeys) {
if (neType === 'MME') { if (neType === 'MME') {
reqArr.push(delMMENbState(neId, v)); reqArr.push(delMMENbState(coreUid, neUid, v));
} }
if (neType === 'AMF') { if (neType === 'AMF') {
reqArr.push(delAMFNbState(neId, v)); reqArr.push(delAMFNbState(coreUid, neUid, v));
} }
} }
} else { } else {
if (neType === 'MME') { if (neType === 'MME') {
reqArr.push(delMMENbState(neId, index)); reqArr.push(delMMENbState(coreUid, neUid, index));
} }
if (neType === 'AMF') { if (neType === 'AMF') {
reqArr.push(delAMFNbState(neId, index)); reqArr.push(delAMFNbState(coreUid, neUid, index));
} }
} }
if (reqArr.length <= 0) return; if (reqArr.length <= 0) return;
@@ -266,8 +270,8 @@ function fnRecordDelete(index: string) {
function fnGetList() { function fnGetList() {
if (tableState.loading) return; if (tableState.loading) return;
tableState.loading = true; tableState.loading = true;
const [neType, neId] = neTypeAndId.value; const [neType, neUid] = neTypeAndId.value;
queryParams.neId = neId; queryParams.neUid = neUid;
let req = null; let req = null;
if (neType === 'MME') { if (neType === 'MME') {
req = listMMENbStatelist(toRaw(queryParams)); req = listMMENbStatelist(toRaw(queryParams));
@@ -402,8 +406,9 @@ function fnModalVisibleByEdit(edit?: string | number) {
* 进行表达规则校验 * 进行表达规则校验
*/ */
function fnModalOk() { function fnModalOk() {
const [neType, neId] = neTypeAndId.value; const [neType, neUid] = neTypeAndId.value;
if (!neId) return; if (!neUid) return;
const coreUid = currentCoreUid();
const from = JSON.parse(JSON.stringify(modalState.from)); const from = JSON.parse(JSON.stringify(modalState.from));
modalStateFrom modalStateFrom
.validate() .validate()
@@ -413,13 +418,13 @@ function fnModalOk() {
let result: any = null; let result: any = null;
if (neType === 'MME') { if (neType === 'MME') {
result = from.state result = from.state
? editMMENbState(neId, from) ? editMMENbState(coreUid, neUid, from)
: addMMENbState(neId, from); : addMMENbState(coreUid, neUid, from);
} }
if (neType === 'AMF') { if (neType === 'AMF') {
result = from.state result = from.state
? editAMFNbState(neId, from) ? editAMFNbState(coreUid, neUid, from)
: addAMFNbState(neId, from); : addAMFNbState(coreUid, neUid, from);
} }
if (result === null) { if (result === null) {
return; return;
@@ -534,7 +539,7 @@ function fnModalImportClose() {
/**对话框表格信息导入上传 */ /**对话框表格信息导入上传 */
function fnModalImportUpload(file: File) { function fnModalImportUpload(file: File) {
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
const [neType, neId] = neTypeAndId.value; const [neType, neUid] = neTypeAndId.value;
modalState.importMsgArr = []; modalState.importMsgArr = [];
// 获取最大index // 获取最大index
@@ -560,6 +565,7 @@ function fnModalImportUpload(file: File) {
return; return;
} }
// 开始导入 // 开始导入
const coreUid = currentCoreUid();
modalState.confirmLoading = true; modalState.confirmLoading = true;
for (const row of rows) { for (const row of rows) {
const rowId = row[t('common.rowId')]; const rowId = row[t('common.rowId')];
@@ -575,7 +581,8 @@ function fnModalImportUpload(file: File) {
// 定义则更新名称位置 // 定义则更新名称位置
if (neType === 'MME') { if (neType === 'MME') {
result = await editMMENbState( result = await editMMENbState(
neId, coreUid,
neUid,
Object.assign({}, hasAddress, { Object.assign({}, hasAddress, {
name, name,
position, position,
@@ -584,7 +591,8 @@ function fnModalImportUpload(file: File) {
} }
if (neType === 'AMF') { if (neType === 'AMF') {
result = await editAMFNbState( result = await editAMFNbState(
neId, coreUid,
neUid,
Object.assign({}, hasAddress, { Object.assign({}, hasAddress, {
name, name,
position, position,
@@ -609,10 +617,10 @@ function fnModalImportUpload(file: File) {
address: `${address}`, address: `${address}`,
}; };
if (neType === 'MME') { if (neType === 'MME') {
result = await addMMENbState(neId, form); result = await addMMENbState(coreUid, neUid, form);
} }
if (neType === 'AMF') { if (neType === 'AMF') {
result = await addAMFNbState(neId, form); result = await addAMFNbState(coreUid, neUid, form);
} }
let msg = `${t('common.rowId')}: ${rowId} ${t( let msg = `${t('common.rowId')}: ${rowId} ${t(
'views.neData.baseStation.addRadio' 'views.neData.baseStation.addRadio'
@@ -669,16 +677,16 @@ onMounted(() => {
}); });
return; return;
} }
// 无查询参数neType时 默认选择AMF // 无查询参数neType时 默认选择AMF
const queryNeType = (route.query.neType as string) || 'AMF'; const queryNeType = (route.query.neType as string) || 'AMF';
const item = neCascaderOptions.value.find(s => s.value === queryNeType); const item = neCascaderOptions.value.find(s => s.value === queryNeType);
if (item && item.children) { if (item && item.children) {
const info = item.children[0]; const info = item.children[0];
neTypeAndId.value = [info.neType, info.neId]; neTypeAndId.value = [info.neType, info.neUid];
} else { } else {
const info = neCascaderOptions.value[0].children[0]; const info = neCascaderOptions.value[0].children[0];
neTypeAndId.value = [info.neType, info.neId]; neTypeAndId.value = [info.neType, info.neUid];
} }
// 获取列表数据 // 获取列表数据
@@ -908,7 +916,8 @@ onMounted(() => {
v-model:open="modalState.openByHistory" v-model:open="modalState.openByHistory"
:title="t('views.neData.baseStation.history')" :title="t('views.neData.baseStation.history')"
:ne-type="neTypeAndId[0]" :ne-type="neTypeAndId[0]"
:ne-id="neTypeAndId[1]" :ne-uid="neTypeAndId[1]"
:core-uid="queryParams.coreUid"
@cancel="fnModalCancel" @cancel="fnModalCancel"
></HistoryModal> ></HistoryModal>

View File

@@ -179,11 +179,11 @@ const graphNodeTooltip = new Tooltip({
${nInfo.refreshTime ?? '--'} ${nInfo.refreshTime ?? '--'}
</span></div> </span></div>
<div>========================</div> <div>========================</div>
<div><strong>ID</strong><span>${nInfo.neId}</span></div> <div><strong>ID</strong><span>${nInfo.neUid}</span></div>
<div><strong>${t('views.monitor.topology.name')}</strong><span> <div><strong>${t('views.monitor.topology.name')}</strong><span>
${nInfo.neName ?? '--'} ${nInfo.neName ?? '--'}
</span></div> </span></div>
<div><strong>IP</strong><span>${nInfo.neIP}</span></div> <div><strong>IP</strong><span>${nInfo.ipAddr}</span></div>
<div><strong>${t('views.monitor.topology.version')}</strong><span> <div><strong>${t('views.monitor.topology.version')}</strong><span>
${nInfo.version ?? '--'} ${nInfo.version ?? '--'}
</span></div> </span></div>
@@ -392,7 +392,12 @@ async function fnGraphDataBase() {
id: 'OMC', id: 'OMC',
label: omcInfo.neName, label: omcInfo.neName,
img: parseBasePath('/svg/service_db.svg'), img: parseBasePath('/svg/service_db.svg'),
nInfo: { online: false, neId: omcInfo.neId, neType: omcInfo.neType }, nInfo: {
online: false,
coreUid: omcInfo.coreUid,
neUid: omcInfo.neUid,
neType: omcInfo.neType,
},
nType: 'OMC', nType: 'OMC',
}; };
// 添加OMC节点 // 添加OMC节点
@@ -402,12 +407,17 @@ async function fnGraphDataBase() {
if (['AMF', 'MME'].includes(item.value)) { if (['AMF', 'MME'].includes(item.value)) {
if (item.children?.length === 0) continue; if (item.children?.length === 0) continue;
for (const child of item.children) { for (const child of item.children) {
const id = `${child.neType}_${child.neId}`; const id = `${child.coreUid}_${child.neUid}`;
const node = { const node = {
id: id, id: id,
label: child.neName, label: child.neName,
img: parseBasePath('/svg/service.svg'), img: parseBasePath('/svg/service.svg'),
nInfo: { online: false, neId: child.neId, neType: child.neType }, nInfo: {
online: false,
coreUid: child.coreUid,
neUid: child.neUid,
neType: child.neType,
},
nType: item.value, nType: item.value,
}; };
// 添加节点 // 添加节点
@@ -430,8 +440,9 @@ async function fnGraphDataNb(data: GraphData) {
if (arr === undefined || arr.length === 0) return data; if (arr === undefined || arr.length === 0) return data;
for (const item of arr) { for (const item of arr) {
if (item.nType === 'AMF') { if (item.nType === 'AMF') {
const neId = (item.nInfo as any).neId; const coreUid = (item.nInfo as any).coreUid;
const res = await listAMFNbStatelist({ neId }); const neUid = (item.nInfo as any).neUid;
const res = await listAMFNbStatelist({ coreUid, neUid });
if (res.code !== RESULT_CODE_SUCCESS || !Array.isArray(res.data)) { if (res.code !== RESULT_CODE_SUCCESS || !Array.isArray(res.data)) {
continue; continue;
} }
@@ -451,8 +462,12 @@ async function fnGraphDataNb(data: GraphData) {
} }
} }
if (item.nType === 'MME') { if (item.nType === 'MME') {
const neId = (item.nInfo as any).neId; const coreUid = (item.nInfo as any).coreUid;
const res = await listMMENbStatelist({ neId }); const neUid = (item.nInfo as any).neUid;
const res = await listMMENbStatelist({
coreUid,
neUid,
});
if (res.code !== RESULT_CODE_SUCCESS || !Array.isArray(res.data)) { if (res.code !== RESULT_CODE_SUCCESS || !Array.isArray(res.data)) {
continue; continue;
} }
@@ -535,7 +550,10 @@ async function fnGraphState(reload: boolean = false) {
} }
} }
if (reload && nInfo.neType === 'MME') { if (reload && nInfo.neType === 'MME') {
const res = await listMMENbStatelist({ neId: nInfo.neId }); const res = await listMMENbStatelist({
coreUid: nInfo.coreUid,
neUid: nInfo.neUid,
});
if (res.code == RESULT_CODE_SUCCESS && Array.isArray(res.data)) { if (res.code == RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
for (const nb of res.data) { for (const nb of res.data) {
const nbItem = graphData.nodes.find( const nbItem = graphData.nodes.find(

View File

@@ -23,6 +23,8 @@ import saveAs from 'file-saver';
import PQueue from 'p-queue'; import PQueue from 'p-queue';
import { useClipboard } from '@vueuse/core'; import { useClipboard } from '@vueuse/core';
import dayjs, { type Dayjs } from 'dayjs'; import dayjs, { type Dayjs } from 'dayjs';
import { currentCoreUid } from '@/hooks/useCoreUid';
import { WS_GROUP_IMS_CDR } from '@/constants/ne-constants';
const { copy } = useClipboard({ legacy: true }); const { copy } = useClipboard({ legacy: true });
const { t } = useI18n(); const { t } = useI18n();
const { getDict } = useDictStore(); const { getDict } = useDictStore();
@@ -70,9 +72,10 @@ let rangePickerPresets = ref([
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元类型 */ /**核心网标识 */
neType: 'IMS', coreUid: currentCoreUid(),
neId: '001', /**网元标识 */
neUid: undefined,
recordType: '', recordType: '',
callerParty: '', callerParty: '',
calledParty: '', calledParty: '',
@@ -444,6 +447,8 @@ const realTimeData = ref<boolean>(false);
function fnRealTime() { function fnRealTime() {
realTimeData.value = !realTimeData.value; realTimeData.value = !realTimeData.value;
if (realTimeData.value) { if (realTimeData.value) {
const neUid = queryParams.neUid;
const coreUid = queryParams.coreUid;
tableState.seached = false; tableState.seached = false;
// //
const options: OptionsType = { const options: OptionsType = {
@@ -453,7 +458,7 @@ function fnRealTime() {
* *
* IMS_CDR会话事件(GroupID:1005) * IMS_CDR会话事件(GroupID:1005)
*/ */
subGroupID: `1005_${queryParams.neId}`, subGroupID: `${WS_GROUP_IMS_CDR}_${coreUid}_${neUid}`,
}, },
onmessage: wsMessage, onmessage: wsMessage,
onerror: (ev: any) => { onerror: (ev: any) => {
@@ -480,8 +485,10 @@ function wsMessage(res: Record<string, any>) {
if (!data?.groupId) { if (!data?.groupId) {
return; return;
} }
const neUid = queryParams.neUid;
const coreUid = queryParams.coreUid;
// cdrEvent CDR // cdrEvent CDR
if (data.groupId === `1005_${queryParams.neId}`) { if (data.groupId === `${WS_GROUP_IMS_CDR}_${coreUid}_${neUid}`) {
const cdrEvent = data.data; const cdrEvent = data.data;
let cdrJSON = {}; let cdrJSON = {};
try { try {
@@ -537,7 +544,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} else { } else {
message.warning({ message.warning({
content: t('common.noData'), content: t('common.noData'),
@@ -567,9 +574,9 @@ onBeforeUnmount(() => {
<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="6" :md="12" :xs="24">
<a-form-item label="IMS" name="neId "> <a-form-item label="IMS" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
@change="fnQueryReset()" @change="fnQueryReset()"

View File

@@ -9,6 +9,7 @@ import useNeStore from '@/store/modules/ne';
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';
import { listIMSSessionList } from '@/api/neData/ims'; import { listIMSSessionList } from '@/api/neData/ims';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
@@ -17,8 +18,10 @@ let neOtions = ref<Record<string, any>[]>([]);
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元ID */ /**核心网标识 */
neId: undefined, coreUid: currentCoreUid(),
/**网元标识 */
neUid: undefined,
/**IMSI */ /**IMSI */
imsi: '', imsi: '',
/**msisdn */ /**msisdn */
@@ -186,7 +189,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} }
// 获取列表数据 // 获取列表数据
@@ -205,9 +208,9 @@ 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="6" :md="12" :xs="24">
<a-form-item :label="t('views.neUser.ims.neType')" name="neId "> <a-form-item label="IMS" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
/> />

View File

@@ -19,6 +19,8 @@ import { OptionsType, WS } from '@/plugins/ws-websocket';
import saveAs from 'file-saver'; import saveAs from 'file-saver';
import PQueue from 'p-queue'; import PQueue from 'p-queue';
import { useClipboard } from '@vueuse/core'; import { useClipboard } from '@vueuse/core';
import { currentCoreUid } from '@/hooks/useCoreUid';
import { WS_GROUP_MME_UE } from '@/constants/ne-constants';
const { copy } = useClipboard({ legacy: true }); const { copy } = useClipboard({ legacy: true });
const { t } = useI18n(); const { t } = useI18n();
const { getDict } = useDictStore(); const { getDict } = useDictStore();
@@ -66,9 +68,10 @@ let rangePickerPresets = ref([
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元类型 */ /**核心网标识 */
neType: 'MME', coreUid: currentCoreUid(),
neId: '001', /**网元标识 */
neUid: undefined,
eventType: '', eventType: '',
imsi: '', imsi: '',
sortField: 'timestamp', sortField: 'timestamp',
@@ -389,16 +392,18 @@ const realTimeData = ref<boolean>(false);
function fnRealTime() { function fnRealTime() {
realTimeData.value = !realTimeData.value; realTimeData.value = !realTimeData.value;
if (realTimeData.value) { if (realTimeData.value) {
const neUid = queryParams.neUid;
const coreUid = queryParams.coreUid;
tableState.seached = false; tableState.seached = false;
// 建立链接 // 建立链接
const options: OptionsType = { const options: OptionsType = {
url: '/ws', url: '/ws',
params: { params: {
/**订阅通道组 /**订阅通道组
* *
* MME_UE会话事件(GroupID:1011_neId) * MME_UE会话事件(GroupID:1011_coreUid_neUid)
*/ */
subGroupID: `1011_${queryParams.neId}`, subGroupID: `${WS_GROUP_MME_UE}_${coreUid}_${neUid}`,
}, },
onmessage: wsMessage, onmessage: wsMessage,
onerror: (ev: any) => { onerror: (ev: any) => {
@@ -426,7 +431,7 @@ function wsMessage(res: Record<string, any>) {
return; return;
} }
// ueEvent MME_UE会话事件 // ueEvent MME_UE会话事件
if (data.groupId === `1011_${queryParams.neId}`) { if (data.groupId === `${WS_GROUP_MME_UE}_${queryParams.coreUid}_${queryParams.neUid}`) {
const ueEvent = data.data; const ueEvent = data.data;
queue.add(async () => { queue.add(async () => {
modalState.maxId += 1; modalState.maxId += 1;
@@ -486,7 +491,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} else { } else {
message.warning({ message.warning({
content: t('common.noData'), content: t('common.noData'),
@@ -516,9 +521,9 @@ onBeforeUnmount(() => {
<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="6" :md="12" :xs="24">
<a-form-item label="MME" name="neId "> <a-form-item label="MME" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
@change="fnGetList(1)" @change="fnGetList(1)"

View File

@@ -5,10 +5,11 @@ import { message } from 'ant-design-vue/es';
import { SizeType } from 'ant-design-vue/es/config-provider'; import { SizeType } from 'ant-design-vue/es/config-provider';
import { MenuInfo } from 'ant-design-vue/es/menu/src/interface'; import { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import { ColumnsType } from 'ant-design-vue/es/table'; import { ColumnsType } from 'ant-design-vue/es/table';
import { listN3IWFSubList } from '@/api/neUser/n3iwf'; import { listN3IWFSubList } from '@/api/neData/n3iwf';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
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';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
/**网元参数 */ /**网元参数 */
@@ -16,8 +17,10 @@ let neOtions = ref<Record<string, any>[]>([]);
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元ID */ /**核心网标识 */
neId: undefined, coreUid: currentCoreUid(),
/**网元标识 */
neUid: undefined,
/**imsi */ /**imsi */
imsi: '', imsi: '',
}); });
@@ -94,7 +97,7 @@ function fnGetList() {
listN3IWFSubList(toRaw(queryParams)).then(res => { listN3IWFSubList(toRaw(queryParams)).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
const { total, rows } = res.data; const { total, rows } = res.data;
tableState.data = rows; tableState.data = rows;
} else { } else {
tableState.data = []; tableState.data = [];
} }
@@ -117,7 +120,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} }
// //
@@ -136,9 +139,9 @@ 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="8" :md="12" :xs="24"> <a-col :lg="8" :md="12" :xs="24">
<a-form-item :label="t('views.neUser.n3iwf.neType')" name="neId "> <a-form-item label="N3IWF" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
/> />

View File

@@ -1,13 +1,37 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive, onMounted } from 'vue'; import { reactive, onMounted, ref, toRaw } from 'vue';
import { PageContainer } from 'antdv-pro-layout'; import { PageContainer } from 'antdv-pro-layout';
import { SizeType } from 'ant-design-vue/es/config-provider'; import { SizeType } from 'ant-design-vue/es/config-provider';
import { MenuInfo } from 'ant-design-vue/es/menu/src/interface'; import { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import { ColumnsType } from 'ant-design-vue/es/table'; import { ColumnsType } from 'ant-design-vue/es/table';
import { listNSSFAmfList } from '@/api/neUser/nssf'; import { listNSSFAmfList } from '@/api/neData/nssf';
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';
import { currentCoreUid } from '@/hooks/useCoreUid';
import useNeStore from '@/store/modules/ne';
import { message } from 'ant-design-vue';
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore();
/**网元参数 */
let neOtions = ref<Record<string, any>[]>([]);
/**查询参数 */
let queryParams = reactive({
/**核心网标识 */
coreUid: currentCoreUid(),
/**网元标识 */
neUid: undefined,
/**imsi */
amfSetId: '',
});
/**查询参数重置 */
function fnQueryReset() {
queryParams = Object.assign(queryParams, {
amfSetId: '',
});
fnGetList(1);
}
/**表格状态类型 */ /**表格状态类型 */
type TabeStateType = { type TabeStateType = {
@@ -37,14 +61,13 @@ let tableColumns: ColumnsType = [
{ {
title: 'NF ID', title: 'NF ID',
dataIndex: 'nfId', dataIndex: 'nfId',
align: 'center', align: 'left',
width: 150, width: 150,
}, },
{ {
title: 'AMF Set ID', title: 'AMF Set ID',
dataIndex: 'amfSetId', dataIndex: 'amfSetId',
align: 'center', align: 'left',
width: 150,
}, },
]; ];
@@ -57,13 +80,13 @@ function fnTableSize({ key }: MenuInfo) {
function fnGetList(pageNum?: number) { function fnGetList(pageNum?: number) {
if (tableState.loading) return; if (tableState.loading) return;
tableState.loading = true; tableState.loading = true;
listNSSFAmfList().then(res => { listNSSFAmfList(toRaw(queryParams)).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
// //
if (tableState.selectedRowKeys.length > 0) { if (tableState.selectedRowKeys.length > 0) {
tableState.selectedRowKeys = []; tableState.selectedRowKeys = [];
} }
const { total, rows } = res.data; const { total, rows } = res.data;
tableState.data = rows; tableState.data = rows;
} else { } else {
tableState.data = []; tableState.data = [];
@@ -73,6 +96,23 @@ function fnGetList(pageNum?: number) {
} }
onMounted(() => { onMounted(() => {
//
neStore.neCascaderOptions.forEach(item => {
if (item.value === 'NSSF') {
neOtions.value = JSON.parse(JSON.stringify(item.children));
}
});
if (neOtions.value.length === 0) {
message.warning({
content: t('common.noData'),
duration: 2,
});
return;
}
if (neOtions.value.length > 0) {
queryParams.neUid = neOtions.value[0].value;
}
// //
fnGetList(); fnGetList();
}); });
@@ -80,6 +120,46 @@ onMounted(() => {
<template> <template>
<PageContainer> <PageContainer>
<a-card
v-show="tableState.seached"
:bordered="false"
:body-style="{ marginBottom: '24px', paddingBottom: 0 }"
>
<!-- 表格搜索栏 -->
<a-form :model="queryParams" name="queryParams" layout="horizontal">
<a-row :gutter="16">
<a-col :lg="8" :md="12" :xs="24">
<a-form-item label="NSSF" name="neUid ">
<a-select
v-model:value="queryParams.neUid"
:options="neOtions"
:placeholder="t('common.selectPlease')"
/>
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item label="AMF Set ID" name="amfSetId">
<a-input v-model:value="queryParams.amfSetId" allow-clear></a-input>
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item>
<a-space :size="8">
<a-button type="primary" @click.prevent="fnGetList()">
<template #icon><SearchOutlined /></template>
{{ t('common.search') }}
</a-button>
<a-button type="default" @click.prevent="fnQueryReset">
<template #icon><ClearOutlined /></template>
{{ t('common.reset') }}
</a-button>
</a-space>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-card>
<a-card :bordered="false" :body-style="{ padding: '0px' }"> <a-card :bordered="false" :body-style="{ padding: '0px' }">
<!-- 插槽-卡片左侧侧 --> <!-- 插槽-卡片左侧侧 -->
<template #title> </template> <template #title> </template>

View File

@@ -1,13 +1,37 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive, ref, onMounted } from 'vue'; import { reactive, ref, onMounted, toRaw } from 'vue';
import { PageContainer } from 'antdv-pro-layout'; import { PageContainer } from 'antdv-pro-layout';
import { SizeType } from 'ant-design-vue/es/config-provider'; import { SizeType } from 'ant-design-vue/es/config-provider';
import { MenuInfo } from 'ant-design-vue/es/menu/src/interface'; import { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import { ColumnsType } from 'ant-design-vue/es/table'; import { ColumnsType } from 'ant-design-vue/es/table';
import { listNSSFSubList } from '@/api/neUser/nssf'; import { listNSSFSubList } from '@/api/neData/nssf';
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';
import { currentCoreUid } from '@/hooks/useCoreUid';
import useNeStore from '@/store/modules/ne';
import { message } from 'ant-design-vue';
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore();
/**网元参数 */
let neOtions = ref<Record<string, any>[]>([]);
/**查询参数 */
let queryParams = reactive({
/**核心网标识 */
coreUid: currentCoreUid(),
/**网元标识 */
neUid: undefined,
/**imsi */
imsi: '',
});
/**查询参数重置 */
function fnQueryReset() {
queryParams = Object.assign(queryParams, {
imsi: '',
});
fnGetList();
}
/**表格状态类型 */ /**表格状态类型 */
type TabeStateType = { type TabeStateType = {
@@ -37,20 +61,19 @@ let tableColumns: ColumnsType = [
{ {
title: 'Subscription ID', title: 'Subscription ID',
dataIndex: 'subscriptionId', dataIndex: 'subscriptionId',
align: 'center', align: 'left',
width: 150, width: 150,
}, },
{ {
title: 'NF NSSAI Availability Uri', title: 'NF NSSAI Availability Uri',
dataIndex: 'nfNssaiAvailabilityUri', dataIndex: 'nfNssaiAvailabilityUri',
align: 'center', align: 'left',
width: 150, width: 200,
}, },
{ {
title: 'Event', title: 'Event',
dataIndex: 'event', dataIndex: 'event',
align: 'center', align: 'left',
width: 80,
}, },
]; ];
@@ -63,7 +86,7 @@ function fnTableSize({ key }: MenuInfo) {
function fnGetList(pageNum?: number) { function fnGetList(pageNum?: number) {
if (tableState.loading) return; if (tableState.loading) return;
tableState.loading = true; tableState.loading = true;
listNSSFSubList().then(res => { listNSSFSubList(toRaw(queryParams)).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
// //
if (tableState.selectedRowKeys.length > 0) { if (tableState.selectedRowKeys.length > 0) {
@@ -79,12 +102,69 @@ function fnGetList(pageNum?: number) {
} }
onMounted(() => { onMounted(() => {
//
neStore.neCascaderOptions.forEach(item => {
if (item.value === 'NSSF') {
neOtions.value = JSON.parse(JSON.stringify(item.children));
}
});
if (neOtions.value.length === 0) {
message.warning({
content: t('common.noData'),
duration: 2,
});
return;
}
if (neOtions.value.length > 0) {
queryParams.neUid = neOtions.value[0].value;
}
fnGetList(); fnGetList();
}); });
</script> </script>
<template> <template>
<PageContainer> <PageContainer>
<a-card
v-show="tableState.seached"
:bordered="false"
:body-style="{ marginBottom: '24px', paddingBottom: 0 }"
>
<!-- 表格搜索栏 -->
<a-form :model="queryParams" name="queryParams" layout="horizontal">
<a-row :gutter="16">
<a-col :lg="8" :md="12" :xs="24">
<a-form-item label="NSSF" name="neUid ">
<a-select
v-model:value="queryParams.neUid"
:options="neOtions"
:placeholder="t('common.selectPlease')"
/>
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item label="IMSI" name="imsi">
<a-input v-model:value="queryParams.imsi" allow-clear></a-input>
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item>
<a-space :size="8">
<a-button type="primary" @click.prevent="fnGetList()">
<template #icon><SearchOutlined /></template>
{{ t('common.search') }}
</a-button>
<a-button type="default" @click.prevent="fnQueryReset">
<template #icon><ClearOutlined /></template>
{{ t('common.reset') }}
</a-button>
</a-space>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-card>
<a-card :bordered="false" :body-style="{ padding: '0px' }"> <a-card :bordered="false" :body-style="{ padding: '0px' }">
<!-- 插槽-卡片左侧侧 --> <!-- 插槽-卡片左侧侧 -->
<template #title> </template> <template #title> </template>
@@ -143,7 +223,7 @@ onMounted(() => {
:data-source="tableState.data" :data-source="tableState.data"
:size="tableState.size" :size="tableState.size"
:pagination="false" :pagination="false"
:scroll="{ x: 1200, y: 400 }" :scroll="{ y: 400 }"
> >
</a-table> </a-table>
</a-card> </a-card>

View File

@@ -20,6 +20,7 @@ import { getPCFRule } from '@/api/ne/neConfig';
import { uploadFileToNE } from '@/api/tool/file'; import { uploadFileToNE } from '@/api/tool/file';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { saveAs } from 'file-saver'; import { saveAs } from 'file-saver';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
/**网元参数 */ /**网元参数 */
@@ -36,8 +37,10 @@ const pcfRuleOption = ref<Record<string, any[]>>({
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元ID */ /**核心网标识 */
neId: undefined, coreUid: currentCoreUid(),
/**网元标识 */
neUid: undefined,
/**移动编号 */ /**移动编号 */
imsi: '', imsi: '',
/**号码 */ /**号码 */
@@ -279,7 +282,9 @@ const modalStateFrom = Form.useForm(
* @param noticeId 网元id, 不传为新增 * @param noticeId 网元id, 不传为新增
*/ */
function fnModalVisibleByEdit(row?: Record<string, any>) { function fnModalVisibleByEdit(row?: Record<string, any>) {
getPCFRule(queryParams.neId) const neUid = queryParams.neUid || '-';
const coreUid = queryParams.coreUid || '-';
getPCFRule(coreUid, neUid)
.then((data: any) => { .then((data: any) => {
pcfRuleOption.value = data; pcfRuleOption.value = data;
}) })
@@ -330,7 +335,8 @@ function fnModalVisibleByEdit(row?: Record<string, any>) {
*/ */
function fnModalOk() { function fnModalOk() {
const from = JSON.parse(JSON.stringify(modalState.from)); const from = JSON.parse(JSON.stringify(modalState.from));
const neId = queryParams.neId || '-'; const neUid = queryParams.neUid || '-';
const coreUid = queryParams.coreUid || '-';
from.rfsp = Number(from.rfsp) || 0; from.rfsp = Number(from.rfsp) || 0;
// 处理多选框数据 // 处理多选框数据
let pccRules = modalState.from.pccRules; let pccRules = modalState.from.pccRules;
@@ -369,21 +375,24 @@ function fnModalOk() {
if (modalState.isBatch) { if (modalState.isBatch) {
if (modalState.type === 'add') { if (modalState.type === 'add') {
result = addPCFRule({ result = addPCFRule({
neId: neId, coreUid: coreUid,
neUid: neUid,
num: from.num, num: from.num,
paramData: from, paramData: from,
}); });
} }
if (modalState.type === 'update') { if (modalState.type === 'update') {
result = editPCFRule({ result = editPCFRule({
neId: neId, coreUid: coreUid,
neUid: neUid,
num: from.num, num: from.num,
paramData: from, paramData: from,
}); });
} }
if (modalState.type === 'delete') { if (modalState.type === 'delete') {
result = delPCFRule({ result = delPCFRule({
neId: neId, coreUid: coreUid,
neUid: neUid,
num: from.num, num: from.num,
imsi: from.imsi, imsi: from.imsi,
}); });
@@ -391,14 +400,16 @@ function fnModalOk() {
} else { } else {
if (modalState.type === 'add') { if (modalState.type === 'add') {
result = addPCFRule({ result = addPCFRule({
neId: neId, coreUid: coreUid,
neUid: neUid,
num: 0, num: 0,
paramData: from, paramData: from,
}); });
} }
if (modalState.type === 'update') { if (modalState.type === 'update') {
result = editPCFRule({ result = editPCFRule({
neId: neId, coreUid: coreUid,
neUid: neUid,
num: 0, num: 0,
paramData: from, paramData: from,
}); });
@@ -465,7 +476,9 @@ function fnModalCancel() {
* @param type 类型 * @param type 类型
*/ */
function fnModalVisibleByBatch(type: 'delete' | 'add' | 'update') { function fnModalVisibleByBatch(type: 'delete' | 'add' | 'update') {
getPCFRule(queryParams.neId) const neUid = queryParams.neUid || '-';
const coreUid = queryParams.coreUid || '-';
getPCFRule(coreUid, neUid)
.then((data: any) => { .then((data: any) => {
pcfRuleOption.value = data; pcfRuleOption.value = data;
console.log(data); console.log(data);
@@ -495,8 +508,9 @@ function fnModalVisibleByBatch(type: 'delete' | 'add' | 'update') {
* @param imsi 网元编号ID * @param imsi 网元编号ID
*/ */
function fnRecordDelete(imsi: string) { function fnRecordDelete(imsi: string) {
const neId = queryParams.neId; const neUid = queryParams.neUid || '-';
if (!neId) return; const coreUid = queryParams.coreUid || '-';
if (!coreUid || !neUid) return;
let imsiMsg = imsi; let imsiMsg = imsi;
if (imsi === '0') { if (imsi === '0') {
imsiMsg = `${tableState.selectedRowKeys[0]}... ${tableState.selectedRowKeys.length}`; imsiMsg = `${tableState.selectedRowKeys[0]}... ${tableState.selectedRowKeys.length}`;
@@ -509,7 +523,8 @@ function fnRecordDelete(imsi: string) {
onOk() { onOk() {
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
delPCFRule({ delPCFRule({
neId: neId, coreUid: coreUid,
neUid: neUid,
imsi: imsi, imsi: imsi,
}) })
.then(res => { .then(res => {
@@ -535,11 +550,13 @@ function fnRecordDelete(imsi: string) {
/**列表导出 */ /**列表导出 */
function fnExportList(type: string) { function fnExportList(type: string) {
const neId = queryParams.neId; const neUid = queryParams.neUid || '-';
if (!neId) return; const coreUid = queryParams.coreUid || '-';
if (!coreUid || !neUid) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
exportPCFRule({ exportPCFRule({
neId: neId, coreUid: coreUid,
neUid: neUid,
fileType: type, fileType: type,
}) })
.then(res => { .then(res => {
@@ -548,7 +565,7 @@ function fnExportList(type: string) {
content: t('common.msgSuccess', { msg: t('common.export') }), content: t('common.msgSuccess', { msg: t('common.export') }),
duration: 3, duration: 3,
}); });
saveAs(res.data, `PCFRlue_${neId}_${Date.now()}.${type}`); saveAs(res.data, `PCFRlue_${neUid}_${Date.now()}.${type}`);
} else { } else {
message.error({ message.error({
content: `${res.msg}`, content: `${res.msg}`,
@@ -622,14 +639,15 @@ function fnModalUploadImportClose() {
/**对话框表格信息导入上传 */ /**对话框表格信息导入上传 */
function fnModalUploadImportUpload(file: File) { function fnModalUploadImportUpload(file: File) {
const neId = queryParams.neId; const neUid = queryParams.neUid || '-';
if (!neId) { const coreUid = queryParams.coreUid || '-';
if (!neUid || !coreUid) {
return Promise.reject('Unknown network element'); return Promise.reject('Unknown network element');
} }
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
uploadImportState.loading = true; uploadImportState.loading = true;
// 上传文件 // 上传文件
uploadFileToNE('PCF', neId, file, 3) uploadFileToNE('PCF', neUid, coreUid, file, 3)
.then(res => { .then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
return res.data; return res.data;
@@ -643,7 +661,8 @@ function fnModalUploadImportUpload(file: File) {
if (!filePath) return; if (!filePath) return;
// 文件导入 // 文件导入
return importPCFRule({ return importPCFRule({
neId: neId, neUid: neUid,
coreUid: coreUid,
fileType: 'txt', fileType: 'txt',
filePath: filePath, filePath: filePath,
}); });
@@ -706,7 +725,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} }
// 获取列表数据 // 获取列表数据
@@ -725,9 +744,9 @@ 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="6" :md="12" :xs="24">
<a-form-item label="PCF" name="neId "> <a-form-item label="PCF" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
@change="fnGetList(1)" @change="fnGetList(1)"

View File

@@ -38,6 +38,8 @@ import { message } from 'ant-design-vue';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
import dayjs, { Dayjs } from 'dayjs'; import dayjs, { Dayjs } from 'dayjs';
import { parseDateToStr } from '@/utils/date-utils'; import { parseDateToStr } from '@/utils/date-utils';
import { currentCoreUid } from '@/hooks/useCoreUid';
import { WS_GROUP_SMF_CDR } from '@/constants/ne-constants';
const { t, currentLocale } = useI18n(); const { t, currentLocale } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
const ws = new WS(); const ws = new WS();
@@ -265,9 +267,10 @@ let rangePickerPresets = ref([
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元类型 */ /**核心网标识 */
neType: 'SMF', coreUid: currentCoreUid(),
neId: '001', /**网元标识 */
neUid: undefined,
subscriberID: '', subscriberID: '',
dnn: '', dnn: '',
sortField: 'timestamp', sortField: 'timestamp',
@@ -408,6 +411,8 @@ function fnRanderChartDataLoad() {
} }
// //
fnRanderChartDataUpdate(); fnRanderChartDataUpdate();
//
fnRealTime();
} else { } else {
message.warning('No Data'); message.warning('No Data');
cdrChart.hideLoading(); cdrChart.hideLoading();
@@ -481,6 +486,8 @@ function fnRealTime() {
if (ws.state() === WebSocket.OPEN) { if (ws.state() === WebSocket.OPEN) {
ws.close(); ws.close();
} }
const neUid = queryParams.neUid;
const coreUid = queryParams.coreUid;
// //
const options: OptionsType = { const options: OptionsType = {
url: '/ws', url: '/ws',
@@ -489,7 +496,7 @@ function fnRealTime() {
* *
* CDR会话事件-SMF (GroupID:1006) * CDR会话事件-SMF (GroupID:1006)
*/ */
subGroupID: `1006_${queryParams.neId}`, subGroupID: `${WS_GROUP_SMF_CDR}_${coreUid}_${neUid}`,
}, },
onmessage: (res: Record<string, any>) => { onmessage: (res: Record<string, any>) => {
const { code, requestId, data } = res; const { code, requestId, data } = res;
@@ -503,7 +510,7 @@ function fnRealTime() {
return; return;
} }
// cdrEvent CDR // cdrEvent CDR
if (data.groupId === `1006_${queryParams.neId}`) { if (data.groupId === `${WS_GROUP_SMF_CDR}_${coreUid}_${neUid}`) {
const cdrEvent = data.data; const cdrEvent = data.data;
let cdrJSON: any = {}; let cdrJSON: any = {};
try { try {
@@ -576,7 +583,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} else { } else {
message.warning({ message.warning({
content: t('common.noData'), content: t('common.noData'),
@@ -586,7 +593,6 @@ onMounted(() => {
// //
fnRanderChart(); fnRanderChart();
fnRealTime();
}); });
onBeforeUnmount(() => { onBeforeUnmount(() => {
@@ -608,9 +614,9 @@ onBeforeUnmount(() => {
<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="6" :md="12" :xs="24">
<a-form-item label="SMF" name="neId "> <a-form-item label="SMF" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
@change="fnRealTime()" @change="fnRealTime()"
@@ -687,7 +693,11 @@ onBeforeUnmount(() => {
<!-- 图数据 --> <!-- 图数据 -->
<div ref="cdrChartDom" style="height: 600px; width: 100%"></div> <div ref="cdrChartDom" style="height: 600px; width: 100%"></div>
<a-descriptions :title="t('views.dashboard.chart.datausage')" bordered :column="2"> <a-descriptions
:title="t('views.dashboard.chart.datausage')"
bordered
:column="2"
>
<a-descriptions-item :label="t('views.dashboard.chart.totaluplink')"> <a-descriptions-item :label="t('views.dashboard.chart.totaluplink')">
{{ state.dataUsage[0] }} {{ state.dataUsage[0] }}
</a-descriptions-item> </a-descriptions-item>

View File

@@ -21,6 +21,8 @@ import PQueue from 'p-queue';
import saveAs from 'file-saver'; import saveAs from 'file-saver';
import dayjs, { type Dayjs } from 'dayjs'; import dayjs, { type Dayjs } from 'dayjs';
import { useClipboard } from '@vueuse/core'; import { useClipboard } from '@vueuse/core';
import { currentCoreUid } from '@/hooks/useCoreUid';
import { WS_GROUP_SMF_CDR } from '@/constants/ne-constants';
const { copy } = useClipboard({ legacy: true }); const { copy } = useClipboard({ legacy: true });
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
@@ -53,9 +55,10 @@ let rangePickerPresets = ref([
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元类型 */ /**核心网标识 */
neType: 'SMF', coreUid: currentCoreUid(),
neId: '001', /**网元标识 */
neUid: undefined,
subscriberID: '', subscriberID: '',
sortField: 'timestamp', sortField: 'timestamp',
sortOrder: 'desc', sortOrder: 'desc',
@@ -441,6 +444,8 @@ const realTimeData = ref<boolean>(false);
function fnRealTime() { function fnRealTime() {
realTimeData.value = !realTimeData.value; realTimeData.value = !realTimeData.value;
if (realTimeData.value) { if (realTimeData.value) {
const neUid = queryParams.neUid;
const coreUid = queryParams.coreUid;
tableState.seached = false; tableState.seached = false;
// //
const options: OptionsType = { const options: OptionsType = {
@@ -450,7 +455,7 @@ function fnRealTime() {
* *
* CDR会话事件-SMF (GroupID:1006) * CDR会话事件-SMF (GroupID:1006)
*/ */
subGroupID: `1006_${queryParams.neId}`, subGroupID: `${WS_GROUP_SMF_CDR}_${coreUid}_${neUid}`,
}, },
onmessage: wsMessage, onmessage: wsMessage,
onerror: (ev: any) => { onerror: (ev: any) => {
@@ -477,8 +482,10 @@ function wsMessage(res: Record<string, any>) {
if (!data?.groupId) { if (!data?.groupId) {
return; return;
} }
const neUid = queryParams.neUid;
const coreUid = queryParams.coreUid;
// cdrEvent CDR // cdrEvent CDR
if (data.groupId === `1006_${queryParams.neId}`) { if (data.groupId === `${WS_GROUP_SMF_CDR}_${coreUid}_${neUid}`) {
const cdrEvent = data.data; const cdrEvent = data.data;
let cdrJSON = {}; let cdrJSON = {};
try { try {
@@ -517,7 +524,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} else { } else {
message.warning({ message.warning({
content: t('common.noData'), content: t('common.noData'),
@@ -547,9 +554,9 @@ onBeforeUnmount(() => {
<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="6" :md="12" :xs="24">
<a-form-item label="SMF" name="neId "> <a-form-item label="SMF" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
@change="fnQueryReset()" @change="fnQueryReset()"

View File

@@ -10,6 +10,7 @@ import { listSMFSubList } from '@/api/neData/smf';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
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';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
/**网元参数 */ /**网元参数 */
@@ -17,8 +18,10 @@ let neOtions = ref<Record<string, any>[]>([]);
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元ID */ /**核心网标识 */
neId: undefined, coreUid: currentCoreUid(),
/**网元标识 */
neUid: undefined,
/**IMSI */ /**IMSI */
imsi: '', imsi: '',
/**msisdn */ /**msisdn */
@@ -260,7 +263,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} }
// 获取列表数据 // 获取列表数据
@@ -279,9 +282,9 @@ 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="6" :md="12" :xs="24">
<a-form-item :label="t('views.neUser.ue.neType')" name="neId "> <a-form-item label="SMF" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
/> />

View File

@@ -24,6 +24,8 @@ import PQueue from 'p-queue';
import { useClipboard } from '@vueuse/core'; import { useClipboard } from '@vueuse/core';
import { hasPermissions } from '@/plugins/auth-user'; import { hasPermissions } from '@/plugins/auth-user';
import dayjs, { type Dayjs } from 'dayjs'; import dayjs, { type Dayjs } from 'dayjs';
import { currentCoreUid } from '@/hooks/useCoreUid';
import { WS_GROUP_SMSC_CDR } from '@/constants/ne-constants';
const { copy } = useClipboard({ legacy: true }); const { copy } = useClipboard({ legacy: true });
const { getDict } = useDictStore(); const { getDict } = useDictStore();
const neStore = useNeStore(); const neStore = useNeStore();
@@ -65,9 +67,10 @@ let rangePickerPresets = ref([
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**网元类型 */ /**核心网标识 */
neType: 'SMSC', coreUid: currentCoreUid(),
neId: '001', /**网元标识 */
neUid: undefined,
recordType: '', recordType: '',
callerParty: '', callerParty: '',
calledParty: '', calledParty: '',
@@ -408,6 +411,8 @@ const realTimeData = ref<boolean>(false);
function fnRealTime() { function fnRealTime() {
realTimeData.value = !realTimeData.value; realTimeData.value = !realTimeData.value;
if (realTimeData.value) { if (realTimeData.value) {
const neUid = queryParams.neUid;
const coreUid = queryParams.coreUid;
tableState.seached = false; tableState.seached = false;
// //
const options: OptionsType = { const options: OptionsType = {
@@ -417,7 +422,7 @@ function fnRealTime() {
* *
* SMSC_CDR会话事件(GroupID:1007_neId) * SMSC_CDR会话事件(GroupID:1007_neId)
*/ */
subGroupID: `1007_${queryParams.neId}`, subGroupID: `${WS_GROUP_SMSC_CDR}_${coreUid}_${neUid}`,
}, },
onmessage: wsMessage, onmessage: wsMessage,
onerror: (ev: any) => { onerror: (ev: any) => {
@@ -444,8 +449,10 @@ function wsMessage(res: Record<string, any>) {
if (!data?.groupId) { if (!data?.groupId) {
return; return;
} }
const neUid = queryParams.neUid;
const coreUid = queryParams.coreUid;
// cdrEvent CDR // cdrEvent CDR
if (data.groupId === `1007_${queryParams.neId}`) { if (data.groupId === `${WS_GROUP_SMSC_CDR}_${coreUid}_${neUid}`) {
const cdrEvent = data.data; const cdrEvent = data.data;
let cdrJSON = {}; let cdrJSON = {};
try { try {
@@ -491,7 +498,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} else { } else {
message.warning({ message.warning({
content: t('common.noData'), content: t('common.noData'),
@@ -521,9 +528,9 @@ onBeforeUnmount(() => {
<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="6" :md="12" :xs="24">
<a-form-item label="SMSC" name="neId "> <a-form-item label="SMSC" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
@change="fnQueryReset()" @change="fnQueryReset()"

View File

@@ -15,8 +15,6 @@ import { saveAs } from 'file-saver';
import { import {
addUDMAuth, addUDMAuth,
updateUDMAuth, updateUDMAuth,
batchAddUDMAuth,
batchDelUDMAuth,
delUDMAuth, delUDMAuth,
getUDMAuth, getUDMAuth,
exportUDMAuth, exportUDMAuth,
@@ -26,15 +24,19 @@ import {
} from '@/api/neData/udm_auth'; } from '@/api/neData/udm_auth';
import { uploadFile } from '@/api/tool/file'; import { uploadFile } from '@/api/tool/file';
import { getNeViewFile } from '@/api/tool/neFile'; import { getNeViewFile } from '@/api/tool/neFile';
import { currentCoreUid } from '@/hooks/useCoreUid';
import { parseDateToStr } from '@/utils/date-utils';
const { t } = useI18n(); const { t } = useI18n();
const neListStore = useNeStore(); const neStore = useNeStore();
/**网元参数 */ /**网元参数 */
let neOtions = ref<Record<string, any>[]>([]); let neOtions = ref<Record<string, any>[]>([]);
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**核心网标识 */
coreUid: currentCoreUid(),
/**网元ID */ /**网元ID */
neId: undefined, neUid: undefined,
/**移动编号 */ /**移动编号 */
imsi: '', imsi: '',
/**排序字段 */ /**排序字段 */
@@ -89,33 +91,43 @@ let tableColumns = ref<ColumnsType>([
{ {
title: 'IMSI', title: 'IMSI',
dataIndex: 'imsi', dataIndex: 'imsi',
align: 'center', align: 'left',
sorter: true, sorter: true,
width: 150, width: 150,
}, },
{ {
title: 'AMF', title: 'AMF',
dataIndex: 'amf', dataIndex: 'amf',
align: 'center', align: 'left',
width: 80, width: 80,
}, },
// { // {
// title: 'KI', // title: 'KI',
// dataIndex: 'ki', // dataIndex: 'ki',
// align: 'center', // align: 'left',
// width: 10, // width: 10,
// }, // },
// { // {
// title: 'OPC', // title: 'OPC',
// dataIndex: 'opc', // dataIndex: 'opc',
// align: 'center', // align: 'left',
// width: 10, // width: 10,
// }, // },
{ {
title: 'Algo Index', title: 'Algo Index',
dataIndex: 'algoIndex', dataIndex: 'algoIndex',
align: 'center', align: 'left',
width: 100, width: 100,
},
{
title: 'Create Time',
dataIndex: 'createTime',
align: 'left',
width: 250,
customRender(opt) {
if (!opt.value) return '';
return parseDateToStr(+opt.value);
},
}, },
{ {
title: t('common.operate'), title: t('common.operate'),
@@ -205,7 +217,10 @@ let modalState: ModalStateType = reactive({
title: 'UDM鉴权用户', title: 'UDM鉴权用户',
from: { from: {
num: 1, num: 1,
id: '', id: undefined,
coreUid: '',
neUid: '',
neType: 'UDM',
imsi: '', imsi: '',
amf: '8000', amf: '8000',
ki: '', ki: '',
@@ -232,12 +247,12 @@ const modalStateFrom = Form.useForm(
], ],
imsi: [ imsi: [
{ required: true, message: 'IMSI' + t('common.unableNull') }, { required: true, message: 'IMSI' + t('common.unableNull') },
{ min: 15, max: 15, message: t('views.neUser.auth.imsiConfirm') }, { min: 15, message: t('views.neUser.auth.imsiConfirm') },
], ],
amf: [{ required: true, message: 'AMF' + t('common.unableNull') }], amf: [{ required: true, message: 'AMF' + t('common.unableNull') }],
ki: [ ki: [
{ required: true, message: 'KI' + t('common.unableNull') }, { required: true, message: 'KI' + t('common.unableNull') },
{ min: 32, max: 32, message: t('views.neUser.auth.kiTip') }, { min: 32, message: t('views.neUser.auth.kiTip') },
], ],
algoIndex: [ algoIndex: [
{ required: true, message: 'algoIndex' + t('common.unableNull') }, { required: true, message: 'algoIndex' + t('common.unableNull') },
@@ -272,8 +287,11 @@ function fnModalVisibleByEdit(row?: Record<string, any>) {
if (modalState.confirmLoading) return; if (modalState.confirmLoading) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
modalState.confirmLoading = true; modalState.confirmLoading = true;
const neId = queryParams.neId || '-'; getUDMAuth({
getUDMAuth(neId, row.imsi) coreUid: row.coreUid,
neUid: row.neUid,
imsi: row.imsi,
})
.then(res => { .then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
modalState.from = Object.assign(modalState.from, res.data); modalState.from = Object.assign(modalState.from, res.data);
@@ -313,12 +331,10 @@ function fnModalOk() {
modalState.confirmLoading = true; modalState.confirmLoading = true;
const from = toRaw(modalState.from); const from = toRaw(modalState.from);
from.algoIndex = `${from.algoIndex}`; from.algoIndex = `${from.algoIndex}`;
from.neId = queryParams.neId || '-'; from.coreUid = queryParams.coreUid || '-';
const result = from.id from.neUid = queryParams.neUid || '-';
? updateUDMAuth(from) from.neType = 'UDM';
: from.num === 1 const result = from.id ? updateUDMAuth(from) : addUDMAuth(from);
? addUDMAuth(from)
: batchAddUDMAuth(from, from.num);
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
result result
.then(res => { .then(res => {
@@ -382,30 +398,33 @@ function fnBatchDelModalOk() {
.then(e => { .then(e => {
modalState.confirmLoading = true; modalState.confirmLoading = true;
const from = toRaw(modalState.BatchDelForm); const from = toRaw(modalState.BatchDelForm);
const neId = queryParams.neId || '-'; const neUid = queryParams.neUid || '-';
batchDelUDMAuth(neId, from.imsi, from.num).then(res => { const coreUid = queryParams.coreUid || '-';
if (res.code === RESULT_CODE_SUCCESS) { delUDMAuth({ coreUid, neUid, imsi: from.imsi, num: from.num }).then(
const timerS = Math.ceil(+from.num / 800) + 1; res => {
notification.success({ if (res.code === RESULT_CODE_SUCCESS) {
message: modalState.title, const timerS = Math.ceil(+from.num / 800) + 1;
description: t('common.operateOk'), notification.success({
duration: timerS, message: modalState.title,
}); description: t('common.operateOk'),
setTimeout(() => { duration: timerS,
modalState.openByBatchDel = false; });
setTimeout(() => {
modalState.openByBatchDel = false;
modalState.confirmLoading = false;
modalStateBatchDelFrom.resetFields();
fnGetList(1);
}, timerS * 1000);
} else {
modalState.confirmLoading = false; modalState.confirmLoading = false;
modalStateBatchDelFrom.resetFields(); notification.error({
fnGetList(1); message: modalState.title,
}, timerS * 1000); description: res.msg,
} else { duration: 3,
modalState.confirmLoading = false; });
notification.error({ }
message: modalState.title,
description: res.msg,
duration: 3,
});
} }
}); );
}) })
.catch(e => { .catch(e => {
message.error(t('common.errorFields', { num: e.errorFields.length }), 3); message.error(t('common.errorFields', { num: e.errorFields.length }), 3);
@@ -435,8 +454,9 @@ function fnModalCancel() {
* @param imsi 编号imsi * @param imsi 编号imsi
*/ */
function fnRecordDelete(imsi: string) { function fnRecordDelete(imsi: string) {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) return;
let imsiMsg = imsi; let imsiMsg = imsi;
if (imsi === '0') { if (imsi === '0') {
imsiMsg = `${tableState.selectedRowKeys[0]}... ${t( imsiMsg = `${tableState.selectedRowKeys[0]}... ${t(
@@ -451,7 +471,7 @@ function fnRecordDelete(imsi: string) {
onOk() { onOk() {
modalState.loadDataLoading = true; modalState.loadDataLoading = true;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
delUDMAuth(neId, imsi) delUDMAuth({ coreUid, neUid, imsi, num: 0 })
.then(res => { .then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
const msgContent = t('common.msgSuccess', { const msgContent = t('common.msgSuccess', {
@@ -483,10 +503,11 @@ function fnRecordDelete(imsi: string) {
function fnRecordExport(type: string = 'txt') { function fnRecordExport(type: string = 'txt') {
const selectLen = tableState.selectedRowKeys.length; const selectLen = tableState.selectedRowKeys.length;
if (selectLen <= 0) return; if (selectLen <= 0) return;
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
exportUDMAuth({ type: type, neId: neId, imsis: tableState.selectedRowKeys }) exportUDMAuth({ type, coreUid, neUid, imsis: tableState.selectedRowKeys })
.then(res => { .then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
message.success(t('common.msgSuccess', { msg: t('common.export') }), 3); message.success(t('common.msgSuccess', { msg: t('common.export') }), 3);
@@ -502,8 +523,9 @@ function fnRecordExport(type: string = 'txt') {
/**列表导出全部数据 */ /**列表导出全部数据 */
function fnExportList(type: string) { function fnExportList(type: string) {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
exportUDMAuth(Object.assign({ type: type }, queryParams)) exportUDMAuth(Object.assign({ type: type }, queryParams))
.then(res => { .then(res => {
@@ -521,13 +543,14 @@ function fnExportList(type: string) {
/**重新加载数据 */ /**重新加载数据 */
function fnLoadData() { function fnLoadData() {
const neId = queryParams.neId; const coreUid = queryParams.coreUid;
if (tableState.loading || !neId) return; const neUid = queryParams.neUid;
if (tableState.loading || !neUid || !coreUid) return;
modalState.loadDataLoading = true; modalState.loadDataLoading = true;
tablePagination.total = 0; tablePagination.total = 0;
tableState.data = []; tableState.data = [];
tableState.loading = true; // 表格loading tableState.loading = true; // 表格loading
resetUDMAuth(neId).then(res => { resetUDMAuth(coreUid, neUid).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
const num = res.data; const num = res.data;
const timerS = Math.ceil(+num / 800) + 3; const timerS = Math.ceil(+num / 800) + 3;
@@ -627,12 +650,12 @@ function fnModalUploadImportTypeChange() {
/**对话框表格信息导入失败原因 */ /**对话框表格信息导入失败原因 */
function fnModalUploadImportFailReason() { function fnModalUploadImportFailReason() {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; if (!neUid) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
getNeViewFile({ getNeViewFile({
neType: 'UDM', neType: 'UDM',
neId: neId, neUid: neUid,
path: '/tmp', path: '/tmp',
fileName: 'import_authdata_err_records.txt', fileName: 'import_authdata_err_records.txt',
}) })
@@ -670,8 +693,9 @@ function fnModalUploadImportClose() {
/**对话框表格信息导入上传 */ /**对话框表格信息导入上传 */
function fnModalUploadImportUpload(file: File) { function fnModalUploadImportUpload(file: File) {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) { const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) {
return Promise.reject('Unknown network element'); return Promise.reject('Unknown network element');
} }
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
@@ -694,7 +718,8 @@ function fnModalUploadImportUpload(file: File) {
if (!filePath) return; if (!filePath) return;
// 文件导入 // 文件导入
return importUDMAuth({ return importUDMAuth({
neId: neId, coreUid: coreUid,
neUid: neUid,
uploadPath: filePath, uploadPath: filePath,
...uploadImportState.from, ...uploadImportState.from,
}); });
@@ -739,7 +764,7 @@ function fnModalDownloadImportTemplate() {
onMounted(() => { onMounted(() => {
// 获取网元网元列表 // 获取网元网元列表
neListStore.neCascaderOptions.forEach(item => { neStore.neCascaderOptions.forEach(item => {
if (item.value === 'UDM') { if (item.value === 'UDM') {
neOtions.value = JSON.parse(JSON.stringify(item.children)); neOtions.value = JSON.parse(JSON.stringify(item.children));
} }
@@ -752,7 +777,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} }
// 获取列表数据 // 获取列表数据
@@ -771,9 +796,9 @@ 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="6" :md="12" :xs="24">
<a-form-item label="UDM" name="neId "> <a-form-item label="UDM" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
:disabled="modalState.loadDataLoading" :disabled="modalState.loadDataLoading"
@@ -865,6 +890,7 @@ onMounted(() => {
ok-text="TXT" ok-text="TXT"
ok-type="default" ok-type="default"
@confirm="fnExportList('txt')" @confirm="fnExportList('txt')"
v-if="false"
> >
<a-button type="dashed"> <a-button type="dashed">
<template #icon><ExportOutlined /></template> <template #icon><ExportOutlined /></template>
@@ -890,6 +916,7 @@ onMounted(() => {
ok-type="default" ok-type="default"
@confirm="fnRecordExport('txt')" @confirm="fnRecordExport('txt')"
:disabled="tableState.selectedRowKeys.length <= 0" :disabled="tableState.selectedRowKeys.length <= 0"
v-if="false"
> >
<a-button <a-button
type="default" type="default"

View File

@@ -14,8 +14,6 @@ import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import saveAs from 'file-saver'; import saveAs from 'file-saver';
import { import {
addUDMSub, addUDMSub,
batchAddUDMSub,
batchDelUDMSub,
delUDMSub, delUDMSub,
exportUDMSub, exportUDMSub,
getUDMSub, getUDMSub,
@@ -26,6 +24,7 @@ import {
} from '@/api/neData/udm_sub'; } from '@/api/neData/udm_sub';
import { uploadFile } from '@/api/tool/file'; import { uploadFile } from '@/api/tool/file';
import { getNeViewFile } from '@/api/tool/neFile'; import { getNeViewFile } from '@/api/tool/neFile';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
/**网元参数 */ /**网元参数 */
@@ -33,8 +32,10 @@ let neOtions = ref<Record<string, any>[]>([]);
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**核心网标识 */
coreUid: currentCoreUid(),
/**网元ID */ /**网元ID */
neId: undefined, neUid: undefined,
/**移动编号 */ /**移动编号 */
imsi: '', imsi: '',
/**移动号 */ /**移动号 */
@@ -92,7 +93,7 @@ let tableColumns = ref<ColumnsType>([
{ {
title: 'IMSI', title: 'IMSI',
dataIndex: 'imsi', dataIndex: 'imsi',
align: 'center', align: 'left',
fixed: 'left', fixed: 'left',
sorter: true, sorter: true,
resizable: true, resizable: true,
@@ -103,7 +104,7 @@ let tableColumns = ref<ColumnsType>([
{ {
title: 'MSISDN', title: 'MSISDN',
dataIndex: 'msisdn', dataIndex: 'msisdn',
align: 'center', align: 'left',
fixed: 'left', fixed: 'left',
sorter: true, sorter: true,
width: 150, width: 150,
@@ -111,39 +112,39 @@ let tableColumns = ref<ColumnsType>([
{ {
title: 'Subscribed AMBR', title: 'Subscribed AMBR',
dataIndex: 'ambr', dataIndex: 'ambr',
align: 'center', align: 'left',
width: 100, width: 100,
}, },
{ {
title: 'Subscribed SNSSAIs', title: 'Subscribed SNSSAIs',
dataIndex: 'nssai', dataIndex: 'nssai',
align: 'center', align: 'left',
width: 100, width: 100,
}, },
{ {
title: 'Forbidden Areas', title: 'Forbidden Areas',
dataIndex: 'arfb', dataIndex: 'arfb',
align: 'center', align: 'left',
width: 100, width: 100,
}, },
{ {
title: 'Service Area Restrict', title: 'Service Area Restrict',
dataIndex: 'sar', dataIndex: 'sar',
align: 'center', align: 'left',
width: 100, width: 100,
}, },
{ {
title: '5G', title: '5G',
dataIndex: 'cn', dataIndex: 'cn',
key: 'cnFlag', key: 'cnFlag',
align: 'center', align: 'left',
width: 100, width: 100,
}, },
{ {
title: '4G', title: '4G',
dataIndex: 'epsFlag', dataIndex: 'epsFlag',
key: 'epsFlag', key: 'epsFlag',
align: 'center', align: 'left',
width: 100, width: 100,
}, },
{ {
@@ -386,8 +387,8 @@ function fnModalVisibleByBatch() {
* 对话框弹出显示为 新增或者修改 * 对话框弹出显示为 新增或者修改
* @param noticeId 网元id, 不传为新增 * @param noticeId 网元id, 不传为新增
*/ */
function fnModalVisibleByEdit(imsi?: string) { function fnModalVisibleByEdit(row?: Record<string, any>) {
if (!imsi) { if (!row) {
modalStateFrom.resetFields(); modalStateFrom.resetFields();
modalState.title = t('common.addText') + t('views.neUser.sub.subInfo'); modalState.title = t('common.addText') + t('views.neUser.sub.subInfo');
modalState.openByEdit = true; modalState.openByEdit = true;
@@ -395,8 +396,11 @@ function fnModalVisibleByEdit(imsi?: string) {
if (modalState.confirmLoading) return; if (modalState.confirmLoading) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
modalState.confirmLoading = true; modalState.confirmLoading = true;
const neId = queryParams.neId || '-'; getUDMSub({
getUDMSub(neId, imsi) coreUid: row.coreUid,
neUid: row.neUid,
imsi: row.imsi,
})
.then(res => { .then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
transformFormData(res.data.smData); transformFormData(res.data.smData);
@@ -645,12 +649,10 @@ function fnModalOk() {
from.rfspIndex = `${from.rfspIndex}`; from.rfspIndex = `${from.rfspIndex}`;
from.regTimer = `${from.regTimer}`; from.regTimer = `${from.regTimer}`;
from.ueUsageType = `${from.ueUsageType}`; from.ueUsageType = `${from.ueUsageType}`;
from.neId = queryParams.neId || '-'; from.coreUid = queryParams.coreUid || '-';
const result = from.id from.neUid = queryParams.neUid || '-';
? updateUDMSub(from) from.neType = 'UDM';
: from.num === 1 const result = from.id ? updateUDMSub(from) : addUDMSub(from);
? addUDMSub(from)
: batchAddUDMSub(from, from.num);
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
result result
.then(res => { .then(res => {
@@ -660,7 +662,7 @@ function fnModalOk() {
content: t('common.msgSuccess', { msg: modalState.title }), content: t('common.msgSuccess', { msg: modalState.title }),
duration: 3, duration: 3,
}); });
fnGetList(1); fnGetList();
} else { } else {
const timerS = Math.ceil(+from.num / 800) + 1; const timerS = Math.ceil(+from.num / 800) + 1;
notification.success({ notification.success({
@@ -722,30 +724,33 @@ function fnBatchDelModalOk() {
.then(e => { .then(e => {
modalState.confirmLoading = true; modalState.confirmLoading = true;
const from = toRaw(modalState.BatchDelForm); const from = toRaw(modalState.BatchDelForm);
const neId = queryParams.neId || '-'; const neUid = queryParams.neUid || '-';
batchDelUDMSub(neId, from.imsi, from.num).then(res => { const coreUid = queryParams.coreUid || '-';
if (res.code === RESULT_CODE_SUCCESS) { delUDMSub({ coreUid, neUid, imsi: from.imsi, num: from.num }).then(
const timerS = Math.ceil(+from.num / 800) + 1; res => {
notification.success({ if (res.code === RESULT_CODE_SUCCESS) {
message: modalState.title, const timerS = Math.ceil(+from.num / 800) + 1;
description: t('common.operateOk'), notification.success({
duration: timerS, message: modalState.title,
}); description: t('common.operateOk'),
setTimeout(() => { duration: timerS,
modalState.openByBatchDel = false; });
setTimeout(() => {
modalState.openByBatchDel = false;
modalState.confirmLoading = false;
modalStateBatchDelFrom.resetFields();
fnGetList();
}, timerS * 1000);
} else {
modalState.confirmLoading = false; modalState.confirmLoading = false;
modalStateBatchDelFrom.resetFields(); notification.error({
fnGetList(1); message: modalState.title,
}, timerS * 1000); description: res.msg,
} else { duration: 3,
modalState.confirmLoading = false; });
notification.error({ }
message: modalState.title,
description: res.msg,
duration: 3,
});
} }
}); );
}) })
.catch(e => { .catch(e => {
message.error(t('common.errorFields', { num: e.errorFields.length }), 3); message.error(t('common.errorFields', { num: e.errorFields.length }), 3);
@@ -799,8 +804,9 @@ function fnBatchDelModalCancel() {
* @param imsi 编号imsi * @param imsi 编号imsi
*/ */
function fnRecordDelete(imsi: string) { function fnRecordDelete(imsi: string) {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) return;
let imsiMsg = imsi; let imsiMsg = imsi;
if (imsi === '0') { if (imsi === '0') {
imsiMsg = `${tableState.selectedRowKeys[0]}... ${t( imsiMsg = `${tableState.selectedRowKeys[0]}... ${t(
@@ -815,7 +821,7 @@ function fnRecordDelete(imsi: string) {
onOk() { onOk() {
modalState.loadDataLoading = true; modalState.loadDataLoading = true;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
delUDMSub(neId, imsi) delUDMSub({ coreUid, neUid, imsi, num: 0 })
.then(res => { .then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
const msgContent = t('common.msgSuccess', { const msgContent = t('common.msgSuccess', {
@@ -847,10 +853,11 @@ function fnRecordDelete(imsi: string) {
function fnRecordExport(type: string = 'txt') { function fnRecordExport(type: string = 'txt') {
const selectLen = tableState.selectedRowKeys.length; const selectLen = tableState.selectedRowKeys.length;
if (selectLen <= 0) return; if (selectLen <= 0) return;
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
exportUDMSub({ type: type, neId: neId, imsis: tableState.selectedRowKeys }) exportUDMSub({ type, coreUid, neUid, imsis: tableState.selectedRowKeys })
.then(res => { .then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
message.success({ message.success({
@@ -872,8 +879,9 @@ function fnRecordExport(type: string = 'txt') {
/**列表导出 */ /**列表导出 */
function fnExportList(type: string) { function fnExportList(type: string) {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
exportUDMSub(Object.assign({ type: type }, queryParams)) exportUDMSub(Object.assign({ type: type }, queryParams))
.then(res => { .then(res => {
@@ -897,13 +905,14 @@ function fnExportList(type: string) {
/**重新加载数据 */ /**重新加载数据 */
function fnLoadData() { function fnLoadData() {
const neId = queryParams.neId; const coreUid = queryParams.coreUid;
if (tableState.loading || !neId) return; const neUid = queryParams.neUid;
if (tableState.loading || !neUid || !coreUid) return;
modalState.loadDataLoading = true; modalState.loadDataLoading = true;
tablePagination.total = 0; tablePagination.total = 0;
tableState.data = []; tableState.data = [];
tableState.loading = true; // 表格loading tableState.loading = true; // 表格loading
resetUDMSub(neId).then(res => { resetUDMSub(coreUid, neUid).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
const num = res.data; const num = res.data;
const timerS = Math.ceil(+num / 800) + 3; const timerS = Math.ceil(+num / 800) + 3;
@@ -986,12 +995,12 @@ let uploadImportState: ModalUploadImportStateType = reactive({
/**对话框表格信息导入失败原因 */ /**对话框表格信息导入失败原因 */
function fnModalUploadImportFailReason() { function fnModalUploadImportFailReason() {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; if (!neUid) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
getNeViewFile({ getNeViewFile({
neType: 'UDM', neType: 'UDM',
neId: neId, neUid: neUid,
path: '/tmp', path: '/tmp',
fileName: 'import_udmuser_err_records.txt', fileName: 'import_udmuser_err_records.txt',
}) })
@@ -1027,8 +1036,9 @@ function fnModalUploadImportClose() {
/**对话框表格信息导入上传 */ /**对话框表格信息导入上传 */
function fnModalUploadImportUpload(file: File) { function fnModalUploadImportUpload(file: File) {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) { const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) {
return Promise.reject('Unknown network element'); return Promise.reject('Unknown network element');
} }
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
@@ -1051,7 +1061,8 @@ function fnModalUploadImportUpload(file: File) {
if (!filePath) return; if (!filePath) return;
// 文件导入 // 文件导入
return importUDMSub({ return importUDMSub({
neId: neId, coreUid: coreUid,
neUid: neUid,
uploadPath: filePath, uploadPath: filePath,
}); });
}) })
@@ -1143,7 +1154,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} }
// 获取列表数据 // 获取列表数据
@@ -1162,9 +1173,9 @@ 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="6" :md="12" :xs="24">
<a-form-item label="UDM" name="neId "> <a-form-item label="UDM" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
:disabled="modalState.loadDataLoading" :disabled="modalState.loadDataLoading"
@@ -1407,7 +1418,7 @@ onMounted(() => {
<template #title>{{ t('common.editText') }}</template> <template #title>{{ t('common.editText') }}</template>
<a-button <a-button
type="link" type="link"
@click.prevent="fnModalVisibleByEdit(record.imsi)" @click.prevent="fnModalVisibleByEdit(record)"
> >
<template #icon> <template #icon>
<FormOutlined /> <FormOutlined />

View File

@@ -13,14 +13,12 @@ import { SizeType } from 'ant-design-vue/es/config-provider';
import { MenuInfo } from 'ant-design-vue/es/menu/src/interface'; import { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
import UploadModal from '@/components/UploadModal/index.vue'; import UploadModal from '@/components/UploadModal/index.vue';
import { import {
addUDMVOIP, addUDMVoIP,
batchAddUDMVOIP, delUDMVoIP,
batchDelUDMVOIP, exportUDMVoIP,
delUDMVOIP, importUDMVoIP,
exportUDMVOIP, listUDMVoIP,
importUDMVOIP, resetUDMVoIP,
listUDMVOIP,
resetUDMVOIP,
} from '@/api/neData/udm_voip'; } from '@/api/neData/udm_voip';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
@@ -28,6 +26,7 @@ import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import { saveAs } from 'file-saver'; import { saveAs } from 'file-saver';
import { uploadFile } from '@/api/tool/file'; import { uploadFile } from '@/api/tool/file';
import { getNeViewFile } from '@/api/tool/neFile'; import { getNeViewFile } from '@/api/tool/neFile';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
/**网元参数 */ /**网元参数 */
@@ -35,8 +34,10 @@ let neOtions = ref<Record<string, any>[]>([]);
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**核心网标识 */
coreUid: currentCoreUid(),
/**网元ID */ /**网元ID */
neId: undefined, neUid: undefined,
/**用户名 */ /**用户名 */
username: '', username: '',
/**排序字段 */ /**排序字段 */
@@ -85,7 +86,7 @@ let tableState: TabeStateType = reactive({
/**表格字段列 */ /**表格字段列 */
let tableColumns = ref<TableColumnsType>([ let tableColumns = ref<TableColumnsType>([
{ {
title: t('views.neData.udmVOIP.username'), title: t('views.neData.udmVoIP.username'),
dataIndex: 'username', dataIndex: 'username',
sorter: true, sorter: true,
align: 'left', align: 'left',
@@ -175,7 +176,7 @@ type ModalStateType = {
/**对话框对象信息状态 */ /**对话框对象信息状态 */
let modalState: ModalStateType = reactive({ let modalState: ModalStateType = reactive({
openByEdit: false, openByEdit: false,
title: 'UDMVOIP', title: 'UDMVoIP',
from: { from: {
num: 1, num: 1,
username: undefined, username: undefined,
@@ -198,10 +199,10 @@ const modalStateFrom = Form.useForm(
}, },
], ],
username: [ username: [
{ required: true, message: t('views.neData.udmVOIP.usernamePlease') }, { required: true, message: t('views.neData.udmVoIP.usernamePlease') },
], ],
password: [ password: [
{ required: true, message: t('views.neData.udmVOIP.passwordPlease') }, { required: true, message: t('views.neData.udmVoIP.passwordPlease') },
], ],
}) })
); );
@@ -214,7 +215,7 @@ function fnModalVisibleByEdit(row?: Record<string, any>) {
modalState.isBatch = false; modalState.isBatch = false;
if (!row) { if (!row) {
modalStateFrom.resetFields(); //重置表单 modalStateFrom.resetFields(); //重置表单
modalState.title = t('views.neData.udmVOIP.addTitle'); modalState.title = t('views.neData.udmVoIP.addTitle');
modalState.openByEdit = true; modalState.openByEdit = true;
modalState.type = 'add'; modalState.type = 'add';
} }
@@ -226,7 +227,9 @@ function fnModalVisibleByEdit(row?: Record<string, any>) {
*/ */
function fnModalOk() { function fnModalOk() {
const from = JSON.parse(JSON.stringify(modalState.from)); const from = JSON.parse(JSON.stringify(modalState.from));
from.neId = queryParams.neId || '-'; from.coreUid = queryParams.coreUid || '-';
from.neUid = queryParams.neUid || '-';
from.neType = 'UDM';
from.username = `${from.username}`; from.username = `${from.username}`;
// 校验规则 // 校验规则
@@ -247,21 +250,14 @@ function fnModalOk() {
let result: any = null; let result: any = null;
if (modalState.isBatch) { if (modalState.isBatch) {
if (modalState.type === 'add') { if (modalState.type === 'add') {
result = batchAddUDMVOIP( result = addUDMVoIP(from);
from.neId,
{ username: from.username, password: from.password },
from.num
);
} }
if (modalState.type === 'delete') { if (modalState.type === 'delete') {
result = batchDelUDMVOIP(from.neId, from.username, from.num); result = delUDMVoIP(from);
} }
} else { } else {
if (modalState.type === 'add') { if (modalState.type === 'add') {
result = addUDMVOIP(from.neId, { result = addUDMVoIP(from);
username: from.username,
password: from.password,
});
} }
} }
@@ -326,8 +322,9 @@ function fnModalVisibleByBatch(type: 'delete' | 'add') {
* @param username 网元编号ID * @param username 网元编号ID
*/ */
function fnRecordDelete(username: string) { function fnRecordDelete(username: string) {
const neID = queryParams.neId; const neUid = queryParams.neUid;
if (!neID) return; const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) return;
let msg = username; let msg = username;
if (username === '0') { if (username === '0') {
msg = `${tableState.selectedRowKeys[0]}... ${tableState.selectedRowKeys.length}`; msg = `${tableState.selectedRowKeys[0]}... ${tableState.selectedRowKeys.length}`;
@@ -336,10 +333,10 @@ function fnRecordDelete(username: string) {
Modal.confirm({ Modal.confirm({
title: t('common.tipTitle'), title: t('common.tipTitle'),
content: t('views.neData.udmVOIP.delTip', { num: msg }), content: t('views.neData.udmVoIP.delTip', { num: msg }),
onOk() { onOk() {
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
delUDMVOIP(neID, username) delUDMVoIP({ coreUid, neUid, username, num: 0 })
.then(res => { .then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
message.success(t('common.operateOk'), 3); message.success(t('common.operateOk'), 3);
@@ -360,17 +357,18 @@ function fnRecordDelete(username: string) {
/**列表导出 */ /**列表导出 */
function fnExportList(type: string) { function fnExportList(type: string) {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
exportUDMVOIP(Object.assign({ type: type }, queryParams)) exportUDMVoIP(Object.assign({ type: type }, queryParams))
.then(res => { .then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
message.success({ message.success({
content: t('common.operateOk'), content: t('common.operateOk'),
duration: 2, duration: 2,
}); });
saveAs(res.data, `UDM_VOIP_${neId}_${Date.now()}.${type}`); saveAs(res.data, `UDM_VoIP_${Date.now()}.${type}`);
} else { } else {
message.error({ message.error({
content: `${res.msg}`, content: `${res.msg}`,
@@ -391,7 +389,7 @@ function fnGetList(pageNum?: number) {
queryParams.pageNum = pageNum; queryParams.pageNum = pageNum;
tablePagination.current = pageNum; tablePagination.current = pageNum;
} }
listUDMVOIP(toRaw(queryParams)).then(res => { listUDMVoIP(toRaw(queryParams)).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
// 取消勾选 // 取消勾选
if (tableState.selectedRowKeys.length > 0) { if (tableState.selectedRowKeys.length > 0) {
@@ -409,13 +407,14 @@ function fnGetList(pageNum?: number) {
/**重新加载数据 */ /**重新加载数据 */
function fnLoadData() { function fnLoadData() {
const neId = queryParams.neId; const coreUid = queryParams.coreUid;
if (tableState.loading || !neId) return; const neUid = queryParams.neUid;
if (tableState.loading || !neUid || !coreUid) return;
modalState.loadDataLoading = true; modalState.loadDataLoading = true;
tablePagination.total = 0; tablePagination.total = 0;
tableState.data = []; tableState.data = [];
tableState.loading = true; // 表格loading tableState.loading = true; // 表格loading
resetUDMVOIP(neId).then(res => { resetUDMVoIP(coreUid, neUid).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
const num = res.data; const num = res.data;
const timerS = Math.ceil(+num / 800) + 3; const timerS = Math.ceil(+num / 800) + 3;
@@ -484,8 +483,9 @@ function fnModalUploadImportClose() {
/**对话框表格信息导入上传 */ /**对话框表格信息导入上传 */
function fnModalUploadImportUpload(file: File) { function fnModalUploadImportUpload(file: File) {
const neID = queryParams.neId; const neUid = queryParams.neUid;
if (!neID) { const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) {
return Promise.reject('Unknown network element'); return Promise.reject('Unknown network element');
} }
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
@@ -507,8 +507,9 @@ function fnModalUploadImportUpload(file: File) {
.then((filePath: string) => { .then((filePath: string) => {
if (!filePath) return; if (!filePath) return;
// 文件导入 // 文件导入
return importUDMVOIP({ return importUDMVoIP({
neId: neID, coreUid: coreUid,
neUid: neUid,
uploadPath: filePath, uploadPath: filePath,
}); });
}) })
@@ -532,12 +533,12 @@ function fnModalUploadImportUpload(file: File) {
/**对话框表格信息导入失败原因 */ /**对话框表格信息导入失败原因 */
function fnModalUploadImportFailReason() { function fnModalUploadImportFailReason() {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; if (!neUid) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
getNeViewFile({ getNeViewFile({
neType: 'UDM', neType: 'UDM',
neId: neId, neUid: neUid,
path: '/tmp', path: '/tmp',
fileName: 'import_imsuser_err_records.txt', fileName: 'import_imsuser_err_records.txt',
}) })
@@ -592,7 +593,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} }
// 获取列表数据 // 获取列表数据
@@ -611,9 +612,9 @@ 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="6" :md="12" :xs="24">
<a-form-item label="UDM" name="neId "> <a-form-item label="UDM" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
:disabled="modalState.loadDataLoading" :disabled="modalState.loadDataLoading"
@@ -623,7 +624,7 @@ onMounted(() => {
</a-col> </a-col>
<a-col :lg="6" :md="12" :xs="24"> <a-col :lg="6" :md="12" :xs="24">
<a-form-item <a-form-item
:label="t('views.neData.udmVOIP.username')" :label="t('views.neData.udmVoIP.username')"
name="username" name="username"
> >
<a-input <a-input
@@ -721,7 +722,7 @@ onMounted(() => {
</a-button> </a-button>
<a-popconfirm <a-popconfirm
placement="topRight" placement="topRight"
:title="t('views.neData.udmVOIP.exportTip')" :title="t('views.neData.udmVoIP.exportTip')"
ok-text="TXT" ok-text="TXT"
ok-type="default" ok-type="default"
@confirm="fnExportList('txt')" @confirm="fnExportList('txt')"
@@ -753,7 +754,7 @@ onMounted(() => {
/> />
</a-tooltip> </a-tooltip>
<TableColumnsDnd <TableColumnsDnd
cache-id="udmVOIPData" cache-id="udmVoIPData"
:columns="tableColumns" :columns="tableColumns"
v-model:columns-dnd="tableColumnsDnd" v-model:columns-dnd="tableColumnsDnd"
></TableColumnsDnd> ></TableColumnsDnd>
@@ -865,8 +866,8 @@ onMounted(() => {
<a-form-item <a-form-item
:label=" :label="
modalState.isBatch modalState.isBatch
? t('views.neData.udmVOIP.startUsername') ? t('views.neData.udmVoIP.startUsername')
: t('views.neData.udmVOIP.username') : t('views.neData.udmVoIP.username')
" "
name="username" name="username"
v-bind="modalStateFrom.validateInfos.username" v-bind="modalStateFrom.validateInfos.username"
@@ -876,7 +877,7 @@ onMounted(() => {
style="width: 100%" style="width: 100%"
:min="4" :min="4"
:maxlength="16" :maxlength="16"
:placeholder="t('views.neData.udmVOIP.username')" :placeholder="t('views.neData.udmVoIP.username')"
> >
</a-input-number> </a-input-number>
</a-form-item> </a-form-item>
@@ -902,8 +903,8 @@ onMounted(() => {
<a-form-item <a-form-item
:label=" :label="
modalState.isBatch modalState.isBatch
? t('views.neData.udmVOIP.startUsername') ? t('views.neData.udmVoIP.startUsername')
: t('views.neData.udmVOIP.username') : t('views.neData.udmVoIP.username')
" "
name="username" name="username"
v-bind="modalStateFrom.validateInfos.username" v-bind="modalStateFrom.validateInfos.username"
@@ -912,12 +913,12 @@ onMounted(() => {
v-model:value="modalState.from.username" v-model:value="modalState.from.username"
style="width: 100%" style="width: 100%"
:maxlength="16" :maxlength="16"
:placeholder="t('views.neData.udmVOIP.username')" :placeholder="t('views.neData.udmVoIP.username')"
> >
</a-input> </a-input>
</a-form-item> </a-form-item>
<a-form-item <a-form-item
:label="t('views.neData.udmVOIP.password')" :label="t('views.neData.udmVoIP.password')"
name="password" name="password"
v-bind="modalStateFrom.validateInfos.password" v-bind="modalStateFrom.validateInfos.password"
> >
@@ -926,7 +927,7 @@ onMounted(() => {
style="width: 100%" style="width: 100%"
:min="4" :min="4"
:max="64" :max="64"
:placeholder="t('views.neData.udmVOIP.password')" :placeholder="t('views.neData.udmVoIP.password')"
> >
</a-input-password> </a-input-password>
</a-form-item> </a-form-item>

View File

@@ -20,14 +20,13 @@ import { uploadFile } from '@/api/tool/file';
import { getNeViewFile } from '@/api/tool/neFile'; import { getNeViewFile } from '@/api/tool/neFile';
import { import {
addUDMVolteIMS, addUDMVolteIMS,
batchAddUDMVolteIMS,
batchDelUDMVolteIMS,
delUDMVolteIMS, delUDMVolteIMS,
exportUDMVolteIMS, exportUDMVolteIMS,
importUDMVolteIMS, importUDMVolteIMS,
listUDMVolteIMS, listUDMVolteIMS,
resetUDMVolteIMS, resetUDMVolteIMS,
} from '@/api/neData/udm_volte_ims'; } from '@/api/neData/udm_volte_ims';
import { currentCoreUid } from '@/hooks/useCoreUid';
const { t } = useI18n(); const { t } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
/**字典数据 */ /**字典数据 */
@@ -52,8 +51,10 @@ let neOtions = ref<Record<string, any>[]>([]);
/**查询参数 */ /**查询参数 */
let queryParams = reactive({ let queryParams = reactive({
/**核心网标识 */
coreUid: currentCoreUid(),
/**网元ID */ /**网元ID */
neId: undefined, neUid: undefined,
/**IMSI */ /**IMSI */
imsi: '', imsi: '',
/**MSISDN */ /**MSISDN */
@@ -286,7 +287,9 @@ function fnModalVisibleByEdit(row?: Record<string, any>) {
*/ */
function fnModalOk() { function fnModalOk() {
const from = JSON.parse(JSON.stringify(modalState.from)); const from = JSON.parse(JSON.stringify(modalState.from));
from.neId = queryParams.neId || '-'; from.coreUid = queryParams.coreUid || '-';
from.neUid = queryParams.neUid || '-';
from.neType = 'UDM';
// 如果是VoIP, 则MSISDN和IMSI相同 // 如果是VoIP, 则MSISDN和IMSI相同
if (from.tag === '0') { if (from.tag === '0') {
@@ -312,15 +315,10 @@ function fnModalOk() {
let result: any = null; let result: any = null;
if (modalState.isBatch) { if (modalState.isBatch) {
if (modalState.type === 'add') { if (modalState.type === 'add') {
result = batchAddUDMVolteIMS(from, from.num); result = addUDMVolteIMS(from);
} }
if (modalState.type === 'delete') { if (modalState.type === 'delete') {
result = batchDelUDMVolteIMS( result = delUDMVolteIMS(from);
from.neId,
`${from.imsi}_${from.msisdn}`,
from.num,
from.tag
);
} }
} else { } else {
if (modalState.type === 'add') { if (modalState.type === 'add') {
@@ -386,13 +384,14 @@ function fnModalVisibleByBatch(type: 'delete' | 'add') {
/** /**
* 记录删除 * 记录删除
* @param id 记录ID * @param imsi 记录ID
*/ */
function fnRecordDelete(id: string) { function fnRecordDelete(imsi: string) {
const neID = queryParams.neId; const neUid = queryParams.neUid;
if (!neID) return; const coreUid = queryParams.coreUid;
let msg = id; if (!neUid || !coreUid) return;
if (id === '0') { let msg = imsi;
if (imsi === '0') {
msg = `${tableState.selectedRowIMSIs[0].imsi}... ${tableState.selectedRowIMSIs.length}`; msg = `${tableState.selectedRowIMSIs[0].imsi}... ${tableState.selectedRowIMSIs.length}`;
} }
@@ -402,27 +401,32 @@ function fnRecordDelete(id: string) {
onOk() { onOk() {
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
let reqArr: any[] = []; let reqArr: any[] = [];
if (id === '0') { if (imsi === '0') {
const volteArr = tableState.selectedRowIMSIs tableState.selectedRowIMSIs.forEach(item => {
.filter(item => item.tag == '1') reqArr.push(
.map(item => `${item.imsi}_${item.msisdn}`) delUDMVolteIMS({
.join(','); coreUid,
if (volteArr.length > 0) { neUid,
reqArr.push(delUDMVolteIMS(neID, volteArr, '1')); imsi: item.imsi,
} msisdn: item.msisdn,
const voipArr = tableState.selectedRowIMSIs tag: item.tag,
.filter(item => item.tag == '0') num: 1,
.map(item => `${item.imsi}_${item.msisdn}`) })
.join(','); );
if (voipArr.length > 0) { });
reqArr.push(delUDMVolteIMS(neID, voipArr, '0'));
}
} else { } else {
const record: any = tableState.data.find((item: any) => item.id === id); const record: any = tableState.data.find((item: any) => item.imsi === imsi);
if (record) { if (record) {
reqArr = [ reqArr.push(
delUDMVolteIMS(neID, `${record.imsi}_${record.msisdn}`, record.tag), delUDMVolteIMS({
]; coreUid,
neUid,
imsi: record.imsi,
msisdn: record.msisdn,
tag: record.tag,
num: 1,
})
);
} }
} }
Promise.all(reqArr) Promise.all(reqArr)
@@ -439,8 +443,9 @@ function fnRecordDelete(id: string) {
/**列表导出 */ /**列表导出 */
function fnExportList(type: string) { function fnExportList(type: string) {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
exportUDMVolteIMS(Object.assign({ type: type }, queryParams)) exportUDMVolteIMS(Object.assign({ type: type }, queryParams))
.then(res => { .then(res => {
@@ -449,7 +454,7 @@ function fnExportList(type: string) {
content: t('common.operateOk'), content: t('common.operateOk'),
duration: 2, duration: 2,
}); });
saveAs(res.data, `UDM_VOLTE_${neId}_${Date.now()}.${type}`); saveAs(res.data, `UDM_VOLTE_${Date.now()}.${type}`);
} else { } else {
message.error({ message.error({
content: `${res.msg}`, content: `${res.msg}`,
@@ -488,13 +493,14 @@ function fnGetList(pageNum?: number) {
/**重新加载数据 */ /**重新加载数据 */
function fnLoadData() { function fnLoadData() {
const neId = queryParams.neId; const coreUid = queryParams.coreUid;
if (tableState.loading || !neId) return; const neUid = queryParams.neUid;
if (tableState.loading || !neUid || !coreUid) return;
modalState.loadDataLoading = true; modalState.loadDataLoading = true;
tablePagination.total = 0; tablePagination.total = 0;
tableState.data = []; tableState.data = [];
tableState.loading = true; // 表格loading tableState.loading = true; // 表格loading
resetUDMVolteIMS(neId).then(res => { resetUDMVolteIMS(coreUid, neUid).then(res => {
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {
const num = res.data; const num = res.data;
const timerS = Math.ceil(+num / 800) + 3; const timerS = Math.ceil(+num / 800) + 3;
@@ -563,8 +569,9 @@ function fnModalUploadImportClose() {
/**对话框表格信息导入上传 */ /**对话框表格信息导入上传 */
function fnModalUploadImportUpload(file: File) { function fnModalUploadImportUpload(file: File) {
const neID = queryParams.neId; const neUid = queryParams.neUid;
if (!neID) { const coreUid = queryParams.coreUid;
if (!neUid || !coreUid) {
return Promise.reject('Unknown network element'); return Promise.reject('Unknown network element');
} }
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
@@ -587,7 +594,8 @@ function fnModalUploadImportUpload(file: File) {
if (!filePath) return; if (!filePath) return;
// 文件导入 // 文件导入
return importUDMVolteIMS({ return importUDMVolteIMS({
neId: neID, coreUid: coreUid,
neUid: neUid,
uploadPath: filePath, uploadPath: filePath,
}); });
}) })
@@ -611,12 +619,12 @@ function fnModalUploadImportUpload(file: File) {
/**对话框表格信息导入失败原因 */ /**对话框表格信息导入失败原因 */
function fnModalUploadImportFailReason() { function fnModalUploadImportFailReason() {
const neId = queryParams.neId; const neUid = queryParams.neUid;
if (!neId) return; if (!neUid) return;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
getNeViewFile({ getNeViewFile({
neType: 'UDM', neType: 'UDM',
neId: neId, neUid: neUid,
path: '/tmp', path: '/tmp',
fileName: 'import_imsuser_err_records.txt', fileName: 'import_imsuser_err_records.txt',
}) })
@@ -671,7 +679,7 @@ onMounted(() => {
return; return;
} }
if (neOtions.value.length > 0) { if (neOtions.value.length > 0) {
queryParams.neId = neOtions.value[0].value; queryParams.neUid = neOtions.value[0].value;
} }
// 获取列表数据 // 获取列表数据
@@ -690,9 +698,9 @@ 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="6" :md="12" :xs="24">
<a-form-item label="UDM" name="neId "> <a-form-item label="UDM" name="neUid ">
<a-select <a-select
v-model:value="queryParams.neId" v-model:value="queryParams.neUid"
:options="neOtions" :options="neOtions"
:placeholder="t('common.selectPlease')" :placeholder="t('common.selectPlease')"
:disabled="modalState.loadDataLoading" :disabled="modalState.loadDataLoading"
@@ -914,7 +922,7 @@ onMounted(() => {
<template #title>{{ t('common.deleteText') }}</template> <template #title>{{ t('common.deleteText') }}</template>
<a-button <a-button
type="link" type="link"
@click.prevent="fnRecordDelete(record.id)" @click.prevent="fnRecordDelete(record.imsi)"
> >
<template #icon> <template #icon>
<DeleteOutlined /> <DeleteOutlined />

View File

@@ -2,15 +2,11 @@
import * as echarts from 'echarts/core'; import * as echarts from 'echarts/core';
import { import {
TooltipComponent, TooltipComponent,
TooltipComponentOption,
GridComponent, GridComponent,
GridComponentOption,
LegendComponent, LegendComponent,
LegendComponentOption,
DataZoomComponent, DataZoomComponent,
DataZoomComponentOption,
} from 'echarts/components'; } from 'echarts/components';
import { LineChart, LineSeriesOption } from 'echarts/charts'; import { LineChart } from 'echarts/charts';
import { UniversalTransition } from 'echarts/features'; import { UniversalTransition } from 'echarts/features';
import { CanvasRenderer } from 'echarts/renderers'; import { CanvasRenderer } from 'echarts/renderers';
@@ -46,6 +42,8 @@ import { OptionsType, WS } from '@/plugins/ws-websocket';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { LineOutlined } from '@ant-design/icons-vue'; import { LineOutlined } from '@ant-design/icons-vue';
import useLayoutStore from '@/store/modules/layout'; import useLayoutStore from '@/store/modules/layout';
import { currentCoreUid } from '@/hooks/useCoreUid';
import { WS_GROUP_KPI } from '@/constants/ne-constants';
const layoutStore = useLayoutStore(); const layoutStore = useLayoutStore();
const neStore = useNeStore(); const neStore = useNeStore();
const route = useRoute(); const route = useRoute();
@@ -154,10 +152,12 @@ function fnTableSize({ key }: MenuInfo) {
/**查询参数 */ /**查询参数 */
let queryParams: any = reactive({ let queryParams: any = reactive({
/**核心网标识 */
coreUid: currentCoreUid(),
/**网元类型 */ /**网元类型 */
neType: '', neType: '',
/**网元标识 */ /**网元标识 */
neId: '', neUid: '',
/**颗粒度 */ /**颗粒度 */
interval: 900, interval: 900,
/**开始时间 */ /**开始时间 */
@@ -345,13 +345,6 @@ function fnGetListTitle() {
maxWidth: 300, maxWidth: 300,
}); });
} }
columns.push({
title: t('views.perfManage.perfData.neName'),
dataIndex: 'neName',
key: 'neName',
align: 'left',
width: 100,
});
columns.push({ columns.push({
title: t('views.perfManage.goldTarget.time'), title: t('views.perfManage.goldTarget.time'),
dataIndex: 'timeGroup', dataIndex: 'timeGroup',
@@ -384,7 +377,7 @@ function fnGetList() {
if (tableState.loading) return; if (tableState.loading) return;
tableState.loading = true; tableState.loading = true;
queryParams.neType = state.neType[0]; queryParams.neType = state.neType[0];
queryParams.neId = state.neType[1]; queryParams.neUid = state.neType[1];
// //
if ( if (
@@ -416,9 +409,9 @@ function fnGetList() {
kpiStats.value = []; kpiStats.value = [];
for (const columns of tableColumns.value) { for (const columns of tableColumns.value) {
if ( if (
columns.key === 'neName' || ['coreUid', 'neUid', 'neType', 'startIndex', 'timeGroup'].includes(
columns.key === 'startIndex' || columns.key
columns.key === 'timeGroup' )
) { ) {
continue; continue;
} }
@@ -537,9 +530,9 @@ function fnRanderChartData() {
for (const columns of tableColumns.value) { for (const columns of tableColumns.value) {
if ( if (
columns.key === 'neName' || ['coreUid', 'neUid', 'neType', 'startIndex', 'timeGroup'].includes(
columns.key === 'startIndex' || columns.key
columns.key === 'timeGroup' )
) { ) {
continue; continue;
} }
@@ -653,6 +646,8 @@ function fnLegendSelected(bool: any) {
/**图表实时统计 */ /**图表实时统计 */
function fnRealTimeSwitch(bool: any) { function fnRealTimeSwitch(bool: any) {
if (bool) { if (bool) {
const coreUid = queryParams.coreUid;
const neUid = queryParams.neUid;
tableState.seached = false; tableState.seached = false;
// //
const options: OptionsType = { const options: OptionsType = {
@@ -660,9 +655,9 @@ function fnRealTimeSwitch(bool: any) {
params: { params: {
/** /**
* *
* 指标(GroupID:10_neType_neId) * 指标(GroupID:10_coreUid_neUid)
*/ */
subGroupID: `10_${queryParams.neType}_${queryParams.neId}`, subGroupID: `${WS_GROUP_KPI}_${coreUid}_${neUid}`,
}, },
onmessage: wsMessage, onmessage: wsMessage,
onerror: wsError, onerror: wsError,
@@ -825,14 +820,10 @@ watch(
onMounted(() => { onMounted(() => {
// AMF AUSF MME MOCNGW NSSF SMF UDM UPF PCF // AMF AUSF MME MOCNGW NSSF SMF UDM UPF PCF
// //
neCascaderOptions.value = neStore.getNeCascaderOptions.filter( neCascaderOptions.value = neStore.getNeCascaderOptions.filter((item: any) => {
(item: any) => { //
// return !['OMC', 'NSSF', 'NEF', 'NRF', 'LMF', 'N3IWF'].includes(item.value);
return !['OMC', 'NSSF', 'NEF', 'NRF', 'LMF', 'N3IWF'].includes( });
item.value
);
}
);
if (neCascaderOptions.value.length === 0) { if (neCascaderOptions.value.length === 0) {
message.warning({ message.warning({
content: t('common.noData'), content: t('common.noData'),
@@ -845,15 +836,16 @@ onMounted(() => {
const item = neCascaderOptions.value.find(s => s.value === queryNeType); const item = neCascaderOptions.value.find(s => s.value === queryNeType);
if (item && item.children) { if (item && item.children) {
const info = item.children[0]; const info = item.children[0];
state.neType = [info.neType, info.neId]; state.neType = [info.neType, info.neUid];
queryParams.neType = info.neType; queryParams.neType = info.neType;
queryParams.neId = info.neId; queryParams.neUid = info.neUid;
} else { } else {
const info = neCascaderOptions.value[0].children[0]; const info = neCascaderOptions.value[0].children[0];
state.neType = [info.neType, info.neId]; state.neType = [info.neType, info.neUid];
queryParams.neType = info.neType; queryParams.neType = info.neType;
queryParams.neId = info.neId; queryParams.neUid = info.neUid;
} }
queryParams.coreUid = currentCoreUid();
fnGetListTitle(); fnGetListTitle();
// //

View File

@@ -29,6 +29,7 @@ import { OptionsType, WS } from '@/plugins/ws-websocket';
import { useDebounceFn } from '@vueuse/core'; import { useDebounceFn } from '@vueuse/core';
import { LineOutlined } from '@ant-design/icons-vue'; import { LineOutlined } from '@ant-design/icons-vue';
import { TableColumnType } from 'ant-design-vue'; import { TableColumnType } from 'ant-design-vue';
import { WS_GROUP_KPI } from '@/constants/ne-constants';
const { t, currentLocale } = useI18n(); const { t, currentLocale } = useI18n();
const neStore = useNeStore(); const neStore = useNeStore();
//日期快捷选择 //日期快捷选择
@@ -71,12 +72,21 @@ const ALL_NE_TYPES = [
] as const; ] as const;
type AllChartType = (typeof ALL_NE_TYPES)[number] & string; type AllChartType = (typeof ALL_NE_TYPES)[number] & string;
// 在 ALL_NE_TYPES 定义之后添加 小写转大写 // 在 ALL_NE_TYPES 定义之后添加 小写转大写
const neTypeOptions = neStore.getNeCascaderOptions const neTypeOptions: any = neStore.getNeCascaderOptions
.filter(v => ALL_NE_TYPES.includes(v.value.toLowerCase())) .filter(v => ALL_NE_TYPES.includes(v.value.toLowerCase()))
.map(v => ({ .map(v => {
label: v.label, let data: Record<string, any> = {
value: v.value.toLowerCase(), label: v.label,
})); value: v.value.toLowerCase(),
};
if (v.children.length > 0) {
const ne = v.children[0];
data.coreUid = ne.coreUid;
data.neUid = ne.neUid;
data.neType = ne.neType;
}
return data;
});
// 使用 ref 来使 networkElementTypes 变为响应式,并使用 ALL_NE_TYPES 初始化 // 使用 ref 来使 networkElementTypes 变为响应式,并使用 ALL_NE_TYPES 初始化
const networkElementTypes = ref<AllChartType[]>([...ALL_NE_TYPES]); const networkElementTypes = ref<AllChartType[]>([...ALL_NE_TYPES]);
@@ -527,9 +537,11 @@ const fetchData = async (type: AllChartType) => {
try { try {
const dateRange = rangePicker[type] as [string, string]; const dateRange = rangePicker[type] as [string, string];
const [beginTime, endTime] = dateRange; const [beginTime, endTime] = dateRange;
const ne = neTypeOptions.find((v: any) => v.value === type);
const res = await listKPIData({ const res = await listKPIData({
neType: type.toUpperCase(), coreUid: ne.coreUid,
neId: '001', neType: ne.neType,
neUid: ne.neUid,
beginTime, beginTime,
endTime, endTime,
sortField: 'timeGroup', sortField: 'timeGroup',
@@ -573,12 +585,15 @@ function fnRealTimeSwitch(bool: boolean) {
} }
}); });
let subGroupIDArr: string[] = [];
selectedNeTypes.value.forEach(type => {
const ne = neTypeOptions.find((v: any) => v.value === type);
subGroupIDArr.push(`${WS_GROUP_KPI}_${ne.coreUid}_${ne.neUid}`);
});
const options: OptionsType = { const options: OptionsType = {
url: '/ws', url: '/ws',
params: { params: {
subGroupID: selectedNeTypes.value subGroupID: subGroupIDArr.join(','),
.map(type => `10_${type.toUpperCase()}_001`)
.join(','),
}, },
onmessage: wsMessage, onmessage: wsMessage,
onerror: wsError, onerror: wsError,

View File

@@ -22,6 +22,9 @@ import { OptionsType, WS } from '@/plugins/ws-websocket';
import { generateColorRGBA } from '@/utils/generate-utils'; import { generateColorRGBA } from '@/utils/generate-utils';
import { LineOutlined } from '@ant-design/icons-vue'; import { LineOutlined } from '@ant-design/icons-vue';
import { TableColumnType } from 'ant-design-vue'; import { TableColumnType } from 'ant-design-vue';
import useNeStore from '@/store/modules/ne';
import { WS_GROUP_KPI } from '@/constants/ne-constants';
const neStore = useNeStore();
const { t, currentLocale } = useI18n(); const { t, currentLocale } = useI18n();
//定义KPI接口 //定义KPI接口
interface KPIBase { interface KPIBase {
@@ -143,11 +146,19 @@ const fnRealTimeSwitch = (bool: boolean) => {
} }
chartData.value = []; chartData.value = [];
let subGroupID: string[] = [];
neCascaderOptions.value.forEach(item => {
if (item.children.length > 0) {
const ne = item.children[0];
subGroupID.push(`${WS_GROUP_KPI}_${ne.coreUid}_${ne.neUid}`);
}
});
tableLoading.value = true; tableLoading.value = true;
const options: OptionsType = { const options: OptionsType = {
url: '/ws', url: '/ws',
params: { params: {
subGroupID: ALL_NE_TYPES.map(type => `10_${type}_001`).join(','), subGroupID: subGroupID.join(','),
}, },
onmessage: wsMessage, onmessage: wsMessage,
onerror: wsError, onerror: wsError,
@@ -243,9 +254,16 @@ const fetchChartData = async () => {
// 创建并行请求数组 // 创建并行请求数组
const requests = ALL_NE_TYPES.map(async neType => { const requests = ALL_NE_TYPES.map(async neType => {
let ne: Record<string, any> = {};
neCascaderOptions.value.forEach(item => {
if (item.value === neType && item.children.length > 0) {
ne = item.children[0];
}
});
const params = { const params = {
neType, neType: ne.neType,
neId: '001', neUid: ne.neUid,
coreUid: ne.coreUid,
beginTime: beginTime, beginTime: beginTime,
endTime: endTime, endTime: endTime,
sortField: 'timeGroup', sortField: 'timeGroup',
@@ -607,9 +625,16 @@ const updateChart = () => {
observer.observe(container); observer.observe(container);
} }
}; };
/**网元参数 */
let neCascaderOptions = ref<Record<string, any>[]>([]);
//钩子函数 //钩子函数
onMounted(async () => { onMounted(async () => {
neCascaderOptions.value = neStore.getNeCascaderOptions.filter((item: any) => {
// 过滤不可用的网元
return ALL_NE_TYPES.includes(item.value);
});
try { try {
// 获取所有网元的指标 // 获取所有网元的指标
await fetchSpecificKPI(); await fetchSpecificKPI();

View File

@@ -78,27 +78,32 @@ let tableColumns: ColumnsType = [
{ {
title: t('views.perfManage.taskManage.neType'), title: t('views.perfManage.taskManage.neType'),
dataIndex: 'neType', dataIndex: 'neType',
align: 'center', align: 'left',
width: 100,
}, },
{ {
title: t('views.perfManage.customTarget.kpiId'), title: t('views.perfManage.customTarget.kpiId'),
dataIndex: 'kpiId', dataIndex: 'kpiId',
align: 'center', align: 'left',
width: 150,
}, },
{ {
title: t('views.perfManage.customTarget.title'), title: t('views.perfManage.customTarget.title'),
dataIndex: 'title', dataIndex: 'title',
align: 'center', align: 'left',
width: 200,
}, },
{ {
title: t('views.perfManage.customTarget.expression'), title: t('views.perfManage.customTarget.expression'),
dataIndex: 'expression', dataIndex: 'expression',
align: 'left', align: 'left',
width: 200,
}, },
{ {
title: t('views.perfManage.customTarget.description'), title: t('views.perfManage.customTarget.description'),
dataIndex: 'description', dataIndex: 'description',
align: 'center', align: 'left',
width: 150,
}, },
{ {
title: t('views.perfManage.customTarget.status'), title: t('views.perfManage.customTarget.status'),
@@ -461,13 +466,9 @@ function fnChangeUnit(value: any) {
let neCascaderOptions = ref<Record<string, any>[]>([]); let neCascaderOptions = ref<Record<string, any>[]>([]);
onMounted(() => { onMounted(() => {
// //
neCascaderOptions.value = neStore.getNeCascaderOptions.filter( neCascaderOptions.value = neStore.getNeCascaderOptions.filter((item: any) => {
(item: any) => { return !['OMC', 'NSSF', 'NEF', 'NRF', 'LMF', 'N3IWF'].includes(item.value);
return !['OMC', 'NSSF', 'NEF', 'NRF', 'LMF', 'N3IWF'].includes( });
item.value
);
}
);
if (neCascaderOptions.value.length === 0) { if (neCascaderOptions.value.length === 0) {
message.warning({ message.warning({
content: t('common.noData'), content: t('common.noData'),
@@ -593,7 +594,7 @@ onMounted(() => {
:data-source="tableState.data" :data-source="tableState.data"
:size="tableState.size" :size="tableState.size"
:pagination="tablePagination" :pagination="tablePagination"
:scroll="{ x: true }" :scroll="{ x: tableColumns.length * 150, y: 'calc(100vh - 480px)' }"
> >
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'id'"> <template v-if="column.key === 'id'">

View File

@@ -47,6 +47,8 @@ import { LineOutlined } from '@ant-design/icons-vue';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import useLayoutStore from '@/store/modules/layout'; import useLayoutStore from '@/store/modules/layout';
import { currentCoreUid } from '@/hooks/useCoreUid';
import { WS_GROUP_KPI_C } from '@/constants/ne-constants';
const layoutStore = useLayoutStore(); const layoutStore = useLayoutStore();
const neStore = useNeStore(); const neStore = useNeStore();
const route = useRoute(); const route = useRoute();
@@ -161,10 +163,12 @@ function fnTableSize({ key }: MenuInfo) {
/**查询参数 */ /**查询参数 */
let queryParams: any = reactive({ let queryParams: any = reactive({
/**核心网标识 */
coreUid: currentCoreUid(),
/**网元类型 */ /**网元类型 */
neType: '', neType: '',
/**网元标识 */ /**网元标识 */
neId: '', neUid: '',
/**开始时间 */ /**开始时间 */
beginTime: '', beginTime: '',
/**结束时间 */ /**结束时间 */
@@ -309,7 +313,7 @@ function fnRecordExport() {
const title = tableColumnsTitleArr[i]; const title = tableColumnsTitleArr[i];
if (key == 'timeGroup') { if (key == 'timeGroup') {
kpiData[title] = parseDateToStr(item[key]); kpiData[title] = parseDateToStr(item[key]);
} else if (key === 'neName' || key === 'startIndex') { } else if (key === 'startIndex') {
kpiData[title] = item[key]; kpiData[title] = item[key];
} else { } else {
const v = parseFloat(item[key]); const v = parseFloat(item[key]);
@@ -394,13 +398,6 @@ function fnGetListTitle() {
}, },
}); });
} }
columns.push({
title: t('views.perfManage.perfData.neName'),
dataIndex: 'neName',
key: 'neName',
align: 'left',
width: 100,
});
columns.push({ columns.push({
title: t('views.perfManage.goldTarget.time'), title: t('views.perfManage.goldTarget.time'),
dataIndex: 'timeGroup', dataIndex: 'timeGroup',
@@ -436,7 +433,7 @@ function fnGetList() {
if (tableState.loading) return; if (tableState.loading) return;
tableState.loading = true; tableState.loading = true;
queryParams.neType = state.neType[0]; queryParams.neType = state.neType[0];
queryParams.neId = state.neType[1]; queryParams.neUid = state.neType[1];
queryParams.beginTime = queryRangePicker.value[0]; queryParams.beginTime = queryRangePicker.value[0];
queryParams.endTime = queryRangePicker.value[1]; queryParams.endTime = queryRangePicker.value[1];
listCustomData(toRaw(queryParams)) listCustomData(toRaw(queryParams))
@@ -468,9 +465,9 @@ function fnGetList() {
kpiStats.value = []; kpiStats.value = [];
for (const columns of tableColumns.value) { for (const columns of tableColumns.value) {
if ( if (
columns.key === 'neName' || ['coreUid', 'neUid', 'neType', 'startIndex', 'timeGroup'].includes(
columns.key === 'startIndex' || columns.key
columns.key === 'timeGroup' )
) { ) {
continue; continue;
} }
@@ -533,9 +530,9 @@ function fnGetList() {
kpiStats.value = []; kpiStats.value = [];
for (const columns of tableColumns.value) { for (const columns of tableColumns.value) {
if ( if (
columns.key === 'neName' || ['coreUid', 'neUid', 'neType', 'startIndex', 'timeGroup'].includes(
columns.key === 'startIndex' || columns.key
columns.key === 'timeGroup' )
) { ) {
continue; continue;
} }
@@ -650,9 +647,9 @@ function fnRanderChartData() {
for (var columns of tableColumns.value) { for (var columns of tableColumns.value) {
if ( if (
columns.key === 'neName' || ['coreUid', 'neUid', 'neType', 'startIndex', 'timeGroup'].includes(
columns.key === 'startIndex' || columns.key
columns.key === 'timeGroup' )
) { ) {
continue; continue;
} }
@@ -767,6 +764,8 @@ function fnRanderChartData() {
/**图表实时统计 */ /**图表实时统计 */
function fnRealTimeSwitch(bool: any) { function fnRealTimeSwitch(bool: any) {
if (bool) { if (bool) {
const coreUid = queryParams.coreUid;
const neUid = queryParams.neUid;
tableState.seached = false; tableState.seached = false;
// //
const options: OptionsType = { const options: OptionsType = {
@@ -774,9 +773,9 @@ function fnRealTimeSwitch(bool: any) {
params: { params: {
/** /**
* *
* 指标(GroupID:10_neType_neId) * 指标(GroupID:20_coreUid_neUid)
*/ */
subGroupID: `20_${queryParams.neType}_${queryParams.neId}`, subGroupID: `${WS_GROUP_KPI_C}_${coreUid}_${neUid}`,
}, },
onmessage: wsMessage, onmessage: wsMessage,
onerror: wsError, onerror: wsError,
@@ -981,14 +980,16 @@ onMounted(() => {
const item = neCascaderOptions.value.find(s => s.value === queryNeType); const item = neCascaderOptions.value.find(s => s.value === queryNeType);
if (item && item.children) { if (item && item.children) {
const info = item.children[0]; const info = item.children[0];
state.neType = [info.neType, info.neId]; state.neType = [info.neType, info.neUid];
queryParams.neType = info.neType; queryParams.neType = info.neType;
queryParams.neId = info.neId; queryParams.neUid = info.neUid;
queryParams.coreUid = info.coreUid;
} else { } else {
const info = neCascaderOptions.value[0].children[0]; const info = neCascaderOptions.value[0].children[0];
state.neType = [info.neType, info.neId]; state.neType = [info.neType, info.neUid];
queryParams.neType = info.neType; queryParams.neType = info.neType;
queryParams.neId = info.neId; queryParams.neUid = info.neUid;
queryParams.coreUid = info.coreUid;
} }
// //

View File

@@ -9,7 +9,7 @@
<label style="margin-right: 8px; font-weight: 600;">{{ t('views.perfManage.voiceOverView.ne') }}</label> <label style="margin-right: 8px; font-weight: 600;">{{ t('views.perfManage.voiceOverView.ne') }}</label>
<a-select <a-select
v-model:value="selectedImsNeId" v-model:value="selectedImsNeId"
:options="imsNeList.map(ne => ({ label: ne.neName || ne.neId, value: ne.neId }))" :options="imsNeList.map(ne => ({ label: ne.neName || ne.neUid, value: ne.neUid }))"
@change="onImsNeChange" @change="onImsNeChange"
style="width: 100px; font-size: 15px;" style="width: 100px; font-size: 15px;"
:dropdown-style="{ borderRadius: '8px' }" :dropdown-style="{ borderRadius: '8px' }"
@@ -149,6 +149,8 @@ import useNeStore from '@/store/modules/ne';
import { WS } from '@/plugins/ws-websocket' import { WS } from '@/plugins/ws-websocket'
import { listKPIData } from '@/api/perfManage/goldTarget' import { listKPIData } from '@/api/perfManage/goldTarget'
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
import { WS_GROUP_KPI } from '@/constants/ne-constants'
import { currentCoreUid } from '@/hooks/useCoreUid'
const neStore = useNeStore(); const neStore = useNeStore();
const { t } = useI18n(); const { t } = useI18n();
echarts.use([LineChart, GridComponent, CanvasRenderer]) echarts.use([LineChart, GridComponent, CanvasRenderer])
@@ -160,7 +162,7 @@ const regChartRef = ref<HTMLDivElement | null>(null)
const failedRegChartRef = ref<HTMLDivElement | null>(null) const failedRegChartRef = ref<HTMLDivElement | null>(null)
// IMS // IMS
const imsNeList = ref<{ neId: string, neName: string }[]>([]) const imsNeList = ref<{ neUid: string, neName: string }[]>([])
// IMSID // IMSID
const selectedImsNeId = ref('') const selectedImsNeId = ref('')
// WebSocket // WebSocket
@@ -182,7 +184,7 @@ onMounted(async () => {
// console.log('IMS:', imsNeList.value) // // console.log('IMS:', imsNeList.value) //
if (imsNeList.value.length > 0) { if (imsNeList.value.length > 0) {
selectedImsNeId.value = imsNeList.value[0].neId selectedImsNeId.value = imsNeList.value[0].neUid
// console.log('IMS:', selectedImsNeId.value) // // console.log('IMS:', selectedImsNeId.value) //
// //
@@ -197,8 +199,8 @@ onMounted(async () => {
}) })
// //
async function fetchHistoryData(neId: string) { async function fetchHistoryData(neUid: string) {
if (!neId) return if (!neUid) return
try { try {
// 30 // 30
@@ -207,8 +209,9 @@ async function fetchHistoryData(neId: string) {
// //
const params = { const params = {
coreUid: currentCoreUid(),
neType: 'IMS', neType: 'IMS',
neId: neId, neUid: neUid,
interval: 60, // 1 interval: 60, // 1
beginTime: beginTime.toString(), beginTime: beginTime.toString(),
endTime: endTime.toString(), endTime: endTime.toString(),
@@ -274,8 +277,8 @@ async function onImsNeChange() {
} }
// IMS // IMS
function subscribeImsRealtime(neId: string) { function subscribeImsRealtime(neUid: string) {
// console.log('IMSID:', neId) // // console.log('IMSID:', neUid) //
wsStatus.value = '连接中...' // wsStatus.value = '连接中...' //
// WebSocket // WebSocket
@@ -286,7 +289,7 @@ function subscribeImsRealtime(neId: string) {
} }
if (!neId) return if (!neUid) return
imsWs.value = new WS() imsWs.value = new WS()
// console.log('WebSocket') // // console.log('WebSocket') //
@@ -294,7 +297,7 @@ function subscribeImsRealtime(neId: string) {
imsWs.value.connect({ imsWs.value.connect({
url: '/ws', url: '/ws',
params: { params: {
subGroupID: `10_IMS_${neId}`, subGroupID: `${WS_GROUP_KPI}_${currentCoreUid()}_${neUid}`,
}, },
onmessage: handleIMSRealtimeData, onmessage: handleIMSRealtimeData,
onerror: (error: any) => { onerror: (error: any) => {
@@ -1022,8 +1025,8 @@ function handleIMSRealtimeData(res: any) {
//console.log('KPIgroupId:', data.groupId) // //console.log('KPIgroupId:', data.groupId) //
// IDIMS // IDIMS
const [_, neType, neId] = data.groupId.split('_') const [_, neType, neUid] = data.groupId.split('_')
if (neType !== 'IMS' || neId !== selectedImsNeId.value) { if (neType !== 'IMS' || neUid !== selectedImsNeId.value) {
//console.log(':', data.groupId) // //console.log(':', data.groupId) //
return return
} }

View File

@@ -283,7 +283,7 @@ function fnModalVisibleByEdit(record?: any) {
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
modalState.confirmLoading = true; modalState.confirmLoading = true;
getNeInfo(record.id).then(res => { getNeInfo(currentCoreUid(), record.id).then(res => {
modalState.confirmLoading = false; modalState.confirmLoading = false;
hide(); hide();
if (res.code === RESULT_CODE_SUCCESS) { if (res.code === RESULT_CODE_SUCCESS) {

View File

@@ -9,7 +9,7 @@ import {
} from '@/constants/result-constants'; } from '@/constants/result-constants';
import TerminalSSHView from '@/components/TerminalSSHView/index.vue'; import TerminalSSHView from '@/components/TerminalSSHView/index.vue';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
import { iperfI, iperfV } from '@/api/tool/iperf'; import { iperfV } from '@/api/tool/iperf';
import { currentCoreUid } from '@/hooks/useCoreUid'; import { currentCoreUid } from '@/hooks/useCoreUid';
const neStore = useNeStore(); const neStore = useNeStore();
const { t } = useI18n(); const { t } = useI18n();
@@ -108,8 +108,8 @@ async function fnIPerf() {
if (resVersion.code !== RESULT_CODE_SUCCESS) { if (resVersion.code !== RESULT_CODE_SUCCESS) {
Modal.confirm({ Modal.confirm({
title: t('common.tipTitle'), title: t('common.tipTitle'),
content: 'Not found if iperf is installed', content: 'Not found iperf version, please install (https://iperf.fr)',
onOk: () => fnInstall(), onOk: () => {},
}); });
return; return;
} else { } else {
@@ -124,33 +124,6 @@ async function fnIPerf() {
state.initialized = true; state.initialized = true;
} }
/**触发安装iperf */
function fnInstall() {
const key = 'iperfI';
message.loading({ content: t('common.loading'), key });
const { neType, neUid, coreUid } = state.params;
iperfI({
neType,
neUid,
coreUid,
version: state.data.version,
}).then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
message.success({
content: 'install success',
key,
duration: 2,
});
} else {
message.error({
content: 'install fail',
key,
duration: 2,
});
}
});
}
/**终端实例 */ /**终端实例 */
const toolTerminal = ref(); const toolTerminal = ref();

View File

@@ -14,6 +14,7 @@ import useTabsStore from '@/store/modules/tabs';
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
import saveAs from 'file-saver'; import saveAs from 'file-saver';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { currentCoreUid } from '@/hooks/useCoreUid';
const tabsStore = useTabsStore(); const tabsStore = useTabsStore();
const neStore = useNeStore(); const neStore = useNeStore();
const { t } = useI18n(); const { t } = useI18n();
@@ -30,7 +31,8 @@ let neTypeSelect = ref<string[]>([]);
let queryParams = reactive({ let queryParams = reactive({
/**网元类型 */ /**网元类型 */
neType: '', neType: '',
neId: '', neUid: '',
coreUid: '',
/**读取路径 */ /**读取路径 */
path: '', path: '',
/**前缀过滤 */ /**前缀过滤 */
@@ -142,8 +144,9 @@ function fnDownloadFile(row: Record<string, any>) {
downLoading.value = true; downLoading.value = true;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
getNeFile({ getNeFile({
coreUid: queryParams.coreUid,
neType: queryParams.neType, neType: queryParams.neType,
neId: queryParams.neId, neUid: queryParams.neUid,
path: queryParams.path, path: queryParams.path,
fileName: row.fileName, fileName: row.fileName,
delTemp: true, delTemp: true,
@@ -182,8 +185,9 @@ function fnDownloadFileZIP(row: Record<string, any>) {
downLoading.value = true; downLoading.value = true;
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
getNeDirZip({ getNeDirZip({
coreUid: queryParams.coreUid,
neType: queryParams.neType, neType: queryParams.neType,
neId: queryParams.neId, neUid: queryParams.neUid,
path: `${queryParams.path}/${row.fileName}`, path: `${queryParams.path}/${row.fileName}`,
delTemp: true, delTemp: true,
}) })
@@ -244,10 +248,10 @@ function fnDirCD(dir: string, index?: number) {
const neType = queryParams.neType; const neType = queryParams.neType;
if (neType === 'UPF' && tmp.value) { if (neType === 'UPF' && tmp.value) {
nePathArr.value = ['/tmp']; nePathArr.value = ['/tmp'];
queryParams.search = `${neType}_${queryParams.neId}`; queryParams.search = `${neType}_${queryParams.neUid}`;
} else { } else {
nePathArr.value = [ nePathArr.value = [
`/usr/local/omc/tcpdump/${neType.toLowerCase()}/${queryParams.neId}`, `/usr/local/omc/tcpdump/${neType.toLowerCase()}/${queryParams.neUid}`,
]; ];
queryParams.search = ''; queryParams.search = '';
} }
@@ -264,16 +268,17 @@ function fnDirCD(dir: string, index?: number) {
function fnNeChange(keys: any, _: any) { function fnNeChange(keys: any, _: any) {
if (!Array.isArray(keys)) return; if (!Array.isArray(keys)) return;
const neType = keys[0]; const neType = keys[0];
const neId = keys[1]; const neUid = keys[1];
// 不是同类型时需要重新加载 // 不是同类型时需要重新加载
if (queryParams.neType !== neType || queryParams.neId !== neId) { if (queryParams.neType !== neType || queryParams.neUid !== neUid) {
queryParams.neType = neType; queryParams.neType = neType;
queryParams.neId = neId; queryParams.neUid = neUid;
queryParams.coreUid = currentCoreUid();
if (neType === 'UPF' && tmp.value) { if (neType === 'UPF' && tmp.value) {
nePathArr.value = ['/tmp']; nePathArr.value = ['/tmp'];
queryParams.search = `${neType}_${neId}`; queryParams.search = `${neType}_${neUid}`;
} else { } else {
nePathArr.value = [`/usr/local/omc/tcpdump/${neType.toLowerCase()}/${neId}`]; nePathArr.value = [`/usr/local/omc/tcpdump/${neType.toLowerCase()}/${neUid}`];
queryParams.search = ''; queryParams.search = '';
} }
fnGetList(1); fnGetList(1);
@@ -282,7 +287,7 @@ function fnNeChange(keys: any, _: any) {
/**查询列表, pageNum初始页数 */ /**查询列表, pageNum初始页数 */
function fnGetList(pageNum?: number) { function fnGetList(pageNum?: number) {
if (queryParams.neId === '') { if (queryParams.neUid === '') {
message.warning({ message.warning({
content: t('views.logManage.neFile.neTypePlease'), content: t('views.logManage.neFile.neTypePlease'),
duration: 2, duration: 2,
@@ -325,20 +330,23 @@ const viewDrawerState = reactive({
/**网元类型 */ /**网元类型 */
neType: '', neType: '',
/**网元ID */ /**网元ID */
neId: '', neUid: '',
/**核心网ID */
coreUid: '',
}); });
/**打开抽屉查看 */ /**打开抽屉查看 */
function fnDrawerOpen(row: Record<string, any>) { function fnDrawerOpen(row: Record<string, any>) {
viewDrawerState.filePath = [...nePathArr.value, row.fileName].join('/'); viewDrawerState.filePath = [...nePathArr.value, row.fileName].join('/');
viewDrawerState.neType = neTypeSelect.value[0]; viewDrawerState.neType = neTypeSelect.value[0];
viewDrawerState.neId = neTypeSelect.value[1]; viewDrawerState.neUid = neTypeSelect.value[1];
viewDrawerState.coreUid = currentCoreUid();
viewDrawerState.open = !viewDrawerState.open; viewDrawerState.open = !viewDrawerState.open;
} }
onMounted(() => { onMounted(() => {
if (routeParams.neType && routeParams.neId) { if (routeParams.neType && routeParams.neUid) {
neTypeSelect.value = [routeParams.neType, routeParams.neId]; neTypeSelect.value = [routeParams.neType, routeParams.neUid];
fnNeChange(neTypeSelect.value, undefined); fnNeChange(neTypeSelect.value, undefined);
} }
}); });
@@ -469,7 +477,8 @@ onMounted(() => {
v-model:open="viewDrawerState.open" v-model:open="viewDrawerState.open"
:file-path="viewDrawerState.filePath" :file-path="viewDrawerState.filePath"
:ne-type="viewDrawerState.neType" :ne-type="viewDrawerState.neType"
:ne-id="viewDrawerState.neId" :ne-uid="viewDrawerState.neUid"
:core-uid="viewDrawerState.coreUid"
></ViewDrawer> ></ViewDrawer>
</PageContainer> </PageContainer>
</template> </template>

View File

@@ -37,7 +37,8 @@ type ModalStateType = {
/**提交表单参数 */ /**提交表单参数 */
data: { data: {
neType: string; neType: string;
neId: string; neUid: string;
coreUid: string;
cmd?: string; cmd?: string;
}; };
} }
@@ -69,7 +70,8 @@ type ModalStateType = {
/**详情框内容 */ /**详情框内容 */
viewFrom: { viewFrom: {
neType: string; neType: string;
neId: string; neUid: string;
coreUid: string;
path: string; path: string;
action: string; action: string;
files: string[]; files: string[];
@@ -117,7 +119,8 @@ let modalState: ModalStateType = reactive({
openByView: false, openByView: false,
viewFrom: { viewFrom: {
neType: '', neType: '',
neId: '', neUid: '',
coreUid: '',
path: '', path: '',
action: '', action: '',
files: [], files: [],
@@ -150,12 +153,6 @@ let tableColumns: ColumnsType = [
align: 'left', align: 'left',
width: 100, width: 100,
}, },
{
title: t('views.ne.common.neUid'),
dataIndex: 'neId',
align: 'left',
width: 100,
},
{ {
title: t('views.ne.common.neName'), title: t('views.ne.common.neName'),
dataIndex: 'neName', dataIndex: 'neName',
@@ -164,7 +161,7 @@ let tableColumns: ColumnsType = [
}, },
{ {
title: t('views.ne.common.ipAddr'), title: t('views.ne.common.ipAddr'),
dataIndex: 'ip', dataIndex: 'ipAddr',
align: 'left', align: 'left',
width: 150, width: 150,
}, },
@@ -214,7 +211,8 @@ function fnGetList() {
taskFiles: [], taskFiles: [],
data: { data: {
neType: item.neType, neType: item.neType,
neId: item.neId, neUid: item.neUid,
coreUid: item.coreUid,
}, },
}; };
} }
@@ -439,12 +437,13 @@ function fnDownPCAP(row?: Record<string, any>) {
) )
); );
} else { } else {
const { neType, neId } = from.data; const { neType, neUid, coreUid } = from.data;
const path = `/usr/local/omc/tcpdump/${neType.toLowerCase()}/${neId}/${taskCode}`; const path = `/usr/local/omc/tcpdump/${neType.toLowerCase()}/${neUid}/${taskCode}`;
reqArr.push( reqArr.push(
getNeDirZip({ getNeDirZip({
neType, neType,
neId, neUid,
coreUid,
path, path,
delTemp: true, delTemp: true,
}) })
@@ -456,6 +455,9 @@ function fnDownPCAP(row?: Record<string, any>) {
const hide = message.loading(t('common.loading'), 0); const hide = message.loading(t('common.loading'), 0);
Promise.allSettled(reqArr) Promise.allSettled(reqArr)
.then(resArr => { .then(resArr => {
type successType = { data: Blob; filename: string }[];
const successResults: successType = [];
resArr.forEach((res, idx) => { resArr.forEach((res, idx) => {
const title = fromArr[idx].title; const title = fromArr[idx].title;
const taskCode = fromArr[idx].taskCode; const taskCode = fromArr[idx].taskCode;
@@ -468,11 +470,14 @@ function fnDownPCAP(row?: Record<string, any>) {
duration: 3, duration: 3,
}); });
// 文件名 // 文件名
let filename = `${title}_${Date.now()}.zip`;
if (taskCode.startsWith('/tmp')) { if (taskCode.startsWith('/tmp')) {
saveAs(resV.data, `${title}_${Date.now()}.pcap`); filename = `${title}_${Date.now()}.pcap`;
} else {
saveAs(resV.data, `${title}_${Date.now()}.zip`);
} }
successResults.push({
data: resV.data,
filename: filename,
});
} else { } else {
message.warning({ message.warning({
content: `${resV.msg}`, content: `${resV.msg}`,
@@ -486,6 +491,28 @@ function fnDownPCAP(row?: Record<string, any>) {
}); });
} }
}); });
// 分批下载函数每批3个间隔300ms
const batchDownload = async (results: successType) => {
const batchSize = 3;
const delay = 1_000; // 毫秒
for (let i = 0; i < results.length; i += batchSize) {
const batch = results.slice(i, i + batchSize);
// 处理当前批次
batch.forEach(item => {
saveAs(item.data, item.filename);
});
await new Promise(resolve =>
setTimeout(() => resolve(true), delay)
);
}
};
// 开始分批下载
batchDownload(successResults);
}) })
.finally(() => { .finally(() => {
hide(); hide();
@@ -519,13 +546,14 @@ function fnBatchOper(key: string) {
function fnModalVisibleByVive(id: string | number) { function fnModalVisibleByVive(id: string | number) {
const from = modalState.from[id]; const from = modalState.from[id];
if (!from) return; if (!from) return;
const { neType, neId } = from.data; const { neType, neUid, coreUid } = from.data;
const path = `/usr/local/omc/tcpdump/${neType.toLowerCase()}/${neId}/${ const path = `/usr/local/omc/tcpdump/${neType.toLowerCase()}/${neUid}/${
from.taskCode from.taskCode
}`; }`;
const files = from.taskFiles.filter(f => f.endsWith('log')); const files = from.taskFiles.filter(f => f.endsWith('log'));
modalState.viewFrom.neType = neType; modalState.viewFrom.neType = neType;
modalState.viewFrom.neId = neId; modalState.viewFrom.neUid = neUid;
modalState.viewFrom.coreUid = coreUid;
modalState.viewFrom.path = path; modalState.viewFrom.path = path;
modalState.viewFrom.files = [...files]; modalState.viewFrom.files = [...files];
fnViveTab(files[0]); fnViveTab(files[0]);
@@ -538,9 +566,10 @@ function fnViveTab(action: any) {
if (modalState.viewFrom.action === action) return; if (modalState.viewFrom.action === action) return;
modalState.viewFrom.action = action; modalState.viewFrom.action = action;
modalState.viewFrom.content = ''; modalState.viewFrom.content = '';
const { neType, neId, path } = modalState.viewFrom; const { neType, neUid, coreUid, path } = modalState.viewFrom;
getNeViewFile({ getNeViewFile({
neId, coreUid,
neUid,
neType, neType,
path, path,
fileName: action, fileName: action,
@@ -573,7 +602,8 @@ function fnFileView(row?: Record<string, any>) {
if (row) { if (row) {
const from = modalState.from[row.id]; const from = modalState.from[row.id];
query = { query = {
neId: from.data.neId, coreUid: from.data.coreUid,
neUid: from.data.neUid,
neType: from.data.neType, neType: from.data.neType,
}; };
} }

View File

@@ -10,6 +10,7 @@ import {
import TerminalSSHView from '@/components/TerminalSSHView/index.vue'; import TerminalSSHView from '@/components/TerminalSSHView/index.vue';
import useNeStore from '@/store/modules/ne'; import useNeStore from '@/store/modules/ne';
import { pingV } from '@/api/tool/ping'; import { pingV } from '@/api/tool/ping';
import { currentCoreUid } from '@/hooks/useCoreUid';
const neStore = useNeStore(); const neStore = useNeStore();
const { t } = useI18n(); const { t } = useI18n();
@@ -30,8 +31,9 @@ let state = reactive({
dataType: 'options' as 'options' | 'command', dataType: 'options' as 'options' | 'command',
/**ws参数 */ /**ws参数 */
params: { params: {
coreUid: '',
neUid: '',
neType: '', neType: '',
neId: '',
cols: 120, cols: 120,
rows: 40, rows: 40,
}, },
@@ -50,8 +52,8 @@ let state = reactive({
/**连接发送 */ /**连接发送 */
async function fnPing() { async function fnPing() {
const [neType, neId] = state.neType; const [neType, neUid] = state.neType;
if (!neType || !neId) { if (!neType || !neUid) {
message.warning({ message.warning({
content: 'No Found NE Type', content: 'No Found NE Type',
duration: 2, duration: 2,
@@ -74,14 +76,18 @@ async function fnPing() {
} }
// 网元切换时重置 // 网元切换时重置
if (neType !== state.params.neType || neId !== state.params.neId) { if (neType !== state.params.neType || neUid !== state.params.neUid) {
state.initialized = false; state.initialized = false;
state.params.neType = neType; state.params.neType = neType;
state.params.neId = neId; state.params.neUid = neUid;
state.params.coreUid = currentCoreUid();
} }
// 软件版本检查 // 软件版本检查
const resVersion = await pingV({ neType, neId }); state.params.neType = neType;
state.params.neUid = neUid;
state.params.coreUid = currentCoreUid();
const resVersion = await pingV({ coreUid: currentCoreUid(), neUid, neType });
if (resVersion.code !== RESULT_CODE_SUCCESS) { if (resVersion.code !== RESULT_CODE_SUCCESS) {
message.warning({ message.warning({
content: 'No Found ping iputils', content: 'No Found ping iputils',
@@ -391,7 +397,8 @@ onBeforeUnmount(() => {});
prefix="ping" prefix="ping"
url="/tool/ping/run" url="/tool/ping/run"
:ne-type="state.params.neType" :ne-type="state.params.neType"
:ne-id="state.params.neId" :ne-uid="state.params.neUid"
:core-uid="state.params.coreUid"
:rows="state.params.rows" :rows="state.params.rows"
:cols="state.params.cols" :cols="state.params.cols"
:process-messages="fnProcessMessage" :process-messages="fnProcessMessage"

View File

@@ -23,6 +23,7 @@ import {
} from '@/api/trace/packet'; } from '@/api/trace/packet';
import { parseDateToStr } from '@/utils/date-utils'; import { parseDateToStr } from '@/utils/date-utils';
import { ColumnsType } from 'ant-design-vue/es/table'; import { ColumnsType } from 'ant-design-vue/es/table';
import { WS_GROUP_TRACE_PACKET } from '@/constants/ne-constants';
const ws = new wsUtil.WS(); const ws = new wsUtil.WS();
const wk = new wkUtil.WK(); const wk = new wkUtil.WK();
const { t } = useI18n(); const { t } = useI18n();
@@ -196,7 +197,7 @@ function wsMessage(res: Record<string, any>) {
return; return;
} }
packetKeep(taskState.task.taskNo, 120); packetKeep(taskState.task.taskNo, 120);
}, 90 * 1000); }, 90_000);
return; return;
} }
@@ -222,9 +223,9 @@ function fnWS() {
* *
* 信令跟踪Packet (GroupID:4_taskNo) * 信令跟踪Packet (GroupID:4_taskNo)
*/ */
subGroupID: `4_${taskState.task.taskNo}`, subGroupID: `${WS_GROUP_TRACE_PACKET}_${taskState.task.taskNo}`,
}, },
heartTimer: 30 * 1000, heartTimer: 30_000,
onmessage: wsMessage, onmessage: wsMessage,
onerror: (ev: any) => { onerror: (ev: any) => {
// 接收数据后回调 // 接收数据后回调
@@ -271,7 +272,7 @@ const taskState = reactive<TaskStateType>({
outputPCAP: false, outputPCAP: false,
}, },
filter: '', filter: 'greater 200 and less 2500 and tcp and port 33030',
filterError: null, filterError: null,
keepTimer: null, keepTimer: null,
@@ -330,7 +331,7 @@ function fnStop() {
clearInterval(taskState.keepTimer); clearInterval(taskState.keepTimer);
taskState.keepTimer = null; taskState.keepTimer = null;
taskState.filter = ''; taskState.filter = 'greater 200 and less 2500 and tcp and port 33030';
taskState.filterError = null; taskState.filterError = null;
taskState.stop = true; taskState.stop = true;