Merge branch 'main-v2' into lite-ba
This commit is contained in:
24
CHANGELOG.md
24
CHANGELOG.md
@@ -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信息添加用户数/基站数字段记录
|
||||
|
||||
@@ -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, '');
|
||||
|
||||
|
||||
@@ -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, '');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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, '');
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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, '');
|
||||
|
||||
|
||||
@@ -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, '');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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, '');
|
||||
|
||||
29
build/database/lite/upgrade/upg_udm_auth.sql
Normal file
29
build/database/lite/upgrade/upg_udm_auth.sql
Normal 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
|
||||
-- ----------------------------
|
||||
52
build/database/lite/upgrade/upg_udm_sub.sql
Normal file
52
build/database/lite/upgrade/upg_udm_sub.sql
Normal 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
|
||||
-- ----------------------------
|
||||
25
build/database/lite/upgrade/upg_udm_voip.sql
Normal file
25
build/database/lite/upgrade/upg_udm_voip.sql
Normal 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
|
||||
-- ----------------------------
|
||||
32
build/database/lite/upgrade/upg_udm_volte_ims.sql
Normal file
32
build/database/lite/upgrade/upg_udm_volte_ims.sql
Normal 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
|
||||
-- ----------------------------
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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, '');
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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 '密码',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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, '');
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
// 导出数据表格
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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"))
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 表名称
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"` // 密码
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 签约用户信息
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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,-
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user