From 42464bc5bd3c0528651e737757cbf8847e4068e8 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 16 Jul 2025 10:29:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8F=82=E6=95=B0=E9=85=8D=E7=BD=AEime?= =?UTF-8?q?iWhitelist=E6=89=B9=E9=87=8F=E5=AF=BC=E5=85=A5xlsx=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../import_amf_imeiWhitelist_template.xlsx | Bin 0 -> 10932 bytes .../import_amf_whitelist_template.xlsx | Bin 0 -> 11086 bytes .../import_mme_imeiWhitelist_template.xlsx | Bin 0 -> 10924 bytes src/views/ne/neConfig/components/Base.vue | 23 +- .../ne/neConfig/hooks/useArrayBatchDel.ts | 85 +++++++ src/views/ne/neConfig/hooks/useArrayImport.ts | 205 +++++++++++++++++ src/views/ne/neConfig/index.vue | 217 +++++++++++++----- 7 files changed, 461 insertions(+), 69 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..eadaf9b62b82e42b0435788580ba844d4f076deb GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/public/neDataImput/import_mme_imeiWhitelist_template.xlsx b/public/neDataImput/import_mme_imeiWhitelist_template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9d37feff4ebfa491e02f92801fe136b177a4a0a8 GIT binary patch literal 10924 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 O@TCs4I4;uXU;hUlK#%1B literal 0 HcmV?d00001 diff --git a/src/views/ne/neConfig/components/Base.vue b/src/views/ne/neConfig/components/Base.vue index 8de2fa72..3c8f633c 100644 --- a/src/views/ne/neConfig/components/Base.vue +++ b/src/views/ne/neConfig/components/Base.vue @@ -5,7 +5,6 @@ import { Form, message } from 'ant-design-vue/es'; import useI18n from '@/hooks/useI18n'; import useNeInfoStore from '@/store/modules/neinfo'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; -import { addNeHost, updateNeHost } from '@/api/ne/neHost'; import { getNeConfigData, addNeConfigData, @@ -208,14 +207,14 @@ watch( // =============== 处理函数 -const supportMapper = { +const supportMapper: Record = { AMF: [ { type: 'array', name: 'guami', display: 'GUAMI List', key: ['plmnId'], - item: (index, param, lastItem) => { + item: (index: any, param: any, lastItem: any) => { const plmn = `${param.plmnId.mcc}${param.plmnId.mnc}`; return { index: index, @@ -231,7 +230,7 @@ const supportMapper = { name: 'tai', display: 'TAI List', key: ['plmnId'], - item: (index, param, lastItem) => { + item: (index: any, param: any, lastItem: any) => { const plmn = `${param.plmnId.mcc}${param.plmnId.mnc}`; return { index: index, @@ -245,7 +244,7 @@ const supportMapper = { name: 'slice', display: 'Slice List', key: ['plmnId'], - item: (index, param, lastItem) => { + item: (index: any, param: any, lastItem: any) => { const plmn = `${param.plmnId.mcc}${param.plmnId.mnc}`; const sdStr = param.snssai.sd.padStart(6, '0'); return { @@ -263,7 +262,7 @@ const supportMapper = { name: 'plmn', display: 'PLMN List', key: ['mcc', 'mnc'], - item: (index, param, lastItem) => { + item: (index: any, param: any, lastItem: any) => { const plmn = `${param.plmnId.mcc}${param.plmnId.mnc}`; const mccDomain = param.plmnId.mcc.padStart(3, '0'); const domain = `ims.mnc${param.plmnId.mnc}.mcc${mccDomain}.3gppnetwork.org`; @@ -295,7 +294,7 @@ const supportMapper = { name: 'gummei', display: 'Gummei List', key: ['plmnId'], - item: (index, param, lastItem) => { + item: (index: any, param: any, lastItem: any) => { const plmn = `${param.plmnId.mcc}${param.plmnId.mnc}`; return Object.assign(lastItem, { index: index, @@ -308,7 +307,7 @@ const supportMapper = { name: 'tai', display: 'TAI List', key: ['plmnId'], - item: (index, param, lastItem) => { + item: (index: any, param: any, lastItem: any) => { const plmn = `${param.plmnId.mcc}${param.plmnId.mnc}`; return { index: index, @@ -322,7 +321,7 @@ const supportMapper = { name: 'hss', display: 'HSS List', key: ['imsiPre'], - item: (index, param, lastItem) => { + item: (index: any, param: any, lastItem: any) => { const plmn = `${param.plmnId.mcc}${param.plmnId.mnc}`; return Object.assign(lastItem, { index: index, @@ -335,7 +334,7 @@ const supportMapper = { name: 'sgw', display: 'SGW List', key: ['plmnId'], - item: (index, param, lastItem) => { + item: (index: any, param: any, lastItem: any) => { const plmn = `${param.plmnId.mcc}${param.plmnId.mnc}`; return Object.assign(lastItem, { index: index, @@ -429,7 +428,7 @@ async function toConfig( vArr.push(item[rule.key]); } if (vArr.includes(plmn)) { - const item = res.data.find(s => s[rule.key] == plmn); + const item = res.data.find((s: any) => s[rule.key] == plmn); if (!item) { // console.log('没有找到', rule.name, index); errMsgArr.push(`${ntType}_${neId} ${rule.display} not found`); @@ -450,7 +449,7 @@ async function toConfig( errMsgArr.push(`${ntType}_${neId} ${rule.display} modify ${state}`); } else { let lastIndex = 0; - const arr = res.data.sort((a, b) => b.index - a.index); + const arr = res.data.sort((a: any, b: any) => b.index - a.index); if (arr.length != 0) { lastIndex = arr[0].index + 1; } diff --git a/src/views/ne/neConfig/hooks/useArrayBatchDel.ts b/src/views/ne/neConfig/hooks/useArrayBatchDel.ts new file mode 100644 index 00000000..55fc99b5 --- /dev/null +++ b/src/views/ne/neConfig/hooks/useArrayBatchDel.ts @@ -0,0 +1,85 @@ +import { delNeConfigData } from '@/api/ne/neConfig'; +import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; +import { message } from 'ant-design-vue'; +import { reactive } 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, + }); + } + modalBatchClose(); + } + + 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..68d2ecd4 --- /dev/null +++ b/src/views/ne/neConfig/hooks/useArrayImport.ts @@ -0,0 +1,205 @@ +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 } 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', + itemKey: 'imeiPrefixValue', + item: (row: Record) => { + return { + imeiPrefixValue: row['IMEI Prefix'], + 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: 0, + }; + }, + }, + }, + MME: { + white_list: { + filename: 'import_mme_imeiWhitelist_template', + fileetx: '.xlsx', + itemKey: 'imei', + item: (row: Record) => { + return { + imei: row['IMEI'], + index: 0, + }; + }, + }, + }, + }; + + /**状态属性 */ + const importState = reactive({ + open: false, + msgArr: [] as string[], + loading: false, //开始导入 + itemKey: '', // 解析item的key + item: null as any, // 解析item方法 + paramName: '', + filename: '', + fileetx: '', + }); + + /**对话框表格信息导入弹出窗口 */ + 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; + 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 = 0; + } 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); + const rowKey = rowItem[importState.itemKey]; + let result: any = null; + // 检查index是否定义 + const has = arrayState.columnsData.find( + (item: any) => item[importState.itemKey].value === rowKey + ); + if (has) { + // 已定义则更新 + rowItem.index = has.index.value; + result = await editNeConfigData({ + neType: neType, + neId: neId, + paramName: importState.paramName, + paramData: rowItem, + loc: `${rowItem.index}`, + }); + let msg = `index:${rowItem.index} update fail`; + if (result.code === RESULT_CODE_SUCCESS) { + msg = `index:${rowItem.index} update 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 = `index:${index} add fail`; + if (result.code === RESULT_CODE_SUCCESS) { + msg = `index:${index} add success`; + index += 1; + } + 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 294fe584..96fc5e5b 100644 --- a/src/views/ne/neConfig/index.vue +++ b/src/views/ne/neConfig/index.vue @@ -5,7 +5,6 @@ import { ProModal } from 'antdv-pro-modal'; import { message } from 'ant-design-vue/es'; import { DataNode } from 'ant-design-vue/es/tree'; import useI18n from '@/hooks/useI18n'; -import Base from './components/Base.vue'; import TableColumnsDnd from '@/components/TableColumnsDnd/index.vue'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import useNeInfoStore from '@/store/modules/neinfo'; @@ -13,8 +12,10 @@ 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 neInfoStore = useNeInfoStore(); +const neListStore = useNeInfoStore(); const { t } = useI18n(); const { ruleVerification, smfByUPFIdLoadData, smfByUPFIdOptions } = useOptions({ t, @@ -233,10 +234,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, }); @@ -370,58 +374,50 @@ const { arrayEditClose, }); -const baseOpen = ref(false); -function fnBaseOpen() { - baseOpen.value = !baseOpen.value; -} +const { + importState, + modalImportOpen, + modalImportClose, + modalImportUpload, + modalImportTemplate, +} = useArrayImport({ t, neTypeSelect, arrayState, fnActiveConfigNode }); + +const { batchState, modalBatchOpen, modalBatchClose, modalBatchOk } = + useArrayBatchDel({ + t, + neTypeSelect, + fnActiveConfigNode, + }); onMounted(() => { - neInfoStore.fnNelist().then(res => { - if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) { - if (res.data.length > 0) { - // 过滤不可用的网元 - neCascaderOptions.value = neInfoStore.getNeSelectOtions.filter( - (item: any) => { - return !['LMF', 'NEF'].includes(item.value); - } - ); - if (neCascaderOptions.value.length === 0) { - message.warning({ - content: t('common.noData'), - duration: 2, - }); - return; - } - // 默认选择AMF - const item = neCascaderOptions.value.find(s => s.value === 'AMF'); - if (item && item.children) { - const info = item.children[0]; - neTypeSelect.value = [info.neType, info.neId]; - } else { - const info = neCascaderOptions.value[0].children[0]; - neTypeSelect.value = [info.neType, info.neId]; - } - fnGetNeConfig(); - } - } else { - message.warning({ - content: t('common.noData'), - duration: 2, - }); + // 获取网元网元列表 + neCascaderOptions.value = neListStore.getNeCascaderOptions.filter( + (item: any) => { + return !['LMF', 'NEF'].includes(item.value); // 过滤不可用的网元 } - }); + ); + if (neCascaderOptions.value.length === 0) { + message.warning({ + content: t('common.noData'), + duration: 2, + }); + return; + } + // 默认选择AMF + const item = neCascaderOptions.value.find(s => s.value === 'AMF'); + if (item && item.children) { + const info = item.children[0]; + neTypeSelect.value = [info.neType, info.neId]; + } else { + const info = neCascaderOptions.value[0].children[0]; + neTypeSelect.value = [info.neType, info.neId]; + } + fnGetNeConfig(); }); @@ -765,7 +794,6 @@ onMounted(() => { { {{ JSON.parse(text['filter'])[text.value] }} @@ -936,8 +964,83 @@ onMounted(() => { - - + + + + + + + + + + + + + + + + + + + + + +