diff --git a/.env.development b/.env.development index aafdecb5..4ca4be23 100644 --- a/.env.development +++ b/.env.development @@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network EMS" VITE_APP_CODE = "CN EMS" # 应用版本 -VITE_APP_VERSION = "2.240418.1" +VITE_APP_VERSION = "2.240425.1" # 接口基础URL地址-不带/后缀 VITE_API_BASE_URL = "/omc-api" diff --git a/.env.production b/.env.production index 4e7562ef..c59776c8 100644 --- a/.env.production +++ b/.env.production @@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network EMS" VITE_APP_CODE = "CN EMS" # 应用版本 -VITE_APP_VERSION = "2.240418.1" +VITE_APP_VERSION = "2.240425.1" # 接口基础URL地址-不带/后缀 VITE_API_BASE_URL = "/omc-api" diff --git a/src/api/configManage/configParam.ts b/src/api/configManage/configParam.ts index c7c9a2f4..f9adfc79 100644 --- a/src/api/configManage/configParam.ts +++ b/src/api/configManage/configParam.ts @@ -462,3 +462,144 @@ export async function updateNeConfigReload(neType: string, neId: string) { } return result; } + +/** + * 从参数配置PCF中获取对应信息提供给PCC用户策略输入框 + * @param neType 网元类型 + * @param topTag + * @param neId + * @returns object { wrRule, dataArr } + */ +export async function getPCCRule(neId: any) { + return await Promise.allSettled([ + // 获取参数规则 + request({ + url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/pccRules`, + method: 'get', + params: { + ne_id: neId, + }, + timeout: 1_000, + }), + // 获取对应信息 + request({ + url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/sessionRules`, + method: 'get', + params: { + ne_id: neId, + }, + timeout: 1_000, + }), + request({ + url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/qosTemplate`, + method: 'get', + params: { + ne_id: neId, + }, + timeout: 1_000, + }), + request({ + url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/headerEnrichTemplate`, + method: 'get', + params: { + ne_id: neId, + }, + timeout: 1_000, + }), + request({ + url: `/api/rest/systemManagement/v1/elementType/pcf/objectType/config/serviceAreaRestriction`, + method: 'get', + params: { + ne_id: neId, + }, + timeout: 1_000, + }), + ]).then(resArr => { + let pccJson: any = new Map(); + let sessJson: any = new Map(); + let qosJson: any = new Map(); + let headerJson: any = new Map(); + let sarJson: any = new Map(); + // 规则数据 + if (resArr[0].status === 'fulfilled') { + const itemV = resArr[0].value; + // 解析数据 + if ( + itemV.code === RESULT_CODE_SUCCESS && + Array.isArray(itemV.data?.data) + ) { + let itemData = itemV.data.data; + itemData.forEach((item: any) => { + pccJson.set(item.ruleId,{ value: item.ruleId, label: item.ruleId }); + }); + } + } + + if (resArr[1].status === 'fulfilled') { + const itemV = resArr[1].value; + // 解析数据 + if ( + itemV.code === RESULT_CODE_SUCCESS && + Array.isArray(itemV.data?.data) + ) { + let itemData = itemV.data.data; + itemData.forEach((item: any) => { + sessJson.set(item.ruleId,{ value: item.ruleId, label: item.ruleId }); + }); + } + } + + if (resArr[2].status === 'fulfilled') { + const itemV = resArr[2].value; + // 解析数据 + if ( + itemV.code === RESULT_CODE_SUCCESS && + Array.isArray(itemV.data?.data) + ) { + let itemData = itemV.data.data; + itemData.forEach((item: any) => { + qosJson.set(item.qosId,{ value: item.qosId, label: item.qosId }); + }); + } + } + + if (resArr[3].status === 'fulfilled') { + const itemV = resArr[3].value; + // 解析数据 + if ( + itemV.code === RESULT_CODE_SUCCESS && + Array.isArray(itemV.data?.data) + ) { + let itemData = itemV.data.data; + itemData.forEach((item: any) => { + headerJson.set(item.templateName,{ + value: item.templateName, + label: item.templateName, + }); + }); + } + } + + if (resArr[4].status === 'fulfilled') { + const itemV = resArr[4].value; + // 解析数据 + if ( + itemV.code === RESULT_CODE_SUCCESS && + Array.isArray(itemV.data?.data) + ) { + let itemData = itemV.data.data; + itemData.forEach((item: any) => { + sarJson.set(item.name,{ value: item.name, label: item.name }); + }); + } + } + + pccJson = Array.from(pccJson.values()); + sessJson = Array.from(sessJson.values()); + qosJson = Array.from(qosJson.values()); + headerJson = Array.from(headerJson.values()); + sarJson = Array.from(sarJson.values()); + + return { pccJson, sessJson, qosJson, headerJson, sarJson }; + }); +} diff --git a/src/api/tool/file.ts b/src/api/tool/file.ts index d19717cd..25b468ba 100644 --- a/src/api/tool/file.ts +++ b/src/api/tool/file.ts @@ -241,6 +241,7 @@ export async function uploadFileToNE( neType, neId, }, + timeout: 30_000, }); return transferToNeFileRes; } diff --git a/src/i18n/locales/en-US.ts b/src/i18n/locales/en-US.ts index 7c25ba90..47676d17 100644 --- a/src/i18n/locales/en-US.ts +++ b/src/i18n/locales/en-US.ts @@ -1012,11 +1012,12 @@ export default { neId:'NE UID', alarmId:'Alarm ID', alarmSeq:'Sequence Number', - alarmObj:'Object', + alarmObj:'Forward Users', + alarmInter:'Forward Interface', alarmTitle:'Alarm Title', - alarmInfo:'Alarm Content', - eventTime:'Generation Time', - logTime:'Record Time' + alarmInfo:'Operation Results', + eventTime:'Event Time', + logTime:'Log Time' }, neFile: { neType:'NE Type', diff --git a/src/i18n/locales/zh-CN.ts b/src/i18n/locales/zh-CN.ts index ae09f536..d7ceeb43 100644 --- a/src/i18n/locales/zh-CN.ts +++ b/src/i18n/locales/zh-CN.ts @@ -1013,8 +1013,9 @@ export default { alarmId:'告警唯一标识', alarmSeq:'告警流水号', alarmObj:'告警前转对象', + alarmInter:'告警前转接口', alarmTitle:'告警标题', - alarmInfo:'告警内容', + alarmInfo:'操作结果', eventTime:'告警产生时间', logTime:'记录时间' }, diff --git a/src/views/logManage/forwarding/index.vue b/src/views/logManage/forwarding/index.vue index ac5c9376..097afc9b 100644 --- a/src/views/logManage/forwarding/index.vue +++ b/src/views/logManage/forwarding/index.vue @@ -80,6 +80,24 @@ let tableColumns: ColumnsType = [ align: 'center', width: 3, }, + { + title: t('views.logManage.forwarding.alarmInter'), + dataIndex: 'interface', + align: 'center', + width: 5, + }, + { + title: t('views.logManage.forwarding.alarmObj'), + dataIndex: 'toUser', + align: 'center', + width: 5, + }, + { + title: t('views.logManage.forwarding.alarmInfo'), + dataIndex: 'operResult', + align: 'center', + width: 6, + }, { title: t('views.logManage.forwarding.type'), dataIndex: 'neType', @@ -104,24 +122,12 @@ let tableColumns: ColumnsType = [ align: 'center', width: 4, }, - { - title: t('views.logManage.forwarding.alarmObj'), - dataIndex: 'toUser', - align: 'center', - width: 5, - }, { title: t('views.logManage.forwarding.alarmTitle'), dataIndex: 'alarmTitle', - align: 'left', + align: 'center', width: 5, }, - { - title: t('views.logManage.forwarding.alarmInfo'), - dataIndex: 'operResult', - align: 'left', - width: 6, - }, { title: t('views.logManage.forwarding.eventTime'), dataIndex: 'eventTime', diff --git a/src/views/neUser/pcf/index.vue b/src/views/neUser/pcf/index.vue index 30c47a78..3ad0f5ad 100644 --- a/src/views/neUser/pcf/index.vue +++ b/src/views/neUser/pcf/index.vue @@ -17,6 +17,7 @@ import { batchDelRule, batchUpdateRule, } from '@/api/neUser/pcf'; +import { getPCCRule } from '@/api/configManage/configParam'; import useNeInfoStore from '@/store/modules/neinfo'; import useI18n from '@/hooks/useI18n'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; @@ -27,6 +28,15 @@ const { t } = useI18n(); /**网元参数 */ let neOtions = ref[]>([]); +/**表单中多选的OPTION */ +const pcfRuleOption = reactive({ + pccOpt: [], + sessOpt: [], + qosOpt: [], + headerOpt: [], + sarOpt: [], +}); + /**查询参数 */ let queryParams = reactive({ /**网元ID */ @@ -102,13 +112,13 @@ let tableColumns = ref([ width: 50, }, { - title: 'QOS Video', + title: 'QoS Video', dataIndex: 'qosVideo', align: 'left', width: 100, }, { - title: 'QOS Audio', + title: 'QoS Audio', dataIndex: 'qosAudio', align: 'left', resizable: true, @@ -214,10 +224,10 @@ let modalState: ModalStateType = reactive({ imsi: '', msisdn: '', qosAudio: '', - pccRules: 'internet|ims_sig', + pccRules: undefined, rfsp: 0, uePolicy: '', - sessRules: 'internet|ims_sig', + sessRules: undefined, sar: '', hdrEnrich: '', qosVideo: '', @@ -247,35 +257,66 @@ const modalStateFrom = Form.useForm( * @param noticeId 网元id, 不传为新增 */ function fnModalVisibleByEdit(row?: Record) { - modalState.isBatch = false; - if (!row) { - modalStateFrom.resetFields(); //重置表单 - modalState.title = t('views.neUser.pcf.addTitle'); - modalState.visibleByEdit = true; - modalState.type = 'add'; - } else { - if (modalState.confirmLoading) return; - const hide = message.loading(t('common.loading'), 0); - modalState.confirmLoading = true; - const neID = queryParams.neId || '-'; - getRule(neID, row.imsi) - .then(res => { - if (res.code === RESULT_CODE_SUCCESS) { - modalState.from = Object.assign(modalState.from, res.data); - modalState.title = t('views.neUser.pcf.updateTitle', { - imsi: row.imsi, + getPCCRule(queryParams.neId) + .then((res: any) => { + pcfRuleOption.pccOpt = res.pccJson; + pcfRuleOption.sessOpt = res.sessJson; + pcfRuleOption.qosOpt = res.qosJson; + pcfRuleOption.headerOpt = res.headerJson; + pcfRuleOption.sarOpt = res.sarJson; + }) + .finally(() => { + modalState.isBatch = false; + if (!row) { + modalStateFrom.resetFields(); //重置表单 + modalState.title = t('views.neUser.pcf.addTitle'); + modalState.visibleByEdit = true; + modalState.type = 'add'; + } else { + if (modalState.confirmLoading) return; + const hide = message.loading(t('common.loading'), 0); + modalState.confirmLoading = true; + const neID = queryParams.neId || '-'; + getRule(neID, row.imsi) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + Object.assign(modalState.from, res.data); + + let pccRules = res.data.pccRules; + if (!pccRules) { + pccRules = []; + } else if (pccRules.includes('|')) { + pccRules = pccRules.split('|'); + } else { + pccRules = [pccRules]; + } + modalState.from.pccRules = pccRules; + let sessRules = res.data.sessRules; + if (!sessRules) { + sessRules = []; + } else if (sessRules.includes('|')) { + sessRules = sessRules.split('|'); + } else { + sessRules = [sessRules]; + } + modalState.from.sessRules = sessRules; + console.log(modalState.from); + + modalState.title = t('views.neUser.pcf.updateTitle', { + imsi: row.imsi, + }); + modalState.visibleByEdit = true; + modalState.type = 'update'; + } else { + message.error(t('common.getInfoFail'), 2); + } + }) + .finally(() => { + hide(); + modalState.confirmLoading = false; }); - modalState.visibleByEdit = true; - modalState.type = 'update'; - } else { - message.error(t('common.getInfoFail'), 2); - } - }) - .finally(() => { - hide(); - modalState.confirmLoading = false; - }); - } + } + }); } /** @@ -283,9 +324,25 @@ function fnModalVisibleByEdit(row?: Record) { * 进行表达规则校验 */ function fnModalOk() { - const from = toRaw(modalState.from); + const from = JSON.parse(JSON.stringify(modalState.from)); from.neId = queryParams.neId || '-'; from.rfsp = Number(from.rfsp) || 0; + console.log(from); + let pccRules = modalState.from.pccRules; + if (Array.isArray(pccRules)) { + pccRules = pccRules.join('|'); + } else { + pccRules = ''; + } + from.pccRules = pccRules; + + let sessRules = modalState.from.sessRules; + if (Array.isArray(sessRules)) { + sessRules = sessRules.join('|'); + } else { + sessRules = ''; + } + from.sessRules = sessRules; let validateArr = ['imsi', 'msisdn']; if (modalState.isBatch) { @@ -382,21 +439,31 @@ function fnModalCancel() { * @param type 类型 */ function fnModalVisibleByBatch(type: 'delete' | 'add' | 'update') { - modalStateFrom.resetFields(); //重置表单 - modalState.isBatch = true; - modalState.type = type; - if (type === 'add') { - modalState.title = t('views.neUser.pcf.batchAddText'); - modalState.visibleByEdit = true; - } - if (type === 'update') { - modalState.title = t('views.neUser.pcf.batchUpdateText'); - modalState.visibleByEdit = true; - } - if (type === 'delete') { - modalState.title = t('views.neUser.pcf.batchDelText'); - modalState.visibleByEdit = true; - } + getPCCRule(queryParams.neId) + .then((res: any) => { + pcfRuleOption.pccOpt = res.pccJson; + pcfRuleOption.sessOpt = res.sessJson; + pcfRuleOption.qosOpt = res.qosJson; + pcfRuleOption.headerOpt = res.headerJson; + pcfRuleOption.sarOpt = res.sarJson; + }) + .finally(() => { + modalStateFrom.resetFields(); //重置表单 + modalState.isBatch = true; + modalState.type = type; + if (type === 'add') { + modalState.title = t('views.neUser.pcf.batchAddText'); + modalState.visibleByEdit = true; + } + if (type === 'update') { + modalState.title = t('views.neUser.pcf.batchUpdateText'); + modalState.visibleByEdit = true; + } + if (type === 'delete') { + modalState.title = t('views.neUser.pcf.batchDelText'); + modalState.visibleByEdit = true; + } + }); } /** @@ -551,6 +618,11 @@ function fnModalUploadImportUpload(file: File) { }); } +/**使其忽略大小写 */ +function filterOption(value: any, option: any) { + return option.value.toUpperCase().indexOf(value.toUpperCase()) >= 0; +} + onMounted(() => { // 获取网元网元列表 useNeInfoStore() @@ -664,7 +736,7 @@ onMounted(() => { {{ t('views.neUser.pcf.checkDel') }} - + {{ t('views.neUser.pcf.batchOper') }} @@ -945,77 +1017,47 @@ onMounted(() => { - - - + mode="tags" + :options="pcfRuleOption.pccOpt" + :title="t('views.neUser.pcf.pccRuleTip')" + /> - - - + mode="tags" + :options="pcfRuleOption.sessOpt" + :title="t('views.neUser.pcf.sessRuleTip')" + /> - - + - - + :options="pcfRuleOption.qosOpt" + :filter-option="filterOption" + /> - - + - - + :options="pcfRuleOption.qosOpt" + :filter-option="filterOption" + /> @@ -1023,20 +1065,12 @@ onMounted(() => { - - - + :options="pcfRuleOption.headerOpt" + :filter-option="filterOption" + /> @@ -1061,22 +1095,13 @@ onMounted(() => { - - + - - + :options="pcfRuleOption.sarOpt" + :filter-option="filterOption" + /> diff --git a/src/views/neUser/sub/index.vue b/src/views/neUser/sub/index.vue index b8e2358a..88cb6449 100644 --- a/src/views/neUser/sub/index.vue +++ b/src/views/neUser/sub/index.vue @@ -493,10 +493,7 @@ const modalStateFrom = Form.useForm( */ function transformData(data: any) { let transformedData = data.map((item: any) => { - if ( - !item.sst || - !item.smallRows.every((smallRow: any) => smallRow.dnn) - ) { + if (!item.sst || !item.smallRows.every((smallRow: any) => smallRow.dnn)) { message.error({ content: `${t('views.neUser.sub.smDataArrTip')}`, duration: 3, @@ -504,7 +501,9 @@ function transformData(data: any) { throw new Error('sst, sd, and all dnn are required fields'); } - let sstSd = item.sd?item.sst + '-' + item.sd:item.sst; + let sstSd = item.sd + ? item.sst + '-' + item.sd.padStart(6, '0') + : item.sst + '-'; let smallRowData = item.smallRows .map((smallRow: any) => { let parts = [smallRow.dnn]; @@ -536,7 +535,9 @@ function transformFormData(data: any) { let json: any = { id: bigIDFlag++, sst: item.split('&')[0].split('-')[0], - sd: item.split('&')[0].split('-')[1]?item.split('&')[0].split('-')[1]:'', + sd: item.split('&')[0].split('-')[1] + ? item.split('&')[0].split('-')[1] + : '', smallRows: [], }; item @@ -1543,17 +1544,21 @@ onMounted(() => { name="row.sst" :label-col="{ span: 5 }" > - - - - - - - - - - - - +
+ + - + +
@@ -2068,17 +2073,21 @@ onMounted(() => { - - - - - - - - - - - - +
+ + - + +
diff --git a/src/views/neUser/ue/index.vue b/src/views/neUser/ue/index.vue index c2d16379..dca1aaba 100644 --- a/src/views/neUser/ue/index.vue +++ b/src/views/neUser/ue/index.vue @@ -59,7 +59,7 @@ type TabeStateType = { let tableState: TabeStateType = reactive({ loading: false, size: 'middle', - seached: true, + seached: false, data: [], selectedRowKeys: [], }); @@ -290,7 +290,7 @@ onMounted(() => { - + { /> - + - + - + + @@ -440,24 +441,27 @@ onMounted(() => { v-for="v in modalState.from.pduSessionInfo" :key="v.dnn" > + + {{ v.pduSessionID }} + + + {{ v.upState }} + {{ v.ipv4 }} {{ v.ipv6 }} {{ v.tai }} - + {{ v.sstSD }} - + {{ v.upfN3IP }} - + {{ v.ranN3IP }} - + {{ v.activeTime }} - - {{ v.pduSessionID }} - diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index 9d09e47a..b0515a8e 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -32,7 +32,20 @@ const { t } = useI18n(); const { getDict } = useDictStore(); /**字体图标可选择数据 */ -let icons = reactive(iconFonts.map(item => ({ value: item, label: item }))); +let icons = reactive( + iconFonts.map((item, i) => { + if (i === 0) { + return { + value: item, + label: item, + }; + } + return { + value: item, + label: 'icon-' + `${i}`.padStart(3, '0'), + }; + }) +); /**字典数据 */ let dict: { @@ -1173,5 +1186,4 @@ onMounted(() => { - +