feat: UDM用户数据添加imsi拓展信息关联

This commit is contained in:
TsMask
2024-09-19 11:20:21 +08:00
parent 01d19134fb
commit 6da5ac6c22
14 changed files with 1004 additions and 773 deletions

View File

@@ -23,7 +23,7 @@ import (
// 实例化控制层 UDMAuthController 结构体
var NewUDMAuth = &UDMAuthController{
udmAuthService: neDataService.NewUDMAuthImpl,
udmAuthService: neDataService.NewUDMAuthUser,
neInfoService: neService.NewNeInfoImpl,
}
@@ -32,7 +32,7 @@ var NewUDMAuth = &UDMAuthController{
// PATH /udm/auth
type UDMAuthController struct {
// UDM鉴权信息服务
udmAuthService neDataService.IUDMAuth
udmAuthService *neDataService.UDMAuthUser
// 网元信息服务
neInfoService neService.INeInfo
}
@@ -103,26 +103,9 @@ func (s *UDMAuthController) Info(c *gin.Context) {
}
neId = ""
u := model.UDMAuth{
IMSI: imsi,
Amf: data["amf"],
Status: "1",
Ki: data["ki"],
AlgoIndex: data["algo"],
Opc: data["opc"],
NeId: neId,
}
// 查询imsi存在赋予id用于更新
list := s.udmAuthService.SelectList(u)
if len(list) > 0 {
item := list[0]
if item.ID != "" {
u.ID = item.ID
}
}
go s.udmAuthService.Insert(neId, u)
// 解析返回的数据
u := s.udmAuthService.ParseInfo(imsi, neId, data)
s.udmAuthService.Insert(neId, u)
c.JSON(200, result.OkData(u))
}
@@ -137,7 +120,7 @@ func (s *UDMAuthController) Add(c *gin.Context) {
return
}
var body model.UDMAuth
var body model.UDMAuthUser
err := c.ShouldBindBodyWith(&body, binding.JSON)
if err != nil || body.IMSI == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
@@ -169,7 +152,7 @@ func (s *UDMAuthController) Add(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
neId = ""
go s.udmAuthService.Insert(neId, body)
s.udmAuthService.Insert(neId, body)
}
c.JSON(200, result.OkData(data))
}
@@ -186,7 +169,7 @@ func (s *UDMAuthController) Adds(c *gin.Context) {
return
}
var body model.UDMAuth
var body model.UDMAuthUser
err := c.ShouldBindBodyWith(&body, binding.JSON)
if err != nil || body.IMSI == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
@@ -234,7 +217,7 @@ func (s *UDMAuthController) Edit(c *gin.Context) {
return
}
var body model.UDMAuth
var body model.UDMAuthUser
err := c.ShouldBindBodyWith(&body, binding.JSON)
if err != nil || body.IMSI == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
@@ -279,7 +262,7 @@ func (s *UDMAuthController) Edit(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
neId = ""
go s.udmAuthService.Insert(neId, body)
s.udmAuthService.Insert(neId, body)
}
c.JSON(200, result.OkData(data))
}
@@ -330,7 +313,7 @@ func (s *UDMAuthController) Remove(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
neId = ""
go s.udmAuthService.Delete(neId, imsi)
s.udmAuthService.Delete(imsi, neId)
}
resultData[imsi] = data
}
@@ -402,7 +385,7 @@ func (s *UDMAuthController) Export(c *gin.Context) {
}
neId := ""
list := s.udmAuthService.SelectList(model.UDMAuth{NeId: neId})
list := s.udmAuthService.SelectList(model.UDMAuthUser{NeId: neId})
// 文件名
fileName := fmt.Sprintf("udm_auth_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), body.Type)
filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName)

View File

