diff --git a/features/cdr/cdrevent.go b/features/cdr/cdrevent.go index 02c95243..0459cab2 100644 --- a/features/cdr/cdrevent.go +++ b/features/cdr/cdrevent.go @@ -2,6 +2,7 @@ package cdr import ( "encoding/json" + "fmt" "io" "net/http" "time" @@ -212,6 +213,7 @@ type CDREvent struct { RmUID string `json:"rmUID" xorm:"rm_uid"` Timestamp int `json:"timestamp" xorm:"timestamp"` CDR map[string]any `json:"CDR" xorm:"cdr_json"` + TenantID string `json:"tenantID" xorm:"tenant_id"` } func PostCDREventFromIMS(w http.ResponseWriter, r *http.Request) { @@ -234,6 +236,16 @@ func PostCDREventFromIMS(w http.ResponseWriter, r *http.Request) { } log.Trace("cdrEvent:", cdrEvent) + // for multi-tenancy + where := fmt.Sprintf("'%v' like msisdn", cdrEvent.CDR["callerParty"]) + tenantID, err := dborm.XormGetSingleColStringByWhere("u_sub_user", "tenant_id", where) + if err != nil { + log.Errorf("failed to get tenant_id:%v", err) + } + if tenantID != "" { + cdrEvent.TenantID = tenantID + } + affected, err := dborm.XormInsertTableOne("cdr_event_ims", cdrEvent) if err != nil && affected <= 0 { log.Error("Failed to insert cdr_event_ims:", err) @@ -271,6 +283,29 @@ func PostCDREventFromSMF(w http.ResponseWriter, r *http.Request) { } log.Trace("cdrEvent:", cdrEvent) + cdrJson, err := json.Marshal(cdrEvent.CDR) + if err != nil { + log.Error("Failed to Marshal cdr:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + cdr := new(ChargingRecord) + err = json.Unmarshal(cdrJson, &cdr) + if err != nil { + log.Error("Failed to Unmarshal cdr:", err) + services.ResponseInternalServerError500ProcessError(w, err) + return + } + // for multi-tenancy + where := fmt.Sprintf("'%v' like imsi or '%v' like msisdn", cdr.SubscriberIdentifier.SubscriptionIDData, cdr.SubscriberIdentifier.SubscriptionIDData) + tenantID, err := dborm.XormGetSingleColStringByWhere("u_sub_user", "tenant_id", where) + if err != nil { + log.Errorf("failed to get tenant_id:%v", err) + } + if tenantID != "" { + cdrEvent.TenantID = tenantID + } + affected, err := dborm.XormInsertTableOne("cdr_event_smf", cdrEvent) if err != nil && affected <= 0 { log.Error("Failed to insert cdr_event_smf:", err) diff --git a/features/event/event.go b/features/event/event.go index 66164b1a..29a009a2 100644 --- a/features/event/event.go +++ b/features/event/event.go @@ -33,6 +33,7 @@ type UEEvent struct { Timestamp int64 `json:"timestamp" xorm:"timestamp"` EventType string `json:"eventType" xorm:"event_type"` EventJson map[string]any `json:"eventJSON" xorm:"event_json"` + TenantID string `json:"tenantID" xorm:"tenant_id"` } func PostUEEventFromAMF(c *gin.Context) { @@ -64,6 +65,16 @@ func PostUEEventFromAMF(c *gin.Context) { ueEvent.EventType = eventType log.Trace("ueEvent AMF:", ueEvent) + // for multi-tenancy + where := fmt.Sprintf("status='1' and tenancy_type='IMSI' and '%v' like tenancy_key", ueEvent.EventJson["imsi"]) + tenantID, err := dborm.XormGetSingleColStringByWhere("sys_tenant", "parent_id", where) + if err != nil { + log.Errorf("failed to get tenant_id:%v", err) + } + if tenantID != "" { + ueEvent.TenantID = tenantID + } + affected, err := dborm.XormInsertTableOne("ue_event_amf", ueEvent) if err != nil && affected <= 0 { log.Error("Failed to insert ue_event_amf:", err) @@ -87,6 +98,16 @@ func PostUEEvent(w http.ResponseWriter, r *http.Request) { return } + // for multi-tenancy + where := fmt.Sprintf("status='1' and tenancy_type='IMSI' and '%v' like tenancy_key", ueEvent.EventJson["imsi"]) + tenantID, err := dborm.XormGetSingleColStringByWhere("sys_tenant", "parent_id", where) + if err != nil { + log.Errorf("failed to get tenant_id:%v", err) + } + if tenantID != "" { + ueEvent.TenantID = tenantID + } + ueEvent.NeType = strings.ToUpper(neType) tableName := fmt.Sprintf("ue_event_%s", strings.ToLower(neType)) affected, err := dborm.XormInsertTableOne(tableName, ueEvent) diff --git a/features/udm_user/repo/repo_udm_sub_user.go b/features/udm_user/repo/repo_udm_sub_user.go index 7f3b1181..f0611208 100644 --- a/features/udm_user/repo/repo_udm_sub_user.go +++ b/features/udm_user/repo/repo_udm_sub_user.go @@ -516,7 +516,6 @@ func (r *RepoUdmSubUser) SetTenantName(subArr *[]model.UdmSubUser) { } func (r *RepoUdmSubUser) SetTenantID(subArr *[]model.UdmSubUser) { - fmt.Printf("len:%d", len(*subArr)) for s := 0; s < len(*subArr); s++ { var tenantID []string err := datasource.DefaultDB().Table("sys_tenant"). diff --git a/src/modules/network_data/controller/amf.go b/src/modules/network_data/controller/amf.go index fbc7142f..6b0f0740 100644 --- a/src/modules/network_data/controller/amf.go +++ b/src/modules/network_data/controller/amf.go @@ -56,6 +56,8 @@ func (s *AMFController) UEList(c *gin.Context) { // } // querys.RmUID = neInfo.RmUID + // for multi-tenancy + querys.UserName = ctx.LoginUserToUserName(c) // 查询数据 data := s.ueEventService.SelectPage(querys) c.JSON(200, result.Ok(data)) diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index feef3813..20976d84 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -56,7 +56,8 @@ func (s *IMSController) CDRList(c *gin.Context) { // return // } // querys.RmUID = neInfo.RmUID - + // for multi-tenancy + querys.UserName = ctx.LoginUserToUserName(c) // 查询数据 data := s.cdrEventService.SelectPage(querys) c.JSON(200, result.Ok(data)) diff --git a/src/modules/network_data/controller/mme.go b/src/modules/network_data/controller/mme.go index a7707a18..eaf2b0c7 100644 --- a/src/modules/network_data/controller/mme.go +++ b/src/modules/network_data/controller/mme.go @@ -57,6 +57,8 @@ func (s *MMEController) UEList(c *gin.Context) { // } // querys.RmUID = neInfo.RmUID + // for multi-tenancy + querys.UserName = ctx.LoginUserToUserName(c) // 查询数据 data := s.ueEventService.SelectPage(querys) c.JSON(200, result.Ok(data)) diff --git a/src/modules/network_data/controller/smf.go b/src/modules/network_data/controller/smf.go index 2e033386..250c0c34 100644 --- a/src/modules/network_data/controller/smf.go +++ b/src/modules/network_data/controller/smf.go @@ -54,7 +54,8 @@ func (s *SMFController) CDRList(c *gin.Context) { // return // } // querys.RmUID = neInfo.RmUID - + // for multi-tenancy + querys.UserName = ctx.LoginUserToUserName(c) // 查询数据 data := s.cdrEventService.SelectPage(querys) c.JSON(200, result.Ok(data)) diff --git a/src/modules/network_data/model/cdr_event_ims.go b/src/modules/network_data/model/cdr_event_ims.go index ffe280c5..c7f181f3 100644 --- a/src/modules/network_data/model/cdr_event_ims.go +++ b/src/modules/network_data/model/cdr_event_ims.go @@ -11,6 +11,8 @@ type CDREventIMS 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"` + TenantName string `json:"tenantName" gorm:"column:tenant_name"` } // CDREventIMSQuery CDR会话对象IMS查询参数结构体 @@ -23,6 +25,8 @@ type CDREventIMSQuery 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"` + 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 PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` diff --git a/src/modules/network_data/model/cdr_event_smf.go b/src/modules/network_data/model/cdr_event_smf.go index 259c1025..83821150 100644 --- a/src/modules/network_data/model/cdr_event_smf.go +++ b/src/modules/network_data/model/cdr_event_smf.go @@ -11,7 +11,8 @@ type CDREventSMF 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"` + TenantName string `json:"tenantName" gorm:"column:tenant_name"` // ====== 非数据库字段属性 ====== // RecordType string `json:"recordType" gorm:"column:record_type"` @@ -33,6 +34,8 @@ type CDREventSMFQuery struct { SubscriberID string `json:"subscriberID" form:"subscriberID"` StartTime string `json:"startTime" form:"startTime"` EndTime string `json:"endTime" form:"endTime"` + TenantName string `json:"tenantName" form:"tenantName"` + 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 PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` diff --git a/src/modules/network_data/model/ue_event_amf.go b/src/modules/network_data/model/ue_event_amf.go index 6fa549bd..fea56cde 100644 --- a/src/modules/network_data/model/ue_event_amf.go +++ b/src/modules/network_data/model/ue_event_amf.go @@ -12,19 +12,23 @@ type UEEventAMF struct { EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` + TenantID string `json:"tenantID" gorm:"tenant_id"` + TenantName string `json:"tenantName" gorm:"column:tenant_name"` } // UEEventAMFQuery UE会话对象AMF查询参数结构体 type UEEventAMFQuery struct { - NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型, 暂时支持AMF - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - EventType string `json:"eventType" form:"eventType"` // 事件类型 auth-result detach cm-state - IMSI string `json:"imsi" form:"imsi"` // imsi - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` - PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` + NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型, 暂时支持AMF + NeID string `json:"neId" form:"neId" binding:"required"` + RmUID string `json:"rmUID" form:"rmUID"` + EventType string `json:"eventType" form:"eventType"` // 事件类型 auth-result detach cm-state + IMSI string `json:"imsi" form:"imsi"` // imsi + StartTime string `json:"startTime" form:"startTime"` + EndTime string `json:"endTime" form:"endTime"` + TenantName string `json:"tenantName" form:"tenantName"` + 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 + PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` + PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` } diff --git a/src/modules/network_data/model/ue_event_mme.go b/src/modules/network_data/model/ue_event_mme.go index 8ceab120..27a4e48e 100644 --- a/src/modules/network_data/model/ue_event_mme.go +++ b/src/modules/network_data/model/ue_event_mme.go @@ -12,19 +12,23 @@ type UEEventMME struct { EventType string `json:"eventType" gorm:"column:event_type"` // 事件类型 auth-result detach cm-state EventJSONStr string `json:"eventJSON" gorm:"column:event_json"` CreatedAt time.Time `json:"createdAt" gorm:"column:created_at;default:CURRENT_TIMESTAMP"` + TenantID string `json:"tenantID" gorm:"column:tenant_id"` + TenantName string `json:"tenantName" gorm:"column:tenant_name"` } // UEEventMMEQuery UE会话对象MME查询参数结构体 type UEEventMMEQuery struct { - NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型, 暂时支持MME - NeID string `json:"neId" form:"neId" binding:"required"` - RmUID string `json:"rmUID" form:"rmUID"` - EventType string `json:"eventType" form:"eventType"` // 事件类型 auth-result detach cm-state - IMSI string `json:"imsi" form:"imsi"` // imsi - StartTime string `json:"startTime" form:"startTime"` - EndTime string `json:"endTime" form:"endTime"` - SortField string `json:"sortField" form:"sortField" binding:"omitempty,oneof=timestamp"` // 排序字段,填写结果字段 - SortOrder string `json:"sortOrder" form:"sortOrder" binding:"omitempty,oneof=asc desc"` // 排序升降序,asc desc - PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` - PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` + NeType string `json:"neType" form:"neType" binding:"required"` // 网元类型, 暂时支持MME + NeID string `json:"neId" form:"neId" binding:"required"` + RmUID string `json:"rmUID" form:"rmUID"` + EventType string `json:"eventType" form:"eventType"` // 事件类型 auth-result detach cm-state + IMSI string `json:"imsi" form:"imsi"` // imsi + StartTime string `json:"startTime" form:"startTime"` + EndTime string `json:"endTime" form:"endTime"` + TenantName string `json:"tenantName" form:"tenantName"` + 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 + PageNum int64 `json:"pageNum" form:"pageNum" binding:"required"` + PageSize int64 `json:"pageSize" form:"pageSize" binding:"required"` } diff --git a/src/modules/network_data/repository/cdr_event_ims.impl.go b/src/modules/network_data/repository/cdr_event_ims.impl.go index 8ab83dda..c025260d 100644 --- a/src/modules/network_data/repository/cdr_event_ims.impl.go +++ b/src/modules/network_data/repository/cdr_event_ims.impl.go @@ -4,6 +4,8 @@ import ( "fmt" "strings" + dborm "be.ems/lib/core/datasource" + "be.ems/lib/log" "be.ems/src/framework/datasource" "be.ems/src/framework/logger" "be.ems/src/framework/utils/parse" @@ -13,16 +15,21 @@ import ( // 实例化数据层 CDREventImpl 结构体 var NewCDREventIMSImpl = &CDREventIMSImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_ims`, + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at, + t.tenant_id, t.tenant_name + from cdr_event_ims c + left join sys_tenant t on t.tenant_id = c.tenant_id`, resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + "tenant_id": "TenantID", + "tenant_name": "TenantName", }, } @@ -93,6 +100,33 @@ func (r *CDREventIMSImpl) SelectPage(querys model.CDREventIMSQuery) map[string]a } } + // for multi-tenancy solution + if querys.TenantName != "" { + var tenantID string + _, err := dborm.DefaultDB().Table("sys_tenant"). + Where("tenant_name=?", querys.TenantName).Cols("tenant_id").Distinct().Get(&tenantID) + if err != nil { + log.Errorf("Get tenant_id from sys_user err => %v", err) + } + log.Tracef("userName=%v, tenantID=%v", querys.TenantName, tenantID) + if tenantID != "" { + conditions = append(conditions, "c.tenant_id = ?") + params = append(params, tenantID) + } + } else if querys.UserName != "" { + var tenantID string + _, err := dborm.DefaultDB().Table("sys_user"). + Where("user_name=?", querys.UserName).Cols("tenant_id").Distinct().Get(&tenantID) + if err != nil { + log.Errorf("Get tenant_id from sys_user err => %v", err) + } + log.Tracef("userName=%v, tenantID=%v", querys.UserName, tenantID) + if tenantID != "" { + conditions = append(conditions, "c.tenant_id = ?") + params = append(params, tenantID) + } + } + // 构建查询条件语句 whereSql := "" if len(conditions) > 0 { @@ -105,7 +139,7 @@ func (r *CDREventIMSImpl) SelectPage(querys model.CDREventIMSQuery) map[string]a } // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_ims" + totalSql := "select count(1) as 'total' from cdr_event_ims c" totalRows, err := datasource.RawDB("", totalSql+whereSql, params) if err != nil { logger.Errorf("total err => %v", err) diff --git a/src/modules/network_data/repository/cdr_event_smf.impl.go b/src/modules/network_data/repository/cdr_event_smf.impl.go index 818f1f25..dab30208 100644 --- a/src/modules/network_data/repository/cdr_event_smf.impl.go +++ b/src/modules/network_data/repository/cdr_event_smf.impl.go @@ -4,6 +4,8 @@ import ( "fmt" "strings" + dborm "be.ems/lib/core/datasource" + "be.ems/lib/log" "be.ems/src/framework/datasource" "be.ems/src/framework/logger" "be.ems/src/framework/utils/parse" @@ -13,17 +15,22 @@ import ( // 实例化数据层 CDREventSMFImpl 结构体 var NewCDREventSMFImpl = &CDREventSMFImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at from cdr_event_smf`, + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, cdr_json, created_at, + t.tenant_id, t.tenant_name + from cdr_event_smf c + left join sys_tenant t on t.tenant_id = c.tenant_id`, // selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, JSON_EXTRACT(cdr_json, '$.recordType') AS record_type, JSON_EXTRACT(cdr_json, '$.chargingID') AS charging_id, JSON_EXTRACT(cdr_json, '$.subscriberIdentifier.subscriptionIDData') AS subscriber_id, JSON_EXTRACT(cdr_json, '$.duration') AS duration, JSON_EXTRACT(cdr_json, '$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataVolumeUplink') AS data_volume_uplink, JSON_EXTRACT(cdr_json, '$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataVolumeDownlink') AS data_volume_downlink, JSON_EXTRACT(cdr_json, '$.listOfMultipleUnitUsage[*].usedUnitContainer[*].dataTotalVolume') AS data_total_volume, JSON_EXTRACT(cdr_json, '$.pDUSessionChargingInformation.pDUAddress') AS pdu_address, created_at from cdr_event_smf`, resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "cdr_json": "CDRJSONStr", - "created_at": "CreatedAt", + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "cdr_json": "CDRJSONStr", + "created_at": "CreatedAt", + "tenant_id": "TenantID", + "tenant_name": "TenantName", // "id": "ID", // "ne_type": "NeType", // "ne_name": "NeName", @@ -100,6 +107,33 @@ func (r *CDREventSMFImpl) SelectPage(querys model.CDREventSMFQuery) map[string]a params = append(params, querys.SubscriberID) } + // for multi-tenancy solution + if querys.TenantName != "" { + var tenantID string + _, err := dborm.DefaultDB().Table("sys_tenant"). + Where("tenant_name=?", querys.TenantName).Cols("tenant_id").Distinct().Get(&tenantID) + if err != nil { + log.Errorf("Get tenant_id from sys_user err => %v", err) + } + log.Tracef("userName=%v, tenantID=%v", querys.TenantName, tenantID) + if tenantID != "" { + conditions = append(conditions, "c.tenant_id = ?") + params = append(params, tenantID) + } + } else if querys.UserName != "" { + var tenantID string + _, err := dborm.DefaultDB().Table("sys_user"). + Where("user_name=?", querys.UserName).Cols("tenant_id").Distinct().Get(&tenantID) + if err != nil { + log.Errorf("Get tenant_id from sys_user err => %v", err) + } + log.Tracef("userName=%v, tenantID=%v", querys.UserName, tenantID) + if tenantID != "" { + conditions = append(conditions, "c.tenant_id = ?") + params = append(params, tenantID) + } + } + // 构建查询条件语句 whereSql := "" if len(conditions) > 0 { @@ -112,7 +146,7 @@ func (r *CDREventSMFImpl) SelectPage(querys model.CDREventSMFQuery) map[string]a } // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from cdr_event_smf" + totalSql := "select count(1) as 'total' from cdr_event_smf c" totalRows, err := datasource.RawDB("", totalSql+whereSql, params) if err != nil { logger.Errorf("total err => %v", err) diff --git a/src/modules/network_data/repository/udm_sub.impl.go b/src/modules/network_data/repository/udm_sub.impl.go index 3c7eebe6..3afb58ab 100644 --- a/src/modules/network_data/repository/udm_sub.impl.go +++ b/src/modules/network_data/repository/udm_sub.impl.go @@ -95,8 +95,10 @@ func (r *UDMSubImpl) SelectPage(query map[string]any) map[string]any { params = append(params, strings.Trim(v.(string), " ")) } if v, ok := query["imsi"]; ok && v != "" { - conditions = append(conditions, "imsi like concat(concat('%', ?), '%')") - params = append(params, strings.Trim(v.(string), " ")) + //conditions = append(conditions, "imsi like concat(concat('%', ?), '%')") + //params = append(params, strings.Trim(v.(string), " ")) + conditions = append(conditions, "imsi like ?") + params = append(params, v) } if v, ok := query["neId"]; ok && v != "" { conditions = append(conditions, "ne_id = ?") diff --git a/src/modules/network_data/repository/ue_event_amf.impl.go b/src/modules/network_data/repository/ue_event_amf.impl.go index b442207c..5f6c4fd1 100644 --- a/src/modules/network_data/repository/ue_event_amf.impl.go +++ b/src/modules/network_data/repository/ue_event_amf.impl.go @@ -4,6 +4,8 @@ import ( "fmt" "strings" + dborm "be.ems/lib/core/datasource" + "be.ems/lib/log" "be.ems/src/framework/datasource" "be.ems/src/framework/logger" "be.ems/src/framework/utils/parse" @@ -13,17 +15,22 @@ import ( // 实例化数据层 UEEventAMFImpl 结构体 var NewUEEventAMFImpl = &UEEventAMFImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_amf`, + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at, + t.tenant_id, t.tenant_name + from ue_event_amf e + left join sys_tenant t on t.tenant_id = e.tenant_id`, resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "event_type": "EventType", - "event_json": "EventJSONStr", - "created_at": "CreatedAt", + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "event_type": "EventType", + "event_json": "EventJSONStr", + "created_at": "CreatedAt", + "tenant_id": "TenantID", + "tenant_name": "TenantName", }, } @@ -90,6 +97,32 @@ func (r *UEEventAMFImpl) SelectPage(querys model.UEEventAMFQuery) map[string]any params = append(params, querys.IMSI) } + // for multi-tenancy solution + if querys.TenantName != "" { + var tenantID string + _, err := dborm.DefaultDB().Table("sys_tenant"). + Where("tenant_name=?", querys.TenantName).Cols("tenant_id").Distinct().Get(&tenantID) + if err != nil { + log.Errorf("Get tenant_id from sys_user err => %v", err) + } + log.Tracef("userName=%v, tenantID=%v", querys.TenantName, tenantID) + if tenantID != "" { + conditions = append(conditions, "e.tenant_id = ?") + params = append(params, tenantID) + } + } else if querys.UserName != "" { + var tenantID string + _, err := dborm.DefaultDB().Table("sys_user"). + Where("user_name=?", querys.UserName).Cols("tenant_id").Distinct().Get(&tenantID) + if err != nil { + log.Errorf("Get tenant_id from sys_user err => %v", err) + } + log.Tracef("userName=%v, tenantID=%v", querys.UserName, tenantID) + if tenantID != "" { + conditions = append(conditions, "e.tenant_id = ?") + params = append(params, tenantID) + } + } // 构建查询条件语句 whereSql := "" if len(conditions) > 0 { @@ -102,7 +135,7 @@ func (r *UEEventAMFImpl) SelectPage(querys model.UEEventAMFQuery) map[string]any } // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ue_event_amf" + totalSql := "select count(1) as 'total' from ue_event_amf e" totalRows, err := datasource.RawDB("", totalSql+whereSql, params) if err != nil { logger.Errorf("total err => %v", err) diff --git a/src/modules/network_data/repository/ue_event_mme.impl.go b/src/modules/network_data/repository/ue_event_mme.impl.go index 180bc9df..6ff86390 100644 --- a/src/modules/network_data/repository/ue_event_mme.impl.go +++ b/src/modules/network_data/repository/ue_event_mme.impl.go @@ -4,6 +4,8 @@ import ( "fmt" "strings" + dborm "be.ems/lib/core/datasource" + "be.ems/lib/log" "be.ems/src/framework/datasource" "be.ems/src/framework/logger" "be.ems/src/framework/utils/parse" @@ -13,17 +15,22 @@ import ( // 实例化数据层 UEEventMMEImpl 结构体 var NewUEEventMMEImpl = &UEEventMMEImpl{ - selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at from ue_event_mme`, + selectSql: `select id, ne_type, ne_name, rm_uid, timestamp, event_type, event_json, created_at, + t.tenant_id, t.tenant_name + from ue_event_mme e + left join sys_tenant t on t.tenant_id = e.tenant_id`, resultMap: map[string]string{ - "id": "ID", - "ne_type": "NeType", - "ne_name": "NeName", - "rm_uid": "RmUID", - "timestamp": "Timestamp", - "event_type": "EventType", - "event_json": "EventJSONStr", - "created_at": "CreatedAt", + "id": "ID", + "ne_type": "NeType", + "ne_name": "NeName", + "rm_uid": "RmUID", + "timestamp": "Timestamp", + "event_type": "EventType", + "event_json": "EventJSONStr", + "created_at": "CreatedAt", + "tenant_id": "TenantID", + "tenant_name": "TenantName", }, } @@ -90,6 +97,33 @@ func (r *UEEventMMEImpl) SelectPage(querys model.UEEventMMEQuery) map[string]any params = append(params, querys.IMSI) } + // for multi-tenancy solution + if querys.TenantName != "" { + var tenantID string + _, err := dborm.DefaultDB().Table("sys_tenant"). + Where("tenant_name=?", querys.TenantName).Cols("tenant_id").Distinct().Get(&tenantID) + if err != nil { + log.Errorf("Get tenant_id from sys_user err => %v", err) + } + log.Tracef("userName=%v, tenantID=%v", querys.TenantName, tenantID) + if tenantID != "" { + conditions = append(conditions, "e.tenant_id = ?") + params = append(params, tenantID) + } + } else if querys.UserName != "" { + var tenantID string + _, err := dborm.DefaultDB().Table("sys_user"). + Where("user_name=?", querys.UserName).Cols("tenant_id").Distinct().Get(&tenantID) + if err != nil { + log.Errorf("Get tenant_id from sys_user err => %v", err) + } + log.Tracef("userName=%v, tenantID=%v", querys.UserName, tenantID) + if tenantID != "" { + conditions = append(conditions, "e.tenant_id = ?") + params = append(params, tenantID) + } + } + // 构建查询条件语句 whereSql := "" if len(conditions) > 0 { @@ -102,7 +136,7 @@ func (r *UEEventMMEImpl) SelectPage(querys model.UEEventMMEQuery) map[string]any } // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from ue_event_mme" + totalSql := "select count(1) as 'total' from ue_event_mme e" totalRows, err := datasource.RawDB("", totalSql+whereSql, params) if err != nil { logger.Errorf("total err => %v", err)