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] =?UTF-8?q?feat:=20=E7=BB=99AMF/MME=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E7=9A=84IMEI=E7=99=BD=E5=90=8D=E5=8D=95=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=AF=BC=E5=85=A5=E5=92=8C=E6=89=B9=E9=87=8F?= =?UTF-8?q?=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(() => { + + + + + + + + + + + + + + + + + + + + + + +