Merge branch 'main-v2' into lite-ba

This commit is contained in:
TsMask
2025-09-28 20:20:10 +08:00
53 changed files with 897 additions and 168 deletions

View File

@@ -1,5 +1,29 @@
# 版本发布日志
## 2.2509.4-20250926
- 优化 UDM用户数据导出文件带createTime字段
- 修复 告警接收局部创建对象,防止并发数据混乱
- 新增 UDM用户数据添加创建时间字段
- 修复 MML-udm dec key后查看内容
- 新增 添加系统备份功能,权限控制分配
- 新增 定时导出文件路径统一前缀,导出无分页检查
- 新增 导出查询去除最大记录数限制,查询分页检查
- 优化 更新kpi英文翻译
- 新增 添加KPI数据备份导出功能及相关数据库结构更新
- 新增 添加kpi_c_report_nrf和kpi_report_nrf表的结构及索引
- 修复 忽略SQL执行中的未知字段和无此字段错误
- 优化 取消告警页面静态缓存
- 新增 菜单权限标识补充添加,角色分配权限
- 修复 修正菜单名称CheckUnique方法中对ParentId的条件判断
- 新增 忙时定义为一周内话务量最高的四个小时的平均值
- 优化 AMF和MME类型的备份缺少csv文件
- 优化 资源告警调整事件触发时间窗口为30秒
- 优化 IMS忙时统计认证拦截
- 优化 不对比网元信息中版本信息,重置路径和包名
- 优化 语音数据概览改为语音通话统计
- 新增 添加KPI忙时0609统计接口及相关服务逻辑
## 2.2508.4-20250829
- 新增 license信息添加用户数/基站数字段记录

View File

