This commit is contained in:
2023-09-11 14:45:35 +08:00
14 changed files with 508 additions and 66 deletions

View File

@@ -1,11 +1,17 @@
package udmuser
import (
"fmt"
"net/http"
"ems.agt/features/udm_user/model"
"ems.agt/features/udm_user/service"
"ems.agt/lib/core/file"
mmlclient "ems.agt/lib/core/mml_client"
"ems.agt/lib/core/utils/ctx"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/dborm"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
)
@@ -19,30 +25,50 @@ func Routers() []services.RouterItem {
}
rs := [...]services.RouterItem{
// UDM签约用户
{
Method: "GET",
Pattern: "/authUserList",
Pattern: "/auths",
Handler: apis.UdmAuthUserList,
Middleware: nil, //midware.Authorize(nil),
},
{
Method: "POST",
Pattern: "/authUserSave",
Pattern: "/auth/getSave",
Handler: apis.UdmAuthUserSave,
Middleware: nil, //midware.Authorize(nil),
},
{
Method: "GET",
Pattern: "/subUserList",
Pattern: "/auth/{neId}/{imsi}",
Handler: apis.UdmAuthUserInfo,
Middleware: nil, //midware.Authorize(nil),
},
{
Method: "POST",
Pattern: "/auth/export",
Handler: apis.UdmAuthUserExport,
Middleware: nil, //midware.Authorize(nil),
},
// UDM签约用户
{
Method: "GET",
Pattern: "/subs",
Handler: apis.UdmSubUserList,
Middleware: nil, //midware.Authorize(nil),
},
{
Method: "POST",
Pattern: "/subUserSave",
Pattern: "/sub/getSave",
Handler: apis.UdmSubUserSave,
Middleware: nil, //midware.Authorize(nil),
},
{
Method: "GET",
Pattern: "/sub/{neId}/{imsi}",
Handler: apis.UdmSubUserInfo,
Middleware: nil, //midware.Authorize(nil),
},
// 添加更多的 Router 对象...
}
@@ -60,6 +86,16 @@ func Routers() []services.RouterItem {
return rsPrefix
}
// NeInfoByUDM 网元信息
func NeInfoByUDM(neId string) (*dborm.NeInfo, error) {
neInfo, err := dborm.XormGetNeInfo("UDM", neId)
if err != nil {
log.Error("dborm.XormGetNeInfo is failed:", err)
return nil, err
}
return neInfo, nil
}
// UDM 用户
//
// PATH /udmUserManage
@@ -70,34 +106,113 @@ type UdmUserApi struct {
// UDM鉴权用户
//
// GET /authUserList
// GET /auths
func (s *UdmUserApi) UdmAuthUserList(w http.ResponseWriter, r *http.Request) {
querys := ctx.QueryMap(r)
data := s.authUser.AuthUserList(querys)
data := s.authUser.Page(querys)
ctx.JSON(w, 200, result.Ok(data))
}
// UDM鉴权用户-获取全部保存数据库
//
// POST /authUserSave
// POST /auth/getSave
func (s *UdmUserApi) UdmAuthUserSave(w http.ResponseWriter, r *http.Request) {
data := s.authUser.AuthUserSave()
data := s.authUser.Save("")
ctx.JSON(w, 200, result.OkData(data))
}
// UDM鉴权用户-信息
//
// GET /{neId}/{imsi}
func (s *UdmUserApi) UdmAuthUserInfo(w http.ResponseWriter, r *http.Request) {
neId := ctx.Param(r, "neId")
imsi := ctx.Param(r, "imsi")
if neId == "" || imsi == "" {
ctx.JSON(w, 400, result.CodeMsg(400, "参数错误"))
return
}
neInfo, err := NeInfoByUDM(neId)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
msg := fmt.Sprintf("dsp authdat:imsi=%s", imsi)
// 发送MML
data, err := mmlclient.MMLSendMsgToMap(neInfo.Ip, msg)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
ctx.JSON(w, 200, result.OkData(data))
}
// UDM鉴权用户-导出
//
// POST /auth/export
func (s *UdmUserApi) UdmAuthUserExport(w http.ResponseWriter, r *http.Request) {
list := s.authUser.List(model.UdmAuthUser{})
// 文件名
fileName := "OMC_AUTH_100.csv"
filePath := "C:/AMP/Probject/ems_backend/restagent/OMC_AUTH_100.csv"
// 转换数据
data := [][]string{}
data = append(data, []string{"ID", "Msisdn", "Imsi", "Amf", "Status", "Ki", "AlgoIndex", "Opc"})
for _, v := range list {
data = append(data, []string{v.ID, v.Msisdn, v.Imsi, v.Amf, v.Status, v.Ki, v.AlgoIndex, v.Opc})
}
// 输出到文件
err := file.WriterCSVFile(data, filePath)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
ctx.FileAttachment(w, r, filePath, fileName)
}
// UDM签约用户
//
// GET /subUserList
// GET /subs
func (s *UdmUserApi) UdmSubUserList(w http.ResponseWriter, r *http.Request) {
querys := ctx.QueryMap(r)
data := s.subUser.SubUserList(querys)
data := s.subUser.Page(querys)
ctx.JSON(w, 200, result.Ok(data))
}
// UDM签约用户-获取全部保存数据库
//
// POST /subUserSave
// POST /sub/getSave
func (s *UdmUserApi) UdmSubUserSave(w http.ResponseWriter, r *http.Request) {
data := s.subUser.SubUserSave()
data := s.subUser.Save("")
ctx.JSON(w, 200, result.OkData(data))
}
// UDM签约用户-信息
//
// GET /{neId}/{imsi}
func (s *UdmUserApi) UdmSubUserInfo(w http.ResponseWriter, r *http.Request) {
neId := ctx.Param(r, "neId")
imsi := ctx.Param(r, "imsi")
if neId == "" || imsi == "" {
ctx.JSON(w, 400, result.CodeMsg(400, "参数错误"))
return
}
neInfo, err := NeInfoByUDM(neId)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
msg := fmt.Sprintf("dsp udmuser:imsi=%s", imsi)
// 发送MML
data, err := mmlclient.MMLSendMsgToMap(neInfo.Ip, msg)
if err != nil {
ctx.JSON(w, 200, result.ErrMsg(err.Error()))
return
}
ctx.JSON(w, 200, result.OkData(data))
}

View File

@@ -10,4 +10,5 @@ type UdmAuthUser struct {
Ki string `json:"ki" xorm:"ki"` // ki
AlgoIndex string `json:"algoIndex" xorm:"algo_index"` //
Opc string `json:"opc" xorm:"opc"`
NeID string `json:"neId" xorm:"ne_id"` // UDM网元标识-子系统
}

View File

@@ -13,4 +13,5 @@ type UdmSubUser struct {
CnType string `json:"cnType" xorm:"cn_type"`
SubData string `json:"subData" xorm:"sub_data"`
Eps string `json:"eps" xorm:"eps"`
NeID string `json:"neId" xorm:"ne_id"` // UDM网元标识-子系统
}

View File

@@ -12,7 +12,7 @@ import (
// 实例化数据层 RepoUdmAuthUser 结构体
var NewRepoUdmAuthUser = &RepoUdmAuthUser{
selectSql: `select
id, msisdn, imsi, amf, status, ki, algo_index, opc
id, msisdn, imsi, amf, status, ki, algo_index, opc, ne_id
from u_auth_user`,
resultMap: map[string]string{
@@ -24,6 +24,7 @@ var NewRepoUdmAuthUser = &RepoUdmAuthUser{
"ki": "Ki",
"algo_index": "AlgoLndex",
"opc": "Opc",
"ne_id": "NeID",
},
}
@@ -50,7 +51,7 @@ func (r *RepoUdmAuthUser) convertResultRows(rows []map[string]any) []model.UdmAu
return arr
}
// SelectPage 根据条件分页查询字典类型
// SelectPage 根据条件分页查询
func (r *RepoUdmAuthUser) SelectPage(query map[string]any) map[string]any {
// 查询条件拼接
var conditions []string
@@ -59,6 +60,10 @@ func (r *RepoUdmAuthUser) SelectPage(query map[string]any) map[string]any {
conditions = append(conditions, "msisdn like concat(?, '%')")
params = append(params, v)
}
if v, ok := query["neId"]; ok && v != "" {
conditions = append(conditions, "ne_id = ?")
params = append(params, v)
}
// 构建查询条件语句
whereSql := ""
@@ -100,3 +105,56 @@ func (r *RepoUdmAuthUser) SelectPage(query map[string]any) map[string]any {
"rows": rows,
}
}
// SelectList 根据实体查询
func (r *RepoUdmAuthUser) SelectList(auth model.UdmAuthUser) []model.UdmAuthUser {
// 查询条件拼接
var conditions []string
var params []any
if auth.Imsi != "" {
conditions = append(conditions, "msisdn like concat(?, '%')")
params = append(params, auth.Imsi)
}
if auth.NeID != "" {
conditions = append(conditions, "ne_id = ?")
params = append(params, auth.NeID)
}
// 构建查询条件语句
whereSql := ""
if len(conditions) > 0 {
whereSql += " where " + strings.Join(conditions, " and ")
}
// 查询数据
querySql := r.selectSql + whereSql
results, err := datasource.RawDB("", querySql, params)
if err != nil {
log.Errorf("query err => %v", err)
}
// 转换实体
return r.convertResultRows(results)
}
// Insert 清空ne_id后新增实体
func (r *RepoUdmAuthUser) Inserts(neID string, authArr []model.UdmAuthUser) int64 {
var num int64 = 0
// 清空指定ne_id
_, err := datasource.ExecDB("", "DELETE FROM u_auth_user WHERE ne_id = ?", []any{neID})
if err != nil {
log.Errorf("TRUNCATE err => %v", err)
return num
}
for _, u := range authArr {
u.NeID = neID
results, err := datasource.DefaultDB().Table("u_auth_user").Insert(u)
if err != nil {
return num
}
num += results
}
return num
}

View File

@@ -12,7 +12,7 @@ import (
// 实例化数据层 RepoUdmSubUser 结构体
var NewRepoUdmSubUser = &RepoUdmSubUser{
selectSql: `select
id, msisdn, imsi, sub_ue_ambr_temp, sub_snssai_temp, rai, forbidden_areas_temp, service_area_restrict_temp, cn_type, sub_data, eps
id, msisdn, imsi, sub_ue_ambr_temp, sub_snssai_temp, rai, forbidden_areas_temp, service_area_restrict_temp, cn_type, sub_data, eps, ne_id
from u_sub_user`,
resultMap: map[string]string{
@@ -27,6 +27,7 @@ var NewRepoUdmSubUser = &RepoUdmSubUser{
"cn_type": "CnType",
"sub_data": "SubData",
"eps": "Eps",
"ne_id": "NeID",
},
}
@@ -66,6 +67,10 @@ func (r *RepoUdmSubUser) SelectPage(query map[string]any) map[string]any {
conditions = append(conditions, "imsi like concat(?, '%')")
params = append(params, v)
}
if v, ok := query["neId"]; ok && v != "" {
conditions = append(conditions, "ne_id = ?")
params = append(params, v)
}
// 构建查询条件语句
whereSql := ""
@@ -107,3 +112,56 @@ func (r *RepoUdmSubUser) SelectPage(query map[string]any) map[string]any {
"rows": rows,
}
}
// SelectList 根据实体查询
func (r *RepoUdmSubUser) SelectList(auth model.UdmSubUser) []model.UdmSubUser {
// 查询条件拼接
var conditions []string
var params []any
if auth.Imsi != "" {
conditions = append(conditions, "msisdn like concat(?, '%')")
params = append(params, auth.Imsi)
}
if auth.NeID != "" {
conditions = append(conditions, "ne_id = ?")
params = append(params, auth.NeID)
}
// 构建查询条件语句
whereSql := ""
if len(conditions) > 0 {
whereSql += " where " + strings.Join(conditions, " and ")
}
// 查询数据
querySql := r.selectSql + whereSql
results, err := datasource.RawDB("", querySql, params)
if err != nil {
log.Errorf("query err => %v", err)
}
// 转换实体
return r.convertResultRows(results)
}
// Insert 清空ne_id后新增实体
func (r *RepoUdmSubUser) Inserts(neID string, authArr []model.UdmSubUser) int64 {
var num int64 = 0
// 清空指定ne_id
// _, err := datasource.ExecDB("", "TRUNCATE TABLE u_sub_user", nil)
_, err := datasource.ExecDB("", "DELETE FROM u_sub_user WHERE ne_id = ?", []any{neID})
if err != nil {
log.Errorf("TRUNCATE err => %v", err)
}
for _, u := range authArr {
u.NeID = neID
results, err := datasource.DefaultDB().Table("u_sub_user").Insert(u)
if err != nil {
return num
}
num += results
}
return num
}

View File

@@ -0,0 +1,15 @@
package service
import (
"ems.agt/lib/dborm"
"ems.agt/lib/log"
)
func UDMNeInfo(neId string) (*dborm.NeInfo, error) {
neInfo, err := dborm.XormGetNeInfo("UDM", neId)
if err != nil {
log.Error("dborm.XormGetNeInfo is failed:", err)
return nil, err
}
return neInfo, nil
}

View File

@@ -1,9 +1,8 @@
package service
import (
"ems.agt/features/udm_user/model"
"ems.agt/features/udm_user/repo"
"ems.agt/lib/core/datasource"
"ems.agt/lib/log"
)
// 实例化服务层 ServiceUdmAuthUser 结构体
@@ -16,32 +15,23 @@ type ServiceUdmAuthUser struct {
repoAuthUser repo.RepoUdmAuthUser
}
// AuthUserSave UDM鉴权用户-获取全部保存数据库
func (r *ServiceUdmAuthUser) AuthUserSave() int64 {
// Save UDM鉴权用户-获取全部保存数据库
func (r *ServiceUdmAuthUser) Save(neID string) int64 {
var num int64 = 0
authArr := redisUdmAuthUserList()
// 有数据才清空
if len(authArr) == 0 {
return num
}
_, err := datasource.ExecDB("", "TRUNCATE TABLE u_auth_user", nil)
if err != nil {
log.Errorf("TRUNCATE err => %v", err)
}
for _, u := range authArr {
results, err := datasource.DefaultDB().Table("u_auth_user").Insert(u)
if err != nil {
log.Errorf("Insert err => %v", err)
return 0
}
num += results
}
return num
return r.repoAuthUser.Inserts(neID, authArr)
}
// SubUserSave UDM签约用户-分页查询数据库
func (r *ServiceUdmAuthUser) AuthUserList(query map[string]any) map[string]any {
// Page UDM签约用户-分页查询数据库
func (r *ServiceUdmAuthUser) Page(query map[string]any) map[string]any {
return r.repoAuthUser.SelectPage(query)
}
// List UDM签约用户-查询数据库
func (r *ServiceUdmAuthUser) List(authUser model.UdmAuthUser) []model.UdmAuthUser {
return r.repoAuthUser.SelectList(authUser)
}

View File

@@ -1,49 +1,37 @@
package service
import (
"ems.agt/features/udm_user/model"
"ems.agt/features/udm_user/repo"
"ems.agt/lib/core/datasource"
"ems.agt/lib/log"
)
// 实例化服务层 ServiceUdmSubUser 结构体
var NewServiceUdmSubUser = &ServiceUdmSubUser{
repoAuthUser: *repo.NewRepoUdmAuthUser,
repoSunUser: *repo.NewRepoUdmSubUser,
repoSunUser: *repo.NewRepoUdmSubUser,
}
// ServiceUdmSubUser UDM签约用户 服务层处理
type ServiceUdmSubUser struct {
repoAuthUser repo.RepoUdmAuthUser
repoSunUser repo.RepoUdmSubUser
repoSunUser repo.RepoUdmSubUser
}
// SubUserSave UDM签约用户-获取全部保存数据库
func (r *ServiceUdmSubUser) SubUserSave() int64 {
// Save UDM签约用户-获取全部保存数据库
func (r *ServiceUdmSubUser) Save(neID string) int64 {
var num int64 = 0
subArr := redisUdmSubUserList()
// 有数据才清空
if len(subArr) == 0 {
return num
}
_, err := datasource.ExecDB("", "TRUNCATE TABLE u_sub_user", nil)
if err != nil {
log.Errorf("TRUNCATE err => %v", err)
}
for _, u := range subArr {
results, err := datasource.DefaultDB().Table("u_sub_user").Insert(u)
if err != nil {
log.Errorf("Insert err => %v", err)
return 0
}
num += results
}
return num
return r.repoSunUser.Inserts(neID, subArr)
}
// SubUserSave UDM签约用户-分页查询数据库
func (r *ServiceUdmSubUser) SubUserList(query map[string]any) map[string]any {
// Page UDM签约用户-分页查询数据库
func (r *ServiceUdmSubUser) Page(query map[string]any) map[string]any {
return r.repoSunUser.SelectPage(query)
}
// List UDM签约用户-查询数据库
func (r *ServiceUdmSubUser) List(subUser model.UdmSubUser) []model.UdmSubUser {
return r.repoSunUser.SelectList(subUser)
}