From cb7e7f574b7fb8bf985f8afc06ed904bebc78fce Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 25 Sep 2025 15:35:03 +0800 Subject: [PATCH 1/8] =?UTF-8?q?fix:=20MML-udm=20dec=20key=E5=90=8E?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/tool/controller/mml.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/modules/tool/controller/mml.go b/src/modules/tool/controller/mml.go index 16dcda09..7dc24ba9 100644 --- a/src/modules/tool/controller/mml.go +++ b/src/modules/tool/controller/mml.go @@ -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, From 17048e7248e6e81b02b6d48359608daef1f44a70 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 25 Sep 2025 15:37:13 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20UDM=E7=94=A8=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=B7=BB=E5=8A=A0=E5=88=9B=E5=BB=BA=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/database/lite/install/udm_auth.sql | 3 +- build/database/lite/install/udm_sub.sql | 3 +- build/database/lite/install/udm_voip.sql | 1 + build/database/lite/install/udm_volte_ims.sql | 3 +- build/database/lite/upgrade/upg_udm_auth.sql | 29 +++++++++++ build/database/lite/upgrade/upg_udm_sub.sql | 52 +++++++++++++++++++ build/database/lite/upgrade/upg_udm_voip.sql | 25 +++++++++ .../lite/upgrade/upg_udm_volte_ims.sql | 32 ++++++++++++ build/database/std/install/udm_auth.sql | 3 +- build/database/std/install/udm_sub.sql | 3 +- build/database/std/install/udm_voip.sql | 1 + build/database/std/install/udm_volte_ims.sql | 3 +- build/database/std/upgrade/upg_udm_auth.sql | 8 ++- build/database/std/upgrade/upg_udm_sub.sql | 8 ++- build/database/std/upgrade/upg_udm_voip.sql | 6 +++ .../std/upgrade/upg_udm_volte_ims.sql | 8 ++- src/modules/network_data/model/udm_auth.go | 16 +++--- src/modules/network_data/model/udm_sub.go | 9 ++-- src/modules/network_data/model/udm_voip.go | 5 +- .../network_data/model/udm_volte_ims.go | 9 ++-- src/modules/network_data/service/udm_auth.go | 22 +++++--- src/modules/network_data/service/udm_sub.go | 22 +++++--- src/modules/network_data/service/udm_voip.go | 16 ++++-- .../network_data/service/udm_volte_ims.go | 20 +++++-- 24 files changed, 261 insertions(+), 46 deletions(-) create mode 100644 build/database/lite/upgrade/upg_udm_auth.sql create mode 100644 build/database/lite/upgrade/upg_udm_sub.sql create mode 100644 build/database/lite/upgrade/upg_udm_voip.sql create mode 100644 build/database/lite/upgrade/upg_udm_volte_ims.sql diff --git a/build/database/lite/install/udm_auth.sql b/build/database/lite/install/udm_auth.sql index 2f11e17f..39d08f30 100644 --- a/build/database/lite/install/udm_auth.sql +++ b/build/database/lite/install/udm_auth.sql @@ -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), diff --git a/build/database/lite/install/udm_sub.sql b/build/database/lite/install/udm_sub.sql index 00e14ec8..893a204b 100644 --- a/build/database/lite/install/udm_sub.sql +++ b/build/database/lite/install/udm_sub.sql @@ -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), diff --git a/build/database/lite/install/udm_voip.sql b/build/database/lite/install/udm_voip.sql index 6a3fdd67..37b0f693 100644 --- a/build/database/lite/install/udm_voip.sql +++ b/build/database/lite/install/udm_voip.sql @@ -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), diff --git a/build/database/lite/install/udm_volte_ims.sql b/build/database/lite/install/udm_volte_ims.sql index 8946b2a6..4629579d 100644 --- a/build/database/lite/install/udm_volte_ims.sql +++ b/build/database/lite/install/udm_volte_ims.sql @@ -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") diff --git a/build/database/lite/upgrade/upg_udm_auth.sql b/build/database/lite/upgrade/upg_udm_auth.sql new file mode 100644 index 00000000..39d08f30 --- /dev/null +++ b/build/database/lite/upgrade/upg_udm_auth.sql @@ -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 +-- ---------------------------- diff --git a/build/database/lite/upgrade/upg_udm_sub.sql b/build/database/lite/upgrade/upg_udm_sub.sql new file mode 100644 index 00000000..893a204b --- /dev/null +++ b/build/database/lite/upgrade/upg_udm_sub.sql @@ -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 +-- ---------------------------- diff --git a/build/database/lite/upgrade/upg_udm_voip.sql b/build/database/lite/upgrade/upg_udm_voip.sql new file mode 100644 index 00000000..37b0f693 --- /dev/null +++ b/build/database/lite/upgrade/upg_udm_voip.sql @@ -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 +-- ---------------------------- diff --git a/build/database/lite/upgrade/upg_udm_volte_ims.sql b/build/database/lite/upgrade/upg_udm_volte_ims.sql new file mode 100644 index 00000000..4629579d --- /dev/null +++ b/build/database/lite/upgrade/upg_udm_volte_ims.sql @@ -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 +-- ---------------------------- diff --git a/build/database/std/install/udm_auth.sql b/build/database/std/install/udm_auth.sql index 1f8c493f..8adf999f 100644 --- a/build/database/std/install/udm_auth.sql +++ b/build/database/std/install/udm_auth.sql @@ -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', diff --git a/build/database/std/install/udm_sub.sql b/build/database/std/install/udm_sub.sql index 7e9075ed..0852c8c9 100644 --- a/build/database/std/install/udm_sub.sql +++ b/build/database/std/install/udm_sub.sql @@ -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', diff --git a/build/database/std/install/udm_voip.sql b/build/database/std/install/udm_voip.sql index 37837eea..798475ea 100644 --- a/build/database/std/install/udm_voip.sql +++ b/build/database/std/install/udm_voip.sql @@ -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 '密码', diff --git a/build/database/std/install/udm_volte_ims.sql b/build/database/std/install/udm_volte_ims.sql index b2debc57..c7b696df 100644 --- a/build/database/std/install/udm_volte_ims.sql +++ b/build/database/std/install/udm_volte_ims.sql @@ -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, diff --git a/build/database/std/upgrade/upg_udm_auth.sql b/build/database/std/upgrade/upg_udm_auth.sql index e2d28cfd..0978d0d7 100644 --- a/build/database/std/upgrade/upg_udm_auth.sql +++ b/build/database/std/upgrade/upg_udm_auth.sql @@ -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 diff --git a/build/database/std/upgrade/upg_udm_sub.sql b/build/database/std/upgrade/upg_udm_sub.sql index 257e2590..823923f4 100644 --- a/build/database/std/upgrade/upg_udm_sub.sql +++ b/build/database/std/upgrade/upg_udm_sub.sql @@ -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 diff --git a/build/database/std/upgrade/upg_udm_voip.sql b/build/database/std/upgrade/upg_udm_voip.sql index 69408725..c75b4662 100644 --- a/build/database/std/upgrade/upg_udm_voip.sql +++ b/build/database/std/upgrade/upg_udm_voip.sql @@ -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 diff --git a/build/database/std/upgrade/upg_udm_volte_ims.sql b/build/database/std/upgrade/upg_udm_volte_ims.sql index e06ae33d..4d07abbe 100644 --- a/build/database/std/upgrade/upg_udm_volte_ims.sql +++ b/build/database/std/upgrade/upg_udm_volte_ims.sql @@ -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 diff --git a/src/modules/network_data/model/udm_auth.go b/src/modules/network_data/model/udm_auth.go index fed24077..1051c0a4 100644 --- a/src/modules/network_data/model/udm_auth.go +++ b/src/modules/network_data/model/udm_auth.go @@ -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 表名称 diff --git a/src/modules/network_data/model/udm_sub.go b/src/modules/network_data/model/udm_sub.go index 9ff03c5f..0b800b02 100644 --- a/src/modules/network_data/model/udm_sub.go +++ b/src/modules/network_data/model/udm_sub.go @@ -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 diff --git a/src/modules/network_data/model/udm_voip.go b/src/modules/network_data/model/udm_voip.go index 2fbd1ae9..cb268140 100644 --- a/src/modules/network_data/model/udm_voip.go +++ b/src/modules/network_data/model/udm_voip.go @@ -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"` // 密码 diff --git a/src/modules/network_data/model/udm_volte_ims.go b/src/modules/network_data/model/udm_volte_ims.go index 0dd4277b..709f11c2 100644 --- a/src/modules/network_data/model/udm_volte_ims.go +++ b/src/modules/network_data/model/udm_volte_ims.go @@ -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 diff --git a/src/modules/network_data/service/udm_auth.go b/src/modules/network_data/service/udm_auth.go index c8fcdc60..197bd7c2 100644 --- a/src/modules/network_data/service/udm_auth.go +++ b/src/modules/network_data/service/udm_auth.go @@ -4,8 +4,10 @@ import ( "fmt" "strconv" "strings" + "time" "be.ems/src/framework/database/redis" + "be.ems/src/framework/utils/date" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" neService "be.ems/src/modules/network_element/service" @@ -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) } diff --git a/src/modules/network_data/service/udm_sub.go b/src/modules/network_data/service/udm_sub.go index 2accef0b..32051e5d 100644 --- a/src/modules/network_data/service/udm_sub.go +++ b/src/modules/network_data/service/udm_sub.go @@ -4,8 +4,10 @@ import ( "fmt" "strconv" "strings" + "time" "be.ems/src/framework/database/redis" + "be.ems/src/framework/utils/date" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" neService "be.ems/src/modules/network_element/service" @@ -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,- diff --git a/src/modules/network_data/service/udm_voip.go b/src/modules/network_data/service/udm_voip.go index e03eed9c..ca5e3a18 100644 --- a/src/modules/network_data/service/udm_voip.go +++ b/src/modules/network_data/service/udm_voip.go @@ -4,8 +4,10 @@ import ( "fmt" "strconv" "strings" + "time" "be.ems/src/framework/database/redis" + "be.ems/src/framework/utils/date" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" neService "be.ems/src/modules/network_element/service" @@ -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) } diff --git a/src/modules/network_data/service/udm_volte_ims.go b/src/modules/network_data/service/udm_volte_ims.go index 3d3032b9..c1297a3f 100644 --- a/src/modules/network_data/service/udm_volte_ims.go +++ b/src/modules/network_data/service/udm_volte_ims.go @@ -4,8 +4,10 @@ import ( "fmt" "strconv" "strings" + "time" "be.ems/src/framework/database/redis" + "be.ems/src/framework/utils/date" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" neService "be.ems/src/modules/network_element/service" @@ -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) } From c597f305ffa195e16aa16f1282bf19b847b95bca Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 25 Sep 2025 15:39:22 +0800 Subject: [PATCH 3/8] =?UTF-8?q?fix:=20=E5=91=8A=E8=AD=A6=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=88=9B=E5=BB=BA=E5=AF=B9=E8=B1=A1=EF=BC=8C?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=E5=B9=B6=E5=8F=91=E6=95=B0=E6=8D=AE=E6=B7=B7?= =?UTF-8?q?=E4=B9=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network_data/repository/ue_event.go | 2 +- src/modules/oam/service/alarm.go | 166 +++++++++--------- 2 files changed, 83 insertions(+), 85 deletions(-) diff --git a/src/modules/network_data/repository/ue_event.go b/src/modules/network_data/repository/ue_event.go index 713532c3..ef98e2f6 100644 --- a/src/modules/network_data/repository/ue_event.go +++ b/src/modules/network_data/repository/ue_event.go @@ -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) diff --git a/src/modules/oam/service/alarm.go b/src/modules/oam/service/alarm.go index 33d8cbe9..70b09e0e 100644 --- a/src/modules/oam/service/alarm.go +++ b/src/modules/oam/service/alarm.go @@ -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, From 395a4319df68c910834eac809dca4c4215bf4274 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 26 Sep 2025 20:06:21 +0800 Subject: [PATCH 4/8] =?UTF-8?q?style:=20UDM=E7=94=A8=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AF=BC=E5=87=BA=E6=96=87=E4=BB=B6=E5=B8=A6createTim?= =?UTF-8?q?e=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network_data/controller/udm_auth.go | 18 +++++++++++++++--- src/modules/network_data/controller/udm_sub.go | 18 +++++++++++++++--- .../network_data/controller/udm_voip.go | 18 +++++++++++++++--- .../network_data/controller/udm_volte_ims.go | 18 +++++++++++++++--- 4 files changed, 60 insertions(+), 12 deletions(-) diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index 900245ef..6e849d3c 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -499,13 +499,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 +528,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 { diff --git a/src/modules/network_data/controller/udm_sub.go b/src/modules/network_data/controller/udm_sub.go index 1772ddae..1b6ff4c7 100644 --- a/src/modules/network_data/controller/udm_sub.go +++ b/src/modules/network_data/controller/udm_sub.go @@ -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 { diff --git a/src/modules/network_data/controller/udm_voip.go b/src/modules/network_data/controller/udm_voip.go index 40768d25..bf9a4013 100644 --- a/src/modules/network_data/controller/udm_voip.go +++ b/src/modules/network_data/controller/udm_voip.go @@ -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 { diff --git a/src/modules/network_data/controller/udm_volte_ims.go b/src/modules/network_data/controller/udm_volte_ims.go index 881c0593..3571281b 100644 --- a/src/modules/network_data/controller/udm_volte_ims.go +++ b/src/modules/network_data/controller/udm_volte_ims.go @@ -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 { From d82f186bc0d371850bb45ca1fdd770e9743f72e4 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 26 Sep 2025 20:17:00 +0800 Subject: [PATCH 5/8] =?UTF-8?q?chore:=20=E5=8F=91=E5=B8=83=E7=89=88?= =?UTF-8?q?=E6=9C=AC=202.2509.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbc7b310..d83c99f6 100644 --- a/CHANGELOG.md +++ b/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信息添加用户数/基站数字段记录 From 33bbe5cd2c425abbcd7f6d950f9ceb26b8803ca1 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sun, 28 Sep 2025 18:38:08 +0800 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20=E5=AF=BC=E5=87=BAudm-auth=E6=9C=AA?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/database/lite/install/sys_menu.sql | 1 + build/database/lite/upgrade/upg_sys_menu.sql | 1 + build/database/std/install/sys_menu.sql | 1 + build/database/std/upgrade/upg_sys_menu.sql | 1 + .../network_data/controller/udm_auth.go | 76 +++++++++++++++++++ src/modules/network_data/network_data.go | 5 ++ 6 files changed, 85 insertions(+) diff --git a/build/database/lite/install/sys_menu.sql b/build/database/lite/install/sys_menu.sql index 53d6c284..abb9c34f 100644 --- a/build/database/lite/install/sys_menu.sql +++ b/build/database/lite/install/sys_menu.sql @@ -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, ''); diff --git a/build/database/lite/upgrade/upg_sys_menu.sql b/build/database/lite/upgrade/upg_sys_menu.sql index 37ccb716..f733aa2b 100644 --- a/build/database/lite/upgrade/upg_sys_menu.sql +++ b/build/database/lite/upgrade/upg_sys_menu.sql @@ -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, ''); diff --git a/build/database/std/install/sys_menu.sql b/build/database/std/install/sys_menu.sql index 6e04b786..ece8c919 100644 --- a/build/database/std/install/sys_menu.sql +++ b/build/database/std/install/sys_menu.sql @@ -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, ''); diff --git a/build/database/std/upgrade/upg_sys_menu.sql b/build/database/std/upgrade/upg_sys_menu.sql index 73d249bd..7841eb43 100644 --- a/build/database/std/upgrade/upg_sys_menu.sql +++ b/build/database/std/upgrade/upg_sys_menu.sql @@ -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, ''); diff --git a/src/modules/network_data/controller/udm_auth.go b/src/modules/network_data/controller/udm_auth.go index 6e849d3c..37e8e5af 100644 --- a/src/modules/network_data/controller/udm_auth.go +++ b/src/modules/network_data/controller/udm_auth.go @@ -2,7 +2,9 @@ package controller import ( "fmt" + "os" "path/filepath" + "runtime" "strings" "time" @@ -653,3 +655,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")) +} diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index 585f6225..3ac2b2b2 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -380,6 +380,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 签约用户信息 From 1bb5ad81caba6efa239df302f4234f67e9c219a7 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sun, 28 Sep 2025 19:28:52 +0800 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20cdr-ims=E7=9A=84mos=E5=92=8Ccct?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_data/controller/ims.go | 82 ++++++++++ src/modules/network_data/network_data.go | 8 + .../network_data/repository/cdr_event.go | 3 + src/modules/network_data/service/cdr_event.go | 151 ++++++++++++++++++ 4 files changed, 244 insertions(+) diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index 9a59c461..969ff255 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -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)) +} diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index 3ac2b2b2..72d83484 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -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 diff --git a/src/modules/network_data/repository/cdr_event.go b/src/modules/network_data/repository/cdr_event.go index 37ef1c33..ae9cae73 100644 --- a/src/modules/network_data/repository/cdr_event.go +++ b/src/modules/network_data/repository/cdr_event.go @@ -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)) } diff --git a/src/modules/network_data/service/cdr_event.go b/src/modules/network_data/service/cdr_event.go index 952e0ebf..06afc70a 100644 --- a/src/modules/network_data/service/cdr_event.go +++ b/src/modules/network_data/service/cdr_event.go @@ -5,6 +5,7 @@ import ( "fmt" "strconv" "strings" + "time" "be.ems/src/framework/i18n" "be.ems/src/framework/logger" @@ -643,3 +644,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 +} From d8e90144605de5214ddf7af8b7004a2da184ace0 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sun, 28 Sep 2025 20:06:31 +0800 Subject: [PATCH 8/8] =?UTF-8?q?fix:=20=E5=AF=BC=E5=87=BASMSC=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0result=20code=E5=92=8Cresult=20cause=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/database/lite/install/sys_dict_data.sql | 11 ++++++ build/database/lite/install/sys_dict_type.sql | 1 + build/database/lite/install/sys_i18n.sql | 11 ++++++ .../lite/upgrade/upg_sys_dict_data.sql | 11 ++++++ .../lite/upgrade/upg_sys_dict_type.sql | 1 + build/database/lite/upgrade/upg_sys_i18n.sql | 11 ++++++ build/database/std/install/sys_dict_data.sql | 11 ++++++ build/database/std/install/sys_dict_type.sql | 1 + build/database/std/install/sys_i18n.sql | 11 ++++++ .../std/upgrade/upg_sys_dict_data.sql | 11 ++++++ .../std/upgrade/upg_sys_dict_type.sql | 1 + build/database/std/upgrade/upg_sys_i18n.sql | 11 ++++++ .../backup_export_cdr/backup_export_cdr.go | 38 +++++++++++-------- src/modules/network_data/service/cdr_event.go | 21 +++++----- 14 files changed, 126 insertions(+), 25 deletions(-) diff --git a/build/database/lite/install/sys_dict_data.sql b/build/database/lite/install/sys_dict_data.sql index c879e3eb..796f657b 100644 --- a/build/database/lite/install/sys_dict_data.sql +++ b/build/database/lite/install/sys_dict_data.sql @@ -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, ''); diff --git a/build/database/lite/install/sys_dict_type.sql b/build/database/lite/install/sys_dict_type.sql index 39b564de..6a1e9c28 100644 --- a/build/database/lite/install/sys_dict_type.sql +++ b/build/database/lite/install/sys_dict_type.sql @@ -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, ''); diff --git a/build/database/lite/install/sys_i18n.sql b/build/database/lite/install/sys_i18n.sql index fcc4d528..cc35ddaa 100644 --- a/build/database/lite/install/sys_i18n.sql +++ b/build/database/lite/install/sys_i18n.sql @@ -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'); diff --git a/build/database/lite/upgrade/upg_sys_dict_data.sql b/build/database/lite/upgrade/upg_sys_dict_data.sql index aae60d22..84751d92 100644 --- a/build/database/lite/upgrade/upg_sys_dict_data.sql +++ b/build/database/lite/upgrade/upg_sys_dict_data.sql @@ -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, ''); diff --git a/build/database/lite/upgrade/upg_sys_dict_type.sql b/build/database/lite/upgrade/upg_sys_dict_type.sql index dca3cac3..ee99eee6 100644 --- a/build/database/lite/upgrade/upg_sys_dict_type.sql +++ b/build/database/lite/upgrade/upg_sys_dict_type.sql @@ -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, ''); diff --git a/build/database/lite/upgrade/upg_sys_i18n.sql b/build/database/lite/upgrade/upg_sys_i18n.sql index b9a14bde..b0fb93d9 100644 --- a/build/database/lite/upgrade/upg_sys_i18n.sql +++ b/build/database/lite/upgrade/upg_sys_i18n.sql @@ -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'); diff --git a/build/database/std/install/sys_dict_data.sql b/build/database/std/install/sys_dict_data.sql index 0dbcda4f..61de3d09 100644 --- a/build/database/std/install/sys_dict_data.sql +++ b/build/database/std/install/sys_dict_data.sql @@ -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; diff --git a/build/database/std/install/sys_dict_type.sql b/build/database/std/install/sys_dict_type.sql index a03a372b..1584aa10 100644 --- a/build/database/std/install/sys_dict_type.sql +++ b/build/database/std/install/sys_dict_type.sql @@ -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; diff --git a/build/database/std/install/sys_i18n.sql b/build/database/std/install/sys_i18n.sql index 7d8e50b8..69502d3c 100644 --- a/build/database/std/install/sys_i18n.sql +++ b/build/database/std/install/sys_i18n.sql @@ -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'); diff --git a/build/database/std/upgrade/upg_sys_dict_data.sql b/build/database/std/upgrade/upg_sys_dict_data.sql index 51ae420a..72c7af0c 100644 --- a/build/database/std/upgrade/upg_sys_dict_data.sql +++ b/build/database/std/upgrade/upg_sys_dict_data.sql @@ -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; diff --git a/build/database/std/upgrade/upg_sys_dict_type.sql b/build/database/std/upgrade/upg_sys_dict_type.sql index 0dc114a0..ff7850fb 100644 --- a/build/database/std/upgrade/upg_sys_dict_type.sql +++ b/build/database/std/upgrade/upg_sys_dict_type.sql @@ -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 diff --git a/build/database/std/upgrade/upg_sys_i18n.sql b/build/database/std/upgrade/upg_sys_i18n.sql index 6041d3f7..41a1967c 100644 --- a/build/database/std/upgrade/upg_sys_i18n.sql +++ b/build/database/std/upgrade/upg_sys_i18n.sql @@ -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'); diff --git a/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go b/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go index cd30318c..86152d6e 100644 --- a/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go +++ b/src/modules/crontask/processor/backup_export_cdr/backup_export_cdr.go @@ -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, }) } // 导出数据表格 diff --git a/src/modules/network_data/service/cdr_event.go b/src/modules/network_data/service/cdr_event.go index 06afc70a..f635c687 100644 --- a/src/modules/network_data/service/cdr_event.go +++ b/src/modules/network_data/service/cdr_event.go @@ -63,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 { @@ -100,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 } } @@ -135,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, }) }