From 38d2e2372a5b71e735f8cd8905763f1c3bcc8b9a Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 15 Sep 2025 11:00:34 +0800 Subject: [PATCH] =?UTF-8?q?ref:=20v3=E5=8F=98=E6=9B=B4,=EF=BC=8C=E8=A1=A8?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=8F=98=E6=9B=B4coreId/neId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/database/std/install/alarm.sql | 13 +- build/database/std/install/alarm_event.sql | 11 +- .../std/install/alarm_forward_log.sql | 10 +- build/database/std/install/alarm_log.sql | 10 +- build/database/std/install/cdr_event.sql | 15 +- build/database/std/install/cdr_event_ims.sql | 15 +- build/database/std/install/cdr_event_sgwc.sql | 15 +- build/database/std/install/cdr_event_smf.sql | 15 +- build/database/std/install/cdr_event_smsc.sql | 15 +- build/database/std/install/core_info.sql | 5 +- build/database/std/install/kpi_c_report.sql | 19 +- .../database/std/install/kpi_c_report_amf.sql | 12 +- .../std/install/kpi_c_report_ausf.sql | 12 +- .../database/std/install/kpi_c_report_cbc.sql | 12 +- .../database/std/install/kpi_c_report_hlr.sql | 12 +- .../database/std/install/kpi_c_report_ims.sql | 12 +- .../database/std/install/kpi_c_report_mme.sql | 12 +- .../std/install/kpi_c_report_mocngw.sql | 12 +- .../std/install/kpi_c_report_nssf.sql | 12 +- .../database/std/install/kpi_c_report_pcf.sql | 20 +- .../database/std/install/kpi_c_report_smf.sql | 12 +- .../std/install/kpi_c_report_smsc.sql | 12 +- .../database/std/install/kpi_c_report_udm.sql | 12 +- .../database/std/install/kpi_c_report_upf.sql | 12 +- build/database/std/install/kpi_report.sql | 12 +- build/database/std/install/kpi_report_amf.sql | 12 +- .../database/std/install/kpi_report_ausf.sql | 12 +- build/database/std/install/kpi_report_cbc.sql | 12 +- build/database/std/install/kpi_report_hlr.sql | 12 +- build/database/std/install/kpi_report_ims.sql | 12 +- build/database/std/install/kpi_report_mme.sql | 12 +- .../std/install/kpi_report_mocngw.sql | 12 +- .../database/std/install/kpi_report_nssf.sql | 12 +- build/database/std/install/kpi_report_pcf.sql | 12 +- build/database/std/install/kpi_report_smf.sql | 12 +- .../database/std/install/kpi_report_smsc.sql | 12 +- build/database/std/install/kpi_report_udm.sql | 12 +- build/database/std/install/kpi_report_upf.sql | 12 +- build/database/std/install/mml_log.sql | 11 +- build/database/std/install/nb_state.sql | 6 +- .../database/std/install/ne_config_backup.sql | 6 +- build/database/std/install/ne_info.sql | 26 +- build/database/std/install/ne_license.sql | 29 - build/database/std/install/ne_state.sql | 12 +- build/database/std/install/ne_version.sql | 8 +- build/database/std/install/sys_i18n.sql | 4 +- build/database/std/install/sys_menu.sql | 91 +++- build/database/std/install/trace_task.sql | 4 +- build/database/std/install/udm_auth.sql | 7 +- build/database/std/install/udm_extend.sql | 7 +- build/database/std/install/udm_sub.sql | 7 +- build/database/std/install/udm_voip.sql | 7 +- build/database/std/install/udm_volte_ims.sql | 15 +- build/database/std/install/ue_event.sql | 10 +- build/database/std/install/ue_event_amf.sql | 12 +- build/database/std/install/ue_event_mme.sql | 12 +- src/framework/constants/cache_key.go | 4 +- .../backup_export_cdr/backup_export_cdr.go | 294 +++++----- .../backup_export_table.go | 12 - .../backup_export_udm/backup_export_udm.go | 24 +- .../delete_ne_config_backup.go | 16 +- .../ne_alarm_state_check.go | 4 +- .../ne_alarm_state_check_cmd.go | 31 +- .../ne_alarm_state_check_license.go | 4 +- .../ne_config_backup/ne_config_backup.go | 12 +- .../processor/ne_data_udm/ne_data_udm.go | 8 +- src/modules/ne/controller/action.go | 94 ++-- src/modules/ne/controller/ne_config.go | 24 +- src/modules/ne/controller/ne_config_backup.go | 62 +-- src/modules/ne/controller/ne_info.go | 223 ++++++-- src/modules/ne/controller/ne_license.go | 302 ----------- src/modules/ne/controller/ne_software.go | 6 +- src/modules/ne/controller/ne_version.go | 28 +- src/modules/ne/model/ne_config_backup.go | 18 +- src/modules/ne/model/ne_info.go | 53 +- src/modules/ne/model/ne_license.go | 30 -- src/modules/ne/model/ne_version.go | 38 +- src/modules/ne/ne.go | 46 +- src/modules/ne/repository/ne_config_backup.go | 16 +- src/modules/ne/repository/ne_info.go | 49 +- src/modules/ne/repository/ne_license.go | 158 ------ src/modules/ne/repository/ne_version.go | 24 +- src/modules/ne/service/ne_config.go | 14 +- src/modules/ne/service/ne_config_backup.go | 29 +- src/modules/ne/service/ne_info.go | 506 +++++++++++------- src/modules/ne/service/ne_license.go | 185 ------- src/modules/ne/service/ne_software.go | 18 +- src/modules/ne/service/ne_version.go | 87 ++- src/modules/ne_data/controller/alarm.go | 66 ++- src/modules/ne_data/controller/backup.go | 6 +- src/modules/ne_data/controller/kpi.go | 10 +- src/modules/ne_data/controller/kpi_c.go | 10 +- src/modules/ne_data/controller/nb_state.go | 31 +- src/modules/ne_data/controller/ne_state.go | 10 +- src/modules/ne_data/model/alarm.go | 27 +- src/modules/ne_data/model/alarm_event.go | 25 +- .../ne_data/model/alarm_forward_log.go | 45 +- src/modules/ne_data/model/alarm_log.go | 37 +- src/modules/ne_data/model/kpi_c_report.go | 24 +- src/modules/ne_data/model/kpi_report.go | 24 +- src/modules/ne_data/model/nb_state.go | 27 +- src/modules/ne_data/model/ne_state.go | 37 +- src/modules/ne_data/repository/alarm.go | 101 ++-- src/modules/ne_data/repository/alarm_event.go | 92 ++-- .../ne_data/repository/alarm_forward_log.go | 80 ++- src/modules/ne_data/repository/alarm_log.go | 80 ++- .../ne_data/repository/kpi_c_report.go | 113 ++-- src/modules/ne_data/repository/kpi_report.go | 142 +++-- src/modules/ne_data/repository/nb_state.go | 41 +- src/modules/ne_data/repository/ne_state.go | 67 +-- src/modules/ne_data/service/alarm.go | 58 +- src/modules/ne_data/service/alarm_event.go | 16 +- src/modules/ne_data/service/kpi_c_report.go | 17 +- src/modules/ne_data/service/kpi_report.go | 43 +- src/modules/ne_data/service/ne_state.go | 8 +- src/modules/ne_data_nf/controller/amf.go | 48 +- src/modules/ne_data_nf/controller/cbc.go | 5 +- src/modules/ne_data_nf/controller/ims.go | 63 +-- src/modules/ne_data_nf/controller/mme.go | 48 +- src/modules/ne_data_nf/controller/n3iwf.go | 9 +- src/modules/ne_data_nf/controller/nssf.go | 14 +- src/modules/ne_data_nf/controller/pcf.go | 42 +- src/modules/ne_data_nf/controller/sgwc.go | 30 +- src/modules/ne_data_nf/controller/smf.go | 47 +- src/modules/ne_data_nf/controller/smsc.go | 30 +- src/modules/ne_data_nf/controller/udm_auth.go | 88 +-- src/modules/ne_data_nf/controller/udm_sub.go | 85 +-- src/modules/ne_data_nf/controller/udm_voip.go | 73 +-- .../ne_data_nf/controller/udm_volte_ims.go | 97 ++-- src/modules/ne_data_nf/controller/upf.go | 19 +- src/modules/ne_data_nf/fetch_link/alarm.go | 2 +- src/modules/ne_data_nf/fetch_link/amf.go | 4 +- src/modules/ne_data_nf/fetch_link/hlr.go | 4 +- src/modules/ne_data_nf/fetch_link/ims.go | 4 +- src/modules/ne_data_nf/fetch_link/mme.go | 4 +- src/modules/ne_data_nf/fetch_link/n3iwf.go | 2 +- .../ne_data_nf/fetch_link/ne_config.go | 16 +- src/modules/ne_data_nf/fetch_link/ne_state.go | 9 +- src/modules/ne_data_nf/fetch_link/ne_trace.go | 4 +- src/modules/ne_data_nf/fetch_link/nssf.go | 4 +- src/modules/ne_data_nf/fetch_link/pcf.go | 18 +- src/modules/ne_data_nf/fetch_link/smf.go | 4 +- src/modules/ne_data_nf/model/cdr_event.go | 12 +- src/modules/ne_data_nf/model/udm_auth.go | 18 +- src/modules/ne_data_nf/model/udm_extend.go | 10 +- src/modules/ne_data_nf/model/udm_sub.go | 10 +- src/modules/ne_data_nf/model/udm_voip.go | 6 +- src/modules/ne_data_nf/model/udm_volte_ims.go | 10 +- src/modules/ne_data_nf/model/ue_event.go | 14 +- .../ne_data_nf/repository/cdr_event.go | 141 +++-- src/modules/ne_data_nf/repository/udm_auth.go | 100 ++-- .../ne_data_nf/repository/udm_extend.go | 107 ++-- src/modules/ne_data_nf/repository/udm_sub.go | 101 ++-- src/modules/ne_data_nf/repository/udm_voip.go | 102 ++-- .../ne_data_nf/repository/udm_volte_ims.go | 97 ++-- src/modules/ne_data_nf/repository/ue_event.go | 139 +++-- src/modules/ne_data_nf/service/cbc_message.go | 6 +- src/modules/ne_data_nf/service/cdr_event.go | 230 ++++---- src/modules/ne_data_nf/service/udm_auth.go | 46 +- src/modules/ne_data_nf/service/udm_extend.go | 12 +- src/modules/ne_data_nf/service/udm_sub.go | 86 ++- src/modules/ne_data_nf/service/udm_voip.go | 46 +- .../ne_data_nf/service/udm_volte_ims.go | 61 +-- src/modules/ne_data_nf/service/ue_event.go | 8 +- src/modules/notification/service/email.go | 2 +- src/modules/notification/service/smsc.go | 2 +- src/modules/oam/controller/api_rest.go | 4 +- src/modules/oam/service/alarm.go | 63 +-- src/modules/oam/service/cdr.go | 23 +- src/modules/oam/service/kpi.go | 55 +- src/modules/oam/service/nb_state.go | 12 +- src/modules/oam/service/ue_nb.go | 20 +- src/modules/tool/controller/iperf.go | 26 +- src/modules/tool/controller/mml.go | 18 +- src/modules/tool/controller/ping.go | 28 +- src/modules/tool/model/mml_log.go | 21 +- src/modules/tool/repository/mml_log.go | 28 +- src/modules/tool/service/iperf.go | 4 +- src/modules/tool/service/ping.go | 4 +- src/modules/trace/controller/tcpdump.go | 17 +- src/modules/trace/controller/trace_task.go | 18 +- .../trace/controller/trace_task_hlr.go | 9 +- src/modules/trace/model/trace_task.go | 4 +- src/modules/trace/repository/trace_task.go | 9 +- src/modules/trace/service/tcpdump.go | 38 +- src/modules/trace/service/trace_task.go | 65 +-- src/modules/trace/service/trace_task_hlr.go | 25 +- src/modules/ws/controller/ws_view.go | 16 +- src/modules/ws/processor/cdr_connect.go | 12 +- src/modules/ws/processor/ne_state.go | 24 +- src/modules/ws/processor/ue_connect.go | 11 +- src/modules/ws/processor/upf_total_flow.go | 9 +- src/modules/ws/service/ws_send.go | 26 +- 193 files changed, 3255 insertions(+), 3878 deletions(-) delete mode 100644 build/database/std/install/ne_license.sql delete mode 100644 src/modules/ne/controller/ne_license.go delete mode 100644 src/modules/ne/model/ne_license.go delete mode 100644 src/modules/ne/repository/ne_license.go delete mode 100644 src/modules/ne/service/ne_license.go diff --git a/build/database/std/install/alarm.sql b/build/database/std/install/alarm.sql index e69edc6b..61627c91 100644 --- a/build/database/std/install/alarm.sql +++ b/build/database/std/install/alarm.sql @@ -4,14 +4,13 @@ DROP TABLE IF EXISTS `alarm`; CREATE TABLE `alarm` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '告警ID', `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题', `alarm_code` int DEFAULT '0' COMMENT '告警状态码', - `event_time` bigint DEFAULT '0' COMMENT '事件产生时间', + `event_time` bigint DEFAULT '0' COMMENT '产生时间', `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型', `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度', `perceived_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '告警级别', @@ -29,9 +28,7 @@ CREATE TABLE `alarm` ( `clear_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'NotClear' COMMENT '清除状态', `clear_time` bigint DEFAULT '0' COMMENT '清除时间', `clear_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户', - `created_at` bigint DEFAULT '0' COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_alarm_aid_aseq_atype` (`ne_uid`, `alarm_id`, `alarm_seq`, `alarm_type`) USING BTREE COMMENT '唯一网元资源产生的ID与序号与状态', - KEY `idx_alarm_status_severity_time` (`alarm_status`,`orig_severity`,`event_time`) USING BTREE COMMENT '索引-告警状态_告警级别_事件时间', - KEY `idx_alarm_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + UNIQUE KEY `uk_alarm_aid_aseq_atype` (`ne_id`, `alarm_id`, `alarm_seq`, `alarm_type`) USING BTREE COMMENT '唯一网元资源产生的ID与序号与状态', + KEY `idx_alarm_status_severity_time` (`alarm_status`,`orig_severity`,`event_time`) USING BTREE COMMENT '索引-告警状态_告警级别_事件时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='告警_记录表'; diff --git a/build/database/std/install/alarm_event.sql b/build/database/std/install/alarm_event.sql index 9cf4b537..3713c67d 100644 --- a/build/database/std/install/alarm_event.sql +++ b/build/database/std/install/alarm_event.sql @@ -4,9 +4,8 @@ DROP TABLE IF EXISTS `alarm_event`; CREATE TABLE `alarm_event` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '告警ID', `alarm_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警标题', @@ -23,11 +22,9 @@ CREATE TABLE `alarm_event` ( `clear_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'NotClear' COMMENT '清除状态', `clear_time` bigint DEFAULT '0' COMMENT '清除时间', `clear_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '清除用户', - `created_at` bigint DEFAULT '0' COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_aevent_aid_aseq` (`ne_uid`, `alarm_id`, `alarm_seq`) USING BTREE COMMENT '唯一网元资源产生的ID与序号与状态', - KEY `idx_aevent_status_etime` (`alarm_status`,`event_time`) USING BTREE COMMENT '索引-告警状态_事件时间', - KEY `idx_alarm_event_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + UNIQUE KEY `uk_aevent_ne_aid_aseq` (`ne_id`, `alarm_id`, `alarm_seq`) USING BTREE COMMENT '唯一网元资源产生的ID与序号与状态', + KEY `idx_aevent_status_etime` (`alarm_status`,`event_time`) USING BTREE COMMENT '索引-告警状态_事件时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='告警_事件记录表'; -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/install/alarm_forward_log.sql b/build/database/std/install/alarm_forward_log.sql index f552f009..6a157e20 100644 --- a/build/database/std/install/alarm_forward_log.sql +++ b/build/database/std/install/alarm_forward_log.sql @@ -5,9 +5,8 @@ DROP TABLE IF EXISTS `alarm_forward_log`; CREATE TABLE `alarm_forward_log` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警ID', `alarm_code` int DEFAULT '0' COMMENT '告警状态码', @@ -15,13 +14,12 @@ CREATE TABLE `alarm_forward_log` ( `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态', `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型', `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度 ', - `event_time` bigint DEFAULT '0' COMMENT '事件产生时间', - `created_at` bigint DEFAULT '0' COMMENT '创建时间', + `event_time` bigint DEFAULT '0' COMMENT '产生时间', `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '转发方式 SMS/EMAIL', `target` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '发送目标用户', `result` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '发送结果', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_alarm_forward_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_alarm_forward_ne_id_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='告警_转发日志记录'; SET FOREIGN_KEY_CHECKS=1; diff --git a/build/database/std/install/alarm_log.sql b/build/database/std/install/alarm_log.sql index 75f4f239..ed87112c 100644 --- a/build/database/std/install/alarm_log.sql +++ b/build/database/std/install/alarm_log.sql @@ -5,9 +5,8 @@ DROP TABLE IF EXISTS `alarm_log`; CREATE TABLE `alarm_log` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', `alarm_seq` int DEFAULT '0' COMMENT '告警序号 同网元类型连续递增', `alarm_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警ID', `alarm_code` int DEFAULT '0' COMMENT '告警状态码', @@ -15,10 +14,9 @@ CREATE TABLE `alarm_log` ( `alarm_status` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Active' COMMENT '告警状态', `alarm_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '告警类型', `orig_severity` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Minor' COMMENT '严重程度', - `event_time` bigint DEFAULT '0' COMMENT '事件产生时间', - `created_at` bigint DEFAULT '0' COMMENT '创建时间', + `event_time` bigint DEFAULT '0' COMMENT '产生时间', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_alog_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_alog_ne_id_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='告警_日志记录'; -- Dump completed on 2024-02-18 18:26:55 diff --git a/build/database/std/install/cdr_event.sql b/build/database/std/install/cdr_event.sql index df480941..e69ad654 100644 --- a/build/database/std/install/cdr_event.sql +++ b/build/database/std/install/cdr_event.sql @@ -1,20 +1,13 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for cdr_event -- ---------------------------- DROP TABLE IF EXISTS `cdr_event`; CREATE TABLE `cdr_event` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `timestamp` bigint DEFAULT '0' COMMENT '接收到的timestamp秒级存储毫秒时间戳', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `cdr_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', - `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_cdr_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_cdr_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='CDR事件_基础表结构'; - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/install/cdr_event_ims.sql b/build/database/std/install/cdr_event_ims.sql index 21200821..9ba1241e 100644 --- a/build/database/std/install/cdr_event_ims.sql +++ b/build/database/std/install/cdr_event_ims.sql @@ -1,20 +1,13 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for cdr_event_ims -- ---------------------------- DROP TABLE IF EXISTS `cdr_event_ims`; CREATE TABLE `cdr_event_ims` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `timestamp` bigint DEFAULT '0' COMMENT '接收到的timestamp秒级存储毫秒时间戳', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `cdr_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', - `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_cdr_ims_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_cdr_ims_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='CDR事件_IMS'; - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/install/cdr_event_sgwc.sql b/build/database/std/install/cdr_event_sgwc.sql index 4aa17e06..67d2af2a 100644 --- a/build/database/std/install/cdr_event_sgwc.sql +++ b/build/database/std/install/cdr_event_sgwc.sql @@ -1,20 +1,13 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for cdr_event_sgwc -- ---------------------------- DROP TABLE IF EXISTS `cdr_event_sgwc`; CREATE TABLE `cdr_event_sgwc` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `timestamp` bigint DEFAULT '0' COMMENT '接收到的timestamp秒级存储毫秒时间戳', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `cdr_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', - `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_cdr_sgwc_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_cdr_sgwc_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='CDR事件_SGWC'; - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/install/cdr_event_smf.sql b/build/database/std/install/cdr_event_smf.sql index 567aa9fd..25cffa27 100644 --- a/build/database/std/install/cdr_event_smf.sql +++ b/build/database/std/install/cdr_event_smf.sql @@ -1,20 +1,13 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for cdr_event_smf -- ---------------------------- DROP TABLE IF EXISTS `cdr_event_smf`; CREATE TABLE `cdr_event_smf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `timestamp` bigint DEFAULT '0' COMMENT '接收到的timestamp秒级存储毫秒时间戳', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `cdr_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', - `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_cdr_smf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_cdr_smf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='CDR事件_SMF'; - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/install/cdr_event_smsc.sql b/build/database/std/install/cdr_event_smsc.sql index e9fc360a..a04fb4f7 100644 --- a/build/database/std/install/cdr_event_smsc.sql +++ b/build/database/std/install/cdr_event_smsc.sql @@ -1,20 +1,13 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for cdr_event_smsc -- ---------------------------- DROP TABLE IF EXISTS `cdr_event_smsc`; CREATE TABLE `cdr_event_smsc` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `timestamp` bigint DEFAULT '0' COMMENT '接收到的timestamp秒级存储毫秒时间戳', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `cdr_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', - `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_cdr_smsc_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_cdr_smsc_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='CDR事件_SMSC'; - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/build/database/std/install/core_info.sql b/build/database/std/install/core_info.sql index 89787954..030e5448 100644 --- a/build/database/std/install/core_info.sql +++ b/build/database/std/install/core_info.sql @@ -17,13 +17,12 @@ CREATE TABLE `core_info` ( `create_time` bigint DEFAULT '0' COMMENT '创建时间', `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', `update_time` bigint DEFAULT '0' COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_core_name_sn` (`name`,`sn`) USING BTREE COMMENT '唯一名称和序号定义' + PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='核心网_基础信息表'; -- ---------------------------- -- Records of core_info -- ---------------------------- -INSERT INTO `core_info` VALUES (1, 'YYMMDDHH', 'Default', '12345678', 'Omachine', '', 0, 0, '', '', 'admin', 1755863386664, 'admin', 1755863386664); +INSERT INTO `core_info` VALUES (1, 'YYMMDDHH', 'Global', '12345678', '12345678', '', 0, 0, '', '', 'admin', 1755863386664, 'admin', 1755863386664); -- Dump completed on 2025-06-04 15:26:56 diff --git a/build/database/std/install/kpi_c_report.sql b/build/database/std/install/kpi_c_report.sql index 423836a4..04d156e7 100644 --- a/build/database/std/install/kpi_c_report.sql +++ b/build/database/std/install/kpi_c_report.sql @@ -1,24 +1,15 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - -- ---------------------------- -- Table structure for kpi_c_report -- ---------------------------- DROP TABLE IF EXISTS `kpi_c_report`; CREATE TABLE `kpi_c_report` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据记录基础表结构'; - -SET FOREIGN_KEY_CHECKS = 1; + KEY `idx_kpic_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据记录基础表'; diff --git a/build/database/std/install/kpi_c_report_amf.sql b/build/database/std/install/kpi_c_report_amf.sql index 85e4d195..f3a7685e 100644 --- a/build/database/std/install/kpi_c_report_amf.sql +++ b/build/database/std/install/kpi_c_report_amf.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_amf`; CREATE TABLE `kpi_c_report_amf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_amf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_amf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_AMF'; diff --git a/build/database/std/install/kpi_c_report_ausf.sql b/build/database/std/install/kpi_c_report_ausf.sql index 55e212ea..3b05b7dd 100644 --- a/build/database/std/install/kpi_c_report_ausf.sql +++ b/build/database/std/install/kpi_c_report_ausf.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_ausf`; CREATE TABLE `kpi_c_report_ausf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_ausf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_ausf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_AUSF'; diff --git a/build/database/std/install/kpi_c_report_cbc.sql b/build/database/std/install/kpi_c_report_cbc.sql index 7bd8dd57..c580e237 100644 --- a/build/database/std/install/kpi_c_report_cbc.sql +++ b/build/database/std/install/kpi_c_report_cbc.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_cbc`; CREATE TABLE `kpi_c_report_cbc` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_cbc_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_cbc_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_CBC'; diff --git a/build/database/std/install/kpi_c_report_hlr.sql b/build/database/std/install/kpi_c_report_hlr.sql index d4df9ecc..a24a34ba 100644 --- a/build/database/std/install/kpi_c_report_hlr.sql +++ b/build/database/std/install/kpi_c_report_hlr.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_hlr`; CREATE TABLE `kpi_c_report_hlr` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_hlr_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_hlr_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_HLR'; diff --git a/build/database/std/install/kpi_c_report_ims.sql b/build/database/std/install/kpi_c_report_ims.sql index c831bc78..d59d11c0 100644 --- a/build/database/std/install/kpi_c_report_ims.sql +++ b/build/database/std/install/kpi_c_report_ims.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_ims`; CREATE TABLE `kpi_c_report_ims` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_ims_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_ims_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_IMS'; diff --git a/build/database/std/install/kpi_c_report_mme.sql b/build/database/std/install/kpi_c_report_mme.sql index 9567f89e..1d85defa 100644 --- a/build/database/std/install/kpi_c_report_mme.sql +++ b/build/database/std/install/kpi_c_report_mme.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_mme`; CREATE TABLE `kpi_c_report_mme` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_mme_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_mme_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_MME'; diff --git a/build/database/std/install/kpi_c_report_mocngw.sql b/build/database/std/install/kpi_c_report_mocngw.sql index 8803a036..011c0968 100644 --- a/build/database/std/install/kpi_c_report_mocngw.sql +++ b/build/database/std/install/kpi_c_report_mocngw.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_mocngw`; CREATE TABLE `kpi_c_report_mocngw` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_mocngw_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_mocngw_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_MOCNGW'; diff --git a/build/database/std/install/kpi_c_report_nssf.sql b/build/database/std/install/kpi_c_report_nssf.sql index 5c7002be..d8c001e6 100644 --- a/build/database/std/install/kpi_c_report_nssf.sql +++ b/build/database/std/install/kpi_c_report_nssf.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_nssf`; CREATE TABLE `kpi_c_report_nssf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_nssf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_nssf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_NSSF'; diff --git a/build/database/std/install/kpi_c_report_pcf.sql b/build/database/std/install/kpi_c_report_pcf.sql index 6ebb6b39..04d156e7 100644 --- a/build/database/std/install/kpi_c_report_pcf.sql +++ b/build/database/std/install/kpi_c_report_pcf.sql @@ -1,19 +1,15 @@ -- ---------------------------- --- Table structure for kpi_c_report_pcf +-- Table structure for kpi_c_report -- ---------------------------- -DROP TABLE IF EXISTS `kpi_c_report_pcf`; -CREATE TABLE `kpi_c_report_pcf` ( +DROP TABLE IF EXISTS `kpi_c_report`; +CREATE TABLE `kpi_c_report` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_pcf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_PCF'; + KEY `idx_kpic_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据记录基础表'; diff --git a/build/database/std/install/kpi_c_report_smf.sql b/build/database/std/install/kpi_c_report_smf.sql index 91514dfe..724e832d 100644 --- a/build/database/std/install/kpi_c_report_smf.sql +++ b/build/database/std/install/kpi_c_report_smf.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_smf`; CREATE TABLE `kpi_c_report_smf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_smf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_smf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_SMF'; diff --git a/build/database/std/install/kpi_c_report_smsc.sql b/build/database/std/install/kpi_c_report_smsc.sql index 188673f3..2bcf266b 100644 --- a/build/database/std/install/kpi_c_report_smsc.sql +++ b/build/database/std/install/kpi_c_report_smsc.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_smsc`; CREATE TABLE `kpi_c_report_smsc` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_smsc_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_smsc_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_SMSC'; diff --git a/build/database/std/install/kpi_c_report_udm.sql b/build/database/std/install/kpi_c_report_udm.sql index f6d29765..e568501b 100644 --- a/build/database/std/install/kpi_c_report_udm.sql +++ b/build/database/std/install/kpi_c_report_udm.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_udm`; CREATE TABLE `kpi_c_report_udm` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_udm_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_udm_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_UDM'; diff --git a/build/database/std/install/kpi_c_report_upf.sql b/build/database/std/install/kpi_c_report_upf.sql index 3996ba8b..9b542085 100644 --- a/build/database/std/install/kpi_c_report_upf.sql +++ b/build/database/std/install/kpi_c_report_upf.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_c_report_upf`; CREATE TABLE `kpi_c_report_upf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpic_upf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_创建时间' + KEY `idx_kpic_upf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_自定义指标数据_UPF'; diff --git a/build/database/std/install/kpi_report.sql b/build/database/std/install/kpi_report.sql index cbc73334..23534c48 100644 --- a/build/database/std/install/kpi_report.sql +++ b/build/database/std/install/kpi_report.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report`; CREATE TABLE `kpi_report` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据记录基础表'; diff --git a/build/database/std/install/kpi_report_amf.sql b/build/database/std/install/kpi_report_amf.sql index ecd5752c..a643934f 100644 --- a/build/database/std/install/kpi_report_amf.sql +++ b/build/database/std/install/kpi_report_amf.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_amf`; CREATE TABLE `kpi_report_amf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_amf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_amf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_AMF'; diff --git a/build/database/std/install/kpi_report_ausf.sql b/build/database/std/install/kpi_report_ausf.sql index 6c6a736c..e845aeb5 100644 --- a/build/database/std/install/kpi_report_ausf.sql +++ b/build/database/std/install/kpi_report_ausf.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_ausf`; CREATE TABLE `kpi_report_ausf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_ausf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_ausf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_AUSF'; diff --git a/build/database/std/install/kpi_report_cbc.sql b/build/database/std/install/kpi_report_cbc.sql index 95f8f676..2e3c97e5 100644 --- a/build/database/std/install/kpi_report_cbc.sql +++ b/build/database/std/install/kpi_report_cbc.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_cbc`; CREATE TABLE `kpi_report_cbc` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_cbc_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_cbc_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_CBC'; diff --git a/build/database/std/install/kpi_report_hlr.sql b/build/database/std/install/kpi_report_hlr.sql index 22c42269..87ee6fa8 100644 --- a/build/database/std/install/kpi_report_hlr.sql +++ b/build/database/std/install/kpi_report_hlr.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_hlr`; CREATE TABLE `kpi_report_hlr` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_hlr_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_hlr_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_HLR'; diff --git a/build/database/std/install/kpi_report_ims.sql b/build/database/std/install/kpi_report_ims.sql index d5b6f162..9212e551 100644 --- a/build/database/std/install/kpi_report_ims.sql +++ b/build/database/std/install/kpi_report_ims.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_ims`; CREATE TABLE `kpi_report_ims` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_ims_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_ims_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_IMS'; diff --git a/build/database/std/install/kpi_report_mme.sql b/build/database/std/install/kpi_report_mme.sql index ab944ca2..4246a86a 100644 --- a/build/database/std/install/kpi_report_mme.sql +++ b/build/database/std/install/kpi_report_mme.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_mme`; CREATE TABLE `kpi_report_mme` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_mme_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_mme_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_MME'; diff --git a/build/database/std/install/kpi_report_mocngw.sql b/build/database/std/install/kpi_report_mocngw.sql index 700c710d..c0b864b1 100644 --- a/build/database/std/install/kpi_report_mocngw.sql +++ b/build/database/std/install/kpi_report_mocngw.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_mocngw`; CREATE TABLE `kpi_report_mocngw` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_mocngw_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_mocngw_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_MOCNGW'; diff --git a/build/database/std/install/kpi_report_nssf.sql b/build/database/std/install/kpi_report_nssf.sql index f30286e7..1d8a6d65 100644 --- a/build/database/std/install/kpi_report_nssf.sql +++ b/build/database/std/install/kpi_report_nssf.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_nssf`; CREATE TABLE `kpi_report_nssf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_nssf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_nssf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_NSSF'; diff --git a/build/database/std/install/kpi_report_pcf.sql b/build/database/std/install/kpi_report_pcf.sql index 55b56a00..80a14b35 100644 --- a/build/database/std/install/kpi_report_pcf.sql +++ b/build/database/std/install/kpi_report_pcf.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_pcf`; CREATE TABLE `kpi_report_pcf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_pcf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_pcf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_PCF'; diff --git a/build/database/std/install/kpi_report_smf.sql b/build/database/std/install/kpi_report_smf.sql index 177fb1d7..bce197d9 100644 --- a/build/database/std/install/kpi_report_smf.sql +++ b/build/database/std/install/kpi_report_smf.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_smf`; CREATE TABLE `kpi_report_smf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_smf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_smf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_SMF'; diff --git a/build/database/std/install/kpi_report_smsc.sql b/build/database/std/install/kpi_report_smsc.sql index a28a6bd2..2ae1ea22 100644 --- a/build/database/std/install/kpi_report_smsc.sql +++ b/build/database/std/install/kpi_report_smsc.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_smsc`; CREATE TABLE `kpi_report_smsc` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_smsc_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_smsc_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_SMSC'; diff --git a/build/database/std/install/kpi_report_udm.sql b/build/database/std/install/kpi_report_udm.sql index 520e0e81..b7b95c1a 100644 --- a/build/database/std/install/kpi_report_udm.sql +++ b/build/database/std/install/kpi_report_udm.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_udm`; CREATE TABLE `kpi_report_udm` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_udm_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_udm_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_UDM'; diff --git a/build/database/std/install/kpi_report_upf.sql b/build/database/std/install/kpi_report_upf.sql index 492b44c2..f3a36246 100644 --- a/build/database/std/install/kpi_report_upf.sql +++ b/build/database/std/install/kpi_report_upf.sql @@ -4,16 +4,12 @@ DROP TABLE IF EXISTS `kpi_report_upf`; CREATE TABLE `kpi_report_upf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `date` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Date of the report yyyy-mm-dd hh:mi:ss', - `start_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'Start time of the report hh:mi:ss', - `end_time` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'End time of the report hh:mi:ss', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `created_time` bigint DEFAULT '0' COMMENT '创建时间', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', `index` int NOT NULL COMMENT 'Index of the report', `granularity` int DEFAULT '60' COMMENT 'Time granualarity: 5/10/.../60/300 (second)', `kpi_values` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'KPI values JSON String', - `created_at` bigint DEFAULT '0' COMMENT 'Creation time 接收到的timestamp秒级存储毫秒时间戳', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_kpi_upf_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `created_at` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_kpi_upf_ne_at` (`ne_id` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元ID_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='KPI_指标数据_UPF'; diff --git a/build/database/std/install/mml_log.sql b/build/database/std/install/mml_log.sql index ab80d96b..bce7ab71 100644 --- a/build/database/std/install/mml_log.sql +++ b/build/database/std/install/mml_log.sql @@ -5,15 +5,12 @@ DROP TABLE IF EXISTS `mml_log`; CREATE TABLE `mml_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `user` varchar(32) DEFAULT NULL, - `ip` varchar(64) DEFAULT NULL, + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', `command` varchar(512) DEFAULT NULL COMMENT '命令 ; 分隔', `result` varchar(255) DEFAULT NULL COMMENT '成功和有错误', - `log_time` bigint DEFAULT '0' COMMENT '记录时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; --- Dump completed on 2024-03-06 17:26:56 +-- Dump completed on 2025-09-11 17:26:56 diff --git a/build/database/std/install/nb_state.sql b/build/database/std/install/nb_state.sql index c63dc48c..27c5130b 100644 --- a/build/database/std/install/nb_state.sql +++ b/build/database/std/install/nb_state.sql @@ -4,9 +4,7 @@ DROP TABLE IF EXISTS `nb_state`; CREATE TABLE `nb_state` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', `create_time` bigint DEFAULT '0' COMMENT '创建时间', `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '基站IP地址', `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '基站名称', @@ -15,5 +13,5 @@ CREATE TABLE `nb_state` ( `state` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'OFF' COMMENT '基站状态 OFF ON', `time` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '状态时间', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_nbst_cn_uid_at` (`core_uid` DESC, `ne_uid` DESC, `ne_type` DESC, `create_time` DESC) USING BTREE COMMENT '索引-核心网_资源标识_记录时间' + KEY `idx_nbst_ne_at` (`ne_id` DESC, `create_time` DESC) USING BTREE COMMENT '索引-网元_记录时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='基站_状态记录表'; diff --git a/build/database/std/install/ne_config_backup.sql b/build/database/std/install/ne_config_backup.sql index 5d01d8e8..87aa4ba5 100644 --- a/build/database/std/install/ne_config_backup.sql +++ b/build/database/std/install/ne_config_backup.sql @@ -4,9 +4,7 @@ DROP TABLE IF EXISTS `ne_config_backup`; CREATE TABLE `ne_config_backup` ( `id` bigint NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '压缩包名称', `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '压缩包位置', `remark` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', @@ -15,5 +13,5 @@ CREATE TABLE `ne_config_backup` ( `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_cfgbak_uid_type` (`core_uid`,`ne_uid`,`ne_type`) USING BTREE COMMENT '索引-核心网_资源标识_类型' + KEY `idx_cfgbak_ne_name` (`ne_id`,`name`) USING BTREE COMMENT '索引-网元_包名' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_配置文件备份记录'; diff --git a/build/database/std/install/ne_info.sql b/build/database/std/install/ne_info.sql index 00c23937..2dab7b00 100644 --- a/build/database/std/install/ne_info.sql +++ b/build/database/std/install/ne_info.sql @@ -4,7 +4,12 @@ DROP TABLE IF EXISTS `ne_info`; CREATE TABLE `ne_info` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '网元ID', - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', + `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', + `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', + `update_time` bigint DEFAULT '0' COMMENT '更新时间', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', + `core_id` bigint DEFAULT '0' COMMENT '核心网ID 1为全局默认', `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元名称', @@ -15,18 +20,19 @@ CREATE TABLE `ne_info` ( `vendor_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '厂商名称', `dn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '网络标识', `mac_addr` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'MAC地址', + `activation_request_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '激活申请代码', + `license_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '激活授权文件', + `serial_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '序列号', + `expiry_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '许可证到期日期', + `ue_number` bigint DEFAULT '0' COMMENT '用户容量', + `nb_number` bigint DEFAULT '0' COMMENT '基站容量', `host_ids` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元主机ID组 数据格式(ssh,telnet) UDM(ssh,telnet,redis) UPF(ssh,telnet,telnet)', - `status` int DEFAULT '0' COMMENT '网元状态 0离线 1在线 2配置待下发 3备用模式', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', - `create_time` bigint DEFAULT '0' COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', - `update_time` bigint DEFAULT '0' COMMENT '更新时间', + `status` int DEFAULT '0' COMMENT '网元状态 0离线 1在线 2配置待下发 3备用模式 4授权无效', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_core_ne_type` (`core_uid`,`ne_uid`,`ne_type`) USING BTREE COMMENT '唯一核心网_资源标识_类型' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_基础信息表 关联创建版本、授权、主机'; + UNIQUE KEY `uk_core_uid_type` (`core_id`,`ne_uid`,`ne_type`) USING BTREE COMMENT '唯一核心网_资源标识_类型' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_基础信息表 关联创建版本、主机'; -- -- Dumping data for table `ne_info` -- -INSERT INTO `ne_info` VALUES (1, 'YYMMDDHH', 'DCTHWYBT', 'OMC', 'OMC_001', '127.0.0.1', 33080, 'PNF', 'Area', '', '', '', '1,2', 1, '', 'system', 1755861727150, 'system', 1756286314456); +INSERT INTO `ne_info` VALUES (1, 'system', 1756286314456, 'system', 1756286314456, '', 0, 'DCTHWYBT', 'OMC', 'OMC_ROOT', '127.0.0.1', 33080, 'PNF', 'AreaNet', '-', '-', '', '', '', '-', '-', 0, 0, '1,2', 0); diff --git a/build/database/std/install/ne_license.sql b/build/database/std/install/ne_license.sql deleted file mode 100644 index e8575c54..00000000 --- a/build/database/std/install/ne_license.sql +++ /dev/null @@ -1,29 +0,0 @@ --- --- Table structure for table `ne_license` --- -DROP TABLE IF EXISTS `ne_license`; -CREATE TABLE `ne_license` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `activation_request_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '激活申请代码', - `license_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '激活授权文件', - `serial_num` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '序列号', - `expiry_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '许可证到期日期', - `ue_number` bigint DEFAULT '0' COMMENT '用户容量', - `nb_number` bigint DEFAULT '0' COMMENT '基站容量', - `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态 0无效 1有效', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', - `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者', - `create_time` bigint DEFAULT '0' COMMENT '创建时间', - `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', - `update_time` bigint DEFAULT '0' COMMENT '更新时间', - PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_lic_core_ne_type` (`core_uid`,`ne_uid`,`ne_type`) USING BTREE COMMENT '唯一核心网_资源标识_类型' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_授权激活信息'; - --- --- Dumping data for table `ne_license` --- -INSERT INTO `ne_license` VALUES (1, 'YYMMDDHH', 'DCTHWYBT', 'OMC', '', '', '-', '-', 0, 0, '1', '', 'system', 1756089692896, 'system', 1756173372114); diff --git a/build/database/std/install/ne_state.sql b/build/database/std/install/ne_state.sql index 1dcdf568..ffeb122b 100644 --- a/build/database/std/install/ne_state.sql +++ b/build/database/std/install/ne_state.sql @@ -4,19 +4,13 @@ DROP TABLE IF EXISTS `ne_state`; CREATE TABLE `ne_state` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `version` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '版本', - `capability` bigint DEFAULT '0' COMMENT '用户容量', - `serial_num` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '序列号', - `expiry_date` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '许可证到期日期', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `create_time` bigint DEFAULT '0' COMMENT '创建时间', `sys_cpu_usage` float DEFAULT '0' COMMENT 'cpu使用率-sys', `sys_mem_usage` float DEFAULT '0' COMMENT '内存使用率-sys', `sys_disk_usage` float DEFAULT '0' COMMENT '磁盘使用率-sys', `nf_cpu_usage` float DEFAULT '0' COMMENT 'cpu使用率-nf', `nf_mem_used` bigint DEFAULT '0' COMMENT '内存使用KB-nf', - `create_time` bigint DEFAULT '0' COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_state_uid_type` (`core_uid`,`ne_uid`,`ne_type`) USING BTREE COMMENT '索引-核心网_资源标识_类型' + KEY `idx_state_ne_at` (`ne_id`,`create_time`) USING BTREE COMMENT '索引-网元_创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_状态记录内存/CPU/磁盘'; diff --git a/build/database/std/install/ne_version.sql b/build/database/std/install/ne_version.sql index 8ec813f5..d7e56fa7 100644 --- a/build/database/std/install/ne_version.sql +++ b/build/database/std/install/ne_version.sql @@ -4,9 +4,7 @@ DROP TABLE IF EXISTS `ne_version`; CREATE TABLE `ne_version` ( `id` bigint NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', `name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '当前包名', `version` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '-' COMMENT '当前版本', `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '当前软件包', @@ -22,10 +20,10 @@ CREATE TABLE `ne_version` ( `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者', `update_time` bigint DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_ver_core_ne_type` (`core_uid`,`ne_uid`,`ne_type`) USING BTREE COMMENT '唯一核心网_资源标识_类型' + UNIQUE KEY `uk_ver_ne_name_ver` (`ne_id`,`name`,`version`) USING BTREE COMMENT '唯一核心网_资源标识_类型' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='网元_版本信息'; -- -- Dumping data for table `ne_version` -- -INSERT INTO `ne_version` VALUES (1, 'YYMMDDHH', 'DCTHWYBT', 'OMC', '-', '-', '-', '', '', '', '', '', '', '', 'system', 1756089685222, 'system', 1756089866077); +INSERT INTO `ne_version` VALUES (1, 1, '-', '-', '-', '', '', '', '', '', '', '', 'system', 1756089685222, 'system', 1756089866077); diff --git a/build/database/std/install/sys_i18n.sql b/build/database/std/install/sys_i18n.sql index 1192f258..15f6272d 100644 --- a/build/database/std/install/sys_i18n.sql +++ b/build/database/std/install/sys_i18n.sql @@ -613,7 +613,7 @@ INSERT INTO `sys_i18n` VALUES (595, 'dictType.ne_info_status', '网元信息状 INSERT INTO `sys_i18n` VALUES (596, 'menu.ne.neQuickSetup', '网元快速安装', 'NE Quick Setup'); INSERT INTO `sys_i18n` VALUES (597, 'log.operate.title.neConfig', '网元参数配置', 'NE Parameter Configuration'); INSERT INTO `sys_i18n` VALUES (598, 'menu.ne.neLicense', '网元许可', 'NE License'); -INSERT INTO `sys_i18n` VALUES (599, 'log.operate.title.neLicense', '网元许可', 'NE License'); +-- INSERT INTO `sys_i18n` VALUES (599, 'log.operate.title.neLicense', '网元许可', 'NE License'); INSERT INTO `sys_i18n` VALUES (600, 'menu.ne.neSoftware', '网元软件包', 'NE Software'); INSERT INTO `sys_i18n` VALUES (601, 'log.operate.title.neSoftware', '网元软件包', 'NE Software'); INSERT INTO `sys_i18n` VALUES (602, 'log.operate.title.neVersion', '网元版本', 'NE Version'); @@ -733,7 +733,7 @@ INSERT INTO `sys_i18n` VALUES (715, 'alarm.export.clearTime', '告警清除时 INSERT INTO `sys_i18n` VALUES (716, 'log.operate.title.alarm', '告警', 'Alarm'); INSERT INTO `sys_i18n` VALUES (717, 'ne.common.neType', '网元类型', 'NE Type'); INSERT INTO `sys_i18n` VALUES (718, 'ne.common.neName', '网元名称', 'NE Name'); -INSERT INTO `sys_i18n` VALUES (719, 'ne.common.neId', '网元标识', 'NE ID'); +INSERT INTO `sys_i18n` VALUES (719, 'ne.common.neUid', '网元标识', 'NE UID'); INSERT INTO `sys_i18n` VALUES (720, 'log.operate.title.udmVOIP', 'UDM VoIP', 'UDM VoIP'); INSERT INTO `sys_i18n` VALUES (721, 'log.operate.title.udmVolteIMS', 'UDM VolteIMS', 'UDM VolteIMS'); INSERT INTO `sys_i18n` VALUES (722, 'log.operate.title.backup', '备份', 'Backup'); diff --git a/build/database/std/install/sys_menu.sql b/build/database/std/install/sys_menu.sql index 191e6e40..2841c651 100644 --- a/build/database/std/install/sys_menu.sql +++ b/build/database/std/install/sys_menu.sql @@ -35,6 +35,7 @@ INSERT INTO `sys_menu` VALUES (1, 'menu.system', 0, 90, 'system', '', '1', '1', INSERT INTO `sys_menu` VALUES (4, 'menu.ne', 0, 8, 'ne', '', '1', '0', 'D', '1', '1', '', 'icon-huizhiguize', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.configRemark', '0', '0', ''); INSERT INTO `sys_menu` VALUES (5, 'menu.ue', 0, 6, 'ue', '', '1', '0', 'D', '1', '1', '', 'icon-wocanyu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.ueRemark', '0', '0', 'udm'); INSERT INTO `sys_menu` VALUES (6, 'menu.neData', 0, 10, 'ne-data', '', '1', '0', 'D', '1', '1', '', 'icon-suofang', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.neDataRemark', '0', '0', ''); +INSERT INTO `sys_menu` VALUES (8, 'menu.neCore', 0, 2, 'ne-core', '', '1', '0', 'D', '1', '1', '', 'icon-suofang', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (60, 'menu.tools', 0, 60, 'tool', '', '1', '1', 'D', '1', '1', '', 'icon-wenjian', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.toolsRemark', '0', '0', ''); INSERT INTO `sys_menu` VALUES (61, 'menu.tools.terminal', 60, 20, 'terminal', 'tool/terminal/index', '1', '1', 'M', '1', '1', 'tool:terminal:index', 'icon-suofang', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (62, 'menu.tools.help', 60, 62, 'help', 'tool/help/index', '1', '1', 'M', '0', '1', 'tool:help:list', 'icon-shuoming', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.tools.helpRemark', '0', '0', ''); @@ -130,7 +131,7 @@ INSERT INTO `sys_menu` VALUES (2008, 'menu.ueUser.n3iwf', 6, 18, 'n3iwf', 'neDat INSERT INTO `sys_menu` VALUES (2009, 'menu.neData.pcfSub', 5, 24, 'pcf-sub', 'neData/pcf-sub/index', '1', '0', 'M', '1', '1', 'pcf:sub:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '1', 'pcf'); INSERT INTO `sys_menu` VALUES (2010, 'menu.neUser.nssf', 6, 19, 'nssf', 'neData/nssf-sub/index', '1', '0', 'M', '1', '1', 'nssf:sub:index', 'icon-daimayingyong', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '1', 'nssf'); INSERT INTO `sys_menu` VALUES (2011, 'menu.neUser.nssfAmf', 6, 20, 'nssfAmf', 'neData/nssf-amf/index', '1', '0', 'M', '1', '1', 'nssf:sub:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '1', 'nssf'); -INSERT INTO `sys_menu` VALUES (2082, 'menu.neCore.info', 8, 6, 'info', 'neCore/coreInfo/index', '1', '1', 'M', '1', '1', 'neCore:info:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2082, 'menu.neCore.info', 8, 6, 'info', 'ne/core/index', '1', '1', 'M', '1', '1', 'neCore:info:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '1', ''); INSERT INTO `sys_menu` VALUES (2083, 'menu.trace', 2083, 30, 'trace', '', '1', '0', 'D', '1', '1', '', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, 'menu.traceRemark', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2084, 'menu.trace.task', 4, 40, 'task', 'ne/trace/task/index', '1', '0', 'M', '1', '1', 'traceManage:task:index', 'icon-chexiao', '0', 'system', 1728641403588, 'system', 1744453890548, 'menu.trace.taskRemark', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2085, 'menu.trace.taskData', 2084, 41, 'task/inline/data', 'ne/trace/task/data', '1', '0', 'M', '0', '1', 'traceManage:task:data', '#', '0', 'system', 1728641403588, 'system', 1744453921381, '', '0', '0', ''); @@ -185,7 +186,7 @@ INSERT INTO `sys_menu` VALUES (2139, 'menu.perf.kpiOverviewIMS', 2099, 14, 'over INSERT INTO `sys_menu` VALUES (2140, 'menu.monitor.cdr', 6, 25, 'cdr', '', '1', '0', 'D', '1', '1', '', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2141, 'menu.monitor.event', 6, 26, 'event', '', '1', '0', 'D', '1', '1', '', 'icon-gengduo', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2142, 'menu.ne.neQuickSetup', 4, 50, 'neQuickSetup', 'ne/neQuickSetup/index', '1', '1', 'M', '1', '1', 'ne:neQuickSetup:list', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); -INSERT INTO `sys_menu` VALUES (2143, 'menu.ne.neLicense', 4, 20, 'neLicense', 'ne/neLicense/index', '1', '0', 'M', '1', '1', 'ne:neLicense:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); +-- INSERT INTO `sys_menu` VALUES (2143, 'menu.ne.neLicense', 4, 20, 'neLicense', 'ne/neLicense/index', '1', '0', 'M', '1', '1', 'ne:neLicense:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2144, 'menu.ne.neSoftware', 4, 24, 'neSoftware', 'ne/neSoftware/index', '1', '0', 'M', '1', '1', 'ne:neSoftware:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2145, 'menu.ne.neVersion', 4, 22, 'neVersion', 'ne/neVersion/index', '1', '0', 'M', '1', '1', 'ne:neVersion:list', 'icon-fuzhidaima', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2146, 'menu.ne.neConfig', 4, 28, 'neConfig', 'ne/neConfig/index', '1', '0', 'M', '1', '1', 'ne:neConfig:list', 'icon-wofaqi', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); @@ -201,7 +202,7 @@ INSERT INTO `sys_menu` VALUES (2155, 'menu.common.delete', 2154, 1, '#', '', '1' INSERT INTO `sys_menu` VALUES (2156, 'menu.common.edit', 2154, 2, '#', '', '1', '1', 'B', '1', '1', 'ne:neConfigBackup:edit', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2157, 'menu.dashboard.smscCDR', 2140, 9, 'smsc-cdr', 'neData/smsc-cdr/index', '1', '0', 'M', '1', '1', 'smsc:cdr:index', 'icon-paixu', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '1', 'smsc'); INSERT INTO `sys_menu` VALUES (2158, 'menu.trace.pcapFile', 60, 12, 'pcap/inline/file', 'tool/pcap/file', '1', '0', 'M', '0', '1', 'traceManage:pcap:index', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); -INSERT INTO `sys_menu` VALUES (2159, 'menu.neCore.overview', 8, 2, 'overview', 'neCore/overview/index', '1', '1', 'M', '1', '1', 'neCore:overview:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2159, 'menu.neCore.overview', 8, 2, 'overview', 'ne/core/index', '1', '1', 'M', '1', '1', 'neCore:overview:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '1', ''); INSERT INTO `sys_menu` VALUES (2160, 'menu.perf.kpic', 2099, 100, 'kpic', 'perfManage/kpic/index', '1', '0', 'M', '1', '1', 'perfManage:kpiCReport:index', 'icon-tubiaoku', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2161, 'menu.trace.taskHLR', 4, 45, 'taskHLR', 'ne/trace/task-hlr/index', '1', '0', 'M', '0', '1', 'traceManage:taskHLR:index', 'icon-chexiao', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2162, 'menu.trace.taskAnalyze', 2084, 42, 'task/inline/analyze', 'ne/trace/task/analyze', '1', '0', 'M', '0', '1', 'traceManage:task:analyze', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); @@ -212,5 +213,89 @@ INSERT INTO `sys_menu` VALUES (2166, 'menu.dashboard.overview.smfUeNum', 2132, 4 INSERT INTO `sys_menu` VALUES (2167, 'menu.dashboard.overview.imsUeNum', 2132, 2, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:imsUeNum', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2168, 'menu.dashboard.overview.gnbBase', 2132, 6, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:gnbBase', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); INSERT INTO `sys_menu` VALUES (2169, 'menu.dashboard.overview.enbBase', 2132, 8, '', '', '1', '1', 'B', '1', '1', 'dashboard:overview:enbBase', '#', '0', 'system', 1728641403588, 'system', 1728641403588, '', '0', '0', ''); +INSERT INTO `sys_menu` VALUES (2170, '核心网', 0, 100, 'core', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757401126626, 'system', 1757401126626, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2171, '概览', 2170, 2, 'overview', 'core/overview/index', '1', '0', 'M', '1', '1', 'core:overview:index', '#', '0', 'system', 1757401522417, 'system', 1757401522417, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2172, '信息', 2170, 4, 'info', 'core/info/index', '1', '0', 'M', '1', '1', 'core:info:index', '#', '0', 'system', 1757401600724, 'system', 1757401615163, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2173, '网元', 0, 102, 'nee', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757401739013, 'system', 1757401739013, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2174, '概览', 2173, 2, 'overview', 'ne/overview/index', '1', '0', 'M', '1', '1', 'ne:overview:index', '#', '0', 'system', 1757401788559, 'system', 1757401788559, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2175, '信息', 2173, 4, 'info', 'ne/info/index', '1', '0', 'M', '1', '1', 'ne:info:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2176, '快速安装', 2173, 10, 'quick-setup', 'ne/quick-setup/index', '1', '0', 'M', '1', '1', 'ne:quick-setup:index', '#', '0', 'system', 1757401938544, 'system', 1757401938544, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2177, '软件版本', 0, 104, 'software-version', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757402016433, 'system', 1757402016433, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2178, '日志', 0, 106, 'logs', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757402098794, 'system', 1757403441029, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2179, '账户', 0, 108, 'account', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757402144050, 'system', 1757402144050, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2180, '设置', 0, 110, 'setting', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757402186822, 'system', 1757402186822, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2181, '登录日志', 2178, 2, 'login', 'log/login/index', '1', '0', 'M', '1', '1', 'log:login:index', '#', '0', 'system', 1757404772833, 'system', 1757404772833, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2182, '操作日志', 2178, 4, 'operation', 'log/operation/index', '1', '0', 'M', '1', '1', 'log:operation:index', '#', '0', 'system', 1757404834569, 'system', 1757404834569, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2183, 'User Management', 2179, 2, 'user', 'account/user/index', '1', '0', 'M', '1', '1', 'account:user:index', '#', '0', 'system', 1757404907051, 'system', 1757404907051, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2184, '角色管理', 2179, 4, 'role', 'account/role/index', '1', '0', 'M', '1', '1', 'account:role:index', '#', '0', 'system', 1757405385768, 'system', 1757405385768, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2185, '第三方认证', 2179, 8, 'third-party-login', 'account/third-party-login/index', '1', '0', 'M', '1', '1', 'account:third-party-login:index', '#', '0', 'system', 1757406008575, 'system', 1757406008575, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2186, 'System Info', 2180, 2, 'system', 'setting/system/index', '1', '0', 'M', '1', '1', 'setting:system:index', '#', '0', 'system', 1757406157936, 'system', 1757406157936, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2187, 'Backup Storage', 2180, 4, 'backup', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757406157936, 'system', 1757407541052, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2188, '平台集成', 2180, 6, 'platform', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757406157936, 'system', 1757407559184, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2189, 'Maintenance', 2180, 8, 'maintenance', 'setting/maintenance/index', '1', '0', 'M', '1', '1', 'setting:maintenance:index', '#', '0', 'system', 1757406157936, 'system', 1757407571739, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2190, 'Cloud Access', 2180, 10, 'cloud', 'setting/cloud/index', '1', '0', 'M', '1', '1', 'setting:cloud:index', '#', '0', 'system', 1757406157936, 'system', 1757406157936, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2191, '备份状态', 2187, 2, 'status', 'setting/backup/status/index', '1', '0', 'M', '1', '1', 'setting:backup:status:index', '#', '0', 'system', 1757408869101, 'system', 1757408869101, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2192, 'FTP 配置', 2187, 4, 'ftp', 'setting/backup/ftp/index', '1', '0', 'M', '1', '1', 'setting:backup:ftp:index', '#', '0', 'system', 1757408869101, 'system', 1757408869101, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2193, '功能配置', 2187, 6, 'config', 'setting/backup/config/index', '1', '0', 'M', '1', '1', 'setting:backup:config:index', '#', '0', 'system', 1757408869101, 'system', 1757408869101, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2194, '备份列表', 2187, 8, 'files', 'setting/backup/files/index', '1', '0', 'M', '1', '1', 'setting:backup:files:index', '#', '0', 'system', 1757408869101, 'system', 1757408869101, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2195, 'Open API', 2188, 2, 'open-api', 'setting/platform/open-api/index', '1', '0', 'M', '1', '1', 'setting:platform:open-api:index', '#', '0', 'system', 1757408869101, 'system', 1757408869101, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2196, 'Scope', 2188, 4, 'scope', 'setting/platform/scope/index', '1', '0', 'M', '1', '1', 'setting:platform:scope:index', '#', '0', 'system', 1757408869101, 'system', 1757408869101, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2197, '版本信息', 2177, 2, 'version', 'software-version/version/index', '1', '0', 'M', '1', '1', 'software-version:version:index', '#', '0', 'system', 1757408869101, 'system', 1757408869101, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2198, '软件包', 2177, 4, 'software', 'software-version/software/index', '1', '0', 'M', '1', '1', 'software-version:software:index', '#', '0', 'system', 1757408869101, 'system', 1757408869101, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2200, '核心网-网元功能', 0, 200, 'core-ne', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757401126626, 'system', 1757401126626, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2201, '监控', 2200, 4, 'monitor', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757415742565, 'system', 1757415742565, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2202, '网元', 2200, 6, 'ne', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757415742565, 'system', 1757415742565, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2203, '告警', 2200, 8, 'alarm', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757415742565, 'system', 1757415742565, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2204, 'UE', 2200, 8, 'ue', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757415742565, 'system', 1757415742565, '', '0', '1', 'UDM,PCF'); +INSERT INTO `sys_menu` VALUES (2205, 'Insights Data', 2200, 10, 'ne-data', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757415742565, 'system', 1757415742565, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2206, 'Metrics Report', 2200, 12, 'metrics', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757415742565, 'system', 1757415742565, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2207, '工具', 2200, 16, 'tool', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757415742565, 'system', 1757415742565, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2208, '拓扑图', 2201, 2, 'topology', 'core-ne/monitor/topology/index', '1', '0', 'M', '1', '1', 'core-ne:monitor:topology:index', '#', '0', 'system', 1757418475487, 'system', 1757418475487, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2209, '数据大屏', 2201, 4, 'dashboard', 'core-ne/monitor/dashboard/index', '1', '0', 'M', '1', '1', 'core-ne:monitor:dashboard:index', '#', '0', 'system', 1757418475487, 'system', 1757418475487, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2210, '指标概览', 2201, 6, 'dashboard-kpi', 'core-ne/monitor/dashboard-kpi/index', '1', '0', 'M', '1', '1', 'core-ne:monitor:dashboard:index', '#', '0', 'system', 1757418475487, 'system', 1757418475487, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2211, '网元VM资源', 2201, 8, 'vm', 'core-ne/monitor/vm/index', '1', '0', 'M', '1', '1', 'core-ne:monitor:vm:index', '#', '0', 'system', 1757418475487, 'system', 1757418475487, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2212, 'UE接入事件', 2201, 10, 'ue-event', 'core-ne/monitor/ue-event/index', '1', '0', 'M', '1', '1', 'core-ne:monitor:ue-event:index', '#', '0', 'system', 1757418475487, 'system', 1757418475487, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2213, '信息', 2202, 2, 'info', 'core-ne/ne/info/index', '1', '0', 'M', '1', '1', 'core-ne:ne:info:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2214, '版本', 2202, 4, 'version', 'core-ne/ne/version/index', '1', '0', 'M', '1', '1', 'core-ne:ne:version:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2215, '配置', 2202, 6, 'config', 'core-ne/ne/config/index', '1', '0', 'M', '1', '1', 'core-ne:ne:config:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2216, '活动告警', 2203, 2, 'active', 'core-ne/alarm/active/index', '1', '0', 'M', '1', '1', 'core-ne:alarm:active:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2217, '历史告警', 2203, 4, 'historical', 'core-ne/alarm/historical/index', '1', '0', 'M', '1', '1', 'core-ne:alarm:historical:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2218, '事件告警', 2203, 8, 'event', 'core-ne/alarm/event/index', '1', '0', 'M', '1', '1', 'core-ne:alarm:event:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2219, '接收日志', 2203, 10, 'logs', 'core-ne/alarm/logs/index', '1', '0', 'M', '1', '1', 'core-ne:alarm:logs:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2220, '转发通知', 2203, 12, 'forward', 'core-ne/alarm/forward/index', '1', '0', 'M', '1', '1', 'core-ne:alarm:forward:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2221, 'UDM Authentication', 2204, 2, 'udm-auth', 'core-ne/ue/udm-auth/index', '1', '0', 'M', '1', '1', 'core-ne:ue:udm-auth:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'UDM'); +INSERT INTO `sys_menu` VALUES (2222, 'UDM Subscriber', 2204, 4, 'udm-sub', 'core-ne/ue/udm-sub/index', '1', '0', 'M', '1', '1', 'core-ne:ue:udm-sub:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'UDM'); +INSERT INTO `sys_menu` VALUES (2223, 'UDM VoIP User', 2204, 8, 'udm-voip', 'core-ne/ue/udm-voip/index', '1', '0', 'M', '1', '1', 'core-ne:ue:udm-voip:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'UDM'); +INSERT INTO `sys_menu` VALUES (2224, 'UDM VoLTE User', 2204, 10, 'udm-volte', 'core-ne/ue/udm-volte/index', '1', '0', 'M', '1', '1', 'core-ne:ue:udm-volte:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'UDM'); +INSERT INTO `sys_menu` VALUES (2225, 'PCF User Rule', 2204, 16, 'pcf-rule', 'core-ne/ue/pcf-rule/index', '1', '0', 'M', '1', '1', 'core-ne:ue:pcf-rule:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'PCF'); +INSERT INTO `sys_menu` VALUES (2226, 'IMS Online Voice Session', 2205, 2, 'ims-session', 'core-ne/ne-data/ims-session/index', '1', '0', 'M', '1', '1', 'core-ne:ne-data:ims-session:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'IMS'); +INSERT INTO `sys_menu` VALUES (2227, 'SMF Online Data Session', 2205, 4, 'smf-session', 'core-ne/ne-data/smf-session/index', '1', '0', 'M', '1', '1', 'core-ne:ne-data:smf-session:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'SMF'); +INSERT INTO `sys_menu` VALUES (2228, 'N3IWF Online User', 2205, 6, 'n3iwf-session', 'core-ne/ne-data/n3iwf-session/index', '1', '0', 'M', '1', '1', 'core-ne:ne-data:n3iwf-session:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'N3IWF'); +INSERT INTO `sys_menu` VALUES (2229, 'NSSF Subscription Info', 2205, 8, 'nssf-session', 'core-ne/ne-data/nssf-session/index', '1', '0', 'M', '1', '1', 'core-ne:ne-data:nssf-session:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'NSSF'); +INSERT INTO `sys_menu` VALUES (2230, 'NSSF Available AMFs', 2205, 10, 'nssf-amf', 'core-ne/ne-data/nssf-amf/index', '1', '0', 'M', '1', '1', 'core-ne:ne-data:nssf-amf:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'NSSF'); +INSERT INTO `sys_menu` VALUES (2231, 'Radio State', 2205, 12, 'radio-state', 'core-ne/ne-data/radio-state/index', '1', '0', 'M', '1', '1', 'core-ne:ne-data:radio-state:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'AMF,MME'); +INSERT INTO `sys_menu` VALUES (2232, 'UE Events', 2205, 14, 'ue-event', 'core-ne/ne-data/ue-event/index', '1', '0', 'M', '1', '1', 'core-ne:ne-data:ue-event:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'AMF,MME'); +INSERT INTO `sys_menu` VALUES (2233, 'CDR', 2205, 16, 'cdr', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757415742565, 'system', 1757415742565, '', '0', '1', 'IMS,SMF,SMSC,SGWC'); +INSERT INTO `sys_menu` VALUES (2234, 'IMS Voice CDR', 2233, 2, 'ims-cdr', 'core-ne/ne-data/cdr/ims-cdr/index', '1', '0', 'M', '1', '1', 'core-ne:ne-data:cdr:ims-cdr:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'IMS'); +INSERT INTO `sys_menu` VALUES (2235, 'SMF Data CDR', 2233, 4, 'smf-cdr', 'core-ne/ne-data/cdr/smf-cdr/index', '1', '0', 'M', '1', '1', 'core-ne:ne-data:cdr:smf-cdr:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'SMF'); +INSERT INTO `sys_menu` VALUES (2236, 'SMSC SMS CDR', 2233, 6, 'smsc-cdr', 'core-ne/ne-data/cdr/smsc-cdr/index', '1', '0', 'M', '1', '1', 'core-ne:ne-data:cdr:smsc-cdr:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'SMSC'); +INSERT INTO `sys_menu` VALUES (2237, 'SGWC Roaming Data CDR', 2233, 8, 'sgwc-cdr', 'core-ne/ne-data/cdr/sgwc-cdr/index', '1', '0', 'M', '1', '1', 'core-ne:ne-data:cdr:sgwc-cdr:index', '#', '0', 'system', 1757401824418, 'system', 1757401824418, '', '0', '1', 'SGWC'); +INSERT INTO `sys_menu` VALUES (2238, 'Key Performance', 2206, 2, 'kpi', 'core-ne/metrics/kpi/index', '1', '0', 'M', '1', '1', 'core-ne:metrics:kpi:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2239, 'Key Performance Custom', 2206, 4, 'kpic', 'core-ne/metrics/kpic/index', '1', '0', 'M', '1', '1', 'core-ne:metrics:kpic:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2240, 'Voice Calls Dashboard', 2206, 6, 'overview-ims', 'core-ne/metrics/overview-ims/index', '1', '0', 'M', '1', '1', 'core-ne:metrics:overview-ims:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2241, 'MML', 2207, 2, 'mml', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757476055992, 'system', 1757476055992, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2242, '网络测试', 2207, 4, 'test', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757476055992, 'system', 1757476055992, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2243, '信令', 2207, 6, 'signal', '', '1', '1', 'D', '1', '1', '', '#', '0', 'system', 1757476055992, 'system', 1757476055992, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2244, 'Terminal', 2207, 10, 'terminal', 'core-ne/tool/terminal/index', '1', '0', 'M', '1', '1', 'core-ne:tool:terminal:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2245, 'NE Operation', 2241, 2, 'ne', 'core-ne/tool/mml/oper-ne/index', '1', '0', 'M', '1', '1', 'core-ne:tool:mml:oper-ne:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2246, 'UDM Operation', 2241, 4, 'udm', 'core-ne/tool/mml/oper-udm/index', '1', '0', 'M', '1', '1', 'core-ne:tool:mml:oper-udm:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2248, 'MML Logs', 2241, 6, 'logs', 'core-ne/tool/mml/logs/index', '1', '0', 'M', '1', '1', 'core-ne:tool:mml:logs:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2249, 'Net Probing Test', 2242, 2, 'ping', 'core-ne/tool/test/ping/index', '1', '0', 'M', '1', '1', 'core-ne:tool:test:ping:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2250, 'Net Performance Test', 2242, 4, 'iperf', 'core-ne/tool/test/iperf/index', '1', '0', 'M', '1', '1', 'core-ne:tool:test:iperf:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2251, 'Process Running Program', 2242, 6, 'ps', 'core-ne/tool/test/ps/index', '1', '0', 'M', '1', '1', 'core-ne:tool:test:ps:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2252, 'Process Net Connection', 2242, 8, 'net', 'core-ne/tool/test/net/index', '1', '0', 'M', '1', '1', 'core-ne:tool:test:net:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2253, 'Signaling Capture', 2243, 2, 'tcpdump', 'core-ne/tool/signal/tcpdump/index', '1', '0', 'M', '1', '1', 'core-ne:tool:signal:tcpdump:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2254, 'Signaling Analysis', 2243, 4, 'wireshark', 'core-ne/tool/signal/wireshark/index', '1', '0', 'M', '1', '1', 'core-ne:tool:signal:wireshark:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); +INSERT INTO `sys_menu` VALUES (2255, 'Signaling Trace', 2243, 8, 'packet', 'core-ne/tool/signal/packet/index', '1', '0', 'M', '1', '1', 'core-ne:tool:signal:wireshark:index', '#', '0', 'system', 1757475772860, 'system', 1757475772860, '', '0', '1', ''); -- Dump completed on 2025-02-14 15:26:56 diff --git a/build/database/std/install/trace_task.sql b/build/database/std/install/trace_task.sql index 61802d7d..a4541fa5 100644 --- a/build/database/std/install/trace_task.sql +++ b/build/database/std/install/trace_task.sql @@ -17,8 +17,8 @@ CREATE TABLE `trace_task` ( `create_time` bigint DEFAULT '0' COMMENT '创建时间', `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '任务标题', `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '备注', - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_list` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '网元列表 neUid,neUid', + `core_id` bigint DEFAULT '0' COMMENT '核心网ID', + `ne_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元ID列表 neId,neId', `notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '信息数据通知回调地址UDP 例如udp:192.168.5.58:33033', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='跟踪_任务'; diff --git a/build/database/std/install/udm_auth.sql b/build/database/std/install/udm_auth.sql index 9aa12cfa..fb4542ce 100644 --- a/build/database/std/install/udm_auth.sql +++ b/build/database/std/install/udm_auth.sql @@ -4,9 +4,7 @@ DROP TABLE IF EXISTS `udm_auth`; CREATE TABLE `udm_auth` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', `amf` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AMF', `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '状态', @@ -15,6 +13,5 @@ CREATE TABLE `udm_auth` ( `opc` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'OPC', `create_time` bigint(20) DEFAULT 0 COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_udm_auth_imsi_ne` (`ne_uid`,`imsi`) USING BTREE COMMENT '唯一主键-IMSI_网元ID', - KEY `idx_udm_auth_uid_type` (`core_uid`,`ne_uid`,`ne_type`) USING BTREE COMMENT '索引-核心网_资源标识_类型' + UNIQUE KEY `uk_udm_auth_ne_imsi` (`ne_id`,`imsi`) USING BTREE COMMENT '唯一索引-网元_IMSI' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='UDM用户数据_鉴权'; diff --git a/build/database/std/install/udm_extend.sql b/build/database/std/install/udm_extend.sql index 8e5d60c6..815f93c3 100644 --- a/build/database/std/install/udm_extend.sql +++ b/build/database/std/install/udm_extend.sql @@ -4,13 +4,10 @@ DROP TABLE IF EXISTS `udm_extend`; CREATE TABLE `udm_extend` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '默认ID', - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_udm_extend_imsi_ne` (`ne_uid`,`imsi`,`msisdn`) USING BTREE COMMENT '唯一索引-SIM卡_网元标识', - KEY `idx_udm_extend_uid_type` (`core_uid`,`ne_uid`) USING BTREE COMMENT '索引-核心网_资源标识_类型' + UNIQUE KEY `uk_udm_extend_ne_imsi` (`ne_id`,`imsi`) USING BTREE COMMENT '唯一索引-网元_IMSI' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM用户数据_IMSI扩展信息'; diff --git a/build/database/std/install/udm_sub.sql b/build/database/std/install/udm_sub.sql index 6e833924..a1d9618d 100644 --- a/build/database/std/install/udm_sub.sql +++ b/build/database/std/install/udm_sub.sql @@ -4,9 +4,7 @@ DROP TABLE IF EXISTS `udm_sub`; CREATE TABLE `udm_sub` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', `am_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData', @@ -37,6 +35,5 @@ CREATE TABLE `udm_sub` ( `smf_sel` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'smfSel', `cag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'CAG', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_udm_sub_imsi_ne` (`ne_uid`,`imsi`,`msisdn`) USING BTREE COMMENT '唯一索引-SIM卡_网元标识', - KEY `idx_udm_sub_uid_type` (`core_uid`,`ne_uid`) USING BTREE COMMENT '索引-核心网_资源标识_类型' + UNIQUE KEY `uk_udm_sub_ne_imsi` (`ne_id`,`imsi`) USING BTREE COMMENT '唯一索引-网元_IMSI' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM用户数据_签约'; diff --git a/build/database/std/install/udm_voip.sql b/build/database/std/install/udm_voip.sql index 3f5d445c..a9312267 100644 --- a/build/database/std/install/udm_voip.sql +++ b/build/database/std/install/udm_voip.sql @@ -4,12 +4,9 @@ DROP TABLE IF EXISTS `udm_voip`; CREATE TABLE `udm_voip` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户名', `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '密码', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_udm_voip_smsc_uid_type` (`ne_uid`,`username`) USING BTREE COMMENT '唯一主键-用户名_网元ID', - KEY `idx_udm_voip_uid_type` (`core_uid`,`ne_uid`) USING BTREE COMMENT '索引-核心网_资源标识_类型' + UNIQUE KEY `uk_udm_voip_ne_name` (`ne_id`,`username`) USING BTREE COMMENT '唯一主键-网元_用户名' ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='UDM用户数据_VOIP'; diff --git a/build/database/std/install/udm_volte_ims.sql b/build/database/std/install/udm_volte_ims.sql index e476228a..fdb4b783 100644 --- a/build/database/std/install/udm_volte_ims.sql +++ b/build/database/std/install/udm_volte_ims.sql @@ -1,17 +1,14 @@ -- --- Table structure for table `udm_volte_ims` +-- Table structure for table `udm_volte` -- -DROP TABLE IF EXISTS `udm_volte_ims`; -CREATE TABLE `udm_volte_ims` ( +DROP TABLE IF EXISTS `udm_volte`; +CREATE TABLE `udm_volte` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', `imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID', `msisdn` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户电话号码', `tag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '0=VoIP, 1=VoLTE', `vni` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'VNI', PRIMARY KEY (`id`) USING BTREE, - UNIQUE KEY `uk_udm_volte_imsi_ne` (`ne_uid`,`imsi`,`msisdn`) USING BTREE COMMENT 'imsi_msisdn_neid唯一主键', - KEY `idx_udm_volte_uid_tag` (`core_uid`,`ne_uid`,`tag`) USING BTREE COMMENT '索引-核心网_资源标识_类型' -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM用户数据_VolteIMS用户'; + UNIQUE KEY `uk_udm_volte_ne_imsi` (`ne_id`,`imsi`) USING BTREE COMMENT '唯一索引-网元_IMSI' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM用户数据_VoLTE用户'; diff --git a/build/database/std/install/ue_event.sql b/build/database/std/install/ue_event.sql index 474da052..7874d0dd 100644 --- a/build/database/std/install/ue_event.sql +++ b/build/database/std/install/ue_event.sql @@ -4,13 +4,11 @@ DROP TABLE IF EXISTS `ue_event`; CREATE TABLE `ue_event` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `timestamp` bigint DEFAULT '0' COMMENT '接收到时间戳', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', + `created_time` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型', `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', - `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_ue_uid_type_at` (`core_uid` DESC, `ne_uid` DESC,`event_type` DESC, `timestamp` DESC) USING BTREE COMMENT '索引-核心网_资源标识_类型_时间' + KEY `idx_ue_ne_type_at` (`ne_id` DESC,`event_type` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元_类型_时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UE事件_基础表结构'; diff --git a/build/database/std/install/ue_event_amf.sql b/build/database/std/install/ue_event_amf.sql index b472f560..8cb60d0b 100644 --- a/build/database/std/install/ue_event_amf.sql +++ b/build/database/std/install/ue_event_amf.sql @@ -4,15 +4,13 @@ DROP TABLE IF EXISTS `ue_event_amf`; CREATE TABLE `ue_event_amf` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `timestamp` bigint DEFAULT '0' COMMENT '接收到时间戳', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', + `created_time` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型', `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', - `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_ue_amf_uid_type_at` (`core_uid` DESC, `ne_uid` DESC,`event_type` DESC, `timestamp` DESC) USING BTREE COMMENT '索引-核心网_资源标识_类型_时间' + KEY `idx_ue_ne_type_at` (`ne_id` DESC,`event_type` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元_类型_时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UE事件_AMF终端接入'; --- Dump completed on 2025-02-14 15:26:56 +-- Dump completed on 2025-09-11 15:26:56 diff --git a/build/database/std/install/ue_event_mme.sql b/build/database/std/install/ue_event_mme.sql index 4cc1d78c..903c39ca 100644 --- a/build/database/std/install/ue_event_mme.sql +++ b/build/database/std/install/ue_event_mme.sql @@ -4,15 +4,13 @@ DROP TABLE IF EXISTS `ue_event_mme`; CREATE TABLE `ue_event_mme` ( `id` int NOT NULL AUTO_INCREMENT, - `core_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '核心网唯一标识', - `ne_uid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '网元唯一标识', - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '网元类型', - `timestamp` bigint DEFAULT '0' COMMENT '接收到时间戳', + `ne_id` bigint DEFAULT '0' COMMENT '网元ID', + `record_time` bigint DEFAULT '0' COMMENT '记录时间', + `created_time` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '事件类型', `event_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'data JSON String', - `created_at` bigint DEFAULT '0' COMMENT '记录创建存储毫秒', PRIMARY KEY (`id`) USING BTREE, - KEY `idx_ue_mme_uid_type_at` (`core_uid` DESC, `ne_uid` DESC,`event_type` DESC, `timestamp` DESC) USING BTREE COMMENT '索引-核心网_资源标识_类型_时间' + KEY `idx_ue_ne_type_at` (`ne_id` DESC,`event_type` DESC, `created_time` DESC) USING BTREE COMMENT '索引-网元_类型_时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UE事件_MME终端接入'; --- Dump completed on 2025-02-14 15:26:56 +-- Dump completed on 2025-09-11 15:26:56 diff --git a/src/framework/constants/cache_key.go b/src/framework/constants/cache_key.go index 58fbf785..7db9d40b 100644 --- a/src/framework/constants/cache_key.go +++ b/src/framework/constants/cache_key.go @@ -22,8 +22,8 @@ const ( CACHE_OAUTH2_CODE = "oauth2_codes" // CACHE_I18N 国际化语言管理 CACHE_I18N = "i18n" - // CACHE_NE_INFO 网元信息管理 + // CACHE_NE_INFO 网元信息管理 ne_info:ne_type:ne_id:ne_uid CACHE_NE_INFO = "ne_info" - // CACHE_NE_DATA 网元数据管理 + // CACHE_NE_DATA 网元数据管理 ne_data:{x}:{x}:{x} CACHE_NE_DATA = "ne_data" ) diff --git a/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go b/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go index 1bfd3f1e..e28ed88d 100644 --- a/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go +++ b/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go @@ -65,23 +65,23 @@ func (s *BackupExportCDRProcessor) Execute(data any) (any, error) { switch v { case "ims": neList := s.neInfoService.Find(neModel.NeInfo{NeType: "IMS"}, false, false) - for _, ne := range neList { - result[ne.NeName] = s.exportIMS(ne.CoreUID, ne.NeUID, params.Hour, params.FileType) + for _, neinfo := range neList { + result[neinfo.NeUid] = s.exportIMS(neinfo.ID, neinfo.NeUid, params.Hour, params.FileType) } case "smsc": neList := s.neInfoService.Find(neModel.NeInfo{NeType: "SMSC"}, false, false) - for _, ne := range neList { - result[ne.NeName] = s.exportSMSC(ne.CoreUID, ne.NeUID, params.Hour, params.FileType) + for _, neinfo := range neList { + result[neinfo.NeUid] = s.exportSMSC(neinfo.ID, neinfo.NeUid, params.Hour, params.FileType) } case "smf": neList := s.neInfoService.Find(neModel.NeInfo{NeType: "SMF"}, false, false) - for _, ne := range neList { - result[ne.NeName] = s.exportSMF(ne.CoreUID, ne.NeUID, params.Hour, params.FileType) + for _, neinfo := range neList { + result[neinfo.NeUid] = s.exportSMF(neinfo.ID, neinfo.NeUid, params.Hour, params.FileType) } case "sgwc": neList := s.neInfoService.Find(neModel.NeInfo{NeType: "SGWC"}, false, false) - for _, ne := range neList { - result[ne.NeName] = s.exportSGWC(ne.CoreUID, ne.NeUID, params.Hour, params.FileType) + for _, neinfo := range neList { + result[neinfo.NeUid] = s.exportSGWC(neinfo.ID, neinfo.NeUid, params.Hour, params.FileType) } } } @@ -91,7 +91,7 @@ func (s *BackupExportCDRProcessor) Execute(data any) (any, error) { } // exportIMS 导出IMS-CDR会话事件数据 -func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fileType string) string { +func (s BackupExportCDRProcessor) exportIMS(neId int64, neUid string, hour int, fileType string) string { // 前 hour 小时 now := time.Now() end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location()) @@ -99,14 +99,9 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil language := "en" query := map[string]string{ - "sortField": "timestamp", - "sortOrder": "asc", - "coreUid": coreUid, - "neUid": neUid, + "neId": fmt.Sprint(neId), "beginTime": fmt.Sprint(start.UnixMilli()), "endTime": fmt.Sprint(end.UnixMilli()), - "pageNum": fmt.Sprint(1), - "pageSize": fmt.Sprint(1000_0000), } rows, total := s.cdrEventService.FindByPage("IMS", query) if total == 0 { @@ -115,7 +110,7 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil // 导出文件名称 fileName := fmt.Sprintf("ims_cdr_event_export_%d_%s.%s", len(rows), date.ParseDateToStr(end, date.YYYYMMDDHHMMSS), fileType) - filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/ims_cdr_event", coreUid, neUid, fileName) + filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/ims_cdr_event", neUid, fileName) if runtime.GOOS == "windows" { filePath = fmt.Sprintf("C:%s", filePath) } @@ -125,7 +120,6 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil data := [][]string{ { "ID", - "NE Name", "Record Behavior", "Type", "Caller", @@ -227,7 +221,6 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil data = append(data, []string{ fmt.Sprint(row.ID), - row.NeUID, recordType, callTypeLable, caller, @@ -250,16 +243,15 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil // 第一行表头标题 headerCells := map[string]string{ "A1": "ID", - "B1": "NE Name", - "C1": "Record Behavior", - "D1": "Type", - "E1": "Caller", - "F1": "Called", - "G1": "Duration", - "H1": "Result Code", - "I1": "Result Cause", - "J1": "Call Start Time", - "K1": "Hangup Time", + "B1": "Record Behavior", + "C1": "Type", + "D1": "Caller", + "E1": "Called", + "F1": "Duration", + "G1": "Result Code", + "H1": "Result Cause", + "I1": "Call Start Time", + "J1": "Hangup Time", } // 读取字典数据 CDR SIP响应代码类别类型 dictCDRSipCode := s.sysDictService.FindByType("cdr_sip_code") @@ -354,16 +346,15 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, - "B" + idx: row.NeUID, - "C" + idx: recordType, - "D" + idx: callTypeLable, - "E" + idx: caller, - "F" + idx: called, - "G" + idx: duration, - "H" + idx: callResult, - "I" + idx: callCause, - "J" + idx: seizureTimeStr, - "K" + idx: releaseTimeStr, + "B" + idx: recordType, + "C" + idx: callTypeLable, + "D" + idx: caller, + "E" + idx: called, + "F" + idx: duration, + "G" + idx: callResult, + "H" + idx: callCause, + "I" + idx: seizureTimeStr, + "J" + idx: releaseTimeStr, }) } // 导出数据表格 @@ -381,7 +372,7 @@ func (s BackupExportCDRProcessor) exportIMS(coreUid, neUid string, hour int, fil } // exportSMSC 导出SMSC-CDR会话事件数据 -func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fileType string) string { +func (s BackupExportCDRProcessor) exportSMSC(neId int64, neUid string, hour int, fileType string) string { // 前 hour 小时 now := time.Now() end := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location()) @@ -389,14 +380,9 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi language := "en" query := map[string]string{ - "sortField": "timestamp", - "sortOrder": "asc", - "coreUid": coreUid, - "neUid": neUid, + "neId": fmt.Sprint(neId), "beginTime": fmt.Sprint(start.UnixMilli()), "endTime": fmt.Sprint(end.UnixMilli()), - "pageNum": fmt.Sprint(1), - "pageSize": fmt.Sprint(1000_0000), } rows, total := s.cdrEventService.FindByPage("SMSC", query) if total == 0 { @@ -405,7 +391,7 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi // 导出文件名称 fileName := fmt.Sprintf("smsc_cdr_event_export_%d_%s.%s", len(rows), date.ParseDateToStr(end, date.YYYYMMDDHHMMSS), fileType) - filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/smsc_cdr_event", coreUid, neUid, fileName) + filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/smsc_cdr_event", neUid, fileName) if runtime.GOOS == "windows" { filePath = fmt.Sprintf("C:%s", filePath) } @@ -415,7 +401,6 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi data := [][]string{ { "ID", - "NE Name", "Record Behavior", "Service Type", "Caller", @@ -484,7 +469,6 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi data = append(data, []string{ fmt.Sprint(row.ID), - row.NeUID, recordType, serviceType, caller, @@ -504,13 +488,12 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi // 第一行表头标题 headerCells := map[string]string{ "A1": "ID", - "B1": "NE Name", - "C1": "Record Behavior", - "D1": "Service Type", - "E1": "Caller", - "F1": "Called", - "G1": "Result", - "H1": "Time", + "B1": "Record Behavior", + "C1": "Service Type", + "D1": "Caller", + "E1": "Called", + "F1": "Result", + "G1": "Time", } // 读取字典数据 CDR 原因码 dictCDRCauseCode := s.sysDictService.FindByType("cdr_cause_code") @@ -575,13 +558,12 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, - "B" + idx: row.NeUID, - "C" + idx: recordType, - "D" + idx: serviceType, - "E" + idx: caller, - "F" + idx: called, - "G" + idx: callResult, - "H" + idx: timeStr, + "B" + idx: recordType, + "C" + idx: serviceType, + "D" + idx: caller, + "E" + idx: called, + "F" + idx: callResult, + "G" + idx: timeStr, }) } // 导出数据表格 @@ -599,21 +581,16 @@ func (s BackupExportCDRProcessor) exportSMSC(coreUid, neUid string, hour int, fi } // exportSMF 导出SMF-CDR会话事件数据 -func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fileType string) string { +func (s BackupExportCDRProcessor) exportSMF(neId int64, neUid string, hour int, fileType string) string { // 前 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(hour) * time.Hour) query := map[string]string{ - "sortField": "timestamp", - "sortOrder": "asc", - "coreUid": coreUid, - "neUid": neUid, + "neId": fmt.Sprint(neId), "beginTime": fmt.Sprint(start.UnixMilli()), "endTime": fmt.Sprint(end.UnixMilli()), - "pageNum": fmt.Sprint(1), - "pageSize": fmt.Sprint(1000_0000), } rows, total := s.cdrEventService.FindByPage("SMF", query) if total == 0 { @@ -622,7 +599,7 @@ func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fil // 导出文件名称 fileName := fmt.Sprintf("smf_cdr_event_export_%d_%s.%s", len(rows), date.ParseDateToStr(end, date.YYYYMMDDHHMMSS), fileType) - filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/smf_cdr_event", coreUid, neUid, fileName) + filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/smf_cdr_event", neUid, fileName) if runtime.GOOS == "windows" { filePath = fmt.Sprintf("C:%s", filePath) } @@ -784,8 +761,6 @@ func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fil data = append(data, []string{ fmt.Sprint(row.ID), chargingID, - row.NeType, - row.NeUID, subscriptionIDData, subscriptionIDType, fmt.Sprint(dataVolumeUplink), @@ -818,26 +793,24 @@ func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fil headerCells := map[string]string{ "A1": "ID", "B1": "Charging ID", - "C1": "NE Name", - "D1": "Resource Unique ID", - "E1": "Subscriber ID Data", - "F1": "Subscriber ID Type", - "G1": "Data Volume Uplink", - "H1": "Data Volume Downlink", - "I1": "Data Total Volume", - "J1": "Duration", - "K1": "Invocation Time", - "L1": "User Identifier", - "M1": "SSC Mode", - "N1": "DNN ID", - "O1": "PDU Type", - "P1": "RAT Type", - "Q1": "PDU IPv4 Address", - "R1": "Network Function IPv4", - "S1": "PDU IPv6 Address Swith Prefix", - "T1": "Record Network Function ID", - "U1": "Record Type", - "V1": "Record Opening Time", + "C1": "Subscriber ID Data", + "D1": "Subscriber ID Type", + "E1": "Data Volume Uplink", + "F1": "Data Volume Downlink", + "G1": "Data Total Volume", + "H1": "Duration", + "I1": "Invocation Time", + "J1": "User Identifier", + "K1": "SSC Mode", + "L1": "DNN ID", + "M1": "PDU Type", + "N1": "RAT Type", + "O1": "PDU IPv4 Address", + "P1": "Network Function IPv4", + "Q1": "PDU IPv6 Address Swith Prefix", + "R1": "Record Network Function ID", + "S1": "Record Type", + "T1": "Record Opening Time", } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) @@ -971,26 +944,24 @@ func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fil dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, "B" + idx: chargingID, - "C" + idx: row.NeType, - "D" + idx: row.NeUID, - "E" + idx: subscriptionIDData, - "F" + idx: subscriptionIDType, - "G" + idx: dataVolumeUplink, - "H" + idx: dataVolumeDownlink, - "I" + idx: dataTotalVolume, - "J" + idx: duration, - "K" + idx: invocationTimestamp, - "L" + idx: User_Identifier, - "M" + idx: SSC_Mode, - "N" + idx: DNN_ID, - "O" + idx: PDU_Type, - "P" + idx: RAT_Type, - "Q" + idx: PDU_IPv4, - "R" + idx: networkFunctionIPv4Address, - "S" + idx: PDU_IPv6, - "T" + idx: recordNFID, - "U" + idx: recordType, - "V" + idx: recordOpeningTime, + "C" + idx: subscriptionIDData, + "D" + idx: subscriptionIDType, + "E" + idx: dataVolumeUplink, + "F" + idx: dataVolumeDownlink, + "G" + idx: dataTotalVolume, + "H" + idx: duration, + "I" + idx: invocationTimestamp, + "J" + idx: User_Identifier, + "K" + idx: SSC_Mode, + "L" + idx: DNN_ID, + "M" + idx: PDU_Type, + "N" + idx: RAT_Type, + "O" + idx: PDU_IPv4, + "P" + idx: networkFunctionIPv4Address, + "Q" + idx: PDU_IPv6, + "R" + idx: recordNFID, + "S" + idx: recordType, + "T" + idx: recordOpeningTime, }) } // 导出数据表格 @@ -1008,21 +979,16 @@ func (s BackupExportCDRProcessor) exportSMF(coreUid, neUid string, hour int, fil } // exportSGWC 导出SGWC-CDR会话事件数据 -func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fileType string) string { +func (s BackupExportCDRProcessor) exportSGWC(neId int64, neUid string, hour int, fileType string) string { // 前 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(hour) * time.Hour) query := map[string]string{ - "sortField": "timestamp", - "sortOrder": "asc", - "coreUid": coreUid, - "neUid": neUid, + "neId": fmt.Sprint(neId), "beginTime": fmt.Sprint(start.UnixMilli()), "endTime": fmt.Sprint(end.UnixMilli()), - "pageNum": fmt.Sprint(1), - "pageSize": fmt.Sprint(1000_0000), } rows, total := s.cdrEventService.FindByPage("SGWC", query) if total == 0 { @@ -1031,7 +997,7 @@ func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fi // 导出文件名称 fileName := fmt.Sprintf("sgwc_cdr_event_export_%d_%s.%s", len(rows), date.ParseDateToStr(end, date.YYYYMMDDHHMMSS), fileType) - filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/sgwc_cdr_event", coreUid, neUid, fileName) + filePath := filepath.Join(s.backupService.BACKUP_DIR, "/cdr/sgwc_cdr_event", neUid, fileName) if runtime.GOOS == "windows" { filePath = fmt.Sprintf("C:%s", filePath) } @@ -1041,8 +1007,6 @@ func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fi data := [][]string{ { "ID", - "NE Name", - "Resource Unique ID", "Charging ID", "IMSI", "MSISDN", @@ -1195,8 +1159,6 @@ func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fi data = append(data, []string{ fmt.Sprint(row.ID), - row.NeType, - row.NeUID, chargingID, servedIMSI, servedMSISDN, @@ -1230,28 +1192,26 @@ func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fi // 第一行表头标题 headerCells := map[string]string{ "A1": "ID", - "B1": "NE Name", - "C1": "Resource Unique ID", - "D1": "Charging ID", - "E1": "IMSI", - "F1": "MSISDN", - "G1": "GPRS Uplink", - "H1": "GPRS Downlink", - "I1": "Duration", - "J1": "Invocation Time", - "K1": "PGW Address", - "L1": "SGW Address", - "M1": "RAT Type", - "N1": "PDPPDN Type", - "O1": "PDPPDN Address", - "P1": "Node Address", - "Q1": "Node Type", - "R1": "Record Access Point Name NI", - "S1": "Record Cause For Rec Closing", - "T1": "Record Sequence Number", - "U1": "Local Record Sequence Number", - "V1": "Record Type", - "W1": "Record Opening Time", + "B1": "Charging ID", + "C1": "IMSI", + "D1": "MSISDN", + "E1": "GPRS Uplink", + "F1": "GPRS Downlink", + "G1": "Duration", + "H1": "Invocation Time", + "I1": "PGW Address", + "J1": "SGW Address", + "K1": "RAT Type", + "L1": "PDPPDN Type", + "M1": "PDPPDN Address", + "N1": "Node Address", + "O1": "Node Type", + "P1": "Record Access Point Name NI", + "Q1": "Record Cause For Rec Closing", + "R1": "Record Sequence Number", + "S1": "Local Record Sequence Number", + "T1": "Record Type", + "U1": "Record Opening Time", } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) @@ -1386,28 +1346,26 @@ func (s BackupExportCDRProcessor) exportSGWC(coreUid, neUid string, hour int, fi dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, - "B" + idx: row.NeType, - "C" + idx: row.NeUID, - "D" + idx: chargingID, - "E" + idx: servedIMSI, - "F" + idx: servedMSISDN, - "G" + idx: dataVolumeGPRSUplink, - "H" + idx: dataVolumeGPRSDownlink, - "I" + idx: duration, - "J" + idx: invocationTimestamp, - "K" + idx: pGWAddressUsed, - "L" + idx: sGWAddress, - "M" + idx: rATType, - "N" + idx: pdpPDNType, - "O" + idx: servedPDPPDNAddress, - "P" + idx: strings.Join(servingNodeAddress, ","), - "Q" + idx: strings.Join(servingNodeType, ","), - "R" + idx: accessPointNameNI, - "S" + idx: causeForRecClosing, - "T" + idx: recordSequenceNumber, - "U" + idx: localRecordSequenceNumber, - "V" + idx: recordType, - "W" + idx: invocationTimestamp, + "B" + idx: chargingID, + "C" + idx: servedIMSI, + "D" + idx: servedMSISDN, + "E" + idx: dataVolumeGPRSUplink, + "F" + idx: dataVolumeGPRSDownlink, + "G" + idx: duration, + "H" + idx: invocationTimestamp, + "I" + idx: pGWAddressUsed, + "J" + idx: sGWAddress, + "K" + idx: rATType, + "L" + idx: pdpPDNType, + "M" + idx: servedPDPPDNAddress, + "N" + idx: strings.Join(servingNodeAddress, ","), + "O" + idx: strings.Join(servingNodeType, ","), + "P" + idx: accessPointNameNI, + "Q" + idx: causeForRecClosing, + "R" + idx: recordSequenceNumber, + "S" + idx: localRecordSequenceNumber, + "T" + idx: recordType, + "U" + idx: invocationTimestamp, }) } // 导出数据表格 diff --git a/src/modules/crontask/processor/backup_export_table/backup_export_table.go b/src/modules/crontask/processor/backup_export_table/backup_export_table.go index 0e0a4276..9d2ba73a 100644 --- a/src/modules/crontask/processor/backup_export_table/backup_export_table.go +++ b/src/modules/crontask/processor/backup_export_table/backup_export_table.go @@ -344,9 +344,6 @@ func (s BackupExportTableProcessor) exportSMF(hour int, columns []string, filePa if col == "id" { arr[i] = fmt.Sprintf("%d", row.ID) } - if col == "neType" || col == "ne_type" { - arr[i] = fmt.Sprintf("%v", row.NeType) - } // 单层json if strings.HasPrefix("json", col) { key := strings.TrimPrefix(col, "json") @@ -463,9 +460,6 @@ func (s BackupExportTableProcessor) exportIMS(hour int, columns []string, filePa if col == "id" { arr[i] = fmt.Sprintf("%d", row.ID) } - if col == "neType" || col == "ne_type" { - arr[i] = fmt.Sprintf("%v", row.NeType) - } // 单层json if strings.HasPrefix("json", col) { key := strings.TrimPrefix(col, "json") @@ -653,9 +647,6 @@ func (s BackupExportTableProcessor) exportSMSC(hour int, columns []string, fileP if v == "id" { arr[i] = fmt.Sprintf("%d", row.ID) } - if v == "neType" || v == "ne_type" { - arr[i] = fmt.Sprintf("%v", row.NeType) - } // 单层json if strings.HasPrefix("json", v) { key := strings.TrimPrefix(v, "json") @@ -842,9 +833,6 @@ func (s BackupExportTableProcessor) exportSGWC(hour int, columns []string, fileP if v == "id" { arr[i] = fmt.Sprintf("%d", row.ID) } - if v == "neType" || v == "ne_type" { - arr[i] = fmt.Sprintf("%v", row.NeType) - } // 单层json if strings.HasPrefix("json", v) { key := strings.TrimPrefix(v, "json") diff --git a/src/modules/crontask/processor/backup_export_udm/backup_export_udm.go b/src/modules/crontask/processor/backup_export_udm/backup_export_udm.go index 1f44ae63..78c379e2 100644 --- a/src/modules/crontask/processor/backup_export_udm/backup_export_udm.go +++ b/src/modules/crontask/processor/backup_export_udm/backup_export_udm.go @@ -64,13 +64,13 @@ func (s *BackupExportUDMProcessor) Execute(data any) (any, error) { for _, v := range params.DataType { switch v { case "auth": - result[fmt.Sprintf("%s-%s", neInfo.NeUID, v)] = s.exportAuth(neInfo.CoreUID, neInfo.NeUID, params.FileType) + result[fmt.Sprintf("%s-%s", v, neInfo.NeUid)] = s.exportAuth(neInfo.ID, neInfo.NeUid, params.FileType) case "sub": - result[fmt.Sprintf("%s-%s", neInfo.NeUID, v)] = s.exportSub(neInfo.CoreUID, neInfo.NeUID, params.FileType) + result[fmt.Sprintf("%s-%s", v, neInfo.NeUid)] = s.exportSub(neInfo.ID, neInfo.NeUid, params.FileType) case "voip": - result[fmt.Sprintf("%s-%s", neInfo.NeUID, v)] = s.exportVOIP(neInfo.CoreUID, neInfo.NeUID, params.FileType) + result[fmt.Sprintf("%s-%s", v, neInfo.NeUid)] = s.exportVOIP(neInfo.ID, neInfo.NeUid, params.FileType) case "volte": - result[fmt.Sprintf("%s-%s", neInfo.NeUID, v)] = s.exportVolte(neInfo.CoreUID, neInfo.NeUID, params.FileType) + result[fmt.Sprintf("%s-%s", v, neInfo.NeUid)] = s.exportVolte(neInfo.ID, neInfo.NeUid, params.FileType) } } } @@ -80,8 +80,8 @@ func (s *BackupExportUDMProcessor) Execute(data any) (any, error) { } // exportAuth 导出鉴权用户数据 -func (s BackupExportUDMProcessor) exportAuth(coreUid, neUid, fileType string) string { - rows := s.udmAuthService.Find(neDataNfModel.UDMAuthUser{CoreUID: coreUid, NeUID: neUid}) +func (s BackupExportUDMProcessor) exportAuth(neId int64, neUid, fileType string) string { + rows := s.udmAuthService.Find(neDataNfModel.UDMAuthUser{NeID: neId}) if len(rows) <= 0 { return "no data" } @@ -134,8 +134,8 @@ func (s BackupExportUDMProcessor) exportAuth(coreUid, neUid, fileType string) st } // exportSub 导出签约用户数据 -func (s BackupExportUDMProcessor) exportSub(coreUid, neUid, fileType string) string { - rows := s.udmSubService.Find(neDataNfModel.UDMSubUser{CoreUID: coreUid, NeUID: neUid}) +func (s BackupExportUDMProcessor) exportSub(neId int64, neUid, fileType string) string { + rows := s.udmSubService.Find(neDataNfModel.UDMSubUser{NeID: neId}) if len(rows) <= 0 { return "no data" } @@ -182,8 +182,8 @@ func (s BackupExportUDMProcessor) exportSub(coreUid, neUid, fileType string) str } // exportVOIP 导出VOIP用户数据 -func (s BackupExportUDMProcessor) exportVOIP(coreUid, neUid, fileType string) string { - rows := s.udmVOIPService.Find(neDataNfModel.UDMVOIPUser{CoreUID: coreUid, NeUID: neUid}) +func (s BackupExportUDMProcessor) exportVOIP(neId int64, neUid, fileType string) string { + rows := s.udmVOIPService.Find(neDataNfModel.UDMVOIPUser{NeID: neId}) if len(rows) <= 0 { return "no data" } @@ -228,8 +228,8 @@ func (s BackupExportUDMProcessor) exportVOIP(coreUid, neUid, fileType string) st } // exportVolte 导出Volte用户数据 -func (s BackupExportUDMProcessor) exportVolte(coreUid, neUid, fileType string) string { - rows := s.udmVolteIMSService.Find(neDataNfModel.UDMVolteIMSUser{CoreUID: coreUid, NeUID: neUid}) +func (s BackupExportUDMProcessor) exportVolte(neId int64, neUid, fileType string) string { + rows := s.udmVolteIMSService.Find(neDataNfModel.UDMVolteIMSUser{NeID: neId}) if len(rows) <= 0 { return "no data" } diff --git a/src/modules/crontask/processor/delete_ne_config_backup/delete_ne_config_backup.go b/src/modules/crontask/processor/delete_ne_config_backup/delete_ne_config_backup.go index 07b886a4..a7791fad 100644 --- a/src/modules/crontask/processor/delete_ne_config_backup/delete_ne_config_backup.go +++ b/src/modules/crontask/processor/delete_ne_config_backup/delete_ne_config_backup.go @@ -56,16 +56,16 @@ func (s *DeleteNeConfigBackupProcessor) Execute(data any) (any, error) { neList := s.neInfoService.Find(neModel.NeInfo{}, false, false) for _, neInfo := range neList { tx := db.DB("").Model(&neModel.NeConfigBackup{}) - tx = tx.Where("core_uid = ? and ne_uid = ?", neInfo.CoreUID, neInfo.NeUID) + tx = tx.Where("ne_id = ?", neInfo.ID) // 查询数量为0直接返回 var total int64 = 0 if err := tx.Count(&total).Error; err != nil { - result[neInfo.NeUID] = err.Error() + result[neInfo.NeUid] = err.Error() continue } if total <= int64(params.StoreNum) { - result[neInfo.NeUID] = "less than storeNum" + result[neInfo.NeUid] = "less than storeNum" continue } @@ -73,11 +73,11 @@ func (s *DeleteNeConfigBackupProcessor) Execute(data any) (any, error) { var lastCreateTime int64 = 0 lastTx := tx.Select("create_time").Order("create_time DESC").Limit(1) if err := lastTx.Find(&lastCreateTime).Error; err != nil { - result[neInfo.NeUID] = err.Error() + result[neInfo.NeUid] = err.Error() continue } if lastCreateTime <= 1e12 { - result[neInfo.NeUID] = "no data" + result[neInfo.NeUid] = "no data" continue } @@ -88,13 +88,13 @@ func (s *DeleteNeConfigBackupProcessor) Execute(data any) (any, error) { // 删除小于最后时间的数据 delTx := tx.Delete("create_time < ?", ltTime.UnixMilli()) if err := delTx.Error; err != nil { - result[neInfo.NeUID] = err.Error() + result[neInfo.NeUid] = err.Error() continue } - result[neInfo.NeUID] = tx.RowsAffected + result[neInfo.NeUid] = tx.RowsAffected // 删除本地文件 - s.deleteFile(neInfo.CoreUID, neInfo.NeUID, ltTime) + s.deleteFile(neInfo.NeType, neInfo.NeUid, ltTime) } return result, nil diff --git a/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go b/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go index c0736a5f..4a5f4c77 100644 --- a/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go +++ b/src/modules/crontask/processor/ne_alarm_state_check/ne_alarm_state_check.go @@ -75,7 +75,7 @@ func (s *NeAlarmStateCheckProcessor) Execute(data any) (any, error) { } // 创建告警 alarm := oam.Alarm{ - NeUid: neInfo.NeUID, // 网元唯一标识 + NeUid: neInfo.NeUid, // 网元唯一标识 AlarmTime: time.Now().UnixMilli(), // 事件产生时间 AlarmId: params.AlarmId, // 告警ID 唯一,清除时对应 AlarmCode: constants.ALARM_STATE_CHECK, // 告警状态码 @@ -89,7 +89,7 @@ func (s *NeAlarmStateCheckProcessor) Execute(data any) (any, error) { LocationInfo: "NE State: Heartbeat", // 告警定位信息 } if err = oamService.NewAlarm.Resolve(alarm); err == nil { - result[neInfo.NeUID] = "state alarm" + result[neInfo.NeUid] = "state alarm" } } diff --git a/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go b/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go index 80ed7928..2c643cd3 100644 --- a/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go +++ b/src/modules/crontask/processor/ne_alarm_state_check_cmd/ne_alarm_state_check_cmd.go @@ -118,7 +118,7 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) { if len(warnMsg) > 0 { currentTime := time.Now() validTimes := []time.Time{} - if v, ok := triggerCount.Load(neInfo.NeUID); ok { + if v, ok := triggerCount.Load(neInfo.NeUid); ok { times := v.([]time.Time) // 清理过期的记录:10秒前的触发记录不再计入 for _, t := range times { @@ -127,11 +127,11 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) { } } validTimes = append(validTimes, currentTime) - triggerCount.Store(neInfo.NeUID, validTimes) + triggerCount.Store(neInfo.NeUid, validTimes) } else { // 事件第一次触发,初始化记录 validTimes = append(validTimes, currentTime) - triggerCount.Store(neInfo.NeUID, validTimes) + triggerCount.Store(neInfo.NeUid, validTimes) } if int64(len(validTimes)) >= triggerMax { err = fmt.Errorf("greater than %s", strings.Join(warnMsg, ", ")) @@ -149,14 +149,12 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) { addInfo = err.Error() } - // 事件产生时间 - alarmTime := time.Now().UnixMilli() // 告警ID - params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_CMD_CHECK, alarmTime) + params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_LICENSE_CHECK, neInfo.CreateTime) // 创建告警 alarm := oam.Alarm{ - NeUid: neInfo.NeUID, // 网元唯一标识 - AlarmTime: alarmTime, // 事件产生时间 + NeUid: neInfo.NeUid, // 网元唯一标识 + AlarmTime: time.Now().UnixMilli(), // 事件产生时间 AlarmId: params.AlarmId, // 告警ID 唯一,清除时对应 AlarmCode: constants.ALARM_CMD_CHECK, // 告警状态码 AlarmType: params.AlarmType, // 告警类型 @@ -169,9 +167,9 @@ func (s *NeAlarmStateCheckCMDProcessor) Execute(data any) (any, error) { LocationInfo: "NE CPU/Menory/Disk: Heartbeat", // 告警定位信息 } if err = oamService.NewAlarm.Resolve(alarm); err == nil { - result[neInfo.NeUID] = "cmd alarm" + result[neInfo.NeUid] = "cmd alarm" } - triggerCount.Delete(neInfo.NeUID) + triggerCount.Delete(neInfo.NeUid) } // 返回结果,用于记录执行结果 @@ -221,27 +219,20 @@ func (s NeAlarmStateCheckCMDProcessor) serverState(state map[string]any) (float6 } // 插入网元状态记录 - neState := neDataModel.NEState{ - CoreUID: fmt.Sprint(state["coreUid"]), - NeUID: fmt.Sprint(state["neUid"]), - NeType: fmt.Sprint(state["neType"]), - Version: fmt.Sprint(state["version"]), - Capability: parse.Number(state["capability"]), - SerialNum: fmt.Sprint(state["sn"]), - ExpiryDate: fmt.Sprint(state["expire"]), + neState := neDataModel.NeState{ + NeID: parse.Number(state["neId"]), SysCpuUsage: sysCpuUsage, SysMemUsage: sysMemUsage, SysDiskUsage: sysDiskUsage, NfCpuUsage: nfCpuUsage, NfMemUsed: nfMemUsed, - CreateTime: parse.Number(state["refreshTime"]), } s.neStateService.Insert(neState) // 删除网元状态记录7天前 ltTime := time.Now().AddDate(0, 0, -7).UnixMilli() s.neStateService.DeleteByTime(ltTime) // 推送ws消息 - groupID := fmt.Sprintf("%s_%s_%s", wsService.GROUP_NE_STATE, neState.CoreUID, neState.NeUID) + groupID := fmt.Sprintf("%s_%s", wsService.GROUP_NE_STATE, state["neUid"]) s.wsSendService.ByGroupID(groupID, neState) return sysCpuUsage, sysMemUsage, sysDiskUsage diff --git a/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go b/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go index d73b3321..1a0a33cf 100644 --- a/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go +++ b/src/modules/crontask/processor/ne_alarm_state_check_license/ne_alarm_state_check_license.go @@ -91,7 +91,7 @@ func (s *NeAlarmStateCheckLicenseProcessor) Execute(data any) (any, error) { params.AlarmId = fmt.Sprintf("%d%d", constants.ALARM_LICENSE_CHECK, neInfo.CreateTime) // 创建告警 alarm := oam.Alarm{ - NeUid: neInfo.NeUID, // 网元唯一标识 + NeUid: neInfo.NeUid, // 网元唯一标识 AlarmTime: time.Now().UnixMilli(), // 事件产生时间 AlarmId: params.AlarmId, // 告警ID 唯一,清除时对应 AlarmCode: constants.ALARM_LICENSE_CHECK, // 告警状态码 @@ -105,7 +105,7 @@ func (s *NeAlarmStateCheckLicenseProcessor) Execute(data any) (any, error) { LocationInfo: "NE License: Heartbeat", // 告警定位信息 } if err = oamService.NewAlarm.Resolve(alarm); err == nil { - result[neInfo.NeUID] = "license alarm" + result[neInfo.NeUid] = "license alarm" } } diff --git a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go index 6e7ee27c..25db9969 100644 --- a/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go +++ b/src/modules/crontask/processor/ne_config_backup/ne_config_backup.go @@ -40,31 +40,29 @@ func (s *NeConfigBackupProcessor) Execute(data any) (any, error) { // 将网元文件备份到本地 zipFilePath, err := s.neConfigBackupService.FileNeToLocal(neInfo) if err != nil { - result[neInfo.NeUID] = err.Error() + result[neInfo.NeUid] = err.Error() continue } // 新增备份记录 item := neModel.NeConfigBackup{ - CoreUID: neInfo.CoreUID, - NeUID: neInfo.NeUID, - NeType: neInfo.NeType, + NeID: neInfo.ID, Name: filepath.Base(zipFilePath), Path: zipFilePath, CreateBy: "system", } rows := s.neConfigBackupService.Insert(item) if rows <= 0 { - result[neInfo.NeUID] = "failed" + result[neInfo.NeUid] = "failed" continue } msg := "ok" // 上传到FTP服务器 if err := s.backupService.FTPPushFile(zipFilePath, ""); err != nil { - result[neInfo.NeUID] = msg + ", ftp err:" + err.Error() + result[neInfo.NeUid] = msg + ", ftp err:" + err.Error() } - result[neInfo.NeUID] = msg + result[neInfo.NeUid] = msg } return result, nil diff --git a/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go b/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go index 175040a6..f1fca0e2 100644 --- a/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go +++ b/src/modules/crontask/processor/ne_data_udm/ne_data_udm.go @@ -41,10 +41,10 @@ func (s *NeDataUDM) Execute(data any) (any, error) { neList := s.neInfoService.Find(neModel.NeInfo{NeType: "UDM"}, false, false) for _, neInfo := range neList { - result[fmt.Sprintf("AuthNumber_%s", neInfo.NeUID)] = s.udmAuthService.ResetData(neInfo.CoreUID, neInfo.NeUID) - result[fmt.Sprintf("SubNumber_%s", neInfo.NeUID)] = s.udmSubService.ResetData(neInfo.CoreUID, neInfo.NeUID) - result[fmt.Sprintf("VOIPNumber_%s", neInfo.NeUID)] = s.udmVOIPService.ResetData(neInfo.CoreUID, neInfo.NeUID) - result[fmt.Sprintf("VolteIMSNumber_%s", neInfo.NeUID)] = s.udmVolteIMSService.ResetData(neInfo.CoreUID, neInfo.NeUID) + result[fmt.Sprintf("auth_%s", neInfo.NeUid)] = s.udmAuthService.ResetData(neInfo.ID) + result[fmt.Sprintf("sub_%s", neInfo.NeUid)] = s.udmSubService.ResetData(neInfo.ID) + result[fmt.Sprintf("voip_%s", neInfo.NeUid)] = s.udmVOIPService.ResetData(neInfo.ID) + result[fmt.Sprintf("volte_%s", neInfo.NeUid)] = s.udmVolteIMSService.ResetData(neInfo.ID) } return result, nil diff --git a/src/modules/ne/controller/action.go b/src/modules/ne/controller/action.go index bb3026a4..75fafcb6 100644 --- a/src/modules/ne/controller/action.go +++ b/src/modules/ne/controller/action.go @@ -46,8 +46,7 @@ type NeActionController struct { func (s *NeActionController) FilePush(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 UploadPath string `json:"uploadPath" binding:"required"` DelTemp bool `json:"delTemp"` // 删除本地临时文件 } @@ -58,14 +57,14 @@ func (s *NeActionController) FilePush(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -105,9 +104,7 @@ func (s *NeActionController) FilePush(c *gin.Context) { // @Tags network_element/action // @Accept json // @Produce json -// @Param coreUid query string true "CoreUID" default(8I73Y01Z) -// @Param neUid query string true "NeUID" default(5AKF59BZ) -// @Param path query string true "dir path" default(/var/log) +// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Param path query string true "dir path" default(/var/log) // @Param fileName query string true "file name" // @Param delTemp query boolean false "Delete Temp File" default(false) // @Success 200 {object} object "Response Results" @@ -118,8 +115,7 @@ func (s *NeActionController) FilePush(c *gin.Context) { func (s *NeActionController) FilePull(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 Path string `form:"path" binding:"required"` FileName string `form:"fileName" binding:"required"` DelTemp bool `form:"delTemp"` // 删除本地临时文件 @@ -131,14 +127,14 @@ func (s *NeActionController) FilePull(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -179,9 +175,7 @@ func (s *NeActionController) FilePull(c *gin.Context) { // @Tags network_element/action // @Accept json // @Produce json -// @Param coreUid query string true "CoreUID" default(8I73Y01Z) -// @Param neUid query string true "NeUID" default(5AKF59BZ) -// @Param path query string true "dir path" default(/var/log) +// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Param path query string true "dir path" default(/var/log) // @Param delTemp query boolean false "Delete Temp File" default(false) // @Success 200 {object} object "Response Results" // @Security TokenAuth @@ -190,27 +184,26 @@ func (s *NeActionController) FilePull(c *gin.Context) { // @Router /ne/action/file/pull/dirzip [get] func (s *NeActionController) FilePullDirZip(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + var query struct { + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 Path string `form:"path" binding:"required"` DelTemp bool `form:"delTemp"` // 删除本地临时文件 } - if err := c.ShouldBindQuery(&querys); err != nil { + if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID) - if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -224,7 +217,7 @@ func (s *NeActionController) FilePullDirZip(c *gin.Context) { } defer sftpClient.Close() - nePath := querys.Path + nePath := query.Path dirName := generate.Code(6) localFilePath := filepath.Join("/tmp/omc/pull/", dirName) if runtime.GOOS == "windows" { @@ -238,7 +231,7 @@ func (s *NeActionController) FilePullDirZip(c *gin.Context) { } // 压缩zip文件名 - zipFileName := fmt.Sprintf("%s-%s-%s.zip", neInfo.NeType, neInfo.NeUID, dirName) + zipFileName := fmt.Sprintf("%s-%s-%s.zip", neInfo.NeType, neInfo.NeUid, dirName) zipFilePath := filepath.Join(localFilePath, zipFileName) if err := file.CompressZipByDir(zipFilePath, localDirFilePath); err != nil { c.JSON(200, resp.ErrMsg(err.Error())) @@ -246,7 +239,7 @@ func (s *NeActionController) FilePullDirZip(c *gin.Context) { } defer func() { - if querys.DelTemp { + if query.DelTemp { _ = os.RemoveAll(localFilePath) } }() @@ -271,27 +264,26 @@ func (s *NeActionController) FilePullDirZip(c *gin.Context) { // @Router /ne/action/file/view [get] func (s *NeActionController) FileView(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + var query struct { + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 Path string `form:"path" binding:"required"` FileName string `form:"fileName" binding:"required"` } - if err := c.ShouldBindQuery(&querys); err != nil { + if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID) - if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -299,7 +291,7 @@ func (s *NeActionController) FileView(c *gin.Context) { defer sshClient.Close() // 网元端文件 - nePath := filepath.ToSlash(filepath.Join(querys.Path, querys.FileName)) + nePath := filepath.ToSlash(filepath.Join(query.Path, query.FileName)) // 网元端临时目录 output, err := sshClient.RunCMD(fmt.Sprintf("cat %s", nePath)) output = strings.TrimSpace(output) @@ -330,29 +322,28 @@ func (s *NeActionController) FileView(c *gin.Context) { // @Router /ne/action/file/list [get] func (s *NeActionController) FileList(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + var query struct { + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 Path string `form:"path" binding:"required"` PageNum int64 `form:"pageNum" binding:"required"` PageSize int64 `form:"pageSize" binding:"required"` Search string `form:"search"` } - if err := c.ShouldBindQuery(&querys); err != nil { + if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID) - if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -360,10 +351,10 @@ func (s *NeActionController) FileList(c *gin.Context) { defer sshClient.Close() // 获取文件列表 - rows, err := ssh.FileList(sshClient, querys.Path, querys.Search) + rows, err := ssh.FileList(sshClient, query.Path, query.Search) if err != nil { c.JSON(200, resp.OkData(map[string]any{ - "path": querys.Path, + "path": query.Path, "total": len(rows), "rows": []ssh.FileListRow{}, })) @@ -372,8 +363,8 @@ func (s *NeActionController) FileList(c *gin.Context) { // 对数组进行切片分页 lenNum := int64(len(rows)) - start := (querys.PageNum - 1) * querys.PageSize - end := start + querys.PageSize + start := (query.PageNum - 1) * query.PageSize + end := start + query.PageSize var splitRows []ssh.FileListRow if start >= lenNum { splitRows = []ssh.FileListRow{} @@ -384,7 +375,7 @@ func (s *NeActionController) FileList(c *gin.Context) { } c.JSON(200, resp.OkData(map[string]any{ - "path": querys.Path, + "path": query.Path, "total": lenNum, "rows": splitRows, })) @@ -406,9 +397,8 @@ func (s *NeActionController) FileList(c *gin.Context) { func (s *NeActionController) Service(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 - Action string `json:"action" binding:"required,oneof=start restart stop reboot poweroff"` // 操作行为 + NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 + Action string `json:"action" binding:"required,oneof=start restart stop reboot poweroff"` // 操作行为 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -417,8 +407,8 @@ func (s *NeActionController) Service(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -443,7 +433,7 @@ func (s *NeActionController) Service(c *gin.Context) { cmdStr = "sudo shutdown -h now" } - _, err := s.neInfoService.NeRunSSHCmd(neInfo.CoreUID, neInfo.NeUID, cmdStr) + _, err := s.neInfoService.NeRunSSHCmd(neInfo.ID, cmdStr) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return diff --git a/src/modules/ne/controller/ne_config.go b/src/modules/ne/controller/ne_config.go index 0f87a120..2327ceba 100644 --- a/src/modules/ne/controller/ne_config.go +++ b/src/modules/ne/controller/ne_config.go @@ -197,7 +197,6 @@ func (s NeConfigController) ListByNeType(c *gin.Context) { func (s NeConfigController) DataInfo(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 ParamName string `form:"paramName" binding:"required"` // 可用属性 } @@ -207,8 +206,8 @@ func (s NeConfigController) DataInfo(c *gin.Context) { return } - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -245,8 +244,7 @@ func (s NeConfigController) DataInfo(c *gin.Context) { func (s NeConfigController) DataEdit(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 ParamName string `json:"paramName" binding:"required"` ParamData map[string]any `json:"paramData" binding:"required"` Loc string `json:"loc"` // 仅array使用与数据对象内index一致,有多层时划分嵌套层(index/subParamName/index) @@ -257,8 +255,8 @@ func (s NeConfigController) DataEdit(c *gin.Context) { return } - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -301,7 +299,6 @@ func (s NeConfigController) DataEdit(c *gin.Context) { func (s NeConfigController) DataAdd(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 ParamName string `json:"paramName" binding:"required"` // 根据配置可选值 ParamData map[string]any `json:"paramData" binding:"required"` // 数据对象 @@ -313,8 +310,8 @@ func (s NeConfigController) DataAdd(c *gin.Context) { return } - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -360,8 +357,7 @@ func (s NeConfigController) DataAdd(c *gin.Context) { func (s NeConfigController) DataRemove(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 ParamName string `form:"paramName" binding:"required"` Loc string `form:"loc" binding:"required"` // 与数据对象内index一致,有多层时划分嵌套层(index/subParamName/index) } @@ -371,8 +367,8 @@ func (s NeConfigController) DataRemove(c *gin.Context) { return } - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } diff --git a/src/modules/ne/controller/ne_config_backup.go b/src/modules/ne/controller/ne_config_backup.go index 57f51bac..64c655ce 100644 --- a/src/modules/ne/controller/ne_config_backup.go +++ b/src/modules/ne/controller/ne_config_backup.go @@ -10,6 +10,7 @@ import ( "be.ems/src/framework/reqctx" "be.ems/src/framework/resp" "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" "be.ems/src/modules/ne/model" neService "be.ems/src/modules/ne/service" @@ -35,11 +36,6 @@ type NeConfigBackupController struct { // GET /list func (s NeConfigBackupController) List(c *gin.Context) { query := reqctx.QueryMap(c) - coreUid, coreUidOk := query["coreUid"] - if !coreUidOk || coreUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid is empty")) - return - } rows, total := s.neConfigBackupService.FindByPage(query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -50,9 +46,7 @@ func (s NeConfigBackupController) List(c *gin.Context) { func (s NeConfigBackupController) Download(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - ID int64 `form:"id" binding:"required"` // 记录ID + ID int64 `form:"id" binding:"required"` // 记录ID } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -62,9 +56,7 @@ func (s NeConfigBackupController) Download(c *gin.Context) { // 检查是否存在 rows := s.neConfigBackupService.Find(model.NeConfigBackup{ - CoreUID: query.CoreUID, - NeUID: query.NeUID, - ID: query.ID, + ID: query.ID, }) if len(rows) <= 0 { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neConfigBackup.noData"))) @@ -85,11 +77,9 @@ func (s NeConfigBackupController) Download(c *gin.Context) { func (s NeConfigBackupController) Edit(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 - ID int64 `json:"id" binding:"required"` // 记录ID - Name string `json:"name" binding:"required"` // 名称 - Remark string `json:"remark" binding:"required"` // 备注 + ID int64 `json:"id" binding:"required"` // 记录ID + Name string `json:"name" binding:"required"` // 名称 + Remark string `json:"remark" binding:"required"` // 备注 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -99,9 +89,7 @@ func (s NeConfigBackupController) Edit(c *gin.Context) { // 检查是否存在 rows := s.neConfigBackupService.Find(model.NeConfigBackup{ - CoreUID: body.CoreUID, - NeUID: body.NeUID, - ID: body.ID, + ID: body.ID, }) if len(rows) <= 0 { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neConfigBackup.noData"))) @@ -125,9 +113,7 @@ func (s NeConfigBackupController) Edit(c *gin.Context) { func (s NeConfigBackupController) Remove(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - ID int64 `form:"id" binding:"required"` // 记录ID + ID string `form:"id" binding:"required"` // 记录ID 批量多个逗号分隔 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -135,7 +121,15 @@ func (s NeConfigBackupController) Remove(c *gin.Context) { return } - rows, err := s.neConfigBackupService.DeleteByIds(query.ID, query.CoreUID, query.NeUID) + // 处理字符转id数组后去重 + uniqueIDs := parse.RemoveDuplicatesToArray(query.ID, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) + } + + rows, err := s.neConfigBackupService.DeleteByIds(ids) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -150,10 +144,9 @@ func (s NeConfigBackupController) Remove(c *gin.Context) { func (s NeConfigBackupController) Import(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 - Type string `json:"type" binding:"required,oneof=backup upload"` // 导入类型 backup upload - Path string `json:"path" binding:"required"` // 备份文件zip文件路径 + NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 + Type string `json:"type" binding:"required,oneof=backup upload"` // 导入类型 backup upload + Path string `json:"path" binding:"required"` // 备份文件zip文件路径 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -166,8 +159,8 @@ func (s NeConfigBackupController) Import(c *gin.Context) { } // 查网元 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -189,8 +182,7 @@ func (s NeConfigBackupController) Import(c *gin.Context) { func (s NeConfigBackupController) Export(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -198,8 +190,8 @@ func (s NeConfigBackupController) Export(c *gin.Context) { return } // 查网元 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -211,9 +203,7 @@ func (s NeConfigBackupController) Export(c *gin.Context) { } // 新增备份记录 item := model.NeConfigBackup{ - CoreUID: neInfo.CoreUID, - NeUID: neInfo.NeUID, - NeType: neInfo.NeType, + NeID: neInfo.ID, Name: filepath.Base(zipFilePath), Path: zipFilePath, CreateBy: reqctx.LoginUserToUserName(c), diff --git a/src/modules/ne/controller/ne_info.go b/src/modules/ne/controller/ne_info.go index 58c75a71..0ea9d6fb 100644 --- a/src/modules/ne/controller/ne_info.go +++ b/src/modules/ne/controller/ne_info.go @@ -38,9 +38,7 @@ var mutex sync.Mutex // @Tags network_element/info // @Accept json // @Produce json -// @Param coreUid query string true "CoreUID" default(8I73Y01Z) -// @Param neUid query string true "NeUID" default(5AKF59BZ) -// @Success 200 {object} object "Response Results" +// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary Network element information state // @Description Network element information state @@ -48,8 +46,7 @@ var mutex sync.Mutex func (s NeInfoController) State(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -57,12 +54,12 @@ func (s NeInfoController) State(c *gin.Context) { return } - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - neKey := fmt.Sprintf("%s_%s", neInfo.CoreUID, neInfo.NeUID) + neKey := fmt.Sprintf("%s_%s", neInfo.NeUid, neInfo.NeType) // 网元直连 resData, err := neFetchlink.NeState(neInfo) @@ -74,12 +71,13 @@ func (s NeInfoController) State(c *gin.Context) { resDataCache.(map[string]any)["online"] = false } else { resDataCache = map[string]any{ - "online": false, - "coreUid": neInfo.CoreUID, - "neUid": neInfo.NeUID, - "neType": neInfo.NeType, - "neName": neInfo.NeName, - "ipAddr": neInfo.IPAddr, + "online": false, + "coreId": neInfo.CoreId, + "neId": neInfo.ID, + "neUid": neInfo.NeUid, + "neType": neInfo.NeType, + "neName": neInfo.NeName, + "ipAddr": neInfo.IpAddr, } } neStateCacheMap.Store(neKey, resDataCache) @@ -103,9 +101,7 @@ func (s NeInfoController) State(c *gin.Context) { // @Tags network_element/info // @Accept json // @Produce json -// @Param coreUid query string true "CoreUID" default(8I73Y01Z) -// @Param neUid query string true "NeUID" default(5AKF59BZ) -// @Success 200 {object} object "Response Results" +// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary Network element neType and neID queries // @Description Network element neType and neID queries @@ -113,8 +109,7 @@ func (s NeInfoController) State(c *gin.Context) { func (s NeInfoController) Nf(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -122,8 +117,8 @@ func (s NeInfoController) Nf(c *gin.Context) { return } - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -137,9 +132,7 @@ func (s NeInfoController) Nf(c *gin.Context) { // @Tags network_element/info // @Accept json // @Produce json -// @Param coreUid query string true "CoreUID" default(8I73Y01Z) -// @Param neUid query string true "NeUID" default(5AKF59BZ) -// @Param neType query string true "NE Type" +// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Param neType query string true "NE Type" // @Param bandStatus query boolean true "With status information" // @Param bandHost query boolean true "With host information" // @Success 200 {object} object "Response Results" @@ -150,8 +143,8 @@ func (s NeInfoController) Nf(c *gin.Context) { func (s NeInfoController) ListAll(c *gin.Context) { language := reqctx.AcceptLanguage(c) var querys struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid"` // 网元唯一标识 + CoreId int64 `form:"coreId"` // 核心网唯一标识 + NeUid string `form:"neUid"` // 网元唯一标识 NeType string `form:"neType"` BandStatus bool `form:"bandStatus"` BandHost bool `form:"bandHost"` @@ -164,11 +157,11 @@ func (s NeInfoController) ListAll(c *gin.Context) { // 查询实体参数 ne := model.NeInfo{} - if querys.CoreUID != "" { - ne.CoreUID = querys.CoreUID + if querys.CoreId != 0 { + ne.CoreId = querys.CoreId } - if querys.NeUID != "" { - ne.NeUID = querys.NeUID + if querys.NeUid != "" { + ne.NeUid = querys.NeUid } if querys.NeType != "" { ne.NeType = querys.NeType @@ -178,9 +171,121 @@ func (s NeInfoController) ListAll(c *gin.Context) { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + + // 过滤屏蔽授权文件 + arr := &neList + for i := range *arr { + (*arr)[i].ActivationRequestCode = "-" + (*arr)[i].LicensePath = "-" + } + c.JSON(200, resp.OkData(neList)) } +// 网元授权激活授权申请码 +// +// GET /license/code +// +// @Tags network_element/license +// @Accept json +// @Produce json +// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) +// @Param neId query string true "NE ID" default(001) +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary Network Element License Activation License Application Code +// @Description Network Element License Activation License Application Code +// @Router /ne/info/license/code [get] +func (s NeInfoController) LicenseCode(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var query struct { + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + } + if err := c.ShouldBindQuery(&query); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + // 读取授权码 + code, licensePath := s.neInfoService.NeConfLicenseRead(neInfo) + // 更新授权码 + if code != "" && licensePath != "" && neInfo.ActivationRequestCode != code { + // 检查是否存在 + neInfo = s.neInfoService.FindById(neInfo.ID, false) + if neInfo.ID == 0 || neInfo.NeUid == "" { + // 没有可访问网元信息数据! + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neInfo.noData"))) + return + } + neInfo.ActivationRequestCode = code + neInfo.LicensePath = licensePath + neInfo.UpdateBy = reqctx.LoginUserToUserName(c) + s.neInfoService.Update(neInfo) + } + c.JSON(200, resp.OkData(code)) +} + +// 网元授权激活授权文件替换 +// +// POST /license/update +// +// @Tags network_element/license +// @Accept json +// @Produce json +// @Param data body object true "Request Param" +// @Success 200 {object} object "Response Results" +// @Security TokenAuth +// @Summary Network element authorization activation status +// @Description Network element authorization activation status +// @Router /ne/license/update [post] +func (s NeInfoController) LicenseUpdate(c *gin.Context) { + language := reqctx.AcceptLanguage(c) + var body struct { + NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 + LicensePath string `json:"licensePath"` // 上传的文件路径 + Reload bool `json:"reload"` // 刷新重启网元 + } + if err := c.ShouldBindBodyWithJSON(&body); err != nil { + errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) + return + } + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + // 进行上传替换 + neInfo.LicensePath = body.LicensePath + err := s.neInfoService.NeConfLicenseUpload(neInfo, body.Reload) + if err != nil { + c.JSON(200, resp.ErrMsg(err.Error())) + return + } + + // 检查是否存在 + neInfo = s.neInfoService.FindById(neInfo.ID, false) + if neInfo.ID == 0 || neInfo.NeUid == "" { + // 没有可访问网元信息数据! + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neInfo.noData"))) + return + } + neInfo.LicensePath = body.LicensePath + neInfo.UpdateBy = reqctx.LoginUserToUserName(c) + s.neInfoService.Update(neInfo) + c.JSON(200, resp.Ok(nil)) +} + // 网元端Para5G配置文件读取 // // GET /file/para5g @@ -199,7 +304,7 @@ func (s NeInfoController) Para5GFileRead(c *gin.Context) { func (s NeInfoController) Para5GFileWrite(c *gin.Context) { var body struct { Content map[string]any `json:"content" binding:"required"` // 内容 - SyncNE []string `json:"syncNe"` // 同步到网元 + SyncNE []string `json:"syncNe"` // 同步到网元neUid,neUid网元唯一标识 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -219,17 +324,24 @@ func (s NeInfoController) Para5GFileWrite(c *gin.Context) { // // GET /file/oam func (s NeInfoController) OAMFileRead(c *gin.Context) { - var querys struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + language := reqctx.AcceptLanguage(c) + var query struct { + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } - if err := c.ShouldBindQuery(&querys); err != nil { + if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } - data, err := s.neInfoService.NeConfOAMReadSync(querys.CoreUID, querys.NeUID) + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { + c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + data, err := s.neInfoService.NeConfOAMReadSync(neInfo) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -243,8 +355,7 @@ func (s NeInfoController) OAMFileRead(c *gin.Context) { func (s NeInfoController) OAMFileWrite(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 Content map[string]any `json:"content" binding:"required"` // 内容 Sync bool `json:"sync"` // 同步到网元 } @@ -255,8 +366,8 @@ func (s NeInfoController) OAMFileWrite(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -288,16 +399,19 @@ func (s NeInfoController) OAMFileWrite(c *gin.Context) { // @Router /ne/info/list [get] func (s NeInfoController) List(c *gin.Context) { query := reqctx.QueryMap(c) - coreUid, coreUidOk := query["coreUid"] - if !coreUidOk || coreUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid is empty")) - return - } bandStatus := false if v, ok := query["bandStatus"]; ok { bandStatus = parse.Boolean(v) } rows, total := s.neInfoService.FindByPage(query, bandStatus) + + // 过滤屏蔽授权文件 + arr := &rows + for i := range *arr { + (*arr)[i].ActivationRequestCode = "-" + (*arr)[i].LicensePath = "-" + } + c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -317,8 +431,7 @@ func (s NeInfoController) List(c *gin.Context) { func (s NeInfoController) Info(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - ID int64 `form:"id" binding:"required"` // ID + ID int64 `form:"id" binding:"required"` // ID } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -327,7 +440,7 @@ func (s NeInfoController) Info(c *gin.Context) { } info := s.neInfoService.FindById(query.ID, true) - if info.ID != query.ID || info.CoreUID != query.CoreUID { + if info.ID != query.ID { // 没有可访问网元信息数据! c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neInfo.noData"))) return @@ -361,10 +474,6 @@ func (s NeInfoController) Add(c *gin.Context) { c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: id not is empty")) return } - if body.CoreUID == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid is empty")) - return - } body.CreateBy = reqctx.LoginUserToUserName(c) insertId := s.neInfoService.Insert(body) @@ -410,8 +519,6 @@ func (s NeInfoController) Edit(c *gin.Context) { return } - body.CoreUID = neInfo.CoreUID - body.NeUID = neInfo.NeUID body.UpdateBy = reqctx.LoginUserToUserName(c) rows := s.neInfoService.Update(body) if rows > 0 { @@ -423,7 +530,7 @@ func (s NeInfoController) Edit(c *gin.Context) { // 网元信息删除 // -// DELETE /:id +// DELETE / // // @Tags network_element/info // @Accept json @@ -437,9 +544,7 @@ func (s NeInfoController) Edit(c *gin.Context) { func (s NeInfoController) Remove(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - ID string `form:"id" binding:"required"` // 记录ID 批量多个逗号分隔 + ID string `form:"id" binding:"required"` // 记录ID 批量多个逗号分隔 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -455,7 +560,7 @@ func (s NeInfoController) Remove(c *gin.Context) { ids = append(ids, parse.Number(v)) } - rows, err := s.neInfoService.DeleteByIds(ids, query.CoreUID, query.NeUID) + rows, err := s.neInfoService.DeleteByIds(ids) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return diff --git a/src/modules/ne/controller/ne_license.go b/src/modules/ne/controller/ne_license.go deleted file mode 100644 index 51ef448a..00000000 --- a/src/modules/ne/controller/ne_license.go +++ /dev/null @@ -1,302 +0,0 @@ -package controller - -import ( - "fmt" - "strings" - - "github.com/gin-gonic/gin" - - "be.ems/src/framework/i18n" - "be.ems/src/framework/reqctx" - "be.ems/src/framework/resp" - "be.ems/src/framework/utils/parse" - "be.ems/src/modules/ne/model" - "be.ems/src/modules/ne/service" - neFetchlink "be.ems/src/modules/ne_data_nf/fetch_link" -) - -// 实例化控制层 NeLicenseController 结构体 -var NewNeLicense = &NeLicenseController{ - neLicenseService: service.NewNeLicense, - neInfoService: service.NewNeInfo, -} - -// 网元授权激活请求 -// -// PATH /license -type NeLicenseController struct { - neLicenseService *service.NeLicense // 网元授权激活服务 - neInfoService *service.NeInfo // 网元信息服务 -} - -// 网元授权激活列表 -// -// GET /list -// -// @Tags network_element/license -// @Accept json -// @Produce json -// @Param neType query string false "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) -// @Param neId query string false "NE ID" -// @Param expiryDate query string false "ExpiryDate" -// @Param pageNum query number true "pageNum" default(1) -// @Param pageSize query number true "pageSize" default(10) -// @Success 200 {object} object "Response Results" -// @Security TokenAuth -// @Summary Net Element License Activation List -// @Description Net Element License Activation List -// @Router /ne/license/list [get] -func (s *NeLicenseController) List(c *gin.Context) { - query := reqctx.QueryMap(c) - coreUid, coreUidOk := query["coreUid"] - if !coreUidOk || coreUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid is empty")) - return - } - rows, total := s.neLicenseService.FindByPage(query) - - // 过滤屏蔽授权文件 - arr := &rows - for i := range *arr { - (*arr)[i].ActivationRequestCode = "-" - (*arr)[i].LicensePath = "-" - } - - c.JSON(200, resp.OkData(map[string]any{"total": total, "rows": rows})) -} - -// 网元授权激活信息 -// -// GET / -func (s *NeLicenseController) Info(c *gin.Context) { - language := reqctx.AcceptLanguage(c) - var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - ID int64 `form:"id" binding:"required"` // ID - } - if err := c.ShouldBindQuery(&query); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return - } - - neLicense := s.neLicenseService.FindById(query.ID) - if neLicense.ID != query.ID || neLicense.CoreUID != query.CoreUID { - // 没有可访问网元授权激活数据! - c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData"))) - return - } - - c.JSON(200, resp.OkData(neLicense)) -} - -// 网元信息查询 -// -// GET /nf -// -// @Tags network_element/license -// @Accept json -// @Produce json -// @Param coreUid query string true "CoreUID" default(8I73Y01Z) -// @Param neUid query string true "NeUID" default(5AKF59BZ) -// @Success 200 {object} object "Response Results" -// @Security TokenAuth -// @Summary Network element neType and neID queries -// @Description Network element neType and neID queries -// @Router /ne/license/nf [get] -func (s *NeLicenseController) Nf(c *gin.Context) { - language := reqctx.AcceptLanguage(c) - var querys struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - } - if err := c.ShouldBindQuery(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return - } - - neLicense := s.neLicenseService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID) - if neLicense.CoreUID != querys.CoreUID || neLicense.NeUID != querys.NeUID { - // 没有可访问网元授权激活数据! - c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData"))) - return - } - - c.JSON(200, resp.OkData(neLicense)) -} - -// 网元授权激活授权申请码 -// -// GET /code -// -// @Tags network_element/license -// @Accept json -// @Produce json -// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) -// @Param neId query string true "NE ID" default(001) -// @Success 200 {object} object "Response Results" -// @Security TokenAuth -// @Summary Network Element License Activation License Application Code -// @Description Network Element License Activation License Application Code -// @Router /ne/license/code [get] -func (s *NeLicenseController) Code(c *gin.Context) { - language := reqctx.AcceptLanguage(c) - var querys struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - } - if err := c.ShouldBindQuery(&querys); err != nil { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return - } - - // 检查是否存在授权记录 - neLicense := s.neLicenseService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID) - if neLicense.CoreUID != querys.CoreUID || neLicense.NeUID != querys.NeUID { - // 没有可访问网元授权激活数据! - c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData"))) - return - } - - // 更新授权码 - code, licensePath := s.neLicenseService.ReadLicenseInfo(neLicense) - neLicense.ActivationRequestCode = code - if licensePath != "" { - neLicense.LicensePath = licensePath - } else { - neLicense.SerialNum = "" - neLicense.ExpiryDate = "" - neLicense.UeNumber = 0 - neLicense.NbNumber = 0 - neLicense.Status = "0" - } - neLicense.UpdateBy = reqctx.LoginUserToUserName(c) - s.neLicenseService.Update(neLicense) - - c.JSON(200, resp.OkData(code)) -} - -// 网元授权激活授权文件替换 -// -// POST /change -// -// @Tags network_element/license -// @Accept json -// @Produce json -// @Param data body object true "Request Param" -// @Success 200 {object} object "Response Results" -// @Security TokenAuth -// @Summary Network element authorization activation status -// @Description Network element authorization activation status -// @Router /ne/license/change [post] -func (s *NeLicenseController) Change(c *gin.Context) { - language := reqctx.AcceptLanguage(c) - var body model.NeLicense - err := c.ShouldBindBodyWithJSON(&body) - if err != nil || body.LicensePath == "" { - errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) - return - } - - // 检查是否存在授权记录 - neLicense := s.neLicenseService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neLicense.CoreUID != body.CoreUID || neLicense.NeUID != body.NeUID { - // 没有可访问网元授权激活数据! - c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData"))) - return - } - - // 更新授权记录 - if body.Remark != "" { - neLicense.Remark = body.Remark - } - neLicense.LicensePath = body.LicensePath - neLicense.Status = "0" - neLicense.UpdateBy = reqctx.LoginUserToUserName(c) - upRows := s.neLicenseService.Update(neLicense) - if upRows > 0 { - // 进行上传替换 - err = s.neLicenseService.UploadLicense(body) - if err != nil { - c.JSON(200, resp.ErrMsg(err.Error())) - return - } - c.JSON(200, resp.Ok(nil)) - return - } - c.JSON(200, resp.Err(nil)) -} - -// 网元授权激活状态 -// -// GET /state -// -// @Tags network_element/license -// @Accept json -// @Produce json -// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC) -// @Param neId query string true "NE ID" default(001) -// @Success 200 {object} object "Response Results" -// @Security TokenAuth -// @Summary Network element authorization activation status -// @Description Network element authorization activation status -// @Router /ne/license/state [get] -func (s *NeLicenseController) State(c *gin.Context) { - language := reqctx.AcceptLanguage(c) - var querys struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - } - if err := c.ShouldBindQuery(&querys); err != nil { - c.JSON(400, resp.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) - return - } - - // 检查是否存在授权记录 - neLicense := s.neLicenseService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID) - if neLicense.CoreUID != querys.CoreUID || neLicense.NeUID != querys.NeUID { - // 没有可访问网元授权激活数据! - c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData"))) - return - } - - // 查询网元获取IP获取网元状态 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(neLicense.CoreUID, neLicense.NeUID) - if neInfo.CoreUID != neLicense.CoreUID || neInfo.NeUID != neLicense.NeUID { - c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) - return - } - if neState, err := neFetchlink.NeState(neInfo); err == nil && neState["sn"] != nil { - neLicense.Status = "1" - neLicense.SerialNum = fmt.Sprint(neState["sn"]) - neLicense.ExpiryDate = fmt.Sprint(neState["expire"]) - neLicense.UeNumber = parse.Number(neState["ueNumber"]) - neLicense.NbNumber = parse.Number(neState["nbNumber"]) - } else { - neLicense.Status = "0" - } - // 更新授权码 - if neLicense.ActivationRequestCode == "" || strings.HasPrefix(neLicense.ActivationRequestCode, "SN") || neLicense.Status == "0" { - code, licensePath := s.neLicenseService.ReadLicenseInfo(neLicense) - neLicense.ActivationRequestCode = code - neLicense.LicensePath = licensePath - } - - // 更新授权信息 - neLicense.UpdateBy = reqctx.LoginUserToUserName(c) - s.neLicenseService.Update(neLicense) - - if neLicense.Status == "1" { - c.JSON(200, resp.OkData(map[string]any{ - "sn": neLicense.SerialNum, - "expire": neLicense.ExpiryDate, - "ueNumber": neLicense.UeNumber, - "nbNumber": neLicense.NbNumber, - })) - return - } - c.JSON(200, resp.ErrMsg(fmt.Sprintf("%s service status exception", neLicense.NeType))) -} diff --git a/src/modules/ne/controller/ne_software.go b/src/modules/ne/controller/ne_software.go index 817b9c88..478cbabe 100644 --- a/src/modules/ne/controller/ne_software.go +++ b/src/modules/ne/controller/ne_software.go @@ -221,10 +221,8 @@ func (s NeSoftwareController) NewNeVersion(c *gin.Context) { }) if len(neSoftwares) > 0 { neSoftware := neSoftwares[0] - s.neSoftwareService.UpdateVersions(neSoftware, model.NeVersion{ - NeType: neSoftware.NeType, - UpdateBy: reqctx.LoginUserToUserName(c), - }) + neSoftware.UpdateBy = reqctx.LoginUserToUserName(c) + s.neSoftwareService.UpdateVersion(neSoftware) c.JSON(200, resp.Ok(nil)) return } diff --git a/src/modules/ne/controller/ne_version.go b/src/modules/ne/controller/ne_version.go index 940f1915..56565c50 100644 --- a/src/modules/ne/controller/ne_version.go +++ b/src/modules/ne/controller/ne_version.go @@ -29,11 +29,6 @@ type NeVersionController struct { // GET /list func (s *NeVersionController) List(c *gin.Context) { query := reqctx.QueryMap(c) - coreUid, coreUidOk := query["coreUid"] - if !coreUidOk || coreUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid is empty")) - return - } checkVersion := true if v, ok := query["checkVersion"]; ok { checkVersion = parse.Boolean(v) @@ -48,8 +43,7 @@ func (s *NeVersionController) List(c *gin.Context) { func (s *NeVersionController) Info(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - ID int64 `form:"id" binding:"required"` // 记录ID + ID int64 `form:"id" binding:"required"` // 记录ID } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -58,7 +52,7 @@ func (s *NeVersionController) Info(c *gin.Context) { } neVersion := s.neVersionService.FindById(query.ID) - if neVersion.ID != query.ID || neVersion.CoreUID != query.CoreUID { + if neVersion.ID != query.ID { // 没有可访问网元版本数据! c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neVersion.noData"))) return @@ -72,18 +66,17 @@ func (s *NeVersionController) Info(c *gin.Context) { // GET /nf func (s *NeVersionController) Nf(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + var query struct { + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } - if err := c.ShouldBindQuery(&querys); err != nil { + if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } - neVersion := s.neVersionService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID) - if neVersion.CoreUID != querys.CoreUID || neVersion.NeUID != querys.NeUID { + neVersion := s.neVersionService.FindByNeUid(query.NeUID) + if neVersion.ID <= 0 { // 没有可访问网元授权激活数据! c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neLicense.noData"))) return @@ -108,8 +101,7 @@ func (s *NeVersionController) Nf(c *gin.Context) { func (s *NeVersionController) Operate(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 + NeID int64 `json:"neId" binding:"required"` // 网元唯一标识 Action string `json:"action" binding:"required,oneof=install upgrade rollback"` // 操作行为 Preinput map[string]string `json:"preinput" ` // 预先输入参数 } @@ -119,8 +111,8 @@ func (s *NeVersionController) Operate(c *gin.Context) { return } - neVersion := s.neVersionService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neVersion.CoreUID != body.CoreUID || neVersion.NeUID != body.NeUID { + neVersion := s.neVersionService.FindByNeId(body.NeID) + if neVersion.NeID != body.NeID { // 没有可访问网元版本数据! c.JSON(200, resp.ErrMsg(i18n.TKey(language, "neVersion.noData"))) return diff --git a/src/modules/ne/model/ne_config_backup.go b/src/modules/ne/model/ne_config_backup.go index e2d7864d..45c50515 100644 --- a/src/modules/ne/model/ne_config_backup.go +++ b/src/modules/ne/model/ne_config_backup.go @@ -3,16 +3,14 @@ package model // NeConfigBackup 网元配置文件备份记录 ne_config_backup type NeConfigBackup struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型 - Name string `json:"name" gorm:"column:name"` // 压缩包名称 - Path string `json:"path" gorm:"column:path"` // 压缩包位置 - Remark string `json:"remark" gorm:"column:remark"` // 备注 - CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 - CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 - UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者 - UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间 + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + Name string `json:"name" gorm:"column:name"` // 压缩包名称 + Path string `json:"path" gorm:"column:path"` // 压缩包位置 + Remark string `json:"remark" gorm:"column:remark"` // 备注 + CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者 + UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间 // ====== 非数据库字段属性 ====== diff --git a/src/modules/ne/model/ne_info.go b/src/modules/ne/model/ne_info.go index d36b2a50..e6a39180 100644 --- a/src/modules/ne/model/ne_info.go +++ b/src/modules/ne/model/ne_info.go @@ -1,34 +1,37 @@ package model -// NeInfo 网元信息对象 ne_info +// NeInfo 网元_基础信息表 关联创建版本、主机 type NeInfo struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 网元ID - CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型 - NeName string `json:"neName" gorm:"column:ne_name"` // 网元名称 - IPAddr string `json:"ipAddr" gorm:"column:ip_addr" binding:"required"` // 网元服务IP - Port int64 `json:"port" gorm:"column:port" binding:"required,number,max=65535,min=1"` // 端口 - PvFlag string `json:"pvFlag" gorm:"column:pv_flag" binding:"omitempty,oneof=PNF VNF"` // 网元虚拟化标识 物理PNF 虚拟VNF - Province string `json:"province" gorm:"column:province"` // 省份地域 - VendorName string `json:"vendorName" gorm:"column:vendor_name"` // 厂商名称 - Dn string `json:"dn" gorm:"column:dn"` // 网络标识 - MacAddr string `json:"macAddr" gorm:"column:mac_addr"` // MAC地址 - HostIDs string `json:"hostIds" gorm:"column:host_ids"` // 网元主机ID组 数据格式(ssh,telnet) UDM(ssh,telnet,redis) UPF(ssh,telnet,telnet) - Status int64 `json:"status" gorm:"column:status"` // 网元状态 0离线 1在线 2配置待下发 3备用模式 - Remark string `json:"remark" gorm:"column:remark"` // 备注 - CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 - CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 - UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者 - UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 网元ID + CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者 + UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间 + Remark string `json:"remark" gorm:"column:remark"` // 备注 + CoreId int64 `json:"coreId" gorm:"column:core_id"` // 核心网ID 1为全局默认 + NeUid string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 + NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型 + NeName string `json:"neName" gorm:"column:ne_name"` // 网元名称 + IpAddr string `json:"ipAddr" gorm:"column:ip_addr" binding:"required"` // 网元服务IP + Port int64 `json:"port" gorm:"column:port"` // 端口 + PvFlag string `json:"pvFlag" gorm:"column:pv_flag" binding:"omitempty,oneof=PNF VNF"` // 网元虚拟化标识 物理PNF 虚拟VNF + Province string `json:"province" gorm:"column:province"` // 省份地域 + VendorName string `json:"vendorName" gorm:"column:vendor_name"` // 厂商名称 + Dn string `json:"dn" gorm:"column:dn"` // 网络标识 + MacAddr string `json:"macAddr" gorm:"column:mac_addr"` // MAC地址 + ActivationRequestCode string `json:"activationRequestCode" gorm:"column:activation_request_code"` // 激活申请代码 + LicensePath string `json:"licensePath" gorm:"column:license_path"` // 激活授权文件 + SerialNum string `json:"serialNum" gorm:"column:serial_num"` // 序列号 + ExpiryDate string `json:"expiryDate" gorm:"column:expiry_date"` // 许可证到期日期 + UeNumber int64 `json:"ueNumber" gorm:"column:ue_number"` // 用户容量 + NbNumber int64 `json:"nbNumber" gorm:"column:nb_number"` // 基站容量 + HostIds string `json:"hostIds" gorm:"column:host_ids"` // 网元主机ID组 数据格式(ssh,telnet) UDM(ssh,telnet,redis) UPF(ssh,telnet,telnet) + Status int64 `json:"status" gorm:"column:status"` // 网元状态 0离线 1在线 2配置待下发 3备用模式 4授权无效 // ====== 非数据库字段属性 ====== - // 服务状态 - ServerState map[string]any `json:"serverState,omitempty" gorm:"-"` - - // 主机对象组 - Hosts []NeHost `json:"hosts,omitempty" gorm:"-"` + ServerState map[string]any `json:"serverState,omitempty" gorm:"-"` // 服务状态 + Hosts []NeHost `json:"hosts,omitempty" gorm:"-"` // 主机对象组 } // TableName 表名称 diff --git a/src/modules/ne/model/ne_license.go b/src/modules/ne/model/ne_license.go deleted file mode 100644 index 2396ff89..00000000 --- a/src/modules/ne/model/ne_license.go +++ /dev/null @@ -1,30 +0,0 @@ -package model - -// NeLicense 网元授权激活信息 ne_license -type NeLicense struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型 - ActivationRequestCode string `json:"activationRequestCode" gorm:"column:activation_request_code"` // 激活申请代码 - LicensePath string `json:"licensePath" gorm:"column:license_path"` // 激活授权文件 - SerialNum string `json:"serialNum" gorm:"column:serial_num"` // 序列号 - ExpiryDate string `json:"expiryDate" gorm:"column:expiry_date"` // 许可证到期日期 - UeNumber int64 `json:"ueNumber" gorm:"ue_number"` // 用户容量 - NbNumber int64 `json:"nbNumber" gorm:"nb_number"` // 基站容量 - Status string `json:"status" gorm:"column:status"` // 状态 0无效 1有效 - Remark string `json:"remark" gorm:"column:remark"` // 备注 - CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 - CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 - UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者 - UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间 - - // ====== 非数据库字段属性 ====== - - Reload bool `json:"reload,omitempty" gorm:"-"` // 刷新重启网元 -} - -// TableName 表名称 -func (*NeLicense) TableName() string { - return "ne_license" -} diff --git a/src/modules/ne/model/ne_version.go b/src/modules/ne/model/ne_version.go index 3d64902a..94552459 100644 --- a/src/modules/ne/model/ne_version.go +++ b/src/modules/ne/model/ne_version.go @@ -3,23 +3,27 @@ package model // NeVersion 网元版本信息 ne_version type NeVersion struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type" binding:"required"` // 网元类型 - Name string `json:"name" gorm:"column:name"` // 当前包名 - Version string `json:"version" gorm:"column:version" binding:"required"` // 当前版本 - Path string `json:"path" gorm:"column:path" binding:"required"` // 当前软件包 - PreName string `json:"preName" gorm:"column:pre_name"` // 上一版本包名 - PreVersion string `json:"preVersion" gorm:"column:pre_version"` // 上一版本 - PrePath string `json:"prePath" gorm:"column:pre_path"` // 上一版本软件包 - NewName string `json:"newName" gorm:"column:new_name"` // 新版本包名 - NewVersion string `json:"newVersion" gorm:"column:new_version"` // 新版本 - NewPath string `json:"newPath" gorm:"column:new_path"` // 新版本软件包 - Status string `json:"status" gorm:"column:status"` // 当前状态 1当前版本 2上一版本 3有新版本 - CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 - CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 - UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者 - UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间 + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + Name string `json:"name" gorm:"column:name"` // 当前包名 + Version string `json:"version" gorm:"column:version" binding:"required"` // 当前版本 + Path string `json:"path" gorm:"column:path" binding:"required"` // 当前软件包 + PreName string `json:"preName" gorm:"column:pre_name"` // 上一版本包名 + PreVersion string `json:"preVersion" gorm:"column:pre_version"` // 上一版本 + PrePath string `json:"prePath" gorm:"column:pre_path"` // 上一版本软件包 + NewName string `json:"newName" gorm:"column:new_name"` // 新版本包名 + NewVersion string `json:"newVersion" gorm:"column:new_version"` // 新版本 + NewPath string `json:"newPath" gorm:"column:new_path"` // 新版本软件包 + Status string `json:"status" gorm:"column:status"` // 当前状态 1当前版本 2上一版本 3有新版本 + CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + UpdateBy string `json:"updateBy" gorm:"column:update_by"` // 更新者 + UpdateTime int64 `json:"updateTime" gorm:"column:update_time"` // 更新时间 + + // ====== 非数据库字段属性 ====== + + NeUid string `json:"neUid,omitempty" gorm:"->"` // 网元唯一标识 + NeName string `json:"neName,omitempty" gorm:"->"` // 网元名称 + NeType string `json:"neType,omitempty" gorm:"->"` // 网元类型 } // TableName 表名称 diff --git a/src/modules/ne/ne.go b/src/modules/ne/ne.go index 0b6dee61..062becb8 100644 --- a/src/modules/ne/ne.go +++ b/src/modules/ne/ne.go @@ -63,6 +63,14 @@ func Setup(router *gin.Engine) { middleware.AuthorizeUser(nil), controller.NewNeInfo.ListAll, ) + neInfoGroup.GET("/license/code", + middleware.AuthorizeUser(nil), + controller.NewNeInfo.LicenseCode, + ) + neInfoGroup.POST("/license/update", + middleware.AuthorizeUser(nil), + controller.NewNeInfo.LicenseUpdate, + ) neInfoGroup.GET("/file/para5g", middleware.AuthorizeUser(nil), controller.NewNeInfo.Para5GFileRead, @@ -241,36 +249,6 @@ func Setup(router *gin.Engine) { ) } - // 网元授权激活信息 - neLicenseGroup := router.Group("/ne/license") - { - neLicenseGroup.GET("/list", - middleware.AuthorizeUser(nil), - controller.NewNeLicense.List, - ) - neLicenseGroup.GET("", - middleware.AuthorizeUser(nil), - controller.NewNeLicense.Info, - ) - neLicenseGroup.GET("/nf", - middleware.AuthorizeUser(nil), - controller.NewNeLicense.Nf, - ) - neLicenseGroup.GET("/code", - middleware.AuthorizeUser(nil), - controller.NewNeLicense.Code, - ) - neLicenseGroup.POST("/change", - middleware.AuthorizeUser(nil), - collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neLicense", collectlogs.BUSINESS_TYPE_OTHER)), - controller.NewNeLicense.Change, - ) - neLicenseGroup.GET("/state", - middleware.AuthorizeUser(nil), - controller.NewNeLicense.State, - ) - } - // 网元参数配置 neConfigGroup := router.Group("/ne/config") { @@ -361,13 +339,13 @@ func Setup(router *gin.Engine) { // InitLoad 初始参数 func InitLoad() { // 启动时,清除缓存-网元类型 - service.NewNeInfo.ClearNeCacheByCoreUid("*") - service.NewNeInfo.RefreshNeCacheByCoreUid("*") + service.NewNeInfo.ClearNeCacheByNeId(0) + service.NewNeInfo.RefreshNeCacheByNeId(0) // 启动时,网元公共参数数据记录到全局变量 if para5GMap, err := service.NewNeInfo.NeConfPara5GRead(); para5GMap != nil && err == nil { service.NewNeInfo.NeConfPara5GWirte(para5GMap, nil) } // 启动时,清除缓存-网元参数配置可用属性值 - service.NewNeConfig.ClearNeCacheByNeType("*") - service.NewNeConfig.RefreshByNeTypeAndNeID("*") + service.NewNeConfig.ClearByNeType("*") + service.NewNeConfig.RefreshByNeType("*") } diff --git a/src/modules/ne/repository/ne_config_backup.go b/src/modules/ne/repository/ne_config_backup.go index 80bbfae7..4b0b87a3 100644 --- a/src/modules/ne/repository/ne_config_backup.go +++ b/src/modules/ne/repository/ne_config_backup.go @@ -22,12 +22,6 @@ func (r NeConfigBackup) SelectByPage(query map[string]string) ([]model.NeConfigB if v, ok := query["neType"]; ok && v != "" { tx = tx.Where("ne_type = ?", v) } - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) - } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid = ?", v) - } if v, ok := query["name"]; ok && v != "" { tx = tx.Where("name like ?", fmt.Sprintf("%%%s%%", v)) } @@ -56,14 +50,8 @@ func (r NeConfigBackup) SelectByPage(query map[string]string) ([]model.NeConfigB func (r NeConfigBackup) Select(param model.NeConfigBackup) []model.NeConfigBackup { tx := db.DB("").Model(&model.NeConfigBackup{}) // 查询条件拼接 - if param.CoreUID != "" { - tx = tx.Where("core_uid = ?", param.CoreUID) - } - if param.NeUID != "" { - tx = tx.Where("ne_uid = ?", param.NeUID) - } - if param.NeType != "" { - tx = tx.Where("ne_type = ?", param.NeType) + if param.NeID != 0 { + tx = tx.Where("ne_id = ?", param.NeID) } if param.CreateBy != "" { tx = tx.Where("create_by like ?", fmt.Sprintf("%s%%", param.CreateBy)) diff --git a/src/modules/ne/repository/ne_info.go b/src/modules/ne/repository/ne_info.go index 2e1f4d11..2d3019d3 100644 --- a/src/modules/ne/repository/ne_info.go +++ b/src/modules/ne/repository/ne_info.go @@ -74,11 +74,11 @@ func (r NeInfo) SelectByPage(query map[string]string) ([]model.NeInfo, int64) { if v, ok := query["neType"]; ok && v != "" { tx = tx.Where("ne_type = ?", v) } - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) + if v, ok := query["coreId"]; ok && v != "" { + tx = tx.Where("core_id = ?", v) } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid like ?", fmt.Sprintf("%s%%", v)) + if v, ok := query["neName"]; ok && v != "" { + tx = tx.Where("ne_name like ?", fmt.Sprintf("%s%%", v)) } // 查询结果 @@ -109,7 +109,11 @@ func (r NeInfo) SelectByIds(ids []int64) []model.NeInfo { } tx := db.DB("").Model(&model.NeInfo{}) // 构建查询条件 - tx = tx.Where("id in ?", ids) + if len(ids) == 1 { + tx = tx.Where("id = ?", ids[0]) + } else { + tx = tx.Where("id in ?", ids) + } // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) @@ -174,11 +178,11 @@ func (r NeInfo) SelectList(neInfo model.NeInfo) []model.NeInfo { if neInfo.NeType != "" { tx = tx.Where("ne_type = ?", neInfo.NeType) } - if neInfo.CoreUID != "" { - tx = tx.Where("core_uid = ?", neInfo.CoreUID) + if neInfo.CoreId != 0 { + tx = tx.Where("core_id = ?", neInfo.CoreId) } - if neInfo.NeUID != "" { - tx = tx.Where("ne_uid = ?", neInfo.NeUID) + if neInfo.NeUid != "" { + tx = tx.Where("ne_uid = ?", neInfo.NeUid) } // 查询数据 @@ -190,16 +194,14 @@ func (r NeInfo) SelectList(neInfo model.NeInfo) []model.NeInfo { return r.neListSort(rows) } -// SelectNeInfoByCoreUidAndNeUid 通过core_uid和ne_uid查询网元信息 -// coreUid 为*或空字符时,根据neUid查询 -func (r NeInfo) SelectNeInfoByCoreUidAndNeUid(coreUid, neUid string) model.NeInfo { +// SelectNeInfoByNeUid 通过ne_uid查询网元信息 +func (r NeInfo) SelectNeInfoByNeUid(neUid string) model.NeInfo { + if neUid == "" { + return model.NeInfo{} + } tx := db.DB("").Model(&model.NeInfo{}) // 构建查询条件 - if coreUid == "*" || coreUid == "" { - tx = tx.Where("ne_uid = ?", neUid) - } else { - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) - } + tx = tx.Where("ne_uid = ?", neUid) // 查询数据 row := model.NeInfo{} if err := tx.Limit(1).Find(&row).Error; err != nil { @@ -210,15 +212,20 @@ func (r NeInfo) SelectNeInfoByCoreUidAndNeUid(coreUid, neUid string) model.NeInf } // UpdateState 修改状态 -func (r NeInfo) UpdateState(id int64, status int64) int64 { - if id <= 0 { +func (r NeInfo) UpdateState(neInfo model.NeInfo) int64 { + if neInfo.ID <= 0 { return 0 } tx := db.DB("").Model(&model.NeInfo{}) // 构建查询条件 - tx = tx.Where("id = ?", id) + tx = tx.Where("id = ?", neInfo.ID) tx.Updates(map[string]any{ - "status": status, + "status": neInfo.Status, + "ne_type": neInfo.NeType, + "serial_num": neInfo.SerialNum, + "expiry_date": neInfo.ExpiryDate, + "ue_number": neInfo.UeNumber, + "nb_number": neInfo.NbNumber, "update_time": time.Now().UnixMilli(), }) // 执行更新 diff --git a/src/modules/ne/repository/ne_license.go b/src/modules/ne/repository/ne_license.go deleted file mode 100644 index 768a4b8c..00000000 --- a/src/modules/ne/repository/ne_license.go +++ /dev/null @@ -1,158 +0,0 @@ -package repository - -import ( - "fmt" - "time" - - "be.ems/src/framework/database/db" - "be.ems/src/framework/logger" - "be.ems/src/modules/ne/model" -) - -// 实例化数据层 NeLicense 结构体 -var NewNeLicense = &NeLicense{} - -// NeLicense 网元授权激活信息 数据层处理 -type NeLicense struct{} - -// SelectByPage 分页查询集合 -func (r NeLicense) SelectByPage(query map[string]string) ([]model.NeLicense, int64) { - tx := db.DB("").Model(&model.NeLicense{}) - // 查询条件拼接 - if v, ok := query["neType"]; ok && v != "" { - tx = tx.Where("ne_type = ?", v) - } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid = ?", v) - } - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) - } - if v, ok := query["expiryDate"]; ok && v != "" { - tx = tx.Where("expiry_date like ?", fmt.Sprintf("%s%%", v)) - } - if v, ok := query["serialNum"]; ok && v != "" { - tx = tx.Where("serial_num like ?", fmt.Sprintf("%s%%", v)) - } - if v, ok := query["createBy"]; ok && v != "" { - tx = tx.Where("create_by like ?", fmt.Sprintf("%s%%", v)) - } - - // 查询结果 - var total int64 = 0 - rows := []model.NeLicense{} - - // 查询数量为0直接返回 - if err := tx.Count(&total).Error; err != nil || total <= 0 { - return rows, total - } - - // 查询数据分页 - pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) - tx = tx.Limit(pageSize).Offset(pageSize * pageNum) - tx = tx.Order("id desc") - err := tx.Find(&rows).Error - if err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows, total - } - return rows, total -} - -// Select 查询集合 -func (r NeLicense) Select(param model.NeLicense) []model.NeLicense { - tx := db.DB("").Model(&model.NeLicense{}) - // 查询条件拼接 - if param.CoreUID != "" { - tx = tx.Where("core_uid = ?", param.CoreUID) - } - if param.NeUID != "" { - tx = tx.Where("ne_uid = ?", param.NeUID) - } - if param.NeType != "" { - tx = tx.Where("ne_type = ?", param.NeType) - } - if param.ExpiryDate != "" { - tx = tx.Where("expiry_date = ?", param.ExpiryDate) - } - if param.SerialNum != "" { - tx = tx.Where("serial_num = ?", param.SerialNum) - } - if param.CreateBy != "" { - tx = tx.Where("create_by like ?", fmt.Sprintf("%s%%", param.CreateBy)) - } - - // 查询数据 - rows := []model.NeLicense{} - if err := tx.Find(&rows).Error; err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows - } - return rows -} - -// SelectByIds 通过ID查询 -func (r NeLicense) SelectByIds(ids []int64) []model.NeLicense { - rows := []model.NeLicense{} - if len(ids) <= 0 { - return rows - } - tx := db.DB("").Model(&model.NeLicense{}) - // 构建查询条件 - tx = tx.Where("id in ?", ids) - // 查询数据 - if err := tx.Find(&rows).Error; err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows - } - return rows -} - -// Insert 新增信息 -func (r NeLicense) Insert(neInfo model.NeLicense) int64 { - if neInfo.CreateBy != "" { - ms := time.Now().UnixMilli() - neInfo.CreateTime = ms - neInfo.UpdateTime = ms - neInfo.UpdateBy = neInfo.CreateBy - } - tx := db.DB("").Create(&neInfo) - if err := tx.Error; err != nil { - logger.Errorf("CreateInBatches err => %v", err) - } - return neInfo.ID -} - -// Update 修改信息 -func (r NeLicense) Update(param model.NeLicense) int64 { - if param.ID <= 0 { - return 0 - } - if param.UpdateBy != "" { - param.UpdateTime = time.Now().UnixMilli() - } - param.UpdateTime = time.Now().UnixMilli() - tx := db.DB("").Model(&model.NeLicense{}) - // 构建查询条件 - tx = tx.Where("id = ?", param.ID) - tx = tx.Omit("id", "create_by", "create_time") - // 执行更新 - if err := tx.Updates(param).Error; err != nil { - logger.Errorf("update err => %v", err.Error()) - return 0 - } - return tx.RowsAffected -} - -// DeleteByIds 批量删除信息 -func (r NeLicense) DeleteByIds(ids []int64) int64 { - if len(ids) <= 0 { - return 0 - } - tx := db.DB("").Where("id in ?", ids) - if err := tx.Delete(&model.NeLicense{}).Error; err != nil { - logger.Errorf("delete err => %v", err.Error()) - return 0 - } - return tx.RowsAffected -} diff --git a/src/modules/ne/repository/ne_version.go b/src/modules/ne/repository/ne_version.go index 682355fb..4ef8c0eb 100644 --- a/src/modules/ne/repository/ne_version.go +++ b/src/modules/ne/repository/ne_version.go @@ -19,14 +19,8 @@ type NeVersion struct{} func (r NeVersion) SelectByPage(query map[string]string) ([]model.NeVersion, int64) { tx := db.DB("").Model(&model.NeVersion{}) // 查询条件拼接 - if v, ok := query["neType"]; ok && v != "" { - tx = tx.Where("ne_type = ?", v) - } - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) - } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid = ?", v) + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) } if v, ok := query["version"]; ok && v != "" { tx = tx.Where("version like ?", fmt.Sprintf("%s%%", v)) @@ -47,6 +41,10 @@ func (r NeVersion) SelectByPage(query map[string]string) ([]model.NeVersion, int // 查询数据分页 pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + + // 关联查询 + tx = tx.Joins("left join ne_info on ne_info.id = ne_version.ne_id") + tx = tx.Select("ne_version.*, ne_info.ne_name, ne_info.ne_type, ne_info.ne_uid") tx = tx.Order("update_time desc") err := tx.Find(&rows).Error if err != nil { @@ -60,14 +58,8 @@ func (r NeVersion) SelectByPage(query map[string]string) ([]model.NeVersion, int func (r NeVersion) Select(param model.NeVersion) []model.NeVersion { tx := db.DB("").Model(&model.NeVersion{}) // 查询条件拼接 - if param.CoreUID != "" { - tx = tx.Where("core_uid = ?", param.CoreUID) - } - if param.NeUID != "" { - tx = tx.Where("ne_uid = ?", param.NeUID) - } - if param.NeType != "" { - tx = tx.Where("ne_type = ?", param.NeType) + if param.NeID != 0 { + tx = tx.Where("ne_id = ?", param.NeID) } if param.Version != "" { tx = tx.Where("version like ?", fmt.Sprintf("%s%%", param.Version)) diff --git a/src/modules/ne/service/ne_config.go b/src/modules/ne/service/ne_config.go index 8e1e0a94..91a6b28e 100644 --- a/src/modules/ne/service/ne_config.go +++ b/src/modules/ne/service/ne_config.go @@ -22,7 +22,7 @@ type NeConfig struct { } // RefreshByNeType 通过ne_type刷新redis中的缓存 -func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { +func (r *NeConfig) RefreshByNeType(neType string) []model.NeConfig { // 多个 if neType == "" || neType == "*" { neConfigList := r.neConfigRepository.Select(model.NeConfig{}) @@ -40,7 +40,8 @@ func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { redis.Del("", key) if len(v) > 0 { for i, item := range v { - if err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData); err != nil { + err := json.Unmarshal([]byte(item.ParamJson), &item.ParamData) + if err != nil { continue } v[i] = item @@ -60,7 +61,8 @@ func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { }) if len(neConfigList) > 0 { for i, v := range neConfigList { - if err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData); err != nil { + err := json.Unmarshal([]byte(v.ParamJson), &v.ParamData) + if err != nil { continue } neConfigList[i] = v @@ -71,8 +73,8 @@ func (r *NeConfig) RefreshByNeTypeAndNeID(neType string) []model.NeConfig { return neConfigList } -// ClearNeCacheByNeType 清除网元类型参数配置缓存 -func (r *NeConfig) ClearNeCacheByNeType(neType string) bool { +// ClearByNeType 清除网元类型参数配置缓存 +func (r *NeConfig) ClearByNeType(neType string) bool { key := fmt.Sprintf("%s:NeConfig:%s", constants.CACHE_NE_DATA, neType) if neType == "*" { key = fmt.Sprintf("%s:NeConfig:*", constants.CACHE_NE_DATA) @@ -95,7 +97,7 @@ func (r *NeConfig) FindByNeType(neType string) []model.NeConfig { neConfigList = []model.NeConfig{} } } else { - neConfigList = r.RefreshByNeTypeAndNeID(neType) + neConfigList = r.RefreshByNeType(neType) } return neConfigList } diff --git a/src/modules/ne/service/ne_config_backup.go b/src/modules/ne/service/ne_config_backup.go index 8fcb6549..a70154e2 100644 --- a/src/modules/ne/service/ne_config_backup.go +++ b/src/modules/ne/service/ne_config_backup.go @@ -56,20 +56,13 @@ func (s NeConfigBackup) Update(item model.NeConfigBackup) int64 { } // DeleteByIds 批量删除信息 -func (s NeConfigBackup) DeleteByIds(id int64, coreUid string, neUid string) (int64, error) { +func (s NeConfigBackup) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 - data := s.neConfigBackupRepository.SelectByIds([]int64{id}) + data := s.neConfigBackupRepository.SelectByIds(ids) if len(data) != 1 { return 0, fmt.Errorf("neConfigBackup.noData") } - - for _, v := range data { - if v.CoreUID != coreUid || v.NeUID != neUid { - return 0, fmt.Errorf("data not match, id: %d", v.ID) - } - } - rows := s.neConfigBackupRepository.DeleteByIds([]int64{id}) - return rows, nil + return s.neConfigBackupRepository.DeleteByIds(ids), nil } // FileLocalToNe 网元配置文件复制到网元端覆盖 @@ -80,13 +73,13 @@ func (s NeConfigBackup) FileLocalToNe(neInfo model.NeInfo, localFile string) err if runtime.GOOS == "windows" { omcPath = fmt.Sprintf("C:%s", omcPath) } - localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeUID) + localDirPath := fmt.Sprintf("%s/%s/%s/backup/tmp_import", omcPath, neTypeLower, neInfo.NeUid) if err := file.UnZip(localFile, localDirPath); err != nil { return fmt.Errorf("unzip err") } // 网元主机的SSH客户端 - sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.ID) if err != nil { return fmt.Errorf("ne info ssh client err") } @@ -99,7 +92,7 @@ func (s NeConfigBackup) FileLocalToNe(neInfo model.NeInfo, localFile string) err defer sftpClient.Close() // 网元配置端上的临时目录 - neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeUID) + neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeUid) sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /tmp/omc/ne_config && sudo chmod 777 -R /tmp/omc && sudo rm -rf %s", neDirTemp)) // 复制到网元端 if err = sftpClient.CopyDirLocalToRemote(localDirPath, neDirTemp); err != nil { @@ -149,7 +142,7 @@ func (s NeConfigBackup) FileLocalToNe(neInfo model.NeInfo, localFile string) err // FileNeToLocal 网元备份文件网元端复制到本地 func (s NeConfigBackup) FileNeToLocal(neInfo model.NeInfo) (string, error) { // 网元主机的SSH客户端 - sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.ID) if err != nil { return "", fmt.Errorf("ne info ssh client err") } @@ -167,11 +160,11 @@ func (s NeConfigBackup) FileNeToLocal(neInfo model.NeInfo) (string, error) { if runtime.GOOS == "windows" { omcPath = fmt.Sprintf("C:%s", omcPath) } - localDirPath := fmt.Sprintf("%s/%s/%s/from_ne_tmp", omcPath, neTypeLower, neInfo.NeUID) + localDirPath := fmt.Sprintf("%s/%s/%s/from_ne_tmp", omcPath, neTypeLower, neInfo.NeUid) // 网元配置文件先复制到临时目录 sshClient.RunCMD("sudo mkdir -p /tmp/omc/ne_config && sudo chmod 777 -R /tmp/omc") - neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeUID) + neDirTemp := fmt.Sprintf("/tmp/omc/ne_config/%s/%s", neTypeLower, neInfo.NeUid) switch neTypeLower { case "ims": // ims目录 @@ -212,8 +205,8 @@ func (s NeConfigBackup) FileNeToLocal(neInfo model.NeInfo) (string, error) { } // 压缩zip文件名 - zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeUID, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS)) - zipFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neInfo.NeUID, zipFileName) + zipFileName := fmt.Sprintf("%s-%s-etc-%s.zip", neTypeLower, neInfo.NeUid, date.ParseDateToStr(time.Now(), date.YYYYMMDDHHMMSS)) + zipFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neInfo.NeUid, zipFileName) if err := file.CompressZipByDir(zipFilePath, localDirPath); err != nil { return "", fmt.Errorf("compress zip err") } diff --git a/src/modules/ne/service/ne_info.go b/src/modules/ne/service/ne_info.go index b65a8081..00d58205 100644 --- a/src/modules/ne/service/ne_info.go +++ b/src/modules/ne/service/ne_info.go @@ -14,6 +14,7 @@ import ( "be.ems/src/framework/logger" "be.ems/src/framework/ssh" "be.ems/src/framework/telnet" + "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/generate" "be.ems/src/framework/utils/parse" "be.ems/src/modules/ne/model" @@ -35,78 +36,93 @@ type NeInfo struct { Para5GData map[string]string } -// FindByCoreUidAndNeUid 通过core_uid和ne_uid查询网元信息 -// coreUid 为*时,根据neUid查询 -func (r NeInfo) FindByCoreUidAndNeUid(coreUid string, neUid string) model.NeInfo { - var neInfo model.NeInfo - key := fmt.Sprintf("%s:%s:*:%s", constants.CACHE_NE_INFO, coreUid, neUid) - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - err := json.Unmarshal([]byte(jsonStr), &neInfo) - if err != nil { - neInfo = model.NeInfo{} +// FindByNeId 通过id查询网元信息 +func (r NeInfo) FindByNeId(neId int64) model.NeInfo { + neInfo := model.NeInfo{} + key := fmt.Sprintf("%s:*:%d:*", constants.CACHE_NE_INFO, neId) + jsonStr, err := redis.Get("", key) + if err == nil && len(jsonStr) > 7 { + if err := json.Unmarshal([]byte(jsonStr), &neInfo); err != nil { + return neInfo } } else { - neInfo = r.neInfoRepository.SelectNeInfoByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID == coreUid && neInfo.NeUID == neUid { + neInfos := r.neInfoRepository.SelectByIds([]int64{neId}) + if len(neInfos) == 1 { + neInfo = neInfos[0] redis.Del("", key) - values, _ := json.Marshal(neInfo) - redis.Set("", key, string(values), 0) + dataByte, err := json.Marshal(neInfo) + if err != nil { + return neInfo + } + key = fmt.Sprintf("%s:%s:%d:%s", constants.CACHE_NE_INFO, neInfo.NeType, neInfo.ID, neInfo.NeUid) + redis.Set("", key, string(dataByte), 0) } } return neInfo } -// RefreshByCoreUidAndNeUid 通过core_id和ne_uid刷新缓存 -func (r NeInfo) RefreshByCoreUidAndNeUid(coreuid string, neUid string) model.NeInfo { - var neInfo model.NeInfo - if coreuid == "*" || coreuid == "" { - return neInfo - } - key := fmt.Sprintf("%s:%s:*:%s", constants.CACHE_NE_INFO, coreuid, neUid) - redis.Del("", key) - neInfo = r.neInfoRepository.SelectNeInfoByCoreUidAndNeUid(coreuid, neUid) - if neInfo.CoreUID == coreuid && neInfo.NeUID == neUid { - values, _ := json.Marshal(neInfo) - redis.Set("", key, string(values), 0) +// FindByCoreUidAndNeUid 通过ne_uid查询网元信息 +func (r NeInfo) FindByNeUid(neUid string) model.NeInfo { + neInfo := model.NeInfo{} + key := fmt.Sprintf("%s:*:*:%s", constants.CACHE_NE_INFO, neUid) + jsonStr, err := redis.Get("", key) + if err == nil && len(jsonStr) > 7 { + if err := json.Unmarshal([]byte(jsonStr), &neInfo); err != nil { + return neInfo + } + } else { + neInfo = r.neInfoRepository.SelectNeInfoByNeUid(neUid) + if neInfo.NeUid == neUid { + redis.Del("", key) + dataByte, err := json.Marshal(neInfo) + if err != nil { + return neInfo + } + key = fmt.Sprintf("%s:%s:%d:%s", constants.CACHE_NE_INFO, neInfo.NeType, neInfo.ID, neInfo.NeUid) + redis.Set("", key, string(dataByte), 0) + } } return neInfo } -// FindByCoreUidAndNeType 通过core_uid和ne_type查询网元信息 -// coreUid 为*时,根据neType查询 -func (r NeInfo) FindByCoreUidAndNeType(coreUid string, neType string) []model.NeInfo { - neInfo := make([]model.NeInfo, 0) - key := fmt.Sprintf("%s:%s:%s:*", constants.CACHE_NE_INFO, coreUid, neType) +// FindByNeType 通过ne_type查询网元信息 +func (r NeInfo) FindByNeType(neType string) []model.NeInfo { + neInfos := make([]model.NeInfo, 0) + key := fmt.Sprintf("%s:%s:*", constants.CACHE_NE_INFO, neType) cacheKeys, _ := redis.GetKeys("", key) if len(cacheKeys) > 0 { for _, key := range cacheKeys { - var v model.NeInfo - jsonStr, _ := redis.Get("", key) - if len(jsonStr) > 7 { - json.Unmarshal([]byte(jsonStr), &v) + jsonStr, err := redis.Get("", key) + if err != nil || len(jsonStr) < 7 { + continue } - neInfo = append(neInfo, v) + var v model.NeInfo + if err = json.Unmarshal([]byte(jsonStr), &v); err != nil { + continue + } + neInfos = append(neInfos, v) } - return neInfo + return neInfos } else { - neInfo = r.neInfoRepository.SelectList(model.NeInfo{CoreUID: coreUid, NeType: neType}) - for _, v := range neInfo { - key := fmt.Sprintf("%s:%s:%s:%s", constants.CACHE_NE_INFO, v.CoreUID, v.NeType, v.NeUID) + neInfos = r.neInfoRepository.SelectList(model.NeInfo{NeType: neType}) + for _, v := range neInfos { + key := fmt.Sprintf("%s:%s:%d:%s", constants.CACHE_NE_INFO, v.NeType, v.ID, v.NeUid) redis.Del("", key) - values, _ := json.Marshal(v) - redis.Set("", key, string(values), 0) + dataByte, err := json.Marshal(v) + if err != nil { + continue + } + redis.Set("", key, string(dataByte), 0) } } - return neInfo + return neInfos } -// ClearNeCacheByCoreUidOrNeUid 清除核心网下网元信息缓存 -// coreUid 核心网唯一标识 *表示清除所有 -func (r NeInfo) ClearNeCacheByCoreUid(coreUid string) bool { - key := fmt.Sprintf("%s:*", constants.CACHE_NE_INFO) - if coreUid != "*" { - key = fmt.Sprintf("%s:%s:*", constants.CACHE_NE_INFO, coreUid) +// ClearNeCacheByNeId 清除网元信息缓存 0表示所有 +func (r NeInfo) ClearNeCacheByNeId(neId int64) bool { + key := fmt.Sprintf("%s:*:%d:*", constants.CACHE_NE_INFO, neId) + if neId == 0 { + key = fmt.Sprintf("%s:*", constants.CACHE_NE_INFO) } keys, err := redis.GetKeys("", key) if err != nil { @@ -115,17 +131,19 @@ func (r NeInfo) ClearNeCacheByCoreUid(coreUid string) bool { return redis.DelKeys("", keys) == nil } -// RefreshNeCacheByCoreUid 刷新核心网下网元信息缓存 -// coreUid 核心网唯一标识 *表示所有 -func (r NeInfo) RefreshNeCacheByCoreUid(coreUid string) { - if coreUid == "*" { - coreUid = "" +// RefreshNeCacheByNeId 刷新网元信息缓存 0表示所有 +func (r NeInfo) RefreshNeCacheByNeId(neId int64) { + if neId == 0 { + neId = 0 } - neInfos := r.Find(model.NeInfo{CoreUID: coreUid}, false, false) + neInfos := r.Find(model.NeInfo{ID: neId}, false, false) for _, v := range neInfos { - key := fmt.Sprintf("%s:%s:%s:%s", constants.CACHE_NE_INFO, v.CoreUID, v.NeType, v.NeUID) + key := fmt.Sprintf("%s:%d:%s:%s", constants.CACHE_NE_INFO, v.ID, v.NeType, v.NeUid) redis.Del("", key) - values, _ := json.Marshal(v) + values, err := json.Marshal(v) + if err != nil { + continue + } redis.Set("", key, string(values), 0) } } @@ -174,11 +192,10 @@ func (r NeInfo) bandNeStatus(arr *[]model.NeInfo) { "online": false, } // 网元状态设置为离线 + (*arr)[i].Status = 0 if v.Status != 0 { v.Status = 0 - (*arr)[i].Status = v.Status - (*arr)[i].UpdateTime = time.Now().UnixMilli() - r.neInfoRepository.UpdateState(v.ID, v.Status) + r.neInfoRepository.UpdateState(v) } continue } @@ -193,10 +210,23 @@ func (r NeInfo) bandNeStatus(arr *[]model.NeInfo) { if _, err = neFetchlink.NeConfigOMC(v); err != nil { status = 2 } + (*arr)[i].Status = status if v.Status != status { - (*arr)[i].UpdateTime = time.Now().UnixMilli() - r.neInfoRepository.UpdateState(v.ID, status) + v.Status = status + if n, ok := result["sn"]; ok && n != nil { + v.SerialNum = fmt.Sprint(n) + } + if n, ok := result["expire"]; ok && n != nil { + v.ExpiryDate = fmt.Sprint(n) + } + if n, ok := result["ueNumber"]; ok && n != nil { + v.UeNumber = parse.Number(n) + } + if n, ok := result["nbNumber"]; ok && n != nil { + v.NbNumber = parse.Number(n) + } + r.neInfoRepository.UpdateState(v) } } } @@ -205,8 +235,8 @@ func (r NeInfo) bandNeStatus(arr *[]model.NeInfo) { func (r NeInfo) bandNeHosts(arr *[]model.NeInfo) { for i := range *arr { v := (*arr)[i] - if v.HostIDs != "" { - hostIds := strings.Split(v.HostIDs, ",") + if v.HostIds != "" { + hostIds := strings.Split(v.HostIds, ",") if len(hostIds) <= 1 { continue } @@ -232,7 +262,7 @@ func (r NeInfo) FindById(id int64, bandHost bool) model.NeInfo { neInfos := r.neInfoRepository.SelectByIds([]int64{id}) if len(neInfos) > 0 { // 带主机信息 - if neInfos[0].HostIDs != "" && bandHost { + if neInfos[0].HostIds != "" && bandHost { r.bandNeHosts(&neInfos) } return neInfos[0] @@ -242,10 +272,10 @@ func (r NeInfo) FindById(id int64, bandHost bool) model.NeInfo { // Insert 新增信息 func (r NeInfo) Insert(neInfo model.NeInfo) int64 { - if neInfo.CoreUID == "" { - return 0 + if len(neInfo.NeUid) < 8 { + neInfo.NeUid = strings.ToUpper(generate.Code(8)) } - neInfo.NeUID = strings.ToUpper(generate.Code(8)) + neInfo.NeType = strings.ToUpper(neInfo.NeType) // 获取网元状态是否正常 serverState, err := neFetchlink.NeState(neInfo) @@ -265,59 +295,49 @@ func (r NeInfo) Insert(neInfo model.NeInfo) int64 { // 主机信息新增 if neInfo.Hosts != nil { - uuid := generate.Code(4) - var hostIDs []string + var hostIds []string for _, host := range neInfo.Hosts { + uuid := generate.Code(4) host.Title = fmt.Sprintf("%s_%d_%s", neInfo.NeName, host.Port, uuid) host.GroupID = "1" host.CreateBy = neInfo.CreateBy hostId := r.neHostService.Insert(host) if hostId > 0 { - hostIDs = append(hostIDs, fmt.Sprint(hostId)) + hostIds = append(hostIds, fmt.Sprint(hostId)) } } - neInfo.HostIDs = strings.Join(hostIDs, ",") + neInfo.HostIds = strings.Join(hostIds, ",") } insertId := r.neInfoRepository.Insert(neInfo) if insertId > 0 { + neInfo.ID = insertId // 新增Version信息 neVersion := model.NeVersion{ - CoreUID: neInfo.CoreUID, - NeUID: neInfo.NeUID, - NeType: neInfo.NeType, + NeID: neInfo.ID, CreateBy: neInfo.CreateBy, } if v, ok := serverState["version"]; ok && v != nil { - // neVersion.Name = "-" - // neVersion.Path = "-" neVersion.Version = fmt.Sprint(v) } NewNeVersion.Insert(neVersion) - // 新增License信息 - neLicense := model.NeLicense{ - CoreUID: neInfo.CoreUID, - NeUID: neInfo.NeUID, - NeType: neInfo.NeType, - CreateBy: neInfo.CreateBy, - } + // 更新License信息 if v, ok := serverState["sn"]; ok && v != nil { - neLicense.SerialNum = fmt.Sprint(v) + neInfo.SerialNum = fmt.Sprint(v) } if v, ok := serverState["expire"]; ok && v != nil { - neLicense.ExpiryDate = fmt.Sprint(v) - neLicense.Status = "1" + neInfo.ExpiryDate = fmt.Sprint(v) } if v, ok := serverState["ueNumber"]; ok && v != nil { - neLicense.UeNumber = parse.Number(v) + neInfo.UeNumber = parse.Number(v) } if v, ok := serverState["nbNumber"]; ok && v != nil { - neLicense.NbNumber = parse.Number(v) + neInfo.NbNumber = parse.Number(v) } - NewNeLicense.Insert(neLicense) - - r.RefreshByCoreUidAndNeUid(neInfo.CoreUID, neInfo.NeUID) // 刷新缓存 + r.Update(neInfo) + // 刷新缓存 + r.ClearNeCacheByNeId(neInfo.ID) } return insertId } @@ -341,14 +361,14 @@ func (r NeInfo) Update(neInfo model.NeInfo) int64 { } // 主机信息更新 - if neInfo.HostIDs != "" && len(neInfo.Hosts) > 0 { - hostIDs := strings.Split(neInfo.HostIDs, ",") - for index, id := range hostIDs { + if neInfo.HostIds != "" && len(neInfo.Hosts) > 0 { + hostIds := strings.Split(neInfo.HostIds, ",") + for index, id := range hostIds { neInfo.Hosts[index].ID = parse.Number(id) } - uuid := generate.Code(4) for _, host := range neInfo.Hosts { if host.ID != 0 { + uuid := generate.Code(4) host.Title = fmt.Sprintf("%s_%d_%s", neInfo.NeType, host.Port, uuid) host.GroupID = "1" host.UpdateBy = neInfo.UpdateBy @@ -357,112 +377,90 @@ func (r NeInfo) Update(neInfo model.NeInfo) int64 { } } - num := r.neInfoRepository.Update(neInfo) - if num > 0 { + // 信息更新 + if v, ok := serverState["version"]; ok && v != nil { // 版本信息更新 - neVersion := NewNeVersion.FindByCoreUidAndNeUid(neInfo.CoreUID, neInfo.NeUID) - if neVersion.ID != 0 { - if neVersion.NeType != neInfo.NeType { - neVersion.NeType = neInfo.NeType - } - if v, ok := serverState["version"]; ok && v != neVersion.Version { - // neVersion.Name = "-" - // neVersion.Path = "-" - neVersion.Version = fmt.Sprint(v) - } + neVersion := NewNeVersion.FindById(neInfo.ID) + if neVersion.ID != 0 && neVersion.Version == fmt.Sprint(v) { + // neVersion.Name = "-" + // neVersion.Path = "-" + neVersion.Version = fmt.Sprint(v) neVersion.UpdateBy = neInfo.UpdateBy NewNeVersion.Update(neVersion) } + } + if v, ok := serverState["sn"]; ok && v != nil { + neInfo.SerialNum = fmt.Sprint(v) + } + if v, ok := serverState["expire"]; ok && v != nil { + neInfo.ExpiryDate = fmt.Sprint(v) + } + if v, ok := serverState["ueNumber"]; ok && v != nil { + neInfo.UeNumber = parse.Number(v) + } + if v, ok := serverState["nbNumber"]; ok && v != nil { + neInfo.NbNumber = parse.Number(v) + } - // License信息更新 - neLicense := NewNeLicense.FindByCoreUidAndNeUid(neInfo.CoreUID, neInfo.NeUID) - if neLicense.ID != 0 { - if neLicense.NeType != neInfo.NeType { - neLicense.NeType = neInfo.NeType - } - if v, ok := serverState["sn"]; ok && v != nil { - neLicense.SerialNum = fmt.Sprint(v) - } - if v, ok := serverState["expire"]; ok && v != nil { - neLicense.ExpiryDate = fmt.Sprint(v) - neLicense.Status = "1" - } - if v, ok := serverState["ueNumber"]; ok && v != nil { - neLicense.UeNumber = parse.Number(v) - } - if v, ok := serverState["nbNumber"]; ok && v != nil { - neLicense.NbNumber = parse.Number(v) - } - neLicense.UpdateBy = neInfo.UpdateBy - NewNeLicense.Update(neLicense) - } - - r.RefreshByCoreUidAndNeUid(neInfo.CoreUID, neInfo.NeUID) // 刷新缓存 + num := r.neInfoRepository.Update(neInfo) + if num > 0 { + // 刷新缓存 + r.RefreshNeCacheByNeId(neInfo.ID) } return num } // DeleteByIds 批量删除信息 -func (r NeInfo) DeleteByIds(ids []int64, coreUid, neUid string) (int64, error) { +func (r NeInfo) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 arr := r.neInfoRepository.SelectByIds(ids) if len(arr) != len(ids) { return 0, fmt.Errorf("not match id") } - for _, v := range arr { - if v.CoreUID != coreUid || v.NeUID != neUid { - return 0, fmt.Errorf("data not match, id: %d", v.ID) - } - } for _, v := range arr { // 主机信息删除 - if v.HostIDs != "" { + if v.HostIds != "" { hostIds := make([]int64, 0) - arr := strings.Split(v.HostIDs, ",") + arr := strings.Split(v.HostIds, ",") for _, hostId := range arr { hostIds = append(hostIds, parse.Number(hostId)) } r.neHostService.DeleteByIds(hostIds, false) } - // 删除License - neLicense := NewNeLicense.FindByCoreUidAndNeUid(v.CoreUID, v.NeUID) - if neLicense.CoreUID == v.CoreUID && neLicense.NeUID == v.NeUID { - NewNeLicense.DeleteByIds([]int64{neLicense.ID}) - } // 删除Version - neVersion := NewNeVersion.FindByCoreUidAndNeUid(v.CoreUID, v.NeUID) - if neVersion.CoreUID == v.CoreUID && neVersion.NeUID == v.NeUID { + neVersion := NewNeVersion.FindByNeId(v.ID) + if neVersion.ID != 0 { NewNeVersion.DeleteByIds([]int64{neVersion.ID}) } // 缓存信息删除 - redis.Del("", fmt.Sprintf("%s:%s:%s:%s", constants.CACHE_NE_INFO, v.CoreUID, v.NeType, v.NeUID)) + r.ClearNeCacheByNeId(v.ID) } rows := r.neInfoRepository.DeleteByIds(ids) return rows, nil } // NeRunSSHClient 网元主机的SSH客户端-为创建相关连接,注意结束后 Close() -func (r NeInfo) NeRunSSHClient(coreUid, neUid string) (*ssh.ConnSSH, error) { - neInfo := r.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { - logger.Errorf("NeRunSSHClient CoreUID:%s or NeUID:%s not found", coreUid, neUid) +func (r NeInfo) NeRunSSHClient(neId int64) (*ssh.ConnSSH, error) { + neInfo := r.FindByNeId(neId) + if neInfo.ID != neId { + logger.Errorf("NeRunSSHClient NeId:%d not found", neId) return nil, fmt.Errorf("neinfo not found") } // 取主机信息 - if neInfo.HostIDs == "" { - logger.Errorf("NeRunSSHClient CoreUID:%s or NeUID:%s hostId not found", coreUid, neUid) + if neInfo.HostIds == "" { + logger.Errorf("NeRunSSHClient NeId:%d hostId not found", neId) return nil, fmt.Errorf("neinfo hostId not found") } - hostIds := strings.Split(neInfo.HostIDs, ",") + hostIds := strings.Split(neInfo.HostIds, ",") if len(hostIds) <= 1 { - logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) + logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIds) return nil, fmt.Errorf("neinfo host id not found") } hostId := parse.Number(hostIds[0]) // 网元主机ssh 0:22 neHost := r.neHostService.FindById(hostId) if neHost.ID == 0 || neHost.ID != hostId { - logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) + logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIds) return nil, fmt.Errorf("neinfo host not found") } if neHost.HostType != "ssh" { @@ -487,8 +485,8 @@ func (r NeInfo) NeRunSSHClient(coreUid, neUid string) (*ssh.ConnSSH, error) { } // NeRunSSHCmd 网元主机的SSH客户端发送cmd命令 -func (r NeInfo) NeRunSSHCmd(coreUid, neUid string, cmdStr string) (string, error) { - sshClient, err := r.NeRunSSHClient(coreUid, neUid) +func (r NeInfo) NeRunSSHCmd(neId int64, cmdStr string) (string, error) { + sshClient, err := r.NeRunSSHClient(neId) if err != nil { return "", err } @@ -505,26 +503,26 @@ func (r NeInfo) NeRunSSHCmd(coreUid, neUid string, cmdStr string) (string, error // NeRunTelnetClient 网元主机的Telnet客户端-为创建相关连接,注意结束后 Close() // num 是网元主机telnet 1:4100 2:5200(UPF标准版) -func (r NeInfo) NeRunTelnetClient(coreUid, neUid string, num int) (*telnet.ConnTelnet, error) { - neInfo := r.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { - logger.Errorf("NeRunSSHClient CoreUID:%s or NeUID:%s not found", coreUid, neUid) +func (r NeInfo) NeRunTelnetClient(neId int64, num int) (*telnet.ConnTelnet, error) { + neInfo := r.FindByNeId(neId) + if neInfo.ID != neId { + logger.Errorf("NeRunSSHClient NeId:%d not found", neId) return nil, fmt.Errorf("neinfo not found") } // 取主机信息 - if neInfo.HostIDs == "" { - logger.Errorf("NeRunTelnetClient CoreUID:%s or NeUID:%s hostId not found", coreUid, neUid) + if neInfo.HostIds == "" { + logger.Errorf("NeRunSSHClient NeId:%d hostId not found", neId) return nil, fmt.Errorf("neinfo hostId not found") } - hostIds := strings.Split(neInfo.HostIDs, ",") + hostIds := strings.Split(neInfo.HostIds, ",") if len(hostIds) <= 1 { - logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIDs) + logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIds) return nil, fmt.Errorf("neinfo host id not found") } hostId := parse.Number(hostIds[num]) // 网元主机telnet 1:4100 2:5200 neHost := r.neHostService.FindById(hostId) if neHost.ID == 0 || neHost.ID != hostId { - logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIDs) + logger.Errorf("NeRunTelnetClient Hosts %s not found", neInfo.HostIds) return nil, fmt.Errorf("neinfo host not found") } @@ -541,26 +539,26 @@ func (r NeInfo) NeRunTelnetClient(coreUid, neUid string, num int) (*telnet.ConnT // NeRunRedisClient 网元主机的Redis客户端-为创建相关连接,注意结束后 Close() // 暂时只有UDM有Redis配置项 -func (r NeInfo) NeRunRedisClient(coreUid, neUid string) (*redis.ConnRedis, error) { - neInfo := r.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { - logger.Errorf("NeRunRedisClient CoreUid:%s NeUid:%s not found", coreUid, neUid) +func (r NeInfo) NeRunRedisClient(neId int64) (*redis.ConnRedis, error) { + neInfo := r.FindByNeId(neId) + if neInfo.ID != neId { + logger.Errorf("NeRunRedisClient NeId:%d not found", neId) return nil, fmt.Errorf("neinfo not found") } // 取主机信息 - if neInfo.HostIDs == "" { - logger.Errorf("NeRunRedisClient CoreUid:%s NeUid:%s hostId not found", coreUid, neUid) + if neInfo.HostIds == "" { + logger.Errorf("NeRunSSHClient NeId:%d hostId not found", neId) return nil, fmt.Errorf("neinfo hostId not found") } - hostIds := strings.Split(neInfo.HostIDs, ",") - if len(hostIds) <= 2 { - logger.Errorf("NeRunRedisClient hosts id %s not found", neInfo.HostIDs) + hostIds := strings.Split(neInfo.HostIds, ",") + if len(hostIds) <= 1 { + logger.Errorf("NeRunTelnetClient hosts id %s not found", neInfo.HostIds) return nil, fmt.Errorf("neinfo host id not found") } hostId := parse.Number(hostIds[2]) neHost := r.neHostService.FindById(hostId) if neHost.ID == 0 || neHost.ID != hostId { - logger.Errorf("NeRunRedisClient Hosts %s not found", neInfo.HostIDs) + logger.Errorf("NeRunRedisClient Hosts %s not found", neInfo.HostIds) return nil, fmt.Errorf("neinfo host not found") } @@ -575,14 +573,109 @@ func (r NeInfo) NeRunRedisClient(coreUid, neUid string) (*redis.ConnRedis, error return redisClient, nil } -// NeConfOAMReadSync 网元OAM配置文件读取 -func (r NeInfo) NeConfOAMReadSync(coreUid, neUid string) (map[string]any, error) { - neInfo := r.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { - logger.Errorf("NeRunRedisClient CoreUid:%s NeUid:%s not found", coreUid, neUid) - return nil, fmt.Errorf("neinfo not found") +// NeConfLicenseRead 读取授权文件信息 +// 返回激活申请码, 激活文件绝对地址 +func (r NeInfo) NeConfLicenseRead(neInfo model.NeInfo) (string, string) { + neTypeLower := strings.ToLower(neInfo.NeType) + // 网管本地路径 + omcPath := "/usr/local/omc/backup/ne_license" + if runtime.GOOS == "windows" { + omcPath = fmt.Sprintf("C:%s", omcPath) + } + omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neInfo.NeUid) + // 网元端授权文件路径 + nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower) + + // 网元主机的SSH客户端 + sshClient, err := r.NeRunSSHClient(neInfo.ID) + if err != nil { + return "", "" + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return "", "" + } + defer sftpClient.Close() + + // 复制授权申请码到本地 + if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil { + return "", "" + } + // 读取文件内容 + bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt") + if err != nil { + return "", "" } + // 复制激活文件到本地 + licensePath := "" + if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil { + licensePath = omcPath + "/system.ini" + } + + activationRequestCode := string(bytes) + parts := strings.Split(activationRequestCode, "\n") + if len(parts) > 1 && strings.HasPrefix(parts[0], "SN") { + activationRequestCode = parts[1] // 获取第二行内容 + } + return strings.TrimSpace(activationRequestCode), licensePath +} + +// NeConfLicenseUpload 授权文件上传到网元主机 +func (r NeInfo) NeConfLicenseUpload(neInfo model.NeInfo, reload bool) error { + // 检查文件是否存在 + omcLicensePath := file.ParseUploadFileAbsPath(neInfo.LicensePath) + if _, err := os.Stat(omcLicensePath); err != nil { + return fmt.Errorf("file read failure") + } + + // 网元主机的SSH客户端 + sshClient, err := NewNeInfo.NeRunSSHClient(neInfo.ID) + if err != nil { + return err + } + defer sshClient.Close() + // 网元主机的SSH客户端进行文件传输 + sftpClient, err := sshClient.NewClientSFTP() + if err != nil { + return err + } + defer sftpClient.Close() + + // 网元端授权文件路径 + neTypeLower := strings.ToLower(neInfo.NeType) + neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower) + neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath)) + // 修改网元文件权限 + sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath)) + + // 尝试备份授权文件 + neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405")) + sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack)) + + // 上传授权文件去覆盖 + if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil { + return fmt.Errorf("please check if scp remote copy is allowed") + } + + // 重启服务 + if reload { + cmdStr := fmt.Sprintf("sudo systemctl restart %s", neTypeLower) + switch neTypeLower { + case "ims": + cmdStr = "ims-stop || true && ims-start" + case "omc": + cmdStr = "sudo systemctl restart omc" + } + sshClient.RunCMD(cmdStr) + } + return nil +} + +// NeConfOAMReadSync 网元OAM配置文件读取 +func (r NeInfo) NeConfOAMReadSync(neInfo model.NeInfo) (map[string]any, error) { oamData, err := r.neConfOAMRead(neInfo, true) if err != nil { return nil, err @@ -693,7 +786,7 @@ func (r NeInfo) neConfOAMRead(neInfo model.NeInfo, sync bool) (map[string]any, e neTypeLower := strings.ToLower(neInfo.NeType) fileName := "oam_manager.yaml" // 网管本地路径 - localFilePath := fmt.Sprintf("/usr/local/omc/backup/ne_config/%s/%s/%s", neTypeLower, neInfo.NeUID, fileName) + localFilePath := fmt.Sprintf("/usr/local/omc/backup/ne_config/%s/%d/%s", neTypeLower, neInfo.ID, fileName) if runtime.GOOS == "windows" { localFilePath = fmt.Sprintf("C:%s", localFilePath) } @@ -701,7 +794,7 @@ func (r NeInfo) neConfOAMRead(neInfo model.NeInfo, sync bool) (map[string]any, e // 从网元端同步到本地 if sync { // 网元主机的SSH客户端 - sshClient, err := r.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := r.NeRunSSHClient(neInfo.ID) if err != nil { return nil, fmt.Errorf("ne info ssh client err") } @@ -752,7 +845,7 @@ func (r NeInfo) neConfOAMWirte(neInfo model.NeInfo, content any, sync bool) erro if runtime.GOOS == "windows" { omcPath = fmt.Sprintf("C:%s", omcPath) } - localFilePath := fmt.Sprintf("%s/%s/%s/%s", omcPath, neTypeLower, neInfo.NeUID, fileName) + localFilePath := fmt.Sprintf("%s/%s/%d/%s", omcPath, neTypeLower, neInfo.ID, fileName) // 写入文件 if err := parse.ConvertConfigToFile("yaml", localFilePath, content); err != nil { @@ -762,7 +855,7 @@ func (r NeInfo) neConfOAMWirte(neInfo model.NeInfo, content any, sync bool) erro // 同步到网元端 if sync { // 网元主机的SSH客户端 - sshClient, err := r.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := r.NeRunSSHClient(neInfo.ID) if err != nil { return err } @@ -801,13 +894,13 @@ func (r NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, httpManageCfg = neConfOAMData["httpManageCfg"].(map[string]any) } httpManageCfg["port"] = neInfo.Port - if strings.Contains(neInfo.IPAddr, ":") { + if strings.Contains(neInfo.IpAddr, ":") { httpManageCfg["ipType"] = "ipv6" - httpManageCfg["ipv6"] = neInfo.IPAddr + httpManageCfg["ipv6"] = neInfo.IpAddr } - if strings.Contains(neInfo.IPAddr, ".") { + if strings.Contains(neInfo.IpAddr, ".") { httpManageCfg["ipType"] = "ipv4" - httpManageCfg["ipv4"] = neInfo.IPAddr + httpManageCfg["ipv4"] = neInfo.IpAddr } delete(httpManageCfg, "iptype") delete(oamData, "httpmanagecfg") @@ -821,8 +914,7 @@ func (r NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, } delete(oamConfig, "neconfig") oamConfig["neConfig"] = map[string]string{ - "coreId": neInfo.CoreUID, - "neUid": neInfo.NeUID, + "rmUid": neInfo.NeUid, "neName": neInfo.NeName, "dn": neInfo.Dn, "vendorName": neInfo.VendorName, @@ -868,13 +960,13 @@ func (r NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, neConfOAMData := r.neConfOAMData() snmpConfig = neConfOAMData["snmpConfig"].(map[string]any) } - if strings.Contains(neInfo.IPAddr, ":") { + if strings.Contains(neInfo.IpAddr, ":") { snmpConfig["ipType"] = "ipv6" - snmpConfig["ipv6"] = neInfo.IPAddr + snmpConfig["ipv6"] = neInfo.IpAddr } - if strings.Contains(neInfo.IPAddr, ".") { + if strings.Contains(neInfo.IpAddr, ".") { snmpConfig["ipType"] = "ipv4" - snmpConfig["ipv4"] = neInfo.IPAddr + snmpConfig["ipv4"] = neInfo.IpAddr } delete(snmpConfig, "iptype") if snmpEnable, ok := content["snmpEnable"]; ok && snmpEnable != nil { @@ -936,7 +1028,7 @@ func (r NeInfo) NeConfPara5GRead() (map[string]any, error) { return mapData, nil } -// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元端NeType@NeId +// NeConfPara5GWirte 网元公共配置文件写入 content内容 syncNE同步到网元列表neUid func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) error { // 网管本地路径 omcFilePath := "/usr/local/etc/omc/para5G.yaml" @@ -951,19 +1043,23 @@ func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) erro // 同步到网元端 if len(syncNE) > 0 { errMsg := []string{} - for _, neTI := range syncNE { - ti := strings.SplitN(neTI, "@", 2) + for _, neUid := range syncNE { + neInfo := r.FindByNeUid(neUid) + if neInfo.NeUid != neUid { + errMsg = append(errMsg, fmt.Sprintf("neinfo %s : not found", neUid)) + continue + } // 网元主机的SSH客户端 - sshClient, err := r.NeRunSSHClient(ti[0], ti[1]) + sshClient, err := r.NeRunSSHClient(neInfo.ID) if err != nil { - errMsg = append(errMsg, fmt.Sprintf("core_ne %s : %s", ti, err.Error())) + errMsg = append(errMsg, fmt.Sprintf("neinfo %s : %s", neInfo.NeUid, err.Error())) continue } defer sshClient.Close() // 网元主机的SSH客户端进行文件传输 sftpClient, err := sshClient.NewClientSFTP() if err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : %s", ti, err.Error())) + errMsg = append(errMsg, fmt.Sprintf("neinfo %s : %s", neInfo.NeUid, err.Error())) continue } defer sftpClient.Close() @@ -975,7 +1071,7 @@ func (r *NeInfo) NeConfPara5GWirte(content map[string]any, syncNE []string) erro sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neFileDir, neFileDir, neFilePath, neFilePath)) // 复制到网元进行覆盖 if err = sftpClient.CopyFileLocalToRemote(omcFilePath, neFilePath); err != nil { - errMsg = append(errMsg, fmt.Sprintf("%s : please check if scp remote copy is allowed", ti)) + errMsg = append(errMsg, fmt.Sprintf("neinfo %s : please check if scp remote copy is allowed", neInfo.NeUid)) continue } } diff --git a/src/modules/ne/service/ne_license.go b/src/modules/ne/service/ne_license.go deleted file mode 100644 index c6eb557e..00000000 --- a/src/modules/ne/service/ne_license.go +++ /dev/null @@ -1,185 +0,0 @@ -package service - -import ( - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - "time" - - "be.ems/src/framework/utils/file" - "be.ems/src/modules/ne/model" - "be.ems/src/modules/ne/repository" -) - -// 实例化服务层 NeLicense 结构体 -var NewNeLicense = &NeLicense{ - neLicenseRepository: repository.NewNeLicense, -} - -// NeLicense 网元授权激活信息 服务层处理 -type NeLicense struct { - neLicenseRepository *repository.NeLicense // 网元授权激活信息表 -} - -// FindByPage 分页查询列表数据 -func (r *NeLicense) FindByPage(query map[string]string) ([]model.NeLicense, int64) { - return r.neLicenseRepository.SelectByPage(query) -} - -// Find 查询列表 -func (r *NeLicense) Find(neLicense model.NeLicense) []model.NeLicense { - return r.neLicenseRepository.Select(neLicense) -} - -// FindById 通过ID查询 -func (r *NeLicense) FindById(id int64) model.NeLicense { - if id <= 0 { - return model.NeLicense{} - } - neLicenses := r.neLicenseRepository.SelectByIds([]int64{id}) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// Insert 新增信息 -func (r *NeLicense) Insert(neLicense model.NeLicense) int64 { - return r.neLicenseRepository.Insert(neLicense) -} - -// Update 修改信息 -func (r *NeLicense) Update(neLicense model.NeLicense) int64 { - return r.neLicenseRepository.Update(neLicense) -} - -// DeleteByIds 批量删除信息 -func (r *NeLicense) DeleteByIds(ids []int64) (int64, error) { - // 检查是否存在 - rowIds := r.neLicenseRepository.SelectByIds(ids) - if len(rowIds) <= 0 { - return 0, fmt.Errorf("neLicense.noData") - } - - if len(rowIds) == len(ids) { - rows := r.neLicenseRepository.DeleteByIds(ids) - return rows, nil - } - // 删除信息失败! - return 0, fmt.Errorf("delete fail") -} - -// FindByCoreUidAndNeUid 通过核心网和网元唯一标识查询 -func (r *NeLicense) FindByCoreUidAndNeUid(coreUid, neUid string) model.NeLicense { - neLicenses := r.neLicenseRepository.Select(model.NeLicense{ - CoreUID: coreUid, - NeUID: neUid, - }) - if len(neLicenses) > 0 { - return neLicenses[0] - } - return model.NeLicense{} -} - -// ReadLicenseInfo 读取授权文件信息 -// 返回激活申请码, 激活文件 -func (r *NeLicense) ReadLicenseInfo(neLicense model.NeLicense) (string, string) { - neTypeLower := strings.ToLower(neLicense.NeType) - // 网管本地路径 - omcPath := "/usr/local/omc/backup/ne_license" - if runtime.GOOS == "windows" { - omcPath = fmt.Sprintf("C:%s", omcPath) - } - omcPath = fmt.Sprintf("%s/%s/%s", omcPath, neTypeLower, neLicense.NeUID) - // 网元端授权文件路径 - nePath := fmt.Sprintf("/usr/local/etc/%s/license", neTypeLower) - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.CoreUID, neLicense.NeUID) - if err != nil { - return "", "" - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return "", "" - } - defer sftpClient.Close() - - // 复制授权申请码到本地 - if err = sftpClient.CopyFileRemoteToLocal(nePath+"/Activation_request_code.txt", omcPath+"/Activation_request_code.txt"); err != nil { - return "", "" - } - // 读取文件内容 - bytes, err := os.ReadFile(omcPath + "/Activation_request_code.txt") - if err != nil { - return "", "" - } - - // 复制激活文件到本地 - licensePath := "" - if err = sftpClient.CopyFileRemoteToLocal(nePath+"/system.ini", omcPath+"/system.ini"); err == nil { - licensePath = omcPath + "/system.ini" - } - - activationRequestCode := string(bytes) - parts := strings.Split(activationRequestCode, "\n") - if len(parts) > 1 && strings.HasPrefix(parts[0], "SN") { - activationRequestCode = parts[1] // 获取第二行内容 - } - return strings.TrimSpace(activationRequestCode), licensePath -} - -// UploadLicense 授权文件上传到网元主机 -func (r *NeLicense) UploadLicense(neLicense model.NeLicense) error { - // 检查文件是否存在 - omcLicensePath := file.ParseUploadFileAbsPath(neLicense.LicensePath) - if _, err := os.Stat(omcLicensePath); err != nil { - return fmt.Errorf("file read failure") - } - - // 网元主机的SSH客户端 - sshClient, err := NewNeInfo.NeRunSSHClient(neLicense.CoreUID, neLicense.NeUID) - if err != nil { - return err - } - defer sshClient.Close() - // 网元主机的SSH客户端进行文件传输 - sftpClient, err := sshClient.NewClientSFTP() - if err != nil { - return err - } - defer sftpClient.Close() - - // 网元端授权文件路径 - neTypeLower := strings.ToLower(neLicense.NeType) - neLicensePath := fmt.Sprintf("/usr/local/etc/%s/license/system.ini", neTypeLower) - neLicenseDir := filepath.ToSlash(filepath.Dir(neLicensePath)) - // 修改网元文件权限 - sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 775 %s && sudo touch %s && sudo chmod o+rw %s", neLicenseDir, neLicenseDir, neLicensePath, neLicensePath)) - - // 尝试备份授权文件 - neLicensePathBack := fmt.Sprintf("%s/system_%s.ini", neLicensePath, time.Now().Format("20060102_150405")) - sshClient.RunCMD(fmt.Sprintf("sudo cp -rf %s/system.ini %s", neLicensePath, neLicensePathBack)) - - // 上传授权文件去覆盖 - if err := sftpClient.CopyFileLocalToRemote(omcLicensePath, neLicensePath); err != nil { - return fmt.Errorf("please check if scp remote copy is allowed") - } - - // 重启服务 - if neLicense.Reload { - cmdStr := fmt.Sprintf("sudo systemctl restart %s", neTypeLower) - switch neTypeLower { - case "ims": - cmdStr = "ims-stop || true && ims-start" - case "omc": - cmdStr = "sudo systemctl restart omc" - } - sshClient.RunCMD(cmdStr) - } - return nil -} diff --git a/src/modules/ne/service/ne_software.go b/src/modules/ne/service/ne_software.go index 4e4ef39c..c10c7d87 100644 --- a/src/modules/ne/service/ne_software.go +++ b/src/modules/ne/service/ne_software.go @@ -48,7 +48,7 @@ func (r NeSoftware) Insert(neSoftware model.NeSoftware) int64 { inserId := r.neSoftwareRepository.Insert(neSoftware) if inserId > 0 { // 更新同类型的新包版本 - neVersions := r.neVersionService.Find(model.NeVersion{NeType: neSoftware.NeType}, false) + neVersions := r.neVersionService.FindByNeType(neSoftware.NeType) if len(neVersions) > 0 { for _, neVersion := range neVersions { neVersion.NewName = neSoftware.Name @@ -68,12 +68,12 @@ func (r NeSoftware) Update(neSoftware model.NeSoftware) int64 { rows := r.neSoftwareRepository.Update(neSoftware) if rows > 0 { // 更新同类型的新包版本 - neVersions := r.neVersionService.Find(model.NeVersion{ - NeType: neSoftware.NeType, - Status: "3", - }, false) + neVersions := r.neVersionService.FindByNeType(neSoftware.NeType) if len(neVersions) > 0 { for _, neVersion := range neVersions { + if neVersion.Status != "3" { + continue + } neVersion.NewName = neSoftware.Name neVersion.NewVersion = neSoftware.Version neVersion.NewPath = neSoftware.Path @@ -127,18 +127,18 @@ func (r NeSoftware) CheckUniqueTypeAndNameAndVersion(neType, name, version strin return uniqueId == 0 } -// UpdateVersions 更新软件包对应网元的新版本 -func (r NeSoftware) UpdateVersions(neSoftware model.NeSoftware, neVersion model.NeVersion) int64 { +// UpdateVersion 更新软件包对应网元的新版本 +func (r NeSoftware) UpdateVersion(neSoftware model.NeSoftware) int64 { var rows int64 = 0 // 更新同类型的新包版本 - neVersions := r.neVersionService.Find(neVersion, false) + neVersions := r.neVersionService.FindByNeType(neSoftware.NeType) if len(neVersions) > 0 { for _, v := range neVersions { v.NewName = neSoftware.Name v.NewVersion = neSoftware.Version v.NewPath = neSoftware.Path v.Status = "3" - v.UpdateBy = neVersion.UpdateBy + v.UpdateBy = neSoftware.UpdateBy rows += r.neVersionService.Update(v) } } diff --git a/src/modules/ne/service/ne_version.go b/src/modules/ne/service/ne_version.go index 1e5aa515..bb840a8c 100644 --- a/src/modules/ne/service/ne_version.go +++ b/src/modules/ne/service/ne_version.go @@ -55,8 +55,8 @@ func (r NeVersion) checkNeVersion(arr *[]model.NeVersion) { for i := range *arr { item := (*arr)[i] // 查询网元获取IP - neInfo := r.neInfoService.FindByCoreUidAndNeUid(item.CoreUID, item.NeUID) - if neInfo.CoreUID != item.CoreUID || neInfo.NeUID != item.NeUID { + neInfo := r.neInfoService.FindById(item.NeID, false) + if neInfo.ID != item.NeID { continue } result, err := neFetchlink.NeState(neInfo) @@ -72,9 +72,6 @@ func (r NeVersion) checkNeVersion(arr *[]model.NeVersion) { // item.Path = "-" item.Version = ver } - if item.NeType != neInfo.NeType { - item.NeType = neInfo.NeType - } r.Update(item) (*arr)[i] = item } @@ -118,11 +115,10 @@ func (r NeVersion) DeleteByIds(ids []int64) (int64, error) { return 0, fmt.Errorf("delete fail") } -// FindByCoreUidAndNeUid 通过核心网和网元唯一标识查询 -func (r NeVersion) FindByCoreUidAndNeUid(coreUid, neUid string) model.NeVersion { +// FindByNeId 通过网元ID查询 +func (r NeVersion) FindByNeId(neId int64) model.NeVersion { neVersions := r.neVersionRepository.Select(model.NeVersion{ - CoreUID: coreUid, - NeUID: neUid, + NeID: neId, }) if len(neVersions) > 0 { return neVersions[0] @@ -130,12 +126,45 @@ func (r NeVersion) FindByCoreUidAndNeUid(coreUid, neUid string) model.NeVersion return model.NeVersion{} } +// FindByNeUid 通过网元类型查询 +func (r NeVersion) FindByNeUid(neUid string) model.NeVersion { + neInfo := r.neInfoService.FindByNeUid(neUid) + if neInfo.ID <= 0 { + return model.NeVersion{} + } + neVersion := r.FindByNeId(neInfo.ID) + if neVersion.ID > 0 { + return neVersion + } + return model.NeVersion{} +} + +// FindByNeType 通过网元类型查询 +func (r NeVersion) FindByNeType(neType string) []model.NeVersion { + neVersions := make([]model.NeVersion, 0) + neInfos := r.neInfoService.FindByNeType(neType) + if len(neInfos) <= 0 { + return neVersions + } + for _, neInfo := range neInfos { + neVersion := r.FindByNeId(neInfo.ID) + if neVersion.ID > 0 { + neVersions = append(neVersions, neVersion) + } + } + return neVersions +} + // Operate 操作版本上传到网元主机执行命令 // // action 安装行为:install upgrade rollback func (r NeVersion) Operate(action string, neVersion model.NeVersion, preinput map[string]string) (string, error) { + neInfo := r.neInfoService.FindByNeId(neVersion.NeID) + if neInfo.ID != neVersion.NeID { + return "", fmt.Errorf("neinfo not found") + } // 网元主机的SSH客户端 - sshClient, err := r.neInfoService.NeRunSSHClient(neVersion.CoreUID, neVersion.NeUID) + sshClient, err := r.neInfoService.NeRunSSHClient(neVersion.NeID) if err != nil { return "", err } @@ -161,19 +190,19 @@ func (r NeVersion) Operate(action string, neVersion model.NeVersion, preinput ma if para5GMap == nil || err != nil { return "", fmt.Errorf("error read para5G file info") } - if err := r.neInfoService.NeConfPara5GWirte(para5GMap, []string{fmt.Sprintf("%s@%s", neVersion.CoreUID, neVersion.NeUID)}); err != nil { + if err := r.neInfoService.NeConfPara5GWirte(para5GMap, []string{neInfo.NeUid}); err != nil { return "", fmt.Errorf("error wirte para5G file info") } } // ========= 命令生成阶段 ========= - okFlagStr, cmdStrArr, err := r.operateCommand(action, neVersion.NeType, neFilePaths) + okFlagStr, cmdStrArr, err := r.operateCommand(action, neInfo.NeType, neFilePaths) if err != nil { return "", err } // ========= 执行阶段 ========= - commandLine, err := r.operateRun(sshClient, preinput, cmdStrArr, neVersion.NeType, okFlagStr) + commandLine, err := r.operateRun(sshClient, preinput, cmdStrArr, neInfo.NeType, okFlagStr) if err != nil { return "", err } @@ -693,8 +722,8 @@ func (r NeVersion) operateRun(sshClient *ssh.ConnSSH, preinput map[string]string func (r NeVersion) operateDome(action string, neVersion model.NeVersion) error { if action == "install" { // 网元信息 - neInfo := r.neInfoService.FindByCoreUidAndNeUid(neVersion.CoreUID, neVersion.NeUID) - if neInfo.CoreUID != neVersion.CoreUID || neInfo.NeUID != neVersion.NeUID { + neInfo := r.neInfoService.FindByNeId(neVersion.NeID) + if neInfo.ID != neVersion.NeID { return fmt.Errorf("error found neinfo") } @@ -714,31 +743,31 @@ func (r NeVersion) operateDome(action string, neVersion model.NeVersion) error { smsHost := fmt.Sprintf("sudo sed -i '/^%s smsc.*smsc$/c\\' /etc/hosts", para5GData["SIP_IP"]) // IMS 配置 - imsNEs := r.neInfoService.Find(model.NeInfo{NeType: "IMS"}, false, false) + imsNEs := r.neInfoService.FindByNeType("IMS") for _, v := range imsNEs { - r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscIPCMD) - r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscHostCMD) - r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smsHost) - r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, "sudo sed -i '/^#!define WITH_SMS/ s/^/#/' /usr/local/etc/ims/vars.cfg") - r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, "ims-stop || true && ims-start") + r.neInfoService.NeRunSSHCmd(v.ID, smscIPCMD) + r.neInfoService.NeRunSSHCmd(v.ID, smscHostCMD) + r.neInfoService.NeRunSSHCmd(v.ID, smsHost) + r.neInfoService.NeRunSSHCmd(v.ID, "sudo sed -i '/^#!define WITH_SMS/ s/^/#/' /usr/local/etc/ims/vars.cfg") + r.neInfoService.NeRunSSHCmd(v.ID, "ims-stop || true && ims-start") } // UDM 配置 smscASName := fmt.Sprintf("sudo sed -i \"/- name: 'sms_as'/{n;s|serverName: .*|serverName: 'sip:%s:5060'|}\" /usr/local/etc/udm/as.yaml", para5GData["SMSC_IP"]) smscASAddress := fmt.Sprintf("sudo sed -i \"/- name: 'sms_as'/{n;n;n;s|diameterAddress: .*|diameterAddress: 'smsc.ims.%s.3gppnetwork.org'|}\" /usr/local/etc/udm/as.yaml", mnc_mcc) - udmNEs := r.neInfoService.Find(model.NeInfo{NeType: "UDM"}, false, false) + udmNEs := r.neInfoService.FindByNeType("UDM") for _, v := range udmNEs { - r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscIPCMD) - r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscHostCMD) - r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscASName) - r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, smscASAddress) - r.neInfoService.NeRunSSHCmd(v.CoreUID, v.NeUID, "sudo service udm restart") + r.neInfoService.NeRunSSHCmd(v.ID, smscIPCMD) + r.neInfoService.NeRunSSHCmd(v.ID, smscHostCMD) + r.neInfoService.NeRunSSHCmd(v.ID, smscASName) + r.neInfoService.NeRunSSHCmd(v.ID, smscASAddress) + r.neInfoService.NeRunSSHCmd(v.ID, "sudo service udm restart") } } } // 更新Version - verInfo := r.FindByCoreUidAndNeUid(neVersion.CoreUID, neVersion.NeUID) - if verInfo.CoreUID == neVersion.CoreUID && verInfo.NeUID == neVersion.NeUID { + verInfo := r.FindById(neVersion.NeID) + if verInfo.NeID == neVersion.NeID { curName := verInfo.Name curVersion := verInfo.Version curPath := verInfo.Path diff --git a/src/modules/ne_data/controller/alarm.go b/src/modules/ne_data/controller/alarm.go index 77651c88..34c8659a 100644 --- a/src/modules/ne_data/controller/alarm.go +++ b/src/modules/ne_data/controller/alarm.go @@ -61,6 +61,17 @@ func (s AlarmController) List(c *gin.Context) { c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } + + if query.NeUID != "" { + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { + c.JSON(200, resp.ErrMsg("neInfo not found")) + return + } + query.NeID = neInfo.ID + } + // 查询数据 rows, total := s.alarmService.FindByPage(query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) @@ -99,8 +110,7 @@ func (s AlarmController) Remove(c *gin.Context) { // PUT /clear func (s AlarmController) Clear(c *gin.Context) { var body struct { - CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识 - Id int64 `json:"id" binding:"required"` + ID string `form:"id" json:"id" binding:"required"` // 记录ID 批量多个逗号分隔 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -108,10 +118,17 @@ func (s AlarmController) Clear(c *gin.Context) { return } + // 处理字符转id数组后去重 + uniqueIDs := parse.RemoveDuplicatesToArray(body.ID, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) + } + clearUser := reqctx.LoginUserToUserName(c) - rows, err := s.alarmService.ClearById( - body.Id, - body.CoreUID, + rows, err := s.alarmService.ClearByIds( + ids, clearUser, constants.ALARM_CLEAR_TYPE_MANUAL_CLEAR, ) @@ -127,9 +144,7 @@ func (s AlarmController) Clear(c *gin.Context) { // PUT /ack func (s AlarmController) Ack(c *gin.Context) { var body struct { - CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识 - Id int64 `json:"id" binding:"required"` - AckState bool `json:"ackState" binding:"omitempty"` + ID string `form:"id" json:"id" binding:"required"` // 记录ID 批量多个逗号分隔 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -137,10 +152,17 @@ func (s AlarmController) Ack(c *gin.Context) { return } + // 处理字符转id数组后去重 + uniqueIDs := parse.RemoveDuplicatesToArray(body.ID, ",") + // 转换成int64数组类型 + ids := make([]int64, 0) + for _, v := range uniqueIDs { + ids = append(ids, parse.Number(v)) + } + ackUser := reqctx.LoginUserToUserName(c) - rows, err := s.alarmService.AckById( - body.Id, - body.CoreUID, + rows, err := s.alarmService.AckByIds( + ids, ackUser, constants.ALARM_ACK_STATE_ACK, ) @@ -156,7 +178,6 @@ func (s AlarmController) Ack(c *gin.Context) { // GET /count/severity func (s AlarmController) CountSeverity(c *gin.Context) { var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态 } if err := c.ShouldBindQuery(&query); err != nil { @@ -165,7 +186,7 @@ func (s AlarmController) CountSeverity(c *gin.Context) { return } - data := s.alarmService.CountSeverity(query.CoreUID, query.AlarmStatus) + data := s.alarmService.CountSeverity(query.AlarmStatus) c.JSON(200, resp.OkData(data)) } @@ -174,7 +195,6 @@ func (s AlarmController) CountSeverity(c *gin.Context) { // GET /count/type func (s AlarmController) CountType(c *gin.Context) { var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态 } if err := c.ShouldBindQuery(&query); err != nil { @@ -183,7 +203,7 @@ func (s AlarmController) CountType(c *gin.Context) { return } - data := s.alarmService.CountType(query.CoreUID, query.AlarmStatus) + data := s.alarmService.CountType(query.AlarmStatus) c.JSON(200, resp.OkData(data)) } @@ -192,7 +212,6 @@ func (s AlarmController) CountType(c *gin.Context) { // GET /count/top func (s AlarmController) CountTop(c *gin.Context) { var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"required,oneof=Clear Active"` // 告警状态 Top int `json:"top" form:"top" binding:"required"` // 前几 } @@ -202,7 +221,7 @@ func (s AlarmController) CountTop(c *gin.Context) { return } - data := s.alarmService.CountNe(query.CoreUID, query.AlarmStatus, query.Top) + data := s.alarmService.CountNe(query.AlarmStatus, query.Top) c.JSON(200, resp.OkData(data)) } @@ -239,10 +258,17 @@ func (s AlarmController) Export(c *gin.Context) { c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } - // 限制导出数据集 - if query.PageSize > 10000 { - query.PageSize = 10000 + + if query.NeUID != "" { + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { + c.JSON(200, resp.ErrMsg("neInfo not found")) + return + } + query.NeID = neInfo.ID } + // 查询数据 rows, total := s.alarmService.FindByPage(query) if total == 0 { diff --git a/src/modules/ne_data/controller/backup.go b/src/modules/ne_data/controller/backup.go index aa144eb9..5850e775 100644 --- a/src/modules/ne_data/controller/backup.go +++ b/src/modules/ne_data/controller/backup.go @@ -66,9 +66,9 @@ func (s BackupController) FTPInfo(c *gin.Context) { // POST /ftp func (s BackupController) FTPPush(c *gin.Context) { var body struct { - Path string `form:"path" binding:"required"` // 路径必须是 BACKUP_DIR 开头的路径 - Filename string `form:"fileName" binding:"required"` - Tag string `form:"tag" binding:"required"` // 标签,用于区分不同的备份文件 + Path string `json:"path" binding:"required"` // 路径必须是 BACKUP_DIR 开头的路径 + Filename string `json:"fileName" binding:"required"` + Tag string `json:"tag" binding:"required"` // 标签,用于区分不同的备份文件 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) diff --git a/src/modules/ne_data/controller/kpi.go b/src/modules/ne_data/controller/kpi.go index dedb5782..a4bd184a 100644 --- a/src/modules/ne_data/controller/kpi.go +++ b/src/modules/ne_data/controller/kpi.go @@ -47,22 +47,22 @@ type KPIController struct { // @Router /ne/data/kpi/data [get] func (s KPIController) KPIData(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys model.KPIQuery - if err := c.ShouldBindQuery(&querys); err != nil { + var query model.KPIQuery + if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID) - if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 查询数据 - kpiData := s.kpiReportService.FindData(querys) + kpiData := s.kpiReportService.FindData(neInfo.NeType, neInfo.ID, query) c.JSON(200, resp.OkData(kpiData)) } diff --git a/src/modules/ne_data/controller/kpi_c.go b/src/modules/ne_data/controller/kpi_c.go index 702c0886..6b8048a2 100644 --- a/src/modules/ne_data/controller/kpi_c.go +++ b/src/modules/ne_data/controller/kpi_c.go @@ -49,22 +49,22 @@ type KPICController struct { // @Router /ne/data/kpic/data [get] func (s KPICController) KPIData(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys model.KPICQuery - if err := c.ShouldBindQuery(&querys); err != nil { + var query model.KPICQuery + if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID) - if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 查询数据 - kpiData := s.kpicReportService.FindData(querys) + kpiData := s.kpicReportService.FindData(neInfo.NeType, neInfo.ID, query) c.JSON(200, resp.OkData(kpiData)) } diff --git a/src/modules/ne_data/controller/nb_state.go b/src/modules/ne_data/controller/nb_state.go index 6ee9fec9..7894f974 100644 --- a/src/modules/ne_data/controller/nb_state.go +++ b/src/modules/ne_data/controller/nb_state.go @@ -49,7 +49,6 @@ type NBStateController struct { // @Description Base Station Status List // @Router /nb-state/list [get] func (s NBStateController) List(c *gin.Context) { - language := reqctx.AcceptLanguage(c) var query model.NBStateQuery if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -57,12 +56,13 @@ func (s NBStateController) List(c *gin.Context) { return } - // 查询网元信息 rmUID - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { - c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { + c.JSON(200, resp.ErrMsg("neInfo not found")) return } + query.NeID = neInfo.ID // 查询数据 rows, total := s.nbStateService.FindByPage(query) @@ -85,24 +85,23 @@ func (s NBStateController) List(c *gin.Context) { func (s NBStateController) Export(c *gin.Context) { language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 - var querys model.NBStateQuery - if err := c.ShouldBindBodyWithJSON(&querys); err != nil { + var query model.NBStateQuery + if err := c.ShouldBindBodyWithJSON(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } - // 限制导出数据集 - if querys.PageSize > 10000 { - querys.PageSize = 10000 - } - // 查询网元信息 rmUID - neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID) - if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID { - c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { + c.JSON(200, resp.ErrMsg("neInfo not found")) return } + query.NeID = neInfo.ID - rows, total := s.nbStateService.FindByPage(querys) + // 查询数据 + rows, total := s.nbStateService.FindByPage(query) if total == 0 { // 导出数据记录为空 c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) diff --git a/src/modules/ne_data/controller/ne_state.go b/src/modules/ne_data/controller/ne_state.go index a572ba53..07abae94 100644 --- a/src/modules/ne_data/controller/ne_state.go +++ b/src/modules/ne_data/controller/ne_state.go @@ -46,13 +46,21 @@ type NEStateController struct { // @Description NE Status Record - Memory/CPU/Disk List // @Router /ne-state/list [get] func (s NEStateController) List(c *gin.Context) { - var query model.NEStateQuery + var query model.NeStateQuery if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } + // 查询网元获取IP + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { + c.JSON(200, resp.ErrMsg("neInfo not found")) + return + } + query.NeID = neInfo.ID + // 查询数据 rows, total := s.neStateService.FindByPage(query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) diff --git a/src/modules/ne_data/model/alarm.go b/src/modules/ne_data/model/alarm.go index 822aab93..76c51c0e 100644 --- a/src/modules/ne_data/model/alarm.go +++ b/src/modules/ne_data/model/alarm.go @@ -3,14 +3,13 @@ package model // Alarm 告警记录 type Alarm struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 - AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增 + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间 + AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 同网元类型连续递增 AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题 AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码 - EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 + EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 产生时间 AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 PerceivedSeverity string `json:"perceivedSeverity" gorm:"column:perceived_severity"` // 告警级别 @@ -28,7 +27,12 @@ type Alarm struct { ClearType string `json:"clearType" gorm:"column:clear_type"` // 清除状态 ClearTime int64 `json:"clearTime" gorm:"column:clear_time"` // 清除时间 ClearUser string `json:"clearUser" gorm:"column:clear_user"` // 清除用户 - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 + + // ====== 非数据库字段属性 ====== + + NeUid string `json:"neUid,omitempty" gorm:"->"` // 网元唯一标识 + NeName string `json:"neName,omitempty" gorm:"->"` // 网元名称 + NeType string `json:"neType,omitempty" gorm:"->"` // 网元类型 } // TableName 表名称 @@ -38,17 +42,16 @@ func (*Alarm) TableName() string { // AlarmQuery 告警数据查询参数结构体 type AlarmQuery struct { - CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识 - NeType string `json:"neType" form:"neType"` // 网元类型 + NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识 + NeID int64 `json:"neId" form:"neId"` // 网元ID AlarmCode string `json:"alarmCode" form:"alarmCode"` AlarmType string `json:"alarmType" form:"alarmType"` AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=Clear Active"` // 告警状态 OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型 - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查created_time EndTime int64 `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc + SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=createdTime id"` // 排序字段,填写结果字段 + SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` } diff --git a/src/modules/ne_data/model/alarm_event.go b/src/modules/ne_data/model/alarm_event.go index 61657cd7..eaafea4b 100644 --- a/src/modules/ne_data/model/alarm_event.go +++ b/src/modules/ne_data/model/alarm_event.go @@ -3,14 +3,13 @@ package model // AlarmEvent 告警_事件记录表 type AlarmEvent struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间 AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增 AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题 AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码 - EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 + EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 产生时间 ObjectUid string `json:"objectUid" gorm:"column:object_uid"` // 对象ID ObjectName string `json:"objectName" gorm:"column:object_name"` // 对象名称 ObjectType string `json:"objectType" gorm:"column:object_type"` // 对象类型 @@ -22,7 +21,12 @@ type AlarmEvent struct { ClearType string `json:"clearType" gorm:"column:clear_type"` // 清除状态 ClearTime int64 `json:"clearTime" gorm:"column:clear_time"` // 清除时间 ClearUser string `json:"clearUser" gorm:"column:clear_user"` // 清除用户 - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 + + // ====== 非数据库字段属性 ====== + + NeUid string `json:"neUid,omitempty" gorm:"->"` // 网元唯一标识 + NeName string `json:"neName,omitempty" gorm:"->"` // 网元名称 + NeType string `json:"neType,omitempty" gorm:"->"` // 网元类型 } // TableName 表名称 @@ -32,15 +36,14 @@ func (*AlarmEvent) TableName() string { // AlarmEventQuery 告警事件数据查询参数结构体 type AlarmEventQuery struct { - CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识 - NeType string `json:"neType" form:"neType"` // 网元类型 + NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识 + NeID int64 `json:"neId" form:"neId"` // 网元ID AlarmCode string `json:"alarmCode" form:"alarmCode"` AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=Clear Active"` // 告警状态 - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查created_time EndTime int64 `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc + SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=createdTime eventTime id"` // 排序字段,填写结果字段 + SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` } diff --git a/src/modules/ne_data/model/alarm_forward_log.go b/src/modules/ne_data/model/alarm_forward_log.go index 28ec4d7d..ba1be92d 100644 --- a/src/modules/ne_data/model/alarm_forward_log.go +++ b/src/modules/ne_data/model/alarm_forward_log.go @@ -3,21 +3,25 @@ package model // AlarmForwardLog 告警_转发日志记录 type AlarmForwardLog struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 - AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增 - AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID - AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码 - AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题 - AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 - AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 - OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 - EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间 - Type string `json:"type" gorm:"column:type"` // 转发方式 SMS/EMAIL/SMSC - Target string `json:"target" gorm:"column:target"` // 发送目标用户 - Result string `json:"result" gorm:"column:result"` // 发送结果 + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间 + AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增 + AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID + AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码 + AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题 + AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 + AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 + OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 + EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 产生时间 + Type string `json:"type" gorm:"column:type"` // 转发方式 SMS/EMAIL/SMSC + Target string `json:"target" gorm:"column:target"` // 发送目标用户 + Result string `json:"result" gorm:"column:result"` // 发送结果 + + // ====== 非数据库字段属性 ====== + + NeUid string `json:"neUid,omitempty" gorm:"->"` // 网元唯一标识 + NeName string `json:"neName,omitempty" gorm:"->"` // 网元名称 + NeType string `json:"neType,omitempty" gorm:"->"` // 网元类型 } // TableName 表名称 @@ -27,13 +31,12 @@ func (*AlarmForwardLog) TableName() string { // AlarmForwardLogQuery 告警转发日志数据查询参数结构体 type AlarmForwardLogQuery struct { - CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识 - NeType string `json:"neType" form:"neType"` // 网元类型 - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 + NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识 + NeID int64 `json:"neId" form:"neId"` // 网元ID + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查created_time EndTime int64 `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc + SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=createdTime eventTime id"` // 排序字段,填写结果字段 + SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` } diff --git a/src/modules/ne_data/model/alarm_log.go b/src/modules/ne_data/model/alarm_log.go index 6ae25738..ab04e362 100644 --- a/src/modules/ne_data/model/alarm_log.go +++ b/src/modules/ne_data/model/alarm_log.go @@ -3,18 +3,22 @@ package model // AlarmLog 告警_日志记录 type AlarmLog struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 - AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增 - AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID - AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码 - AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题 - AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 - AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 - OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 - EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 事件产生时间 - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 创建时间 + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间 + AlarmSeq int64 `json:"alarmSeq" gorm:"column:alarm_seq"` // 告警序号 连续递增 + AlarmId string `json:"alarmId" gorm:"column:alarm_id"` // 告警ID + AlarmCode int64 `json:"alarmCode" gorm:"column:alarm_code"` // 告警状态码 + AlarmTitle string `json:"alarmTitle" gorm:"column:alarm_title"` // 告警标题 + AlarmStatus string `json:"alarmStatus" gorm:"column:alarm_status"` // 告警状态 + AlarmType string `json:"alarmType" gorm:"column:alarm_type"` // 告警类型 + OrigSeverity string `json:"origSeverity" gorm:"column:orig_severity"` // 严重程度 + EventTime int64 `json:"eventTime" gorm:"column:event_time"` // 产生时间 + + // ====== 非数据库字段属性 ====== + + NeUid string `json:"neUid,omitempty" gorm:"->"` // 网元唯一标识 + NeName string `json:"neName,omitempty" gorm:"->"` // 网元名称 + NeType string `json:"neType,omitempty" gorm:"->"` // 网元类型 } // TableName 表名称 @@ -24,15 +28,14 @@ func (*AlarmLog) TableName() string { // AlarmLogQuery 告警日志数据查询参数结构体 type AlarmLogQuery struct { - CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识 - NeType string `json:"neType" form:"neType"` // 网元类型 + NeID int64 `json:"neId" form:"neId"` // 网元ID AlarmStatus string `json:"alarmStatus" form:"alarmStatus" binding:"omitempty,oneof=Clear Active"` // 告警状态 OrigSeverity string `json:"origSeverity" form:"origSeverity"` // 告警类型 - BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查event_time + BeginTime int64 `json:"beginTime" form:"beginTime"` // 开始时间 查created_time EndTime int64 `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=event_time id"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc + SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=createdTime eventTime id"` // 排序字段,填写结果字段 + SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` } diff --git a/src/modules/ne_data/model/kpi_c_report.go b/src/modules/ne_data/model/kpi_c_report.go index 7d0516ac..8c028f45 100644 --- a/src/modules/ne_data/model/kpi_c_report.go +++ b/src/modules/ne_data/model/kpi_c_report.go @@ -22,16 +22,12 @@ func (*KpiCTitle) TableName() string { // KpiCReport 自定义指标报表信息对象 type KpiCReport struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 - Date string `json:"date" gorm:"column:date"` // Date of the report yyyy-mm-dd hh:mi:ss - StartTime string `json:"startTime" gorm:"column:start_time"` // Start time of the report hh:mi:ss - EndTime string `json:"endTime" gorm:"column:end_time"` // End time of the report hh:mi:ss - Index int64 `json:"index" gorm:"column:index"` // Index of the report - Granularity int64 `json:"granularity" gorm:"column:granularity"` // Time granualarity: 5/10/.../60/300 (second) - KpiValues string `json:"kpiValues" gorm:"column:kpi_values"` // KPI values JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // Creation time + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间 + RecordTime int64 `json:"recordTime" gorm:"column:record_time"` // 记录时间 + Index int64 `json:"index" gorm:"column:index"` // Index of the report + Granularity int64 `json:"granularity" gorm:"column:granularity"` // Time granualarity: 5/10/.../60/300 (second) + KpiValues string `json:"kpiValues" gorm:"column:kpi_values"` // KPI values JSON String } // TableName 表名称 @@ -41,11 +37,9 @@ func (*KpiCReport) TableName() string { // KPICQuery 指标查询参数结构体 type KPICQuery struct { - CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网元唯一标识 - NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型 - BeginTime int64 `form:"beginTime" binding:"required"` // 开始时间戳(毫秒)1739361200999 - EndTime int64 `form:"endTime" binding:"required"` // 结束时间戳(毫秒)1739361210088 + NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识 + BeginTime int64 `form:"beginTime" binding:"required"` // 开始时间戳(毫秒)1739361200999 + EndTime int64 `form:"endTime" binding:"required"` // 结束时间戳(毫秒)1739361210088 Interval int64 `form:"interval" binding:"required,oneof=5 60 300 900 1800 3600"` RmUID string `form:"rmUID"` SortField string `form:"sortField" binding:"omitempty,oneof=timeGroup"` diff --git a/src/modules/ne_data/model/kpi_report.go b/src/modules/ne_data/model/kpi_report.go index 910b1b64..5f58ba9e 100644 --- a/src/modules/ne_data/model/kpi_report.go +++ b/src/modules/ne_data/model/kpi_report.go @@ -19,16 +19,12 @@ func (*KpiTitle) TableName() string { // KpiReport 指标报表信息对象 type KpiReport struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 - Date string `json:"date" gorm:"column:date"` // Date of the report yyyy-mm-dd hh:mi:ss - StartTime string `json:"startTime" gorm:"column:start_time"` // Start time of the report hh:mi:ss - EndTime string `json:"endTime" gorm:"column:end_time"` // End time of the report hh:mi:ss - Index int64 `json:"index" gorm:"column:index"` // Index of the report - Granularity int64 `json:"granularity" gorm:"column:granularity"` // Time granualarity: 5/10/.../60/300 (second) - KpiValues string `json:"kpiValues" gorm:"column:kpi_values"` // KPI values JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // Creation time 接收到的timestamp秒级存储毫秒时间戳 + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 创建时间 + RecordTime int64 `json:"recordTime" gorm:"column:record_time"` // 记录时间 + Index int64 `json:"index" gorm:"column:index"` // Index of the report + Granularity int64 `json:"granularity" gorm:"column:granularity"` // Time granualarity: 5/10/.../60/300 (second) + KpiValues string `json:"kpiValues" gorm:"column:kpi_values"` // KPI values JSON String } // TableName 表名称 @@ -38,11 +34,9 @@ func (*KpiReport) TableName() string { // KPIQuery 指标查询参数结构体 type KPIQuery struct { - CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网元唯一标识 - NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型 - BeginTime int64 `form:"beginTime" binding:"required"` // 开始时间戳(毫秒)1739361200999 - EndTime int64 `form:"endTime" binding:"required"` // 结束时间戳(毫秒)1739361210088 + NeUID string `json:"neUid" form:"neUid"` // 网元唯一标识 + BeginTime int64 `form:"beginTime" binding:"required"` // 开始时间戳(毫秒)1739361200999 + EndTime int64 `form:"endTime" binding:"required"` // 结束时间戳(毫秒)1739361210088 Interval int64 `form:"interval" binding:"required,oneof=5 60 300 900 1800 3600"` SortField string `form:"sortField" binding:"omitempty,oneof=timeGroup"` SortOrder string `form:"sortOrder" binding:"omitempty,oneof=asc desc"` diff --git a/src/modules/ne_data/model/nb_state.go b/src/modules/ne_data/model/nb_state.go index 7a76f545..4fdccf1d 100644 --- a/src/modules/ne_data/model/nb_state.go +++ b/src/modules/ne_data/model/nb_state.go @@ -3,16 +3,14 @@ package model // NBState 基站状态记录表 nb_state type NBState struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 - CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 - Address string `json:"address" gorm:"column:address"` // 基站IP地址 - NbName string `json:"nbName" gorm:"column:nb_name"` // 基站设备名称 - Name string `json:"name" gorm:"column:name"` // 基站名称 - Position string `json:"position" gorm:"column:position"` // 基站位置 - State string `json:"state" gorm:"column:state"` // 基站状态 OFF ON - Time string `json:"time" gorm:"column:time"` // 状态时间 + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + Address string `json:"address" gorm:"column:address"` // 基站IP地址 + NbName string `json:"nbName" gorm:"column:nb_name"` // 基站设备名称 + Name string `json:"name" gorm:"column:name"` // 基站名称 + Position string `json:"position" gorm:"column:position"` // 基站位置 + State string `json:"state" gorm:"column:state"` // 基站状态 OFF ON + Time string `json:"time" gorm:"column:time"` // 状态时间 } // TableName 表名称 @@ -22,14 +20,13 @@ func (*NBState) TableName() string { // NBStateQuery 查询参数结构体 type NBStateQuery struct { - CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网元唯一标识 - NeType string `json:"neType" form:"neType"` // 网元类型 + NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网元唯一标识 + NeID int64 `json:"neId" form:"neId"` // 网元ID PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` Status string `json:"status" form:"status"` - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` + StartTime int64 `json:"startTime" form:"startTime"` + EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=id create_time"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc } diff --git a/src/modules/ne_data/model/ne_state.go b/src/modules/ne_data/model/ne_state.go index ea8c56b9..f1747cc6 100644 --- a/src/modules/ne_data/model/ne_state.go +++ b/src/modules/ne_data/model/ne_state.go @@ -1,37 +1,30 @@ package model -// NEState 网元状态记录表 ne_state -type NEState struct { +// NeState 网元_状态记录内存/CPU/磁盘 +type NeState struct { ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 - Version string `json:"version" gorm:"column:version"` // 版本 - Capability int64 `json:"capability" gorm:"column:capability"` // 用户容量 - SerialNum string `json:"serialNum" gorm:"column:serial_num"` // 序列号 - ExpiryDate string `json:"expiryDate" gorm:"column:expiry_date"` // 许可证到期日期 - SysCpuUsage float64 `json:"sysCpuUsage" gorm:"column:sys_cpu_usage"` // cpu使用率-sys - SysMemUsage float64 `json:"sysMemUsage" gorm:"column:sys_mem_usage"` // 内存使用率-sys - SysDiskUsage float64 `json:"sysDiskUsage" gorm:"column:sys_disk_usage"` // 磁盘使用率-sys - NfCpuUsage float64 `json:"nfCpuUsage" gorm:"column:nf_cpu_usage"` // cpu使用率-nf - NfMemUsed int64 `json:"nfMemUsed" gorm:"column:nf_mem_used"` // 内存使用KB-nf - CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + SysCpuUsage float64 `json:"sysCpuUsage" gorm:"column:sys_cpu_usage"` // cpu使用率-sys + SysMemUsage float64 `json:"sysMemUsage" gorm:"column:sys_mem_usage"` // 内存使用率-sys + SysDiskUsage float64 `json:"sysDiskUsage" gorm:"column:sys_disk_usage"` // 磁盘使用率-sys + NfCpuUsage float64 `json:"nfCpuUsage" gorm:"column:nf_cpu_usage"` // cpu使用率-nf + NfMemUsed int64 `json:"nfMemUsed" gorm:"column:nf_mem_used"` // 内存使用KB-nf } // TableName 表名称 -func (*NEState) TableName() string { +func (*NeState) TableName() string { return "ne_state" } // NEStateQuery 查询参数结构体 -type NEStateQuery struct { - CoreUID string `json:"coreUid" form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网元唯一标识 - NeType string `json:"neType" form:"neType"` // 网元类型 +type NeStateQuery struct { + NeUID string `json:"neUid" form:"neUid" binding:"required"` // 网元唯一标识 + NeID int64 `json:"neId" form:"neId"` // 网元ID PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` - BeginTime string `json:"beginTime" form:"beginTime"` - EndTime string `json:"endTime" form:"endTime"` + BeginTime int64 `json:"beginTime" form:"beginTime"` + EndTime int64 `json:"endTime" form:"endTime"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=id create_time"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc } diff --git a/src/modules/ne_data/repository/alarm.go b/src/modules/ne_data/repository/alarm.go index 826010ea..f56cd8c2 100644 --- a/src/modules/ne_data/repository/alarm.go +++ b/src/modules/ne_data/repository/alarm.go @@ -1,6 +1,7 @@ package repository import ( + "sort" "strings" "time" @@ -19,14 +20,8 @@ type Alarm struct{} func (r Alarm) SelectByPage(query model.AlarmQuery) ([]model.Alarm, int64) { tx := db.DB("").Model(&model.Alarm{}) // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) - } - if query.NeUID != "" { - tx = tx.Where("ne_uid = ?", query.NeUID) - } - if query.CoreUID != "" { - tx = tx.Where("core_uid = ?", query.CoreUID) + if query.NeID != 0 { + tx = tx.Where("ne_id = ?", query.NeID) } if query.AlarmCode != "" { tx = tx.Where("alarm_code = ?", query.AlarmCode) @@ -40,12 +35,11 @@ func (r Alarm) SelectByPage(query model.AlarmQuery) ([]model.Alarm, int64) { if query.OrigSeverity != "" { tx = tx.Where("orig_severity in (?)", strings.Split(query.OrigSeverity, ",")) } - if query.BeginTime != 0 { - tx = tx.Where("event_time >= ?", query.BeginTime) + tx = tx.Where("created_time >= ?", query.BeginTime) } if query.EndTime != 0 { - tx = tx.Where("event_time <= ?", query.EndTime) + tx = tx.Where("created_time <= ?", query.EndTime) } // 查询结果 @@ -57,38 +51,75 @@ func (r Alarm) SelectByPage(query model.AlarmQuery) ([]model.Alarm, int64) { return rows, total } - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + + // 关联查询 + tx = tx.Joins("left join ne_info on ne_info.id = alarm.ne_id") + tx = tx.Select("alarm.*, ne_info.ne_name, ne_info.ne_type, ne_info.ne_uid") err := tx.Find(&rows).Error if err != nil { logger.Errorf("query find err => %v", err.Error()) return rows, total } + + // 排序 + r.sortRows(query.SortField, query.SortOrder, rows) return rows, total } +// sortRows 排序数据集合 +// sortField 排序字段 支持id createdTime eventTime +// sortOrder 排序顺序 升序asc 降序desc +func (r Alarm) sortRows(sortField, sortOrder string, rows []model.Alarm) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.Alarm) any{ + "id": func(row *model.Alarm) any { return row.ID }, + "eventTime": func(row *model.Alarm) any { return row.EventTime }, + "createdTime": func(row *model.Alarm) any { return row.CreatedTime }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // Select 查询集合 func (r Alarm) Select(param model.Alarm) []model.Alarm { tx := db.DB("").Model(&model.Alarm{}) // 查询条件拼接 - if param.NeType != "" { - tx = tx.Where("ne_type = ?", param.NeType) - } - if param.NeUID != "" { - tx = tx.Where("ne_uid = ?", param.NeUID) - } - if param.CoreUID != "" { - tx = tx.Where("core_uid = ?", param.CoreUID) + if param.NeID != 0 { + tx = tx.Where("ne_id = ?", param.NeID) } if param.AlarmCode > 0 { tx = tx.Where("alarm_code = ?", param.AlarmCode) @@ -132,8 +163,8 @@ func (r Alarm) SelectByIds(ids []int64) []model.Alarm { // Insert 新增信息 返回新增数据ID func (r Alarm) Insert(param model.Alarm) int64 { - if param.CreatedAt == 0 { - param.CreatedAt = time.Now().UnixMilli() + if param.CreatedTime == 0 { + param.CreatedTime = time.Now().UnixMilli() } // 执行插入 if err := db.DB("").Create(¶m).Error; err != nil { @@ -151,7 +182,7 @@ func (r Alarm) Update(param model.Alarm) int64 { tx := db.DB("").Model(&model.Alarm{}) // 构建查询条件 tx = tx.Where("id = ?", param.ID) - tx = tx.Omit("id", "created_at") + tx = tx.Omit("id", "created_time") // 执行更新 if err := tx.Updates(param).Error; err != nil { logger.Errorf("update err => %v", err.Error()) @@ -174,9 +205,9 @@ func (r Alarm) DeleteByIds(ids []int64) int64 { } // SelectAlarmSeqLast 查询网元告警最后一条序号 -func (r Alarm) SelectAlarmSeqLast(coreUid, neUid string) int64 { +func (r Alarm) SelectAlarmSeqLast(neId int64) int64 { tx := db.DB("").Model(&model.Alarm{}) - tx = tx.Where("core_uid=? and ne_uid=?", coreUid, neUid) + tx = tx.Where("ne_id=?", neId) tx = tx.Select("alarm_seq").Order("alarm_seq DESC") // 查询数据 var alarmSeq int64 = 0 @@ -188,10 +219,10 @@ func (r Alarm) SelectAlarmSeqLast(coreUid, neUid string) int64 { } // GroupTotal 分组统计 -func (r Alarm) GroupTotal(coreUid, alarmStatus string, group string, limit int) []map[string]any { +func (r Alarm) GroupTotal(alarmStatus string, group string, limit int) []map[string]any { tx := db.DB("").Model(&model.Alarm{}) tx = tx.Select("count(*) as total", group) - tx = tx.Where("core_uid=? and alarm_status=? ", coreUid, alarmStatus) + tx = tx.Where("alarm_status=? ", alarmStatus) tx = tx.Group(group).Order("total DESC") // 查询数据 var rows []map[string]any = make([]map[string]any, 0) diff --git a/src/modules/ne_data/repository/alarm_event.go b/src/modules/ne_data/repository/alarm_event.go index 3d69ced2..27d40271 100644 --- a/src/modules/ne_data/repository/alarm_event.go +++ b/src/modules/ne_data/repository/alarm_event.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "time" "be.ems/src/framework/database/db" @@ -19,14 +20,8 @@ type AlarmEvent struct{} func (r AlarmEvent) SelectByPage(query model.AlarmEventQuery) ([]model.AlarmEvent, int64) { tx := db.DB("").Model(&model.AlarmEvent{}) // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) - } - if query.NeUID != "" { - tx = tx.Where("ne_uid = ?", query.NeUID) - } - if query.CoreUID != "" { - tx = tx.Where("core_uid = ?", query.CoreUID) + if query.NeID != 0 { + tx = tx.Where("ne_id = ?", query.NeID) } if query.AlarmCode != "" { tx = tx.Where("alarm_code like ?", fmt.Sprintf("%s%%", query.AlarmCode)) @@ -50,38 +45,75 @@ func (r AlarmEvent) SelectByPage(query model.AlarmEventQuery) ([]model.AlarmEven return rows, total } - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + + // 关联查询 + tx = tx.Joins("left join ne_info on ne_info.id = alarm_event.ne_id") + tx = tx.Select("alarm_event.*, ne_info.ne_name, ne_info.ne_type, ne_info.ne_uid") err := tx.Find(&rows).Error if err != nil { logger.Errorf("query find err => %v", err.Error()) return rows, total } + + // 排序 + r.sortRows(query.SortField, query.SortOrder, rows) return rows, total } +// sortRows 排序数据集合 +// sortField 排序字段 支持id createdTime eventTime +// sortOrder 排序顺序 升序asc 降序desc +func (r AlarmEvent) sortRows(sortField, sortOrder string, rows []model.AlarmEvent) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.AlarmEvent) any{ + "id": func(row *model.AlarmEvent) any { return row.ID }, + "eventTime": func(row *model.AlarmEvent) any { return row.EventTime }, + "createdTime": func(row *model.AlarmEvent) any { return row.CreatedTime }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // Select 查询集合 func (r AlarmEvent) Select(param model.AlarmEvent) []model.AlarmEvent { tx := db.DB("").Model(&model.AlarmEvent{}) // 查询条件拼接 - if param.NeType != "" { - tx = tx.Where("ne_type = ?", param.NeType) - } - if param.NeUID != "" { - tx = tx.Where("ne_uid = ?", param.NeUID) - } - if param.CoreUID != "" { - tx = tx.Where("core_uid = ?", param.CoreUID) + if param.NeID != 0 { + tx = tx.Where("ne_id = ?", param.NeID) } if param.AlarmId != "" { tx = tx.Where("alarm_id = ?", param.AlarmId) @@ -120,8 +152,8 @@ func (r AlarmEvent) SelectByIds(ids []int64) []model.AlarmEvent { // Insert 新增信息 返回新增数据ID func (r AlarmEvent) Insert(param model.AlarmEvent) int64 { - if param.CreatedAt == 0 { - param.CreatedAt = time.Now().UnixMilli() + if param.CreatedTime == 0 { + param.CreatedTime = time.Now().UnixMilli() } // 执行插入 if err := db.DB("").Create(¶m).Error; err != nil { @@ -139,7 +171,7 @@ func (r AlarmEvent) Update(param model.AlarmEvent) int64 { tx := db.DB("").Model(&model.AlarmEvent{}) // 构建查询条件 tx = tx.Where("id = ?", param.ID) - tx = tx.Omit("id", "created_at") + tx = tx.Omit("id", "created_time") // 执行更新 if err := tx.Updates(param).Error; err != nil { logger.Errorf("update err => %v", err.Error()) @@ -162,9 +194,9 @@ func (r AlarmEvent) DeleteByIds(ids []int64) int64 { } // SelectAlarmEventSeqLast 查询网元告警最后一条序号 -func (r AlarmEvent) SelectAlarmEventSeqLast(coreUid, neUid string) int64 { +func (r AlarmEvent) SelectAlarmEventSeqLast(neID int64) int64 { tx := db.DB("").Model(&model.AlarmEvent{}) - tx = tx.Where("core_uid=? and ne_uid=?", coreUid, neUid) + tx = tx.Where("ne_id=?", neID) tx = tx.Select("alarm_seq").Order("alarm_seq DESC") // 查询数据 var AlarmEventSeq int64 = 0 diff --git a/src/modules/ne_data/repository/alarm_forward_log.go b/src/modules/ne_data/repository/alarm_forward_log.go index 4594fc64..e48a971f 100644 --- a/src/modules/ne_data/repository/alarm_forward_log.go +++ b/src/modules/ne_data/repository/alarm_forward_log.go @@ -1,6 +1,7 @@ package repository import ( + "sort" "time" "be.ems/src/framework/database/db" @@ -18,20 +19,14 @@ type AlarmForwardLog struct{} func (r AlarmForwardLog) SelectByPage(query model.AlarmForwardLogQuery) ([]model.AlarmForwardLog, int64) { tx := db.DB("").Model(&model.AlarmForwardLog{}) // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) - } - if query.NeUID != "" { - tx = tx.Where("ne_uid = ?", query.NeUID) - } - if query.CoreUID != "" { - tx = tx.Where("core_uid = ?", query.CoreUID) + if query.NeID != 0 { + tx = tx.Where("ne_id = ?", query.NeID) } if query.BeginTime != 0 { - tx = tx.Where("created_at >= ?", query.BeginTime) + tx = tx.Where("created_time >= ?", query.BeginTime) } if query.EndTime != 0 { - tx = tx.Where("created_at <= ?", query.EndTime) + tx = tx.Where("created_time <= ?", query.EndTime) } // 查询结果 @@ -43,26 +38,69 @@ func (r AlarmForwardLog) SelectByPage(query model.AlarmForwardLogQuery) ([]model return rows, total } - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + + // 关联查询 + tx = tx.Joins("left join ne_info on ne_info.id = alarm_forward_log.ne_id") + tx = tx.Select("alarm_forward_log.*, ne_info.ne_name, ne_info.ne_type, ne_info.ne_uid") err := tx.Find(&rows).Error if err != nil { logger.Errorf("query find err => %v", err.Error()) return rows, total } + + // 排序 + r.sortRows(query.SortField, query.SortOrder, rows) return rows, total } +// sortRows 排序数据集合 +// sortField 排序字段 支持id createdTime eventTime +// sortOrder 排序顺序 升序asc 降序desc +func (r AlarmForwardLog) sortRows(sortField, sortOrder string, rows []model.AlarmForwardLog) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.AlarmForwardLog) any{ + "id": func(row *model.AlarmForwardLog) any { return row.ID }, + "eventTime": func(row *model.AlarmForwardLog) any { return row.EventTime }, + "createdTime": func(row *model.AlarmForwardLog) any { return row.CreatedTime }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // SelectByIds 通过ID查询 func (r AlarmForwardLog) SelectByIds(ids []int64) []model.AlarmForwardLog { rows := []model.AlarmForwardLog{} @@ -95,8 +133,8 @@ func (r AlarmForwardLog) DeleteByIds(ids []int64) int64 { // Insert 新增信息 func (r AlarmForwardLog) Insert(param model.AlarmForwardLog) int64 { - if param.CreatedAt == 0 { - param.CreatedAt = time.Now().UnixMilli() + if param.CreatedTime == 0 { + param.CreatedTime = time.Now().UnixMilli() } // 执行插入 if err := db.DB("").Create(¶m).Error; err != nil { diff --git a/src/modules/ne_data/repository/alarm_log.go b/src/modules/ne_data/repository/alarm_log.go index fd3ae55f..45e0b2d5 100644 --- a/src/modules/ne_data/repository/alarm_log.go +++ b/src/modules/ne_data/repository/alarm_log.go @@ -1,6 +1,7 @@ package repository import ( + "sort" "time" "be.ems/src/framework/database/db" @@ -18,23 +19,17 @@ type AlarmLog struct{} func (r AlarmLog) SelectByPage(query model.AlarmLogQuery) ([]model.AlarmLog, int64) { tx := db.DB("").Model(&model.AlarmLog{}) // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) - } - if query.NeUID != "" { - tx = tx.Where("ne_uid = ?", query.NeUID) - } - if query.CoreUID != "" { - tx = tx.Where("core_uid = ?", query.CoreUID) + if query.NeID != 0 { + tx = tx.Where("ne_id = ?", query.NeID) } if query.AlarmStatus != "" { tx = tx.Where("alarm_status = ?", query.AlarmStatus) } if query.BeginTime != 0 { - tx = tx.Where("created_at >= ?", query.BeginTime) + tx = tx.Where("created_time >= ?", query.BeginTime) } if query.EndTime != 0 { - tx = tx.Where("created_at <= ?", query.EndTime) + tx = tx.Where("created_time <= ?", query.EndTime) } // 查询结果 @@ -46,26 +41,69 @@ func (r AlarmLog) SelectByPage(query model.AlarmLogQuery) ([]model.AlarmLog, int return rows, total } - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + + // 关联查询 + tx = tx.Joins("left join ne_info on ne_info.id = alarm_log.ne_id") + tx = tx.Select("alarm_log.*, ne_info.ne_name, ne_info.ne_type, ne_info.ne_uid") err := tx.Find(&rows).Error if err != nil { logger.Errorf("query find err => %v", err.Error()) return rows, total } + + // 排序 + r.sortRows(query.SortField, query.SortOrder, rows) return rows, total } +// sortRows 排序数据集合 +// sortField 排序字段 支持id createdTime eventTime +// sortOrder 排序顺序 升序asc 降序desc +func (r AlarmLog) sortRows(sortField, sortOrder string, rows []model.AlarmLog) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.AlarmLog) any{ + "id": func(row *model.AlarmLog) any { return row.ID }, + "eventTime": func(row *model.AlarmLog) any { return row.EventTime }, + "createdTime": func(row *model.AlarmLog) any { return row.CreatedTime }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // SelectByIds 通过ID查询 func (r AlarmLog) SelectByIds(ids []int64) []model.AlarmLog { rows := []model.AlarmLog{} @@ -98,8 +136,8 @@ func (r AlarmLog) DeleteByIds(ids []int64) int64 { // Insert 新增信息 func (r AlarmLog) Insert(param model.AlarmLog) int64 { - if param.CreatedAt == 0 { - param.CreatedAt = time.Now().UnixMilli() + if param.CreatedTime == 0 { + param.CreatedTime = time.Now().UnixMilli() } // 执行插入 if err := db.DB("").Create(¶m).Error; err != nil { diff --git a/src/modules/ne_data/repository/kpi_c_report.go b/src/modules/ne_data/repository/kpi_c_report.go index 7512c31e..3306b372 100644 --- a/src/modules/ne_data/repository/kpi_c_report.go +++ b/src/modules/ne_data/repository/kpi_c_report.go @@ -18,28 +18,25 @@ var NewKpiCReport = &KpiCReport{} type KpiCReport struct{} // SelectGoldKPI 通过网元指标数据信息 -func (r KpiCReport) SelectKPI(query model.KPICQuery) []model.KpiCReport { +func (r KpiCReport) SelectKPI(neType string, neId int64, query model.KPICQuery) []model.KpiCReport { rows := []model.KpiCReport{} - if query.NeType == "" { + if neType == "" { return rows } tx := db.DB("").Model(&model.KpiCReport{}) // 表名 - tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(query.NeType)) + tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(neType)) tx.Table(tableName) // 构建查询条件 - if query.NeUID != "" { - tx = tx.Where("ne_uid = ?", query.NeUID) - } - if query.CoreUID != "" { - tx = tx.Where("core_uid = ?", query.CoreUID) + if neId != 0 { + tx = tx.Where("ne_id = ?", neId) } if query.BeginTime != 0 { - tx = tx.Where("created_at >= ?", query.BeginTime) + tx = tx.Where("created_time >= ?", query.BeginTime) } if query.EndTime != 0 { - tx = tx.Where("created_at <= ?", query.EndTime) + tx = tx.Where("created_time <= ?", query.EndTime) } // 查询数据 if err := tx.Find(&rows).Error; err != nil { @@ -47,59 +44,65 @@ func (r KpiCReport) SelectKPI(query model.KPICQuery) []model.KpiCReport { return rows } // 排序 - if query.SortField != "" { - sortField := query.SortField - sortOrder := query.SortOrder - sort.SliceStable(rows, func(i, j int) bool { - // 支持的排序字段映射 - fieldGetters := map[string]func(*model.KpiCReport) any{ - "id": func(row *model.KpiCReport) any { return row.ID }, - "timeGroup": func(row *model.KpiCReport) any { return row.CreatedAt }, - "createdAt": func(row *model.KpiCReport) any { return row.CreatedAt }, - // 可添加更多支持的字段 - } - - // 获取字段 getter 函数 - getter, ok := fieldGetters[sortField] - if !ok { - // 非法字段,使用默认排序(id升序) - return rows[i].ID < rows[j].ID - } - - // 获取比较值 - valI, valJ := getter(&rows[i]), getter(&rows[j]) - - // 根据字段类型进行比较 - switch v := valI.(type) { - case int64: - if sortOrder == "desc" { - return v > valJ.(int64) - } - return v < valJ.(int64) - case string: - if sortOrder == "desc" { - return v > valJ.(string) - } - return v < valJ.(string) - default: - // 不支持的字段类型,使用默认排序 - return rows[i].ID < rows[j].ID - } - }) - } + r.sortRows(query.SortField, query.SortOrder, rows) return rows } +// sortRows 排序数据集合 +// sortField 排序字段 支持id timeGroup createdAt +// sortOrder 排序顺序 升序asc 降序desc +func (r KpiCReport) sortRows(sortField, sortOrder string, rows []model.KpiCReport) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.KpiCReport) any{ + "id": func(row *model.KpiCReport) any { return row.ID }, + "timeGroup": func(row *model.KpiCReport) any { return row.CreatedTime }, + "createdTime": func(row *model.KpiCReport) any { return row.CreatedTime }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // Insert 新增信息 返回新增数据ID -func (r KpiCReport) Insert(param model.KpiCReport) int64 { - if param.NeType == "" { +func (r KpiCReport) Insert(neType string, param model.KpiCReport) int64 { + if neType == "" { return 0 } - if param.CreatedAt == 0 { - param.CreatedAt = time.Now().UnixMilli() + if param.CreatedTime == 0 { + param.CreatedTime = time.Now().UnixMilli() } // 表名 - tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(param.NeType)) + tableName := fmt.Sprintf("kpi_c_report_%s", strings.ToLower(neType)) // 执行插入 if err := db.DB("").Table(tableName).Create(¶m).Error; err != nil { logger.Errorf("insert err => %v", err.Error()) diff --git a/src/modules/ne_data/repository/kpi_report.go b/src/modules/ne_data/repository/kpi_report.go index 29e43334..a618e77a 100644 --- a/src/modules/ne_data/repository/kpi_report.go +++ b/src/modules/ne_data/repository/kpi_report.go @@ -18,28 +18,25 @@ var NewKpiReport = &KpiReport{} type KpiReport struct{} // SelectGoldKPI 通过网元指标数据信息 -func (r KpiReport) SelectKPI(query model.KPIQuery) []model.KpiReport { +func (r KpiReport) SelectKPI(neType string, neId int64, query model.KPIQuery) []model.KpiReport { rows := []model.KpiReport{} - if query.NeType == "" { + if neType == "" { return rows } tx := db.DB("").Model(&model.KpiReport{}) // 表名 - tableName := fmt.Sprintf("kpi_report_%s", strings.ToLower(query.NeType)) + tableName := fmt.Sprintf("kpi_report_%s", strings.ToLower(neType)) tx = tx.Table(tableName) // 构建查询条件 - if query.NeUID != "" { - tx = tx.Where("ne_uid = ?", query.NeUID) - } - if query.CoreUID != "" { - tx = tx.Where("core_uid = ?", query.CoreUID) + if neId != 0 { + tx = tx.Where("ne_id = ?", neId) } if query.BeginTime != 0 { - tx = tx.Where("created_at >= ?", query.BeginTime) + tx = tx.Where("created_time >= ?", query.BeginTime) } if query.EndTime != 0 { - tx = tx.Where("created_at <= ?", query.EndTime) + tx = tx.Where("created_time <= ?", query.EndTime) } // 查询数据 if err := tx.Find(&rows).Error; err != nil { @@ -47,59 +44,65 @@ func (r KpiReport) SelectKPI(query model.KPIQuery) []model.KpiReport { return rows } // 排序 - if query.SortField != "" { - sortField := query.SortField - sortOrder := query.SortOrder - sort.SliceStable(rows, func(i, j int) bool { - // 支持的排序字段映射 - fieldGetters := map[string]func(*model.KpiReport) any{ - "id": func(row *model.KpiReport) any { return row.ID }, - "timeGroup": func(row *model.KpiReport) any { return row.CreatedAt }, - "createdAt": func(row *model.KpiReport) any { return row.CreatedAt }, - // 可添加更多支持的字段 - } - - // 获取字段 getter 函数 - getter, ok := fieldGetters[sortField] - if !ok { - // 非法字段,使用默认排序(id升序) - return rows[i].ID < rows[j].ID - } - - // 获取比较值 - valI, valJ := getter(&rows[i]), getter(&rows[j]) - - // 根据字段类型进行比较 - switch v := valI.(type) { - case int64: - if sortOrder == "desc" { - return v > valJ.(int64) - } - return v < valJ.(int64) - case string: - if sortOrder == "desc" { - return v > valJ.(string) - } - return v < valJ.(string) - default: - // 不支持的字段类型,使用默认排序 - return rows[i].ID < rows[j].ID - } - }) - } + r.sortRows(query.SortField, query.SortOrder, rows) return rows } +// sortRows 排序数据集合 +// sortField 排序字段 支持id timeGroup createdAt +// sortOrder 排序顺序 升序asc 降序desc +func (r KpiReport) sortRows(sortField, sortOrder string, rows []model.KpiReport) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.KpiReport) any{ + "id": func(row *model.KpiReport) any { return row.ID }, + "timeGroup": func(row *model.KpiReport) any { return row.CreatedTime }, + "createdTime": func(row *model.KpiReport) any { return row.CreatedTime }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // Insert 新增信息 返回新增数据ID -func (r KpiReport) Insert(param model.KpiReport) int64 { - if param.CoreUID == "" || param.NeUID == "" || param.NeType == "" { +func (r KpiReport) Insert(neType string, param model.KpiReport) int64 { + if neType == "" { return 0 } - if param.CreatedAt == 0 { - param.CreatedAt = time.Now().UnixMilli() + if param.CreatedTime == 0 { + param.CreatedTime = time.Now().UnixMilli() } // 表名 - tableName := fmt.Sprintf("kpi_report_%s", strings.ToLower(param.NeType)) + tableName := fmt.Sprintf("kpi_report_%s", strings.ToLower(neType)) // 执行插入 if err := db.DB("").Table(tableName).Create(¶m).Error; err != nil { logger.Errorf("insert err => %v", err.Error()) @@ -108,34 +111,19 @@ func (r KpiReport) Insert(param model.KpiReport) int64 { return param.ID } -// SelectUPF 查询UPF数据 N3上行,N6下行 -func (r KpiReport) SelectUPF(coreUid, neUid string, beginTime, endTime int64) []model.KpiReport { - tx := db.DB("").Model(&model.KpiReport{}) - // 表名 - tx = tx.Table("kpi_report_upf") - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) - tx = tx.Where("created_at >= ?", beginTime) - tx = tx.Where("created_at <= ?", endTime) - // 查询数据 +// Select 查询数据 +func (r KpiReport) Select(neType string, neId int64, beginTime, endTime int64) []model.KpiReport { rows := []model.KpiReport{} - if err := tx.Select("kpi_values", "created_at").Find(&rows).Error; err != nil { - logger.Errorf("query find err => %v", err.Error()) + if neType == "" { return rows } - return rows -} - -// SelectIMS 查询IMS数据 -func (r KpiReport) SelectIMS(coreUid, neUid string, beginTime, endTime int64) []model.KpiReport { tx := db.DB("").Model(&model.KpiReport{}) // 表名 - tx = tx.Table("kpi_report_ims") - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) - tx = tx.Where("created_at >= ?", beginTime) - tx = tx.Where("created_at <= ?", endTime) + tx = tx.Table(fmt.Sprintf("kpi_report_%s", strings.ToLower(neType))) + tx = tx.Where("ne_id = ?", neId) + tx = tx.Where("created_time >= ? and created_time <= ?", beginTime, endTime) // 查询数据 - rows := []model.KpiReport{} - if err := tx.Select("kpi_values", "created_at").Find(&rows).Error; err != nil { + if err := tx.Select("kpi_values", "created_time").Find(&rows).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) return rows } diff --git a/src/modules/ne_data/repository/nb_state.go b/src/modules/ne_data/repository/nb_state.go index 2ea3d757..ff640685 100644 --- a/src/modules/ne_data/repository/nb_state.go +++ b/src/modules/ne_data/repository/nb_state.go @@ -18,31 +18,17 @@ type NBState struct{} func (r NBState) SelectByPage(query model.NBStateQuery) ([]model.NBState, int64) { tx := db.DB("").Model(&model.NBState{}) // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) - } - if query.NeUID != "" { - tx = tx.Where("ne_uid = ?", query.NeUID) - } - if query.CoreUID != "" { - tx = tx.Where("core_uid = ?", query.CoreUID) + if query.NeID != 0 { + tx = tx.Where("ne_id = ?", query.NeID) } if query.Status != "" { tx = tx.Where("state = ?", query.Status) } - if query.StartTime != "" { - startTime := query.StartTime - if len(startTime) == 10 { - startTime = startTime + "000" - } - tx = tx.Where("create_time >= ?", startTime) + if query.StartTime != 0 { + tx = tx.Where("create_time >= ?", query.StartTime) } - if query.EndTime != "" { - endTime := query.EndTime - if len(endTime) == 10 { - endTime = endTime + "999" - } - tx = tx.Where("create_time <= ?", endTime) + if query.EndTime != 0 { + tx = tx.Where("create_time <= ?", query.EndTime) } // 查询结果 @@ -54,15 +40,6 @@ func (r NBState) SelectByPage(query model.NBStateQuery) ([]model.NBState, int64) return rows, total } - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) @@ -82,7 +59,11 @@ func (r NBState) SelectByIds(ids []string) []model.NBState { } tx := db.DB("").Model(&model.NBState{}) // 构建查询条件 - tx = tx.Where("id in ?", ids) + if len(ids) == 1 { + tx = tx.Where("id = ?", ids[0]) + } else { + tx = tx.Where("id in ?", ids) + } // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) diff --git a/src/modules/ne_data/repository/ne_state.go b/src/modules/ne_data/repository/ne_state.go index dedcfaa6..b328a345 100644 --- a/src/modules/ne_data/repository/ne_state.go +++ b/src/modules/ne_data/repository/ne_state.go @@ -8,58 +8,35 @@ import ( "be.ems/src/modules/ne_data/model" ) -// 实例化数据层 NEState 结构体 -var NewNEState = &NEState{} +// 实例化数据层 NeState 结构体 +var NewNeState = &NeState{} -// NEState 网元状态记录表 数据层处理 -type NEState struct{} +// NeState 网元状态记录表 数据层处理 +type NeState struct{} // SelectByPage 分页查询集合 -func (r NEState) SelectByPage(query model.NEStateQuery) ([]model.NEState, int64) { - tx := db.DB("").Model(&model.NEState{}) +func (r NeState) SelectByPage(query model.NeStateQuery) ([]model.NeState, int64) { + tx := db.DB("").Model(&model.NeState{}) // 查询条件拼接 - if query.NeType != "" { - tx = tx.Where("ne_type = ?", query.NeType) + if query.NeID != 0 { + tx = tx.Where("ne_id = ?", query.NeID) } - if query.NeUID != "" { - tx = tx.Where("ne_uid = ?", query.NeUID) + if query.BeginTime != 0 { + tx = tx.Where("create_time >= ?", query.BeginTime) } - if query.CoreUID != "" { - tx = tx.Where("core_uid = ?", query.CoreUID) - } - if query.BeginTime != "" { - startTime := query.BeginTime - if len(startTime) == 10 { - startTime = startTime + "000" - } - tx = tx.Where("create_time >= ?", startTime) - } - if query.EndTime != "" { - endTime := query.EndTime - if len(endTime) == 10 { - endTime = endTime + "999" - } - tx = tx.Where("create_time <= ?", endTime) + if query.EndTime != 0 { + tx = tx.Where("create_time <= ?", query.EndTime) } // 查询结果 var total int64 = 0 - rows := []model.NEState{} + rows := []model.NeState{} // 查询数量为0直接返回 if err := tx.Count(&total).Error; err != nil || total <= 0 { return rows, total } - // 排序 - if query.SortField != "" { - sortField := query.SortField - if query.SortOrder == "desc" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) - } - // 查询数据分页 pageNum, pageSize := db.PageNumSize(query.PageNum, query.PageSize) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) @@ -72,14 +49,18 @@ func (r NEState) SelectByPage(query model.NEStateQuery) ([]model.NEState, int64) } // SelectByIds 通过ID查询 -func (r NEState) SelectByIds(ids []string) []model.NEState { - rows := []model.NEState{} +func (r NeState) SelectByIds(ids []string) []model.NeState { + rows := []model.NeState{} if len(ids) <= 0 { return rows } - tx := db.DB("").Model(&model.NEState{}) + tx := db.DB("").Model(&model.NeState{}) // 构建查询条件 - tx = tx.Where("id in ?", ids) + if len(ids) == 1 { + tx = tx.Where("id = ?", ids[0]) + } else { + tx = tx.Where("id in ?", ids) + } // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) @@ -89,12 +70,12 @@ func (r NEState) SelectByIds(ids []string) []model.NEState { } // DeleteByTime 删除信息 -func (r NEState) DeleteByTime(ltTime int64) int64 { +func (r NeState) DeleteByTime(ltTime int64) int64 { if ltTime <= 0 { return 0 } tx := db.DB("").Where("create_time < ?", ltTime) - if err := tx.Delete(&model.NEState{}).Error; err != nil { + if err := tx.Delete(&model.NeState{}).Error; err != nil { logger.Errorf("delete err => %v", err.Error()) return 0 } @@ -102,7 +83,7 @@ func (r NEState) DeleteByTime(ltTime int64) int64 { } // Insert 新增信息 -func (r NEState) Insert(param model.NEState) int64 { +func (r NeState) Insert(param model.NeState) int64 { param.CreateTime = time.Now().UnixMilli() // 执行插入 if err := db.DB("").Create(¶m).Error; err != nil { diff --git a/src/modules/ne_data/service/alarm.go b/src/modules/ne_data/service/alarm.go index 5b73f428..72366c04 100644 --- a/src/modules/ne_data/service/alarm.go +++ b/src/modules/ne_data/service/alarm.go @@ -12,6 +12,7 @@ import ( "be.ems/src/framework/i18n" "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/file" + neService "be.ems/src/modules/ne/service" "be.ems/src/modules/ne_data/model" "be.ems/src/modules/ne_data/repository" sysService "be.ems/src/modules/system/service" @@ -64,24 +65,18 @@ func (r Alarm) DeleteByIds(ids []int64) (int64, error) { } // FindAlarmSeqLast 查询网元告警最后一条序号 -func (s Alarm) FindAlarmSeqLast(coreUid, neUid string) int64 { - return s.alarmRepository.SelectAlarmSeqLast(coreUid, neUid) +func (s Alarm) FindAlarmSeqLast(neId int64) int64 { + return s.alarmRepository.SelectAlarmSeqLast(neId) } // ClearById 清除告警信息 -func (r Alarm) ClearById(id int64, coreUid, clearUser, clearType string) (int64, error) { +func (r Alarm) ClearByIds(ids []int64, clearUser, clearType string) (int64, error) { // 检查是否存在 - arr := r.alarmRepository.SelectByIds([]int64{id}) - if len(arr) != 1 { + arr := r.alarmRepository.SelectByIds(ids) + if len(arr) != len(ids) { return 0, fmt.Errorf("not match id") } - for _, v := range arr { - if v.CoreUID != coreUid { - return 0, fmt.Errorf("data not match, id: %d", v.ID) - } - } - var rows int64 = 0 for _, v := range arr { // 状态检查AlarmCode变更告警ID @@ -99,19 +94,13 @@ func (r Alarm) ClearById(id int64, coreUid, clearUser, clearType string) (int64, } // AckById 确认清除告警信息 -func (r Alarm) AckById(id int64, coreUid, ackUser, ackState string) (int64, error) { +func (r Alarm) AckByIds(ids []int64, ackUser, ackState string) (int64, error) { // 检查是否存在 - arr := r.alarmRepository.SelectByIds([]int64{id}) - if len(arr) != 1 { + arr := r.alarmRepository.SelectByIds(ids) + if len(arr) != len(ids) { return 0, fmt.Errorf("not match id") } - for _, v := range arr { - if v.CoreUID != coreUid { - return 0, fmt.Errorf("data not match, id: %d", v.ID) - } - } - var rows int64 = 0 for _, v := range arr { v.AckState = ackState @@ -123,7 +112,7 @@ func (r Alarm) AckById(id int64, coreUid, ackUser, ackState string) (int64, erro } // CountType 告警类别数量 -func (s Alarm) CountType(coreUid, alarmStatus string) []map[string]any { +func (s Alarm) CountType(alarmStatus string) []map[string]any { data := []map[string]any{} alarmTypeArr := []string{ oam.ALARM_TYPE_COMMUNICATION_ALARM, @@ -140,7 +129,7 @@ func (s Alarm) CountType(coreUid, alarmStatus string) []map[string]any { } // 告警类别数量 - rows := s.alarmRepository.GroupTotal(coreUid, alarmStatus, "alarm_type", -1) + rows := s.alarmRepository.GroupTotal(alarmStatus, "alarm_type", -1) for _, item := range data { for _, v := range rows { str := fmt.Sprint(v["alarm_type"]) @@ -154,7 +143,7 @@ func (s Alarm) CountType(coreUid, alarmStatus string) []map[string]any { } // CountSeverity 告警级别数量 -func (s Alarm) CountSeverity(coreUid, alarmStatus string) []map[string]any { +func (s Alarm) CountSeverity(alarmStatus string) []map[string]any { data := []map[string]any{} alarmTypeArr := []string{ oam.ALARM_SEVERITY_CRITICAL, @@ -170,7 +159,7 @@ func (s Alarm) CountSeverity(coreUid, alarmStatus string) []map[string]any { } // 数量 - rows := s.alarmRepository.GroupTotal(coreUid, alarmStatus, "perceived_severity", -1) + rows := s.alarmRepository.GroupTotal(alarmStatus, "perceived_severity", -1) for _, item := range data { for _, v := range rows { str := fmt.Sprint(v["perceived_severity"]) @@ -184,8 +173,8 @@ func (s Alarm) CountSeverity(coreUid, alarmStatus string) []map[string]any { } // CountNe 告警状态前几排名 -func (s Alarm) CountNe(coreUid, alarmStatus string, top int) []map[string]any { - data := s.alarmRepository.GroupTotal(coreUid, alarmStatus, "ne_type", top) +func (s Alarm) CountNe(alarmStatus string, top int) []map[string]any { + data := s.alarmRepository.GroupTotal(alarmStatus, "ne_type", top) for _, v := range data { v["neType"] = fmt.Sprint(v["ne_type"]) v["total"] = parse.Number(v["total"]) @@ -206,19 +195,21 @@ func (r Alarm) ExportXlsx(rows []model.Alarm, fileName, language, alarmStatus st "F1": i18n.TKey(language, "alarm.export.alarmCode"), "G1": i18n.TKey(language, "ne.common.neType"), "H1": i18n.TKey(language, "ne.common.neName"), - "I1": i18n.TKey(language, "ne.common.neId"), + "I1": i18n.TKey(language, "ne.common.neUid"), } if alarmStatus == "0" { headerCells["J1"] = i18n.TKey(language, "alarm.export.clearUser") headerCells["K1"] = i18n.TKey(language, "alarm.export.clearTime") headerCells["L1"] = i18n.TKey(language, "alarm.export.clearType") } + neInfoService := neService.NewNeInfo + dictDataService := sysService.NewSysDictData // 读取字典数据 告警原始严重程度 - dictActiveAlarmType := sysService.NewSysDictData.FindByType("active_alarm_type") + dictActiveAlarmType := dictDataService.FindByType("active_alarm_type") // 读取字典数据 告警类型 - dictActiveClearType := sysService.NewSysDictData.FindByType("active_clear_type") + dictActiveClearType := dictDataService.FindByType("active_clear_type") // 读取字典数据 告警确认类型 - dictActiveAlarmSeverity := sysService.NewSysDictData.FindByType("active_alarm_severity") + dictActiveAlarmSeverity := dictDataService.FindByType("active_alarm_severity") // 从第二行开始的数据 dataCells := make([]map[string]any, 0) for i, row := range rows { @@ -250,6 +241,7 @@ func (r Alarm) ExportXlsx(rows []model.Alarm, fileName, language, alarmStatus st } eventTimeStr := date.ParseDateToStr(row.EventTime, date.YYYY_MM_DDTHH_MM_SSZ) + neInfo := neInfoService.FindByNeId(row.NeID) cells := map[string]any{ "A" + idx: alarmType, "B" + idx: origSeverity, @@ -257,9 +249,9 @@ func (r Alarm) ExportXlsx(rows []model.Alarm, fileName, language, alarmStatus st "D" + idx: eventTimeStr, "E" + idx: row.AlarmId, "F" + idx: row.AlarmCode, - "G" + idx: row.NeType, - "H" + idx: row.NeUID, - "I" + idx: row.CoreUID, + "G" + idx: neInfo.NeType, + "H" + idx: neInfo.NeName, + "I" + idx: neInfo.NeUid, } if alarmStatus == "0" { clearTimeStr := date.ParseDateToStr(row.ClearTime, date.YYYY_MM_DDTHH_MM_SSZ) diff --git a/src/modules/ne_data/service/alarm_event.go b/src/modules/ne_data/service/alarm_event.go index 79b66cef..932806c7 100644 --- a/src/modules/ne_data/service/alarm_event.go +++ b/src/modules/ne_data/service/alarm_event.go @@ -57,24 +57,18 @@ func (r AlarmEvent) DeleteByIds(ids []int64) (int64, error) { } // FindAlarmEventSeqLast 查询网元告警最后一条序号 -func (s AlarmEvent) FindAlarmEventSeqLast(coreUid, neUid string) int64 { - return s.alarmEventRepository.SelectAlarmEventSeqLast(coreUid, neUid) +func (s AlarmEvent) FindAlarmEventSeqLast(neid int64) int64 { + return s.alarmEventRepository.SelectAlarmEventSeqLast(neid) } // ClearById 清除告警信息 -func (r AlarmEvent) ClearById(id int64, coreUid, clearUser, clearType string) (int64, error) { +func (r AlarmEvent) ClearByIds(ids []int64, clearUser, clearType string) (int64, error) { // 检查是否存在 - arr := r.alarmEventRepository.SelectByIds([]int64{id}) - if len(arr) != 1 { + arr := r.alarmEventRepository.SelectByIds(ids) + if len(arr) != len(ids) { return 0, fmt.Errorf("not match id") } - for _, v := range arr { - if v.CoreUID != coreUid { - return 0, fmt.Errorf("data not match, id: %d", v.ID) - } - } - var rows int64 = 0 for _, v := range arr { v.AlarmStatus = oam.ALARM_STATUS_CLEAR diff --git a/src/modules/ne_data/service/kpi_c_report.go b/src/modules/ne_data/service/kpi_c_report.go index 3046e3b8..d89a3cbd 100644 --- a/src/modules/ne_data/service/kpi_c_report.go +++ b/src/modules/ne_data/service/kpi_c_report.go @@ -21,15 +21,15 @@ type KpiCReport struct { } // FindKPI 通过网元指标数据信息 -func (s KpiCReport) FindData(query model.KPICQuery) []map[string]any { +func (s KpiCReport) FindData(neType string, neId int64, query model.KPICQuery) []map[string]any { // 标题单位映射 - kpicTitles := s.kpiCReportRepository.SelectKPITitle(query.NeType) + kpicTitles := s.kpiCReportRepository.SelectKPITitle(neType) kpicTitleUnitMap := map[string]string{} for _, v := range kpicTitles { kpicTitleUnitMap[v.KpiId] = v.Unit } // 原始数据 - rows := s.kpiCReportRepository.SelectKPI(query) + rows := s.kpiCReportRepository.SelectKPI(neType, neId, query) if len(rows) <= 0 { return []map[string]any{} } @@ -47,11 +47,10 @@ func (s KpiCReport) FindData(query model.KPICQuery) []map[string]any { } item := map[string]any{ - "neType": row.NeType, - "neUid": row.NeUID, - "coreUID": row.CoreUID, + "neType": neType, + "neId": row.NeID, "startIndex": row.Index, - "timeGroup": row.CreatedAt, + "timeGroup": row.CreatedTime, } // 遍历 kpiValues 数组 @@ -141,8 +140,8 @@ func (s KpiCReport) FindData(query model.KPICQuery) []map[string]any { } // Insert 新增信息 -func (s KpiCReport) Insert(param model.KpiCReport) int64 { - return s.kpiCReportRepository.Insert(param) +func (s KpiCReport) Insert(neType string, param model.KpiCReport) int64 { + return s.kpiCReportRepository.Insert(neType, param) } // FindKPITitle 网元对应的指标名称 diff --git a/src/modules/ne_data/service/kpi_report.go b/src/modules/ne_data/service/kpi_report.go index a0a82178..208dc9dc 100644 --- a/src/modules/ne_data/service/kpi_report.go +++ b/src/modules/ne_data/service/kpi_report.go @@ -25,9 +25,9 @@ type KpiReport struct { } // FindData 通过网元指标数据信息 -func (s KpiReport) FindData(query model.KPIQuery) []map[string]any { +func (s KpiReport) FindData(neType string, neId int64, query model.KPIQuery) []map[string]any { // 原始数据 - rows := s.kpiReportRepository.SelectKPI(query) + rows := s.kpiReportRepository.SelectKPI(neType, neId, query) if len(rows) <= 0 { return []map[string]any{} } @@ -45,11 +45,10 @@ func (s KpiReport) FindData(query model.KPIQuery) []map[string]any { } item := map[string]any{ - "neType": row.NeType, - "neUid": row.NeUID, - "coreUID": row.CoreUID, + "neType": neType, + "neId": row.NeID, "startIndex": row.Index, - "timeGroup": row.CreatedAt, + "timeGroup": row.CreatedTime, } // 遍历 kpiValues 数组 @@ -132,8 +131,8 @@ func (s KpiReport) FindData(query model.KPIQuery) []map[string]any { } // Insert 新增信息 -func (s KpiReport) Insert(param model.KpiReport) int64 { - return s.kpiReportRepository.Insert(param) +func (s KpiReport) Insert(neType string, param model.KpiReport) int64 { + return s.kpiReportRepository.Insert(neType, param) } // FindTitle 网元对应的指标名称 @@ -174,7 +173,7 @@ func (r KpiReport) TitleInsert(param model.KpiTitle) int64 { // UPFTodayFlowFind 查询UPF总流量 N3上行 N6下行 // day 统计天数 // down / 1000 / 1000 单位M -func (r KpiReport) UPFTodayFlowFind(neUid string, day int) (int64, int64) { +func (r KpiReport) UPFTodayFlowFind(neId int64, day int) (int64, int64) { // 获取当前日期 now := time.Now() var upTotal, downTotal int64 @@ -182,7 +181,7 @@ func (r KpiReport) UPFTodayFlowFind(neUid string, day int) (int64, int64) { // 查询最近day天的数据 for i := 0; i <= day; i++ { dateKey := now.AddDate(0, 0, -i).Format("2006-01-02") - key := fmt.Sprintf("%s:UPF_FLOW:%s:%s", constants.CACHE_NE_DATA, neUid, dateKey) + key := fmt.Sprintf("%s:UPF_FLOW:%d:%s", constants.CACHE_NE_DATA, neId, dateKey) // 读取缓存数据 up, err := redis.GetHash("", key, "up") @@ -202,10 +201,10 @@ func (r KpiReport) UPFTodayFlowFind(neUid string, day int) (int64, int64) { } // UPFTodayFlow UPF流量今日统计 -func (r KpiReport) UPFTodayFlowUpdate(neUid string, upValue, downValue int64) error { +func (r KpiReport) UPFTodayFlowUpdate(neId int64, upValue, downValue int64) error { // 按日期存储统计数据 dateKey := time.Now().Format("2006-01-02") - key := fmt.Sprintf("%s:UPF_FLOW:%s:%s", constants.CACHE_NE_DATA, neUid, dateKey) + key := fmt.Sprintf("%s:UPF_FLOW:%d:%s", constants.CACHE_NE_DATA, neId, dateKey) // 使用HIncrBy实时累加统计值 if err := redis.IncrBy("", key, "up", upValue); err != nil { @@ -220,7 +219,7 @@ func (r KpiReport) UPFTodayFlowUpdate(neUid string, upValue, downValue int64) er // UPFTodayFlowLoad UPF上下行数据到redis // day 统计天数 func (r KpiReport) UPFTodayFlowLoad(day int) { - cacheKeys, _ := redis.GetKeys("", constants.CACHE_NE_INFO+":UPF:*") + cacheKeys, _ := redis.GetKeys("", constants.CACHE_NE_DATA+":UPF:*") if len(cacheKeys) == 0 { return } @@ -232,16 +231,16 @@ func (r KpiReport) UPFTodayFlowLoad(day int) { if len(jsonStr) > 7 { json.Unmarshal([]byte(jsonStr), &v) } - if v.NeType == "UPF" && v.NeUID != "" { + if v.NeType == "UPF" && v.NeUid != "" { // 查询最近day天的数据 for i := 0; i <= day; i++ { dateKey := now.AddDate(0, 0, -i).Format("2006-01-02") - key := fmt.Sprintf("%s:UPF_FLOW:%s:%s", constants.CACHE_NE_DATA, v.NeUID, dateKey) + key := fmt.Sprintf("%s:UPF_FLOW:%s:%s", constants.CACHE_NE_DATA, v.NeUid, dateKey) // 根据传入天数计算时间范围 beginTime := now.AddDate(0, 0, -i).Truncate(24 * time.Hour).UnixMilli() endTime := beginTime + 24*60*60*1000 - 1 // 查询历史数据 - rows := r.kpiReportRepository.SelectUPF(v.CoreUID, v.NeUID, beginTime, endTime) + rows := r.kpiReportRepository.Select(v.NeType, v.ID, beginTime, endTime) var upTotal, downTotal int64 // 处理历史数据 @@ -283,7 +282,7 @@ func (r KpiReport) UPFTodayFlowLoad(day int) { // IMSBusyHour IMS忙时流量统计 // SCSCF.06呼叫尝试次数 SCSCF.09呼叫成功次数 -func (r KpiReport) IMSBusyHour(coreUid string, neUid string, timestamp int64) []map[string]any { +func (r KpiReport) IMSBusyHour(neType string, neId int64, timestamp int64) []map[string]any { t := time.UnixMilli(timestamp) beginTime := t endTime := t @@ -300,14 +299,14 @@ func (r KpiReport) IMSBusyHour(coreUid string, neUid string, timestamp int64) [] endTime = beginTime.Add(time.Hour - time.Millisecond) } // 转换为毫秒级时间戳 - rows := r.kpiReportRepository.SelectIMS(coreUid, neUid, beginTime.UnixMilli(), endTime.UnixMilli()) + rows := r.kpiReportRepository.Select(neType, neId, beginTime.UnixMilli(), endTime.UnixMilli()) // 创建一个map来存储按时间段合并后的数据 timeGroup := make(map[int64]map[string]int64) // 遍历每个数据项 for _, row := range rows { // 将毫秒时间戳转换为小时级时间戳(保留到小时的起始毫秒) - timeHour := row.CreatedAt / 3600000 * 3600000 // 1小时 = 3600000毫秒 + timeHour := row.CreatedTime / 3600000 * 3600000 // 1小时 = 3600000毫秒 // 解析 JSON 字符串为 map var kpiValues []map[string]any @@ -357,20 +356,20 @@ type TrafficData struct { } // IMSBusyWeek IMS忙时流量统计 周 -func (r KpiReport) IMSBusyWeek(coreUid string, neUid string, weekStart, weekEnd int64) map[string]any { +func (r KpiReport) IMSBusyWeek(neType string, neId int64, weekStart, weekEnd int64) map[string]any { weekStartTime := time.UnixMilli(weekStart) weekEndTime := time.UnixMilli(weekEnd) // 1. 获取一周内每小时的呼叫数据 // 转换为毫秒级时间戳 - rows := r.kpiReportRepository.SelectIMS(coreUid, neUid, weekStartTime.UnixMilli(), weekEndTime.UnixMilli()) + rows := r.kpiReportRepository.Select(neType, neId, weekStartTime.UnixMilli(), weekEndTime.UnixMilli()) // 创建一个map来存储按时间段合并后的数据 timeGroup := make(map[int64]map[string]int64) // 遍历每个数据项 for _, row := range rows { // 将毫秒时间戳转换为小时级时间戳(保留到小时的起始毫秒) - timeHour := row.CreatedAt / 3600000 * 3600000 // 1小时 = 3600000毫秒 + timeHour := row.CreatedTime / 3600000 * 3600000 // 1小时 = 3600000毫秒 // 解析 JSON 字符串为 map var kpiValues []map[string]any diff --git a/src/modules/ne_data/service/ne_state.go b/src/modules/ne_data/service/ne_state.go index 805fbced..1ab99c98 100644 --- a/src/modules/ne_data/service/ne_state.go +++ b/src/modules/ne_data/service/ne_state.go @@ -7,21 +7,21 @@ import ( // 实例化数据层 NEState 结构体 var NewNEState = &NEState{ - neStateRepository: repository.NewNEState, + neStateRepository: repository.NewNeState, } // NEState 网元状态记录表 服务层处理 type NEState struct { - neStateRepository *repository.NEState // 网元状态记录信息 + neStateRepository *repository.NeState // 网元状态记录信息 } // FindByPage 根据条件分页查询 -func (r NEState) FindByPage(query model.NEStateQuery) ([]model.NEState, int64) { +func (r NEState) FindByPage(query model.NeStateQuery) ([]model.NeState, int64) { return r.neStateRepository.SelectByPage(query) } // Insert 插入数据 -func (r NEState) Insert(item model.NEState) int64 { +func (r NEState) Insert(item model.NeState) int64 { return r.neStateRepository.Insert(item) } diff --git a/src/modules/ne_data_nf/controller/amf.go b/src/modules/ne_data_nf/controller/amf.go index 088bdbf1..048bca27 100644 --- a/src/modules/ne_data_nf/controller/amf.go +++ b/src/modules/ne_data_nf/controller/amf.go @@ -49,24 +49,20 @@ type AMFController struct { func (s *AMFController) UEList(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) + rows, total := s.ueEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -125,24 +121,20 @@ func (s *AMFController) UERemove(c *gin.Context) { func (s *AMFController) UEExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) + rows, total := s.ueEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 @@ -179,9 +171,8 @@ func (s *AMFController) UEExport(c *gin.Context) { func (s *AMFController) NbInfoList(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - NbId string `form:"id"` + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NbId string `form:"id"` } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -190,8 +181,8 @@ func (s *AMFController) NbInfoList(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -224,8 +215,7 @@ func (s *AMFController) NbInfoList(c *gin.Context) { func (s *AMFController) NbStateList(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -234,8 +224,8 @@ func (s *AMFController) NbStateList(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } diff --git a/src/modules/ne_data_nf/controller/cbc.go b/src/modules/ne_data_nf/controller/cbc.go index 104c419d..9384b76e 100644 --- a/src/modules/ne_data_nf/controller/cbc.go +++ b/src/modules/ne_data_nf/controller/cbc.go @@ -288,10 +288,7 @@ func (m *CBCController) Export(c *gin.Context) { c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } - // 限制导出数据集 - if query.PageSize > 10000 { - query.PageSize = 10000 - } + // 查询数据 rows, total, err := m.cbcMessageService.SelectByPage(query) if err != nil { diff --git a/src/modules/ne_data_nf/controller/ims.go b/src/modules/ne_data_nf/controller/ims.go index a7df9b73..e29bca45 100644 --- a/src/modules/ne_data_nf/controller/ims.go +++ b/src/modules/ne_data_nf/controller/ims.go @@ -53,24 +53,20 @@ type IMSController struct { func (s *IMSController) CDRList(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) + rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -129,24 +125,19 @@ func (s *IMSController) CDRRemove(c *gin.Context) { func (s *IMSController) CDRExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 @@ -182,8 +173,7 @@ func (s *IMSController) CDRExport(c *gin.Context) { func (s *IMSController) UeSessionNum(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -192,8 +182,8 @@ func (s *IMSController) UeSessionNum(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -226,10 +216,9 @@ func (s *IMSController) UeSessionNum(c *gin.Context) { func (s *IMSController) UeSessionList(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - IMSI string `form:"imsi"` - MSISDN string `form:"msisdn"` + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + IMSI string `form:"imsi"` + MSISDN string `form:"msisdn"` } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -238,8 +227,8 @@ func (s *IMSController) UeSessionList(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -274,7 +263,6 @@ func (s *IMSController) UeSessionList(c *gin.Context) { func (s IMSController) KPIBusyHour(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 Timestamp int64 `form:"timestamp" binding:"required"` // 时间戳毫秒 年月日返回每小时的总和 年月日时返回该小时的总和 } @@ -289,13 +277,13 @@ func (s IMSController) KPIBusyHour(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - data := s.kpiReportService.IMSBusyHour(neInfo.CoreUID, neInfo.NeUID, query.Timestamp) + data := s.kpiReportService.IMSBusyHour(neInfo.NeType, neInfo.ID, query.Timestamp) c.JSON(200, resp.OkData(data)) } @@ -316,7 +304,6 @@ func (s IMSController) KPIBusyHour(c *gin.Context) { func (s IMSController) KPIBusyWeek(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 WeekStart int64 `form:"weekStart" binding:"required"` // 时间戳毫秒 年月日 WeekEnd int64 `form:"weekEnd" binding:"required"` // 时间戳毫秒 年月日 @@ -347,12 +334,12 @@ func (s IMSController) KPIBusyWeek(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - data := s.kpiReportService.IMSBusyWeek(neInfo.CoreUID, neInfo.NeUID, query.WeekStart, query.WeekEnd) + data := s.kpiReportService.IMSBusyWeek(neInfo.NeType, neInfo.ID, query.WeekStart, query.WeekEnd) c.JSON(200, resp.OkData(data)) } diff --git a/src/modules/ne_data_nf/controller/mme.go b/src/modules/ne_data_nf/controller/mme.go index b7aa9793..5c5854b6 100644 --- a/src/modules/ne_data_nf/controller/mme.go +++ b/src/modules/ne_data_nf/controller/mme.go @@ -49,24 +49,20 @@ type MMEController struct { func (s *MMEController) UEList(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) + rows, total := s.ueEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -125,24 +121,20 @@ func (s *MMEController) UERemove(c *gin.Context) { func (s *MMEController) UEExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) + rows, total := s.ueEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 @@ -179,9 +171,8 @@ func (s *MMEController) UEExport(c *gin.Context) { func (s *MMEController) NbInfoList(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - NbId string `form:"id"` + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NbId string `form:"id"` } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -190,8 +181,8 @@ func (s *MMEController) NbInfoList(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -224,8 +215,7 @@ func (s *MMEController) NbInfoList(c *gin.Context) { func (s *MMEController) NbStateList(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -234,8 +224,8 @@ func (s *MMEController) NbStateList(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } diff --git a/src/modules/ne_data_nf/controller/n3iwf.go b/src/modules/ne_data_nf/controller/n3iwf.go index 74d178e0..17d7655e 100644 --- a/src/modules/ne_data_nf/controller/n3iwf.go +++ b/src/modules/ne_data_nf/controller/n3iwf.go @@ -41,9 +41,8 @@ type N3IWFController struct { func (s N3IWFController) SubUserList(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - IMSI string `form:"imsi"` + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + IMSI string `form:"imsi"` } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -52,8 +51,8 @@ func (s N3IWFController) SubUserList(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } diff --git a/src/modules/ne_data_nf/controller/nssf.go b/src/modules/ne_data_nf/controller/nssf.go index 6b6e69f6..750a59d1 100644 --- a/src/modules/ne_data_nf/controller/nssf.go +++ b/src/modules/ne_data_nf/controller/nssf.go @@ -40,8 +40,7 @@ type NSSFController struct { func (s NSSFController) SubUserList(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -50,8 +49,8 @@ func (s NSSFController) SubUserList(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -82,8 +81,7 @@ func (s NSSFController) SubUserList(c *gin.Context) { func (s NSSFController) AvailableList(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -92,8 +90,8 @@ func (s NSSFController) AvailableList(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } diff --git a/src/modules/ne_data_nf/controller/pcf.go b/src/modules/ne_data_nf/controller/pcf.go index 65068bbe..9b3c411e 100644 --- a/src/modules/ne_data_nf/controller/pcf.go +++ b/src/modules/ne_data_nf/controller/pcf.go @@ -42,10 +42,9 @@ type PCFController struct { func (s PCFController) RuleInfoList(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - IMSI string `form:"imsi"` - MSISDN string `form:"msisdn"` + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + IMSI string `form:"imsi"` + MSISDN string `form:"msisdn"` } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -54,8 +53,8 @@ func (s PCFController) RuleInfoList(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -89,7 +88,6 @@ func (s PCFController) RuleInfoList(c *gin.Context) { func (s PCFController) RuleInfoAdd(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 Num int64 `json:"num"` // 批量添加 大于1时imsi/msisdn会累加数值 ParamData map[string]any `json:"paramData" binding:"required"` // 参数数据 @@ -111,8 +109,8 @@ func (s PCFController) RuleInfoAdd(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -147,7 +145,6 @@ func (s PCFController) RuleInfoAdd(c *gin.Context) { func (s PCFController) RuleInfoEdit(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 Num int64 `json:"num"` // 更新数量 ParamData map[string]any `json:"paramData" binding:"required"` // 参数数据 @@ -169,8 +166,8 @@ func (s PCFController) RuleInfoEdit(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -207,10 +204,9 @@ func (s PCFController) RuleInfoEdit(c *gin.Context) { func (s PCFController) RuleInfoRemove(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - IMSI string `form:"imsi" binding:"required"` // IMSi, 带数量时为批量删除 - Num int64 `form:"num"` // 删除数量 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + IMSI string `form:"imsi" binding:"required"` // IMSi, 带数量时为批量删除 + Num int64 `form:"num"` // 删除数量 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -219,8 +215,8 @@ func (s PCFController) RuleInfoRemove(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -256,7 +252,6 @@ func (s PCFController) RuleInfoRemove(c *gin.Context) { func (s PCFController) RuleInfoExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 FileType string `form:"fileType" binding:"required,oneof=txt"` // 文件类型 } @@ -267,8 +262,8 @@ func (s PCFController) RuleInfoExport(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -303,7 +298,6 @@ func (s PCFController) RuleInfoExport(c *gin.Context) { func (s PCFController) RuleInfoImport(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 FileType string `json:"fileType" binding:"required,oneof=txt"` // 文件类型 FilePath string `json:"filePath" binding:"required"` // 网元端文件所在绝对路径 @@ -315,8 +309,8 @@ func (s PCFController) RuleInfoImport(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } diff --git a/src/modules/ne_data_nf/controller/sgwc.go b/src/modules/ne_data_nf/controller/sgwc.go index f918bd44..3fe1d1ee 100644 --- a/src/modules/ne_data_nf/controller/sgwc.go +++ b/src/modules/ne_data_nf/controller/sgwc.go @@ -51,24 +51,19 @@ type SGWCController struct { func (s *SGWCController) CDRList(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -127,24 +122,19 @@ func (s *SGWCController) CDRRemove(c *gin.Context) { func (s *SGWCController) CDRExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 diff --git a/src/modules/ne_data_nf/controller/smf.go b/src/modules/ne_data_nf/controller/smf.go index 62bdc37d..f0ac0aed 100644 --- a/src/modules/ne_data_nf/controller/smf.go +++ b/src/modules/ne_data_nf/controller/smf.go @@ -52,24 +52,20 @@ type SMFController struct { func (s *SMFController) CDRList(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) + rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -128,24 +124,19 @@ func (s *SMFController) CDRRemove(c *gin.Context) { func (s *SMFController) CDRExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 @@ -181,8 +172,7 @@ func (s *SMFController) CDRExport(c *gin.Context) { func (s *SMFController) SubUserNum(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -191,8 +181,8 @@ func (s *SMFController) SubUserNum(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -227,8 +217,7 @@ func (s *SMFController) SubUserNum(c *gin.Context) { func (s *SMFController) SubUserList(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 IMSI string `form:"imsi"` MSISDN string `form:"msisdn"` Upstate string `form:"upstate"` @@ -241,8 +230,8 @@ func (s *SMFController) SubUserList(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -270,7 +259,7 @@ func (s *SMFController) SubUserList(c *gin.Context) { imsiStr = strings.TrimPrefix(imsiStr, "imsi-") item["imsi"] = imsiStr // 查UDM拓展信息 - info := s.UDMExtendService.FindByIMSIAndNeID(neInfo.CoreUID, "%", imsiStr) + info := s.UDMExtendService.FindByIMSIAndNeID(neInfo.ID, imsiStr) item["remark"] = info.Remark } if v, ok := item["msisdn"]; ok && v != nil { diff --git a/src/modules/ne_data_nf/controller/smsc.go b/src/modules/ne_data_nf/controller/smsc.go index c9d9beab..10fd2b4d 100644 --- a/src/modules/ne_data_nf/controller/smsc.go +++ b/src/modules/ne_data_nf/controller/smsc.go @@ -49,24 +49,19 @@ type SMSCController struct { func (s *SMSCController) CDRList(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -125,24 +120,19 @@ func (s *SMSCController) CDRRemove(c *gin.Context) { func (s *SMSCController) CDRExport(c *gin.Context) { language := reqctx.AcceptLanguage(c) query := reqctx.QueryMap(c) - // 限制导出数据集 - pageSize := parse.Number(query["pageSize"]) - if pageSize > 10000 { - query["pageSize"] = "10000" - } - coreUid := c.DefaultQuery("coreUid", "") neUid := c.DefaultQuery("neUid", "") - if coreUid == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "neUid is empty")) return } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.NeUid != neUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } + query["neId"] = fmt.Sprint(neInfo.ID) rows, total := s.cdrEventService.FindByPage(neInfo.NeType, query) if total == 0 { // 导出数据记录为空 diff --git a/src/modules/ne_data_nf/controller/udm_auth.go b/src/modules/ne_data_nf/controller/udm_auth.go index d3710305..1d1ed3f1 100644 --- a/src/modules/ne_data_nf/controller/udm_auth.go +++ b/src/modules/ne_data_nf/controller/udm_auth.go @@ -50,8 +50,7 @@ type UDMAuthController struct { // @Router /nf/udm/auth/reset [put] func (s *UDMAuthController) ResetData(c *gin.Context) { var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -59,7 +58,14 @@ func (s *UDMAuthController) ResetData(c *gin.Context) { return } - data := s.udmAuthService.ResetData(query.CoreUID, query.NeUID) + // 查询网元信息 + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { + c.JSON(200, resp.ErrMsg("neinfo not found")) + return + } + + data := s.udmAuthService.ResetData(neInfo.ID) c.JSON(200, resp.OkData(data)) } @@ -92,8 +98,7 @@ func (s *UDMAuthController) List(c *gin.Context) { // @Tags network_data/udm/auth // @Accept json // @Produce json -// @Param coreUid query string true "NE ID" default(001) -// @Param neUid query string true "NE ID" default(001) +// @Param neUid query string true "NE UID" default(8I73Y01Z) // @Param imsi query string true "IMSI" // @Success 200 {object} object "Response Results" // @Security TokenAuth @@ -103,9 +108,8 @@ func (s *UDMAuthController) List(c *gin.Context) { func (s *UDMAuthController) Info(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - IMSI string `form:"imsi" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + IMSI string `form:"imsi" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -114,13 +118,13 @@ func (s *UDMAuthController) Info(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -139,10 +143,14 @@ func (s *UDMAuthController) Info(c *gin.Context) { c.JSON(200, resp.ErrMsg("No Auth Data")) return } + if _, ok := data["COMMAND NOT FOUND, opr"]; ok { + c.JSON(200, resp.ErrMsg("command not found")) + return + } // 解析返回的数据 - u := s.udmAuthService.ParseInfo(neInfo.CoreUID, neInfo.NeUID, query.IMSI, data) - s.udmAuthService.Insert(neInfo.CoreUID, neInfo.NeUID, u) + u := s.udmAuthService.ParseInfo(neInfo.ID, query.IMSI, data) + s.udmAuthService.Insert(neInfo.ID, u) c.JSON(200, resp.OkData(u)) } @@ -181,13 +189,13 @@ func (s *UDMAuthController) Add(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeId(body.NeID) + if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -207,7 +215,7 @@ func (s *UDMAuthController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmAuthService.LoadData(neInfo.CoreUID, neInfo.NeUID, body.IMSI, num) + s.udmAuthService.LoadData(neInfo.ID, body.IMSI, num) } c.JSON(200, resp.OkData(data)) return @@ -224,7 +232,7 @@ func (s *UDMAuthController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmAuthService.Insert(neInfo.CoreUID, neInfo.NeUID, body) + s.udmAuthService.Insert(neInfo.ID, body) } c.JSON(200, resp.OkData(data)) } @@ -257,13 +265,13 @@ func (s *UDMAuthController) Edit(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeId(body.NeID) + if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -281,7 +289,7 @@ func (s *UDMAuthController) Edit(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmAuthService.Insert(neInfo.CoreUID, neInfo.NeUID, body) + s.udmAuthService.Insert(neInfo.ID, body) } c.JSON(200, resp.OkData(data)) } @@ -303,10 +311,9 @@ func (s *UDMAuthController) Edit(c *gin.Context) { func (s *UDMAuthController) Remove(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - IMSI string `form:"imsi" binding:"required"` // IMSi - Num int64 `form:"num"` // 数量 0可拼接imsi多删除 大于1为批量 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + IMSI string `form:"imsi" binding:"required"` // IMSi + Num int64 `form:"num"` // 数量 0可拼接imsi多删除 大于1为批量 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -315,13 +322,13 @@ func (s *UDMAuthController) Remove(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -339,7 +346,7 @@ func (s *UDMAuthController) Remove(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmAuthService.LoadData(neInfo.CoreUID, neInfo.NeUID, query.IMSI, query.Num) + s.udmAuthService.LoadData(neInfo.ID, query.IMSI, query.Num) } c.JSON(200, resp.OkData(data)) return @@ -363,7 +370,7 @@ func (s *UDMAuthController) Remove(c *gin.Context) { } // 命令ok时 if strings.Contains(data, "ok") { - s.udmAuthService.Delete(neInfo.CoreUID, neInfo.NeUID, imsi) + s.udmAuthService.Delete(neInfo.ID, imsi) } resultData[imsi] = data } @@ -391,8 +398,8 @@ func (s *UDMAuthController) Remove(c *gin.Context) { func (s *UDMAuthController) Export(c *gin.Context) { language := reqctx.AcceptLanguage(c) neUid := c.Query("neUid") - if c.Query("coreUid") == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neUid is empty")) return } fileType := c.Query("type") @@ -472,7 +479,6 @@ func (s *UDMAuthController) Export(c *gin.Context) { func (s *UDMAuthController) Import(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 UploadPath string `json:"uploadPath" binding:"required"` // 上传文件路径 TypeVal string `json:"typeVal" binding:"required,oneof=default k4"` // default: 默认导入方式, k4: k4类型导入方式 @@ -491,13 +497,13 @@ func (s *UDMAuthController) Import(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -521,7 +527,7 @@ func (s *UDMAuthController) Import(c *gin.Context) { } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -540,7 +546,7 @@ func (s *UDMAuthController) Import(c *gin.Context) { // K4类型发特定请求 if body.TypeVal == "k4" { - resultMsg, resultErr = neFetchlink.UDMImportAuth(neInfo.IPAddr, map[string]any{ + resultMsg, resultErr = neFetchlink.UDMImportAuth(neInfo.IpAddr, map[string]any{ "path": neFilePath, "k4": body.TypeData, }) } @@ -554,11 +560,11 @@ func (s *UDMAuthController) Import(c *gin.Context) { if strings.Contains(resultMsg, "ok") { if strings.HasSuffix(body.UploadPath, ".csv") { data := file.ReadFileCSV(localFilePath) - go s.udmAuthService.InsertData(neInfo.CoreUID, neInfo.NeUID, "csv", data) + go s.udmAuthService.InsertData(neInfo.ID, "csv", data) } if strings.HasSuffix(body.UploadPath, ".txt") { data := file.ReadFileTXTLine(",", localFilePath) - go s.udmAuthService.InsertData(neInfo.CoreUID, neInfo.NeUID, "txt", data) + go s.udmAuthService.InsertData(neInfo.ID, "txt", data) } } c.JSON(200, resp.OkMsg(resultMsg)) diff --git a/src/modules/ne_data_nf/controller/udm_sub.go b/src/modules/ne_data_nf/controller/udm_sub.go index e05d3c76..c95b7494 100644 --- a/src/modules/ne_data_nf/controller/udm_sub.go +++ b/src/modules/ne_data_nf/controller/udm_sub.go @@ -49,8 +49,7 @@ type UDMSubController struct { // @Router /nf/udm/sub/reset [put] func (s *UDMSubController) ResetData(c *gin.Context) { var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -58,7 +57,14 @@ func (s *UDMSubController) ResetData(c *gin.Context) { return } - data := s.udmSubService.ResetData(query.CoreUID, query.NeUID) + // 查询网元信息 + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { + c.JSON(200, resp.ErrMsg("neinfo not found")) + return + } + + data := s.udmSubService.ResetData(neInfo.ID) c.JSON(200, resp.OkData(data)) } @@ -102,9 +108,8 @@ func (s *UDMSubController) List(c *gin.Context) { func (s *UDMSubController) Info(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - IMSI string `form:"imsi" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + IMSI string `form:"imsi" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -113,13 +118,13 @@ func (s *UDMSubController) Info(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -138,10 +143,14 @@ func (s *UDMSubController) Info(c *gin.Context) { c.JSON(200, resp.ErrMsg("No Subs Data")) return } + if _, ok := data["COMMAND NOT FOUND, opr"]; ok { + c.JSON(200, resp.ErrMsg("command not found")) + return + } // 解析返回的数据 - u := s.udmSubService.ParseInfo(neInfo.CoreUID, neInfo.NeUID, query.IMSI, data) - s.udmSubService.Insert(neInfo.CoreUID, neInfo.NeUID, u) + u := s.udmSubService.ParseInfo(neInfo.ID, query.IMSI, data) + s.udmSubService.Insert(neInfo.ID, u) c.JSON(200, resp.OkData(u)) } @@ -180,13 +189,13 @@ func (s *UDMSubController) Add(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeId(body.NeID) + if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -209,7 +218,7 @@ func (s *UDMSubController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmSubService.LoadData(neInfo.CoreUID, neInfo.NeUID, body.IMSI, num, body.Remark) + s.udmSubService.LoadData(neInfo.ID, body.IMSI, num, body.Remark) } c.JSON(200, resp.OkData(data)) return @@ -226,7 +235,7 @@ func (s *UDMSubController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmSubService.Insert(neInfo.CoreUID, neInfo.NeUID, body) + s.udmSubService.Insert(neInfo.ID, body) } c.JSON(200, resp.OkData(data)) } @@ -259,13 +268,13 @@ func (s *UDMSubController) Edit(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeId(body.NeID) + if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -283,7 +292,7 @@ func (s *UDMSubController) Edit(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmSubService.Insert(neInfo.CoreUID, neInfo.NeUID, body) + s.udmSubService.Insert(neInfo.ID, body) } c.JSON(200, resp.OkData(data)) } @@ -305,10 +314,9 @@ func (s *UDMSubController) Edit(c *gin.Context) { func (s *UDMSubController) Remove(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - IMSI string `form:"imsi" binding:"required"` // IMSi - Num int64 `form:"num"` // 批量数量 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + IMSI string `form:"imsi" binding:"required"` // IMSi + Num int64 `form:"num"` // 批量数量 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -317,13 +325,13 @@ func (s *UDMSubController) Remove(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -341,7 +349,7 @@ func (s *UDMSubController) Remove(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmSubService.LoadData(neInfo.CoreUID, neInfo.NeUID, query.IMSI, query.Num, "-(Deleted)-") + s.udmSubService.LoadData(neInfo.ID, query.IMSI, query.Num, "-(Deleted)-") } c.JSON(200, resp.OkData(data)) return @@ -365,7 +373,7 @@ func (s *UDMSubController) Remove(c *gin.Context) { } // 命令ok时 if strings.Contains(data, "ok") { - s.udmSubService.Delete(neInfo.CoreUID, neInfo.NeUID, imsi) + s.udmSubService.Delete(neInfo.ID, imsi) } resultData[imsi] = data } @@ -394,8 +402,8 @@ func (s *UDMSubController) Remove(c *gin.Context) { func (s *UDMSubController) Export(c *gin.Context) { language := reqctx.AcceptLanguage(c) neUid := c.Query("neUid") - if c.Query("coreUid") == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neUid is empty")) return } fileType := c.Query("type") @@ -469,8 +477,7 @@ func (s *UDMSubController) Export(c *gin.Context) { func (s *UDMSubController) Import(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 UploadPath string `json:"uploadPath" binding:"required"` } if err := c.ShouldBindBodyWithJSON(&body); err != nil { @@ -486,13 +493,13 @@ func (s *UDMSubController) Import(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -516,7 +523,7 @@ func (s *UDMSubController) Import(c *gin.Context) { } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -535,11 +542,11 @@ func (s *UDMSubController) Import(c *gin.Context) { if strings.Contains(data, "ok") { if strings.HasSuffix(body.UploadPath, ".csv") { data := file.ReadFileCSV(localFilePath) - go s.udmSubService.InsertData(neInfo.CoreUID, neInfo.NeUID, "csv", data) + go s.udmSubService.InsertData(neInfo.ID, "csv", data) } if strings.HasSuffix(body.UploadPath, ".txt") { data := file.ReadFileTXTLine(",", localFilePath) - go s.udmSubService.InsertData(neInfo.CoreUID, neInfo.NeUID, "txt", data) + go s.udmSubService.InsertData(neInfo.ID, "txt", data) } } c.JSON(200, resp.OkMsg(data)) diff --git a/src/modules/ne_data_nf/controller/udm_voip.go b/src/modules/ne_data_nf/controller/udm_voip.go index 2cba942d..47109ca3 100644 --- a/src/modules/ne_data_nf/controller/udm_voip.go +++ b/src/modules/ne_data_nf/controller/udm_voip.go @@ -41,17 +41,14 @@ type UDMVOIPController struct { // @Tags network_data/udm/voip // @Accept json // @Produce json -// @Param coreUid query string true "CoreUID" default(001) -// @Param neUid query string true "NeUID" default(001) -// @Success 200 {object} object "Response Results" +// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary UDM VOIP User Data Refresh // @Description UDM VOIP User Data List Refresh Synchronization Latest // @Router /nf/udm/voip/reset [put] func (s *UDMVOIPController) ResetData(c *gin.Context) { var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -59,7 +56,14 @@ func (s *UDMVOIPController) ResetData(c *gin.Context) { return } - data := s.udmVOIPService.ResetData(query.CoreUID, query.NeUID) + // 查询网元信息 + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { + c.JSON(200, resp.ErrMsg("neinfo not found")) + return + } + + data := s.udmVOIPService.ResetData(neInfo.ID) c.JSON(200, resp.OkData(data)) } @@ -70,9 +74,7 @@ func (s *UDMVOIPController) ResetData(c *gin.Context) { // @Tags network_data/udm/voip // @Accept json // @Produce json -// @Param coreUid query string true "CoreUID" default(001) -// @Param neUid query string true "NeUID" default(001) -// @Param username query string false "User Name" +// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Param username query string false "User Name" // @Param pageNum query number true "pageNum" default(1) // @Param pageSize query number true "pageSize" default(10) // @Success 200 {object} object "Response Results" @@ -103,7 +105,6 @@ func (s *UDMVOIPController) List(c *gin.Context) { func (s *UDMVOIPController) Info(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 UserName string `form:"username" binding:"required"` // 用户名 } @@ -114,13 +115,13 @@ func (s *UDMVOIPController) Info(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -139,11 +140,15 @@ func (s *UDMVOIPController) Info(c *gin.Context) { c.JSON(200, resp.ErrMsg("No VOIP Data")) return } + if _, ok := data["COMMAND NOT FOUND, opr"]; ok { + c.JSON(200, resp.ErrMsg("command not found")) + return + } // 解析返回的数据 - u := s.udmVOIPService.ParseInfo(neInfo.CoreUID, neInfo.NeUID, data) + u := s.udmVOIPService.ParseInfo(neInfo.ID, data) if u.ID > 0 { - s.udmVOIPService.Insert(neInfo.CoreUID, neInfo.NeUID, u.UserName) + s.udmVOIPService.Insert(neInfo.ID, u.UserName) c.JSON(200, resp.OkData(u)) return } @@ -185,13 +190,13 @@ func (s *UDMVOIPController) Add(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeId(body.NeID) + if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -210,7 +215,7 @@ func (s *UDMVOIPController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmVOIPService.LoadData(neInfo.CoreUID, neInfo.NeUID, body.UserName, num) + s.udmVOIPService.LoadData(neInfo.ID, body.UserName, num) } c.JSON(200, resp.OkData(data)) return @@ -226,7 +231,7 @@ func (s *UDMVOIPController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmVOIPService.Insert(neInfo.CoreUID, neInfo.NeUID, body.UserName) + s.udmVOIPService.Insert(neInfo.ID, body.UserName) } c.JSON(200, resp.OkData(data)) } @@ -248,7 +253,6 @@ func (s *UDMVOIPController) Add(c *gin.Context) { func (s *UDMVOIPController) Remove(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 UserName string `form:"username" binding:"required"` // 用户名 Num int64 `form:"num"` // 批量数量 @@ -260,13 +264,13 @@ func (s *UDMVOIPController) Remove(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -284,7 +288,7 @@ func (s *UDMVOIPController) Remove(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmVOIPService.LoadData(neInfo.CoreUID, neInfo.NeUID, query.UserName, query.Num) + s.udmVOIPService.LoadData(neInfo.ID, query.UserName, query.Num) } c.JSON(200, resp.OkData(data)) return @@ -308,7 +312,7 @@ func (s *UDMVOIPController) Remove(c *gin.Context) { } // 命令ok时 if strings.Contains(data, "ok") { - s.udmVOIPService.Delete(neInfo.CoreUID, neInfo.NeUID, v) + s.udmVOIPService.Delete(neInfo.ID, v) } resultData[v] = data } @@ -337,8 +341,8 @@ func (s *UDMVOIPController) Export(c *gin.Context) { language := reqctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 neUid := c.Query("neUid") - if c.Query("coreUid") == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neUid is empty")) return } fileType := c.Query("type") @@ -412,7 +416,6 @@ func (s *UDMVOIPController) Export(c *gin.Context) { func (s *UDMVOIPController) Import(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 UploadPath string `json:"uploadPath" binding:"required"` // 上传文件路径 } @@ -429,13 +432,13 @@ func (s *UDMVOIPController) Import(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -459,7 +462,7 @@ func (s *UDMVOIPController) Import(c *gin.Context) { } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -482,11 +485,11 @@ func (s *UDMVOIPController) Import(c *gin.Context) { if strings.Contains(resultMsg, "ok") { if strings.HasSuffix(body.UploadPath, ".csv") { data := file.ReadFileCSV(localFilePath) - go s.udmVOIPService.InsertData(neInfo.CoreUID, neInfo.NeUID, "csv", data) + go s.udmVOIPService.InsertData(neInfo.ID, "csv", data) } if strings.HasSuffix(body.UploadPath, ".txt") { data := file.ReadFileTXTLine(",", localFilePath) - go s.udmVOIPService.InsertData(neInfo.CoreUID, neInfo.NeUID, "txt", data) + go s.udmVOIPService.InsertData(neInfo.ID, "txt", data) } } c.JSON(200, resp.OkMsg(resultMsg)) diff --git a/src/modules/ne_data_nf/controller/udm_volte_ims.go b/src/modules/ne_data_nf/controller/udm_volte_ims.go index 289e7f54..f1d4a344 100644 --- a/src/modules/ne_data_nf/controller/udm_volte_ims.go +++ b/src/modules/ne_data_nf/controller/udm_volte_ims.go @@ -41,17 +41,14 @@ type UDMVolteIMSController struct { // @Tags network_data/udm/volte-ims // @Accept json // @Produce json -// @Param coreUid query string true "CoreUID" default(001) -// @Param neUid query string true "NeUID" default(001) -// @Success 200 {object} object "Response Results" +// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Success 200 {object} object "Response Results" // @Security TokenAuth // @Summary UDM VolteIMS User Data Refresh // @Description UDM Authenticated User Data List Refresh Synchronization Latest // @Router /nf/udm/volte-ims/reset [put] func (s *UDMVolteIMSController) ResetData(c *gin.Context) { var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -59,7 +56,14 @@ func (s *UDMVolteIMSController) ResetData(c *gin.Context) { return } - data := s.udmVolteIMSService.ResetData(query.CoreUID, query.NeUID) + // 查询网元信息 + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID { + c.JSON(200, resp.ErrMsg("neinfo not found")) + return + } + + data := s.udmVolteIMSService.ResetData(neInfo.ID) c.JSON(200, resp.OkData(data)) } @@ -103,11 +107,10 @@ func (s *UDMVolteIMSController) List(c *gin.Context) { func (s *UDMVolteIMSController) Info(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - IMSI string `form:"imsi" binding:"required"` // IMSi - MSISDN string `form:"msisdn" binding:"required"` // MSISDN - Volte string `form:"volte" binding:"required,oneof=0 1"` // Volte + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + IMSI string `form:"imsi" binding:"required"` // IMSi + MSISDN string `form:"msisdn" binding:"required"` // MSISDN + Volte string `form:"volte" binding:"required,oneof=0 1"` // Volte } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -116,13 +119,13 @@ func (s *UDMVolteIMSController) Info(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -141,11 +144,15 @@ func (s *UDMVolteIMSController) Info(c *gin.Context) { c.JSON(200, resp.ErrMsg("No Volte IMS Data")) return } + if _, ok := data["COMMAND NOT FOUND, opr"]; ok { + c.JSON(200, resp.ErrMsg("command not found")) + return + } // 解析返回的数据 - u := s.udmVolteIMSService.ParseInfo(neInfo.CoreUID, neInfo.NeUID, data) + u := s.udmVolteIMSService.ParseInfo(neInfo.ID, data) if u.ID > 0 { - s.udmVolteIMSService.InsertByIMSI(neInfo.CoreUID, neInfo.NeUID, query.IMSI) + s.udmVolteIMSService.InsertByIMSI(neInfo.ID, query.IMSI) c.JSON(200, resp.OkData(u)) return } @@ -187,13 +194,13 @@ func (s *UDMVolteIMSController) Add(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeId(body.NeID) + if neInfo.ID == 0 || neInfo.ID != body.NeID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -212,14 +219,14 @@ func (s *UDMVolteIMSController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmVolteIMSService.LoadData(neInfo.CoreUID, neInfo.NeUID, body.IMSI, num) + s.udmVolteIMSService.LoadData(neInfo.ID, body.IMSI, num) } c.JSON(200, resp.OkData(data)) return } // 检查同IMSI下msisdn是否存在 - hasMsisdns := s.udmVolteIMSService.Find(model.UDMVolteIMSUser{IMSI: body.IMSI, MSISDN: body.MSISDN, NeUID: neInfo.NeUID}) + hasMsisdns := s.udmVolteIMSService.Find(model.UDMVolteIMSUser{IMSI: body.IMSI, MSISDN: body.MSISDN, NeID: neInfo.ID}) if len(hasMsisdns) > 0 { c.JSON(200, resp.ErrMsg("IMSI and MSISDN already exist")) return @@ -235,7 +242,7 @@ func (s *UDMVolteIMSController) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmVolteIMSService.InsertByIMSI(neInfo.CoreUID, neInfo.NeUID, body.IMSI) + s.udmVolteIMSService.InsertByIMSI(neInfo.ID, body.IMSI) } c.JSON(200, resp.OkData(data)) } @@ -247,9 +254,7 @@ func (s *UDMVolteIMSController) Add(c *gin.Context) { // @Tags network_data/udm/volte-ims // @Accept json // @Produce json -// @Param coreUid query string true "CoreUID" default(001) -// @Param neUid query string true "NeUID" default(001) -// @Param imsi query string true "IMSI" +// @Param neUid query string true "NE UID" default(8I73Y01Z)// @Param imsi query string true "IMSI" // @Param num query number true "Number of releases, value includes start imsi" // @Param msisdn query string false "MSISDN" // @Success 200 {object} object "Response Results" @@ -260,12 +265,11 @@ func (s *UDMVolteIMSController) Add(c *gin.Context) { func (s *UDMVolteIMSController) Remove(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - IMSI string `form:"imsi" binding:"required"` // IMSi, 带数量时为批量 - MSISDN string `form:"msisdn" binding:"required"` // MSISDN, 带数量时为批量 - Tag string `form:"tag" binding:"required,oneof=0 1"` // tag - Num int64 `form:"num"` // 批量数量 + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + IMSI string `form:"imsi" binding:"required"` // IMSi, 带数量时为批量 + MSISDN string `form:"msisdn" binding:"required"` // MSISDN, 带数量时为批量 + Tag string `form:"tag" binding:"required,oneof=0 1"` // tag + Num int64 `form:"num"` // 批量数量 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -274,13 +278,13 @@ func (s *UDMVolteIMSController) Remove(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(query.CoreUID, query.NeUID) - if neInfo.CoreUID != query.CoreUID || neInfo.NeUID != query.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -305,7 +309,7 @@ func (s *UDMVolteIMSController) Remove(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmVolteIMSService.LoadData(neInfo.CoreUID, neInfo.NeUID, query.IMSI, query.Num) + s.udmVolteIMSService.LoadData(neInfo.ID, query.IMSI, query.Num) } c.JSON(200, resp.OkData(data)) return @@ -320,7 +324,7 @@ func (s *UDMVolteIMSController) Remove(c *gin.Context) { } // 命令ok时 if strings.Contains(data, "ok") { - s.udmVolteIMSService.Delete(neInfo.CoreUID, neInfo.NeUID, query.IMSI) + s.udmVolteIMSService.Delete(neInfo.ID, query.IMSI) } c.JSON(200, resp.OkData(data)) } @@ -332,9 +336,7 @@ func (s *UDMVolteIMSController) Remove(c *gin.Context) { // @Tags network_data/udm/volte-ims // @Accept json // @Produce json -// @Param coreUid query string true "CoreUID" default(001) -// @Param neUid query string true "NeUID" default(001) -// @Param type query string true "File Type" Enums(csv,txt) default(txt) +// @Param neUid query string true "NE UID" default(8I73Y01Z)/ @Param type query string true "File Type" Enums(csv,txt) default(txt) // @Param imsi query string false "IMSI" // @Param pageNum query number true "pageNum" default(1) // @Param pageSize query number true "pageSize" default(10) @@ -346,8 +348,8 @@ func (s *UDMVolteIMSController) Remove(c *gin.Context) { func (s *UDMVolteIMSController) Export(c *gin.Context) { language := reqctx.AcceptLanguage(c) neUid := c.Query("neUid") - if c.Query("coreUid") == "" || neUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid or neUid is empty")) + if neUid == "" { + c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neUid is empty")) return } fileType := c.Query("type") @@ -419,7 +421,6 @@ func (s *UDMVolteIMSController) Export(c *gin.Context) { func (s *UDMVolteIMSController) Import(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 UploadPath string `json:"uploadPath" binding:"required"` // 上传文件路径 } @@ -436,13 +437,13 @@ func (s *UDMVolteIMSController) Import(c *gin.Context) { } // 查询网元信息 - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID || neInfo.NeType != "UDM" { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -466,7 +467,7 @@ func (s *UDMVolteIMSController) Import(c *gin.Context) { } // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, 1) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 1) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -489,11 +490,11 @@ func (s *UDMVolteIMSController) Import(c *gin.Context) { if strings.Contains(resultMsg, "ok") { if strings.HasSuffix(body.UploadPath, ".csv") { data := file.ReadFileCSV(localFilePath) - go s.udmVolteIMSService.InsertData(neInfo.CoreUID, neInfo.NeUID, "csv", data) + go s.udmVolteIMSService.InsertData(neInfo.ID, "csv", data) } if strings.HasSuffix(body.UploadPath, ".txt") { data := file.ReadFileTXTLine(",", localFilePath) - go s.udmVolteIMSService.InsertData(neInfo.CoreUID, neInfo.NeUID, "txt", data) + go s.udmVolteIMSService.InsertData(neInfo.ID, "txt", data) } } c.JSON(200, resp.OkMsg(resultMsg)) diff --git a/src/modules/ne_data_nf/controller/upf.go b/src/modules/ne_data_nf/controller/upf.go index e0f6c5eb..6383d8e7 100644 --- a/src/modules/ne_data_nf/controller/upf.go +++ b/src/modules/ne_data_nf/controller/upf.go @@ -43,29 +43,28 @@ type UPFController struct { // @Router /nf/upf/kpi/flow-total [get] func (s UPFController) KPIFlowTotal(c *gin.Context) { language := reqctx.AcceptLanguage(c) - var querys struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 - Day int `form:"day"` + var query struct { + NeUID string `form:"neUid" binding:"required"` // 网元唯一标识 + Day int `form:"day"` } - if err := c.ShouldBindQuery(&querys); err != nil { + if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs)) return } - if querys.Day < 0 || querys.Day > 30 { + if query.Day < 0 || query.Day > 30 { c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "day must be between 0 and 30")) return } - // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUID, querys.NeUID) - if neInfo.CoreUID != querys.CoreUID || neInfo.NeUID != querys.NeUID { + // 查询网元信息 + neInfo := s.neInfoService.FindByNeUid(query.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUID || neInfo.NeType != "UDM" { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } - up, down := s.kpiReportService.UPFTodayFlowFind(neInfo.NeUID, querys.Day) + up, down := s.kpiReportService.UPFTodayFlowFind(neInfo.ID, query.Day) c.JSON(200, resp.OkData(map[string]int64{"up": up, "down": down})) } diff --git a/src/modules/ne_data_nf/fetch_link/alarm.go b/src/modules/ne_data_nf/fetch_link/alarm.go index 286d8f1b..d8ff5d65 100644 --- a/src/modules/ne_data_nf/fetch_link/alarm.go +++ b/src/modules/ne_data_nf/fetch_link/alarm.go @@ -13,7 +13,7 @@ import ( // AlarmHistory 告警历史记录 func AlarmHistory(neInfo model.NeInfo) ([]map[string]any, error) { // 网元参数配置信息 - neUrl := fmt.Sprintf("http://%s:%d/api/rest/faultManagement/v1/elementType/%s/objectType/alarms", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType)) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/faultManagement/v1/elementType/%s/objectType/alarms", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType)) resBytes, err := fetch.Get(neUrl, nil, 60_000) var resData []map[string]any if err != nil { diff --git a/src/modules/ne_data_nf/fetch_link/amf.go b/src/modules/ne_data_nf/fetch_link/amf.go index 31b897cc..82e03ef1 100644 --- a/src/modules/ne_data_nf/fetch_link/amf.go +++ b/src/modules/ne_data_nf/fetch_link/amf.go @@ -16,7 +16,7 @@ import ( // // 返回结果 [] func AMFNbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbInfo", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbInfo", neInfo.IpAddr, neInfo.Port) // 查询参数拼接 query := []string{} if v, ok := data["id"]; ok && v != "" { @@ -59,7 +59,7 @@ func AMFNbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]an // // 返回结果 [] func AMFGnbStateList(neInfo model.NeInfo) ([]map[string]any, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbState", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbState", neInfo.IpAddr, neInfo.Port) resBytes, err := fetch.Get(neUrl, nil, 60_000) if err != nil { errStr := err.Error() diff --git a/src/modules/ne_data_nf/fetch_link/hlr.go b/src/modules/ne_data_nf/fetch_link/hlr.go index 622bc4d2..b6ffcead 100644 --- a/src/modules/ne_data_nf/fetch_link/hlr.go +++ b/src/modules/ne_data_nf/fetch_link/hlr.go @@ -18,7 +18,7 @@ import ( // data参数 {traceID:"跟踪任务ID", imsi:"IMSI和MSISDN必填一个,都带的话以IMSI为准", msisdn:""} func HLRTraceStart(neInfo model.NeInfo, data map[string]any) (string, error) { // 网元参数配置新增(array) - neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/add-task", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/add-task", neInfo.IpAddr, neInfo.Port) resBytes, err := fetch.PostJSON(neUrl, data, nil) var resData map[string]string if err != nil { @@ -45,7 +45,7 @@ func HLRTraceStart(neInfo model.NeInfo, data map[string]any) (string, error) { // data参数 {traceIDArray: ["跟踪任务ID数组"]} func HLRTraceStop(neInfo model.NeInfo, data map[string]any) (string, error) { // 网元参数配置新增(array) - neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/delete-task", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/trace-manage/v1/delete-task", neInfo.IpAddr, neInfo.Port) resBytes, err := fetch.PostJSON(neUrl, data, nil) var resData map[string]string if err != nil { diff --git a/src/modules/ne_data_nf/fetch_link/ims.go b/src/modules/ne_data_nf/fetch_link/ims.go index 49ad1518..afd675ff 100644 --- a/src/modules/ne_data_nf/fetch_link/ims.go +++ b/src/modules/ne_data_nf/fetch_link/ims.go @@ -15,7 +15,7 @@ import ( // // 返回结果 0 func IMSUeSessionNum(neInfo model.NeInfo) (int64, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/ims/objectType/ueNum", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/ims/objectType/ueNum", neInfo.IpAddr, neInfo.Port) resBytes, err := fetch.Get(neUrl, nil, 60_000) if err != nil { errStr := err.Error() @@ -47,7 +47,7 @@ func IMSUeSessionNum(neInfo model.NeInfo) (int64, error) { // // 返回结果 [] func IMSUeSessionList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/ims/objectType/ueInfo", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/ims/objectType/ueInfo", neInfo.IpAddr, neInfo.Port) // 查询参数拼接 query := []string{} if v, ok := data["imsi"]; ok && v != "" { diff --git a/src/modules/ne_data_nf/fetch_link/mme.go b/src/modules/ne_data_nf/fetch_link/mme.go index c7650004..b590d12c 100644 --- a/src/modules/ne_data_nf/fetch_link/mme.go +++ b/src/modules/ne_data_nf/fetch_link/mme.go @@ -16,7 +16,7 @@ import ( // // 返回结果 [] func MMENbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/mme/objectType/nbInfo", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/mme/objectType/nbInfo", neInfo.IpAddr, neInfo.Port) // 查询参数拼接 query := []string{} if v, ok := data["id"]; ok && v != "" { @@ -59,7 +59,7 @@ func MMENbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]an // // 返回结果 [] func MMEEnbStateList(neInfo model.NeInfo) ([]map[string]any, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/mme/objectType/nbState", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/mme/objectType/nbState", neInfo.IpAddr, neInfo.Port) resBytes, err := fetch.Get(neUrl, nil, 60_000) if err != nil { errStr := err.Error() diff --git a/src/modules/ne_data_nf/fetch_link/n3iwf.go b/src/modules/ne_data_nf/fetch_link/n3iwf.go index 8ef54f5e..fbe63dd8 100644 --- a/src/modules/ne_data_nf/fetch_link/n3iwf.go +++ b/src/modules/ne_data_nf/fetch_link/n3iwf.go @@ -16,7 +16,7 @@ import ( // // 返回结果 {"rows":[],"total":0} func N3IWFSubInfoList(neInfo model.NeInfo, data map[string]string) (map[string]any, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/n3iwf/objectType/ueInfo", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/n3iwf/objectType/ueInfo", neInfo.IpAddr, neInfo.Port) // 查询参数拼接 query := []string{} if v, ok := data["imsi"]; ok && v != "" { diff --git a/src/modules/ne_data_nf/fetch_link/ne_config.go b/src/modules/ne_data_nf/fetch_link/ne_config.go index 5ad6105e..1949d060 100644 --- a/src/modules/ne_data_nf/fetch_link/ne_config.go +++ b/src/modules/ne_data_nf/fetch_link/ne_config.go @@ -13,11 +13,11 @@ import ( // NeConfigOMC 网元配置对端网管信息 func NeConfigOMC(neInfo model.NeInfo) (map[string]any, error) { // 网元配置对端网管信息 - neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType)) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/omcNeConfig", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType)) resBytes, err := fetch.PutJSON(neUrl, map[string]any{ - "rmUID": neInfo.CoreUID, - "neId": neInfo.NeName, - "neName": neInfo.NeUID, + "rmUID": neInfo.NeUid, + "neId": fmt.Sprintf("%d", neInfo.ID), + "neName": neInfo.NeName, "port": neInfo.Port, "province": neInfo.Province, "pvFlag": neInfo.PvFlag, @@ -53,7 +53,7 @@ func NeConfigOMC(neInfo model.NeInfo) (map[string]any, error) { // NeConfigInfo 网元配置信息 func NeConfigInfo(neInfo model.NeInfo, paramName string) (map[string]any, error) { // 网元参数配置信息 - neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName) resBytes, err := fetch.Get(neUrl, nil, 30_000) if err != nil { logger.Warnf("NeConfigInfo Get \"%s\"", neUrl) @@ -82,7 +82,7 @@ func NeConfigUpdate(neInfo model.NeInfo, paramName, loc string, data map[string] loc = fmt.Sprintf("?loc=%v", loc) } // 网元参数配置新增(array) - neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s%s", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s%s", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc) resBytes, err := fetch.PutJSON(neUrl, data, nil) var resData map[string]any if err != nil { @@ -112,7 +112,7 @@ func NeConfigUpdate(neInfo model.NeInfo, paramName, loc string, data map[string] // NeConfigAdd 网元配置新增 array func NeConfigAdd(neInfo model.NeInfo, paramName, loc string, data map[string]any) (map[string]any, error) { // 网元参数配置新增(array) - neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s?loc=%v", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s?loc=%v", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc) resBytes, err := fetch.PostJSON(neUrl, data, nil) var resData map[string]any if err != nil { @@ -142,7 +142,7 @@ func NeConfigAdd(neInfo model.NeInfo, paramName, loc string, data map[string]any // NeConfigDelete 网元配置删除 array func NeConfigDelete(neInfo model.NeInfo, paramName, loc string) (map[string]any, error) { // 网元参数配置删除(array) - neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s?loc=%v", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s?loc=%v", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType), paramName, loc) resBytes, err := fetch.Delete(neUrl, nil) var resData map[string]any if err != nil { diff --git a/src/modules/ne_data_nf/fetch_link/ne_state.go b/src/modules/ne_data_nf/fetch_link/ne_state.go index 96178be0..efc20b61 100644 --- a/src/modules/ne_data_nf/fetch_link/ne_state.go +++ b/src/modules/ne_data_nf/fetch_link/ne_state.go @@ -15,7 +15,7 @@ import ( // NeState 获取网元端服务状态 func NeState(neInfo model.NeInfo) (map[string]any, error) { // 网元状态 - neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", neInfo.IPAddr, neInfo.Port, strings.ToLower(neInfo.NeType)) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/systemState", neInfo.IpAddr, neInfo.Port, strings.ToLower(neInfo.NeType)) resBytes, err := fetch.Get(neUrl, nil, 1000) if err != nil { logger.Errorf("NeState %s", err.Error()) @@ -41,11 +41,12 @@ func NeState(neInfo model.NeInfo) (map[string]any, error) { } info := map[string]any{ - "coreUid": neInfo.CoreUID, - "neUid": neInfo.NeUID, + "coreId": neInfo.CoreId, + "neId": neInfo.ID, + "neUid": neInfo.NeUid, "neType": neInfo.NeType, "neName": neInfo.NeName, - "ipAddr": neInfo.IPAddr, + "ipAddr": neInfo.IpAddr, "refreshTime": time.Now().UnixMilli(), // 获取时间 "standby": resData["standby"], // 是否备用服务 "version": resData["version"], diff --git a/src/modules/ne_data_nf/fetch_link/ne_trace.go b/src/modules/ne_data_nf/fetch_link/ne_trace.go index 1e988952..ac2716cc 100644 --- a/src/modules/ne_data_nf/fetch_link/ne_trace.go +++ b/src/modules/ne_data_nf/fetch_link/ne_trace.go @@ -13,7 +13,7 @@ import ( // NeTraceAdd 网元跟踪任务新增 func NeTraceAdd(neInfo model.NeInfo, data any) (map[string]any, error) { // 跟踪任务创建 - neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v2/%s/subscriptions", neInfo.IPAddr, neInfo.Port, neInfo.NeType) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v2/%s/subscriptions", neInfo.IpAddr, neInfo.Port, neInfo.NeType) resBytes, err := fetch.PostJSON(neUrl, data, nil) var resData map[string]any if err != nil { @@ -41,7 +41,7 @@ func NeTraceAdd(neInfo model.NeInfo, data any) (map[string]any, error) { // NeTraceDelete 网元跟踪任务删除 func NeTraceDelete(neInfo model.NeInfo, traceId string) (map[string]any, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v2/%s/subscriptions?id=%s", neInfo.IPAddr, neInfo.Port, neInfo.NeType, traceId) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/traceManagement/v2/%s/subscriptions?id=%s", neInfo.IpAddr, neInfo.Port, neInfo.NeType, traceId) resBytes, err := fetch.Delete(neUrl, nil) var resData map[string]any if err != nil { diff --git a/src/modules/ne_data_nf/fetch_link/nssf.go b/src/modules/ne_data_nf/fetch_link/nssf.go index 6fe99212..be1a3c06 100644 --- a/src/modules/ne_data_nf/fetch_link/nssf.go +++ b/src/modules/ne_data_nf/fetch_link/nssf.go @@ -13,7 +13,7 @@ import ( // // 返回结果 {"rows":[],"total":0} func NSSFSubInfoList(neInfo model.NeInfo) (map[string]any, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/nssf/objectType/subscriptions", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/nssf/objectType/subscriptions", neInfo.IpAddr, neInfo.Port) resBytes, err := fetch.Get(neUrl, nil, 60_000) if err != nil { logger.Warnf("NSSFSubInfo Get \"%s\"", neUrl) @@ -54,7 +54,7 @@ func NSSFSubInfoList(neInfo model.NeInfo) (map[string]any, error) { // // 返回结果 {"rows":[],"total":0} func NSSFAvailableAMFList(neInfo model.NeInfo) (map[string]any, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/nssf/objectType/availableAMFs", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/nssf/objectType/availableAMFs", neInfo.IpAddr, neInfo.Port) resBytes, err := fetch.Get(neUrl, nil, 60_000) if err != nil { logger.Warnf("NSSFAvailableAMFList Get \"%s\"", neUrl) diff --git a/src/modules/ne_data_nf/fetch_link/pcf.go b/src/modules/ne_data_nf/fetch_link/pcf.go index 3748032f..fe49dbc3 100644 --- a/src/modules/ne_data_nf/fetch_link/pcf.go +++ b/src/modules/ne_data_nf/fetch_link/pcf.go @@ -12,7 +12,7 @@ import ( // PCFRuleInfo PCF策略配置查询信息 func PCFRuleInfo(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IpAddr, neInfo.Port) // 查询参数拼接 query := []string{} if v, ok := data["imsi"]; ok && v != "" { @@ -56,7 +56,7 @@ func PCFRuleInfo(neInfo model.NeInfo, data map[string]string) ([]map[string]any, // PCFRuleAdd PCF策略配置添加 func PCFRuleAdd(neInfo model.NeInfo, data any) error { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IpAddr, neInfo.Port) resBytes, err := fetch.PostJSON(neUrl, data, nil) if err != nil { errStr := err.Error() @@ -85,7 +85,7 @@ func PCFRuleAdd(neInfo model.NeInfo, data any) error { // PCFRuleAddBatch PCF策略配置批量添加 func PCFRuleAddBatch(neInfo model.NeInfo, data map[string]any, num int64) error { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d", neInfo.IPAddr, neInfo.Port, num) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d", neInfo.IpAddr, neInfo.Port, num) resBytes, err := fetch.PostJSON(neUrl, data, nil) if err != nil { errStr := err.Error() @@ -114,7 +114,7 @@ func PCFRuleAddBatch(neInfo model.NeInfo, data map[string]any, num int64) error // PCFRuleUpdate PCF策略配置修改 func PCFRuleUpdate(neInfo model.NeInfo, data map[string]any) error { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo", neInfo.IpAddr, neInfo.Port) resBytes, err := fetch.PutJSON(neUrl, data, nil) if err != nil { errStr := err.Error() @@ -139,7 +139,7 @@ func PCFRuleUpdate(neInfo model.NeInfo, data map[string]any) error { // PCFRuleUpdateBatch PCF策略配置批量修改 func PCFRuleUpdateBatch(neInfo model.NeInfo, data map[string]any, num int64) error { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d", neInfo.IPAddr, neInfo.Port, num) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d", neInfo.IpAddr, neInfo.Port, num) resBytes, err := fetch.PutJSON(neUrl, data, nil) if err != nil { errStr := err.Error() @@ -164,7 +164,7 @@ func PCFRuleUpdateBatch(neInfo model.NeInfo, data map[string]any, num int64) err // PCFRuleDelete PCF策略配置删除 func PCFRuleDelete(neInfo model.NeInfo, imsi string) error { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?imsi=%s", neInfo.IPAddr, neInfo.Port, imsi) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo?imsi=%s", neInfo.IpAddr, neInfo.Port, imsi) resBytes, err := fetch.Delete(neUrl, nil) if err != nil { errStr := err.Error() @@ -193,7 +193,7 @@ func PCFRuleDelete(neInfo model.NeInfo, imsi string) error { // PCFRuleDeleteBatch PCF策略配置批量删除 func PCFRuleDeleteBatch(neInfo model.NeInfo, imsi string, num int64) error { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d?imsi=%s", neInfo.IPAddr, neInfo.Port, num, imsi) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/batch/%d?imsi=%s", neInfo.IpAddr, neInfo.Port, num, imsi) resBytes, err := fetch.Delete(neUrl, nil) if err != nil { errStr := err.Error() @@ -222,7 +222,7 @@ func PCFRuleDeleteBatch(neInfo model.NeInfo, imsi string, num int64) error { // PCFRuleExport PCF策略配置导出 func PCFRuleExport(neInfo model.NeInfo, data map[string]string) ([]byte, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/export", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/export", neInfo.IpAddr, neInfo.Port) // 查询参数拼接 query := []string{} if v, ok := data["fileType"]; ok && v != "" { @@ -243,7 +243,7 @@ func PCFRuleExport(neInfo model.NeInfo, data map[string]string) ([]byte, error) // PCFRuleImport PCF策略配置导入 func PCFRuleImport(neInfo model.NeInfo, data map[string]any) (string, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/import", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/pcf/objectType/ueInfo/file/import", neInfo.IpAddr, neInfo.Port) resBytes, err := fetch.PutJSON(neUrl, data, nil) var resData map[string]any if err != nil { diff --git a/src/modules/ne_data_nf/fetch_link/smf.go b/src/modules/ne_data_nf/fetch_link/smf.go index e96e87ab..c103c65a 100644 --- a/src/modules/ne_data_nf/fetch_link/smf.go +++ b/src/modules/ne_data_nf/fetch_link/smf.go @@ -15,7 +15,7 @@ import ( // // 返回结果 0 func SMFSubNum(neInfo model.NeInfo) (int64, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/smf/objectType/ueNum", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/smf/objectType/ueNum", neInfo.IpAddr, neInfo.Port) resBytes, err := fetch.Get(neUrl, nil, 60_000) if err != nil { errStr := err.Error() @@ -47,7 +47,7 @@ func SMFSubNum(neInfo model.NeInfo) (int64, error) { // // 返回结果 {"rows":[],"total":0} func SMFSubInfoList(neInfo model.NeInfo, data map[string]string) (map[string]any, error) { - neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/smf/objectType/ueInfo", neInfo.IPAddr, neInfo.Port) + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/smf/objectType/ueInfo", neInfo.IpAddr, neInfo.Port) // 查询参数拼接 query := []string{} if v, ok := data["imsi"]; ok && v != "" { diff --git a/src/modules/ne_data_nf/model/cdr_event.go b/src/modules/ne_data_nf/model/cdr_event.go index 7e330280..2be514d7 100644 --- a/src/modules/ne_data_nf/model/cdr_event.go +++ b/src/modules/ne_data_nf/model/cdr_event.go @@ -2,13 +2,11 @@ package model // CDREvent CDR会话对象 cdr_event type CDREvent struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到的timestamp秒级存储毫秒时间戳 - CdrJson string `json:"cdrJSON" gorm:"column:cdr_json"` // data JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 记录创建存储毫秒 + RecordTime int64 `json:"recordTime" gorm:"column:record_time"` // 记录时间 + CdrJson string `json:"cdrJson" gorm:"column:cdr_json"` // data JSON String } // TableName 表名称 diff --git a/src/modules/ne_data_nf/model/udm_auth.go b/src/modules/ne_data_nf/model/udm_auth.go index fe0ded45..92b815ba 100644 --- a/src/modules/ne_data_nf/model/udm_auth.go +++ b/src/modules/ne_data_nf/model/udm_auth.go @@ -2,16 +2,14 @@ package model // UDMAuthUser UDM鉴权用户 udm_auth type UDMAuthUser struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 - CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type" binding:"required,oneof=UDM"` // 网元类型 - IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID - Amf string `json:"amf" gorm:"column:amf"` // AMF - Ki string `json:"ki" gorm:"column:ki"` // ki - AlgoIndex string `json:"algoIndex" gorm:"column:algo_index"` // algoIndex - Opc string `json:"opc" gorm:"column:opc"` // OPC - CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID + Amf string `json:"amf" gorm:"column:amf"` // AMF + Ki string `json:"ki" gorm:"column:ki"` // ki + AlgoIndex string `json:"algoIndex" gorm:"column:algo_index"` // algoIndex + Opc string `json:"opc" gorm:"column:opc"` // OPC + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 } // TableName 表名称 diff --git a/src/modules/ne_data_nf/model/udm_extend.go b/src/modules/ne_data_nf/model/udm_extend.go index 52ba6a30..956127a7 100644 --- a/src/modules/ne_data_nf/model/udm_extend.go +++ b/src/modules/ne_data_nf/model/udm_extend.go @@ -2,12 +2,10 @@ package model // UDMExtend UDM用户IMSI扩展信息 udm_extend type UDMExtend struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 - IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID - MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID + MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 Remark string `json:"remark" gorm:"column:remark"` // 备注 } diff --git a/src/modules/ne_data_nf/model/udm_sub.go b/src/modules/ne_data_nf/model/udm_sub.go index 4febbe63..1c51028d 100644 --- a/src/modules/ne_data_nf/model/udm_sub.go +++ b/src/modules/ne_data_nf/model/udm_sub.go @@ -2,12 +2,10 @@ package model // UDMSubUser UDM签约用户 udm_sub type UDMSubUser struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 - CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type" binding:"required,oneof=UDM"` // 网元类型 - IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID - MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID + MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 AmDat string `json:"amDat" gorm:"column:am_dat"` // AmData UeAmbrTpl string `json:"ambr" gorm:"column:ambr"` // AmData SubUeAMBRTemp diff --git a/src/modules/ne_data_nf/model/udm_voip.go b/src/modules/ne_data_nf/model/udm_voip.go index 4fcfb8cd..8f11a377 100644 --- a/src/modules/ne_data_nf/model/udm_voip.go +++ b/src/modules/ne_data_nf/model/udm_voip.go @@ -2,10 +2,8 @@ package model // UDMVOIPUser UDMVOIP用户 udm_voip type UDMVOIPUser struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 - CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type" binding:"required,oneof=UDM"` // 网元类型 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID UserName string `json:"username" gorm:"column:username"` // 用户名 Password string `json:"password" gorm:"column:password"` // 密码 diff --git a/src/modules/ne_data_nf/model/udm_volte_ims.go b/src/modules/ne_data_nf/model/udm_volte_ims.go index f566392b..f23e79a5 100644 --- a/src/modules/ne_data_nf/model/udm_volte_ims.go +++ b/src/modules/ne_data_nf/model/udm_volte_ims.go @@ -2,12 +2,10 @@ package model // UDMVolteIMSUser UDMVolteIMS用户 udm_volte_ims type UDMVolteIMSUser struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 - CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid" binding:"required"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type" binding:"required,oneof=UDM"` // 网元类型 - IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID - MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID + MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 Tag string `json:"tag" gorm:"column:tag"` // 0=VoIP, 1=VoLTE VNI string `json:"vni" gorm:"column:vni"` // VNI diff --git a/src/modules/ne_data_nf/model/ue_event.go b/src/modules/ne_data_nf/model/ue_event.go index cadabc3c..4cb77084 100644 --- a/src/modules/ne_data_nf/model/ue_event.go +++ b/src/modules/ne_data_nf/model/ue_event.go @@ -2,14 +2,12 @@ package model // UEEvent UE会话对象 ue_event type UEEvent struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 - Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` // 接收到时间 - EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 - EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` // data JSON String - CreatedAt int64 `json:"createdAt" gorm:"column:created_at"` // 记录创建存储毫秒 + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeID int64 `json:"neId" gorm:"column:ne_id" binding:"required"` // 网元ID + CreatedTime int64 `json:"createdTime" gorm:"column:created_time"` // 记录创建存储毫秒 + RecordTime int64 `json:"recordTime" gorm:"column:record_time"` // 记录时间 + EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 + EventJson string `json:"eventJson" gorm:"column:event_json"` // data JSON String } // TableName 表名称 diff --git a/src/modules/ne_data_nf/repository/cdr_event.go b/src/modules/ne_data_nf/repository/cdr_event.go index 8bdd7ad5..4ab934ee 100644 --- a/src/modules/ne_data_nf/repository/cdr_event.go +++ b/src/modules/ne_data_nf/repository/cdr_event.go @@ -8,6 +8,7 @@ import ( "be.ems/src/framework/database/db" "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" "be.ems/src/modules/ne_data_nf/model" ) @@ -19,27 +20,25 @@ type CDREvent struct{} // SelectByPage 分页查询集合 func (r CDREvent) SelectByPage(neType string, query map[string]string) ([]model.CDREvent, int64) { + // 查询结果 + var total int64 = 0 + rows := []model.CDREvent{} + if neType == "" { + return rows, total + } + // 表名 tableName := fmt.Sprintf("cdr_event_%s", strings.ToLower(neType)) tx := db.DB("").Table(tableName).Model(&model.CDREvent{}) // 查询条件拼接 - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) - } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid = ?", v) + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) } if v, ok := query["beginTime"]; ok && v != "" { - if len(v) == 10 { - v = v + "000" - } - tx = tx.Where("created_at >= ?", v) + tx = tx.Where("created_time >= ?", parse.Number(v)) } if v, ok := query["endTime"]; ok && v != "" { - if len(v) == 10 { - v = v + "000" - } - tx = tx.Where("created_at <= ?", v) + tx = tx.Where("created_time <= ?", parse.Number(v)) } // 各个网元特殊查询条件 @@ -85,20 +84,16 @@ func (r CDREvent) SelectByPage(neType string, query map[string]string) ([]model. } } - var total int64 = 0 - rows := []model.CDREvent{} - // 查询数量 长度为0直接返回 if err := tx.Count(&total).Error; err != nil || total <= 0 { return rows, total } // 分页 - pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) - if pageNum == 0 && pageSize > int(total) { - pageSize = int(total) + if query["pageNum"] != "" && query["pageSize"] != "" { + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) } - tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) // 查询数据 if err := tx.Find(&rows).Error; err != nil { @@ -106,60 +101,60 @@ func (r CDREvent) SelectByPage(neType string, query map[string]string) ([]model. } // 排序 - if v, ok := query["sortField"]; ok && v != "" { - sortField := v - sortOrder := "asc" - if o, ok := query["sortOrder"]; ok && o != "" { - if o == "desc" { - sortOrder = "desc" - } else { - sortOrder = "asc" - } - } - sort.SliceStable(rows, func(i, j int) bool { - // 支持的排序字段映射 - fieldGetters := map[string]func(*model.CDREvent) any{ - "id": func(row *model.CDREvent) any { return row.ID }, - "timestamp": func(row *model.CDREvent) any { return row.Timestamp }, - // 可添加更多支持的字段 - } - - // 获取字段 getter 函数 - getter, ok := fieldGetters[sortField] - if !ok { - // 非法字段,使用默认排序(id升序) - return rows[i].ID < rows[j].ID - } - - // 获取比较值 - valI, valJ := getter(&rows[i]), getter(&rows[j]) - - // 根据字段类型进行比较 - switch v := valI.(type) { - case int64: - if sortOrder == "desc" { - return v > valJ.(int64) - } - return v < valJ.(int64) - case string: - if sortOrder == "desc" { - return v > valJ.(string) - } - return v < valJ.(string) - default: - // 不支持的字段类型,使用默认排序 - return rows[i].ID < rows[j].ID - } - }) + if query["sortField"] != "" && query["sortOrder"] != "" { + r.sortRows(query["sortField"], query["sortOrder"], rows) } - return rows, total } +// sortRows 排序数据集合 +// sortField 排序字段 支持id timeGroup createdAt +// sortOrder 排序顺序 升序asc 降序desc +func (r CDREvent) sortRows(sortField, sortOrder string, rows []model.CDREvent) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.CDREvent) any{ + "id": func(row *model.CDREvent) any { return row.ID }, + "createdTime": func(row *model.CDREvent) any { return row.CreatedTime }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // SelectByIds 通过ID查询 func (r CDREvent) SelectByIds(neType string, ids []int64) []model.CDREvent { rows := []model.CDREvent{} - if len(ids) <= 0 { + if len(ids) <= 0 || neType == "" { return rows } // 表名 @@ -177,7 +172,7 @@ func (r CDREvent) SelectByIds(neType string, ids []int64) []model.CDREvent { // DeleteByIds 批量删除信息 func (r CDREvent) DeleteByIds(neType string, ids []int64) int64 { - if len(ids) <= 0 { + if len(ids) <= 0 || neType == "" { return 0 } // 表名 @@ -191,15 +186,15 @@ func (r CDREvent) DeleteByIds(neType string, ids []int64) int64 { } // Insert 新增信息 返回新增数据ID -func (r CDREvent) Insert(param model.CDREvent) int64 { - if param.NeType == "" { +func (r CDREvent) Insert(neType string, param model.CDREvent) int64 { + if neType == "" { return 0 } - if param.CreatedAt == 0 { - param.CreatedAt = time.Now().UnixMilli() + if param.CreatedTime == 0 { + param.CreatedTime = time.Now().UnixMilli() } // 表名 - tableName := fmt.Sprintf("cdr_event_%s", strings.ToLower(param.NeType)) + tableName := fmt.Sprintf("cdr_event_%s", strings.ToLower(neType)) // 执行插入 if err := db.DB("").Table(tableName).Create(¶m).Error; err != nil { logger.Errorf("insert err => %v", err.Error()) diff --git a/src/modules/ne_data_nf/repository/udm_auth.go b/src/modules/ne_data_nf/repository/udm_auth.go index 42a333ee..5e1ada2c 100644 --- a/src/modules/ne_data_nf/repository/udm_auth.go +++ b/src/modules/ne_data_nf/repository/udm_auth.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" "be.ems/src/framework/database/db" @@ -16,10 +17,10 @@ var NewUDMAuthUser = &UDMAuthUser{} type UDMAuthUser struct{} // ClearAndInsert 清空ne_id后新增实体 -func (r *UDMAuthUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMAuthUser) int64 { +func (r *UDMAuthUser) ClearAndInsert(neid int64, uArr []model.UDMAuthUser) int64 { // 不指定neID时,用 TRUNCATE 清空表快 // _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_auth", nil) - result := db.DB("").Where("core_uid = ? and ne_uid = ?", coreUid, neUid).Unscoped().Delete(&model.UDMAuthUser{}) + result := db.DB("").Where("ne_id = ?", neid).Unscoped().Delete(&model.UDMAuthUser{}) if result.Error != nil { logger.Errorf("Delete err => %v", result.Error) } @@ -30,15 +31,12 @@ func (r *UDMAuthUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMAuth func (r *UDMAuthUser) SelectPage(query map[string]string) ([]model.UDMAuthUser, int64) { tx := db.DB("").Model(&model.UDMAuthUser{}) // 查询条件拼接 + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) + } if v, ok := query["imsi"]; ok && v != "" { tx = tx.Where("imsi like ?", fmt.Sprintf("%%%s%%", v)) } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid = ?", v) - } - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) - } if v, ok := query["imsis"]; ok && v != "" { arr := strings.Split(v, ",") tx = tx.Where("imsi in ?", arr) @@ -58,58 +56,90 @@ func (r *UDMAuthUser) SelectPage(query map[string]string) ([]model.UDMAuthUser, pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) - // 排序 - if v, ok := query["sortField"]; ok && v != "" { - sortSql := v - if o, ok := query["sortOrder"]; ok && o != "" { - if o == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - tx = tx.Order(sortSql) - } - // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query err => %v", err) } + // 排序 + if query["sortField"] != "" && query["sortOrder"] != "" { + r.sortRows(query["sortField"], query["sortOrder"], rows) + } return rows, total } +// sortRows 排序数据集合 +// sortField 排序字段 支持id imsi +// sortOrder 排序顺序 升序asc 降序desc +func (r UDMAuthUser) sortRows(sortField, sortOrder string, rows []model.UDMAuthUser) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.UDMAuthUser) any{ + "id": func(row *model.UDMAuthUser) any { return row.ID }, + "imsi": func(row *model.UDMAuthUser) any { return row.IMSI }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // SelectList 根据实体查询 func (r *UDMAuthUser) SelectList(u model.UDMAuthUser) []model.UDMAuthUser { tx := db.DB("").Model(&model.UDMAuthUser{}) // 查询条件拼接 + if u.NeID != 0 { + tx = tx.Where("ne_id = ?", u.NeID) + } if u.IMSI != "" { tx = tx.Where("imsi = ?", u.IMSI) } - if u.NeUID != "" { - tx = tx.Where("ne_uid = ?", u.NeUID) - } - if u.CoreUID != "" { - tx = tx.Where("core_uid = ?", u.CoreUID) - } // 查询数据 arr := []model.UDMAuthUser{} - if err := tx.Order("imsi asc").Find(&arr).Error; err != nil { + if err := tx.Find(&arr).Error; err != nil { logger.Errorf("query err => %v", err) } return arr } // SelectByIMSI 通过imsi查询 -func (r *UDMAuthUser) SelectByIMSI(coreUid, neUid, imsi string) model.UDMAuthUser { +func (r *UDMAuthUser) SelectByIMSI(neid int64, imsi string) model.UDMAuthUser { tx := db.DB("").Model(&model.UDMAuthUser{}) item := model.UDMAuthUser{} // 查询条件拼接 - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neid) tx = tx.Where("imsi = ?", imsi) // 查询数据 - if err := tx.Order("imsi asc").Limit(1).Find(&item).Error; err != nil { + if err := tx.Limit(1).Find(&item).Error; err != nil { logger.Errorf("query err => %v", err) } return item @@ -125,9 +155,9 @@ func (r *UDMAuthUser) Inserts(uArr []model.UDMAuthUser) int64 { } // Delete 删除实体 -func (r *UDMAuthUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 { +func (r *UDMAuthUser) DeleteByIMSI(neid int64, imsi string) int64 { tx := db.DB("") - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neid) tx = tx.Where("imsi = ?", imsi) tx.Delete(&model.UDMAuthUser{}) if err := tx.Error; err != nil { @@ -137,9 +167,9 @@ func (r *UDMAuthUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 { } // DeletePrefixByIMSI 删除前缀匹配的实体 -func (r *UDMAuthUser) DeletePrefixByIMSI(coreUid, neUid, imsiPrefix string) int64 { +func (r *UDMAuthUser) DeletePrefixByIMSI(neid int64, imsiPrefix string) int64 { tx := db.DB("") - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neid) tx = tx.Where("imsi like ?", fmt.Sprintf("%s%%", imsiPrefix)) tx.Delete(&model.UDMAuthUser{}) if err := tx.Error; err != nil { diff --git a/src/modules/ne_data_nf/repository/udm_extend.go b/src/modules/ne_data_nf/repository/udm_extend.go index 43bfbf7e..0377498b 100644 --- a/src/modules/ne_data_nf/repository/udm_extend.go +++ b/src/modules/ne_data_nf/repository/udm_extend.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "be.ems/src/framework/database/db" "be.ems/src/framework/logger" @@ -18,15 +19,12 @@ type UDMExtend struct{} func (r UDMExtend) SelectByPage(query map[string]string) ([]model.UDMExtend, int64) { tx := db.DB("").Model(&model.UDMExtend{}) // 查询条件拼接 + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) + } if v, ok := query["imsi"]; ok && v != "" { tx = tx.Where("imsi like ?", fmt.Sprintf("%%%s%%", v)) } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid = ?", v) - } - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) - } // 查询结果 var total int64 = 0 @@ -37,40 +35,77 @@ func (r UDMExtend) SelectByPage(query map[string]string) ([]model.UDMExtend, int return rows, total } - // 排序 - if v, ok := query["sortField"]; ok && v != "" { - sortField := v - if o, ok := query["sortOrder"]; ok && o != "" { - sortField = sortField + " desc" - } - tx = tx.Order(sortField) + // 分页 + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) + + // 查询数据 + if err := tx.Find(&rows).Error; err != nil { + logger.Errorf("query err => %v", err) } - // 查询数据分页 - pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) - tx = tx.Limit(pageSize).Offset(pageSize * pageNum) - err := tx.Find(&rows).Error - if err != nil { - logger.Errorf("query find err => %v", err.Error()) - return rows, total + // 排序 + if query["sortField"] != "" && query["sortOrder"] != "" { + r.sortRows(query["sortField"], query["sortOrder"], rows) } return rows, total } +// sortRows 排序数据集合 +// sortField 排序字段 支持id imsi +// sortOrder 排序顺序 升序asc 降序desc +func (r UDMExtend) sortRows(sortField, sortOrder string, rows []model.UDMExtend) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.UDMExtend) any{ + "id": func(row *model.UDMExtend) any { return row.ID }, + "imsi": func(row *model.UDMExtend) any { return row.IMSI }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // SelectList 根据实体查询 func (r *UDMExtend) SelectList(u model.UDMExtend) []model.UDMExtend { tx := db.DB("").Model(&model.UDMExtend{}) // 构建查询条件 + if u.NeID != 0 { + tx = tx.Where("ne_id = ?", u.NeID) + } if u.IMSI != "" { tx = tx.Where("imsi = ?", u.IMSI) } - if u.NeUID != "" { - tx = tx.Where("ne_uid = ?", u.NeUID) - } - if u.CoreUID != "" { - tx = tx.Where("core_uid = ?", u.CoreUID) - } - tx = tx.Order("imsi asc") + // 查询数据 rows := []model.UDMExtend{} if err := tx.Find(&rows).Error; err != nil { @@ -80,15 +115,14 @@ func (r *UDMExtend) SelectList(u model.UDMExtend) []model.UDMExtend { return rows } -// SelectByIMSI 通过imsi查询 neUid为%时模糊imsi查询 -func (r *UDMExtend) SelectByIMSI(coreUid, neUid, imsi string) model.UDMExtend { +// SelectByIMSI 通过imsi查询 neId为0时模糊imsi查询 +func (r *UDMExtend) SelectByIMSI(neid int64, imsi string) model.UDMExtend { tx := db.DB("").Model(&model.UDMExtend{}) // 查询条件拼接 - if neUid == "%" { - tx = tx.Where("core_uid = ?", coreUid) + if neid == 0 { tx = tx.Where("imsi like ?", fmt.Sprintf("%s%%", imsi)) } else { - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neid) tx = tx.Where("imsi = ?", imsi) } // 查询数据 @@ -111,15 +145,14 @@ func (r *UDMExtend) Inserts(uArr []model.UDMExtend) int64 { return tx.RowsAffected } -// Delete 删除实体 neUid为%时模糊imsi前缀 -func (r *UDMExtend) DeleteByIMSI(coreUid, neUid, imsi string) int64 { +// Delete 删除实体 neId为0时模糊imsi前缀 +func (r *UDMExtend) DeleteByIMSI(neid int64, imsi string) int64 { tx := db.DB("") // 查询条件拼接 - if neUid == "%" { - tx = tx.Where("core_uid = ?", coreUid) + if neid == 0 { tx = tx.Where("imsi like ?", fmt.Sprintf("%s%%", imsi)) } else { - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neid) tx = tx.Where("imsi = ?", imsi) } tx = tx.Delete(&model.UDMExtend{}) diff --git a/src/modules/ne_data_nf/repository/udm_sub.go b/src/modules/ne_data_nf/repository/udm_sub.go index 28ee447c..ece9997c 100644 --- a/src/modules/ne_data_nf/repository/udm_sub.go +++ b/src/modules/ne_data_nf/repository/udm_sub.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" "be.ems/src/framework/database/db" @@ -16,10 +17,10 @@ var NewUDMSub = &UDMSubUser{} type UDMSubUser struct{} // ClearAndInsert 清空ne_id后新增实体 -func (r *UDMSubUser) ClearAndInsert(coreUid, neUid string, u []model.UDMSubUser) int64 { +func (r *UDMSubUser) ClearAndInsert(neid int64, u []model.UDMSubUser) int64 { // 不指定neID时,用 TRUNCATE 清空表快 // _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_sub", nil) - result := db.DB("").Where("core_uid = ? and ne_uid = ?", neUid).Unscoped().Delete(&model.UDMSubUser{}) + result := db.DB("").Where("ne_id = ?", neid).Unscoped().Delete(&model.UDMSubUser{}) if result.Error != nil { logger.Errorf("Delete err => %v", result.Error) } @@ -30,18 +31,15 @@ func (r *UDMSubUser) ClearAndInsert(coreUid, neUid string, u []model.UDMSubUser) func (r *UDMSubUser) SelectPage(query map[string]string) ([]model.UDMSubUser, int64) { tx := db.DB("").Model(&model.UDMSubUser{}) // 查询条件拼接 + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) + } if v, ok := query["imsi"]; ok && v != "" { tx = tx.Where("imsi like ?", fmt.Sprintf("%%%s%%", v)) } if v, ok := query["msisdn"]; ok && v != "" { tx = tx.Where("msisdn like ?", fmt.Sprintf("%%%s%%", v)) } - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) - } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid = ?", v) - } if v, ok := query["imsis"]; ok && v != "" { arr := strings.Split(v, ",") tx = tx.Where("imsi in ?", arr) @@ -61,57 +59,90 @@ func (r *UDMSubUser) SelectPage(query map[string]string) ([]model.UDMSubUser, in pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) - // 排序 - if v, ok := query["sortField"]; ok && v != "" { - sortSql := v - if o, ok := query["sortOrder"]; ok && o != "" { - if o == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - tx = tx.Order(sortSql) - } - // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query err => %v", err) } + // 排序 + if query["sortField"] != "" && query["sortOrder"] != "" { + r.sortRows(query["sortField"], query["sortOrder"], rows) + } return rows, total } +// sortRows 排序数据集合 +// sortField 排序字段 支持id imsi +// sortOrder 排序顺序 升序asc 降序desc +func (r UDMSubUser) sortRows(sortField, sortOrder string, rows []model.UDMSubUser) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.UDMSubUser) any{ + "id": func(row *model.UDMSubUser) any { return row.ID }, + "imsi": func(row *model.UDMSubUser) any { return row.IMSI }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // SelectList 根据实体查询 func (r *UDMSubUser) SelectList(u model.UDMSubUser) []model.UDMSubUser { tx := db.DB("").Model(&model.UDMSubUser{}) // 查询条件拼接 + if u.NeID != 0 { + tx = tx.Where("ne_id = ?", u.NeID) + } if u.IMSI != "" { tx = tx.Where("imsi = ?", u.IMSI) } - if u.NeUID != "" { - tx = tx.Where("ne_uid = ?", u.NeUID) - } - if u.CoreUID != "" { - tx = tx.Where("core_uid = ?", u.CoreUID) - } + // 查询数据 arr := []model.UDMSubUser{} - if err := tx.Order("imsi asc").Find(&arr).Error; err != nil { + if err := tx.Find(&arr).Error; err != nil { logger.Errorf("query err => %v", err) } return arr } // SelectByIMSIAndNeID 通过imsi查询 -func (r *UDMSubUser) SelectByIMSI(coreUid, neUid, imsi string) model.UDMSubUser { +func (r *UDMSubUser) SelectByIMSI(neId int64, imsi string) model.UDMSubUser { tx := db.DB("").Model(&model.UDMSubUser{}) item := model.UDMSubUser{} // 查询条件拼接 - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neId) tx = tx.Where("imsi = ?", imsi) // 查询数据 - if err := tx.Order("imsi asc").Limit(1).Find(&item).Error; err != nil { + if err := tx.Limit(1).Find(&item).Error; err != nil { logger.Errorf("query err => %v", err) } return item @@ -127,9 +158,9 @@ func (r *UDMSubUser) Inserts(uArr []model.UDMSubUser) int64 { } // DeleteByIMSI 删除实体 -func (r *UDMSubUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 { +func (r *UDMSubUser) DeleteByIMSI(neId int64, imsi string) int64 { tx := db.DB("") - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neId) tx = tx.Where("imsi = ?", imsi) tx.Delete(&model.UDMSubUser{}) if err := tx.Error; err != nil { @@ -139,9 +170,9 @@ func (r *UDMSubUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 { } // DeletePrefixByIMSI 删除前缀匹配的实体 -func (r *UDMSubUser) DeletePrefixByIMSI(coreUid, neUid, imsiPrefix string) int64 { +func (r *UDMSubUser) DeletePrefixByIMSI(neId int64, imsiPrefix string) int64 { tx := db.DB("") - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neId) tx = tx.Where("imsi like ?", fmt.Sprintf("%s%%", imsiPrefix)) tx.Delete(&model.UDMSubUser{}) if err := tx.Error; err != nil { diff --git a/src/modules/ne_data_nf/repository/udm_voip.go b/src/modules/ne_data_nf/repository/udm_voip.go index 07feaa5c..2c3a78f8 100644 --- a/src/modules/ne_data_nf/repository/udm_voip.go +++ b/src/modules/ne_data_nf/repository/udm_voip.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" "be.ems/src/framework/database/db" @@ -16,10 +17,10 @@ var NewUDMVOIPUser = &UDMVOIPUser{} type UDMVOIPUser struct{} // ClearAndInsert 清空ne_id后新增实体 -func (r UDMVOIPUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMVOIPUser) int64 { +func (r UDMVOIPUser) ClearAndInsert(neId int64, uArr []model.UDMVOIPUser) int64 { // 不指定neID时,用 TRUNCATE 清空表快 // _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_voip", nil) - result := db.DB("").Where("core_uid = ? and ne_uid = ?", coreUid, neUid).Unscoped().Delete(&model.UDMVOIPUser{}) + result := db.DB("").Where("ne_id = ?", neId).Unscoped().Delete(&model.UDMVOIPUser{}) if result.Error != nil { logger.Errorf("Delete err => %v", result.Error) } @@ -30,15 +31,12 @@ func (r UDMVOIPUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMVOIPU func (r UDMVOIPUser) SelectPage(query map[string]string) ([]model.UDMVOIPUser, int64) { tx := db.DB("").Model(&model.UDMVOIPUser{}) // 查询条件拼接 + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_uid = ?", v) + } if v, ok := query["username"]; ok && v != "" { tx = tx.Where("username like ?", fmt.Sprintf("%%%s%%", v)) } - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) - } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid = ?", v) - } if v, ok := query["usernames"]; ok && v != "" { arr := strings.Split(v, ",") tx = tx.Where("username in ?", arr) @@ -58,60 +56,90 @@ func (r UDMVOIPUser) SelectPage(query map[string]string) ([]model.UDMVOIPUser, i pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) - // 排序 - if v, ok := query["sortField"]; ok && v != "" { - sortSql := v - if o, ok := query["sortOrder"]; ok && o != "" { - if o == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - tx = tx.Order(sortSql) - } else { - tx = tx.Order("username asc") - } - // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query err => %v", err) } + // 排序 + if query["sortField"] != "" && query["sortOrder"] != "" { + r.sortRows(query["sortField"], query["sortOrder"], rows) + } return rows, total } +// sortRows 排序数据集合 +// sortField 排序字段 支持id imsi +// sortOrder 排序顺序 升序asc 降序desc +func (r UDMVOIPUser) sortRows(sortField, sortOrder string, rows []model.UDMVOIPUser) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.UDMVOIPUser) any{ + "id": func(row *model.UDMVOIPUser) any { return row.ID }, + "username": func(row *model.UDMVOIPUser) any { return row.UserName }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // SelectList 根据实体查询 func (r UDMVOIPUser) SelectList(u model.UDMVOIPUser) []model.UDMVOIPUser { tx := db.DB("").Model(&model.UDMVOIPUser{}) // 查询条件拼接 + if u.NeID != 0 { + tx = tx.Where("ne_id = ?", u.NeID) + } if u.UserName != "" { tx = tx.Where("username = ?", u.UserName) } - if u.NeUID != "" { - tx = tx.Where("ne_uid = ?", u.NeUID) - } - if u.CoreUID != "" { - tx = tx.Where("core_uid = ?", u.CoreUID) - } // 查询数据 arr := []model.UDMVOIPUser{} - if err := tx.Order("username asc").Find(&arr).Error; err != nil { + if err := tx.Find(&arr).Error; err != nil { logger.Errorf("query err => %v", err) } return arr } // SelectByUserName 通过username查询 -func (r UDMVOIPUser) SelectByUserName(coreUid, neUid, username string) model.UDMVOIPUser { +func (r UDMVOIPUser) SelectByUserName(neId int64, username string) model.UDMVOIPUser { tx := db.DB("").Model(&model.UDMVOIPUser{}) item := model.UDMVOIPUser{} // 查询条件拼接 - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neId) tx = tx.Where("username = ?", username) // 查询数据 - if err := tx.Order("username asc").Limit(1).Find(&item).Error; err != nil { + if err := tx.Limit(1).Find(&item).Error; err != nil { logger.Errorf("query err => %v", err) } return item @@ -127,9 +155,9 @@ func (r UDMVOIPUser) Inserts(uArr []model.UDMVOIPUser) int64 { } // DeleteByUserName 删除实体 -func (r UDMVOIPUser) DeleteByUserName(coreUid, neUid, username string) int64 { +func (r UDMVOIPUser) DeleteByUserName(neId int64, username string) int64 { tx := db.DB("") - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neId) tx = tx.Where("username = ?", username) tx.Delete(&model.UDMVOIPUser{}) if err := tx.Error; err != nil { @@ -139,9 +167,9 @@ func (r UDMVOIPUser) DeleteByUserName(coreUid, neUid, username string) int64 { } // DeletePrefixByUserName 删除前缀匹配的实体 -func (r UDMVOIPUser) DeletePrefixByUserName(coreUid, neUid, usernamePrefix string) int64 { +func (r UDMVOIPUser) DeletePrefixByUserName(neId int64, usernamePrefix string) int64 { tx := db.DB("") - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neId) tx = tx.Where("username like ?", fmt.Sprintf("%s%%", usernamePrefix)) tx.Delete(&model.UDMVOIPUser{}) if err := tx.Error; err != nil { diff --git a/src/modules/ne_data_nf/repository/udm_volte_ims.go b/src/modules/ne_data_nf/repository/udm_volte_ims.go index b93318ae..bd92f7c0 100644 --- a/src/modules/ne_data_nf/repository/udm_volte_ims.go +++ b/src/modules/ne_data_nf/repository/udm_volte_ims.go @@ -2,6 +2,7 @@ package repository import ( "fmt" + "sort" "strings" "be.ems/src/framework/database/db" @@ -16,10 +17,10 @@ var NewUDMVolteIMSUser = &UDMVolteIMSUser{} type UDMVolteIMSUser struct{} // ClearAndInsert 清空ne_id后新增实体 -func (r UDMVolteIMSUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMVolteIMSUser) int64 { +func (r UDMVolteIMSUser) ClearAndInsert(neId int64, uArr []model.UDMVolteIMSUser) int64 { // 不指定neID时,用 TRUNCATE 清空表快 // _, err := datasource.ExecDB("", "TRUNCATE TABLE udm_volte_ims", nil) - result := db.DB("").Where("core_uid = ? and ne_uid = ?", coreUid, neUid).Unscoped().Delete(&model.UDMVolteIMSUser{}) + result := db.DB("").Where("ne_id = ?", neId).Unscoped().Delete(&model.UDMVolteIMSUser{}) if result.Error != nil { logger.Errorf("Delete err => %v", result.Error) } @@ -30,18 +31,15 @@ func (r UDMVolteIMSUser) ClearAndInsert(coreUid, neUid string, uArr []model.UDMV func (r UDMVolteIMSUser) SelectPage(query map[string]string) ([]model.UDMVolteIMSUser, int64) { tx := db.DB("").Model(&model.UDMVolteIMSUser{}) // 查询条件拼接 + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) + } if v, ok := query["imsi"]; ok && v != "" { tx = tx.Where("imsi like ?", fmt.Sprintf("%%%s%%", v)) } if v, ok := query["msisdn"]; ok && v != "" { tx = tx.Where("msisdn like ?", fmt.Sprintf("%%%s%%", v)) } - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) - } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid = ?", v) - } if v, ok := query["tag"]; ok && v != "" { tx = tx.Where("tag = ?", v) } @@ -67,38 +65,69 @@ func (r UDMVolteIMSUser) SelectPage(query map[string]string) ([]model.UDMVolteIM pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) - // 排序 - if v, ok := query["sortField"]; ok && v != "" { - sortSql := v - if o, ok := query["sortOrder"]; ok && o != "" { - if o == "desc" { - sortSql += " desc " - } else { - sortSql += " asc " - } - } - tx = tx.Order(sortSql) - } else { - tx = tx.Order("imsi asc") - } - // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query err => %v", err) } + // 排序 + if query["sortField"] != "" && query["sortOrder"] != "" { + r.sortRows(query["sortField"], query["sortOrder"], rows) + } return rows, total } +// sortRows 排序数据集合 +// sortField 排序字段 支持id imsi +// sortOrder 排序顺序 升序asc 降序desc +func (r UDMVolteIMSUser) sortRows(sortField, sortOrder string, rows []model.UDMVolteIMSUser) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.UDMVolteIMSUser) any{ + "id": func(row *model.UDMVolteIMSUser) any { return row.ID }, + "imsi": func(row *model.UDMVolteIMSUser) any { return row.IMSI }, + "msisdn": func(row *model.UDMVolteIMSUser) any { return row.MSISDN }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // SelectList 根据实体查询 func (r UDMVolteIMSUser) SelectList(u model.UDMVolteIMSUser) []model.UDMVolteIMSUser { tx := db.DB("").Model(&model.UDMVolteIMSUser{}) // 查询条件拼接 - if u.NeUID != "" { - tx = tx.Where("ne_uid = ?", u.NeUID) - } - if u.CoreUID != "" { - tx = tx.Where("core_uid = ?", u.CoreUID) + if u.NeID != 0 { + tx = tx.Where("ne_id = ?", u.NeID) } if u.IMSI != "" { tx = tx.Where("imsi = ?", u.IMSI) @@ -116,11 +145,11 @@ func (r UDMVolteIMSUser) SelectList(u model.UDMVolteIMSUser) []model.UDMVolteIMS } // SelectByIMSIAndMSISDN 通过imsi,msisdn查询 -func (r UDMVolteIMSUser) SelectByIMSIAndMSISDN(coreUid, neUid, imsi, msisdn string) model.UDMVolteIMSUser { +func (r UDMVolteIMSUser) SelectByIMSIAndMSISDN(neId int64, imsi, msisdn string) model.UDMVolteIMSUser { tx := db.DB("").Model(&model.UDMVolteIMSUser{}) item := model.UDMVolteIMSUser{} // 查询条件拼接 - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neId) tx = tx.Where("imsi = ? and msisdn = ?", imsi, msisdn) // 查询数据 if err := tx.Order("imsi asc").Limit(1).Find(&item).Error; err != nil { @@ -139,9 +168,9 @@ func (r UDMVolteIMSUser) Inserts(uArr []model.UDMVolteIMSUser) int64 { } // Delete 删除实体 -func (r UDMVolteIMSUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 { +func (r UDMVolteIMSUser) DeleteByIMSI(neId int64, imsi string) int64 { tx := db.DB("") - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neId) tx = tx.Where("imsi = ?", imsi) tx.Delete(&model.UDMVolteIMSUser{}) if err := tx.Error; err != nil { @@ -151,9 +180,9 @@ func (r UDMVolteIMSUser) DeleteByIMSI(coreUid, neUid, imsi string) int64 { } // DeletePrefixByIMSI 删除前缀匹配的实体 -func (r UDMVolteIMSUser) DeletePrefixByIMSI(coreUid, neUid, imsiPrefix string) int64 { +func (r UDMVolteIMSUser) DeletePrefixByIMSI(neId int64, imsiPrefix string) int64 { tx := db.DB("") - tx = tx.Where("core_uid = ? and ne_uid = ?", coreUid, neUid) + tx = tx.Where("ne_id = ?", neId) tx = tx.Where("imsi like ?", fmt.Sprintf("%s%%", imsiPrefix)) tx.Delete(&model.UDMVolteIMSUser{}) if err := tx.Error; err != nil { diff --git a/src/modules/ne_data_nf/repository/ue_event.go b/src/modules/ne_data_nf/repository/ue_event.go index 102d1d78..fb7842df 100644 --- a/src/modules/ne_data_nf/repository/ue_event.go +++ b/src/modules/ne_data_nf/repository/ue_event.go @@ -19,27 +19,24 @@ type UEEvent struct{} // SelectByPage 分页查询集合 func (r UEEvent) SelectByPage(neType string, query map[string]string) ([]model.UEEvent, int64) { + // 查询结果 + var total int64 = 0 + rows := []model.UEEvent{} + if neType == "" { + return rows, total + } // 表名 tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(neType)) tx := db.DB("").Table(tableName).Model(&model.CDREvent{}) // 查询条件拼接 - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) - } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid = ?", v) + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) } if v, ok := query["beginTime"]; ok && v != "" { - if len(v) == 10 { - v = v + "000" - } - tx = tx.Where("created_at >= ?", v) + tx = tx.Where("created_time >= ?", v) } if v, ok := query["endTime"]; ok && v != "" { - if len(v) == 10 { - v = v + "000" - } - tx = tx.Where("created_at <= ?", v) + tx = tx.Where("created_time <= ?", v) } if v, ok := query["eventType"]; ok && v != "" { eventTypes := strings.Split(v, ",") @@ -49,18 +46,16 @@ func (r UEEvent) SelectByPage(neType string, query map[string]string) ([]model.U tx = tx.Where("JSON_EXTRACT(event_json, '$.imsi') like ?", fmt.Sprintf("%%%s%%", v)) } - // 查询结果 - var total int64 = 0 - rows := []model.UEEvent{} - // 查询数量 长度为0直接返回 if err := tx.Count(&total).Error; err != nil || total <= 0 { return rows, total } // 分页 - pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) - tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) + if query["pageNum"] != "" && query["pageSize"] != "" { + pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) + tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize)) + } // 查询数据 if err := tx.Find(&rows).Error; err != nil { @@ -68,60 +63,60 @@ func (r UEEvent) SelectByPage(neType string, query map[string]string) ([]model.U } // 排序 - if v, ok := query["sortField"]; ok && v != "" { - sortField := v - sortOrder := "asc" - if o, ok := query["sortOrder"]; ok && o != "" { - if o == "desc" { - sortOrder = "desc" - } else { - sortOrder = "asc" - } - } - sort.SliceStable(rows, func(i, j int) bool { - // 支持的排序字段映射 - fieldGetters := map[string]func(*model.UEEvent) any{ - "id": func(row *model.UEEvent) any { return row.ID }, - "timestamp": func(row *model.UEEvent) any { return row.CreatedAt }, - "createdAt": func(row *model.UEEvent) any { return row.CreatedAt }, - // 可添加更多支持的字段 - } - - // 获取字段 getter 函数 - getter, ok := fieldGetters[sortField] - if !ok { - // 非法字段,使用默认排序(id升序) - return rows[i].ID < rows[j].ID - } - - // 获取比较值 - valI, valJ := getter(&rows[i]), getter(&rows[j]) - - // 根据字段类型进行比较 - switch v := valI.(type) { - case int64: - if sortOrder == "desc" { - return v > valJ.(int64) - } - return v < valJ.(int64) - case string: - if sortOrder == "desc" { - return v > valJ.(string) - } - return v < valJ.(string) - default: - // 不支持的字段类型,使用默认排序 - return rows[i].ID < rows[j].ID - } - }) + if query["sortField"] != "" && query["sortOrder"] != "" { + r.sortRows(query["sortField"], query["sortOrder"], rows) } return rows, total } +// sortRows 排序数据集合 +// sortField 排序字段 支持id timeGroup createdAt +// sortOrder 排序顺序 升序asc 降序desc +func (r UEEvent) sortRows(sortField, sortOrder string, rows []model.UEEvent) { + if sortField == "" { + return + } + sort.SliceStable(rows, func(i, j int) bool { + // 支持的排序字段映射 + fieldGetters := map[string]func(*model.UEEvent) any{ + "id": func(row *model.UEEvent) any { return row.ID }, + "createdTime": func(row *model.UEEvent) any { return row.CreatedTime }, + // 可添加更多支持的字段 + } + + // 获取字段 getter 函数 + getter, ok := fieldGetters[sortField] + if !ok { + // 非法字段,使用默认排序(id升序) + return rows[i].ID < rows[j].ID + } + + // 获取比较值 + valI, valJ := getter(&rows[i]), getter(&rows[j]) + + // 根据字段类型进行比较 + switch v := valI.(type) { + case int64: + if sortOrder == "desc" { + return v > valJ.(int64) + } + return v < valJ.(int64) + case string: + if sortOrder == "desc" { + return v > valJ.(string) + } + return v < valJ.(string) + default: + // 不支持的字段类型,使用默认排序 + return rows[i].ID < rows[j].ID + } + }) +} + // SelectByIds 通过ID查询 func (r UEEvent) SelectByIds(neType string, ids []int64) []model.UEEvent { rows := []model.UEEvent{} - if len(ids) <= 0 { + if len(ids) <= 0 || neType == "" { return rows } // 表名 @@ -139,7 +134,7 @@ func (r UEEvent) SelectByIds(neType string, ids []int64) []model.UEEvent { // DeleteByIds 批量删除信息 func (r UEEvent) DeleteByIds(neType string, ids []int64) int64 { - if len(ids) <= 0 { + if len(ids) <= 0 || neType == "" { return 0 } // 表名 @@ -153,15 +148,15 @@ func (r UEEvent) DeleteByIds(neType string, ids []int64) int64 { } // Insert 新增信息 返回新增数据ID -func (r UEEvent) Insert(param model.UEEvent) int64 { - if param.NeType == "" { +func (r UEEvent) Insert(neType string, param model.UEEvent) int64 { + if neType == "" { return 0 } - if param.CreatedAt == 0 { - param.CreatedAt = time.Now().UnixMilli() + if param.CreatedTime == 0 { + param.CreatedTime = time.Now().UnixMilli() } // 表名 - tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(param.NeType)) + tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(neType)) // 执行插入 if err := db.DB("").Table(tableName).Create(¶m).Error; err != nil { logger.Errorf("insert err => %v", err.Error()) diff --git a/src/modules/ne_data_nf/service/cbc_message.go b/src/modules/ne_data_nf/service/cbc_message.go index 8621a32a..0df97313 100644 --- a/src/modules/ne_data_nf/service/cbc_message.go +++ b/src/modules/ne_data_nf/service/cbc_message.go @@ -322,11 +322,11 @@ func (s *CBCMessage) handleStatusChange(msg model.CBCMessage, oldStatus, newStat // 这个方法需要根据你的实际网元管理系统来实现 func (s *CBCMessage) getCBCNetworkElement(neId string) (string, int64, error) { // 查询网元信息 - neInfo := neService.NewNeInfo.FindByCoreUidAndNeUid("CBC", neId) - if neInfo.IPAddr == "" { + neInfo := neService.NewNeInfo.FindByNeUid(neId) + if neInfo.IpAddr == "" { return "", 0, fmt.Errorf("CBC network element not found for neId: %s", neId) } - return neInfo.IPAddr, neInfo.Port, nil + return neInfo.IpAddr, neInfo.Port, nil } // CBCHTTPClient CBC网元HTTP客户端 diff --git a/src/modules/ne_data_nf/service/cdr_event.go b/src/modules/ne_data_nf/service/cdr_event.go index 5da02237..05866a5d 100644 --- a/src/modules/ne_data_nf/service/cdr_event.go +++ b/src/modules/ne_data_nf/service/cdr_event.go @@ -48,8 +48,8 @@ func (r CDREvent) DeleteByIds(neType string, ids []int64) (int64, error) { } // Insert 新增信息 -func (s CDREvent) Insert(param model.CDREvent) int64 { - return s.cdrEventRepository.Insert(param) +func (s CDREvent) Insert(neType string, param model.CDREvent) int64 { + return s.cdrEventRepository.Insert(neType, param) } // ExportSMSC 导出数据到 xlsx 文件 @@ -57,13 +57,12 @@ func (r CDREvent) ExportSMSC(rows []model.CDREvent, fileName, language string) ( // 第一行表头标题 headerCells := map[string]string{ "A1": "ID", - "B1": "NE Name", - "C1": "Record Behavior", - "D1": "Service Type", - "E1": "Caller", - "F1": "Called", - "G1": "Result", - "H1": "Time", + "B1": "Record Behavior", + "C1": "Service Type", + "D1": "Caller", + "E1": "Called", + "F1": "Result", + "G1": "Time", } // 读取字典数据 CDR 原因码 dictCDRCauseCode := sysService.NewSysDictData.FindByType("cdr_cause_code") @@ -128,13 +127,12 @@ func (r CDREvent) ExportSMSC(rows []model.CDREvent, fileName, language string) ( dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, - "B" + idx: row.NeUID, - "C" + idx: recordType, - "D" + idx: serviceType, - "E" + idx: caller, - "F" + idx: called, - "G" + idx: callResult, - "H" + idx: timeStr, + "B" + idx: recordType, + "C" + idx: serviceType, + "D" + idx: caller, + "E" + idx: called, + "F" + idx: callResult, + "G" + idx: timeStr, }) } @@ -147,27 +145,25 @@ func (r CDREvent) ExportSMF(rows []model.CDREvent, fileName string) (string, err // 第一行表头标题 headerCells := map[string]string{ "A1": "ID", - "B1": "Charging ID", - "C1": "NE Name", - "D1": "Resource Unique ID", - "E1": "Subscriber ID Data", - "F1": "Subscriber ID Type", - "G1": "Data Volume Uplink", - "H1": "Data Volume Downlink", - "I1": "Data Total Volume", - "J1": "Duration", - "K1": "Invocation Time", - "L1": "User Identifier", - "M1": "SSC Mode", - "N1": "DNN ID", - "O1": "PDU Type", - "P1": "RAT Type", - "Q1": "PDU IPv4 Address", - "R1": "Network Function IPv4", - "S1": "PDU IPv6 Address Swith Prefix", - "T1": "Record Network Function ID", - "U1": "Record Type", - "V1": "Record Opening Time", + "B1": "Resource Unique ID", + "C1": "Subscriber ID Data", + "D1": "Subscriber ID Type", + "E1": "Data Volume Uplink", + "F1": "Data Volume Downlink", + "G1": "Data Total Volume", + "H1": "Duration", + "I1": "Invocation Time", + "J1": "User Identifier", + "K1": "SSC Mode", + "L1": "DNN ID", + "M1": "PDU Type", + "N1": "RAT Type", + "O1": "PDU IPv4 Address", + "P1": "Network Function IPv4", + "Q1": "PDU IPv6 Address Swith Prefix", + "R1": "Record Network Function ID", + "S1": "Record Type", + "T1": "Record Opening Time", } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) @@ -301,26 +297,24 @@ func (r CDREvent) ExportSMF(rows []model.CDREvent, fileName string) (string, err dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, "B" + idx: chargingID, - "C" + idx: row.CoreUID, - "D" + idx: row.NeUID, - "E" + idx: subscriptionIDData, - "F" + idx: subscriptionIDType, - "G" + idx: dataVolumeUplink, - "H" + idx: dataVolumeDownlink, - "I" + idx: dataTotalVolume, - "J" + idx: duration, - "K" + idx: invocationTimestamp, - "L" + idx: User_Identifier, - "M" + idx: SSC_Mode, - "N" + idx: DNN_ID, - "O" + idx: PDU_Type, - "P" + idx: RAT_Type, - "Q" + idx: PDU_IPv4, - "R" + idx: networkFunctionIPv4Address, - "S" + idx: PDU_IPv6, - "T" + idx: recordNFID, - "U" + idx: recordType, - "V" + idx: recordOpeningTime, + "C" + idx: subscriptionIDData, + "D" + idx: subscriptionIDType, + "E" + idx: dataVolumeUplink, + "F" + idx: dataVolumeDownlink, + "G" + idx: dataTotalVolume, + "H" + idx: duration, + "I" + idx: invocationTimestamp, + "J" + idx: User_Identifier, + "K" + idx: SSC_Mode, + "L" + idx: DNN_ID, + "M" + idx: PDU_Type, + "N" + idx: RAT_Type, + "O" + idx: PDU_IPv4, + "P" + idx: networkFunctionIPv4Address, + "Q" + idx: PDU_IPv6, + "R" + idx: recordNFID, + "S" + idx: recordType, + "T" + idx: recordOpeningTime, }) } @@ -333,28 +327,26 @@ func (r CDREvent) ExportSGWC(rows []model.CDREvent, fileName string) (string, er // 第一行表头标题 headerCells := map[string]string{ "A1": "ID", - "B1": "NE Name", - "C1": "Resource Unique ID", - "D1": "Charging ID", - "E1": "IMSI", - "F1": "MSISDN", - "G1": "GPRS Uplink", - "H1": "GPRS Downlink", - "I1": "Duration", - "J1": "Invocation Time", - "K1": "PGW Address", - "L1": "SGW Address", - "M1": "RAT Type", - "N1": "PDPPDN Type", - "O1": "PDPPDN Address", - "P1": "Node Address", - "Q1": "Node Type", - "R1": "Record Access Point Name NI", - "S1": "Record Cause For Rec Closing", - "T1": "Record Sequence Number", - "U1": "Local Record Sequence Number", - "V1": "Record Type", - "W1": "Record Opening Time", + "B1": "Charging ID", + "C1": "IMSI", + "D1": "MSISDN", + "E1": "GPRS Uplink", + "F1": "GPRS Downlink", + "G1": "Duration", + "H1": "Invocation Time", + "I1": "PGW Address", + "J1": "SGW Address", + "K1": "RAT Type", + "L1": "PDPPDN Type", + "M1": "PDPPDN Address", + "N1": "Node Address", + "O1": "Node Type", + "P1": "Record Access Point Name NI", + "Q1": "Record Cause For Rec Closing", + "R1": "Record Sequence Number", + "S1": "Local Record Sequence Number", + "T1": "Record Type", + "U1": "Record Opening Time", } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) @@ -489,28 +481,26 @@ func (r CDREvent) ExportSGWC(rows []model.CDREvent, fileName string) (string, er dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, - "B" + idx: row.NeUID, - "C" + idx: row.CoreUID, - "D" + idx: chargingID, - "E" + idx: servedIMSI, - "F" + idx: servedMSISDN, - "G" + idx: dataVolumeGPRSUplink, - "H" + idx: dataVolumeGPRSDownlink, - "I" + idx: duration, - "J" + idx: invocationTimestamp, - "K" + idx: pGWAddressUsed, - "L" + idx: sGWAddress, - "M" + idx: rATType, - "N" + idx: pdpPDNType, - "O" + idx: servedPDPPDNAddress, - "P" + idx: strings.Join(servingNodeAddress, ","), - "Q" + idx: strings.Join(servingNodeType, ","), - "R" + idx: accessPointNameNI, - "S" + idx: causeForRecClosing, - "T" + idx: recordSequenceNumber, - "U" + idx: localRecordSequenceNumber, - "V" + idx: recordType, - "W" + idx: invocationTimestamp, + "B" + idx: chargingID, + "C" + idx: servedIMSI, + "D" + idx: servedMSISDN, + "E" + idx: dataVolumeGPRSUplink, + "F" + idx: dataVolumeGPRSDownlink, + "G" + idx: duration, + "H" + idx: invocationTimestamp, + "I" + idx: pGWAddressUsed, + "J" + idx: sGWAddress, + "K" + idx: rATType, + "L" + idx: pdpPDNType, + "M" + idx: servedPDPPDNAddress, + "N" + idx: strings.Join(servingNodeAddress, ","), + "O" + idx: strings.Join(servingNodeType, ","), + "P" + idx: accessPointNameNI, + "Q" + idx: causeForRecClosing, + "R" + idx: recordSequenceNumber, + "S" + idx: localRecordSequenceNumber, + "T" + idx: recordType, + "U" + idx: invocationTimestamp, }) } @@ -523,16 +513,15 @@ func (r CDREvent) ExportIMS(rows []model.CDREvent, fileName, language string) (s // 第一行表头标题 headerCells := map[string]string{ "A1": "ID", - "B1": "NE Name", - "C1": "Record Behavior", - "D1": "Type", - "E1": "Caller", - "F1": "Called", - "G1": "Duration", - "H1": "Result Code", - "I1": "Result Cause", - "J1": "Call Start Time", - "K1": "Hangup Time", + "B1": "Record Behavior", + "C1": "Type", + "D1": "Caller", + "E1": "Called", + "F1": "Duration", + "G1": "Result Code", + "H1": "Result Cause", + "I1": "Call Start Time", + "J1": "Hangup Time", } // 读取字典数据 CDR SIP响应代码类别类型 dictCDRSipCode := sysService.NewSysDictData.FindByType("cdr_sip_code") @@ -627,16 +616,15 @@ func (r CDREvent) ExportIMS(rows []model.CDREvent, fileName, language string) (s dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, - "B" + idx: row.NeUID, - "C" + idx: recordType, - "D" + idx: callTypeLable, - "E" + idx: caller, - "F" + idx: called, - "G" + idx: duration, - "H" + idx: callResult, - "I" + idx: callCause, - "J" + idx: seizureTimeStr, - "K" + idx: releaseTimeStr, + "B" + idx: recordType, + "C" + idx: callTypeLable, + "D" + idx: caller, + "E" + idx: called, + "F" + idx: duration, + "G" + idx: callResult, + "H" + idx: callCause, + "I" + idx: seizureTimeStr, + "J" + idx: releaseTimeStr, }) } diff --git a/src/modules/ne_data_nf/service/udm_auth.go b/src/modules/ne_data_nf/service/udm_auth.go index 17b78054..4acf43b0 100644 --- a/src/modules/ne_data_nf/service/udm_auth.go +++ b/src/modules/ne_data_nf/service/udm_auth.go @@ -25,13 +25,13 @@ type UDMAuthUser struct { } // dataByRedis UDM鉴权用户 db:0 中 ausf:* -func (r *UDMAuthUser) dataByRedis(coreUid, neUid, imsi string) []model.UDMAuthUser { +func (r *UDMAuthUser) dataByRedis(neId int64, imsi string) []model.UDMAuthUser { arr := []model.UDMAuthUser{} key := fmt.Sprintf("ausf:%s", imsi) - source := fmt.Sprintf("UDM_%s", neUid) + source := fmt.Sprintf("UDM_%d", neId) // 网元主机的Redis客户端 - redisClient, err := neService.NewNeInfo.NeRunRedisClient(coreUid, neUid) + redisClient, err := neService.NewNeInfo.NeRunRedisClient(neId) if err != nil { return arr } @@ -75,9 +75,7 @@ func (r *UDMAuthUser) dataByRedis(coreUid, neUid, imsi string) []model.UDMAuthUs } a := model.UDMAuthUser{ - CoreUID: coreUid, - NeUID: neUid, - NeType: "UDM", + NeID: neId, IMSI: imsi, Amf: amf, Ki: m["ki"], @@ -91,19 +89,17 @@ func (r *UDMAuthUser) dataByRedis(coreUid, neUid, imsi string) []model.UDMAuthUs } // ResetData 重置鉴权用户数据,清空数据库重新同步Redis数据 -func (r *UDMAuthUser) ResetData(coreUid, neUid string) int64 { - authArr := r.dataByRedis(coreUid, neUid, "*") +func (r *UDMAuthUser) ResetData(neId int64) int64 { + authArr := r.dataByRedis(neId, "*") // 数据清空后添加 - go r.udmAuthRepository.ClearAndInsert(coreUid, neUid, authArr) + go r.udmAuthRepository.ClearAndInsert(neId, authArr) return int64(len(authArr)) } // ParseInfo 解析单个用户imsi鉴权信息 data从命令MML得到的结果 -func (r *UDMAuthUser) ParseInfo(coreUid, neUid, imsi string, data map[string]string) model.UDMAuthUser { - u := r.udmAuthRepository.SelectByIMSI(coreUid, neUid, imsi) - u.CoreUID = coreUid - u.NeUID = neUid - u.NeType = "UDM" +func (r *UDMAuthUser) ParseInfo(neId int64, imsi string, data map[string]string) model.UDMAuthUser { + u := r.udmAuthRepository.SelectByIMSI(neId, imsi) + u.NeID = neId // 用于更新 u.Amf = data["amf"] u.Ki = data["ki"] @@ -124,17 +120,17 @@ func (r *UDMAuthUser) Find(u model.UDMAuthUser) []model.UDMAuthUser { // Insert 从数据中读取后删除imsi再存入数据库 // imsi长度15,ki长度32,opc长度0或者32 -func (r *UDMAuthUser) Insert(coreUid, neUid string, u model.UDMAuthUser) int64 { - uArr := r.dataByRedis(coreUid, neUid, u.IMSI) +func (r *UDMAuthUser) Insert(neId int64, u model.UDMAuthUser) int64 { + uArr := r.dataByRedis(neId, u.IMSI) if len(uArr) > 0 { - r.udmAuthRepository.DeleteByIMSI(coreUid, neUid, u.IMSI) + r.udmAuthRepository.DeleteByIMSI(neId, u.IMSI) return r.udmAuthRepository.Inserts(uArr) } return 0 } // InsertData 导入文件数据 dataType目前两种:txt/csv -func (r *UDMAuthUser) InsertData(coreUid, neUid, dataType string, data any) int64 { +func (r *UDMAuthUser) InsertData(neId int64, dataType string, data any) int64 { // imsi截取前缀,重新获取部分数据 prefixes := make(map[string]struct{}) @@ -163,9 +159,9 @@ func (r *UDMAuthUser) InsertData(coreUid, neUid, dataType string, data any) int6 var num int64 = 0 for prefix := range prefixes { // 直接删除前缀的记录 - r.udmAuthRepository.DeletePrefixByIMSI(coreUid, neUid, prefix) + r.udmAuthRepository.DeletePrefixByIMSI(neId, prefix) // keys ausf:4600001000004* - arr := r.dataByRedis(coreUid, neUid, prefix+"*") + arr := r.dataByRedis(neId, prefix+"*") if len(arr) > 0 { num += r.udmAuthRepository.Inserts(arr) } @@ -174,20 +170,20 @@ func (r *UDMAuthUser) InsertData(coreUid, neUid, dataType string, data any) int6 } // Delete 删除单个不重新加载 -func (r *UDMAuthUser) Delete(coreUid, neUid, imsi string) int64 { - return r.udmAuthRepository.DeleteByIMSI(coreUid, neUid, imsi) +func (r *UDMAuthUser) Delete(neId int64, imsi string) int64 { + return r.udmAuthRepository.DeleteByIMSI(neId, imsi) } // LoadData 重新加载从imsi开始num的数据 -func (r *UDMAuthUser) LoadData(coreUid, neUid, imsi string, num int64) { +func (r *UDMAuthUser) LoadData(neId int64, imsi string, num int64) { startIMSI, _ := strconv.ParseInt(imsi, 10, 64) var i int64 for i = 0; i < num; i++ { keyIMSI := fmt.Sprintf("%015d", startIMSI+i) // 删除原数据 - r.udmAuthRepository.DeleteByIMSI(coreUid, neUid, keyIMSI) + r.udmAuthRepository.DeleteByIMSI(neId, keyIMSI) // 加载数据 - arr := r.dataByRedis(coreUid, neUid, keyIMSI) + arr := r.dataByRedis(neId, keyIMSI) if len(arr) < 1 { continue } diff --git a/src/modules/ne_data_nf/service/udm_extend.go b/src/modules/ne_data_nf/service/udm_extend.go index a0b1d070..0e0d7a07 100644 --- a/src/modules/ne_data_nf/service/udm_extend.go +++ b/src/modules/ne_data_nf/service/udm_extend.go @@ -16,18 +16,18 @@ type UDMExtend struct { UDMExtendRepository *repository.UDMExtend } -// FindByIMSIAndNeID 通过IMSI和网元标识查询信息 neId为%时模糊imsi查询 -func (r UDMExtend) FindByIMSIAndNeID(coreUid, neUid, imsi string) model.UDMExtend { - return r.UDMExtendRepository.SelectByIMSI(coreUid, neUid, imsi) +// FindByIMSIAndNeID 通过IMSI和网元标识查询信息 neId为0模糊imsi查询 +func (r UDMExtend) FindByIMSIAndNeID(neId int64, imsi string) model.UDMExtend { + return r.UDMExtendRepository.SelectByIMSI(neId, imsi) } // Save 新增或修改信息 func (r UDMExtend) Save(u model.UDMExtend) bool { - r.UDMExtendRepository.DeleteByIMSI(u.CoreUID, u.NeUID, u.IMSI) + r.UDMExtendRepository.DeleteByIMSI(u.NeID, u.IMSI) return r.UDMExtendRepository.Inserts([]model.UDMExtend{u}) > 0 } // Delete 删除信息 neId为%时模糊imsi查询 -func (r UDMExtend) Delete(coreUid, neUid, imsi string) int64 { - return r.UDMExtendRepository.DeleteByIMSI(coreUid, neUid, imsi) +func (r UDMExtend) Delete(neId int64, imsi string) int64 { + return r.UDMExtendRepository.DeleteByIMSI(neId, imsi) } diff --git a/src/modules/ne_data_nf/service/udm_sub.go b/src/modules/ne_data_nf/service/udm_sub.go index 5c722d93..9846805b 100644 --- a/src/modules/ne_data_nf/service/udm_sub.go +++ b/src/modules/ne_data_nf/service/udm_sub.go @@ -24,13 +24,13 @@ type UDMSubUser struct { } // dataByRedis UDM签约用户 db:0 中 udm-sd:* -func (r *UDMSubUser) dataByRedis(coreUid, neUid, imsi string) []model.UDMSubUser { +func (r *UDMSubUser) dataByRedis(neId int64, imsi string) []model.UDMSubUser { arr := []model.UDMSubUser{} key := fmt.Sprintf("udm-sd:%s", imsi) - source := fmt.Sprintf("UDM_%s", neUid) + source := fmt.Sprintf("UDM_%d", neId) // 网元主机的Redis客户端 - redisClient, err := neService.NewNeInfo.NeRunRedisClient(coreUid, neUid) + redisClient, err := neService.NewNeInfo.NeRunRedisClient(neId) if err != nil { return arr } @@ -61,14 +61,12 @@ func (r *UDMSubUser) dataByRedis(coreUid, neUid, imsi string) []model.UDMSubUser } a := model.UDMSubUser{ - CoreUID: coreUid, - NeUID: neUid, - NeType: "UDM", - IMSI: imsi, // udm-sd:360000100000130 - MSISDN: m["gpsi"], // 8612300000130 - SmfSel: m["smf-sel"], // def_snssai - SmData: m["sm-dat"], // 1-000001&cmnet&ims&3gnet - Cag: m["cag"], // def_cag + NeID: neId, + IMSI: imsi, // udm-sd:360000100000130 + MSISDN: m["gpsi"], // 8612300000130 + SmfSel: m["smf-sel"], // def_snssai + SmData: m["sm-dat"], // 1-000001&cmnet&ims&3gnet + Cag: m["cag"], // def_cag } // def_ambr,def_nssai,0,def_arfb,def_sar,3,1,12000,1,1000,0,1,- @@ -125,16 +123,16 @@ func (r *UDMSubUser) dataByRedis(coreUid, neUid, imsi string) []model.UDMSubUser } // ResetData 重置鉴权用户数据,清空数据库重新同步Redis数据 -func (r *UDMSubUser) ResetData(coreUid, neUid string) int64 { - subArr := r.dataByRedis(coreUid, neUid, "*") +func (r *UDMSubUser) ResetData(neId int64) int64 { + subArr := r.dataByRedis(neId, "*") // 数据清空后添加 - go r.udmSubRepository.ClearAndInsert(coreUid, neUid, subArr) + go r.udmSubRepository.ClearAndInsert(neId, subArr) return int64(len(subArr)) } // ParseInfo 解析单个用户imsi签约信息 data从命令MML得到的结果 -func (r *UDMSubUser) ParseInfo(coreUid, neUid, imsi string, data map[string]string) model.UDMSubUser { - u := r.udmSubRepository.SelectByIMSI(coreUid, neUid, imsi) +func (r *UDMSubUser) ParseInfo(neId int64, imsi string, data map[string]string) model.UDMSubUser { + u := r.udmSubRepository.SelectByIMSI(neId, imsi) cnType, _ := strconv.ParseInt(data["CNType"][:4], 0, 64) // 0x03(EPC|5GC) rat, _ := strconv.ParseInt(data["RAT"][:4], 0, 64) // 0x00(VIRTUAL|WLAN|EUTRA|NR) @@ -144,9 +142,7 @@ func (r *UDMSubUser) ParseInfo(coreUid, neUid, imsi string, data map[string]stri } // 用于更新 - u.CoreUID = coreUid - u.NeUID = neUid - u.NeType = "UDM" + u.NeID = neId u.IMSI = imsi u.MSISDN = msisdn u.UeAmbrTpl = data["AMBR"] @@ -176,7 +172,7 @@ func (r *UDMSubUser) ParseInfo(coreUid, neUid, imsi string, data map[string]stri } // 补充用户拓展信息 - info := r.UDMExtendRepository.SelectByIMSI(coreUid, neUid, imsi) + info := r.UDMExtendRepository.SelectByIMSI(neId, imsi) if info.IMSI == imsi { u.Remark = info.Remark } @@ -195,20 +191,18 @@ func (r *UDMSubUser) Find(u model.UDMSubUser) []model.UDMSubUser { // Insert 从数据中读取后删除imsi再存入数据库 // imsi长度15,ki长度32,opc长度0或者32 -func (r *UDMSubUser) Insert(coreUid, neUid string, u model.UDMSubUser) int64 { - uArr := r.dataByRedis(coreUid, neUid, u.IMSI) +func (r *UDMSubUser) Insert(neId int64, u model.UDMSubUser) int64 { + uArr := r.dataByRedis(neId, u.IMSI) if len(uArr) > 0 { - r.udmSubRepository.DeleteByIMSI(coreUid, neUid, u.IMSI) + r.udmSubRepository.DeleteByIMSI(neId, u.IMSI) // 新增到拓展信息 if u.Remark != "" { - r.UDMExtendRepository.DeleteByIMSI(coreUid, "%", u.IMSI) + r.UDMExtendRepository.DeleteByIMSI(0, u.IMSI) r.UDMExtendRepository.Inserts([]model.UDMExtend{{ - CoreUID: u.CoreUID, - NeUID: u.NeUID, - NeType: u.NeType, - IMSI: u.IMSI, - MSISDN: u.MSISDN, - Remark: u.Remark, + NeID: u.NeID, + IMSI: u.IMSI, + MSISDN: u.MSISDN, + Remark: u.Remark, }}) } return r.udmSubRepository.Inserts(uArr) @@ -217,7 +211,7 @@ func (r *UDMSubUser) Insert(coreUid, neUid string, u model.UDMSubUser) int64 { } // InsertData 导入文件数据 dataType目前两种:txt/csv -func (r *UDMSubUser) InsertData(coreUid, neUid, dataType string, data any) int64 { +func (r *UDMSubUser) InsertData(neId int64, dataType string, data any) int64 { // imsi截取前缀,重新获取部分数据 prefixes := make(map[string]struct{}) @@ -246,9 +240,9 @@ func (r *UDMSubUser) InsertData(coreUid, neUid, dataType string, data any) int64 var num int64 = 0 for prefix := range prefixes { // keys udm-sd:4600001000004* - arr := r.dataByRedis(coreUid, neUid, prefix+"*") + arr := r.dataByRedis(neId, prefix+"*") if len(arr) > 0 { - r.udmSubRepository.DeletePrefixByIMSI(coreUid, neUid, prefix) + r.udmSubRepository.DeletePrefixByIMSI(neId, prefix) num += r.udmSubRepository.Inserts(arr) } } @@ -256,26 +250,26 @@ func (r *UDMSubUser) InsertData(coreUid, neUid, dataType string, data any) int64 } // Delete 删除单个不重新加载 -func (r *UDMSubUser) Delete(coreUid, neUid, imsi string) int64 { +func (r *UDMSubUser) Delete(neId int64, imsi string) int64 { // 删除拓展信息 - r.UDMExtendRepository.DeleteByIMSI(coreUid, neUid, imsi) - return r.udmSubRepository.DeleteByIMSI(coreUid, neUid, imsi) + r.UDMExtendRepository.DeleteByIMSI(0, imsi) + return r.udmSubRepository.DeleteByIMSI(neId, imsi) } // LoadData 重新加载从imsi开始num的数据 // remark不为空,则新增到拓展信息,删除标记为-(Deleted)- -func (r *UDMSubUser) LoadData(coreUid, neUid, imsi string, num int64, remark string) { +func (r *UDMSubUser) LoadData(neId int64, imsi string, num int64, remark string) { startIMSI, _ := strconv.ParseInt(imsi, 10, 64) var i int64 for i = 0; i < num; i++ { keyIMSI := fmt.Sprintf("%015d", startIMSI+i) // 删除原数据 - r.udmSubRepository.DeleteByIMSI(coreUid, neUid, keyIMSI) + r.udmSubRepository.DeleteByIMSI(neId, keyIMSI) if remark == "-(Deleted)-" { - r.UDMExtendRepository.DeleteByIMSI(coreUid, "%", keyIMSI) + r.UDMExtendRepository.DeleteByIMSI(0, keyIMSI) } // 加载数据,删除标记为-(Deleted)-加载为空不插入 - arr := r.dataByRedis(coreUid, neUid, keyIMSI) + arr := r.dataByRedis(neId, keyIMSI) if len(arr) < 1 { continue } @@ -285,15 +279,13 @@ func (r *UDMSubUser) LoadData(coreUid, neUid, imsi string, num int64, remark str uarr := make([]model.UDMExtend, 0, len(arr)) for _, v := range arr { uarr = append(uarr, model.UDMExtend{ - CoreUID: v.CoreUID, - NeUID: v.NeUID, - NeType: v.NeType, - IMSI: v.IMSI, - MSISDN: v.MSISDN, - Remark: remark, + NeID: v.NeID, + IMSI: v.IMSI, + MSISDN: v.MSISDN, + Remark: remark, }) } - r.UDMExtendRepository.DeleteByIMSI(coreUid, neUid, keyIMSI) + r.UDMExtendRepository.DeleteByIMSI(neId, keyIMSI) r.UDMExtendRepository.Inserts(uarr) } } diff --git a/src/modules/ne_data_nf/service/udm_voip.go b/src/modules/ne_data_nf/service/udm_voip.go index 6c57fda1..f15f775c 100644 --- a/src/modules/ne_data_nf/service/udm_voip.go +++ b/src/modules/ne_data_nf/service/udm_voip.go @@ -23,13 +23,13 @@ type UDMVOIPUser struct { } // dataByRedis UDMVOIP用户 db:0 中 voip:* -func (r UDMVOIPUser) dataByRedis(coreUid, neUid, username string) []model.UDMVOIPUser { +func (r UDMVOIPUser) dataByRedis(neId int64, username string) []model.UDMVOIPUser { arr := []model.UDMVOIPUser{} key := fmt.Sprintf("voip:%s", username) - source := fmt.Sprintf("UDM_%s", neUid) + source := fmt.Sprintf("UDM_%d", neId) // 网元主机的Redis客户端 - redisClient, err := neService.NewNeInfo.NeRunRedisClient(coreUid, neUid) + redisClient, err := neService.NewNeInfo.NeRunRedisClient(neId) if err != nil { return arr } @@ -56,9 +56,7 @@ func (r UDMVOIPUser) dataByRedis(coreUid, neUid, username string) []model.UDMVOI } a := model.UDMVOIPUser{ - CoreUID: coreUid, - NeUID: neUid, - NeType: "UDM", + NeID: neId, UserName: username, Password: m["password"], } @@ -68,24 +66,22 @@ func (r UDMVOIPUser) dataByRedis(coreUid, neUid, username string) []model.UDMVOI } // ResetData 重置VOIP用户数据,清空数据库重新同步Redis数据 -func (r UDMVOIPUser) ResetData(coreUid, neUid string) int64 { - arr := r.dataByRedis(coreUid, neUid, "*") +func (r UDMVOIPUser) ResetData(neId int64) int64 { + arr := r.dataByRedis(neId, "*") // 数据清空后添加 - go r.udmVOIPRepository.ClearAndInsert(coreUid, neUid, arr) + go r.udmVOIPRepository.ClearAndInsert(neId, arr) return int64(len(arr)) } // ParseInfo 解析单个用户userName信息 data从命令MML得到的结果 -func (r UDMVOIPUser) ParseInfo(coreUid, neUid string, data map[string]string) model.UDMVOIPUser { +func (r UDMVOIPUser) ParseInfo(neId int64, data map[string]string) model.UDMVOIPUser { u := model.UDMVOIPUser{ - CoreUID: coreUid, - NeUID: neUid, - NeType: "UDM", + NeID: neId, UserName: data["username"], Password: data["password"], } // 赋予ID - item := r.udmVOIPRepository.SelectByUserName(coreUid, neUid, u.UserName) + item := r.udmVOIPRepository.SelectByUserName(neId, u.UserName) if item.ID > 0 { u.ID = item.ID } @@ -103,17 +99,17 @@ func (r UDMVOIPUser) Find(u model.UDMVOIPUser) []model.UDMVOIPUser { } // Insert 从数据中读取后删除username再存入数据库 -func (r UDMVOIPUser) Insert(coreUid, neUid string, username string) int64 { - uArr := r.dataByRedis(coreUid, neUid, username) +func (r UDMVOIPUser) Insert(neId int64, username string) int64 { + uArr := r.dataByRedis(neId, username) if len(uArr) > 0 { - r.udmVOIPRepository.DeleteByUserName(coreUid, neUid, username) + r.udmVOIPRepository.DeleteByUserName(neId, username) return r.udmVOIPRepository.Inserts(uArr) } return 0 } // InsertData 导入文件数据 dataType目前两种:txt/csv -func (r UDMVOIPUser) InsertData(coreUid, neUid, dataType string, data any) int64 { +func (r UDMVOIPUser) InsertData(neId int64, dataType string, data any) int64 { // imsi截取前缀,重新获取部分数据 prefixes := make(map[string]struct{}) @@ -142,9 +138,9 @@ func (r UDMVOIPUser) InsertData(coreUid, neUid, dataType string, data any) int64 var num int64 = 0 for prefix := range prefixes { // 直接删除前缀的记录 - r.udmVOIPRepository.DeletePrefixByUserName(coreUid, neUid, prefix) + r.udmVOIPRepository.DeletePrefixByUserName(neId, prefix) // keys voip:4600001000004* - arr := r.dataByRedis(coreUid, neUid, prefix+"*") + arr := r.dataByRedis(neId, prefix+"*") if len(arr) > 0 { num += r.udmVOIPRepository.Inserts(arr) } @@ -153,20 +149,20 @@ func (r UDMVOIPUser) InsertData(coreUid, neUid, dataType string, data any) int64 } // Delete 删除单个不重新加载 -func (r UDMVOIPUser) Delete(coreUid, neUid, username string) int64 { - return r.udmVOIPRepository.DeleteByUserName(coreUid, neUid, username) +func (r UDMVOIPUser) Delete(neId int64, username string) int64 { + return r.udmVOIPRepository.DeleteByUserName(neId, username) } // LoadData 重新加载从username开始num的数据 -func (r UDMVOIPUser) LoadData(coreUid, neUid, username string, num int64) { +func (r UDMVOIPUser) LoadData(neId int64, username string, num int64) { startUserName, _ := strconv.ParseInt(username, 10, 64) var i int64 for i = 0; i < num; i++ { keyUserName := fmt.Sprintf("%d", startUserName+i) // 删除原数据 - r.udmVOIPRepository.DeleteByUserName(coreUid, neUid, keyUserName) + r.udmVOIPRepository.DeleteByUserName(neId, keyUserName) // 加载数据 - arr := r.dataByRedis(coreUid, neUid, keyUserName) + arr := r.dataByRedis(neId, keyUserName) if len(arr) < 1 { continue } diff --git a/src/modules/ne_data_nf/service/udm_volte_ims.go b/src/modules/ne_data_nf/service/udm_volte_ims.go index 311ee144..65e9856e 100644 --- a/src/modules/ne_data_nf/service/udm_volte_ims.go +++ b/src/modules/ne_data_nf/service/udm_volte_ims.go @@ -23,13 +23,13 @@ type UDMVolteIMSUser struct { } // dataByRedis UDMVolteIMS用户 db:0 中 volte:* -func (r UDMVolteIMSUser) dataByRedis(coreUid, neUid, imsi string) []model.UDMVolteIMSUser { +func (r UDMVolteIMSUser) dataByRedis(neId int64, imsi string) []model.UDMVolteIMSUser { arr := []model.UDMVolteIMSUser{} key := fmt.Sprintf("volte:%s", imsi) - source := fmt.Sprintf("UDM_%s", neUid) + source := fmt.Sprintf("UDM_%d", neId) // 网元主机的Redis客户端 - redisClient, err := neService.NewNeInfo.NeRunRedisClient(coreUid, neUid) + redisClient, err := neService.NewNeInfo.NeRunRedisClient(neId) if err != nil { return arr } @@ -63,13 +63,11 @@ func (r UDMVolteIMSUser) dataByRedis(coreUid, neUid, imsi string) []model.UDMVol } a := model.UDMVolteIMSUser{ - CoreUID: coreUid, - NeUID: neUid, - NeType: "UDM", - IMSI: keys[1], - MSISDN: keys[2], - Tag: m["tag"], // volte = tag - VNI: vni, + NeID: neId, + IMSI: keys[1], + MSISDN: keys[2], + Tag: m["tag"], // volte = tag + VNI: vni, } arr = append(arr, a) } @@ -77,15 +75,15 @@ func (r UDMVolteIMSUser) dataByRedis(coreUid, neUid, imsi string) []model.UDMVol } // ResetData 重置VolteIMS用户数据,清空数据库重新同步Redis数据 -func (r UDMVolteIMSUser) ResetData(coreUid, neUid string) int64 { - authArr := r.dataByRedis(coreUid, neUid, "*") +func (r UDMVolteIMSUser) ResetData(neId int64) int64 { + authArr := r.dataByRedis(neId, "*") // 数据清空后添加 - go r.udmVolteIMSRepository.ClearAndInsert(coreUid, neUid, authArr) + go r.udmVolteIMSRepository.ClearAndInsert(neId, authArr) return int64(len(authArr)) } // ParseInfo 解析单个用户imsi信息 data从命令MML得到的结果 -func (r UDMVolteIMSUser) ParseInfo(coreUid, neUid string, data map[string]string) model.UDMVolteIMSUser { +func (r UDMVolteIMSUser) ParseInfo(neId int64, data map[string]string) model.UDMVolteIMSUser { // "110011200004217@ims.mnc001.mcc110.3gppnetwork.org" vni := "" impiParts := strings.Split(data["impi"], "@") @@ -97,15 +95,14 @@ func (r UDMVolteIMSUser) ParseInfo(coreUid, neUid string, data map[string]string } u := model.UDMVolteIMSUser{ - CoreUID: coreUid, - NeUID: neUid, - IMSI: data["imsi"], - MSISDN: data["msisdn"], - Tag: data["volte_tag"], - VNI: vni, + NeID: neId, + IMSI: data["imsi"], + MSISDN: data["msisdn"], + Tag: data["volte_tag"], + VNI: vni, } // 赋予ID - item := r.udmVolteIMSRepository.SelectByIMSIAndMSISDN(coreUid, neUid, u.IMSI, u.MSISDN) + item := r.udmVolteIMSRepository.SelectByIMSIAndMSISDN(neId, u.IMSI, u.MSISDN) if item.ID > 0 { u.ID = item.ID } @@ -124,17 +121,17 @@ func (r UDMVolteIMSUser) Find(u model.UDMVolteIMSUser) []model.UDMVolteIMSUser { // InsertByIMSI 从数据中读取后删除imsi再存入数据库 // imsi长度15 -func (r UDMVolteIMSUser) InsertByIMSI(coreUid, neUid, imsi string) int64 { - uArr := r.dataByRedis(coreUid, neUid, imsi+":*") +func (r UDMVolteIMSUser) InsertByIMSI(neId int64, imsi string) int64 { + uArr := r.dataByRedis(neId, imsi+":*") if len(uArr) > 0 { - r.udmVolteIMSRepository.DeleteByIMSI(coreUid, neUid, imsi) + r.udmVolteIMSRepository.DeleteByIMSI(neId, imsi) return r.udmVolteIMSRepository.Inserts(uArr) } return 0 } // InsertData 导入文件数据 dataType目前两种:txt/csv -func (r UDMVolteIMSUser) InsertData(coreUid, neUid, dataType string, data any) int64 { +func (r UDMVolteIMSUser) InsertData(neId int64, dataType string, data any) int64 { // imsi截取前缀,重新获取部分数据 prefixes := make(map[string]struct{}) @@ -163,9 +160,9 @@ func (r UDMVolteIMSUser) InsertData(coreUid, neUid, dataType string, data any) i var num int64 = 0 for prefix := range prefixes { // 直接删除前缀的记录 - r.udmVolteIMSRepository.DeletePrefixByIMSI(coreUid, neUid, prefix) + r.udmVolteIMSRepository.DeletePrefixByIMSI(neId, prefix) // keys voip:4600001000004* - arr := r.dataByRedis(coreUid, neUid, prefix+"*") + arr := r.dataByRedis(neId, prefix+"*") if len(arr) > 0 { num += r.udmVolteIMSRepository.Inserts(arr) } @@ -174,12 +171,12 @@ func (r UDMVolteIMSUser) InsertData(coreUid, neUid, dataType string, data any) i } // Delete 删除单个不重新加载 -func (r UDMVolteIMSUser) Delete(coreUid, neUid, imsi string) int64 { - return r.udmVolteIMSRepository.DeleteByIMSI(coreUid, neUid, imsi) +func (r UDMVolteIMSUser) Delete(neId int64, imsi string) int64 { + return r.udmVolteIMSRepository.DeleteByIMSI(neId, imsi) } // LoadData 重新加载从imsi开始num的数据 -func (r UDMVolteIMSUser) LoadData(coreUid, neUid, imsiOrMsisdn string, num int64) { +func (r UDMVolteIMSUser) LoadData(neId int64, imsiOrMsisdn string, num int64) { startIMSIOrMsisdn, _ := strconv.ParseInt(imsiOrMsisdn, 10, 64) var i int64 for i = 0; i < num; i++ { @@ -188,9 +185,9 @@ func (r UDMVolteIMSUser) LoadData(coreUid, neUid, imsiOrMsisdn string, num int64 keyIMSI = fmt.Sprintf("%d", startIMSIOrMsisdn+i) } // 删除原数据 - r.udmVolteIMSRepository.DeleteByIMSI(coreUid, neUid, keyIMSI) + r.udmVolteIMSRepository.DeleteByIMSI(neId, keyIMSI) // 加载数据 - arr := r.dataByRedis(coreUid, neUid, keyIMSI+":*") + arr := r.dataByRedis(neId, keyIMSI+":*") if len(arr) < 1 { continue } diff --git a/src/modules/ne_data_nf/service/ue_event.go b/src/modules/ne_data_nf/service/ue_event.go index 2d6a22ec..a899b706 100644 --- a/src/modules/ne_data_nf/service/ue_event.go +++ b/src/modules/ne_data_nf/service/ue_event.go @@ -48,8 +48,8 @@ func (r UEEvent) DeleteByIds(neType string, ids []int64) (int64, error) { } // Insert 新增信息 -func (r UEEvent) Insert(param model.UEEvent) int64 { - return r.ueEventRepository.Insert(param) +func (r UEEvent) Insert(neType string, param model.UEEvent) int64 { + return r.ueEventRepository.Insert(neType, param) } // ExportAMF 导出数据到 xlsx 文件 @@ -74,7 +74,7 @@ func (r UEEvent) ExportAMF(rows []model.UEEvent, fileName, language string) (str idx := strconv.Itoa(i + 2) // 解析 JSON 字符串为 map var eventJSON map[string]interface{} - err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON) + err := json.Unmarshal([]byte(row.EventJson), &eventJSON) if err != nil { logger.Warnf("UEExport Error parsing JSON: %s", err.Error()) continue @@ -167,7 +167,7 @@ func (r UEEvent) ExportMME(rows []model.UEEvent, fileName, language string) (str idx := strconv.Itoa(i + 2) // 解析 JSON 字符串为 map var eventJSON map[string]interface{} - err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON) + err := json.Unmarshal([]byte(row.EventJson), &eventJSON) if err != nil { logger.Warnf("UEExport Error parsing JSON: %s", err.Error()) continue diff --git a/src/modules/notification/service/email.go b/src/modules/notification/service/email.go index 2cf9fba3..329af9c3 100644 --- a/src/modules/notification/service/email.go +++ b/src/modules/notification/service/email.go @@ -45,7 +45,7 @@ func EmailAlarm(a neDataModel.Alarm, neInfo neModel.NeInfo) error { data := map[string]any{ "AlarmSeq": a.AlarmSeq, "NeName": neInfo.NeName, - "NeIp": neInfo.IPAddr, + "NeIp": neInfo.IpAddr, "AlarmTitle": a.AlarmTitle, "OrigSeverity": a.OrigSeverity, "AlarmTime": date.ParseDateToStr(a.EventTime, time.RFC3339), diff --git a/src/modules/notification/service/smsc.go b/src/modules/notification/service/smsc.go index 2c499738..9f2b8bd3 100644 --- a/src/modules/notification/service/smsc.go +++ b/src/modules/notification/service/smsc.go @@ -115,7 +115,7 @@ func SMSCAlarm(a neDataModel.Alarm, neInfo neModel.NeInfo) error { data := map[string]any{ "AlarmSeq": a.AlarmSeq, "NeName": neInfo.NeName, - "NeIPAddr": neInfo.IPAddr, + "NeIPAddr": neInfo.IpAddr, "AlarmTitle": a.AlarmTitle, "OrigSeverity": a.OrigSeverity, "AlarmTime": date.ParseDateToStr(a.EventTime, time.RFC3339), diff --git a/src/modules/oam/controller/api_rest.go b/src/modules/oam/controller/api_rest.go index 4b93f470..6989a9ab 100644 --- a/src/modules/oam/controller/api_rest.go +++ b/src/modules/oam/controller/api_rest.go @@ -627,7 +627,7 @@ func (s APIRestController) ResolveAlarmHistory(c *gin.Context) { if elementTypeValue == "all" { neInfos = neService.NewNeInfo.Find(neModel.NeInfo{}, false, false) } else { - neInfos = neService.NewNeInfo.FindByCoreUidAndNeType("*", strings.ToUpper(elementTypeValue)) + neInfos = neService.NewNeInfo.FindByNeType(strings.ToUpper(elementTypeValue)) } for _, neInfo := range neInfos { data, err := neFetchlink.AlarmHistory(neInfo) @@ -636,7 +636,7 @@ func (s APIRestController) ResolveAlarmHistory(c *gin.Context) { continue } if len(data) == 0 { - logger.Warnf("not found sync alarms %s", neInfo.CoreUID) + logger.Warnf("not found sync alarms %s", neInfo.NeUid) continue } diff --git a/src/modules/oam/service/alarm.go b/src/modules/oam/service/alarm.go index 7c7381ff..14b9e5fc 100644 --- a/src/modules/oam/service/alarm.go +++ b/src/modules/oam/service/alarm.go @@ -40,16 +40,14 @@ type Alarm struct { // Resolve 接收处理 func (s *Alarm) Resolve(a oam.Alarm) error { // 是否存在网元 - neInfo := s.neInfoService.FindByCoreUidAndNeUid("*", a.NeUid) - if neInfo.NeType == "" || neInfo.NeUID != a.NeUid { + neInfo := s.neInfoService.FindByNeUid(a.NeUid) + if neInfo.NeType == "" || neInfo.NeUid != a.NeUid { return fmt.Errorf("resolve alarm network element does not exist %s", a.NeUid) } // 告警信息 alarm := neDataModel.Alarm{ - CoreUID: neInfo.CoreUID, - NeType: neInfo.NeType, - NeUID: neInfo.NeUID, + NeID: neInfo.ID, AlarmSeq: 0, AlarmId: a.AlarmId, AlarmTitle: a.AlarmTitle, @@ -58,7 +56,7 @@ func (s *Alarm) Resolve(a oam.Alarm) error { AlarmType: a.AlarmType, OrigSeverity: a.PerceivedSeverity, PerceivedSeverity: a.PerceivedSeverity, - ObjectUid: neInfo.NeUID, + ObjectUid: neInfo.NeUid, ObjectName: neInfo.NeName, ObjectType: neInfo.NeType, LocationInfo: a.LocationInfo, @@ -75,13 +73,13 @@ func (s *Alarm) Resolve(a oam.Alarm) error { return err } // 推送 - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM_EVENT, neInfo.CoreUID, neInfo.NeUID), alarm) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_ALARM_EVENT, neInfo.NeUid), alarm) } else { if err := s.clear(alarm); err != nil { return err } // 推送 - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.CoreUID, neInfo.NeUID), alarm) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_ALARM, neInfo.NeUid), alarm) } } @@ -94,7 +92,7 @@ func (s *Alarm) Resolve(a oam.Alarm) error { } alarm.AlarmSeq = alarmSeq // 推送 - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM_EVENT, neInfo.CoreUID, neInfo.NeUID), alarm) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_ALARM_EVENT, neInfo.NeUid), alarm) } else { alarmSeq, err := s.add(alarm) if err != nil { @@ -102,7 +100,7 @@ func (s *Alarm) Resolve(a oam.Alarm) error { } alarm.AlarmSeq = alarmSeq // 推送 - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.CoreUID, neInfo.NeUID), alarm) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_ALARM, neInfo.NeUid), alarm) } } @@ -119,9 +117,7 @@ func (s *Alarm) Resolve(a oam.Alarm) error { // saveLog 记录日志 func (s *Alarm) saveLog(alarm neDataModel.Alarm) error { alarmLog := neDataModel.AlarmLog{ - CoreUID: alarm.CoreUID, - NeUID: alarm.NeUID, - NeType: alarm.NeType, + NeID: alarm.NeID, AlarmSeq: alarm.AlarmSeq, AlarmId: alarm.AlarmId, AlarmTitle: alarm.AlarmTitle, @@ -142,16 +138,14 @@ func (s *Alarm) saveLog(alarm neDataModel.Alarm) error { func (s *Alarm) add(alarm neDataModel.Alarm) (int64, error) { // 检查网元告警ID是否唯一 alarmIdArr := s.alarmService.Find(neDataModel.Alarm{ - CoreUID: alarm.CoreUID, - NeUID: alarm.NeUID, - NeType: alarm.NeType, + NeID: alarm.NeID, AlarmId: alarm.AlarmId, }) if len(alarmIdArr) > 0 { return 0, fmt.Errorf("already exists alarmId:%s", alarm.AlarmId) } // seq 告警序号 - lastSeq := neDataService.NewAlarm.FindAlarmSeqLast(alarm.CoreUID, alarm.NeUID) + lastSeq := neDataService.NewAlarm.FindAlarmSeqLast(alarm.NeID) alarm.AlarmSeq = lastSeq + 1 insertId := s.alarmService.Insert(alarm) if insertId > 0 { @@ -165,17 +159,16 @@ func (s *Alarm) add(alarm neDataModel.Alarm) (int64, error) { func (s *Alarm) clear(alarm neDataModel.Alarm) error { // 检查网元告警ID是否唯一 alarmIdArr := s.alarmService.Find(neDataModel.Alarm{ - CoreUID: alarm.CoreUID, - NeUID: alarm.NeUID, - NeType: alarm.NeType, + NeID: alarm.NeID, AlarmId: alarm.AlarmId, }) if len(alarmIdArr) != 1 { return fmt.Errorf("not exists alarmId:%s", alarm.AlarmId) } + alarmId := alarmIdArr[0].ID // 告警清除 - rows, _ := s.alarmService.ClearById(alarmIdArr[0].ID, alarm.CoreUID, alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR) + rows, _ := s.alarmService.ClearByIds([]int64{alarmId}, alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR) if rows > 0 { return nil } @@ -186,21 +179,17 @@ func (s *Alarm) clear(alarm neDataModel.Alarm) error { func (s Alarm) addEvent(alarm neDataModel.Alarm) (int64, error) { // 检查网元告警ID是否唯一 alarmIdArr := s.alarmEventService.Find(neDataModel.AlarmEvent{ - CoreUID: alarm.CoreUID, - NeUID: alarm.NeUID, - NeType: alarm.NeType, + NeID: alarm.NeID, AlarmId: alarm.AlarmId, }) if len(alarmIdArr) > 0 { return 0, fmt.Errorf("event already exists alarmId:%s", alarm.AlarmId) } // seq 告警序号 - lastSeq := s.alarmEventService.FindAlarmEventSeqLast(alarm.CoreUID, alarm.NeUID) + lastSeq := s.alarmEventService.FindAlarmEventSeqLast(alarm.NeID) alarmEvent := neDataModel.AlarmEvent{ - CoreUID: alarm.CoreUID, - NeUID: alarm.NeUID, - NeType: alarm.NeType, + NeID: alarm.NeID, AlarmSeq: lastSeq + 1, AlarmId: alarm.AlarmId, AlarmTitle: alarm.AlarmTitle, @@ -221,18 +210,16 @@ func (s Alarm) addEvent(alarm neDataModel.Alarm) (int64, error) { // 网元重启后,清除活动告警 if alarm.AlarmCode == constants.ALARM_EVENT_REBOOT { rows := s.alarmService.Find(neDataModel.Alarm{ - CoreUID: alarm.CoreUID, - NeUID: alarm.NeUID, - NeType: alarm.NeType, + NeID: alarm.NeID, AlarmStatus: oam.ALARM_STATUS_ACTIVE, }) for _, v := range rows { - s.alarmService.ClearById(v.ID, alarm.CoreUID, alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR) + s.alarmService.ClearByIds([]int64{v.ID}, alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR) } } // 网元重启后,有跟踪任务的需要重新补发启动任务 if alarm.AlarmCode == constants.ALARM_EVENT_REBOOT { - traceService.NewTraceTask.RunUnstopped(alarm.CoreUID, alarm.NeUID) + traceService.NewTraceTask.RunUnstopped(alarm.NeID) } return alarmEvent.AlarmSeq, nil } @@ -244,9 +231,7 @@ func (s Alarm) clearEvent(alarm neDataModel.Alarm) error { alarmEventService := neDataService.NewAlarmEvent // 检查网元告警ID是否唯一 alarmIdArr := alarmEventService.Find(neDataModel.AlarmEvent{ - CoreUID: alarm.CoreUID, - NeUID: alarm.NeUID, - NeType: alarm.NeType, + NeID: alarm.NeID, AlarmId: alarm.AlarmId, }) if len(alarmIdArr) != 1 { @@ -254,7 +239,7 @@ func (s Alarm) clearEvent(alarm neDataModel.Alarm) error { } // 告警清除 - rows, _ := s.alarmEventService.ClearById(alarmIdArr[0].ID, alarm.CoreUID, alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR) + rows, _ := s.alarmEventService.ClearByIds([]int64{alarmIdArr[0].ID}, alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR) if rows > 0 { return nil } @@ -291,9 +276,7 @@ func (s Alarm) notify(alarm neDataModel.Alarm, neInfo neModel.NeInfo) { // notifyLog 通知日志 func (s Alarm) notifyLog(alarm neDataModel.Alarm, forwardBy, toUser, result string) error { alarmForwardLog := neDataModel.AlarmForwardLog{ - CoreUID: alarm.CoreUID, - NeUID: alarm.NeUID, - NeType: alarm.NeType, + NeID: alarm.NeID, AlarmSeq: alarm.AlarmSeq, AlarmId: alarm.AlarmId, AlarmTitle: alarm.AlarmTitle, diff --git a/src/modules/oam/service/cdr.go b/src/modules/oam/service/cdr.go index 5ba4b5be..da7f37c7 100644 --- a/src/modules/oam/service/cdr.go +++ b/src/modules/oam/service/cdr.go @@ -32,21 +32,18 @@ func (s *CDR) Resolve(c oam.CDR) error { return fmt.Errorf("cdr data is nil") } // 是否存在网元 - neInfo := s.neInfoService.FindByCoreUidAndNeUid("*", c.NeUid) - if neInfo.NeType == "" || neInfo.NeUID != c.NeUid { + neInfo := s.neInfoService.FindByNeUid(c.NeUid) + if neInfo.NeType == "" || neInfo.NeUid != c.NeUid { return fmt.Errorf("resolve cdr network element does not exist %s", c.NeUid) } cdrByte, _ := json.Marshal(c.Data) cdrEvent := neDataNfModel.CDREvent{ - CoreUID: neInfo.CoreUID, - NeUID: neInfo.NeUID, - NeType: neInfo.NeType, - Timestamp: c.RecordTime, - CdrJson: string(cdrByte), - CreatedAt: c.RecordTime, + NeID: neInfo.ID, + RecordTime: c.RecordTime, + CdrJson: string(cdrByte), } - insertId := s.cdrEventService.Insert(cdrEvent) + insertId := s.cdrEventService.Insert(neInfo.NeType, cdrEvent) if insertId <= 0 { return fmt.Errorf("add cdr data fail") } @@ -58,14 +55,14 @@ func (s *CDR) Resolve(c oam.CDR) error { dataMap := c.Data.(map[string]any) v, ok := dataMap["recordType"] if ok && (v == "MOC" || v == "MTSM") { - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_IMS_CDR, neInfo.CoreUID, neInfo.NeUID), cdrEvent) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_IMS_CDR, neInfo.NeUid), cdrEvent) } case "SMF": - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_SMF_CDR, neInfo.CoreUID, neInfo.NeUID), cdrEvent) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SMF_CDR, neInfo.NeUid), cdrEvent) case "SMSC": - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_SMSC_CDR, neInfo.CoreUID, neInfo.NeUID), cdrEvent) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SMSC_CDR, neInfo.NeUid), cdrEvent) case "SGWC": - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_SGWC_CDR, neInfo.CoreUID, neInfo.NeUID), cdrEvent) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_SGWC_CDR, neInfo.NeUid), cdrEvent) } return nil } diff --git a/src/modules/oam/service/kpi.go b/src/modules/oam/service/kpi.go index 1f6e171e..f4a8311e 100644 --- a/src/modules/oam/service/kpi.go +++ b/src/modules/oam/service/kpi.go @@ -6,7 +6,6 @@ import ( "math" "time" - "be.ems/src/framework/utils/date" "be.ems/src/framework/utils/expr" "be.ems/src/framework/utils/parse" "github.com/tsmask/go-oam" @@ -40,8 +39,8 @@ func (s *KPI) Resolve(k oam.KPI) error { return fmt.Errorf("kpi data is nil") } // 是否存在网元 - neInfo := s.neInfoService.FindByCoreUidAndNeUid("*", k.NeUid) - if neInfo.NeType == "" || neInfo.NeUID != k.NeUid { + neInfo := s.neInfoService.FindByNeUid(k.NeUid) + if neInfo.NeType == "" || neInfo.NeUid != k.NeUid { return fmt.Errorf("resolve kpi network element does not exist %s", k.NeUid) } @@ -68,10 +67,6 @@ func (s KPI) saveKPIData(neInfo neModel.NeInfo, k oam.KPI, index int64) error { } else if k.RecordTime > 1e9 { recordTime = time.Unix(k.RecordTime, 0) } - recordDate := date.ParseDateToStr(recordTime, "2006-01-02") - recordEndTime := date.ParseDateToStr(recordTime, "15:04:05") - startTime := recordTime.Add(-time.Duration(k.Granularity) * time.Second) - recordStartTime := date.ParseDateToStr(startTime, "15:04:05") // kpi data数据json kpiTitles := s.kpiReportService.FindTitle(neInfo.NeType) @@ -98,18 +93,13 @@ func (s KPI) saveKPIData(neInfo neModel.NeInfo, k oam.KPI, index int64) error { // KPI 信息 kpiData := neDataModel.KpiReport{ - CoreUID: neInfo.CoreUID, - NeUID: neInfo.NeUID, - NeType: neInfo.NeType, - Date: recordDate, - StartTime: recordStartTime, - EndTime: recordEndTime, + NeID: neInfo.ID, + RecordTime: recordTime.UnixMilli(), Index: index, Granularity: k.Granularity, KpiValues: string(KpiValuesByte), - CreatedAt: k.RecordTime, } - insertId := s.kpiReportService.Insert(kpiData) + insertId := s.kpiReportService.Insert(neInfo.NeType, kpiData) if insertId <= 0 { return fmt.Errorf("add kpi data fail") } @@ -117,11 +107,10 @@ func (s KPI) saveKPIData(neInfo neModel.NeInfo, k oam.KPI, index int64) error { // 指标事件对象 data := map[string]any{ - "coreUid": kpiData.CoreUID, - "neUid": kpiData.NeUID, - "neType": kpiData.NeType, + "neType": neInfo.NeType, + "neId": kpiData.NeID, "startIndex": kpiData.Index, - "timeGroup": kpiData.CreatedAt, + "timeGroup": kpiData.CreatedTime, // kip_id ... } for _, v := range KpiValues { @@ -129,12 +118,12 @@ func (s KPI) saveKPIData(neInfo neModel.NeInfo, k oam.KPI, index int64) error { } // 推送到ws订阅组 - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI, neInfo.CoreUID, neInfo.NeUID), data) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_KPI, neInfo.NeUid), data) // 更新UPF总流量 if neInfo.NeType == "UPF" { upValue := parse.Number(data["UPF.03"]) downValue := parse.Number(data["UPF.06"]) - s.kpiReportService.UPFTodayFlowUpdate(neInfo.NeUID, upValue, downValue) + s.kpiReportService.UPFTodayFlowUpdate(neInfo.ID, upValue, downValue) } return nil } @@ -148,10 +137,6 @@ func (s KPI) saveKPIDataC(neInfo neModel.NeInfo, k oam.KPI, index int64) error { } else if k.RecordTime > 1e9 { recordTime = time.Unix(k.RecordTime, 0) } - recordDate := date.ParseDateToStr(recordTime, "2006-01-02") - recordEndTime := date.ParseDateToStr(recordTime, "15:04:05") - startTime := recordTime.Add(-time.Duration(k.Granularity) * time.Second) - recordStartTime := date.ParseDateToStr(startTime, "15:04:05") // kpi data数据json kpiCTitles := s.kpiCReportService.FindTitle(neInfo.NeType) @@ -205,18 +190,13 @@ func (s KPI) saveKPIDataC(neInfo neModel.NeInfo, k oam.KPI, index int64) error { // KPI 信息 kpiCData := neDataModel.KpiCReport{ - CoreUID: neInfo.CoreUID, - NeUID: neInfo.NeUID, - NeType: neInfo.NeType, - Date: recordDate, - StartTime: recordStartTime, - EndTime: recordEndTime, + NeID: neInfo.ID, + RecordTime: recordTime.UnixMilli(), Index: index, Granularity: k.Granularity, KpiValues: string(KpiValuesByte), - CreatedAt: k.RecordTime, } - insertId := s.kpiCReportService.Insert(kpiCData) + insertId := s.kpiCReportService.Insert(neInfo.NeType, kpiCData) if insertId <= 0 { return fmt.Errorf("add kpic data fail") } @@ -224,11 +204,10 @@ func (s KPI) saveKPIDataC(neInfo neModel.NeInfo, k oam.KPI, index int64) error { // 指标事件对象 data := map[string]any{ - "coreUid": kpiCData.CoreUID, - "neUid": kpiCData.NeUID, - "neType": kpiCData.NeType, + "neType": neInfo.NeType, + "neId": kpiCData.NeID, "startIndex": kpiCData.Index, - "timeGroup": kpiCData.CreatedAt, + "timeGroup": kpiCData.CreatedTime, // kip_id ... } for _, v := range KpiValues { @@ -236,6 +215,6 @@ func (s KPI) saveKPIDataC(neInfo neModel.NeInfo, k oam.KPI, index int64) error { } // 推送到ws订阅组 - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI_C, neInfo.CoreUID, neInfo.NeUID), data) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_KPI_C, neInfo.NeUid), data) return nil } diff --git a/src/modules/oam/service/nb_state.go b/src/modules/oam/service/nb_state.go index 6aad804d..62c694bc 100644 --- a/src/modules/oam/service/nb_state.go +++ b/src/modules/oam/service/nb_state.go @@ -30,15 +30,13 @@ type NBState struct { // Resolve 接收处理 func (s *NBState) Resolve(n oam.NBState) error { // 是否存在网元 - neInfo := s.neInfoService.FindByCoreUidAndNeUid("*", n.NeUid) - if neInfo.NeType == "" || neInfo.NeUID != n.NeUid { + neInfo := s.neInfoService.FindByNeUid(n.NeUid) + if neInfo.NeType == "" || neInfo.NeUid != n.NeUid { return fmt.Errorf("resolve nb_state network element does not exist %s", n.NeUid) } nbState := neDataModel.NBState{ - CoreUID: neInfo.CoreUID, - NeUID: neInfo.NeUID, - NeType: neInfo.NeType, + NeID: neInfo.ID, Address: n.Address, Name: n.Name, Position: n.Position, @@ -56,10 +54,10 @@ func (s *NBState) Resolve(n oam.NBState) error { switch neInfo.NeType { case "AMF": s.wsService.ByGroupID(wsService.GROUP_AMF_NB, nbState) - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_AMF_NB, neInfo.CoreUID, neInfo.NeUID), nbState) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_AMF_NB, neInfo.NeUid), nbState) case "MME": s.wsService.ByGroupID(wsService.GROUP_MME_NB, nbState) - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_MME_NB, neInfo.CoreUID, neInfo.NeUID), nbState) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_MME_NB, neInfo.NeUid), nbState) } return nil } diff --git a/src/modules/oam/service/ue_nb.go b/src/modules/oam/service/ue_nb.go index 9204274e..e4c260fb 100644 --- a/src/modules/oam/service/ue_nb.go +++ b/src/modules/oam/service/ue_nb.go @@ -29,21 +29,19 @@ type UENB struct { // Resolve 接收处理 func (s *UENB) Resolve(u oam.UENB) error { // 是否存在网元 - neInfo := s.neInfoService.FindByCoreUidAndNeUid("*", u.NeUid) - if neInfo.NeType == "" || neInfo.NeUID != u.NeUid { + neInfo := s.neInfoService.FindByNeUid(u.NeUid) + if neInfo.NeType == "" || neInfo.NeUid != u.NeUid { return fmt.Errorf("resolve ue_nb network element does not exist %s", u.NeUid) } uenbByte, _ := json.Marshal(u) uenbEvent := neDataNfModel.UEEvent{ - CoreUID: neInfo.CoreUID, - NeUID: neInfo.NeUID, - NeType: neInfo.NeType, - Timestamp: u.RecordTime, - EventType: u.Type, - EventJSONStr: string(uenbByte), + NeID: neInfo.ID, + RecordTime: u.RecordTime, + EventType: u.Type, + EventJson: string(uenbByte), } - insertId := s.ueEventService.Insert(uenbEvent) + insertId := s.ueEventService.Insert(neInfo.NeType, uenbEvent) if insertId <= 0 { return fmt.Errorf("add ue_nb data fail") } @@ -52,9 +50,9 @@ func (s *UENB) Resolve(u oam.UENB) error { // 推送到ws订阅组 switch neInfo.NeType { case "AMF": - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_AMF_UE, neInfo.CoreUID, neInfo.NeUID), uenbEvent) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_AMF_UE, neInfo.NeUid), uenbEvent) case "MME": - s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_MME_UE, neInfo.CoreUID, neInfo.NeUID), uenbEvent) + s.wsService.ByGroupID(fmt.Sprintf("%s_%s", wsService.GROUP_MME_UE, neInfo.NeUid), uenbEvent) } return nil } diff --git a/src/modules/tool/controller/iperf.go b/src/modules/tool/controller/iperf.go index 5b6e8ec4..465d45fc 100644 --- a/src/modules/tool/controller/iperf.go +++ b/src/modules/tool/controller/iperf.go @@ -49,7 +49,6 @@ type IPerfController struct { func (s *IPerfController) Version(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUid string `form:"coreUid" binding:"required"` // 核心网唯一资源标识 NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 Version string `form:"version" binding:"required,oneof=V2 V3"` // 版本 } @@ -59,7 +58,14 @@ func (s *IPerfController) Version(c *gin.Context) { return } - output, err := s.iperfService.Version(query.CoreUid, query.NeUid, query.Version) + // 查询网元获取IP + neInfo := neService.NewNeInfo.FindByNeUid(query.NeUid) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUid { + c.JSON(200, resp.ErrMsg("neInfo not found")) + return + } + + output, err := s.iperfService.Version(neInfo.ID, query.Version) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -88,10 +94,9 @@ func (s *IPerfController) Version(c *gin.Context) { func (s *IPerfController) Run(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUid string `form:"coreUid" binding:"required"` // 核心网唯一资源标识 - NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 - Cols int `form:"cols"` // 终端单行字符数 - Rows int `form:"rows"` // 终端显示行数 + NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -106,8 +111,15 @@ func (s *IPerfController) Run(c *gin.Context) { return } + // 查询网元获取IP + neInfo := neService.NewNeInfo.FindByNeUid(query.NeUid) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUid { + c.JSON(200, resp.ErrMsg("neInfo not found")) + return + } + // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.CoreUid, query.NeUid) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return diff --git a/src/modules/tool/controller/mml.go b/src/modules/tool/controller/mml.go index ba8073d5..9cf9eec2 100644 --- a/src/modules/tool/controller/mml.go +++ b/src/modules/tool/controller/mml.go @@ -65,7 +65,6 @@ func (s MMLController) LogList(c *gin.Context) { func (s MMLController) Command(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUID string `json:"coreUid" binding:"required"` // 核心网唯一标识 NeUID string `json:"neUid" binding:"required"` // 网元唯一标识 Command []string `json:"command" binding:"required"` // 命令 Type string `json:"type" binding:"required,oneof=General Standard"` // 类型UPF标准版 General Standard @@ -77,8 +76,8 @@ func (s MMLController) Command(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(body.CoreUID, body.NeUID) - if neInfo.CoreUID != body.CoreUID || neInfo.NeUID != body.NeUID { + neInfo := s.neInfoService.FindByNeUid(body.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != body.NeUID { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } @@ -87,7 +86,7 @@ func (s MMLController) Command(c *gin.Context) { if neInfo.NeType == "UPF" && body.Type == "Standard" { num = 2 } - telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.CoreUID, neInfo.NeUID, num) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, num) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return @@ -117,13 +116,10 @@ func (s MMLController) Command(c *gin.Context) { // 记录日志 mmlLog := model.MMLLog{ - CoreUID: neInfo.CoreUID, - NeUID: neInfo.NeUID, - NeType: neInfo.NeType, - User: reqctx.LoginUserToUserName(c), - Ip: c.ClientIP(), - Command: strings.Join(body.Command, ";"), - Result: resultStr, + NeId: neInfo.ID, + CreateBy: reqctx.LoginUserToUserName(c), + Command: strings.Join(body.Command, ";"), + Result: resultStr, } s.mmlLogService.Insert(mmlLog) c.JSON(200, resp.OkData(result)) diff --git a/src/modules/tool/controller/ping.go b/src/modules/tool/controller/ping.go index a4ec8ad3..e273fd90 100644 --- a/src/modules/tool/controller/ping.go +++ b/src/modules/tool/controller/ping.go @@ -119,8 +119,7 @@ func (s *PingController) StatisticsOn(c *gin.Context) { func (s *PingController) Version(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUid string `form:"coreUid" binding:"required"` // 核心网唯一资源标识 - NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 + NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -128,7 +127,14 @@ func (s *PingController) Version(c *gin.Context) { return } - output, err := s.pingService.Version(query.CoreUid, query.NeUid) + // 查询网元获取IP + neInfo := neService.NewNeInfo.FindByNeUid(query.NeUid) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUid { + c.JSON(200, resp.ErrMsg("neInfo not found")) + return + } + + output, err := s.pingService.Version(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -156,10 +162,9 @@ func (s *PingController) Version(c *gin.Context) { func (s *PingController) Run(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUid string `form:"coreUid" binding:"required"` // 核心网唯一资源标识 - NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 - Cols int `form:"cols"` // 终端单行字符数 - Rows int `form:"rows"` // 终端显示行数 + NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -174,8 +179,15 @@ func (s *PingController) Run(c *gin.Context) { return } + // 查询网元获取IP + neInfo := neService.NewNeInfo.FindByNeUid(query.NeUid) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUid { + c.JSON(200, resp.ErrMsg("neInfo not found")) + return + } + // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.CoreUid, query.NeUid) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return diff --git a/src/modules/tool/model/mml_log.go b/src/modules/tool/model/mml_log.go index 3c98da4f..97780e2e 100644 --- a/src/modules/tool/model/mml_log.go +++ b/src/modules/tool/model/mml_log.go @@ -2,15 +2,18 @@ package model // MMLLog MML网元命令 type MMLLog struct { - ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` - CoreUID string `json:"coreUid" gorm:"column:core_uid"` // 核心网唯一标识 - NeUID string `json:"neUid" gorm:"column:ne_uid"` // 网元唯一标识 - NeType string `json:"neType" gorm:"column:ne_type"` // 网元类型 - User string `json:"user" gorm:"column:user"` - Ip string `json:"ip" gorm:"column:ip"` - Command string `json:"command" gorm:"column:command"` // 命令 - Result string `json:"result" gorm:"column:result"` - LogTime int64 `json:"logTime" gorm:"column:log_time"` + ID int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeId int64 `json:"neId" gorm:"column:ne_id"` // 网元ID + CreateBy string `json:"createBy" gorm:"column:create_by"` // 创建者 + CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 + Command string `json:"command" gorm:"column:command"` // 命令 ; 分隔 + Result string `json:"result" gorm:"column:result"` // 成功和有错误 + + // ====== 非数据库字段属性 ====== + + NeUid string `json:"neUid,omitempty" gorm:"->"` // 网元唯一标识 + NeName string `json:"neName,omitempty" gorm:"->"` // 网元名称 + NeType string `json:"neType,omitempty" gorm:"->"` // 网元类型 } // TableName 表名称 diff --git a/src/modules/tool/repository/mml_log.go b/src/modules/tool/repository/mml_log.go index 333d2fc6..fadcffd2 100644 --- a/src/modules/tool/repository/mml_log.go +++ b/src/modules/tool/repository/mml_log.go @@ -1,11 +1,11 @@ package repository import ( - "fmt" "time" "be.ems/src/framework/database/db" "be.ems/src/framework/logger" + "be.ems/src/framework/utils/parse" "be.ems/src/modules/tool/model" ) @@ -19,26 +19,14 @@ type MMLLog struct{} func (r MMLLog) SelectByPage(query map[string]string) ([]model.MMLLog, int64) { tx := db.DB("").Model(&model.MMLLog{}) // 查询条件拼接 - if v, ok := query["coreUid"]; ok && v != "" { - tx = tx.Where("core_uid = ?", v) - } - if v, ok := query["neUid"]; ok && v != "" { - tx = tx.Where("ne_uid = ?", v) - } - if v, ok := query["neType"]; ok && v != "" { - tx = tx.Where("ne_type = ?", v) + if v, ok := query["neId"]; ok && v != "" { + tx = tx.Where("ne_id = ?", v) } if v, ok := query["beginTime"]; ok && v != "" { - if len(v) == 10 { - v = fmt.Sprintf("%s000", v) - } - tx = tx.Where("log_time >= ?", v) + tx = tx.Where("create_time >= ?", parse.Number(v)) } if v, ok := query["endTime"]; ok && v != "" { - if len(v) == 10 { - v = fmt.Sprintf("%s999", v) - } - tx = tx.Where("log_time <= ?", v) + tx = tx.Where("create_time <= ?", parse.Number(v)) } // 查询结果 @@ -53,6 +41,10 @@ func (r MMLLog) SelectByPage(query map[string]string) ([]model.MMLLog, int64) { // 查询数据分页 pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"]) tx = tx.Limit(pageSize).Offset(pageSize * pageNum) + + // 关联查询 + tx = tx.Joins("left join ne_info on ne_info.id = mml_log.ne_id") + tx = tx.Select("mml_log.*, ne_info.ne_name, ne_info.ne_type, ne_info.ne_uid") err := tx.Find(&rows).Error if err != nil { logger.Errorf("query find err => %v", err.Error()) @@ -63,7 +55,7 @@ func (r MMLLog) SelectByPage(query map[string]string) ([]model.MMLLog, int64) { // Insert 新增信息 返回新增数据ID func (r MMLLog) Insert(param model.MMLLog) int64 { - param.LogTime = time.Now().UnixMilli() + param.CreateTime = time.Now().UnixMilli() // 执行插入 if err := db.DB("").Create(¶m).Error; err != nil { logger.Errorf("insert err => %v", err.Error()) diff --git a/src/modules/tool/service/iperf.go b/src/modules/tool/service/iperf.go index 12109d35..7889964e 100644 --- a/src/modules/tool/service/iperf.go +++ b/src/modules/tool/service/iperf.go @@ -21,7 +21,7 @@ var NewIPerf = &IPerf{} type IPerf struct{} // Version 查询版本信息 -func (s *IPerf) Version(coreUid, neUid, version string) (string, error) { +func (s *IPerf) Version(neId int64, version string) (string, error) { if version != "V2" && version != "V3" { return "", fmt.Errorf("iperf version is required V2 or V3") } @@ -31,7 +31,7 @@ func (s *IPerf) Version(coreUid, neUid, version string) (string, error) { } // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfo.NeRunSSHClient(coreUid, neUid) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(neId) if err != nil { return "", err } diff --git a/src/modules/tool/service/ping.go b/src/modules/tool/service/ping.go index d6e2966e..24cc855b 100644 --- a/src/modules/tool/service/ping.go +++ b/src/modules/tool/service/ping.go @@ -136,9 +136,9 @@ func (s *Ping) StatisticsOn(client *wsModel.WSClient, reqMsg wsModel.WSRequest) } // Version 查询版本信息 -func (s *Ping) Version(coreUid, neUid string) (string, error) { +func (s *Ping) Version(neId int64) (string, error) { // 检查是否安装ping - output, err := neService.NewNeInfo.NeRunSSHCmd(coreUid, neUid, "ping -V") + output, err := neService.NewNeInfo.NeRunSSHCmd(neId, "ping -V") if err != nil { return "", fmt.Errorf("ping not installed") } diff --git a/src/modules/trace/controller/tcpdump.go b/src/modules/trace/controller/tcpdump.go index 929bab70..8f23f185 100644 --- a/src/modules/trace/controller/tcpdump.go +++ b/src/modules/trace/controller/tcpdump.go @@ -39,9 +39,8 @@ type TCPdumpController struct { func (s *TCPdumpController) DumpStart(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUid string `form:"coreUid" binding:"required"` // 核心网唯一资源标识 - NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 - Cmd string `json:"cmd" binding:"required"` // 命令 "-n -s 0 -v" + NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 + Cmd string `json:"cmd" binding:"required"` // 命令 "-n -s 0 -v" } if err := c.ShouldBindBodyWithJSON(&body); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -49,7 +48,7 @@ func (s *TCPdumpController) DumpStart(c *gin.Context) { return } - taskCode, err := s.tcpdumpService.DumpStart(body.CoreUid, body.NeUid, body.Cmd) + taskCode, err := s.tcpdumpService.DumpStart(body.NeUid, body.Cmd) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -73,7 +72,6 @@ func (s *TCPdumpController) DumpStart(c *gin.Context) { func (s *TCPdumpController) DumpStop(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUid string `json:"coreUid" binding:"required"` // 核心网唯一资源标识 NeUid string `json:"neUid" binding:"required"` // 网元唯一资源标识 TaskCode string `json:"taskCode" binding:"required"` // 任务码,停止任务并查看日志信息 } @@ -83,7 +81,7 @@ func (s *TCPdumpController) DumpStop(c *gin.Context) { return } - logFiles, err := s.tcpdumpService.DumpStop(body.CoreUid, body.NeUid, body.TaskCode) + logFiles, err := s.tcpdumpService.DumpStop(body.NeUid, body.TaskCode) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return @@ -107,9 +105,8 @@ func (s *TCPdumpController) DumpStop(c *gin.Context) { func (s *TCPdumpController) UPFTrace(c *gin.Context) { language := reqctx.AcceptLanguage(c) var body struct { - CoreUid string `json:"coreUid" binding:"required"` // 核心网唯一资源标识 - NeUid string `json:"neUid" binding:"required"` // 网元唯一资源标识 - Cmd string `json:"cmd" binding:"required"` // 命令 + NeUid string `json:"neUid" binding:"required"` // 网元唯一资源标识 + Cmd string `json:"cmd" binding:"required"` // 命令 } if err := c.ShouldBindBodyWithJSON(&body); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -117,7 +114,7 @@ func (s *TCPdumpController) UPFTrace(c *gin.Context) { return } - msg, err := s.tcpdumpService.UPFTrace(body.CoreUid, body.NeUid, body.Cmd) + msg, err := s.tcpdumpService.UPFTrace(body.NeUid, body.Cmd) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return diff --git a/src/modules/trace/controller/trace_task.go b/src/modules/trace/controller/trace_task.go index c1936f99..4afc65fd 100644 --- a/src/modules/trace/controller/trace_task.go +++ b/src/modules/trace/controller/trace_task.go @@ -33,12 +33,6 @@ type TraceTaskController struct { // GET /list func (s *TraceTaskController) List(c *gin.Context) { query := reqctx.QueryMap(c) - coreUid, coreUidOk := query["coreUid"] - if !coreUidOk || coreUid == "" { - c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: coreUid is empty")) - return - } - rows, total := s.traceTaskService.FindByPage(query) c.JSON(200, resp.OkData(map[string]any{"rows": rows, "total": total})) } @@ -48,8 +42,7 @@ func (s *TraceTaskController) List(c *gin.Context) { // GET / func (s *TraceTaskController) Info(c *gin.Context) { var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - ID int64 `form:"id" binding:"required"` // ID + ID int64 `form:"id" binding:"required"` // ID } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -58,7 +51,7 @@ func (s *TraceTaskController) Info(c *gin.Context) { } data := s.traceTaskService.FindById(query.ID) - if data.ID != query.ID || data.CoreUID != query.CoreUID { + if data.ID != query.ID { c.JSON(200, resp.ErrMsg("not found")) return } @@ -91,12 +84,11 @@ func (s *TraceTaskController) Add(c *gin.Context) { // 跟踪任务删除 // -// DELETE /:id +// DELETE / func (s *TraceTaskController) Remove(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUID string `form:"coreUid" binding:"required"` // 核心网唯一标识 - ID string `form:"id" binding:"required"` // 记录ID + ID string `form:"id" binding:"required"` // 记录ID } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -112,7 +104,7 @@ func (s *TraceTaskController) Remove(c *gin.Context) { ids = append(ids, parse.Number(v)) } - rows, err := s.traceTaskService.DeleteByIds(ids, query.CoreUID) + rows, err := s.traceTaskService.DeleteByIds(ids) if err != nil { c.JSON(200, resp.ErrMsg(i18n.TKey(language, err.Error()))) return diff --git a/src/modules/trace/controller/trace_task_hlr.go b/src/modules/trace/controller/trace_task_hlr.go index 202dabd2..7edc5286 100644 --- a/src/modules/trace/controller/trace_task_hlr.go +++ b/src/modules/trace/controller/trace_task_hlr.go @@ -186,8 +186,7 @@ func (s *TraceTaskHlrController) File(c *gin.Context) { func (s *TraceTaskHlrController) FilePull(c *gin.Context) { language := reqctx.AcceptLanguage(c) var querys struct { - CoreUid string `form:"coreUid" binding:"required"` // 核心网唯一资源标识 - NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 + NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 Path string `form:"path" binding:"required"` FileName string `form:"fileName" binding:"required"` DelTemp bool `form:"delTemp"` // 删除本地临时文件 @@ -199,14 +198,14 @@ func (s *TraceTaskHlrController) FilePull(c *gin.Context) { } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(querys.CoreUid, querys.NeUid) - if neInfo.CoreUID != querys.CoreUid || neInfo.NeUID != querys.NeUid { + neInfo := s.neInfoService.FindByNeUid(querys.NeUid) + if neInfo.ID == 0 || neInfo.NeUid != querys.NeUid { c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) return } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return diff --git a/src/modules/trace/model/trace_task.go b/src/modules/trace/model/trace_task.go index 3b6de854..390b8c01 100644 --- a/src/modules/trace/model/trace_task.go +++ b/src/modules/trace/model/trace_task.go @@ -16,8 +16,8 @@ type TraceTask struct { CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间 Title string `json:"title" gorm:"column:title" binding:"required"` // 任务标题 Remark string `json:"remark" gorm:"column:remark"` // 备注 - CoreUID string `json:"coreUid" gorm:"column:core_uid" binding:"required"` // 核心网唯一标识 - NeList string `json:"neList" gorm:"column:ne_list" binding:"required"` // 网元列表 neUid,neUid + CoreId int64 `json:"coreId" gorm:"column:core_id" binding:"required"` // 核心网ID + NeIds string `json:"neIds" gorm:"column:ne_ids" binding:"required"` // 网元ID列表 neId,neId NotifyUrl string `json:"notifyUrl" gorm:"column:notify_url"` // 信息数据通知回调地址UDP 例如udp:192.168.5.58:33033 } diff --git a/src/modules/trace/repository/trace_task.go b/src/modules/trace/repository/trace_task.go index 3f0d5e8f..6c21a043 100644 --- a/src/modules/trace/repository/trace_task.go +++ b/src/modules/trace/repository/trace_task.go @@ -75,9 +75,10 @@ func (r TraceTask) SelectByPage(query map[string]string) ([]model.TraceTask, int sortOrder := sortOrderArr[i] // 排序字段 sort := "id" - if sortBy == "operaBy" { + switch sortBy { + case "operaBy": sort = "opera_by" - } else if sortBy == "endTime" { + case "endTime": sort = "end_time" } // 排序方式 @@ -118,11 +119,11 @@ func (r TraceTask) SelectByIds(ids []int64) []model.TraceTask { } // SelectByUnstopped 查询未停止的任务补发 -func (r TraceTask) SelectByUnstopped(coreUid, neUid string) []model.TraceTask { +func (r TraceTask) SelectByUnstopped(neId int64) []model.TraceTask { rows := []model.TraceTask{} tx := db.DB("").Model(&model.TraceTask{}) // 构建查询条件 - tx = tx.Where("end_time > ? and core_uid = ? and ne_list like ?", time.Now().UnixMilli(), coreUid, fmt.Sprintf("%%%s%%", neUid)) + tx = tx.Where("end_time > ? and ne_ids like ?", time.Now().UnixMilli(), fmt.Sprintf("%%%d%%", neId)) // 查询数据 if err := tx.Find(&rows).Error; err != nil { logger.Errorf("query find err => %v", err.Error()) diff --git a/src/modules/trace/service/tcpdump.go b/src/modules/trace/service/tcpdump.go index a60a0c2c..5fc14617 100644 --- a/src/modules/trace/service/tcpdump.go +++ b/src/modules/trace/service/tcpdump.go @@ -27,19 +27,19 @@ type TCPdump struct { var dumpPIDMap sync.Map // DumpStart 触发tcpdump开始抓包 -func (s *TCPdump) DumpStart(coreUid, neUid, cmdStr string) (string, error) { +func (s *TCPdump) DumpStart(neUid string, cmdStr string) (string, error) { // 命令检查 if strings.Contains(cmdStr, "-w") { return "", fmt.Errorf("command cannot contain -w") } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.ID == 0 || neInfo.NeUid != neUid { return "", fmt.Errorf("app.common.noNEInfo") } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(coreUid, neUid) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { return "", err } @@ -55,7 +55,7 @@ func (s *TCPdump) DumpStart(coreUid, neUid, cmdStr string) (string, error) { taskCode := time.Now().Format("20060102150405") // 存放文件目录 /usr/local/omc/tcpdump/udm/001/20240817104241 - neDirTemp := fmt.Sprintf("/usr/local/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeUID, taskCode) + neDirTemp := fmt.Sprintf("/usr/local/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeUid, taskCode) sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p %s && sudo chmod 777 -R /usr/local/omc/tcpdump", neDirTemp)) // 命令拼装 @@ -82,34 +82,34 @@ func (s *TCPdump) DumpStart(coreUid, neUid, cmdStr string) (string, error) { // 日志文件行号 PIDMap := s.logFileLastLine(neInfo.NeType, sshClient) PIDMap["neType"] = neInfo.NeType - PIDMap["neUid"] = neInfo.NeUID + PIDMap["neUid"] = neInfo.NeUid PIDMap["taskCode"] = taskCode PIDMap["pid"] = outputPID PIDMap["cmd"] = sendCmd // 检查进程 ps aux | grep tcpdump // 强杀 sudo pkill tcpdump - pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeUID, taskCode) + pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeUid, taskCode) dumpPIDMap.Store(pidKey, PIDMap) return taskCode, err } // DumpStop 停止已存在抓包句柄 -func (s *TCPdump) DumpStop(coreUid, neUid, taskCode string) ([]string, error) { +func (s *TCPdump) DumpStop(neUid, taskCode string) ([]string, error) { // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.ID == 0 || neInfo.NeUid != neUid { return []string{}, fmt.Errorf("app.common.noNEInfo") } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(coreUid, neUid) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { return []string{}, err } defer sshClient.Close() // 是否存在执行过的进程 - pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeUID, taskCode) + pidKey := fmt.Sprintf("%s_%s_%s", strings.ToLower(neInfo.NeType), neInfo.NeUid, taskCode) PIDMap, ok := dumpPIDMap.Load(pidKey) if !ok || PIDMap == nil { return []string{}, fmt.Errorf("tcpdump is not running") @@ -121,7 +121,7 @@ func (s *TCPdump) DumpStop(coreUid, neUid, taskCode string) ([]string, error) { s.logFileLastLineToFile(PIDMap.(map[string]string), sshClient) // 存放文件目录 /usr/local/omc/tcpdump/udm/001/20240817104241 - neDirTemp := fmt.Sprintf("/usr/local/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeUID, taskCode) + neDirTemp := fmt.Sprintf("/usr/local/omc/tcpdump/%s/%s/%s", strings.ToLower(neInfo.NeType), neInfo.NeUid, taskCode) // 命令拼装 sendCmd := fmt.Sprintf("pids=$(pgrep -P %s) && [ -n \"$pids\" ] && sudo kill $pids;sudo timeout 2s ls %s", pid, neDirTemp) // pids=$(pgrep -P 1914341) && [ -n "$pids" ] && sudo kill $pids;sudo timeout 2s ls /usr/local/omc/tcpdump/udm/001/20240817104241 @@ -208,25 +208,25 @@ func (s *TCPdump) logFileLastLineToFile(PIDMap map[string]string, sshClient *ssh } // UPFTrace UPF标准版内部抓包 -func (s *TCPdump) UPFTrace(coreUid, neUid, cmdStr string) (string, error) { +func (s *TCPdump) UPFTrace(neUid, cmdStr string) (string, error) { // 命令检查 if strings.Contains(cmdStr, "file") { return "", fmt.Errorf("command cannot contain file") } // 查询网元获取IP - neInfo := s.neInfoService.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := s.neInfoService.FindByNeUid(neUid) + if neInfo.ID == 0 || neInfo.NeUid != neUid { return "", fmt.Errorf("app.common.noNEInfo") } // 网元主机的SSH客户端 - sshClient, err := s.neInfoService.NeRunSSHClient(coreUid, neUid) + sshClient, err := s.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { return "", err } defer sshClient.Close() // 网元主机的Telnet客户端 - telnetClient, err := s.neInfoService.NeRunTelnetClient(coreUid, neUid, 2) + telnetClient, err := s.neInfoService.NeRunTelnetClient(neInfo.ID, 2) if err != nil { return "", err } @@ -234,7 +234,7 @@ func (s *TCPdump) UPFTrace(coreUid, neUid, cmdStr string) (string, error) { telnetClient.RunCMD("") // 再次排空信息 // 命令拼装 - fileName := fmt.Sprintf("%s_%s_part_%s.pcap ", neInfo.NeType, neInfo.NeUID, time.Now().Format("20060102150405")) + fileName := fmt.Sprintf("%s_%s_part_%s.pcap ", neInfo.NeType, neInfo.NeUid, time.Now().Format("20060102150405")) pcapCmd := fmt.Sprintf("%s\r\n", cmdStr) // 以off结尾是停止抓包,不需要写文件 if !strings.Contains(cmdStr, "off") { diff --git a/src/modules/trace/service/trace_task.go b/src/modules/trace/service/trace_task.go index 14d3bd8f..f4afdd74 100644 --- a/src/modules/trace/service/trace_task.go +++ b/src/modules/trace/service/trace_task.go @@ -199,9 +199,9 @@ func (r TraceTask) createTaskToNe(task *model.TraceTask, ignoreErr bool) error { } task.NotifyUrl = fmt.Sprintf("udp:%s:%d", host, port) // 网元列表 - neList := strings.Split(task.NeList, ",") - if len(neList) <= 0 { - return fmt.Errorf("ne list is empty") + neIds := strings.Split(task.NeIds, ",") + if len(neIds) <= 0 { + return fmt.Errorf("ne ids is empty") } // 生成任务ID if task.TraceId == "" { @@ -210,20 +210,16 @@ func (r TraceTask) createTaskToNe(task *model.TraceTask, ignoreErr bool) error { // 发送任务给网元 errNe := []string{} - for _, neTypeID := range neList { - neTypeIDArr := strings.Split(neTypeID, "_") - if len(neTypeIDArr) != 2 { - logger.Warnf("ne type id is error") - continue - } - neInfo := neService.NewNeInfo.FindByCoreUidAndNeUid(task.CoreUID, neTypeIDArr[1]) - if neInfo.CoreUID != task.CoreUID || neInfo.NeUID != neTypeIDArr[1] { - logger.Warnf("ne uid is not exist") + for _, neIdStr := range neIds { + neId := parse.Number(neIdStr) + neInfo := neService.NewNeInfo.FindByNeId(neId) + if neInfo.ID == 0 || neInfo.ID != neId { + logger.Warnf("ne id is not exist") continue } if err := r.traceNeTask(neInfo, *task); err != nil { - logger.Errorf("ne uid is %s to %s error: %s", task.TraceId, neTypeIDArr[1], err.Error()) - errNe = append(errNe, neTypeIDArr[1]) + logger.Errorf("ne id is %s to %s error: %s", task.TraceId, neIdStr, err.Error()) + errNe = append(errNe, neIdStr) continue } } @@ -231,14 +227,11 @@ func (r TraceTask) createTaskToNe(task *model.TraceTask, ignoreErr bool) error { return nil } // 移除任务 - for _, neTypeID := range neList { - neTypeIDArr := strings.Split(neTypeID, "_") - if len(neTypeIDArr) != 2 { - logger.Warnf("ne type id is error") - continue - } - neInfo := neService.NewNeInfo.FindByCoreUidAndNeUid(task.CoreUID, neTypeIDArr[1]) - if neInfo.CoreUID != task.CoreUID || neInfo.NeUID != neTypeIDArr[1] { + for _, neIdStr := range neIds { + neId := parse.Number(neIdStr) + neInfo := neService.NewNeInfo.FindByNeId(neId) + if neInfo.ID == 0 || neInfo.ID != neId { + logger.Warnf("ne id is not exist") continue } neFetchlink.NeTraceDelete(neInfo, task.TraceId) @@ -295,37 +288,29 @@ func (r TraceTask) traceNeTask(neInfo neModel.NeInfo, task model.TraceTask) erro } // DeleteByIds 批量删除信息 -func (r TraceTask) DeleteByIds(ids []int64, coreUid string) (int64, error) { +func (r TraceTask) DeleteByIds(ids []int64) (int64, error) { // 检查是否存在 arr := r.traceTaskRepository.SelectByIds(ids) if len(arr) != len(ids) { return 0, fmt.Errorf("not match id") } - for _, v := range arr { - if v.CoreUID != coreUid { - return 0, fmt.Errorf("data not match, id: %d", v.ID) - } - } // 删除数据同时给网元发送停止任务 for _, v := range arr { // 删除数据 r.traceDataRepository.DeleteByTraceId(v.TraceId) // 网元列表 - neList := strings.Split(v.NeList, ",") - if len(neList) <= 0 { + neIds := strings.Split(v.NeIds, ",") + if len(neIds) <= 0 { continue } // 停止任务 - for _, neTypeID := range neList { - neTypeIDArr := strings.Split(neTypeID, "_") - if len(neTypeIDArr) != 2 { - logger.Warnf("ne type id is error") - continue - } - neInfo := neService.NewNeInfo.FindByCoreUidAndNeUid(v.CoreUID, neTypeIDArr[1]) - if neInfo.CoreUID != v.CoreUID || neInfo.NeUID != neTypeIDArr[1] { + for _, neIdStr := range neIds { + neId := parse.Number(neIdStr) + neInfo := neService.NewNeInfo.FindByNeId(neId) + if neInfo.ID == 0 || neInfo.ID != neId { + logger.Warnf("ne id is not exist") continue } neFetchlink.NeTraceDelete(neInfo, v.TraceId) @@ -338,8 +323,8 @@ func (r TraceTask) DeleteByIds(ids []int64, coreUid string) (int64, error) { } // RunUnstopped 启动跟踪未停止的任务 -func (r TraceTask) RunUnstopped(coreUid, neUid string) { - tasks := r.traceTaskRepository.SelectByUnstopped(coreUid, neUid) +func (r TraceTask) RunUnstopped(neId int64) { + tasks := r.traceTaskRepository.SelectByUnstopped(neId) for _, task := range tasks { r.createTaskToNe(&task, true) } diff --git a/src/modules/trace/service/trace_task_hlr.go b/src/modules/trace/service/trace_task_hlr.go index 202bfda2..8512a34d 100644 --- a/src/modules/trace/service/trace_task_hlr.go +++ b/src/modules/trace/service/trace_task_hlr.go @@ -101,10 +101,9 @@ func (r *TraceTaskHlr) Start(task model.TraceTaskHlr) (int64, error) { neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "HLR"}, false, false) for _, neInfo := range neInfos { hlrItem := map[string]any{ - "coreUid": neInfo.CoreUID, - "neUid": neInfo.NeUID, - "neType": neInfo.NeType, - "msg": "", + "neUid": neInfo.NeUid, + "neType": neInfo.NeType, + "msg": "", } msg, err := neFetchlink.HLRTraceStart(neInfo, data) if err != nil { @@ -133,10 +132,9 @@ func (r *TraceTaskHlr) Stop(task model.TraceTaskHlr) error { neInfos := r.neInfoService.Find(neModel.NeInfo{NeType: "HLR"}, false, false) for _, neInfo := range neInfos { hlrItem := map[string]any{ - "coreUid": neInfo.CoreUID, - "neUid": neInfo.NeUID, - "neType": neInfo.NeType, - "msg": "", + "neUid": neInfo.NeUid, + "neType": neInfo.NeType, + "msg": "", } msg, err := neFetchlink.HLRTraceStop(neInfo, map[string]any{ "traceIDArray": []string{task.TraceId}, @@ -171,15 +169,14 @@ func (r *TraceTaskHlr) File(traceId, dirPath string) ([]map[string]any, error) { // 遍历多个网元主机获取文件 for _, neInfo := range neInfos { hlrItem := map[string]any{ - "coreUid": neInfo.CoreUID, - "neUid": neInfo.NeUID, - "neType": neInfo.NeType, - "neName": neInfo.NeName, - "err": "", + "neUid": neInfo.NeUid, + "neType": neInfo.NeType, + "neName": neInfo.NeName, + "err": "", } // 网元主机的SSH客户端 - sshClient, err := r.neInfoService.NeRunSSHClient(neInfo.CoreUID, neInfo.NeUID) + sshClient, err := r.neInfoService.NeRunSSHClient(neInfo.ID) if err != nil { hlrItem["err"] = "ssh link fail" hlrList = append(hlrList, hlrItem) diff --git a/src/modules/ws/controller/ws_view.go b/src/modules/ws/controller/ws_view.go index 5cfa759c..9cd04083 100644 --- a/src/modules/ws/controller/ws_view.go +++ b/src/modules/ws/controller/ws_view.go @@ -33,10 +33,9 @@ import ( func (s *WSController) ShellView(c *gin.Context) { language := reqctx.AcceptLanguage(c) var query struct { - CoreUid string `form:"coreUid" binding:"required"` // 核心网唯一资源标识 - NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 - Cols int `form:"cols"` // 终端单行字符数 - Rows int `form:"rows"` // 终端显示行数 + NeUid string `form:"neUid" binding:"required"` // 网元唯一资源标识 + Cols int `form:"cols"` // 终端单行字符数 + Rows int `form:"rows"` // 终端显示行数 } if err := c.ShouldBindQuery(&query); err != nil { errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) @@ -57,8 +56,15 @@ func (s *WSController) ShellView(c *gin.Context) { return } + // 查询网元获取IP + neInfo := neService.NewNeInfo.FindByNeUid(query.NeUid) + if neInfo.ID == 0 || neInfo.NeUid != query.NeUid { + c.JSON(200, resp.ErrMsg("neInfo not found")) + return + } + // 网元主机的SSH客户端 - sshClient, err := neService.NewNeInfo.NeRunSSHClient(query.CoreUid, query.NeUid) + sshClient, err := neService.NewNeInfo.NeRunSSHClient(neInfo.ID) if err != nil { c.JSON(200, resp.ErrMsg(err.Error())) return diff --git a/src/modules/ws/processor/cdr_connect.go b/src/modules/ws/processor/cdr_connect.go index ea494eac..326796a8 100644 --- a/src/modules/ws/processor/cdr_connect.go +++ b/src/modules/ws/processor/cdr_connect.go @@ -22,17 +22,19 @@ func GetCDRConnect(requestID string, data any) ([]byte, error) { query[k] = fmt.Sprintf("%v", v) } - coreUid, coreUidOk := query["coreUid"] neUid, neUidOk := query["neUid"] - if !coreUidOk || !neUidOk || coreUid == "" || neUid == "" { - return nil, fmt.Errorf("query coreUid or neUid is empty") + if !neUidOk || neUid == "" { + return nil, fmt.Errorf("query neUid is empty") } // 查询网元获取IP - neInfo := neInfoService.NewNeInfo.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := neInfoService.NewNeInfo.FindByNeUid(neUid) + if neInfo.ID == 0 || neInfo.NeUid != neUid { return nil, fmt.Errorf("query neinfo not found") } + query["neId"] = fmt.Sprint(neInfo.ID) + + // 查询 rows, total := neDataNfService.NewCDREvent.FindByPage(neInfo.NeType, query) resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, diff --git a/src/modules/ws/processor/ne_state.go b/src/modules/ws/processor/ne_state.go index 84b3a765..780bfe52 100644 --- a/src/modules/ws/processor/ne_state.go +++ b/src/modules/ws/processor/ne_state.go @@ -14,8 +14,7 @@ import ( func GetNeState(requestID string, data any) ([]byte, error) { msgByte, _ := json.Marshal(data) var querys struct { - CoreUid string `json:"coreUid" binding:"required"` // 核心网唯一资源标识 - NeUid string `json:"neUid" binding:"required"` // 网元唯一资源标识 + NeUid string `json:"neUid" binding:"required"` // 网元唯一资源标识 } err := json.Unmarshal(msgByte, &querys) if err != nil { @@ -23,13 +22,13 @@ func GetNeState(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query data structure error") } - if querys.CoreUid == "" || querys.NeUid == "" { - return nil, fmt.Errorf("query coreUid/neUid empty") + if querys.NeUid == "" { + return nil, fmt.Errorf("query neUid empty") } // 查询网元获取IP - neInfo := neService.NewNeInfo.FindByCoreUidAndNeUid(querys.CoreUid, querys.NeUid) - if neInfo.CoreUID != querys.CoreUid || neInfo.NeUID != querys.NeUid { + neInfo := neService.NewNeInfo.FindByNeUid(querys.NeUid) + if neInfo.ID == 0 || neInfo.NeUid != querys.NeUid { return nil, fmt.Errorf("no matching network element information found") } @@ -39,12 +38,13 @@ func GetNeState(requestID string, data any) ([]byte, error) { resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, "data": map[string]any{ - "online": false, - "coreUid": neInfo.CoreUID, - "neUid": neInfo.NeUID, - "neName": neInfo.NeName, - "neType": neInfo.NeType, - "ipAddr": neInfo.IPAddr, + "online": false, + "coreId": neInfo.CoreId, + "neId": neInfo.ID, + "neUid": neInfo.NeUid, + "neType": neInfo.NeType, + "neName": neInfo.NeName, + "ipAddr": neInfo.IpAddr, }, })) return resultByte, err diff --git a/src/modules/ws/processor/ue_connect.go b/src/modules/ws/processor/ue_connect.go index a5353cef..47975abb 100644 --- a/src/modules/ws/processor/ue_connect.go +++ b/src/modules/ws/processor/ue_connect.go @@ -22,17 +22,18 @@ func GetUEConnect(requestID string, data any) ([]byte, error) { query[k] = fmt.Sprintf("%v", v) } - coreUid, coreUidOk := query["coreUid"] neUid, neUidOk := query["neUid"] - if !coreUidOk || !neUidOk || coreUid == "" || neUid == "" { - return nil, fmt.Errorf("query coreUid or neUid is empty") + if !neUidOk || neUid == "" { + return nil, fmt.Errorf("query neUid is empty") } // 查询网元获取IP - neInfo := neService.NewNeInfo.FindByCoreUidAndNeUid(coreUid, neUid) - if neInfo.CoreUID != coreUid || neInfo.NeUID != neUid { + neInfo := neService.NewNeInfo.FindByNeUid(neUid) + if neInfo.ID == 0 || neInfo.NeUid != neUid { return nil, fmt.Errorf("query neinfo not found") } + query["neId"] = fmt.Sprint(neInfo.ID) + // 查询 rows, total := neDataNfService.NewUEEvent.FindByPage(neInfo.NeType, query) resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, diff --git a/src/modules/ws/processor/upf_total_flow.go b/src/modules/ws/processor/upf_total_flow.go index 9e5020aa..48e93907 100644 --- a/src/modules/ws/processor/upf_total_flow.go +++ b/src/modules/ws/processor/upf_total_flow.go @@ -6,6 +6,7 @@ import ( "be.ems/src/framework/logger" "be.ems/src/framework/resp" + neService "be.ems/src/modules/ne/service" neDataService "be.ems/src/modules/ne_data/service" ) @@ -26,7 +27,13 @@ func GetUPFTotalFlow(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query rmUid empty or day less 0 ") } - up, down := neDataService.NewKpiReport.UPFTodayFlowFind(querys.NeUID, querys.Day) + // 查询网元获取IP + neInfo := neService.NewNeInfo.FindByNeUid(querys.NeUID) + if neInfo.ID == 0 || neInfo.NeUid != querys.NeUID { + return nil, fmt.Errorf("query neinfo not found") + } + + up, down := neDataService.NewKpiReport.UPFTodayFlowFind(neInfo.ID, querys.Day) resultByte, err := json.Marshal(resp.Ok(map[string]any{ "requestId": requestID, diff --git a/src/modules/ws/service/ws_send.go b/src/modules/ws/service/ws_send.go index d972fdab..7b6399be 100644 --- a/src/modules/ws/service/ws_send.go +++ b/src/modules/ws/service/ws_send.go @@ -16,31 +16,31 @@ const ( GROUP_TRACE_NE = "2" // 组号-信令跟踪Packet 4_TaskNo GROUP_TRACE_PACKET = "4" - // 组号-网元状态 8_coreUid_neUid + // 组号-网元状态 8_neUid GROUP_NE_STATE = "8" - // 组号-指标通用 10_coreUid_neUid + // 组号-指标通用 10_neUid GROUP_KPI = "10" - // 组号-自定义KPI指标 20_coreUid_neUid + // 组号-自定义KPI指标 20_neUid GROUP_KPI_C = "20" - // 组号-IMS_CDR会话事件 1005_coreUid_neUid + // 组号-IMS_CDR会话事件 1005_neUid GROUP_IMS_CDR = "1005" - // 组号-SMF_CDR会话事件 1006_coreUid_neUid + // 组号-SMF_CDR会话事件 1006_neUid GROUP_SMF_CDR = "1006" - // 组号-SMSC_CDR会话事件 1007_coreUid_neUid + // 组号-SMSC_CDR会话事件 1007_neUid GROUP_SMSC_CDR = "1007" - // 组号-SGWC_CDR会话事件 1008_coreUid_neUid + // 组号-SGWC_CDR会话事件 1008_neUid GROUP_SGWC_CDR = "1008" - // 组号-AMF_UE会话事件 1010_coreUid_neUid + // 组号-AMF_UE会话事件 1010_neUid GROUP_AMF_UE = "1010" - // 组号-MME_UE会话事件 1011_coreUid_neUid + // 组号-MME_UE会话事件 1011_neUid GROUP_MME_UE = "1011" - // 组号-AMF_NB状态事件 1014_coreUid_neUid + // 组号-AMF_NB状态事件 1014_neUid GROUP_AMF_NB = "1014" - // 组号-MME_NB状态事件 1015_coreUid_neUid + // 组号-MME_NB状态事件 1015_neUid GROUP_MME_NB = "1015" - // 组号-告警 2000_coreUid_neUid + // 组号-告警 2000_neUid GROUP_ALARM = "2000" - // 组号-告警事件 2002_coreUid_neUid + // 组号-告警事件 2002_neUid GROUP_ALARM_EVENT = "2002" )