add: cdr and ue event for multi-tenancy

This commit is contained in:
2024-07-04 18:25:25 +08:00
parent 97f53e44e4
commit 52bb4cb69c
16 changed files with 279 additions and 66 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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").

View File

@@ -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))

View File

@@ -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))

View File

@@ -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))

View File

@@ -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))

View File

@@ -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"`

View File

@@ -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"`

View File

@@ -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"`
}

View File

@@ -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"`
}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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 = ?")

View File

@@ -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)

View File

@@ -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)