From 87b4c19f5adcf98eaef33a461e7fb4a696ff819f Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 30 May 2025 14:41:24 +0800 Subject: [PATCH 01/18] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=202.250530?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- .env.production | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.env.development b/.env.development index a5bfbbd4..297ba42a 100644 --- a/.env.development +++ b/.env.development @@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network OMC" VITE_APP_CODE = "OMC" # 应用版本 -VITE_APP_VERSION = "2.250523" +VITE_APP_VERSION = "2.250530" # 接口基础URL地址-不带/后缀 VITE_API_BASE_URL = "/omc-api" diff --git a/.env.production b/.env.production index a5bfbbd4..297ba42a 100644 --- a/.env.production +++ b/.env.production @@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network OMC" VITE_APP_CODE = "OMC" # 应用版本 -VITE_APP_VERSION = "2.250523" +VITE_APP_VERSION = "2.250530" # 接口基础URL地址-不带/后缀 VITE_API_BASE_URL = "/omc-api" From 51097f7bd10d281f9d23e2c1d05e2d9bc764801b Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 30 May 2025 16:49:50 +0800 Subject: [PATCH 02/18] =?UTF-8?q?style:=20=E7=BD=91=E5=85=83=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=85=8D=E7=BD=AE=E4=BF=AE=E6=94=B9tooltip=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E4=B8=BAbottomLeft=E9=98=B2=E6=AD=A2=E9=81=AE?= =?UTF-8?q?=E6=8C=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/ne/neConfig/index.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/views/ne/neConfig/index.vue b/src/views/ne/neConfig/index.vue index ddd73d85..3930437e 100644 --- a/src/views/ne/neConfig/index.vue +++ b/src/views/ne/neConfig/index.vue @@ -481,7 +481,7 @@ onMounted(() => { > From eb1dccd642b73ef3cc256eb33d7e608d4e5c1b74 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 12 Jun 2025 19:40:25 +0800 Subject: [PATCH 09/18] =?UTF-8?q?fix:=20=E6=95=B0=E5=80=BC=E6=8E=A7?= =?UTF-8?q?=E4=BB=B6=E5=B1=9E=E6=80=A7maxlength=E6=8B=BC=E5=86=99=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/neData/udm-voip/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/neData/udm-voip/index.vue b/src/views/neData/udm-voip/index.vue index 115cc618..c7778986 100644 --- a/src/views/neData/udm-voip/index.vue +++ b/src/views/neData/udm-voip/index.vue @@ -835,7 +835,7 @@ onMounted(() => { v-model:value="modalState.from.username" style="width: 100%" :min="4" - :maxlangth="16" + :maxlength="16" :placeholder="t('views.neData.udmVOIP.username')" > From f513b47fb8cc38180226221db0f010260951c754 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 13 Jun 2025 20:12:08 +0800 Subject: [PATCH 10/18] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=202.250613?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- .env.production | 2 +- CHANGELOG.md | 12 ++++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.env.development b/.env.development index eab11384..a2ef0e76 100644 --- a/.env.development +++ b/.env.development @@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network OMC" VITE_APP_CODE = "OMC" # 应用版本 -VITE_APP_VERSION = "2.250607" +VITE_APP_VERSION = "2.250613" # 接口基础URL地址-不带/后缀 VITE_API_BASE_URL = "/omc-api" diff --git a/.env.production b/.env.production index eab11384..a2ef0e76 100644 --- a/.env.production +++ b/.env.production @@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network OMC" VITE_APP_CODE = "OMC" # 应用版本 -VITE_APP_VERSION = "2.250607" +VITE_APP_VERSION = "2.250613" # 接口基础URL地址-不带/后缀 VITE_API_BASE_URL = "/omc-api" diff --git a/CHANGELOG.md b/CHANGELOG.md index fd6e3923..94bff81b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # 版本发布日志 +## 2.2506.2-20250613 + +- 修复 数值控件属性maxlength拼写错误 +- 修复 空格内容无法编辑,提示信息显示方向 +- 优化 抓包文件目录列表显示文件大小 + +## 2.2506.1-20250607 + +- 优化 请求响应码常量,身份信息更换逻辑优化 +- 修复 更新tcpdump路径从/tmp到/usr/local以符合新目录结构 + + ## 2.2505.4-20250530 - 优化 网元参数配置修改tooltip位置为bottomLeft防止遮挡 From d6aa4086e23727466d952fb589462ce3420de07a Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 16 Jun 2025 18:47:13 +0800 Subject: [PATCH 11/18] =?UTF-8?q?feat:=20UDM=20voup/ims=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/neData/udm-voip/index.vue | 85 ++++++++++++++++++++++------ src/views/neData/udm-volte/index.vue | 78 ++++++++++++++++++++----- 2 files changed, 131 insertions(+), 32 deletions(-) diff --git a/src/views/neData/udm-voip/index.vue b/src/views/neData/udm-voip/index.vue index c7778986..98ddb348 100644 --- a/src/views/neData/udm-voip/index.vue +++ b/src/views/neData/udm-voip/index.vue @@ -26,7 +26,8 @@ import useNeListStore from '@/store/modules/ne_list'; import useI18n from '@/hooks/useI18n'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { saveAs } from 'file-saver'; -import { uploadFileToNE } from '@/api/tool/file'; +import { uploadFile } from '@/api/tool/file'; +import { getNeViewFile } from '@/api/tool/neFile'; const { t } = useI18n(); const neListStore = useNeListStore(); /**网元参数 */ @@ -489,15 +490,27 @@ function fnModalUploadImportUpload(file: File) { } const hide = message.loading(t('common.loading'), 0); uploadImportState.loading = true; - uploadFileToNE('UDM', neID, file, 5) + // 上传文件 + let formData = new FormData(); + formData.append('file', file); + formData.append('subPath', 'import'); + uploadFile(formData) .then(res => { if (res.code === RESULT_CODE_SUCCESS) { - return importUDMVOIP({ - neId: neID, - uploadPath: res.data, - }); + return res.data.filePath; + } else { + uploadImportState.msg = res.msg; + uploadImportState.loading = false; + return ''; } - return res; + }) + .then((filePath: string) => { + if (!filePath) return; + // 文件导入 + return importUDMVOIP({ + neId: neID, + uploadPath: filePath, + }); }) .then(res => { if (!res) return; @@ -517,6 +530,33 @@ function fnModalUploadImportUpload(file: File) { }); } +/**对话框表格信息导入失败原因 */ +function fnModalUploadImportFailReason() { + const neId = queryParams.neId; + if (!neId) return; + const hide = message.loading(t('common.loading'), 0); + getNeViewFile({ + neType: 'UDM', + neId: neId, + path: '/tmp', + fileName: 'import_imsuser_err_records.txt', + }) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success(t('common.operateOk'), 3); + const blob = new Blob([res.data], { + type: 'text/plain', + }); + saveAs(blob, `import_udmvoip_err_records_${Date.now()}.txt`); + } else { + message.error(`${res.msg}`, 3); + } + }) + .finally(() => { + hide(); + }); +} + /**对话框表格信息导入模板 */ function fnModalDownloadImportTemplate() { const hide = message.loading(t('common.loading'), 0); @@ -554,7 +594,7 @@ onMounted(() => { if (neOtions.value.length > 0) { queryParams.neId = neOtions.value[0].value; } - + // 获取列表数据 fnGetList(); }); @@ -868,14 +908,13 @@ onMounted(() => { name="username" v-bind="modalStateFrom.validateInfos.username" > - - + { - + + + diff --git a/src/views/neData/udm-volte/index.vue b/src/views/neData/udm-volte/index.vue index 296591d2..fd75450e 100644 --- a/src/views/neData/udm-volte/index.vue +++ b/src/views/neData/udm-volte/index.vue @@ -16,7 +16,8 @@ import useNeListStore from '@/store/modules/ne_list'; import useI18n from '@/hooks/useI18n'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { saveAs } from 'file-saver'; -import { uploadFileToNE } from '@/api/tool/file'; +import { uploadFile } from '@/api/tool/file'; +import { getNeViewFile } from '@/api/tool/neFile'; import { addUDMVolteIMS, batchAddUDMVolteIMS, @@ -541,15 +542,27 @@ function fnModalUploadImportUpload(file: File) { } const hide = message.loading(t('common.loading'), 0); uploadImportState.loading = true; - uploadFileToNE('UDM', neID, file, 5) + // 上传文件 + let formData = new FormData(); + formData.append('file', file); + formData.append('subPath', 'import'); + uploadFile(formData) .then(res => { if (res.code === RESULT_CODE_SUCCESS) { - return importUDMVolteIMS({ - neId: neID, - uploadPath: res.data, - }); + return res.data.filePath; + } else { + uploadImportState.msg = res.msg; + uploadImportState.loading = false; + return ''; } - return res; + }) + .then((filePath: string) => { + if (!filePath) return; + // 文件导入 + return importUDMVolteIMS({ + neId: neID, + uploadPath: filePath, + }); }) .then(res => { if (!res) return; @@ -569,6 +582,33 @@ function fnModalUploadImportUpload(file: File) { }); } +/**对话框表格信息导入失败原因 */ +function fnModalUploadImportFailReason() { + const neId = queryParams.neId; + if (!neId) return; + const hide = message.loading(t('common.loading'), 0); + getNeViewFile({ + neType: 'UDM', + neId: neId, + path: '/tmp', + fileName: 'import_imsuser_err_records.txt', + }) + .then(res => { + if (res.code === RESULT_CODE_SUCCESS) { + message.success(t('common.operateOk'), 3); + const blob = new Blob([res.data], { + type: 'text/plain', + }); + saveAs(blob, `import_udmvolte_err_records_${Date.now()}.txt`); + } else { + message.error(`${res.msg}`, 3); + } + }) + .finally(() => { + hide(); + }); +} + /**对话框表格信息导入模板 */ function fnModalDownloadImportTemplate() { const hide = message.loading(t('common.loading'), 0); @@ -1089,13 +1129,23 @@ onMounted(() => { - + + + From b8c6761fbf1e4694fecba4d99e238626e51fa028 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 20 Jun 2025 14:39:53 +0800 Subject: [PATCH 12/18] =?UTF-8?q?feat:=20=E7=BB=99AMF/MME=E5=AF=B9?= =?UTF-8?q?=E5=BA=94=E7=9A=84IMEI=E7=99=BD=E5=90=8D=E5=8D=95=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=89=B9=E9=87=8F=E5=AF=BC=E5=85=A5=E5=92=8C=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../import_amf_imeiWhitelist_template.xlsx | Bin 0 -> 11068 bytes .../import_amf_whitelist_template.xlsx | Bin 0 -> 11207 bytes .../import_mme_imeiWhitelist_template.xlsx | Bin 0 -> 11058 bytes .../ne/neConfig/hooks/useArrayBatchDel.ts | 84 ++++++++ src/views/ne/neConfig/hooks/useArrayImport.ts | 197 ++++++++++++++++++ src/views/ne/neConfig/index.vue | 139 +++++++++++- 6 files changed, 416 insertions(+), 4 deletions(-) create mode 100644 public/neDataImput/import_amf_imeiWhitelist_template.xlsx create mode 100644 public/neDataImput/import_amf_whitelist_template.xlsx create mode 100644 public/neDataImput/import_mme_imeiWhitelist_template.xlsx create mode 100644 src/views/ne/neConfig/hooks/useArrayBatchDel.ts create mode 100644 src/views/ne/neConfig/hooks/useArrayImport.ts diff --git a/public/neDataImput/import_amf_imeiWhitelist_template.xlsx b/public/neDataImput/import_amf_imeiWhitelist_template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3cf6169b7c9887ba336ed67ec02736516c04bfdf GIT binary patch literal 11068 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 literal 0 HcmV?d00001 diff --git a/public/neDataImput/import_amf_whitelist_template.xlsx b/public/neDataImput/import_amf_whitelist_template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..509ba8f78d8e015f75c4955e1907c84ff97eaefa GIT binary patch literal 11207 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 literal 0 HcmV?d00001 diff --git a/src/views/ne/neConfig/hooks/useArrayBatchDel.ts b/src/views/ne/neConfig/hooks/useArrayBatchDel.ts new file mode 100644 index 00000000..148dd7c9 --- /dev/null +++ b/src/views/ne/neConfig/hooks/useArrayBatchDel.ts @@ -0,0 +1,84 @@ +import { delNeConfigData } from '@/api/ne/neConfig'; +import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; +import { message } from 'ant-design-vue'; +import { reactive, toRaw } from 'vue'; + +/** + * 批量删除array + * @param param 父级传入 { t, neTypeSelect, fnActiveConfigNode } + * @returns + */ +export default function useArrayBatch({ + t, + neTypeSelect, + fnActiveConfigNode, +}: any) { + /**状态属性 */ + const batchState = reactive({ + open: false, + loading: false, //批量删除 + paramName: '', + startIndex: 1, + num: 1, + }); + + /**对话框表格信息导入弹出窗口 */ + function modalBatchOpen(paramName: string) { + batchState.paramName = paramName; + batchState.open = true; + } + function modalBatchClose() { + if (batchState.loading) { + message.error({ + content: 'Delete is in progress, please wait for it to complete', + duration: 3, + }); + return; + } + batchState.open = false; + batchState.loading = false; + batchState.startIndex = 1; + batchState.num = 1; + fnActiveConfigNode('#') + } + + async function modalBatchOk() { + let okNum = 0; + let failNum = 0; + const endIndex = batchState.startIndex + batchState.num - 1; + for (let i = endIndex; i >= batchState.startIndex; i--) { + const res = await delNeConfigData({ + neType: neTypeSelect.value[0], + neId: neTypeSelect.value[1], + paramName: batchState.paramName, + loc: `${i}`, + }); + if (res.code === RESULT_CODE_SUCCESS) { + okNum++; + } else { + failNum++; + break; + } + } + + if (okNum > 0) { + message.success({ + content: `Successfully deleted ${okNum} items`, + duration: 3, + }); + } + if (failNum > 0) { + message.error({ + content: `Delete failed, please check the index range`, + duration: 3, + }); + } + } + + return { + batchState, + modalBatchOpen, + modalBatchClose, + modalBatchOk, + }; +} diff --git a/src/views/ne/neConfig/hooks/useArrayImport.ts b/src/views/ne/neConfig/hooks/useArrayImport.ts new file mode 100644 index 00000000..53114a6e --- /dev/null +++ b/src/views/ne/neConfig/hooks/useArrayImport.ts @@ -0,0 +1,197 @@ +import { addNeConfigData, editNeConfigData } from '@/api/ne/neConfig'; +import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; +import { readSheet } from '@/utils/execl-utils'; +import { message } from 'ant-design-vue'; +import { reactive, toRaw } from 'vue'; +import saveAs from 'file-saver'; + +/** + * 导入文件加array + * @param param 父级传入 { t, neTypeSelect, arrayState, fnActiveConfigNode } + * @returns + */ +export default function useArrayImport({ + t, + neTypeSelect, + arrayState, + fnActiveConfigNode, +}: any) { + /**网元导入模板解析 */ + const m: Record = { + AMF: { + imeiWhitelist: { + filename: 'import_amf_imeiWhitelist_template', + fileetx: '.xlsx', + item: (row: Record) => { + return { + imeiPrefixValue: row['IMEI Prefix'], + index: row['Index'], + }; + }, + }, + whitelist: { + filename: 'import_amf_whitelist_template', + fileetx: '.xlsx', + item: (row: Record) => { + return { + imsiValue: row['IMSI Value'], + imeiValue: row['IMEI Value/Prefix'], + index: row['Index'], + }; + }, + }, + }, + MME: { + white_list: { + filename: 'import_mme_imeiWhitelist_template', + fileetx: '.xlsx', + item: (row: Record) => { + return { + imei: row['IMEI'], + index: row['Index'], + }; + }, + }, + }, + }; + + /**状态属性 */ + const importState = reactive({ + open: false, + msgArr: [] as string[], + loading: false, //开始导入 + item: null as any, + paramName: '', + filename: '', + fileetx: '', + }); + + /**对话框表格信息导入弹出窗口 */ + function modalImportOpen(neType: string, paramName: string) { + const tmpM = m[neType][paramName]; + importState.item = tmpM.item; + importState.paramName = paramName; + importState.filename = tmpM.filename; + importState.fileetx = tmpM.fileetx; + importState.open = true; + } + function modalImportClose() { + if (importState.loading) { + message.error({ + content: 'Import is in progress, please wait for it to complete', + duration: 3, + }); + return; + } + importState.open = false; + importState.msgArr = []; + importState.loading = false; + fnActiveConfigNode('#'); + } + + /**对话框表格信息导入上传 */ + async function modalImportUpload(file: File) { + const hide = message.loading(t('common.loading'), 0); + const [neType, neId] = neTypeSelect.value; + importState.msgArr = []; + + // 获取最大index + let index = 0; + if (arrayState.columnsData.length <= 0) { + index = 1; + } else { + const last = arrayState.columnsData[arrayState.columnsData.length - 1]; + index = last.index.value + 1; + } + + const reader = new FileReader(); + reader.onload = function (e: any) { + const arrayBuffer = e.target.result; + readSheet(arrayBuffer).then(async rows => { + if (rows.length <= 0) { + hide(); + message.error({ + content: t('views.neData.baseStation.importDataEmpty'), + duration: 3, + }); + return; + } + // 开始导入 + importState.loading = true; + for (const row of rows) { + const rowItem = importState.item(row); + let result: any = null; + // 检查index是否定义 + const hasIndex = arrayState.columnsData.find( + (item: any) => item.index.value === rowItem.index + ); + if (hasIndex) { + result = await editNeConfigData({ + neType: neType, + neId: neId, + paramName: importState.paramName, + paramData: rowItem, + loc: `${rowItem.index}`, + }); + let msg = `update ${rowItem.index} fail`; + if (result.code === RESULT_CODE_SUCCESS) { + msg = `update ${rowItem.index} success`; + } + importState.msgArr.push(msg); + } else { + // 未定义则新增 + result = await addNeConfigData({ + neType: neType, + neId: neId, + paramName: importState.paramName, + paramData: Object.assign(rowItem, { index }), + loc: `${index}`, + }); + let msg = `add ${index} fail`; + if (result.code === RESULT_CODE_SUCCESS) { + index += 1; + msg = `add ${index} success`; + } + importState.msgArr.push(msg); + } + } + + hide(); + importState.loading = false; + }); + }; + reader.onerror = function (e) { + hide(); + console.error('reader file error:', e); + }; + reader.readAsArrayBuffer(file); + } + + /**对话框表格信息导入模板 */ + function modalImportTemplate() { + const hide = message.loading(t('common.loading'), 0); + + const baseUrl = import.meta.env.VITE_HISTORY_BASE_URL; + const templateUrl = `${ + baseUrl.length === 1 && baseUrl.indexOf('/') === 0 + ? '' + : baseUrl.indexOf('/') === -1 + ? '/' + baseUrl + : baseUrl + }/neDataImput`; + saveAs( + `${templateUrl}/${importState.filename}${importState.fileetx}`, + `${importState.filename}_${Date.now()}${importState.fileetx}` + ); + + hide(); + } + + return { + importState, + modalImportOpen, + modalImportClose, + modalImportUpload, + modalImportTemplate, + }; +} diff --git a/src/views/ne/neConfig/index.vue b/src/views/ne/neConfig/index.vue index 783a2e95..ec819dd5 100644 --- a/src/views/ne/neConfig/index.vue +++ b/src/views/ne/neConfig/index.vue @@ -12,6 +12,8 @@ import useOptions from './hooks/useOptions'; import useConfigList from './hooks/useConfigList'; import useConfigArray from './hooks/useConfigArray'; import useConfigArrayChild from './hooks/useConfigArrayChild'; +import useArrayImport from './hooks/useArrayImport'; +import useArrayBatchDel from './hooks/useArrayBatchDel'; import { getAllNeConfig, getNeConfigData } from '@/api/ne/neConfig'; const neListStore = useNeListStore(); const { t } = useI18n(); @@ -225,10 +227,13 @@ function fnGetNeConfig() { } else { paramPerms = ['post', 'put', 'delete']; } + const title = item.paramDisplay; + // 处理字符串开头特殊字符 + item.paramDisplay = title.replace(/[└─]+/, ''); arr.push({ ...item, children: undefined, - title: item.paramDisplay, + title: title, key: item.paramName, paramPerms, }); @@ -362,6 +367,21 @@ const { arrayEditClose, }); +const { + importState, + modalImportOpen, + modalImportClose, + modalImportUpload, + modalImportTemplate, +} = useArrayImport({ t, neTypeSelect, arrayState, fnActiveConfigNode }); + +const { batchState, modalBatchOpen, modalBatchClose, modalBatchOk } = + useArrayBatchDel({ + t, + neTypeSelect, + fnActiveConfigNode, + }); + onMounted(() => { // 获取网元网元列表 neCascaderOptions.value = neListStore.getNeCascaderOptions.filter( @@ -428,7 +448,7 @@ onMounted(() => { -   +   + { :size="arrayState.size" :pagination="tablePagination" :bordered="true" - :scroll="{ x: arrayState.columnsDnd.length * 200, y: 480 }" + :scroll="{ x: arrayState.columnsDnd.length * 200, y: '500px' }" @resizeColumn="(w:number, col:any) => (col.width = w)" :show-expand-column="false" v-model:expanded-row-keys="arrayState.arrayChildExpandKeys" @@ -628,6 +649,38 @@ onMounted(() => { :columns="treeState.selectNode.paramPerms.includes('get') ? [...arrayState.columns.filter((s:any)=>s.key !== 'index')] : arrayState.columns" v-model:columns-dnd="arrayState.columnsDnd" > + + @@ -905,6 +958,84 @@ onMounted(() => { + + + + + + + + + + + + + + + + + + + + + + + From b6468eecab9fca488fb0c125257df2a378d72721 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 20 Jun 2025 14:54:53 +0800 Subject: [PATCH 13/18] =?UTF-8?q?feat:=20UDM=E7=AD=BE=E7=BA=A6cnType?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8F=AF=E9=80=891=E4=BB=855G/2=E4=BB=854G?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/i18n/locales/en-US.ts | 4 ++++ src/i18n/locales/zh-CN.ts | 4 ++++ src/views/neData/udm-sub/index.vue | 10 ++++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/i18n/locales/en-US.ts b/src/i18n/locales/en-US.ts index 2571e585..485d9614 100644 --- a/src/i18n/locales/en-US.ts +++ b/src/i18n/locales/en-US.ts @@ -877,6 +877,10 @@ export default { rfspTip:'RFSP index, in NG-RAN, the index of a specific RRM configuration, parameter between 0 and 127', ueTypeTip: 'Operator-defined subscriber UE Usage Type, integer, parameter between 0 and 127', cnFlag: 'Whether to enable 5G Core Network service', + cnFlag0: 'No Access Allowed', + cnFlag1: 'Access Only 5G', + cnFlag2: 'Access Only 4G', + cnFlag3: 'Access 4G/5G', epsFlagTip: 'Whether to enable 4G EPS service', contextIdTip: 'To sign up for an APN Context ID, you must select it from the APN Context list.', apnContextTip: 'The list of APNs available to the phone, up to six, is defined in the HSS.', diff --git a/src/i18n/locales/zh-CN.ts b/src/i18n/locales/zh-CN.ts index 740035f4..6afa5faa 100644 --- a/src/i18n/locales/zh-CN.ts +++ b/src/i18n/locales/zh-CN.ts @@ -877,6 +877,10 @@ export default { rfspTip:'RFSP 索引,在 NG-RAN 中,特定 RRM 配置的索引,参数介于0到127之间', ueTypeTip: '运营商定义的用户 UE Usage Type,整型,参数介于0到127之间', cnFlag: '是否开启 5G Core Network 服务', + cnFlag0: '不允许接入', + cnFlag1: '只能接入 5G', + cnFlag2: '只能接入 4G', + cnFlag3: '允许接入 4G/5G', epsFlagTip: '是否开启 4G EPS 服务', contextIdTip: '签约APN 上下文ID,必须从APN Context list 中选择。', apnContextTip: '手机可用的APN列表,最多六个,在HSS中定义。', diff --git a/src/views/neData/udm-sub/index.vue b/src/views/neData/udm-sub/index.vue index 0eb3a9ea..232c5142 100644 --- a/src/views/neData/udm-sub/index.vue +++ b/src/views/neData/udm-sub/index.vue @@ -1668,10 +1668,16 @@ onMounted(() => { > - {{ t('views.neUser.sub.enable') }} + {{ t('views.neUser.sub.cnFlag3') }} + + + {{ t('views.neUser.sub.cnFlag2') }} + + + {{ t('views.neUser.sub.cnFlag1') }} - {{ t('views.neUser.sub.disable') }} + {{ t('views.neUser.sub.cnFlag0') }} From 673b8f9ad2d2d32ea55115463aedf87463edc8c3 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 20 Jun 2025 19:30:30 +0800 Subject: [PATCH 14/18] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=202.250620?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94bff81b..8fc5857b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # 版本发布日志 +## 2.2506.3-20250620 + +- 新增 UDM签约cnType新增可选1仅5G/2仅4G +- 新增 给AMF/MME对应的IMEI白名单添加批量导入和批量删除功能 +- 新增 UDM voup/ims导入失败文件下载 + ## 2.2506.2-20250613 - 修复 数值控件属性maxlength拼写错误 From 5704ff09c3d2a37580ee8f7a0f0824db3ff53dc5 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 24 Jun 2025 17:13:18 +0800 Subject: [PATCH 15/18] =?UTF-8?q?fix:=20UDM-IMS=E6=95=B0=E6=8D=AE=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=96=B0=E5=A2=9E/=E6=89=B9=E9=87=8F=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=91=BD=E4=BB=A4=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/neData/udm_volte_ims.ts | 18 ++- src/views/neData/udm-volte/index.vue | 162 +++++++++++++++++++-------- 2 files changed, 127 insertions(+), 53 deletions(-) diff --git a/src/api/neData/udm_volte_ims.ts b/src/api/neData/udm_volte_ims.ts index 7a96bd30..7b65f0fb 100644 --- a/src/api/neData/udm_volte_ims.ts +++ b/src/api/neData/udm_volte_ims.ts @@ -71,13 +71,16 @@ export function batchAddUDMVolteIMS(data: Record, num: number) { /** * UDMVolteIMS用户删除 - * @param data 签约对象 + * @param neId 网元ID + * @param imsi_msisdn IMSI/MSISDN + * @param tag 标签 0-voip 1-volte * @returns object */ -export function delUDMVolteIMS(neId: string, imsi: string) { +export function delUDMVolteIMS(neId: string, imsi_msisdn: string, tag: string) { return request({ - url: `/neData/udm/volte-ims/${neId}/${imsi}`, + url: `/neData/udm/volte-ims/${neId}/${imsi_msisdn}`, method: 'DELETE', + params: { volte: tag }, timeout: 180_000, }); } @@ -87,12 +90,19 @@ export function delUDMVolteIMS(neId: string, imsi: string) { * @param neId 网元ID * @param imsi IMSI * @param num 数量 + * @param tag 标签 0-voip 1-volte * @returns object */ -export function batchDelUDMVolteIMS(neId: string, imsi: string, num: number) { +export function batchDelUDMVolteIMS( + neId: string, + imsi: string, + num: number, + tag: string +) { return request({ url: `/neData/udm/volte-ims/${neId}/${imsi}/${num}`, method: 'DELETE', + params: { volte: tag }, timeout: 180_000, }); } diff --git a/src/views/neData/udm-volte/index.vue b/src/views/neData/udm-volte/index.vue index fd75450e..0c96e32e 100644 --- a/src/views/neData/udm-volte/index.vue +++ b/src/views/neData/udm-volte/index.vue @@ -94,7 +94,7 @@ type TabeStateType = { data: object[]; /**勾选记录 */ selectedRowKeys: (string | number)[]; - selectedRowIMSIs: (string | number)[]; + selectedRowIMSIs: Record[]; }; /**表格状态 */ @@ -203,7 +203,13 @@ function fnTableSize({ key }: MenuInfo) { /**表格多选 */ function fnTableSelectedRowKeys(keys: (string | number)[], rows: any[]) { tableState.selectedRowKeys = keys; - tableState.selectedRowIMSIs = rows.map(item => item.imsi); + tableState.selectedRowIMSIs = rows.map(item => { + return { + imsi: item.imsi, + msisdn: item.msisdn, + tag: item.tag, + }; + }); } /**对话框对象信息状态类型 */ @@ -309,7 +315,12 @@ function fnModalOk() { result = batchAddUDMVolteIMS(from, from.num); } if (modalState.type === 'delete') { - result = batchDelUDMVolteIMS(from.neId, from.imsi, from.num); + result = batchDelUDMVolteIMS( + from.neId, + `${from.imsi}_${from.msisdn}`, + from.num, + from.tag + ); } } else { if (modalState.type === 'add') { @@ -375,15 +386,14 @@ function fnModalVisibleByBatch(type: 'delete' | 'add') { /** * 记录删除 - * @param imsi 网元编号ID + * @param id 记录ID */ -function fnRecordDelete(imsi: string) { +function fnRecordDelete(id: string) { const neID = queryParams.neId; if (!neID) return; - let msg = imsi; - if (imsi === '0') { - msg = `${tableState.selectedRowIMSIs[0]}... ${tableState.selectedRowIMSIs.length}`; - imsi = tableState.selectedRowIMSIs.join(','); + let msg = id; + if (id === '0') { + msg = `${tableState.selectedRowIMSIs[0].imsi}... ${tableState.selectedRowIMSIs.length}`; } Modal.confirm({ @@ -391,17 +401,34 @@ function fnRecordDelete(imsi: string) { content: t('views.neData.udmVolteIMS.delTip', { num: msg }), onOk() { const hide = message.loading(t('common.loading'), 0); - delUDMVolteIMS(neID, imsi) - .then(res => { - if (res.code === RESULT_CODE_SUCCESS) { - message.success(t('common.operateOk'), 3); - fnGetList(); - } else { - message.error({ - content: `${res.msg}`, - duration: 3, - }); - } + let reqArr: any[] = []; + if (id === '0') { + const volteArr = tableState.selectedRowIMSIs + .filter(item => item.tag == '1') + .map(item => `${item.imsi}_${item.msisdn}`) + .join(','); + if (volteArr.length > 0) { + reqArr.push(delUDMVolteIMS(neID, volteArr, '1')); + } + const voipArr = tableState.selectedRowIMSIs + .filter(item => item.tag == '0') + .map(item => `${item.imsi}_${item.msisdn}`) + .join(','); + if (voipArr.length > 0) { + reqArr.push(delUDMVolteIMS(neID, voipArr, '0')); + } + } else { + const record: any = tableState.data.find((item: any) => item.id === id); + if (record) { + reqArr = [ + delUDMVolteIMS(neID, `${record.imsi}_${record.msisdn}`, record.tag), + ]; + } + } + Promise.all(reqArr) + .then(() => { + message.success(t('common.operateOk'), 3); + fnGetList(); }) .finally(() => { hide(); @@ -887,7 +914,7 @@ onMounted(() => { + { : '' " :label=" - modalState.isBatch && modalState.from.tag === '0' + modalState.isBatch ? t('views.neData.udmVolteIMS.startMSISDN') : 'MSISDN' " From 1566392c19b46b54963594a99fb454d5d2e4a855 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 24 Jun 2025 17:13:57 +0800 Subject: [PATCH 16/18] =?UTF-8?q?feat:=20AMF/MME=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E7=9A=84IMEI=E7=99=BD=E5=90=8D=E5=8D=95=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=8E=BB=E9=99=A4index?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../import_amf_imeiWhitelist_template.xlsx | Bin 11068 -> 10953 bytes .../import_amf_whitelist_template.xlsx | Bin 11207 -> 11104 bytes .../import_mme_imeiWhitelist_template.xlsx | Bin 11058 -> 10947 bytes .../ne/neConfig/hooks/useArrayBatchDel.ts | 3 +- src/views/ne/neConfig/hooks/useArrayImport.ts | 32 +++++++++++------- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/public/neDataImput/import_amf_imeiWhitelist_template.xlsx b/public/neDataImput/import_amf_imeiWhitelist_template.xlsx index 3cf6169b7c9887ba336ed67ec02736516c04bfdf..8716464a7b0754dedb92a9149e0311a2552f38c9 100644 GIT binary patch delta 4761 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 D`;;Ne diff --git a/public/neDataImput/import_amf_whitelist_template.xlsx b/public/neDataImput/import_amf_whitelist_template.xlsx index 509ba8f78d8e015f75c4955e1907c84ff97eaefa..26b66e5a2701c73ffe54036e896ebe1d49837f66 100644 GIT binary patch delta 5169 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 delta 5251 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 delta 5213 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 D3In%3 diff --git a/src/views/ne/neConfig/hooks/useArrayBatchDel.ts b/src/views/ne/neConfig/hooks/useArrayBatchDel.ts index 148dd7c9..78857c28 100644 --- a/src/views/ne/neConfig/hooks/useArrayBatchDel.ts +++ b/src/views/ne/neConfig/hooks/useArrayBatchDel.ts @@ -39,7 +39,7 @@ export default function useArrayBatch({ batchState.loading = false; batchState.startIndex = 1; batchState.num = 1; - fnActiveConfigNode('#') + fnActiveConfigNode('#'); } async function modalBatchOk() { @@ -73,6 +73,7 @@ export default function useArrayBatch({ duration: 3, }); } + modalBatchClose(); } return { diff --git a/src/views/ne/neConfig/hooks/useArrayImport.ts b/src/views/ne/neConfig/hooks/useArrayImport.ts index 53114a6e..2dd28b68 100644 --- a/src/views/ne/neConfig/hooks/useArrayImport.ts +++ b/src/views/ne/neConfig/hooks/useArrayImport.ts @@ -22,21 +22,23 @@ export default function useArrayImport({ imeiWhitelist: { filename: 'import_amf_imeiWhitelist_template', fileetx: '.xlsx', + itemKey: 'imeiPrefixValue', item: (row: Record) => { return { imeiPrefixValue: row['IMEI Prefix'], - index: row['Index'], + index: 0, }; }, }, whitelist: { filename: 'import_amf_whitelist_template', fileetx: '.xlsx', + itemKey: 'imsiValue', item: (row: Record) => { return { imsiValue: row['IMSI Value'], imeiValue: row['IMEI Value/Prefix'], - index: row['Index'], + index: 0, }; }, }, @@ -45,10 +47,11 @@ export default function useArrayImport({ white_list: { filename: 'import_mme_imeiWhitelist_template', fileetx: '.xlsx', + itemKey: 'imei', item: (row: Record) => { return { imei: row['IMEI'], - index: row['Index'], + index: 0, }; }, }, @@ -60,7 +63,8 @@ export default function useArrayImport({ open: false, msgArr: [] as string[], loading: false, //开始导入 - item: null as any, + itemKey: '', // 解析item的key + item: null as any, // 解析item方法 paramName: '', filename: '', fileetx: '', @@ -69,6 +73,7 @@ export default function useArrayImport({ /**对话框表格信息导入弹出窗口 */ function modalImportOpen(neType: string, paramName: string) { const tmpM = m[neType][paramName]; + importState.itemKey = tmpM.itemKey; importState.item = tmpM.item; importState.paramName = paramName; importState.filename = tmpM.filename; @@ -98,7 +103,7 @@ export default function useArrayImport({ // 获取最大index let index = 0; if (arrayState.columnsData.length <= 0) { - index = 1; + index = 0; } else { const last = arrayState.columnsData[arrayState.columnsData.length - 1]; index = last.index.value + 1; @@ -120,12 +125,15 @@ export default function useArrayImport({ importState.loading = true; for (const row of rows) { const rowItem = importState.item(row); + const rowKey = rowItem[importState.itemKey]; let result: any = null; // 检查index是否定义 - const hasIndex = arrayState.columnsData.find( - (item: any) => item.index.value === rowItem.index + const has = arrayState.columnsData.find( + (item: any) => item[importState.itemKey].value === rowKey ); - if (hasIndex) { + if (has) { + // 已定义则更新 + rowItem.index = has.index.value; result = await editNeConfigData({ neType: neType, neId: neId, @@ -133,9 +141,9 @@ export default function useArrayImport({ paramData: rowItem, loc: `${rowItem.index}`, }); - let msg = `update ${rowItem.index} fail`; + let msg = `index:${rowItem.index} update fail`; if (result.code === RESULT_CODE_SUCCESS) { - msg = `update ${rowItem.index} success`; + msg = `index:${rowItem.index} update success`; } importState.msgArr.push(msg); } else { @@ -147,10 +155,10 @@ export default function useArrayImport({ paramData: Object.assign(rowItem, { index }), loc: `${index}`, }); - let msg = `add ${index} fail`; + let msg = `index:${index} add fail`; if (result.code === RESULT_CODE_SUCCESS) { + msg = `index:${index} add success`; index += 1; - msg = `add ${index} success`; } importState.msgArr.push(msg); } From a2a7ec38574bdda967209b83a92adeae5c108263 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 27 Jun 2025 19:33:51 +0800 Subject: [PATCH 17/18] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=202.2506.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- .env.production | 2 +- CHANGELOG.md | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.env.development b/.env.development index a2ef0e76..98a7b1ff 100644 --- a/.env.development +++ b/.env.development @@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network OMC" VITE_APP_CODE = "OMC" # 应用版本 -VITE_APP_VERSION = "2.250613" +VITE_APP_VERSION = "2.2506.4" # 接口基础URL地址-不带/后缀 VITE_API_BASE_URL = "/omc-api" diff --git a/.env.production b/.env.production index a2ef0e76..98a7b1ff 100644 --- a/.env.production +++ b/.env.production @@ -11,7 +11,7 @@ VITE_APP_NAME = "Core Network OMC" VITE_APP_CODE = "OMC" # 应用版本 -VITE_APP_VERSION = "2.250613" +VITE_APP_VERSION = "2.2506.4" # 接口基础URL地址-不带/后缀 VITE_API_BASE_URL = "/omc-api" diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fc5857b..98972264 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # 版本发布日志 +## 2.2506.4-20250627 + +- 修复 UDM-IMS数据批量新增/批量删除命令调整 +- 优化 AMF/MME对应的IMEI白名单模板去除index + ## 2.2506.3-20250620 - 新增 UDM签约cnType新增可选1仅5G/2仅4G From 2181d519998ea9b782ebfe0f32c0ab2d8a9f6eec Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 30 Jun 2025 16:17:07 +0800 Subject: [PATCH 18/18] =?UTF-8?q?fix:=20=E5=8F=82=E6=95=B0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=8F=AF=E8=A7=81visible=E5=B1=9E=E6=80=A7=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/ne/neConfig/index.vue | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/views/ne/neConfig/index.vue b/src/views/ne/neConfig/index.vue index ec819dd5..6633e02e 100644 --- a/src/views/ne/neConfig/index.vue +++ b/src/views/ne/neConfig/index.vue @@ -221,6 +221,13 @@ function fnGetNeConfig() { if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) { const arr = []; for (const item of res.data) { + // 是否可见 + if (!item['visible']) { + item['visible'] = 'public'; + } else if (item['visible'] == 'hide') { + continue; + } + // 权限控制 let paramPerms: string[] = []; if (item.paramPerms) { paramPerms = item.paramPerms.split(',');