diff --git a/src/api/neData/backup.ts b/src/api/neData/backup.ts index eeb3781c..95e9bc47 100644 --- a/src/api/neData/backup.ts +++ b/src/api/neData/backup.ts @@ -36,3 +36,33 @@ export function updateBackupFTP(data: Record) { data, }); } + +/** + * 备份文件-导出OMC + * @returns object + */ +export function exportBackupOMC() { + return request({ + url: '/neData/backup/export-omc', + method: 'POST', + responseType: 'blob', + timeout: 180_000, + }); +} + +/** + * 备份文件-导入OMC + * @param filePath 备份文件上传返回的/upload 路径 + * @returns object + */ +export function importBackupOMC(filePath: string) { + return request({ + url: '/neData/backup/import-omc', + method: 'POST', + data: { + neType: 'OMC', + path: filePath, + }, + timeout: 180_000, + }); +} diff --git a/src/i18n/locales/en-US.ts b/src/i18n/locales/en-US.ts index 2bfc7aaa..11e25fd2 100644 --- a/src/i18n/locales/en-US.ts +++ b/src/i18n/locales/en-US.ts @@ -485,7 +485,7 @@ export default { resultOk: "Success", resultFail: "Fail", delTip: "Confirm deletion of the data item numbered [{msg}]?", - exportTip: "Do you confirm to export the current query conditions of the CDR data? (Maximum 10,000 items can be exported.)", + exportTip: "Do you confirm to export the current query conditions of the CDR data?", chargingID: 'Charging ID', smfSubscriptionIDData: 'Subscription ID Data', smfSubscriptionIDType: 'Subscription ID Type', @@ -517,7 +517,7 @@ export default { result: "Result", resultOk: "Successes", delTip: "Confirm deletion of the data item numbered [{msg}]?", - exportTip: "Do you confirm to export the event data of the current query condition? (Maximum 10,000 items can be exported.)", + exportTip: "Do you confirm to export the event data of the current query condition?", }, }, ne: { @@ -590,6 +590,21 @@ export default { kpiTimerPlease: 'Please enter the reporting period (in seconds)', omcIP: 'OMC IP', }, + quickOam: { + title: 'Quick OAM Configuration', + selectNe: 'Select NE', + omcIP: 'OMC IP', + oamPort: 'OAM Port', + progress:'Progress', + processing:'Progressing', + result:'Result', + success:'Success', + default:'Default', + }, + quickUpload: { + title: 'Quick License Upload', + selectNe: 'Select NE', + }, backConf: { export: 'Config Export', import: 'Config Import', @@ -701,6 +716,10 @@ export default { uploadFile: "Upload License", uploadChangeOk: 'Network Element renewed license successfully and is being calibrated in the background!', uploadChangeFail: "Some network elements failed to update the license, please check whether the service terminal environment is available!", + quickUpload: { + title: 'Quick License Upload', + selectNe: 'Select NE', + }, }, neConfig: { treeTitle: "Navigation Configuration", @@ -826,7 +845,7 @@ export default { passwordPlease: "Please enter your password correctly", addTitle: 'Add VOIP subscriber', delTip: 'Confirm that you want to delete the information of VOIP user as [{num}]?', - exportTip: "Confirm exporting xlsx table files based on search criteria?", + exportTip: "Confirm exporting all VOIP user data based on the current search criteria?", }, udmVolteIMS: { startMSISDN: 'Starting MSISDN', @@ -835,7 +854,7 @@ export default { vniTip: 'Example: ims.mnc000.mcc000.3gppnetwork.org', vniPlease: 'Please enter VNI correctly', delTip: 'Are you sure you want to delete the information of IMS signing as [{num}]?', - exportTip: "Confirm exporting xlsx table files based on search criteria?", + exportTip: "Confirm exporting all VoLTE user data based on the current search criteria?", }, pcfSub: { exportTip: 'Confirm exporting all user policy control information data?', @@ -886,7 +905,7 @@ export default { neTypePlease: 'Query network element Object', neType: 'UDM Object', export: 'Export', - exportConfirm: 'Are you sure to export all authentication user data?', + exportConfirm: 'Confirm exporting all Authentication user data based on the current search criteria?', checkExport : 'Check Export', checkExportConfirm: 'Confirm exporting the checked authenticated user data?', import: 'Import', @@ -915,7 +934,7 @@ export default { subInfo:' Subscription Info', neType: 'UDM Object', export: 'Export', - exportConfirm: 'Are you sure to export all signed user data?', + exportConfirm: 'Confirm exporting all Subscribers user data based on the current search criteria?', checkExport : 'Check Export', checkExportConfirm: 'Are you sure to export the data of the checked subscribers?', import: 'Import', @@ -1341,10 +1360,18 @@ export default { deleteTipErr: "Failed to delete file", sysloginLog:'System Login Log', sysOperateLog:'System Operation Log', - cdrIMS:'CDR Voice', - cdrSMF:'CDR Data', - cdrSMSC:'CDR SMS', - cdrSGWC:'CDR Roaming Data', + cdrIMS:'CDR IMS Voice', + cdrSMF:'CDR SMF Data', + cdrSMSC:'CDR SMSC SMS', + cdrSGWC:'CDR SGWC Roaming Data', + kpiIMS:'KPI IMS', + kpiAMF:'KPI AMF', + kpiUDM:'KPI UDM', + kpiSMF:'KPI SMF', + kpiPCF:'KPI PCF', + kpiUPF:'KPI UPF', + kpiMME:'KPI MME', + kpiSMSC:'KPI SMSC', } }, monitor: { @@ -1889,6 +1916,10 @@ export default { home: 'Home Page', homeTip:'Do you want to submit the current interface as the system interface?', homeSet:'Home Page Settings', + backup: 'System Backup', + backupInstruction: 'System backup will back up the net element information records and configuration files running on the current system, and can restore the system to the previous state!', + backupExportTip: 'Confirm to export system backup?', + backupImportTip: 'Confirm to import system backup?', }, role:{ allScopeOptions:'All data permissions', diff --git a/src/i18n/locales/zh-CN.ts b/src/i18n/locales/zh-CN.ts index 1b30d7a0..ed2b05b8 100644 --- a/src/i18n/locales/zh-CN.ts +++ b/src/i18n/locales/zh-CN.ts @@ -485,7 +485,7 @@ export default { resultOk: "成功", resultFail: "失败", delTip: "确认删除编号为【{msg}】的数据项?", - exportTip: "确认导出当前查询条件的话单数据吗?(导出最大支持一万条)", + exportTip: "确认导出当前查询条件的话单数据吗?", chargingID: '计费ID', smfSubscriptionIDData: '订阅 ID 数据', smfSubscriptionIDType: '订阅 ID 类型', @@ -517,7 +517,7 @@ export default { result: "结果", resultOk: "成功", delTip: "确认删除编号为【{msg}】的数据项?", - exportTip: "确认导出当前查询条件的事件数据吗?(导出最大支持一万条)", + exportTip: "确认导出当前查询条件的事件数据吗?", }, }, ne: { @@ -590,6 +590,21 @@ export default { kpiTimerPlease: '请输入上报周期(单位秒)', omcIP: 'OMC IP', }, + quickOam: { + title: '快速OAM配置', + selectNe: '选择网元', + omcIP: 'OMC IP地址', + oamPort: 'OAM端口', + progress:'配置进度', + processing:'正在处理', + result:'操作结果', + success:'成功', + default:'失败', + }, + quickUpload: { + title: '快速许可证上传', + selectNe: '选择网元', + }, backConf: { export: '配置导出', import: '配置导入', @@ -701,6 +716,10 @@ export default { uploadFile: "上传许可证", uploadChangeOk: '网元更新许可证成功,正在后台校验!', uploadChangeFail: "部分网元更新许可证失败,请检查服务终端环境是否可用!", + quickUpload: { + title: '快速许可证上传', + selectNe: '选择网元', + }, }, neConfig: { treeTitle: "配置导航", @@ -826,7 +845,7 @@ export default { passwordPlease: "请正确输入密码", addTitle: '新增VOIP用户', delTip: '确认要删除VOIP用户为【{num}】的信息吗?', - exportTip: "确认根据搜索条件导出xlsx表格文件吗?", + exportTip: "确认根据当前搜索条件导出全部VoIP用户数据吗?", }, udmVolteIMS: { startMSISDN: '起始MSISDN', @@ -835,7 +854,7 @@ export default { vniTip: '示例:ims.mnc000.mcc000.3gppnetwork.org', vniPlease: '请正确输入VNI', delTip: '确认要删除IMS签约为【{num}】的信息吗?', - exportTip: "确认根据搜索条件导出xlsx表格文件吗?", + exportTip: "确认根据当前搜索条件导出全部VoLTE用户数据吗?", }, pcfSub: { exportTip: '确认导出全部用户策略控制信息数据吗?', @@ -886,7 +905,7 @@ export default { neTypePlease: '查询网元类型', neType: 'UDM网元对象', export: '导出', - exportConfirm: '确认导出全部鉴权用户数据吗?', + exportConfirm: '确认根据当前搜索条件导出全部鉴权用户数据吗?', checkExport : '勾选导出', checkExportConfirm: '确认导出已勾选的鉴权用户数据吗?', import: '导入', @@ -917,7 +936,7 @@ export default { export: '导出', exportConfirm: '确认导出全部签约用户数据吗?', checkExport : '勾选导出', - checkExportConfirm: '确认导出已勾选的签约用户数据吗?', + checkExportConfirm: '确认根据当前搜索条件导出全部签约用户数据吗?', import: '导入', importFail: '失败记录', loadDataConfirm: '确认要重新加载数据吗?', @@ -1341,10 +1360,18 @@ export default { deleteTipErr: "文件删除失败", sysloginLog:'系统登录日志', sysOperateLog:'系统操作日志', - cdrIMS:'语音话单', - cdrSMF:'数据话单', - cdrSMSC:'短信话单', - cdrSGWC:'漫游数据话单', + cdrIMS:'话单 IMS 语音', + cdrSMF:'话单 SMF 数据', + cdrSMSC:'话单 SMSC 短信', + cdrSGWC:'话单 SGWC 漫游数据', + kpiIMS:'KPI IMS', + kpiAMF:'KPI AMF', + kpiUDM:'KPI UDM', + kpiSMF:'KPI SMF', + kpiPCF:'KPI PCF', + kpiUPF:'KPI UPF', + kpiMME:'KPI MME', + kpiSMSC:'KPI SMSC', } }, monitor: { @@ -1889,6 +1916,10 @@ export default { home: '系统首页', homeTip:'确认要提交当前界面为系统界面吗?', homeSet:'系统首页设置', + backup: '系统备份', + backupInstruction: '系统备份将会对当前系统上运行的网元信息记录及配置文件进行备份,可进行系统的恢复操作!', + backupExportTip: '确认要导出系统备份吗?', + backupImportTip: '确认要导入系统备份吗?', }, role:{ allScopeOptions:'全部数据权限', diff --git a/src/layouts/BasicLayout.vue b/src/layouts/BasicLayout.vue index 0353d81b..1b410274 100644 --- a/src/layouts/BasicLayout.vue +++ b/src/layouts/BasicLayout.vue @@ -217,6 +217,7 @@ onMounted(() => { let serverTimeInterval: any = null; let serverTime = 0; let serverTimeZone = getTimezoneOffset(); +let activeAlarmRefresh = 0; // 获取服务器时间 function fnGetServerTime() { @@ -230,6 +231,7 @@ function fnGetServerTime() { const serverTimeDom = document.getElementById('serverTimeDom'); serverTimeInterval = setInterval(() => { serverTime += 1000; + activeAlarmRefresh += 1; if (serverTimeDom) { serverTimeDom.innerText = parseDateUTCToStr( serverTime, @@ -239,6 +241,10 @@ function fnGetServerTime() { clearInterval(serverTimeInterval); serverTimeInterval = null; } + if (activeAlarmRefresh === 5) { + useAlarmStore().fnGetActiveAlarmInfo(); + activeAlarmRefresh = 0; + } }, 1000); } }); diff --git a/src/utils/date-utils.ts b/src/utils/date-utils.ts index 4646d25c..70d87132 100644 --- a/src/utils/date-utils.ts +++ b/src/utils/date-utils.ts @@ -17,6 +17,35 @@ export const RFC3339 = 'YYYY-MM-DDTHH:mm:ssZ'; /**国际时间 列如:Thu, Nov 14 2024 10:19 GMT+08:00 */ export const RFC822Z = 'ddd, MMM DD YYYY HH:mm [GMT]Z'; +// 映射时区偏移量与IANA时区名称关联 +export const offsetToIanaMap: Record = { + '+0000': 'UTC', + '+0100': 'Europe/London', + '+0200': 'Europe/Paris', + '+0300': 'Europe/Moscow', + '+0400': 'Asia/Dubai', + '+0500': 'Asia/Karachi', + '+0600': 'Asia/Almaty', + '+0700': 'Asia/Bangkok', + '+0800': 'Asia/Shanghai', + '+0900': 'Asia/Tokyo', + '+1000': 'Australia/Sydney', + '+1100': 'Pacific/Noumea', + '+1200': 'Pacific/Fiji', + '-0100': 'America/Noronha', + '-0200': 'Atlantic/Azores', + '-0300': 'America/Argentina/Buenos_Aires', + '-0400': 'America/New_York', + '-0500': 'America/New_York', + '-0600': 'America/Chicago', + '-0700': 'America/Denver', + '-0800': 'America/Los_Angeles', + '-0900': 'Pacific/Honolulu', + '-1000': 'Pacific/Honolulu', + '-1100': 'Pacific/Pago_Pago', + '-1200': 'Pacific/Kwajalein', +}; + /** * 格式时间字符串 * @param dateStr 时间字符串 @@ -53,9 +82,10 @@ export function parseDateUTCToStr( date: string | number | Date, offset: string = '+0000' ): string { + const ianaTimezone = offsetToIanaMap[offset] || 'UTC'; return dayjs .utc(date) // 将时间戳按 UTC 时间 - .tz(offset) // 使用时区偏移 + .tz(ianaTimezone) // 使用时区偏移 .format(`YYYY-MM-DD HH:mm:ss [UTC${offset}]`); // 格式化时间 } diff --git a/src/views/dashboard/amfUE/index.vue b/src/views/dashboard/amfUE/index.vue index 4edc10c3..d093d901 100644 --- a/src/views/dashboard/amfUE/index.vue +++ b/src/views/dashboard/amfUE/index.vue @@ -342,7 +342,8 @@ function fnExportList() { modalState.confirmLoading = true; const hide = message.loading(t('common.loading'), 0); const querys = toRaw(queryParams); - querys.pageSize = 10000; + querys.pageNum = 1; + querys.pageSize = tablePagination.total; exportAMFDataUE(querys) .then(res => { if (res.code === RESULT_CODE_SUCCESS) { diff --git a/src/views/dashboard/imsCDR/index.vue b/src/views/dashboard/imsCDR/index.vue index c9a64dd5..064ea3e9 100644 --- a/src/views/dashboard/imsCDR/index.vue +++ b/src/views/dashboard/imsCDR/index.vue @@ -411,7 +411,8 @@ function fnExportList() { modalState.confirmLoading = true; const hide = message.loading(t('common.loading'), 0); const querys = toRaw(queryParams); - querys.pageSize = 10000; + querys.pageNum = 1; + querys.pageSize = tablePagination.total; exportIMSDataCDR(querys) .then(res => { if (res.code === RESULT_CODE_SUCCESS) { diff --git a/src/views/dashboard/mmeUE/index.vue b/src/views/dashboard/mmeUE/index.vue index 3d848803..3fd87c07 100644 --- a/src/views/dashboard/mmeUE/index.vue +++ b/src/views/dashboard/mmeUE/index.vue @@ -344,7 +344,8 @@ function fnExportList() { modalState.confirmLoading = true; const hide = message.loading(t('common.loading'), 0); const querys = toRaw(queryParams); - querys.pageSize = 10000; + querys.pageNum = 1; + querys.pageSize = tablePagination.total; exportMMEDataUE(querys) .then(res => { if (res.code === RESULT_CODE_SUCCESS) { diff --git a/src/views/dashboard/sgwcCDR/index.vue b/src/views/dashboard/sgwcCDR/index.vue index b00a849e..c719a701 100644 --- a/src/views/dashboard/sgwcCDR/index.vue +++ b/src/views/dashboard/sgwcCDR/index.vue @@ -381,7 +381,8 @@ function fnExportList() { modalState.confirmLoading = true; const hide = message.loading(t('common.loading'), 0); const querys = toRaw(queryParams); - querys.pageSize = 10000; + querys.pageNum = 1; + querys.pageSize = tablePagination.total; exportSGWCDataCDR(querys) .then(res => { if (res.code === RESULT_CODE_SUCCESS) { diff --git a/src/views/dashboard/smfCDR/index.vue b/src/views/dashboard/smfCDR/index.vue index 28975ea6..7e15a040 100644 --- a/src/views/dashboard/smfCDR/index.vue +++ b/src/views/dashboard/smfCDR/index.vue @@ -20,6 +20,7 @@ import { OptionsType, WS } from '@/plugins/ws-websocket'; import PQueue from 'p-queue'; import saveAs from 'file-saver'; import dayjs, { type Dayjs } from 'dayjs'; +import { parseSizeFromByte } from '@/utils/parse-utils'; import { useClipboard } from '@vueuse/core'; const { copy } = useClipboard({ legacy: true }); const { t } = useI18n(); @@ -165,7 +166,7 @@ let tableColumns = ref([ } } } - return dataVolumeUplink; + return parseSizeFromByte(dataVolumeUplink); }, }, { @@ -190,7 +191,7 @@ let tableColumns = ref([ } } } - return dataVolumeDownlink; + return parseSizeFromByte(dataVolumeDownlink); }, }, { @@ -215,7 +216,7 @@ let tableColumns = ref([ } } } - return dataTotalVolume; + return parseSizeFromByte(dataTotalVolume); }, }, { @@ -408,7 +409,8 @@ function fnExportList() { modalState.confirmLoading = true; const hide = message.loading(t('common.loading'), 0); const querys = toRaw(queryParams); - querys.pageSize = 10000; + querys.pageNum = 1; + querys.pageSize = tablePagination.total; exportSMFDataCDR(querys) .then(res => { if (res.code === RESULT_CODE_SUCCESS) { @@ -811,15 +813,21 @@ onBeforeUnmount(() => {
Data Total Volume: - {{ udata.dataTotalVolume }} + + {{ parseSizeFromByte(udata.dataTotalVolume || 0) }} +
Data Volume Downlink: - {{ udata.dataVolumeDownlink }} + + {{ parseSizeFromByte(udata.dataVolumeDownlink || 0) }} +
Data Volume Uplink: - {{ udata.dataVolumeUplink }} + + {{ parseSizeFromByte(udata.dataVolumeUplink || 0) }} +
diff --git a/src/views/traceManage/pcap/index.vue b/src/views/traceManage/pcap/index.vue index 401cec43..2af369e6 100644 --- a/src/views/traceManage/pcap/index.vue +++ b/src/views/traceManage/pcap/index.vue @@ -593,13 +593,13 @@ onMounted(() => {