@@ -3,7 +3,6 @@ package controller
import (
"fmt"
"path/filepath"
"strconv"
"strings"
"time"
@@ -23,7 +22,7 @@ import (
// 实例化控制层 UDMSubController 结构体
var NewUDMSub = &UDMSubController{
udmSubService: neDataService.NewUDMSubImpl,
udmSubService: neDataService.NewUDMSub,
neInfoService: neService.NewNeInfoImpl,
}
@@ -32,7 +31,7 @@ var NewUDMSub = &UDMSubController{
// PATH /udm/sub
type UDMSubController struct {
// UDM签约信息服务
udmSubService neDataService.IUDMSub
udmSubService *neDataService.UDMSubUser
// 网元信息服务
neInfoService neService.INeInfo
}
@@ -102,53 +101,10 @@ func (s *UDMSubController) Info(c *gin.Context) {
return
}
// 解析返回的数据
cnType, _ := strconv.ParseInt(data["CNType"][:4], 0, 64)
rat, _ := strconv.ParseInt(data["RAT"][:4], 0, 64)
msisdn := data["MSISDN"]
imsMsisdnLen := strings.Index(msisdn, ",")
if imsMsisdnLen != -1 {
msisdn = msisdn[:imsMsisdnLen]
}
neId = ""
u := model.UDMSub{
IMSI: imsi,
Msisdn: msisdn,
Ambr: data["AMBR"],
Arfb: data["AreaForbidden"],
Cn: fmt.Sprint(cnType),
SmData: data["SM-Data(snssai+dnn[1..n])"],
Sar: data["ServiceAreaRestriction"],
Nssai: data["NSSAI"],
SmfSel: data["Smf-Selection"],
Rat: fmt.Sprint(rat),
NeId: neId,
}
// 1,64,24,65,def_eps,1,2,010200000000,-
if v, ok := data["EPS-Data"]; ok {
u.EpsDat = v
arr := strings.Split(v, ",")
u.EpsFlag = arr[0]
u.EpsOdb = arr[1]
u.HplmnOdb = arr[2]
u.Ard = arr[3]
u.Epstpl = arr[4]
u.ContextId = arr[5]
u.ApnContext = arr[7]
// [6] 是不要的,导入和导出不用
u.StaticIp = arr[8]
}
// 查询imsi存在赋予id用于更新
list := s.udmSubService.SelectList(u)
if len(list) > 0 {
item := list[0]
if item.ID != "" {
u.ID = item.ID
}
}
go s.udmSubService.Insert(neId, u)
// 解析返回的数据
u := s.udmSubService.ParseInfo(imsi, neId, data)
s.udmSubService.Insert(neId, u)
c.JSON(200, result.OkData(u))
}
@@ -163,9 +119,9 @@ func (s *UDMSubController) Add(c *gin.Context) {
return
}
var body model.UDMSub
var body model.UDMSubUser
err := c.ShouldBindBodyWith(&body, binding.JSON)
if err != nil || body.IMSI == "" {
if err != nil || len(body.IMSI) < 15 {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
@@ -185,8 +141,8 @@ func (s *UDMSubController) Add(c *gin.Context) {
defer telnetClient.Close()
// 发送MML
cmd := fmt.Sprintf("add udmuser:imsi=%s,msisdn=%s,ambr=%s,nssai=%s,arfb=%s,sar=%s,rat=%s,cn=%s,smf_sel=%s,sm_data=%s,eps_flag=%s,eps_odb=%s,hplmn_odb=%s,ard=%s,epstpl=%s,context_id=%s,apn_context=%s",
body.IMSI, body.Msisdn, body.Ambr, body.Nssai, body.Arfb, body.Sar, body.Rat, body.Cn, body.SmfSel, body.SmData, body.EpsFlag, body.EpsOdb, body.HplmnOdb, body.Ard, body.Epstpl, body.ContextId, body.ApnContext)
cmd := fmt.Sprintf("add udmuser:imsi=%s,msisdn=%s,ambr=%s,nssai=%s,arfb=%s,sar=%s,rat=%s,cn=%s,smf_sel=%s,sm_data=%s,eps_flag=%s,eps_odb=%s,hplmn_odb=%s,ard=%s,epstpl=%s,context_id=%s,apn_context=%s,cag=%s",
body.IMSI, body.MSISDN, body.Ambr, body.Nssai, body.Arfb, body.Sar, body.Rat, body.Cn, body.SmfSel, body.SmData, body.EpsFlag, body.EpsOdb, body.HplmnOdb, body.Ard, body.Epstpl, body.ContextId, body.ApnContext, body.Cag)
// static_ip指给4G UE分配的静态IP没有可不带此字段名批量添加IP会自动递增
if body.StaticIp != "" {
cmd += fmt.Sprintf(",static_ip=%s", body.StaticIp)
@@ -200,7 +156,8 @@ func (s *UDMSubController) Add(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
neId = ""
go s.udmSubService.Insert(neId, body)
body.NeId = neId
s.udmSubService.Insert(neId, body)
}
c.JSON(200, result.OkData(data))
}
@@ -217,9 +174,9 @@ func (s *UDMSubController) Adds(c *gin.Context) {
return
}
var body model.UDMSub
var body model.UDMSubUser
err := c.ShouldBindBodyWith(&body, binding.JSON)
if err != nil || body.IMSI == "" {
if err != nil || len(body.IMSI) < 15 {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
@@ -239,8 +196,8 @@ func (s *UDMSubController) Adds(c *gin.Context) {
defer telnetClient.Close()
// 发送MML
cmd := fmt.Sprintf("baa udmuser:start_imsi=%s,start_msisdn=%s,sub_num=%s,ambr=%s,nssai=%s,arfb=%s,sar=%s,rat=%s,cn=%s,smf_sel=%s,sm_data=%s,eps_flag=%s,eps_odb=%s,hplmn_odb=%s,ard=%s,epstpl=%s,context_id=%s,apn_context=%s",
body.IMSI, body.Msisdn, num, body.Ambr, body.Nssai, body.Arfb, body.Sar, body.Rat, body.Cn, body.SmfSel, body.SmData, body.EpsFlag, body.EpsOdb, body.HplmnOdb, body.Ard, body.Epstpl, body.ContextId, body.ApnContext)
cmd := fmt.Sprintf("baa udmuser:start_imsi=%s,start_msisdn=%s,sub_num=%s,ambr=%s,nssai=%s,arfb=%s,sar=%s,rat=%s,cn=%s,smf_sel=%s,sm_data=%s,eps_flag=%s,eps_odb=%s,hplmn_odb=%s,ard=%s,epstpl=%s,context_id=%s,apn_context=%s,cag=%s",
body.IMSI, body.MSISDN, num, body.Ambr, body.Nssai, body.Arfb, body.Sar, body.Rat, body.Cn, body.SmfSel, body.SmData, body.EpsFlag, body.EpsOdb, body.HplmnOdb, body.Ard, body.Epstpl, body.ContextId, body.ApnContext, body.Cag)
// static_ip指给4G UE分配的静态IP没有可不带此字段名批量添加IP会自动递增
if body.StaticIp != "" {
cmd += fmt.Sprintf(",static_ip=%s", body.StaticIp)
@@ -254,7 +211,7 @@ func (s *UDMSubController) Adds(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
neId = ""
go s.udmSubService.LoadData(neId, body.IMSI, num)
go s.udmSubService.LoadData(neId, body.IMSI, num, body.Remark)
}
c.JSON(200, result.OkData(data))
}
@@ -270,9 +227,9 @@ func (s *UDMSubController) Edit(c *gin.Context) {
return
}
var body model.UDMSub
var body model.UDMSubUser
err := c.ShouldBindBodyWith(&body, binding.JSON)
if err != nil || body.IMSI == "" {
if err != nil || len(body.IMSI) < 15 {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
@@ -294,8 +251,8 @@ func (s *UDMSubController) Edit(c *gin.Context) {
// 发送MML
cmd := fmt.Sprintf("mod udmuser:imsi=%s", body.IMSI)
// 修改的参数名称
if body.Msisdn != "" {
cmd += fmt.Sprintf(",msisdn=%s", body.Msisdn)
if body.MSISDN != "" {
cmd += fmt.Sprintf(",msisdn=%s", body.MSISDN)
}
if body.Ambr != "" {
cmd += fmt.Sprintf(",ambr=%s", body.Ambr)
@@ -345,6 +302,9 @@ func (s *UDMSubController) Edit(c *gin.Context) {
if body.ApnContext != "" {
cmd += fmt.Sprintf(",apn_context=%s", body.ApnContext)
}
if body.Cag != "" {
cmd += fmt.Sprintf(",cag=%s", body.Cag)
}
if body.StaticIp != "" {
cmd += fmt.Sprintf(",static_ip=%s", body.StaticIp)
}
@@ -357,7 +317,8 @@ func (s *UDMSubController) Edit(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
neId = ""
go s.udmSubService.Insert(neId, body)
body.NeId = neId
s.udmSubService.Insert(neId, body)
}
c.JSON(200, result.OkData(data))
}
@@ -369,7 +330,7 @@ func (s *UDMSubController) Remove(c *gin.Context) {
language := ctx.AcceptLanguage(c)
neId := c.Param("neId")
imsi := c.Param("imsi")
if neId == "" || imsi == "" {
if neId == "" || len(imsi) < 15 {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
@@ -408,7 +369,7 @@ func (s *UDMSubController) Remove(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
neId = ""
go s.udmSubService.Delete(neId, imsi)
s.udmSubService.Delete(neId, imsi)
}
resultData[imsi] = data
}
@@ -424,7 +385,7 @@ func (s *UDMSubController) Removes(c *gin.Context) {
neId := c.Param("neId")
imsi := c.Param("imsi")
num := c.Param("num")
if neId == "" || imsi == "" || num == "" {
if neId == "" || len(imsi) < 15 || num == "" {
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
return
}
@@ -454,7 +415,8 @@ func (s *UDMSubController) Removes(c *gin.Context) {
// 命令ok时
if strings.Contains(data, "ok") {
neId = ""
go s.udmSubService.LoadData(neId, imsi, num)
go s.udmSubService.LoadData(neId, imsi, num, "-(Deleted)-")
}
c.JSON(200, result.OkData(data))
}
@@ -480,7 +442,7 @@ func (s *UDMSubController) Export(c *gin.Context) {
}
neId := ""
list := s.udmSubService.SelectList(model.UDMSub{NeId: neId})
list := s.udmSubService.SelectList(model.UDMSubUser{NeId: neId})
// 文件名
fileName := fmt.Sprintf("udm_sub_user_export_%s_%d.%s", neId, time.Now().UnixMilli(), body.Type)
filePath := fmt.Sprintf("%s/%s", file.ParseUploadFileDir(uploadsubpath.EXPORT), fileName)
@@ -491,7 +453,7 @@ func (s *UDMSubController) Export(c *gin.Context) {
data = append(data, []string{"imsi", "msisdn", "ambr", "nssai", "arfb", "sar", "rat", "cn", "smf_sel", "sm_dat", "eps_dat"})
for _, v := range list {
epsDat := fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s", v.EpsFlag, v.EpsOdb, v.HplmnOdb, v.Ard, v.Epstpl, v.ContextId, v.ApnContext, v.StaticIp)
data = append(data, []string{v.IMSI, v.Msisdn, v.Ambr, v.Nssai, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, epsDat})
data = append(data, []string{v.IMSI, v.MSISDN, v.Ambr, v.Nssai, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, epsDat})
}
// 输出到文件
err = file.WriterFileCSV(data, filePath)
@@ -506,7 +468,7 @@ func (s *UDMSubController) Export(c *gin.Context) {
data := [][]string{}
for _, v := range list {
epsDat := fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s", v.EpsFlag, v.EpsOdb, v.HplmnOdb, v.Ard, v.Epstpl, v.ContextId, v.ApnContext, v.StaticIp)
data = append(data, []string{v.IMSI, v.Msisdn, v.Ambr, v.Nssai, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, epsDat})
data = append(data, []string{v.IMSI, v.MSISDN, v.Ambr, v.Nssai, v.Arfb, v.Sar, v.Rat, v.Cn, v.SmfSel, v.SmData, epsDat})
}
// 输出到文件
err = file.WriterFileTXT(data, ",", filePath)