@@ -196,4 +196,15 @@ INSERT INTO "sys_dict_data" VALUES (170, 'sys_user_type', 'dictData.sys_user_typ
INSERT INTO "sys_dict_data" VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (174, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.0', '0', 0, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (175, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.1', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (176, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.2', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (177, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.3', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (178, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.4', '4', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (179, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.5', '5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (180, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.6', '6', 6, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (181, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.7', '7', 7, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (182, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.8', '8', 8, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (183, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.9', '9', 9, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_data" VALUES (184, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.10', '10', 10, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');

View File

@@ -53,3 +53,4 @@ INSERT INTO "sys_dict_type" VALUES (71, 'dictType.trace_msg_type', 'trace_msg_ty
INSERT INTO "sys_dict_type" VALUES (72, 'dictType.trace_msg_direct', 'trace_msg_direct', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_type" VALUES (73, 'dictType.trace_interfaces', 'trace_interfaces', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_type" VALUES (74, 'dictType.cdr_sip_code_cause', 'cdr_sip_code_cause', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO "sys_dict_type" VALUES (75, 'dictType.cdr_cause_smsc', 'cdr_cause_smsc', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');

View File

@@ -977,6 +977,17 @@ hour: data time from the hour before the task execution time');
INSERT INTO "sys_i18n" VALUES (794, 'menu.system.setting.homeSet', '主页设置', 'Home Set');
INSERT INTO "sys_i18n" VALUES (795, 'menu.system.setting.reset', '重置', 'Reset');
INSERT INTO "sys_i18n" VALUES (796, 'menu.system.setting.backup', '备份还原', 'Backup Restore');
INSERT INTO "sys_i18n" VALUES (797, 'dictData.cdr_cause_smsc.0', '未知错误', 'Unknown Error');
INSERT INTO "sys_i18n" VALUES (798, 'dictData.cdr_cause_smsc.1', '无错误', 'No error');
INSERT INTO "sys_i18n" VALUES (799, 'dictData.cdr_cause_smsc.2', '通过SIP传输的消息源数据中SMSC提取参数错误', 'Error in SMSC extract parameter of Message Originating data via SIP');
INSERT INTO "sys_i18n" VALUES (800, 'dictData.cdr_cause_smsc.3', '消息来源数据中消息来源的服务中心编号缺失', 'Missing Service Center Number of Message Originating data in Message Originating');
INSERT INTO "sys_i18n" VALUES (801, 'dictData.cdr_cause_smsc.4', '未知服务中心号码消息来源数据中的消息来源', 'Unknown Service Center Number of Message Originating data in Message Originating');
INSERT INTO "sys_i18n" VALUES (802, 'dictData.cdr_cause_smsc.5', '消息源数据中缺少必需参数源地址(RP-OA)', 'Missing Required Parameter Originating Address(RP-OA) in Message Originating data');
INSERT INTO "sys_i18n" VALUES (803, 'dictData.cdr_cause_smsc.6', 'SMSC解码错误或消息来源数据', 'Error in smsc decoding Message Originating data');
INSERT INTO "sys_i18n" VALUES (804, 'dictData.cdr_cause_smsc.7', '消息发起路由失败无法确定如何路由呼叫号码通过4G/2G', 'Message Originating routing failed(not know how to route called number(via 4G/2g))');
INSERT INTO "sys_i18n" VALUES (804, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包cscf→smsc', 'SMSC not receive RP-ACK pkg(cscf->smsc)');
INSERT INTO "sys_i18n" VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错误的RP-ACK数据包cscf→smsc', 'SMSC receive wrong RP-ACK pkg(cscf->smsc)');
INSERT INTO "sys_i18n" VALUES (807, 'dictData.cdr_cause_smsc.10', 'CAMEL 流程错误', 'CAMEL process error');
INSERT INTO "sys_i18n" VALUES (2000, 'menu.psap.agent', '座席', 'Agent');
INSERT INTO "sys_i18n" VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information');

View File

@@ -202,6 +202,7 @@ INSERT INTO "sys_menu" VALUES (1145, 'menu.common.ftp', 2096, 1, '', '', '1', '1
INSERT INTO "sys_menu" VALUES (1146, 'menu.common.ftpSync', 2096, 2, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:ftpSync', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
INSERT INTO "sys_menu" VALUES (1147, 'menu.common.download', 2096, 3, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:download', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
INSERT INTO "sys_menu" VALUES (1148, 'menu.common.delete', 2096, 4, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:delete', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
INSERT INTO "sys_menu" VALUES (1149, 'menu.neData.udmAuth.exportDec', 2000, 7, '', '', '1', '1', 'B', '1', '1', 'neData:udm-auth:export-dec', '#', '0', 'supervisor', 1757671977637, 'supervisor', 1757671977637, '');
INSERT INTO "sys_menu" VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
INSERT INTO "sys_menu" VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');

View File

@@ -4,8 +4,9 @@
DROP TABLE IF EXISTS "udm_auth";
CREATE TABLE "udm_auth" (
"id" integer NOT NULL,
"imsi" text(50) NOT NULL,
"create_time" integer,
"ne_id" text(50),
"imsi" text(50) NOT NULL,
"amf" text(50),
"status" text(50),
"ki" text(50),

View File

@@ -4,9 +4,10 @@
DROP TABLE IF EXISTS "udm_sub";
CREATE TABLE "udm_sub" (
"id" integer NOT NULL,
"create_time" integer,
"ne_id" text(50),
"imsi" text(50) NOT NULL,
"msisdn" text(50),
"ne_id" text(50),
"am_dat" text(1500),
"ambr" text(50),
"nssai" text(50),

View File

@@ -4,6 +4,7 @@
DROP TABLE IF EXISTS "udm_voip";
CREATE TABLE "udm_voip" (
"id" integer NOT NULL,
"create_time" integer,
"ne_id" text(50),
"username" text(50),
"password" text(128),

View File

@@ -4,9 +4,10 @@
DROP TABLE IF EXISTS "udm_volte_ims";
CREATE TABLE "udm_volte_ims" (
"id" integer NOT NULL,
"create_time" integer,
"ne_id" text(50),
"imsi" text(50) NOT NULL,
"msisdn" text(50),
"ne_id" text(50),
"tag" text(50),
"vni" text(128),
PRIMARY KEY ("id")

View File

@@ -195,4 +195,15 @@ REPLACE INTO "sys_dict_data" VALUES (170, 'sys_user_type', 'dictData.sys_user_ty
REPLACE INTO "sys_dict_data" VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (174, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.0', '0', 0, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (175, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.1', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (176, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.2', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (177, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.3', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (178, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.4', '4', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (179, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.5', '5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (180, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.6', '6', 6, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (181, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.7', '7', 7, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (182, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.8', '8', 8, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (183, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.9', '9', 9, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_data" VALUES (184, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.10', '10', 10, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');

View File

@@ -52,3 +52,4 @@ REPLACE INTO "sys_dict_type" VALUES (71, 'dictType.trace_msg_type', 'trace_msg_t
REPLACE INTO "sys_dict_type" VALUES (72, 'dictType.trace_msg_direct', 'trace_msg_direct', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_type" VALUES (73, 'dictType.trace_interfaces', 'trace_interfaces', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_type" VALUES (74, 'dictType.cdr_sip_code_cause', 'cdr_sip_code_cause', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO "sys_dict_type" VALUES (75, 'dictType.cdr_cause_smsc', 'cdr_cause_smsc', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');

View File

@@ -976,6 +976,17 @@ hour: data time from the hour before the task execution time');
REPLACE INTO "sys_i18n" VALUES (794, 'menu.system.setting.homeSet', '主页设置', 'Home Set');
REPLACE INTO "sys_i18n" VALUES (795, 'menu.system.setting.reset', '重置', 'Reset');
REPLACE INTO "sys_i18n" VALUES (796, 'menu.system.setting.backup', '备份还原', 'Backup Restore');
REPLACE INTO "sys_i18n" VALUES (797, 'dictData.cdr_cause_smsc.0', '未知错误', 'Unknown Error');
REPLACE INTO "sys_i18n" VALUES (798, 'dictData.cdr_cause_smsc.1', '无错误', 'No error');
REPLACE INTO "sys_i18n" VALUES (799, 'dictData.cdr_cause_smsc.2', '通过SIP传输的消息源数据中SMSC提取参数错误', 'Error in SMSC extract parameter of Message Originating data via SIP');
REPLACE INTO "sys_i18n" VALUES (800, 'dictData.cdr_cause_smsc.3', '消息来源数据中消息来源的服务中心编号缺失', 'Missing Service Center Number of Message Originating data in Message Originating');
REPLACE INTO "sys_i18n" VALUES (801, 'dictData.cdr_cause_smsc.4', '未知服务中心号码消息来源数据中的消息来源', 'Unknown Service Center Number of Message Originating data in Message Originating');
REPLACE INTO "sys_i18n" VALUES (802, 'dictData.cdr_cause_smsc.5', '消息源数据中缺少必需参数源地址(RP-OA)', 'Missing Required Parameter Originating Address(RP-OA) in Message Originating data');
REPLACE INTO "sys_i18n" VALUES (803, 'dictData.cdr_cause_smsc.6', 'SMSC解码错误或消息来源数据', 'Error in smsc decoding Message Originating data');
REPLACE INTO "sys_i18n" VALUES (804, 'dictData.cdr_cause_smsc.7', '消息发起路由失败无法确定如何路由呼叫号码通过4G/2G', 'Message Originating routing failed(not know how to route called number(via 4G/2g))');
REPLACE INTO "sys_i18n" VALUES (804, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包cscf→smsc', 'SMSC not receive RP-ACK pkg(cscf->smsc)');
REPLACE INTO "sys_i18n" VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错误的RP-ACK数据包cscf→smsc', 'SMSC receive wrong RP-ACK pkg(cscf->smsc)');
REPLACE INTO "sys_i18n" VALUES (807, 'dictData.cdr_cause_smsc.10', 'CAMEL 流程错误', 'CAMEL process error');
REPLACE INTO "sys_i18n" VALUES (2000, 'menu.psap.agent', '座席', 'Agent');
REPLACE INTO "sys_i18n" VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information');

View File

@@ -201,6 +201,7 @@ REPLACE INTO "sys_menu" VALUES (1145, 'menu.common.ftp', 2096, 1, '', '', '1', '
REPLACE INTO "sys_menu" VALUES (1146, 'menu.common.ftpSync', 2096, 2, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:ftpSync', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
REPLACE INTO "sys_menu" VALUES (1147, 'menu.common.download', 2096, 3, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:download', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
REPLACE INTO "sys_menu" VALUES (1148, 'menu.common.delete', 2096, 4, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:delete', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
REPLACE INTO "sys_menu" VALUES (1149, 'menu.neData.udmAuth.exportDec', 2000, 7, '', '', '1', '1', 'B', '1', '1', 'neData:udm-auth:export-dec', '#', '0', 'supervisor', 1757671977637, 'supervisor', 1757671977637, '');
REPLACE INTO "sys_menu" VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
REPLACE INTO "sys_menu" VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');
REPLACE INTO "sys_menu" VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588, 'system', 1728641403588, '');

View File

@@ -0,0 +1,29 @@
-- ----------------------------
-- Table structure for udm_auth
-- ----------------------------
DROP TABLE IF EXISTS "udm_auth";
CREATE TABLE "udm_auth" (
"id" integer NOT NULL,
"create_time" integer,
"ne_id" text(50),
"imsi" text(50) NOT NULL,
"amf" text(50),
"status" text(50),
"ki" text(50),
"algo_index" text(50),
"opc" text(50),
PRIMARY KEY ("id")
);
-- ----------------------------
-- Indexes structure for table udm_auth
-- ----------------------------
CREATE UNIQUE INDEX "uk_auth_imsi_ne"
ON "udm_auth" (
"imsi" ASC,
"ne_id" ASC
);
-- ----------------------------
-- Records of udm_auth
-- ----------------------------

View File

@@ -0,0 +1,52 @@
-- ----------------------------
-- Table structure for udm_sub
-- ----------------------------
DROP TABLE IF EXISTS "udm_sub";
CREATE TABLE "udm_sub" (
"id" integer NOT NULL,
"create_time" integer,
"ne_id" text(50),
"imsi" text(50) NOT NULL,
"msisdn" text(50),
"am_dat" text(1500),
"ambr" text(50),
"nssai" text(50),
"rat" text(50),
"arfb" text(50),
"sar" text(50),
"cn_type" text(50),
"rfsp_index" text(50),
"reg_timer" text(50),
"ue_usage_type" text(50),
"active_time" text(50),
"mico" text(50),
"odb_ps" text(50),
"group_id" text(50),
"eps_dat" text(1500),
"eps_flag" text(50),
"eps_odb" text(50),
"hplmn_odb" text(50),
"ard" text(50),
"epstpl" text(50),
"context_id" text(50),
"apn_mum" text(50),
"apn_context" text(50),
"static_ip" text(50),
"sm_data" text(1500),
"smf_sel" text(50),
"cag" text(50),
PRIMARY KEY ("id")
);
-- ----------------------------
-- Indexes structure for table udm_sub
-- ----------------------------
CREATE UNIQUE INDEX "uk_sub_imsi_ne"
ON "udm_sub" (
"imsi" ASC,
"ne_id" ASC
);
-- ----------------------------
-- Records of udm_sub
-- ----------------------------

View File

@@ -0,0 +1,25 @@
-- ----------------------------
-- Table structure for udm_voip
-- ----------------------------
DROP TABLE IF EXISTS "udm_voip";
CREATE TABLE "udm_voip" (
"id" integer NOT NULL,
"create_time" integer,
"ne_id" text(50),
"username" text(50),
"password" text(128),
PRIMARY KEY ("id")
);
-- ----------------------------
-- Indexes structure for table udm_voip
-- ----------------------------
CREATE UNIQUE INDEX "uk_voip_user_ne"
ON "udm_voip" (
"username" ASC,
"ne_id" ASC
);
-- ----------------------------
-- Records of udm_voip
-- ----------------------------

View File

@@ -0,0 +1,32 @@
-- ----------------------------
-- Table structure for udm_volte_ims
-- ----------------------------
DROP TABLE IF EXISTS "udm_volte_ims";
CREATE TABLE "udm_volte_ims" (
"id" integer NOT NULL,
"create_time" integer,
"ne_id" text(50),
"imsi" text(50) NOT NULL,
"msisdn" text(50),
"tag" text(50),
"vni" text(128),
PRIMARY KEY ("id")
);
-- ----------------------------
-- Indexes structure for table udm_volte_ims
-- ----------------------------
CREATE INDEX "idx_volte_tag"
ON "udm_volte_ims" (
"tag" ASC
);
CREATE UNIQUE INDEX "uk_volte_imsi_ne"
ON "udm_volte_ims" (
"imsi" ASC,
"msisdn" ASC,
"ne_id" ASC
);
-- ----------------------------
-- Records of udm_volte_ims
-- ----------------------------

View File

@@ -199,6 +199,17 @@ INSERT INTO `sys_dict_data` VALUES (170, 'sys_user_type', 'dictData.sys_user_typ
INSERT INTO `sys_dict_data` VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (174, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.0', '0', 0, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (175, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.1', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (176, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.2', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (177, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.3', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (178, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.4', '4', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (179, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.5', '5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (180, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.6', '6', 6, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (181, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.7', '7', 7, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (182, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.8', '8', 8, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (183, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.9', '9', 9, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_data` VALUES (184, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.10', '10', 10, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -57,6 +57,7 @@ INSERT INTO `sys_dict_type` VALUES (71, 'dictType.trace_msg_type', 'trace_msg_ty
INSERT INTO `sys_dict_type` VALUES (72, 'dictType.trace_msg_direct', 'trace_msg_direct', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_type` VALUES (73, 'dictType.trace_interfaces', 'trace_interfaces', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_type` VALUES (74, 'dictType.cdr_sip_code_cause', 'cdr_sip_code_cause', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
INSERT INTO `sys_dict_type` VALUES (75, 'dictType.cdr_cause_smsc', 'cdr_cause_smsc', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
UNLOCK TABLES;

View File

@@ -811,6 +811,17 @@ INSERT INTO `sys_i18n` VALUES (793, 'job.backup_export_kpi_remark', 'dataType:
INSERT INTO `sys_i18n` VALUES (794, 'menu.system.setting.homeSet', '主页设置', 'Home Set');
INSERT INTO `sys_i18n` VALUES (795, 'menu.system.setting.reset', '重置', 'Reset');
INSERT INTO `sys_i18n` VALUES (796, 'menu.system.setting.backup', '备份还原', 'Backup Restore');
INSERT INTO `sys_i18n` VALUES (797, 'dictData.cdr_cause_smsc.0', '未知错误', 'Unknown Error');
INSERT INTO `sys_i18n` VALUES (798, 'dictData.cdr_cause_smsc.1', '无错误', 'No error');
INSERT INTO `sys_i18n` VALUES (799, 'dictData.cdr_cause_smsc.2', '通过SIP传输的消息源数据中SMSC提取参数错误', 'Error in SMSC extract parameter of Message Originating data via SIP');
INSERT INTO `sys_i18n` VALUES (800, 'dictData.cdr_cause_smsc.3', '消息来源数据中消息来源的服务中心编号缺失', 'Missing Service Center Number of Message Originating data in Message Originating');
INSERT INTO `sys_i18n` VALUES (801, 'dictData.cdr_cause_smsc.4', '未知服务中心号码消息来源数据中的消息来源', 'Unknown Service Center Number of Message Originating data in Message Originating');
INSERT INTO `sys_i18n` VALUES (802, 'dictData.cdr_cause_smsc.5', '消息源数据中缺少必需参数源地址(RP-OA)', 'Missing Required Parameter Originating Address(RP-OA) in Message Originating data');
INSERT INTO `sys_i18n` VALUES (803, 'dictData.cdr_cause_smsc.6', 'SMSC解码错误或消息来源数据', 'Error in smsc decoding Message Originating data');
INSERT INTO `sys_i18n` VALUES (804, 'dictData.cdr_cause_smsc.7', '消息发起路由失败无法确定如何路由呼叫号码通过4G/2G', 'Message Originating routing failed(not know how to route called number(via 4G/2g))');
INSERT INTO `sys_i18n` VALUES (804, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包cscf→smsc', 'SMSC not receive RP-ACK pkg(cscf->smsc)');
INSERT INTO `sys_i18n` VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错误的RP-ACK数据包cscf→smsc', 'SMSC receive wrong RP-ACK pkg(cscf->smsc)');
INSERT INTO `sys_i18n` VALUES (807, 'dictData.cdr_cause_smsc.10', 'CAMEL 流程错误', 'CAMEL process error');
INSERT INTO `sys_i18n` VALUES (2000, 'menu.psap.agent', '座席', 'Agent');
INSERT INTO `sys_i18n` VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information');

View File

@@ -205,6 +205,7 @@ INSERT INTO `sys_menu` VALUES (1145, 'menu.common.ftp', 2096, 1, '', '', '1', '1
INSERT INTO `sys_menu` VALUES (1146, 'menu.common.ftpSync', 2096, 2, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:ftpSync', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
INSERT INTO `sys_menu` VALUES (1147, 'menu.common.download', 2096, 3, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:download', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
INSERT INTO `sys_menu` VALUES (1148, 'menu.common.delete', 2096, 4, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:delete', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
INSERT INTO `sys_menu` VALUES (1149, 'menu.neData.udmAuth.exportDec', 2000, 7, '', '', '1', '1', 'B', '1', '1', 'neData:udm-auth:export-dec', '#', '0', 'supervisor', 1757671977637, 'supervisor', 1757671977637, '');
INSERT INTO `sys_menu` VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
INSERT INTO `sys_menu` VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');

View File

@@ -5,8 +5,9 @@
DROP TABLE IF EXISTS `udm_auth`;
CREATE TABLE `udm_auth` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID',
`create_time` bigint NULL DEFAULT 0 COMMENT '创建时间',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`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 '状态',
`ki` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'ki',

View File

@@ -5,9 +5,10 @@
DROP TABLE IF EXISTS `udm_sub`;
CREATE TABLE `udm_sub` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`create_time` bigint NULL DEFAULT 0 COMMENT '创建时间',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`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 '用户电话号码',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`am_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData',
`ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubUeAMBRTemp',
`nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubSNSSAITemp',

View File

@@ -5,6 +5,7 @@
DROP TABLE IF EXISTS `udm_voip`;
CREATE TABLE `udm_voip` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`create_time` bigint NULL DEFAULT 0 COMMENT '创建时间',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户名',
`password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '密码',

View File

@@ -5,9 +5,10 @@
DROP TABLE IF EXISTS `udm_volte_ims`;
CREATE TABLE `udm_volte_ims` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`create_time` bigint NULL DEFAULT 0 COMMENT '创建时间',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`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 '用户电话号码',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`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,

View File

@@ -203,6 +203,17 @@ REPLACE INTO `sys_dict_data` VALUES (170, 'sys_user_type', 'dictData.sys_user_ty
REPLACE INTO `sys_dict_data` VALUES (171, 'sys_user_type', 'dictData.sys_user_type.ldap', 'LDAP', 2, '', 'lime', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (172, 'sys_user_type', 'dictData.sys_user_type.smtp', 'SMTP', 3, '', 'magenta', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (173, 'sys_user_type', 'dictData.sys_user_type.oauth2', 'OAuth2', 4, '', 'gold', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (174, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.0', '0', 0, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (175, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.1', '1', 1, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (176, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.2', '2', 2, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (177, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.3', '3', 3, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (178, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.4', '4', 4, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (179, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.5', '5', 5, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (180, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.6', '6', 6, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (181, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.7', '7', 7, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (182, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.8', '8', 8, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (183, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.9', '9', 9, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_data` VALUES (184, 'cdr_cause_smsc', 'dictData.cdr_cause_smsc.10', '10', 10, '', '', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -57,5 +57,6 @@ REPLACE INTO `sys_dict_type` VALUES (71, 'dictType.trace_msg_type', 'trace_msg_t
REPLACE INTO `sys_dict_type` VALUES (72, 'dictType.trace_msg_direct', 'trace_msg_direct', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_type` VALUES (73, 'dictType.trace_interfaces', 'trace_interfaces', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_type` VALUES (74, 'dictType.cdr_sip_code_cause', 'cdr_sip_code_cause', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
REPLACE INTO `sys_dict_type` VALUES (75, 'dictType.cdr_cause_smsc', 'cdr_cause_smsc', '1', '0', 'system', 1699348237468, 'system', 1699348237468, '');
-- Dump completed on 2025-02-14 15:26:56

View File

@@ -808,6 +808,17 @@ REPLACE INTO `sys_i18n` VALUES (793, 'job.backup_export_kpi_remark', 'dataType:
REPLACE INTO `sys_i18n` VALUES (794, 'menu.system.setting.homeSet', '主页设置', 'Home Set');
REPLACE INTO `sys_i18n` VALUES (795, 'menu.system.setting.reset', '重置', 'Reset');
REPLACE INTO `sys_i18n` VALUES (796, 'menu.system.setting.backup', '备份还原', 'Backup Restore');
REPLACE INTO `sys_i18n` VALUES (797, 'dictData.cdr_cause_smsc.0', '未知错误', 'Unknown Error');
REPLACE INTO `sys_i18n` VALUES (798, 'dictData.cdr_cause_smsc.1', '无错误', 'No error');
REPLACE INTO `sys_i18n` VALUES (799, 'dictData.cdr_cause_smsc.2', '通过SIP传输的消息源数据中SMSC提取参数错误', 'Error in SMSC extract parameter of Message Originating data via SIP');
REPLACE INTO `sys_i18n` VALUES (800, 'dictData.cdr_cause_smsc.3', '消息来源数据中消息来源的服务中心编号缺失', 'Missing Service Center Number of Message Originating data in Message Originating');
REPLACE INTO `sys_i18n` VALUES (801, 'dictData.cdr_cause_smsc.4', '未知服务中心号码消息来源数据中的消息来源', 'Unknown Service Center Number of Message Originating data in Message Originating');
REPLACE INTO `sys_i18n` VALUES (802, 'dictData.cdr_cause_smsc.5', '消息源数据中缺少必需参数源地址(RP-OA)', 'Missing Required Parameter Originating Address(RP-OA) in Message Originating data');
REPLACE INTO `sys_i18n` VALUES (803, 'dictData.cdr_cause_smsc.6', 'SMSC解码错误或消息来源数据', 'Error in smsc decoding Message Originating data');
REPLACE INTO `sys_i18n` VALUES (804, 'dictData.cdr_cause_smsc.7', '消息发起路由失败无法确定如何路由呼叫号码通过4G/2G', 'Message Originating routing failed(not know how to route called number(via 4G/2g))');
REPLACE INTO `sys_i18n` VALUES (804, 'dictData.cdr_cause_smsc.8', 'SMSC 未收到 RP-ACK 数据包cscf→smsc', 'SMSC not receive RP-ACK pkg(cscf->smsc)');
REPLACE INTO `sys_i18n` VALUES (806, 'dictData.cdr_cause_smsc.9', 'SMSC接收错误的RP-ACK数据包cscf→smsc', 'SMSC receive wrong RP-ACK pkg(cscf->smsc)');
REPLACE INTO `sys_i18n` VALUES (807, 'dictData.cdr_cause_smsc.10', 'CAMEL 流程错误', 'CAMEL process error');
REPLACE INTO `sys_i18n` VALUES (2000, 'menu.psap.agent', '座席', 'Agent');
REPLACE INTO `sys_i18n` VALUES (2001, 'menu.psap.agent.callings', '并行话务', 'Calling Information');

View File

@@ -227,6 +227,7 @@ REPLACE INTO `sys_menu` VALUES (1145, 'menu.common.ftp', 2096, 1, '', '', '1', '
REPLACE INTO `sys_menu` VALUES (1146, 'menu.common.ftpSync', 2096, 2, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:ftpSync', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
REPLACE INTO `sys_menu` VALUES (1147, 'menu.common.download', 2096, 3, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:download', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
REPLACE INTO `sys_menu` VALUES (1148, 'menu.common.delete', 2096, 4, '', '', '1', '1', 'B', '1', '1', 'ne-data:backup-data:delete', '#', '0', 'supervisor', 1757673844822, 'supervisor', 1757673844822, '');
REPLACE INTO `sys_menu` VALUES (1149, 'menu.neData.udmAuth.exportDec', 2000, 7, '', '', '1', '1', 'B', '1', '1', 'neData:udm-auth:export-dec', '#', '0', 'supervisor', 1757671977637, 'supervisor', 1757671977637, '');
REPLACE INTO `sys_menu` VALUES (2000, 'menu.neData.udmAuth', 5, 1, 'udm-auth', 'neData/udm-auth/index', '1', '1', 'M', '1', '1', 'udm#auth:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
REPLACE INTO `sys_menu` VALUES (2001, 'menu.neData.udmSub', 5, 3, 'udm-sub', 'neData/udm-sub/index', '1', '1', 'M', '1', '1', 'udm#sub:index', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');
REPLACE INTO `sys_menu` VALUES (2002, 'menu.neData.udmVOIP', 5, 5, 'udm-voip', 'neData/udm-voip/index', '1', '0', 'M', '1', '1', 'udm#voip:list', 'icon-xiangmuchengyuan', '0', 'system', 1728641403588,'system', 1728641403588, '');

View File

@@ -3,8 +3,9 @@
--
CREATE TABLE IF NOT EXISTS `udm_auth` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`imsi` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SIM卡/USIM卡ID',
`create_time` bigint NULL DEFAULT 0 COMMENT '创建时间',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`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 '状态',
`ki` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'ki',
@@ -14,4 +15,9 @@ CREATE TABLE IF NOT EXISTS `udm_auth` (
UNIQUE KEY `uk_auth_imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_neid唯一主键'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='UDM用户数据_鉴权';
-- ----------------------------
-- COLUMN for udm_auth
-- ----------------------------
ALTER TABLE `udm_auth` ADD COLUMN `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间' AFTER `id`;
-- Dump completed on 2025-02-14 15:26:56

View File

@@ -3,9 +3,10 @@
--
CREATE TABLE IF NOT EXISTS `udm_sub` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`create_time` bigint NULL DEFAULT 0 COMMENT '创建时间',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`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 '用户电话号码',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`am_dat` varchar(1500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData',
`ambr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubUeAMBRTemp',
`nssai` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'AmData SubSNSSAITemp',
@@ -37,4 +38,9 @@ CREATE TABLE IF NOT EXISTS `udm_sub` (
UNIQUE KEY `uk_sub_imsi_ne` (`imsi`,`ne_id`) USING BTREE COMMENT 'imsi_neid唯一主键'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM用户数据_签约';
-- ----------------------------
-- COLUMN for udm_sub
-- ----------------------------
ALTER TABLE `udm_sub` ADD COLUMN `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间' AFTER `id`;
-- Dump completed on 2025-02-14 15:26:56

View File

@@ -3,6 +3,7 @@
--
CREATE TABLE IF NOT EXISTS `udm_voip` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`create_time` bigint NULL DEFAULT 0 COMMENT '创建时间',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户名',
`password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '密码',
@@ -10,4 +11,9 @@ CREATE TABLE IF NOT EXISTS `udm_voip` (
UNIQUE KEY `uk_voip_user_ne` (`username`,`ne_id`) USING BTREE COMMENT 'user_neid唯一主键'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='UDM用户数据_VOIP';
-- ----------------------------
-- COLUMN for udm_voip
-- ----------------------------
ALTER TABLE `udm_voip` ADD COLUMN `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间' AFTER `id`;
-- Dump completed on 2025-04-22 15:26:56

View File

@@ -3,9 +3,10 @@
--
CREATE TABLE IF NOT EXISTS `udm_volte_ims` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`create_time` bigint NULL DEFAULT 0 COMMENT '创建时间',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`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 '用户电话号码',
`ne_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'UDM网元标识',
`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,
@@ -13,4 +14,9 @@ CREATE TABLE IF NOT EXISTS `udm_volte_ims` (
KEY `idx_volte_tag` (`tag`) USING BTREE COMMENT 'tag索引'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='UDM用户数据_VolteIMS用户';
-- ----------------------------
-- COLUMN for udm_volte_ims
-- ----------------------------
ALTER TABLE `udm_volte_ims` ADD COLUMN `create_time` bigint NULL DEFAULT 0 COMMENT '创建时间' AFTER `id`;
-- Dump completed on 2025-04-22 15:26:56

View File

@@ -422,12 +422,13 @@ func (s BackupExportCDRProcessor) exportSMSC(query map[string]string, fileType s
"Service Type",
"Caller",
"Called",
"Result",
"Result Code",
"Result Cause",
"Time",
},
}
// 读取字典数据 CDR 原因码
dictCDRCauseCode := s.sysDictService.FindByType("cdr_cause_code")
dictCDRSMSCCauseCode := s.sysDictService.FindByType("cdr_cause_smsc")
for _, row := range rows {
// 解析 JSON 字符串为 map
var cdrJSON map[string]interface{}
@@ -457,19 +458,20 @@ func (s BackupExportCDRProcessor) exportSMSC(query map[string]string, fileType s
caller = v.(string)
}
// 呼叫结果 0失败1成功
callResult := "Fail"
callResult := "FAILED"
if v, ok := cdrJSON["result"]; ok && v != nil {
resultVal := parse.Number(v)
if resultVal == 1 {
callResult = "Success"
callResult = "SUCCESS"
}
}
// 结果原因
if v, ok := cdrJSON["cause"]; ok && v != nil && callResult == "Fail" {
callCause := "UNKNOW ERROR"
if v, ok := cdrJSON["cause"]; ok && v != nil {
cause := fmt.Sprint(v)
for _, v := range dictCDRCauseCode {
for _, v := range dictCDRSMSCCauseCode {
if cause == v.DataValue {
callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DataLabel))
callCause = i18n.TKey(language, v.DataLabel)
break
}
}
@@ -492,6 +494,7 @@ func (s BackupExportCDRProcessor) exportSMSC(query map[string]string, fileType s
caller,
called,
callResult,
callCause,
timeStr,
})
}
@@ -511,11 +514,12 @@ func (s BackupExportCDRProcessor) exportSMSC(query map[string]string, fileType s
"D1": "Service Type",
"E1": "Caller",
"F1": "Called",
"G1": "Result",
"H1": "Time",
"G1": "Result Code",
"H1": "Result Cause",
"I1": "Time",
}
// 读取字典数据 CDR 原因码
dictCDRCauseCode := s.sysDictService.FindByType("cdr_cause_code")
dictCDRSMSCCauseCode := s.sysDictService.FindByType("cdr_cause_smsc")
// 从第二行开始的数据
dataCells := make([]map[string]any, 0)
for i, row := range rows {
@@ -548,19 +552,20 @@ func (s BackupExportCDRProcessor) exportSMSC(query map[string]string, fileType s
caller = v.(string)
}
// 呼叫结果 0失败1成功
callResult := "Fail"
callResult := "FAILED"
if v, ok := cdrJSON["result"]; ok && v != nil {
resultVal := parse.Number(v)
if resultVal == 1 {
callResult = "Success"
callResult = "SUCCESS"
}
}
// 结果原因
if v, ok := cdrJSON["cause"]; ok && v != nil && callResult == "Fail" {
callCause := "UNKNOW ERROR"
if v, ok := cdrJSON["cause"]; ok && v != nil {
cause := fmt.Sprint(v)
for _, v := range dictCDRCauseCode {
for _, v := range dictCDRSMSCCauseCode {
if cause == v.DataValue {
callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DataLabel))
callCause = i18n.TKey(language, v.DataLabel)
break
}
}
@@ -583,7 +588,8 @@ func (s BackupExportCDRProcessor) exportSMSC(query map[string]string, fileType s
"E" + idx: caller,
"F" + idx: called,
"G" + idx: callResult,
"H" + idx: timeStr,
"H" + idx: callCause,
"I" + idx: timeStr,
})
}
// 导出数据表格

View File

@@ -340,3 +340,85 @@ func (s IMSController) KPIBusyWeek(c *gin.Context) {
data := s.kpiReportService.IMSBusyWeek(neInfo.RmUID, query.WeekStart, query.WeekEnd)
c.JSON(200, resp.OkData(data))
}
// CDR MOS
//
// GET /cdr/mos-hour
//
// @Tags network_data/ims
// @Accept json
// @Produce json
// @Param neId query string true "NE ID" default(001)
// @Param timestamp query int64 false "timestamp"
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary MOS hour statistics
// @Description MOS hour statistics
// @Router /neData/ims/cdr/mos-hour [get]
func (s IMSController) CDRMOSHour(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
NeID string `form:"neId" binding:"required"`
Timestamp int64 `form:"timestamp" 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
}
if query.Timestamp < 1e12 || query.Timestamp > 1e13 {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "timestamp format is ms"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeTypeAndNeID("IMS", query.NeID)
if neInfo.NeId != query.NeID || neInfo.IP == "" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
data := s.cdrEventService.IMSCDRMOSHour(neInfo.RmUID, query.Timestamp)
c.JSON(200, resp.OkData(data))
}
// CDR Call Connection Time
//
// GET /cdr/cct-hour
//
// @Tags network_data/ims
// @Accept json
// @Produce json
// @Param neId query string true "NE ID" default(001)
// @Param timestamp query int64 false "timestamp"
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary MOS hour statistics
// @Description MOS hour statistics
// @Router /neData/ims/cdr/cct-hour [get]
func (s IMSController) CDRCCTHour(c *gin.Context) {
language := reqctx.AcceptLanguage(c)
var query struct {
NeID string `form:"neId" binding:"required"`
Timestamp int64 `form:"timestamp" 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
}
if query.Timestamp < 1e12 || query.Timestamp > 1e13 {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "timestamp format is ms"))
return
}
// 查询网元获取IP
neInfo := s.neInfoService.FindByNeTypeAndNeID("IMS", query.NeID)
if neInfo.NeId != query.NeID || neInfo.IP == "" {
c.JSON(200, resp.ErrMsg(i18n.TKey(language, "app.common.noNEInfo")))
return
}
data := s.cdrEventService.IMSCDRCCTHour(neInfo.RmUID, query.Timestamp)
c.JSON(200, resp.OkData(data))
}

View File

@@ -2,7 +2,9 @@ package controller
import (
"fmt"
"os"
"path/filepath"
"runtime"
"strings"
"time"
@@ -499,13 +501,19 @@ func (s *UDMAuthController) Export(c *gin.Context) {
if fileType == "csv" {
// 转换数据
data := [][]string{}
data = append(data, []string{"imsi", "ki", "algo", "amf", "opc"})
data = append(data, []string{"imsi", "ki", "algo", "amf", "opc", "create_time"})
for _, v := range rows {
opc := v.Opc
if opc == "-" {
opc = ""
}
data = append(data, []string{v.IMSI, v.Ki, v.AlgoIndex, v.Amf, opc})
createTime := ""
if v.CreateTime == 0 {
createTime = time.Now().Format(time.RFC3339)
} else {
createTime = time.UnixMilli(v.CreateTime).Format(time.RFC3339)
}
data = append(data, []string{v.IMSI, v.Ki, v.AlgoIndex, v.Amf, opc, createTime})
}
// 输出到文件
if err := file.WriterFileCSV(data, filePath); err != nil {
@@ -522,7 +530,13 @@ func (s *UDMAuthController) Export(c *gin.Context) {
if opc == "-" {
opc = ""
}
data = append(data, []string{v.IMSI, v.Ki, v.AlgoIndex, v.Amf, opc})
createTime := ""
if v.CreateTime == 0 {
createTime = time.Now().Format(time.RFC3339)
} else {
createTime = time.UnixMilli(v.CreateTime).Format(time.RFC3339)
}
data = append(data, []string{v.IMSI, v.Ki, v.AlgoIndex, v.Amf, opc, createTime})
}
// 输出到文件
if err := file.WriterFileTXTLine(data, ",", filePath); err != nil {
@@ -645,3 +659,77 @@ func (s *UDMAuthController) Import(c *gin.Context) {
}
c.JSON(200, resp.OkMsg(resultMsg))
}
// UDM鉴权用户导出解密数据
//
// GET /export-dec
//
// @Tags network_data/udm/auth
// @Accept json
// @Produce json
// @Param data body object true "Request Param"
// @Success 200 {object} object "Response Results"
// @Security TokenAuth
// @Summary UDM Authenticated User Export Decrypted Data
// @Description UDM Authenticated User Export Decrypted Data
// @Router /neData/udm/auth/export-dec [get]
func (s *UDMAuthController) ExportDec(c *gin.Context) {
// 查询结果,根据查询条件结果,单页最大值限制
neId := c.Query("neId")
if neId == "" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "bind err: neId is empty"))
return
}
// 网元主机的Telnet客户端
telnetClient, err := s.neInfoService.NeRunTelnetClient("UDM", neId, 1)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
defer telnetClient.Close()
// 发送MML
// 导出解密的ki和opc 需要执行 dec authdat:imsi=all
// 生成文件 /user/local/etc/udm/authdata.txt
cmd := "dec authdat:imsi=all"
data, err := telnet.ConvertToStr(telnetClient, cmd)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
// 命令ok时
if strings.Contains(data, "ok") {
// 网元主机的SSH客户端
sshClient, err := s.neInfoService.NeRunSSHClient("UDM", neId)
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
defer sshClient.Close()
// 网元主机的SSH客户端进行文件传输
sftpClient, err := sshClient.NewClientSFTP()
if err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
defer sftpClient.Close()
// 复制到本地
nePath := "/usr/local/etc/udm/authdata.txt"
localFilePath := filepath.Join("/tmp/omc/pull", filepath.Base(nePath))
if runtime.GOOS == "windows" {
localFilePath = fmt.Sprintf("C:%s", localFilePath)
}
if err = sftpClient.CopyFileRemoteToLocal(nePath, localFilePath); err != nil {
c.JSON(200, resp.ErrMsg(err.Error()))
return
}
sshClient.RunCMD(fmt.Sprintf("sudo rm -rf %s", nePath))
defer os.Remove(localFilePath)
c.FileAttachment(localFilePath, filepath.Base(nePath))
return
}
c.JSON(200, resp.ErrMsg("unexpected result"))
}

View File

@@ -505,10 +505,16 @@ func (s *UDMSubController) Export(c *gin.Context) {
if fileType == "csv" {
// 转换数据
data := [][]string{}
data = append(data, []string{"IMSI", "MSISDN", "UeAmbrTpl", "NssaiTpl", "AreaForbiddenTpl", "ServiceAreaRestrictionTpl", "RatRestrictions", "CnTypeRestrictions", "SmfSel", "SmData", "EPSDat"})
data = append(data, []string{"IMSI", "MSISDN", "UeAmbrTpl", "NssaiTpl", "AreaForbiddenTpl", "ServiceAreaRestrictionTpl", "RatRestrictions", "CnTypeRestrictions", "SmfSel", "SmData", "EPSDat", "CreateTime"})
for _, v := range rows {
epsDat := fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s", v.EpsFlag, v.EpsOdb, v.HplmnOdb, v.Ard, v.Epstpl, v.ContextId, v.ApnContext, v.StaticIp)
data = append(data, []string{v.IMSI, v.MSISDN, v.UeAmbrTpl, v.NssaiTpl, v.AreaForbiddenTpl, v.ServiceAreaRestrictionTpl, v.RatRestrictions, v.CnTypeRestrictions, v.SmfSel, v.SmData, epsDat})
createTime := ""
if v.CreateTime == 0 {
createTime = time.Now().Format(time.RFC3339)
} else {
createTime = time.UnixMilli(v.CreateTime).Format(time.RFC3339)
}
data = append(data, []string{v.IMSI, v.MSISDN, v.UeAmbrTpl, v.NssaiTpl, v.AreaForbiddenTpl, v.ServiceAreaRestrictionTpl, v.RatRestrictions, v.CnTypeRestrictions, v.SmfSel, v.SmData, epsDat, createTime})
}
// 输出到文件
if err := file.WriterFileCSV(data, filePath); err != nil {
@@ -522,7 +528,13 @@ func (s *UDMSubController) Export(c *gin.Context) {
data := [][]string{}
for _, v := range rows {
epsDat := fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s", v.EpsFlag, v.EpsOdb, v.HplmnOdb, v.Ard, v.Epstpl, v.ContextId, v.ApnContext, v.StaticIp)
data = append(data, []string{v.IMSI, v.MSISDN, v.UeAmbrTpl, v.NssaiTpl, v.AreaForbiddenTpl, v.ServiceAreaRestrictionTpl, v.RatRestrictions, v.CnTypeRestrictions, v.SmfSel, v.SmData, epsDat})
createTime := ""
if v.CreateTime == 0 {
createTime = time.Now().Format(time.RFC3339)
} else {
createTime = time.UnixMilli(v.CreateTime).Format(time.RFC3339)
}
data = append(data, []string{v.IMSI, v.MSISDN, v.UeAmbrTpl, v.NssaiTpl, v.AreaForbiddenTpl, v.ServiceAreaRestrictionTpl, v.RatRestrictions, v.CnTypeRestrictions, v.SmfSel, v.SmData, epsDat, createTime})
}
// 输出到文件
if err := file.WriterFileTXTLine(data, ",", filePath); err != nil {

View File

@@ -437,9 +437,15 @@ func (s *UDMVOIPController) Export(c *gin.Context) {
if fileType == "csv" {
// 转换数据
data := [][]string{}
data = append(data, []string{"username", "password"})
data = append(data, []string{"username", "password", "createTime"})
for _, v := range rows {
data = append(data, []string{v.UserName, v.Password})
createTime := ""
if v.CreateTime == 0 {
createTime = time.Now().Format(time.RFC3339)
} else {
createTime = time.UnixMilli(v.CreateTime).Format(time.RFC3339)
}
data = append(data, []string{v.UserName, v.Password, createTime})
}
// 输出到文件
if err := file.WriterFileCSV(data, filePath); err != nil {
@@ -452,7 +458,13 @@ func (s *UDMVOIPController) Export(c *gin.Context) {
// 转换数据
data := [][]string{}
for _, v := range rows {
data = append(data, []string{v.UserName, v.Password})
createTime := ""
if v.CreateTime == 0 {
createTime = time.Now().Format(time.RFC3339)
} else {
createTime = time.UnixMilli(v.CreateTime).Format(time.RFC3339)
}
data = append(data, []string{v.UserName, v.Password, createTime})
}
// 输出到文件
if err := file.WriterFileTXTLine(data, ",", filePath); err != nil {

View File

@@ -481,9 +481,15 @@ func (s *UDMVolteIMSController) Export(c *gin.Context) {
if fileType == "csv" {
// 转换数据
data := [][]string{}
data = append(data, []string{"IMSI", "MSISDN", "TAG", "VNI"})
data = append(data, []string{"IMSI", "MSISDN", "TAG", "VNI", "CreateTime"})
for _, v := range rows {
data = append(data, []string{v.IMSI, v.MSISDN, v.Tag, v.VNI})
createTime := ""
if v.CreateTime == 0 {
createTime = time.Now().Format(time.RFC3339)
} else {
createTime = time.UnixMilli(v.CreateTime).Format(time.RFC3339)
}
data = append(data, []string{v.IMSI, v.MSISDN, v.Tag, v.VNI, createTime})
}
// 输出到文件
if err := file.WriterFileCSV(data, filePath); err != nil {
@@ -496,7 +502,13 @@ func (s *UDMVolteIMSController) Export(c *gin.Context) {
// 转换数据
data := [][]string{}
for _, v := range rows {
data = append(data, []string{v.IMSI, v.MSISDN, v.Tag, v.VNI})
createTime := ""
if v.CreateTime == 0 {
createTime = time.Now().Format(time.RFC3339)
} else {
createTime = time.UnixMilli(v.CreateTime).Format(time.RFC3339)
}
data = append(data, []string{v.IMSI, v.MSISDN, v.Tag, v.VNI, createTime})
}
// 输出到文件
if err := file.WriterFileTXTLine(data, ",", filePath); err != nil {

View File

@@ -2,13 +2,15 @@ package model
// UDMAuthUser UDM鉴权用户 udm_auth
type UDMAuthUser struct {
ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 默认ID
IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID
NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识
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
ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 默认ID
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
NeId string `json:"neId" gorm:"column:ne_id"` // 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
}
// TableName 表名称

View File

@@ -2,10 +2,11 @@ package model
// UDMSubUser UDM签约用户 udm_sub
type UDMSubUser struct {
ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键
IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID
MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码
NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识
ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识
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

View File

@@ -2,8 +2,9 @@ package model
// UDMVOIPUser UDMVOIP用户 udm_voip
type UDMVOIPUser struct {
ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键
NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识
ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识
UserName string `json:"username" gorm:"column:username"` // 用户名
Password string `json:"password" gorm:"column:password"` // 密码

View File

@@ -2,10 +2,11 @@ package model
// UDMVolteIMSUser UDMVolteIMS用户 udm_volte_ims
type UDMVolteIMSUser struct {
ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键
IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID
MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码
NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识
ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键
CreateTime int64 `json:"createTime" gorm:"column:create_time"` // 创建时间
NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识
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

View File

@@ -192,6 +192,14 @@ func Setup(router *gin.Engine) {
middleware.AuthorizeUser(nil),
controller.NewIMS.KPIBusyWeek,
)
imsGroup.GET("/cdr/mos-hour",
middleware.AuthorizeUser(nil),
controller.NewIMS.CDRMOSHour,
)
imsGroup.GET("/cdr/cct-hour",
middleware.AuthorizeUser(nil),
controller.NewIMS.CDRCCTHour,
)
}
// 网元SMSC
@@ -380,6 +388,11 @@ func Setup(router *gin.Engine) {
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_IMPORT)),
controller.NewUDMAuth.Import,
)
udmAuthGroup.GET("/export-dec",
middleware.AuthorizeUser(map[string][]string{"hasPerms": {"neData:udm-auth:export-dec"}}),
collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.udmAuth", collectlogs.BUSINESS_TYPE_EXPORT)),
controller.NewUDMAuth.ExportDec,
)
}
// 网元UDM 签约用户信息

View File

@@ -74,6 +74,9 @@ func (r CDREvent) SelectByPage(neType string, query map[string]string) ([]model.
tx = tx.Where("JSON_EXTRACT(cdr_json, '$.servedMSISDN') like ?", fmt.Sprintf("%%%s%%", v))
}
case "IMS":
if v, ok := query["recordType"]; ok && v != "" {
tx = tx.Where("JSON_EXTRACT(cdr_json, '$.recordType') = ?", fmt.Sprintf("'%s'", v))
}
if v, ok := query["callerParty"]; ok && v != "" {
tx = tx.Where("JSON_EXTRACT(cdr_json, '$.callerParty') like ?", fmt.Sprintf("%%%s%%", v))
}

View File

@@ -21,7 +21,7 @@ type UEEvent struct{}
func (r UEEvent) SelectByPage(neType string, query map[string]string) ([]model.UEEvent, int64) {
// 表名
tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(neType))
tx := db.DB("").Table(tableName).Model(&model.CDREvent{})
tx := db.DB("").Table(tableName).Model(&model.UEEvent{})
// 查询条件拼接
if v, ok := query["rmUID"]; ok && v != "" {
tx = tx.Where("rm_uid = ?", v)

View File

@@ -5,6 +5,7 @@ import (
"fmt"
"strconv"
"strings"
"time"
"be.ems/src/framework/i18n"
"be.ems/src/framework/logger"
@@ -62,11 +63,12 @@ func (r CDREvent) ExportSMSC(rows []model.CDREvent, fileName, language string) (
"D1": "Service Type",
"E1": "Caller",
"F1": "Called",
"G1": "Result",
"H1": "Time",
"G1": "Result Code",
"H1": "Result Cause",
"I1": "Time",
}
// 读取字典数据 CDR 原因码
dictCDRCauseCode := sysService.NewSysDictData.FindByType("cdr_cause_code")
dictCDRSMSCCauseCode := sysService.NewSysDictData.FindByType("cdr_cause_smsc")
// 从第二行开始的数据
dataCells := make([]map[string]any, 0)
for i, row := range rows {
@@ -99,19 +101,20 @@ func (r CDREvent) ExportSMSC(rows []model.CDREvent, fileName, language string) (
caller = v.(string)
}
// 呼叫结果 0失败1成功
callResult := "Fail"
callResult := "FAILED"
if v, ok := cdrJSON["result"]; ok && v != nil {
resultVal := parse.Number(v)
if resultVal == 1 {
callResult = "Success"
callResult = "SUCCESS"
}
}
// 结果原因
if v, ok := cdrJSON["cause"]; ok && v != nil && callResult == "Fail" {
callCause := "UNKNOW ERROR"
if v, ok := cdrJSON["cause"]; ok && v != nil {
cause := fmt.Sprint(v)
for _, v := range dictCDRCauseCode {
for _, v := range dictCDRSMSCCauseCode {
if cause == v.DataValue {
callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DataLabel))
callCause = i18n.TKey(language, v.DataLabel)
break
}
}
@@ -134,7 +137,8 @@ func (r CDREvent) ExportSMSC(rows []model.CDREvent, fileName, language string) (
"E" + idx: caller,
"F" + idx: called,
"G" + idx: callResult,
"H" + idx: timeStr,
"H" + idx: callCause,
"I" + idx: timeStr,
})
}
@@ -643,3 +647,153 @@ func (r CDREvent) ExportIMS(rows []model.CDREvent, fileName, language string) (s
// 导出数据表格
return file.WriteSheet(headerCells, dataCells, fileName, "")
}
// IMSCDRMOSHour CDR MOS 统计
func (r CDREvent) IMSCDRMOSHour(rmUID string, timestamp int64) []map[string]any {
t := time.UnixMilli(timestamp)
beginTime := t
endTime := t
// 检查时分秒是否都为零
if t.Hour() == 0 && t.Minute() == 0 && t.Second() == 0 {
// 获取当天起始时间00:00:00
beginTime = t.Truncate(time.Hour)
// 计算当天结束时间23:59:59
endTime = beginTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
} else {
// 起始时间:当前小时的 00 分 00 秒
beginTime = t.Truncate(time.Hour)
// 结束时间:当前小时的 59 分 59 秒 999 毫秒
endTime = beginTime.Add(time.Hour - time.Millisecond)
}
query := map[string]string{
"rmUID": rmUID,
"recordType": "MOC",
"beginTime": fmt.Sprintf("%d", beginTime.Unix()),
"endTime": fmt.Sprintf("%d", endTime.Unix()),
}
rows, total := r.cdrEventRepository.SelectByPage("IMS", query)
if total == 0 {
return []map[string]any{}
}
// 创建一个map来存储按时间段合并后的数据
timeGroup := make(map[int64]map[string]float64)
// 遍历每个数据项
for _, row := range rows {
// 将毫秒时间戳转换为小时级时间戳(保留到小时的起始毫秒)
timeHour := row.Timestamp / 3600 * 3600 // 1小时 = 3600000毫秒
// 解析 JSON 字符串为 map
var cdrJSON map[string]interface{}
err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON)
if err != nil {
logger.Warnf("Unmarshal JSON: %s", err.Error())
continue
}
// 记录类型
var mosAverage float64 = 0
if v, ok := cdrJSON["mosAverage"]; ok && v != nil {
mosAverage = v.(float64)
} else {
continue
}
// 合并到对应的小时段
if _, exists := timeGroup[timeHour]; !exists {
timeGroup[timeHour] = map[string]float64{
"total": 0,
"mosSum": 0,
}
}
timeGroup[timeHour]["total"] += 1
timeGroup[timeHour]["mosSum"] += mosAverage
}
// 时间组合输出
data := make([]map[string]any, 0, len(timeGroup))
for hour, sums := range timeGroup {
data = append(data, map[string]any{
"timeGroup": fmt.Sprintf("%d", hour),
"total": sums["total"],
"mosSum": float64(int(sums["mosSum"]*100)) / 100,
"mosAvg": float64(int(sums["mosSum"]/sums["total"]*100)) / 100,
})
}
return data
}
// IMSCDRCCTHour CDR CCT 统计
func (r CDREvent) IMSCDRCCTHour(rmUID string, timestamp int64) []map[string]any {
t := time.UnixMilli(timestamp)
beginTime := t
endTime := t
// 检查时分秒是否都为零
if t.Hour() == 0 && t.Minute() == 0 && t.Second() == 0 {
// 获取当天起始时间00:00:00
beginTime = t.Truncate(time.Hour)
// 计算当天结束时间23:59:59
endTime = beginTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
} else {
// 起始时间:当前小时的 00 分 00 秒
beginTime = t.Truncate(time.Hour)
// 结束时间:当前小时的 59 分 59 秒 999 毫秒
endTime = beginTime.Add(time.Hour - time.Millisecond)
}
query := map[string]string{
"rmUID": rmUID,
"recordType": "MOC",
"beginTime": fmt.Sprintf("%d", beginTime.Unix()),
"endTime": fmt.Sprintf("%d", endTime.Unix()),
}
rows, total := r.cdrEventRepository.SelectByPage("IMS", query)
if total == 0 {
return []map[string]any{}
}
// 创建一个map来存储按时间段合并后的数据
timeGroup := make(map[int64]map[string]float64)
// 遍历每个数据项
for _, row := range rows {
// 将毫秒时间戳转换为小时级时间戳(保留到小时的起始毫秒)
timeHour := row.Timestamp / 3600 * 3600 // 1小时 = 3600000毫秒
// 解析 JSON 字符串为 map
var cdrJSON map[string]interface{}
err := json.Unmarshal([]byte(row.CdrJson), &cdrJSON)
if err != nil {
logger.Warnf("Unmarshal JSON: %s", err.Error())
continue
}
// 记录类型
var callConnectionTime float64 = 0
if v, ok := cdrJSON["callConnectionTime"]; ok && v != nil {
callConnectionTime = v.(float64)
} else {
continue
}
// 合并到对应的小时段
if _, exists := timeGroup[timeHour]; !exists {
timeGroup[timeHour] = map[string]float64{
"total": 0,
"cctSum": 0,
}
}
timeGroup[timeHour]["total"] += 1
timeGroup[timeHour]["cctSum"] += callConnectionTime
}
// 时间组合输出
data := make([]map[string]any, 0, len(timeGroup))
for hour, sums := range timeGroup {
data = append(data, map[string]any{
"timeGroup": fmt.Sprintf("%d", hour),
"total": sums["total"],
"cctSum": float64(int(sums["cctSum"]*100)) / 100,
"cctAvg": float64(int(sums["cctSum"]/sums["total"]*100)) / 100,
})
}
return data
}

View File

@@ -4,8 +4,10 @@ import (
"fmt"
"strconv"
"strings"
"time"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/utils/date"
neService "be.ems/src/modules/ne/service"
"be.ems/src/modules/ne_data/model"
"be.ems/src/modules/ne_data/repository"
@@ -63,13 +65,21 @@ func (r *UDMAuthUser) dataByRedis(imsi, neId string) []model.UDMAuthUser {
if v, ok := m["amf"]; ok {
amf = strings.Replace(v, "\r\n", "", 1)
}
var createTime int64 = 0
if v, ok := m["create_time"]; ok {
t := date.ParseStrToDate(v, date.YYYY_MM_DDTHH_MM_SSZ)
createTime = t.UnixMilli()
} else {
createTime = time.Now().UnixMilli()
}
a := model.UDMAuthUser{
IMSI: imsi,
Amf: amf,
Ki: m["ki"],
AlgoIndex: m["algo"],
Opc: m["opc"],
NeId: neId,
CreateTime: createTime,
NeId: neId,
IMSI: imsi,
Amf: amf,
Ki: m["ki"],
AlgoIndex: m["algo"],
Opc: m["opc"],
}
arr = append(arr, a)
}

View File

@@ -4,8 +4,10 @@ import (
"fmt"
"strconv"
"strings"
"time"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/utils/date"
neService "be.ems/src/modules/ne/service"
"be.ems/src/modules/ne_data/model"
"be.ems/src/modules/ne_data/repository"
@@ -59,14 +61,22 @@ func (r *UDMSubUser) dataByRedis(imsi, neId string) []model.UDMSubUser {
if strings.Contains(imsi, "-") || !hasPrefix {
continue
}
var createTime int64 = 0
if v, ok := m["create_time"]; ok {
t := date.ParseStrToDate(v, date.YYYY_MM_DDTHH_MM_SSZ)
createTime = t.UnixMilli()
} else {
createTime = time.Now().UnixMilli()
}
a := model.UDMSubUser{
IMSI: imsi, // udm-sd:360000100000130
MSISDN: m["gpsi"], // 8612300000130
NeId: neId,
SmfSel: m["smf-sel"], // def_snssai
SmData: m["sm-dat"], // 1-000001&cmnet&ims&3gnet
Cag: m["cag"], // def_cag
CreateTime: createTime,
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,-

View File

@@ -4,8 +4,10 @@ import (
"fmt"
"strconv"
"strings"
"time"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/utils/date"
neService "be.ems/src/modules/ne/service"
"be.ems/src/modules/ne_data/model"
"be.ems/src/modules/ne_data/repository"
@@ -54,11 +56,19 @@ func (r UDMVOIPUser) dataByRedis(username, neId string) []model.UDMVOIPUser {
if strings.Contains(username, "-") || !hasPrefix {
continue
}
var createTime int64 = 0
if v, ok := m["create_time"]; ok {
t := date.ParseStrToDate(v, date.YYYY_MM_DDTHH_MM_SSZ)
createTime = t.UnixMilli()
} else {
createTime = time.Now().UnixMilli()
}
a := model.UDMVOIPUser{
NeId: neId,
UserName: username,
Password: m["password"],
CreateTime: createTime,
NeId: neId,
UserName: username,
Password: m["password"],
}
arr = append(arr, a)
}

View File

@@ -4,8 +4,10 @@ import (
"fmt"
"strconv"
"strings"
"time"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/utils/date"
neService "be.ems/src/modules/ne/service"
"be.ems/src/modules/ne_data/model"
"be.ems/src/modules/ne_data/repository"
@@ -61,13 +63,21 @@ func (r UDMVolteIMSUser) dataByRedis(imsi, neId string) []model.UDMVolteIMSUser
if len(impiParts) > 1 {
vni = impiParts[1]
}
var createTime int64 = 0
if v, ok := m["create_time"]; ok {
t := date.ParseStrToDate(v, date.YYYY_MM_DDTHH_MM_SSZ)
createTime = t.UnixMilli()
} else {
createTime = time.Now().UnixMilli()
}
a := model.UDMVolteIMSUser{
NeId: neId,
IMSI: keys[1],
MSISDN: keys[2],
Tag: m["tag"], // volte = tag
VNI: vni,
CreateTime: createTime,
NeId: neId,
IMSI: keys[1],
MSISDN: keys[2],
Tag: m["tag"], // volte = tag
VNI: vni,
}
arr = append(arr, a)
}

View File

@@ -34,8 +34,6 @@ type Alarm struct {
alarmEventService *neDataService.AlarmEvent
alarmLogService *neDataService.AlarmLog
alarmForwardLogService *neDataService.AlarmForwardLog
alarm neDataModel.Alarm
}
// Resolve 接收处理
@@ -50,7 +48,7 @@ func (s *Alarm) Resolve(a oam.Alarm) error {
lastSeq := neDataService.NewAlarm.FindAlarmSeqLast(neInfo.NeType, neInfo.NeId)
// 告警信息
s.alarm = neDataModel.Alarm{
alarm := neDataModel.Alarm{
NeType: neInfo.NeType,
NeId: neInfo.NeId,
NeName: neInfo.NeName,
@@ -77,11 +75,11 @@ func (s *Alarm) Resolve(a oam.Alarm) error {
// 进行清除
if a.AlarmStatus == oam.ALARM_STATUS_CLEAR {
if a.PerceivedSeverity == oam.ALARM_SEVERITY_EVENT {
if err := s.clearEvent(); err != nil {
if err := s.clearEvent(alarm); err != nil {
return err
}
} else {
if err := s.clear(); err != nil {
if err := s.clear(alarm); err != nil {
return err
}
}
@@ -90,40 +88,40 @@ func (s *Alarm) Resolve(a oam.Alarm) error {
// 进行新增
if a.AlarmStatus == oam.ALARM_STATUS_ACTIVE {
if a.PerceivedSeverity == oam.ALARM_SEVERITY_EVENT {
if err := s.addEvent(); err != nil {
if err := s.addEvent(alarm); err != nil {
return err
}
} else {
if err := s.add(); err != nil {
if err := s.add(alarm); err != nil {
return err
}
}
}
// 记录日志
if err := s.saveLog(); err != nil {
if err := s.saveLog(alarm); err != nil {
return err
}
// 推送
s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId), s.alarm)
s.wsService.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_ALARM, neInfo.NeType, neInfo.NeId), alarm)
// 通知
go s.notify(neInfo.IP)
go s.notify(neInfo.IP, alarm)
return nil
}
// saveLog 记录日志
func (s *Alarm) saveLog() error {
func (s *Alarm) saveLog(alarm neDataModel.Alarm) error {
alarmLog := neDataModel.AlarmLog{
NeType: s.alarm.NeType,
NeId: s.alarm.NeId,
AlarmSeq: s.alarm.AlarmSeq,
AlarmId: s.alarm.AlarmId,
AlarmTitle: s.alarm.AlarmTitle,
AlarmCode: s.alarm.AlarmCode,
AlarmStatus: s.alarm.AlarmStatus,
AlarmType: s.alarm.AlarmType,
OrigSeverity: s.alarm.PerceivedSeverity,
EventTime: s.alarm.EventTime,
NeType: alarm.NeType,
NeId: alarm.NeId,
AlarmSeq: alarm.AlarmSeq,
AlarmId: alarm.AlarmId,
AlarmTitle: alarm.AlarmTitle,
AlarmCode: alarm.AlarmCode,
AlarmStatus: alarm.AlarmStatus,
AlarmType: alarm.AlarmType,
OrigSeverity: alarm.PerceivedSeverity,
EventTime: alarm.EventTime,
}
insertId := s.alarmLogService.Insert(alarmLog)
if insertId <= 0 {
@@ -133,94 +131,94 @@ func (s *Alarm) saveLog() error {
}
// add 新增告警
func (s *Alarm) add() error {
func (s *Alarm) add(alarm neDataModel.Alarm) error {
// 检查网元告警ID是否唯一
alarmIdArr := s.alarmService.Find(neDataModel.Alarm{
NeType: s.alarm.NeType,
NeId: s.alarm.NeId,
AlarmId: s.alarm.AlarmId,
NeType: alarm.NeType,
NeId: alarm.NeId,
AlarmId: alarm.AlarmId,
})
if len(alarmIdArr) > 0 {
return fmt.Errorf("already exists alarmId:%s", s.alarm.AlarmId)
return fmt.Errorf("already exists alarmId:%s", alarm.AlarmId)
}
insertId := s.alarmService.Insert(s.alarm)
insertId := s.alarmService.Insert(alarm)
if insertId > 0 {
s.alarm.ID = insertId
alarm.ID = insertId
return nil
}
return fmt.Errorf("add alarm fail")
}
// clear 清除告警
func (s *Alarm) clear() error {
func (s *Alarm) clear(alarm neDataModel.Alarm) error {
// 检查网元告警ID是否唯一
alarmIdArr := s.alarmService.Find(neDataModel.Alarm{
NeType: s.alarm.NeType,
NeId: s.alarm.NeId,
AlarmId: s.alarm.AlarmId,
NeType: alarm.NeType,
NeId: alarm.NeId,
AlarmId: alarm.AlarmId,
})
if len(alarmIdArr) != 1 {
return fmt.Errorf("not exists alarmId:%s", s.alarm.AlarmId)
return fmt.Errorf("not exists alarmId:%s", alarm.AlarmId)
}
// 告警清除
rows, _ := s.alarmService.ClearByIds([]int64{alarmIdArr[0].ID}, s.alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR)
rows, _ := s.alarmService.ClearByIds([]int64{alarmIdArr[0].ID}, alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR)
if rows > 0 {
return nil
}
return fmt.Errorf("clear fail alarmId:%s", s.alarm.AlarmId)
return fmt.Errorf("clear fail alarmId:%s", alarm.AlarmId)
}
// addEvent 新增告警事件
func (s *Alarm) addEvent() error {
func (s *Alarm) addEvent(alarm neDataModel.Alarm) error {
// 检查网元告警ID是否唯一
alarmIdArr := s.alarmEventService.Find(neDataModel.AlarmEvent{
NeType: s.alarm.NeType,
NeId: s.alarm.NeId,
AlarmId: s.alarm.AlarmId,
NeType: alarm.NeType,
NeId: alarm.NeId,
AlarmId: alarm.AlarmId,
})
if len(alarmIdArr) > 0 {
return fmt.Errorf("event already exists alarmId:%s", s.alarm.AlarmId)
return fmt.Errorf("event already exists alarmId:%s", alarm.AlarmId)
}
// seq 告警序号
lastSeq := s.alarmEventService.FindAlarmEventSeqLast(s.alarm.NeType, s.alarm.NeId)
lastSeq := s.alarmEventService.FindAlarmEventSeqLast(alarm.NeType, alarm.NeId)
alarmEvent := neDataModel.AlarmEvent{
NeType: s.alarm.NeType,
NeId: s.alarm.NeId,
NeType: alarm.NeType,
NeId: alarm.NeId,
AlarmSeq: lastSeq + 1,
AlarmId: s.alarm.AlarmId,
AlarmTitle: s.alarm.AlarmTitle,
AlarmCode: s.alarm.AlarmCode,
EventTime: s.alarm.EventTime,
ObjectUid: s.alarm.ObjectUid,
ObjectName: s.alarm.ObjectName,
ObjectType: s.alarm.ObjectType,
LocationInfo: s.alarm.LocationInfo,
AlarmStatus: s.alarm.AlarmStatus,
SpecificProblem: s.alarm.SpecificProblem,
SpecificProblemId: s.alarm.SpecificProblemId,
AddInfo: s.alarm.AddInfo,
AlarmId: alarm.AlarmId,
AlarmTitle: alarm.AlarmTitle,
AlarmCode: alarm.AlarmCode,
EventTime: alarm.EventTime,
ObjectUid: alarm.ObjectUid,
ObjectName: alarm.ObjectName,
ObjectType: alarm.ObjectType,
LocationInfo: alarm.LocationInfo,
AlarmStatus: alarm.AlarmStatus,
SpecificProblem: alarm.SpecificProblem,
SpecificProblemId: alarm.SpecificProblemId,
AddInfo: alarm.AddInfo,
}
insertId := s.alarmEventService.Insert(alarmEvent)
if insertId > 0 {
alarmEvent.ID = insertId
// 网元重启后,清除活动告警
if s.alarm.AlarmCode == constants.ALARM_EVENT_REBOOT {
if alarm.AlarmCode == constants.ALARM_EVENT_REBOOT {
rows := s.alarmService.Find(neDataModel.Alarm{
NeType: s.alarm.NeType,
NeId: s.alarm.NeId,
NeType: alarm.NeType,
NeId: alarm.NeId,
AlarmStatus: oam.ALARM_STATUS_ACTIVE,
})
ids := make([]int64, 0)
for _, v := range rows {
ids = append(ids, v.ID)
}
s.alarmService.ClearByIds(ids, s.alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR)
s.alarmService.ClearByIds(ids, alarm.ObjectUid, constants.ALARM_CLEAR_TYPE_AUTO_CLEAR)
}
// 网元重启后,有跟踪任务的需要重新补发启动任务
if s.alarm.AlarmCode == constants.ALARM_EVENT_REBOOT {
traceService.NewTraceTask.RunUnstopped(s.alarm.NeType, s.alarm.NeId)
if alarm.AlarmCode == constants.ALARM_EVENT_REBOOT {
traceService.NewTraceTask.RunUnstopped(alarm.NeType, alarm.NeId)
}
return nil
}
@@ -228,38 +226,38 @@ func (s *Alarm) addEvent() error {
}
// clearEvent 清除告警事件
func (s *Alarm) clearEvent() error {
func (s *Alarm) clearEvent(alarm neDataModel.Alarm) error {
alarmEventService := neDataService.NewAlarmEvent
// 检查网元告警ID是否唯一
alarmIdArr := alarmEventService.Find(neDataModel.AlarmEvent{
NeType: s.alarm.NeType,
NeId: s.alarm.NeId,
AlarmId: s.alarm.AlarmId,
NeType: alarm.NeType,
NeId: alarm.NeId,
AlarmId: alarm.AlarmId,
})
if len(alarmIdArr) != 1 {
return fmt.Errorf("event not exists alarmId:%s", s.alarm.AlarmId)
return fmt.Errorf("event not exists alarmId:%s", alarm.AlarmId)
}
// 告警清除
rows, _ := s.alarmEventService.ClearByIds([]int64{alarmIdArr[0].ID}, s.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
}
return fmt.Errorf("event clear fail alarmId:%s", s.alarm.AlarmId)
return fmt.Errorf("event clear fail alarmId:%s", alarm.AlarmId)
}
// notify 通知
func (s *Alarm) notify(neIp string) {
func (s *Alarm) notify(neIp string, alarm neDataModel.Alarm) {
// 邮箱
emailEnable := parse.Boolean(config.Get("notification.email.enable"))
if emailEnable {
emailList := fmt.Sprint(config.Get("notification.email.emailList"))
emailResult := "Sent Successfully!"
emailErr := notificationService.EmailAlarm(s.alarm, neIp)
emailErr := notificationService.EmailAlarm(alarm, neIp)
if emailErr != nil {
emailResult = emailErr.Error()
}
s.notifyLog("EMAIL", emailList, emailResult)
s.notifyLog(alarm, "EMAIL", emailList, emailResult)
}
// 短信
@@ -267,27 +265,27 @@ func (s *Alarm) notify(neIp string) {
if smscEnable {
mobileList := fmt.Sprint(config.Get("notification.smsc.mobileList"))
smscResult := "Sent Successfully!"
smscErr := notificationService.SMSCAlarm(s.alarm, neIp)
smscErr := notificationService.SMSCAlarm(alarm, neIp)
if smscErr != nil {
smscResult = smscErr.Error()
}
s.notifyLog("SMSC", mobileList, smscResult)
s.notifyLog(alarm, "SMSC", mobileList, smscResult)
}
}
// notifyLog 通知日志
func (s *Alarm) notifyLog(forwardBy, toUser, result string) error {
func (s *Alarm) notifyLog(alarm neDataModel.Alarm, forwardBy, toUser, result string) error {
alarmForwardLog := neDataModel.AlarmForwardLog{
NeType: s.alarm.NeType,
NeId: s.alarm.NeId,
AlarmSeq: s.alarm.AlarmSeq,
AlarmId: s.alarm.AlarmId,
AlarmTitle: s.alarm.AlarmTitle,
AlarmCode: s.alarm.AlarmCode,
AlarmStatus: s.alarm.AlarmStatus,
AlarmType: s.alarm.AlarmType,
OrigSeverity: s.alarm.OrigSeverity,
EventTime: s.alarm.EventTime,
NeType: alarm.NeType,
NeId: alarm.NeId,
AlarmSeq: alarm.AlarmSeq,
AlarmId: alarm.AlarmId,
AlarmTitle: alarm.AlarmTitle,
AlarmCode: alarm.AlarmCode,
AlarmStatus: alarm.AlarmStatus,
AlarmType: alarm.AlarmType,
OrigSeverity: alarm.OrigSeverity,
EventTime: alarm.EventTime,
Type: forwardBy,
Target: toUser,
Result: result,

View File

@@ -102,10 +102,14 @@ func (s MMLController) Command(c *gin.Context) {
// 发送MML
result := []string{}
resultStr := "Success"
hasCommand := false
for _, v := range body.Command {
if v == "" {
continue
}
if strings.Contains(v, "dec key") {
hasCommand = true
}
output, err := telnetClient.RunCMD(v + "\r\n")
if err != nil {
result = append(result, err.Error())
@@ -115,6 +119,16 @@ func (s MMLController) Command(c *gin.Context) {
result = append(result, strings.TrimSpace(output))
}
// UDM 特殊命令处理
if body.NeType == "UDM" && hasCommand {
output, err := s.neInfoService.NeRunSSHCmd(neInfo.NeType, neInfo.NeId, "cat /usr/local/etc/udm/ueKeyProfile.tmp")
if err != nil {
result = append(result, err.Error())
} else {
result = append(result, output)
}
}
// 记录日志
mmlLog := model.MMLLog{
NeType: body.NeType,