From 9dbe5a19f182c2403d87666204cf4924ccc88f31 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Wed, 17 Sep 2025 15:08:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=B0=83=E5=BA=A6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1-=E5=AF=BC=E5=87=BAKPI=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/sys_dict_data1_i18n_zh.sql | 2 + database/install/sys_dict_data2_i18n_en.sql | 2 + database/install/sys_job.sql | 1 + database/install/sys_menu.sql | 3 +- database/install/sys_role_menu.sql | 1 + .../upgrade/upg_sys_dict_data1_i18n_zh.sql | 2 + .../upgrade/upg_sys_dict_data2_i18n_en.sql | 2 + database/upgrade/upg_sys_job.sql | 1 + database/upgrade/upg_sys_menu.sql | 3 +- database/upgrade/upg_sys_role_menu.sql | 1 + .../backup_export_kpi/backup_export_kpi.go | 244 ++++++++++++++++++ src/modules/crontask/processor/processor.go | 3 + 12 files changed, 263 insertions(+), 2 deletions(-) create mode 100644 src/modules/crontask/processor/backup_export_kpi/backup_export_kpi.go diff --git a/database/install/sys_dict_data1_i18n_zh.sql b/database/install/sys_dict_data1_i18n_zh.sql index 84dc3eca..11cfe2b9 100644 --- a/database/install/sys_dict_data1_i18n_zh.sql +++ b/database/install/sys_dict_data1_i18n_zh.sql @@ -767,6 +767,8 @@ INSERT INTO `sys_dict_data` VALUES (2256, 2256, "job.delete_ne_config_backup", " INSERT INTO `sys_dict_data` VALUES (2257, 2257, "job.delete_ne_config_backup_remark", "storeDays:表示保留最近天数的数据记录\r\nstoreNum:保留数量,默认保留7个", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2258, 2258, 'job.ne_alarm_state_check_udmdb_sync', '网元告警-UDM DB同步状态检查', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (2259, 2259, 'job.ne_alarm_state_check_udmdb_sync_remark', '检查网元UDM的DB是否同步状态是否正常,在出现过关闭时发出警报。非master模式下有效', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2260, 2260, 'job.backup_export_kpi', '备份-KPI数据定期导出', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (2261, 2261, 'job.backup_export_kpi_remark', 'dataType: 类型支持 ims/smf/sgwc/smsc\nfileType: 文件类型 csv/xlsx\nhour: 数据时间从任务执行时间前的小时数', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); -- multi-tenancy INSERT INTO `sys_dict_data` VALUES (11000, 11000, 'menu.security.tenant', '租户管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/install/sys_dict_data2_i18n_en.sql b/database/install/sys_dict_data2_i18n_en.sql index 4407322b..3d9690cd 100644 --- a/database/install/sys_dict_data2_i18n_en.sql +++ b/database/install/sys_dict_data2_i18n_en.sql @@ -767,6 +767,8 @@ INSERT INTO `sys_dict_data` VALUES (4256, 4256, "job.delete_ne_config_backup", " INSERT INTO `sys_dict_data` VALUES (4257, 4257, "job.delete_ne_config_backup_remark", "storeDays: indicates that the most recent days of data records are kept.\r\nstoreNum: the number of reservations, the default reservation is 7.", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4258, 4258, 'job.ne_alarm_state_check_udmdb_sync', 'NE Alarm-UDM DB Sync Check', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); INSERT INTO `sys_dict_data` VALUES (4259, 4259, 'job.ne_alarm_state_check_udmdb_sync_remark', 'Check whether the UDM network element is database is in a normal synchronized state and issue an alert if it has been shut down. Effective in non-master mode.', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4260, 4260, 'job.backup_export_kpi', 'Backup-Periodic export of KPI Data', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +INSERT INTO `sys_dict_data` VALUES (4261, 4261, 'job.backup_export_kpi_remark', 'dataType: type support ims/smf/sgwc/smsc\nfileType: file type csv/xlsx\nhour: data time from the hour before the task execution time', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); -- 多租户 INSERT INTO `sys_dict_data` VALUES (14000, 14000, 'menu.security.tenant', 'Tenant Management', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); diff --git a/database/install/sys_job.sql b/database/install/sys_job.sql index cec981b4..087a88c6 100644 --- a/database/install/sys_job.sql +++ b/database/install/sys_job.sql @@ -62,5 +62,6 @@ INSERT INTO `sys_job` VALUES (30, 'job.backup_remove_file', 'SYSTEM', 'backup_re INSERT INTO `sys_job` VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_export_udm', '{\"dataType\":[\"auth\",\"sub\",\"voip\",\"volte\"],\"fileType\":\"txt\"}', '0 35 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_udm_remark'); INSERT INTO `sys_job` VALUES (32, 'job.backup_export_cdr', 'SYSTEM', 'backup_export_cdr', '{\"dataType\":[\"ims\",\"smf\",\"sgwc\",\"smsc\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_cdr_remark'); INSERT INTO `sys_job` VALUES (33, 'job.backup_export_log', 'SYSTEM', 'backup_export_log', '{\"dataType\":[\"operate\",\"login\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_log_remark'); +INSERT INTO `sys_job` VALUES (34, 'job.backup_export_kpi', 'SYSTEM', 'backup_export_kpi', '{\"dataType\":[\"ims\",\"amf\",\"udm\",\"smf\",\"pcf\",\"upf\",\"mme\",\"smsc\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_kpi_remark'); SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/install/sys_menu.sql b/database/install/sys_menu.sql index 822f3da3..d4a86aa7 100644 --- a/database/install/sys_menu.sql +++ b/database/install/sys_menu.sql @@ -209,6 +209,7 @@ INSERT INTO `sys_menu` VALUES (2010, 'menu.ueUser.subUDM', 2075, 2, 'sub', 'neUs INSERT INTO `sys_menu` VALUES (2011, 'menu.ueUser.voipUDM', 2075, 3, 'voip', 'neUser/voip/index', '1', '1', 'M', '1', '1', 'neUser:voip:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.voipUDMRemark'); INSERT INTO `sys_menu` VALUES (2012, 'menu.ueUser.imsUDM', 2075, 4, 'imsUDM', 'neUser/imsUDM/index', '1', '1', 'M', '1', '1', 'neUser:imsUDM:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.imsUDMRemark'); INSERT INTO `sys_menu` VALUES (2013, 'menu.log', 2089, 27, 'logsD', '', '1', '0', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, 'supervisor', 1715413568692, ''); +INSERT INTO `sys_menu` VALUES (2073, 'KPI Backup', 67, 106, 'kpiBackup', 'tool/files/kpiBackup/index', '1', '1', 'M', '1', '1', 'tool:files:kpiBackup:index', 'icon-tubiaoku', 'supervisor', 1724144595914, '', 0, ''); INSERT INTO `sys_menu` VALUES (2074, 'KPI Indicator Management', 2099, 22, 'kpi-title', 'perfManage/kpi-title/index', '1', '1', 'M', '1', '1', 'perfManage:kpi-title:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, ''); INSERT INTO `sys_menu` VALUES (2075, 'UDM User Management', 5, 1, 'udmManage', '', '1', '0', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, '', 0, ''); INSERT INTO `sys_menu` VALUES (2076, 'Online Information', 5, 4, 'neDataManage', '', '1', '0', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, '', 0, ''); @@ -246,7 +247,7 @@ INSERT INTO `sys_menu` VALUES (2108, 'menu.mml.ne', 2107, 1, 'neOperate', 'mmlMa INSERT INTO `sys_menu` VALUES (2109, 'menu.mml.udm', 2107, 2, 'udmOperate', 'mmlManage/udmOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:udmOperate:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.udmRemark'); INSERT INTO `sys_menu` VALUES (2110, 'menu.mml.set', 2107, 4, 'mmlSet', 'mmlManage/mmlSet/index', '1', '0', 'M', '1', '1', 'mmlManage:mmlSet:index', 'icon-wofaqi', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.setRemark'); INSERT INTO `sys_menu` VALUES (2111, 'menu.mml.omc', 2107, 3, 'omcOperate', 'mmlManage/omcOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:omcOperate:index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.omcRemark'); -INSERT INTO `sys_menu` VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-paixu', 'supervisor', 1723107637982, 'supervisor', 1723107637982, ''); +INSERT INTO `sys_menu` VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '0', 'dashboard:cdr:index', 'icon-paixu', 'supervisor', 1723107637982, 'supervisor', 1723107637982, ''); INSERT INTO `sys_menu` VALUES (2113, 'menu.security', 0, 14, 'security', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-suofang', 'supervisor', 1700000000000, NULL, 0, 'menu.securityRemark'); INSERT INTO `sys_menu` VALUES (2114, 'menu.system.systemSet', 1, 60, 'setting', 'system/setting/index', '1', '1', 'M', '1', '1', 'system:setting:index', 'icon-piliang', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemSetRemark'); INSERT INTO `sys_menu` VALUES (2115, 'menu.system.systemResource', 1, 6, 'monitor', 'monitor/monitor/index', '1', '1', 'M', '1', '1', 'monitor:monitor:info', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemResourceRemark'); diff --git a/database/install/sys_role_menu.sql b/database/install/sys_role_menu.sql index b86b12a4..4b468873 100644 --- a/database/install/sys_role_menu.sql +++ b/database/install/sys_role_menu.sql @@ -134,6 +134,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2010); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2011); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2012); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2013); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2073); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2075); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2076); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2077); diff --git a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql index 864d91f8..3233be1b 100644 --- a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql +++ b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql @@ -774,6 +774,8 @@ REPLACE INTO `sys_dict_data` VALUES (2256, 2256, "job.delete_ne_config_backup", REPLACE INTO `sys_dict_data` VALUES (2257, 2257, "job.delete_ne_config_backup_remark", "storeDays:表示保留最近天数的数据记录\r\nstoreNum:保留数量,默认保留7个", 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2258, 2258, 'job.ne_alarm_state_check_udmdb_sync', '网元告警-UDM DB同步状态检查', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (2259, 2259, 'job.ne_alarm_state_check_udmdb_sync_remark', '检查网元UDM的DB是否同步状态是否正常,在出现过关闭时发出警报。非master模式下有效', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2260, 2260, 'job.backup_export_kpi', '备份-KPI数据定期导出', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (2261, 2261, 'job.backup_export_kpi_remark', 'dataType: 类型支持 ims/smf/sgwc/smsc\nfileType: 文件类型 csv/xlsx\nhour: 数据时间从任务执行时间前的小时数', 'i18n_zh', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); -- multi-tenancy REPLACE INTO `sys_dict_data` VALUES (11000, 11000, 'menu.security.tenant', '租户管理', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/upgrade/upg_sys_dict_data2_i18n_en.sql b/database/upgrade/upg_sys_dict_data2_i18n_en.sql index ff944307..7c313eba 100644 --- a/database/upgrade/upg_sys_dict_data2_i18n_en.sql +++ b/database/upgrade/upg_sys_dict_data2_i18n_en.sql @@ -775,6 +775,8 @@ REPLACE INTO `sys_dict_data` VALUES (4256, 4256, "job.delete_ne_config_backup", REPLACE INTO `sys_dict_data` VALUES (4257, 4257, "job.delete_ne_config_backup_remark", "storeDays: indicates that the most recent days of data records are kept.\r\nstoreNum: the number of reservations, the default reservation is 7.", 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4258, 4258, 'job.ne_alarm_state_check_udmdb_sync', 'NE Alarm-UDM DB Sync Check', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); REPLACE INTO `sys_dict_data` VALUES (4259, 4259, 'job.ne_alarm_state_check_udmdb_sync_remark', 'Check whether the UDM network element is database is in a normal synchronized state and issue an alert if it has been shut down. Effective in non-master mode.', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4260, 4260, 'job.backup_export_kpi', 'Backup-Periodic export of KPI Data', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); +REPLACE INTO `sys_dict_data` VALUES (4261, 4261, 'job.backup_export_kpi_remark', 'dataType: type support ims/smf/sgwc/smsc\nfileType: file type csv/xlsx\nhour: data time from the hour before the task execution time', 'i18n_en', '', '', '1', 'supervisor', 1721902269805, '', 0, ''); -- 多租户 REPLACE INTO `sys_dict_data` VALUES (14000, 14000, 'menu.security.tenant', 'Tenant Management', 'i18n_en', '', '', '1', 'supervisor', 1705550000000, '', 0, ''); diff --git a/database/upgrade/upg_sys_job.sql b/database/upgrade/upg_sys_job.sql index 25233b3e..19f67c0e 100644 --- a/database/upgrade/upg_sys_job.sql +++ b/database/upgrade/upg_sys_job.sql @@ -66,5 +66,6 @@ REPLACE INTO `sys_job` VALUES (30, 'job.backup_remove_file', 'SYSTEM', 'backup_r REPLACE INTO `sys_job` VALUES (31, 'job.backup_export_udm', 'SYSTEM', 'backup_export_udm', '{\"dataType\":[\"auth\",\"sub\",\"voip\",\"volte\"],\"fileType\":\"txt\"}', '0 35 0 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_udm_remark'); REPLACE INTO `sys_job` VALUES (32, 'job.backup_export_cdr', 'SYSTEM', 'backup_export_cdr', '{\"dataType\":[\"ims\",\"smf\",\"sgwc\",\"smsc\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_cdr_remark'); REPLACE INTO `sys_job` VALUES (33, 'job.backup_export_log', 'SYSTEM', 'backup_export_log', '{\"dataType\":[\"operate\",\"login\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_log_remark'); +REPLACE INTO `sys_job` VALUES (34, 'job.backup_export_kpi', 'SYSTEM', 'backup_export_kpi', '{\"dataType\":[\"ims\",\"amf\",\"udm\",\"smf\",\"pcf\",\"upf\",\"mme\",\"smsc\"],\"fileType\":\"xlsx\",\"hour\":1}', '0 0 0/1 * * ?', '3', '0', '1', '1', 'system', 1698478134839, 'supervisor', 1745481169354, 'job.backup_export_kpi_remark'); SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/database/upgrade/upg_sys_menu.sql b/database/upgrade/upg_sys_menu.sql index 0dc2ffe4..19e42409 100644 --- a/database/upgrade/upg_sys_menu.sql +++ b/database/upgrade/upg_sys_menu.sql @@ -192,6 +192,7 @@ REPLACE INTO `sys_menu` VALUES (2010, 'menu.ueUser.subUDM', 2075, 2, 'sub', 'neU REPLACE INTO `sys_menu` VALUES (2011, 'menu.ueUser.voipUDM', 2075, 3, 'voip', 'neUser/voip/index', '1', '1', 'M', '1', '1', 'neUser:voip:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.voipUDMRemark'); REPLACE INTO `sys_menu` VALUES (2012, 'menu.ueUser.imsUDM', 2075, 4, 'imsUDM', 'neUser/imsUDM/index', '1', '1', 'M', '1', '1', 'neUser:imsUDM:index', 'icon-xiangmuchengyuan', 'supervisor', 1700000000000, NULL, 0, 'menu.ueUser.imsUDMRemark'); REPLACE INTO `sys_menu` VALUES (2013, 'menu.log', 2089, 27, 'logsD', '', '1', '0', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, 'supervisor', 1715413568692, ''); +REPLACE INTO `sys_menu` VALUES (2073, 'KPI Backup', 67, 106, 'kpiBackup', 'tool/files/kpiBackup/index', '1', '1', 'M', '1', '1', 'tool:files:kpiBackup:index', 'icon-tubiaoku', 'supervisor', 1724144595914, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2074, 'KPI Indicator Management', 2099, 22, 'kpi-title', 'perfManage/kpi-title/index', '1', '1', 'M', '1', '1', 'perfManage:kpi-title:index', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, ''); REPLACE INTO `sys_menu` VALUES (2075, 'UDM User Management', 5, 1, 'udmManage', '', '1', '0', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, '', 0, ''); REPLACE INTO `sys_menu` VALUES (2076, 'Online Information', 5, 4, 'neDataManage', '', '1', '0', 'D', '1', '1', '', 'icon-wenjian', 'supervisor', 1700000000000, '', 0, ''); @@ -229,7 +230,7 @@ REPLACE INTO `sys_menu` VALUES (2108, 'menu.mml.ne', 2107, 1, 'neOperate', 'mmlM REPLACE INTO `sys_menu` VALUES (2109, 'menu.mml.udm', 2107, 2, 'udmOperate', 'mmlManage/udmOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:udmOperate:index', 'icon-gonggaodayi', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.udmRemark'); REPLACE INTO `sys_menu` VALUES (2110, 'menu.mml.set', 2107, 4, 'mmlSet', 'mmlManage/mmlSet/index', '1', '0', 'M', '1', '1', 'mmlManage:mmlSet:index', 'icon-wofaqi', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.setRemark'); REPLACE INTO `sys_menu` VALUES (2111, 'menu.mml.omc', 2107, 3, 'omcOperate', 'mmlManage/omcOperate/index', '1', '1', 'M', '1', '1', 'mmlManage:omcOperate:index', 'icon-huizhiguize', 'supervisor', 1700000000000, NULL, 0, 'menu.mml.omcRemark'); -REPLACE INTO `sys_menu` VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '1', 'dashboard:cdr:index', 'icon-paixu', 'supervisor', 1723107637982, 'supervisor', 1723107637982, ''); +REPLACE INTO `sys_menu` VALUES (2112, 'menu.dashboard.sgwcCDR', 2140, 12, 'sgwcCDR', 'dashboard/sgwcCDR/index', '1', '0', 'M', '1', '0', 'dashboard:cdr:index', 'icon-paixu', 'supervisor', 1723107637982, 'supervisor', 1723107637982, ''); REPLACE INTO `sys_menu` VALUES (2113, 'menu.security', 0, 14, 'security', NULL, '1', '0', 'D', '1', '1', NULL, 'icon-suofang', 'supervisor', 1700000000000, NULL, 0, 'menu.securityRemark'); REPLACE INTO `sys_menu` VALUES (2114, 'menu.system.systemSet', 1, 60, 'setting', 'system/setting/index', '1', '1', 'M', '1', '1', 'system:setting:index', 'icon-piliang', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemSetRemark'); REPLACE INTO `sys_menu` VALUES (2115, 'menu.system.systemResource', 1, 6, 'monitor', 'monitor/monitor/index', '1', '1', 'M', '1', '1', 'monitor:monitor:info', 'icon-soutubiao', 'supervisor', 1700000000000, NULL, 0, 'menu.system.systemResourceRemark'); diff --git a/database/upgrade/upg_sys_role_menu.sql b/database/upgrade/upg_sys_role_menu.sql index 47e7b894..951f8086 100644 --- a/database/upgrade/upg_sys_role_menu.sql +++ b/database/upgrade/upg_sys_role_menu.sql @@ -135,6 +135,7 @@ INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2010); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2011); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2012); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2013); +INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2073); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2075); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2076); INSERT IGNORE INTO `sys_role_menu` VALUES (2, 2077); diff --git a/src/modules/crontask/processor/backup_export_kpi/backup_export_kpi.go b/src/modules/crontask/processor/backup_export_kpi/backup_export_kpi.go new file mode 100644 index 00000000..8c1d10e7 --- /dev/null +++ b/src/modules/crontask/processor/backup_export_kpi/backup_export_kpi.go @@ -0,0 +1,244 @@ +package backup_export_kpi + +import ( + "encoding/json" + "fmt" + "path/filepath" + "runtime" + "sort" + "strconv" + "strings" + "time" + + "be.ems/src/framework/cron" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" + neDataModel "be.ems/src/modules/network_data/model" + neDataService "be.ems/src/modules/network_data/service" + neModel "be.ems/src/modules/network_element/model" + neService "be.ems/src/modules/network_element/service" +) + +var NewProcessor = &BackupExportKPIProcessor{ + count: 0, + backupService: neDataService.NewBackup, + neInfoService: neService.NewNeInfo, + perfKPIService: neDataService.NewPerfKPI, +} + +// BackupExportKPI 队列任务处理 +type BackupExportKPIProcessor struct { + count int // 执行次数 + backupService *neDataService.Backup // 备份相关服务 + neInfoService *neService.NeInfo // 网元信息服务 + perfKPIService *neDataService.PerfKPI // 统计信息服务 +} + +func (s *BackupExportKPIProcessor) Execute(data any) (any, error) { + s.count++ // 执行次数加一 + options := data.(cron.JobData) + sysJob := options.SysJob + logger.Infof("重复:%v 任务ID:%s 执行次数:%d", options.Repeat, sysJob.JobID, s.count) + // 返回结果,用于记录执行结果 + result := map[string]any{ + "count": s.count, + } + + var params struct { + DataType []string `json:"dataType"` // 类型支持 ims/smsc/smf/sgwc + FileType string `json:"fileType"` // 文件类型 csv/xlsx + Hour int `json:"hour"` // 数据时间从任务执行时间前的小时数 + } + if err := json.Unmarshal([]byte(sysJob.TargetParams), ¶ms); err != nil { + return nil, err + } + if !(params.FileType == "csv" || params.FileType == "xlsx") { + return nil, fmt.Errorf("file type error, only support csv,xlsx") + } + + for _, v := range params.DataType { + neList := s.neInfoService.SelectList(neModel.NeInfo{NeType: strings.ToUpper(v)}, false, false) + for _, ne := range neList { + // 前 hour 小时 + now := time.Now() + end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location()) + start := end.Add(-time.Duration(params.Hour) * time.Hour) + // 密度 + var interval int64 = 60 + if ne.NeType == "UPF" { + interval = 5 + } + query := neDataModel.GoldKPIQuery{ + NeType: ne.NeType, + NeID: ne.NeId, + RmUID: ne.RmUID, + Interval: interval, + StartTime: fmt.Sprintf("%d", start.UnixMilli()), + EndTime: fmt.Sprintf("%d", end.UnixMilli()), + } + result[ne.NeName] = s.exportKPI(query, params.FileType) + } + } + + // 返回结果,用于记录执行结果 + return result, nil +} + +// exportKPI 导出KPI数据 +func (s *BackupExportKPIProcessor) exportKPI(query neDataModel.GoldKPIQuery, fileType string) string { + rows := s.perfKPIService.FindData(query) + if len(rows) == 0 { + return "no data" + } + + // 获取数据指标id + kpiIdMap := make(map[string]string, 0) + kpiTitles := s.perfKPIService.SelectGoldKPITitle(query.NeType) + for _, kpiId := range kpiTitles { + kpiIdMap[kpiId.KPIID] = kpiId.EnTitle + } + + // 导出文件名称 + dateStr := date.ParseDateToStr(parse.Number(query.EndTime), date.YYYYMMDDHHMMSS) + fileName := fmt.Sprintf("%s_%s_kpi_export_%d_%s.%s", strings.ToLower(query.NeType), query.NeID, len(rows), dateStr, fileType) + filePath := filepath.Join(s.backupService.BACKUP_DIR, fmt.Sprintf("/%s_kpi", strings.ToLower(query.NeType)), fileName) + if runtime.GOOS == "windows" { + filePath = fmt.Sprintf("C:%s", filePath) + } + + if fileType == "csv" { + data := [][]string{} + + // 获取kpiIdMap的键并排序 + var sortedKpiIds []string + for kpiId := range kpiIdMap { + sortedKpiIds = append(sortedKpiIds, kpiId) + } + sort.Strings(sortedKpiIds) // 按字母排序 + + // 头 - 按排序后的顺序添加标题 + header := []string{} + for _, kpiId := range sortedKpiIds { + header = append(header, kpiIdMap[kpiId]) + } + header = append(header, "NE Name") + header = append(header, "Time") + data = append(data, header) + + for _, row := range rows { + // 取时间 + timeStr := "" + if v, ok := row["timeGroup"]; ok && v != nil { + if releaseTime := parse.Number(v); releaseTime > 0 { + timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DD_HH_MM_SS_GMT_TZ) + } else { + timeStr = fmt.Sprintf("%s", v) + } + } + // 取网元名称 + neName := "" + if v, ok := row["neName"]; ok && v != nil { + neName = fmt.Sprintf("%s", v) + } + + // 按排序后的顺序获取数据 + dataRow := []string{} + for _, kpiId := range sortedKpiIds { + value := "" + if v, ok := row[kpiId]; ok && v != nil { + value = fmt.Sprint(v) + } + dataRow = append(dataRow, value) + } + dataRow = append(dataRow, neName) + dataRow = append(dataRow, timeStr) + data = append(data, dataRow) + } + // 输出到文件 + if err := file.WriterFileCSV(data, filePath); err != nil { + logger.Errorf("export operate log err => %v", err.Error()) + return "export err" + } + } + + if fileType == "xlsx" { + // 获取kpiIdMap的键并排序 + var sortedKpiIds []string + for kpiId := range kpiIdMap { + sortedKpiIds = append(sortedKpiIds, kpiId) + } + sort.Strings(sortedKpiIds) // 按字母排序 + + // 第一行表头标题 - 按排序后的顺序 + headerCells := map[string]string{} + colIndex := 0 + + // 先添加KPI标题列 + for i, kpiId := range sortedKpiIds { + colLetter := string(rune('A' + i)) + headerCells[colLetter+"1"] = kpiIdMap[kpiId] + colIndex++ + } + + // 添加NE Name和Time列 + neNameCol := string(rune('A' + colIndex)) + headerCells[neNameCol+"1"] = "NE Name" + colIndex++ + + timeCol := string(rune('A' + colIndex)) + headerCells[timeCol+"1"] = "Time" + + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + + // 取时间和网元名称 + timeStr := "" + if v, ok := row["timeGroup"]; ok && v != nil { + if releaseTime := parse.Number(v); releaseTime > 0 { + timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DD_HH_MM_SS_GMT_TZ) + } else { + timeStr = fmt.Sprintf("%s", v) + } + } + + neName := "" + if v, ok := row["neName"]; ok && v != nil { + neName = fmt.Sprintf("%s", v) + } + + // 按排序后的顺序填充数据 + dataCell := map[string]any{} + + // 填充KPI数据 + for j, kpiId := range sortedKpiIds { + value := "" + if v, ok := row[kpiId]; ok && v != nil { + value = fmt.Sprint(v) + } + colLetter := string(rune('A' + j)) + dataCell[colLetter+idx] = value + } + + // 填充NE Name和Time + dataCell[neNameCol+idx] = neName + dataCell[timeCol+idx] = timeStr + + dataCells = append(dataCells, dataCell) + } + // 导出数据表格 + if err := file.WriterFileExecl(headerCells, dataCells, filePath, ""); err != nil { + logger.Errorf("export operate log err => %v", err.Error()) + return "export err" + } + } + + // 上传到FTP服务器 + if err := s.backupService.FTPPushFile(filePath, ""); err != nil { + return "ok, ftp err:" + err.Error() + } + return "ok" +} diff --git a/src/modules/crontask/processor/processor.go b/src/modules/crontask/processor/processor.go index 188af2e1..20030ca1 100644 --- a/src/modules/crontask/processor/processor.go +++ b/src/modules/crontask/processor/processor.go @@ -4,6 +4,7 @@ import ( "be.ems/src/framework/cron" "be.ems/src/modules/crontask/processor/backupEtcFromNE" processorBackupExportCDR "be.ems/src/modules/crontask/processor/backup_export_cdr" + processorBackupExportKPI "be.ems/src/modules/crontask/processor/backup_export_kpi" processorBackupExportLog "be.ems/src/modules/crontask/processor/backup_export_log" processorBackupExportUDM "be.ems/src/modules/crontask/processor/backup_export_udm" processorBackupRemoveFile "be.ems/src/modules/crontask/processor/backup_remove_file" @@ -74,4 +75,6 @@ func InitCronQueue() { cron.CreateQueue("backup_export_cdr", processorBackupExportCDR.NewProcessor) // 备份-导出Log数据 cron.CreateQueue("backup_export_log", processorBackupExportLog.NewProcessor) + // 备份-导出KPI数据 + cron.CreateQueue("backup_export_kpi", processorBackupExportKPI.NewProcessor) }