diff --git a/database/install/cdr_event_smsc.sql b/database/install/cdr_event_smsc.sql index b390eb41..a921ac1e 100644 --- a/database/install/cdr_event_smsc.sql +++ b/database/install/cdr_event_smsc.sql @@ -29,9 +29,10 @@ CREATE TABLE `cdr_event_smsc` ( `timestamp` int DEFAULT NULL, `cdr_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, - KEY `id` (`id`) USING BTREE, - KEY `idx_type_timestamp` (`ne_type`,`timestamp`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + INDEX `id`(`id`) USING BTREE, + INDEX `idx_type_timestamp`(`ne_type`, `timestamp`, `tenant_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/install/sys_dict_data1_i18n_zh.sql b/database/install/sys_dict_data1_i18n_zh.sql index 0e016614..8c3eae6a 100644 --- a/database/install/sys_dict_data1_i18n_zh.sql +++ b/database/install/sys_dict_data1_i18n_zh.sql @@ -734,5 +734,6 @@ INSERT INTO `sys_dict_data` VALUES (11037, 11000, 'tenant.errHasChildUse', '操 INSERT INTO `sys_dict_data` VALUES (11038, 11000, 'tenant.errHasUserUse', '不允许删除,租户已分配用户数:{num}', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (11039, 11000, 'tenant.errAssetExists', '租赁资产[{type}:{key}]与现有的资产有冲突', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (11040, 11000, 'menu.tenant.smscCDR', '短信话单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (11041, 11041, 'log.operate.export.tenantName', '租户名称', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/install/sys_dict_data2_i18n_en.sql b/database/install/sys_dict_data2_i18n_en.sql index dea2c7ff..48046527 100644 --- a/database/install/sys_dict_data2_i18n_en.sql +++ b/database/install/sys_dict_data2_i18n_en.sql @@ -734,5 +734,6 @@ INSERT INTO `sys_dict_data` VALUES (14037, 14000, 'tenant.errHasChildUse', 'Oper INSERT INTO `sys_dict_data` VALUES (14038, 14000, 'tenant.errHasUserUse', 'Deletion is not allowed, number of users the tenant has been assigned to: {num}', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (14039, 14000, 'tenant.errAssetExists', 'There is a conflict between tenancy asset[{type}:{key}] and a existing asset', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (14040, 14000, 'menu.tenant.smscCDR', 'SMS CDR', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (11041, 11041, 'log.operate.export.tenantName', 'Tenant Name', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/upg_cdr_event_smsc.sql b/database/upgrade/upg_cdr_event_smsc.sql index 40e3006b..428ea42e 100644 --- a/database/upgrade/upg_cdr_event_smsc.sql +++ b/database/upgrade/upg_cdr_event_smsc.sql @@ -33,4 +33,9 @@ CREATE TABLE IF NOT EXISTS `cdr_event_smsc` ( KEY `idx_type_timestamp` (`ne_type`,`timestamp`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +ALTER TABLE `cdr_event_smsc` +ADD COLUMN IF NOT EXISTS `tenant_id` varchar(32) NULL AFTER `created_at`, +DROP INDEX IF EXISTS `idx_type_timestamp`, +ADD INDEX IF NOT EXISTS `idx_type_timestamp`(`ne_type`, `timestamp`, `tenant_id`) USING BTREE; + SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql index f2840b37..015a0e54 100644 --- a/database/upgrade/upg_sys_dict_data1_i18n_zh.sql +++ b/database/upgrade/upg_sys_dict_data1_i18n_zh.sql @@ -741,5 +741,6 @@ REPLACE INTO `sys_dict_data` VALUES (11037, 11000, 'tenant.errHasChildUse', '操 REPLACE INTO `sys_dict_data` VALUES (11038, 11000, 'tenant.errHasUserUse', '不允许删除,租户已分配用户数:{num}', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (11039, 11000, 'tenant.errAssetExists', '租赁资产[{type}:{key}]与现有的资产有冲突', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (11040, 11000, 'menu.tenant.smscCDR', '短信话单', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (11041, 11041, 'log.operate.export.tenantName', '租户名称', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/upg_sys_dict_data2_i18n_en.sql b/database/upgrade/upg_sys_dict_data2_i18n_en.sql index c034fb54..a51fa6e3 100644 --- a/database/upgrade/upg_sys_dict_data2_i18n_en.sql +++ b/database/upgrade/upg_sys_dict_data2_i18n_en.sql @@ -736,5 +736,6 @@ REPLACE INTO `sys_dict_data` VALUES (14037, 14000, 'tenant.errHasChildUse', 'Ope REPLACE INTO `sys_dict_data` VALUES (14038, 14000, 'tenant.errHasUserUse', 'Deletion is not allowed, number of users the tenant has been assigned to: {num}', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (14039, 14000, 'tenant.errAssetExists', 'There is a conflict between tenancy asset[{type}:{key}] and a existing asset', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); REPLACE INTO `sys_dict_data` VALUES (14040, 14000, 'menu.tenant.smscCDR', 'SMS CDR', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +REPLACE INTO `sys_dict_data` VALUES (11041, 11041, 'log.operate.export.tenantName', 'Tenant Name', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); SET FOREIGN_KEY_CHECKS = 1; diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index 22221200..ef0f2756 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -130,6 +130,7 @@ func (s *IMSController) CDRExport(c *gin.Context) { "F1": "Duration", "G1": "Result", "H1": "Time", + "I1": "Tenant Name", // for multi-tenancy } // 读取字典数据 CDR SIP响应代码类别类型 dictCDRSipCode := sysService.NewSysDictDataImpl.SelectDictDataByType("cdr_sip_code") @@ -195,6 +196,11 @@ func (s *IMSController) CDRExport(c *gin.Context) { releaseTime := parse.Number(v) timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) } + // tenant name + tenantName := "" + if v, ok := cdrJSON["tenantName"]; ok && v != nil { + tenantName = v.(string) + } dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, @@ -205,6 +211,7 @@ func (s *IMSController) CDRExport(c *gin.Context) { "F" + idx: duration, "G" + idx: callResult, "H" + idx: timeStr, + "I" + idx: tenantName, }) } diff --git a/src/modules/network_data/controller/smf.go b/src/modules/network_data/controller/smf.go index 0dc48827..9390ece5 100644 --- a/src/modules/network_data/controller/smf.go +++ b/src/modules/network_data/controller/smf.go @@ -134,6 +134,7 @@ func (s *SMFController) CDRExport(c *gin.Context) { "H1": "Duration", "I1": "Invocation Time", "J1": "PDU Session Charging Information", + "K1": "Tenant Name", // for multi-tenancy } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) @@ -243,6 +244,11 @@ PDU Type: %s PDU IPv4 Address: %s PDU IPv6 Addres Swith Prefix: %s`, User_Identifier, SSC_Mode, RAT_Type, DNN_ID, PDU_Type, PDU_IPv4, PDU_IPv6) } + // Tenant Name + tenantName := "" + if v, ok := cdrJSON["tenantName"]; ok && v != nil { + tenantName = v.(string) + } dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, @@ -255,6 +261,7 @@ PDU IPv6 Addres Swith Prefix: %s`, User_Identifier, SSC_Mode, RAT_Type, DNN_ID, "H" + idx: duration, "I" + idx: invocationTimestamp, "J" + idx: pduSessionChargingInformation, + "K" + idx: tenantName, }) } diff --git a/src/modules/network_data/controller/smsc.go b/src/modules/network_data/controller/smsc.go index 6ebcb75d..9a879bca 100644 --- a/src/modules/network_data/controller/smsc.go +++ b/src/modules/network_data/controller/smsc.go @@ -128,6 +128,7 @@ func (s *SMSCController) CDRExport(c *gin.Context) { "E1": "Called", "F1": "Result", "G1": "Time", + "H1": "Tenant Name", // for multi-tenancy } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) @@ -174,6 +175,11 @@ func (s *SMSCController) CDRExport(c *gin.Context) { releaseTime := parse.Number(v) timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) } + // Tenant name + tenantName := "" + if v, ok := cdrJSON["tenantName"]; ok && v != nil { + tenantName = v.(string) + } dataCells = append(dataCells, map[string]any{ "A" + idx: row.ID, @@ -183,6 +189,7 @@ func (s *SMSCController) CDRExport(c *gin.Context) { "E" + idx: called, "F" + idx: callResult, "G" + idx: timeStr, + "H" + idx: tenantName, }) } diff --git a/src/modules/network_data/model/cdr_event_smsc.go b/src/modules/network_data/model/cdr_event_smsc.go index 773f44a7..b7820650 100644 --- a/src/modules/network_data/model/cdr_event_smsc.go +++ b/src/modules/network_data/model/cdr_event_smsc.go @@ -11,6 +11,8 @@ type CDREventSMSC struct { Timestamp int64 `json:"timestamp" gorm:"column:timestamp"` CDRJSONStr string `json:"cdrJSON" gorm:"column:cdr_json"` CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` + TenantID string `json:"tenantID" gorm:"column:tenant_id"` // for multi-tenancy + TenantName string `json:"tenantName" gorm:"column:tenant_name"` // for multi-tenancy } // CDREventSMSCQuery CDR会话对象SMSC查询参数结构体 @@ -23,7 +25,7 @@ type CDREventSMSCQuery struct { CalledParty string `json:"calledParty" form:"calledParty"` // 被叫号码 StartTime string `json:"startTime" form:"startTime"` EndTime string `json:"endTime" form:"endTime"` - TenantName string `json:"tenantName" form:"tenantName"` + TenantName string `json:"tenantName" form:"tenantName"` // for multi-tenancy UserName string `json:"userName" form:"userName"` SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc diff --git a/src/modules/system/controller/sys_log_operate.go b/src/modules/system/controller/sys_log_operate.go index 9bd47ccf..1bfabd00 100644 --- a/src/modules/system/controller/sys_log_operate.go +++ b/src/modules/system/controller/sys_log_operate.go @@ -151,6 +151,7 @@ func (s *SysLogOperateController) Export(c *gin.Context) { "G1": i18n.TKey(language, "log.operate.export.status"), "H1": i18n.TKey(language, "log.operate.export.operTime"), "I1": i18n.TKey(language, "log.operate.export.costTime"), + "J1": i18n.TKey(language, "log.operate.export.tenantName"), } // 从第二行开始的数据 dataCells := make([]map[string]any, 0) @@ -203,6 +204,7 @@ func (s *SysLogOperateController) Export(c *gin.Context) { "G" + idx: statusValue, "H" + idx: date.ParseDateToStr(row.OperTime, date.YYYY_MM_DDTHH_MM_SSZ), "I" + idx: row.CostTime, + "J" + idx: row.TenantName, }) }