From 8b6b49e660df09ad30f311f527286f23594649e6 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Mon, 17 Jun 2024 11:56:16 +0800 Subject: [PATCH] add multi-tenant --- features/udm_user/model/udm_sub_user.go | 2 +- features/udm_user/repo/repo_udm_sub_user.go | 62 +++++++++++-------- src/modules/network_element/model/udm_sub.go | 2 +- .../repository/udm_sub.impl.go | 42 ++++++++++--- src/modules/system/model/sys_tenant.go | 6 +- 5 files changed, 77 insertions(+), 37 deletions(-) diff --git a/features/udm_user/model/udm_sub_user.go b/features/udm_user/model/udm_sub_user.go index 058c23ec..569de935 100644 --- a/features/udm_user/model/udm_sub_user.go +++ b/features/udm_user/model/udm_sub_user.go @@ -25,7 +25,7 @@ type UdmSubUser struct { ApnContext string `json:"apnContext" xorm:"apn_context"` StaticIp string `json:"staticIp" xorm:"static_ip"` TenantID string `json:"tenantID" xorm:"tenant_id"` - TenantName string `json:"tenantName" xorm:"tenant_name"` + TenantName string `json:"tenantName" xorm:"-"` SubNum string `json:"subNum,omitempty" xorm:"-"` // 批量数 } diff --git a/features/udm_user/repo/repo_udm_sub_user.go b/features/udm_user/repo/repo_udm_sub_user.go index 29a4939c..c7daf2a7 100644 --- a/features/udm_user/repo/repo_udm_sub_user.go +++ b/features/udm_user/repo/repo_udm_sub_user.go @@ -88,10 +88,16 @@ func (r *RepoUdmSubUser) SelectPage(query map[string]any) map[string]any { params = append(params, v) } // for multi-tenancy solution - // if v, ok := query["tenantName"]; ok && v != "" { - // conditions = append(conditions, "tenant_name = '?'") - // params = append(params, v) - // } + if v, ok := query["tenantName"]; ok && v != "" { + var tenantID []string + err := datasource.DefaultDB().Table("sys_tenant"). + Where("tenant_name='?'", v).Cols("tenant_id").Distinct().Find(&tenantID) + if err != nil { + log.Errorf("Find tenant_id err => %v", err) + } + conditions = append(conditions, "s.tenant_id = ?") + params = append(params, tenantID[0]) + } // 构建查询条件语句 whereSql := "" @@ -105,7 +111,7 @@ func (r *RepoUdmSubUser) SelectPage(query map[string]any) map[string]any { } // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from u_sub_user" + totalSql := "select count(1) as 'total' from u_sub_user s" totalRows, err := datasource.RawDB("", totalSql+whereSql, params) if err != nil { log.Errorf("total err => %v", err) @@ -169,10 +175,16 @@ func (r *RepoUdmSubUser) SelectList(auth model.UdmSubUser) []model.UdmSubUser { params = append(params, auth.NeID) } // multi-tenancy - // if auth.TenantName != "" { - // conditions = append(conditions, "tenant_name = '?'") - // params = append(params, auth.TenantName) - // } + if auth.TenantName != "" { + var tenantID []string + err := datasource.DefaultDB().Table("sys_tenant"). + Where("tenant_name='?'", auth.TenantName).Cols("tenant_id").Distinct().Find(&tenantID) + if err != nil { + log.Errorf("Find tenant_id err => %v", err) + } + conditions = append(conditions, "s.tenant_id = ?") + params = append(params, tenantID[0]) + } // 构建查询条件语句 whereSql := "" @@ -212,7 +224,7 @@ func (r *RepoUdmSubUser) ClearAndInsert(neID string, subArr []model.UdmSubUser) batch := subArr[i:end] // multi-tenancy - r.SetTenantName(&batch) + r.SetTenantID(&batch) // 调用 InsertMulti 函数将批量数据插入数据库 results, err := datasource.DefaultDB().Table("u_sub_user").InsertMulti(batch) @@ -236,6 +248,10 @@ func (r *RepoUdmSubUser) ClearAndInsert(neID string, subArr []model.UdmSubUser) // Insert 新增实体 func (r *RepoUdmSubUser) Insert(subUser model.UdmSubUser) int64 { + // multi-tenancy + subUserSlice := []model.UdmSubUser{subUser} + r.SetTenantID(&subUserSlice) + results, err := datasource.DefaultDB().Table("u_sub_user").Insert(subUser) if err != nil { log.Errorf("Insert err => %v", err) @@ -257,7 +273,7 @@ func (r *RepoUdmSubUser) Inserts(subUser []model.UdmSubUser) int64 { batch := subUser[i:end] // multi-tenancy - r.SetTenantName(&batch) + r.SetTenantID(&batch) // 调用 InsertMulti 函数将批量数据插入数据库 results, err := datasource.DefaultDB().Table("u_sub_user").InsertMulti(batch) @@ -289,7 +305,7 @@ func (r *RepoUdmSubUser) Insert4G(neID string, subUser model.UdmSubUser) int64 { // multi-tenancy subUserSlice := []model.UdmSubUser{subUser} - r.SetTenantName(&subUserSlice) + r.SetTenantID(&subUserSlice) results, err := datasource.DefaultDB().Table("u_sub_user").Insert(subUser) if err == nil { @@ -481,32 +497,28 @@ func (r *RepoUdmSubUser) Deletes(neID, imsi, num string) int64 { // multi-tenancy solution, get tenant_name by imsi func (r *RepoUdmSubUser) SetTenantName(subArr *[]model.UdmSubUser) { for s := 0; s < len(*subArr); s++ { - var tenantName string - err := datasource.DefaultDB().Table("sys_tenant_map"). - Where("mapping_type='udm_sub' and mapping_key='?'", (*subArr)[s].Imsi).Cols("tenant_name").Find(tenantName) + var tenantName []string + err := datasource.DefaultDB().Table("sys_tenant"). + Where("tenancy_type='IMSI' and tenancy_key='?'", (*subArr)[s].Imsi).Cols("tenant_name").Find(&tenantName) if err != nil { log.Errorf("Find tenant_name err => %v", err) continue } - if tenantName != "" { - log.Infof("tenantName=%s imsi=%s", tenantName, (*subArr)[s].Imsi) - } - (*subArr)[s].TenantName = tenantName + (*subArr)[s].TenantName = tenantName[0] } } func (r *RepoUdmSubUser) SetTenantID(subArr *[]model.UdmSubUser) { + fmt.Printf("len:%d", len(*subArr)) for s := 0; s < len(*subArr); s++ { - var tenantID string + var tenantID []string err := datasource.DefaultDB().Table("sys_tenant"). - Where("tenancy_type='IMSI' and tenancy_key='?'", (*subArr)[s].Imsi).Cols("tenant_id").Find(tenantID) + Where("tenancy_type='IMSI' and tenancy_key='?'", (*subArr)[s].Imsi).Cols("parent_id").Distinct().Find(&tenantID) if err != nil { log.Errorf("Find tenant_id err => %v", err) continue } - if tenantID != "" { - log.Infof("tenantID=%s imsi=%s", tenantID, (*subArr)[s].Imsi) - } - (*subArr)[s].TenantID = tenantID + (*subArr)[s].TenantID = tenantID[0] + fmt.Printf("IMSI: %s, tenantID:%s", (*subArr)[s].Imsi, tenantID[0]) } } diff --git a/src/modules/network_element/model/udm_sub.go b/src/modules/network_element/model/udm_sub.go index f5361207..85fb1ba2 100644 --- a/src/modules/network_element/model/udm_sub.go +++ b/src/modules/network_element/model/udm_sub.go @@ -25,7 +25,7 @@ type UDMSub struct { ApnContext string `json:"apnContext" gorm:"column:apn_context"` StaticIp string `json:"staticIp" gorm:"column:static_ip"` TenantID string `json:"tenantID" gorm:"column:tenant_id"` - TenantName string `json:"tenantName" gorm:"column:tenant_name"` + TenantName string `json:"tenantName" gorm:"-"` // ====== 非数据库字段属性 ====== diff --git a/src/modules/network_element/repository/udm_sub.impl.go b/src/modules/network_element/repository/udm_sub.impl.go index de6c752b..1786c4a8 100644 --- a/src/modules/network_element/repository/udm_sub.impl.go +++ b/src/modules/network_element/repository/udm_sub.impl.go @@ -4,6 +4,8 @@ import ( "strconv" "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" @@ -99,11 +101,16 @@ func (r *UDMSubImpl) SelectPage(query map[string]any) map[string]any { params = append(params, v) } // for multi-tenancy solution - // if v, ok := query["tenantName"]; ok && v != "" { - // conditions = append(conditions, "tenant_name = ?") - // params = append(params, v) - // fmt.Printf("tenantName = %s", v) - // } + if v, ok := query["tenantName"]; ok && v != "" { + var tenantID []string + err := dborm.DefaultDB().Table("sys_tenant"). + Where("tenant_name=?", v).Cols("tenant_id").Distinct().Find(&tenantID) + if err != nil { + log.Errorf("Find tenant_id err => %v", err) + } + conditions = append(conditions, "s.tenant_id = ?") + params = append(params, tenantID[0]) + } // 构建查询条件语句 whereSql := "" @@ -117,7 +124,7 @@ func (r *UDMSubImpl) SelectPage(query map[string]any) map[string]any { } // 查询数量 长度为0直接返回 - totalSql := "select count(1) as 'total' from u_sub_user" + totalSql := "select count(1) as 'total' from u_sub_user s" totalRows, err := datasource.RawDB("", totalSql+whereSql, params) if err != nil { logger.Errorf("total err => %v", err) @@ -200,6 +207,9 @@ func (r *UDMSubImpl) SelectList(subUser model.UDMSub) []model.UDMSub { // Insert 新增实体 func (r *UDMSubImpl) Insert(subUser model.UDMSub) string { + // multi-tenancy + subUserSlice := []model.UDMSub{subUser} + r.SetTenantID(&subUserSlice) err := datasource.DefaultDB().Create(&subUser).Error if err != nil { logger.Errorf("Create err => %v", err) @@ -209,7 +219,10 @@ func (r *UDMSubImpl) Insert(subUser model.UDMSub) string { // Insert 批量添加 func (r *UDMSubImpl) Inserts(subUser []model.UDMSub) int64 { - tx := datasource.DefaultDB().CreateInBatches(subUser, 2000) + // multi-tenancy + r.SetTenantID(&subUser) + + tx := datasource.DefaultDB().CreateInBatches(subUser, 10) if err := tx.Error; err != nil { logger.Errorf("CreateInBatches err => %v", err) } @@ -321,3 +334,18 @@ func (r *UDMSubImpl) Deletes(neID, imsi, num string) int64 { } return tx.RowsAffected } + +func (r *UDMSubImpl) SetTenantID(subArr *[]model.UDMSub) { + for s := 0; s < len(*subArr); s++ { + var tenantID []string + err := dborm.DefaultDB().Table("sys_tenant"). + Where("tenancy_type='IMSI' and tenancy_key=?", (*subArr)[s].Imsi).Cols("parent_id").Distinct().Find(&tenantID) + if err != nil { + log.Errorf("Find tenant_id err => %v", err) + continue + } + if len(tenantID) > 0 { + (*subArr)[s].TenantID = tenantID[0] + } + } +} diff --git a/src/modules/system/model/sys_tenant.go b/src/modules/system/model/sys_tenant.go index 9a628885..c70ed51f 100644 --- a/src/modules/system/model/sys_tenant.go +++ b/src/modules/system/model/sys_tenant.go @@ -1,14 +1,14 @@ package model -// SysTenant 部门对象 sys_Tenant +// SysTenant 租户对象 sys_Tenant type SysTenant struct { - // 部门ID + // 租户ID TenantID string `json:"tenantId"` // 父部门ID ParentID string `json:"parentId" binding:"required"` // 祖级列表 Ancestors string `json:"ancestors"` - // 部门名称 + // 租户名称 TenantName string `json:"tenantName" binding:"required"` // 显示顺序 OrderNum int `json:"orderNum"`