diff --git a/features/ue/controller/ims_user.go b/features/ue/controller/ims_user.go index 83a0a35d..99a80f18 100644 --- a/features/ue/controller/ims_user.go +++ b/features/ue/controller/ims_user.go @@ -192,7 +192,10 @@ func (s *IMSUserController) Adds(c *gin.Context) { c.JSON(200, result.ErrMsg(err.Error())) return } - + // 命令ok时 + if strings.Contains(data, "ok") { + s.imsUserService.LoadData(neId, body.IMSI, num) + } c.JSON(200, result.OkData(data)) } @@ -206,7 +209,7 @@ func (s *IMSUserController) Edit(c *gin.Context) { var body model.IMSUser err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || len(body.IMSI) < model.IMSI_MAX_LENGTH { + if err != nil || (len(body.IMSI) < model.IMSI_MAX_LENGTH && body.Tag == model.TAG_VoLTE) { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -246,7 +249,7 @@ func (s *IMSUserController) Remove(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") imsi := c.Param("imsi") - if neId == "" || len(imsi) < model.IMSI_MAX_LENGTH { + if neId == "" || imsi == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -297,7 +300,7 @@ func (s *IMSUserController) Removes(c *gin.Context) { neId := c.Param("neId") imsi := c.Param("imsi") num := c.Param("num") - if neId == "" || len(imsi) < model.IMSI_MAX_LENGTH || num == "" { + if neId == "" || imsi == "" || num == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } diff --git a/features/ue/controller/voip_auth.go b/features/ue/controller/voip_auth.go index ffbe9559..16faa333 100644 --- a/features/ue/controller/voip_auth.go +++ b/features/ue/controller/voip_auth.go @@ -6,6 +6,8 @@ import ( "strings" "time" + "be.ems/features/ue/model" + "be.ems/features/ue/service" "be.ems/src/framework/constants/uploadsubpath" "be.ems/src/framework/i18n" "be.ems/src/framework/telnet" @@ -14,24 +16,22 @@ import ( "be.ems/src/framework/utils/parse" "be.ems/src/framework/vo/result" neService "be.ems/src/modules/network_element/service" - "be.ems/features/ue/service" - "be.ems/features/ue/model" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) // 实例化控制层 VoIPAuthController 结构体 var NewVoIPAuthController = &VoIPAuthController{ - voipAuthService: service.NewVoIPAuthService, - neInfoService: neService.NewNeInfo, + voipAuthService: service.NewVoIPAuthService, + neInfoService: neService.NewNeInfo, } // IMS用户信息 控制层处理 // // @Description IMS用户信息 控制层处理 type VoIPAuthController struct { - voipAuthService *service.VoIPAuthService // VoIP Auth信息服务 - neInfoService *neService.NeInfo // 网元信息服务 + voipAuthService *service.VoIPAuthService // VoIP Auth信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } func (s *VoIPAuthController) ResetData(c *gin.Context) { @@ -46,7 +46,6 @@ func (s *VoIPAuthController) ResetData(c *gin.Context) { c.JSON(200, result.OkData(data)) } - func (s *VoIPAuthController) List(c *gin.Context) { querys := ctx.QueryMap(c) // querys["userName"] = ctx.LoginUserToUserName(c) @@ -183,7 +182,7 @@ func (s *VoIPAuthController) Adds(c *gin.Context) { defer telnetClient.Close() // 发送MML - cmd := fmt.Sprintf("baa voip:start_username=%s,password=%s,sub_num=%s,", + cmd := fmt.Sprintf("baa voip:start_username=%s,password=%s,sub_num=%s,", body.UserName, body.Password, num) cmd += s.voipAuthService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) @@ -191,7 +190,10 @@ func (s *VoIPAuthController) Adds(c *gin.Context) { c.JSON(200, result.ErrMsg(err.Error())) return } - + // 命令ok时 + if strings.Contains(data, "ok") { + s.voipAuthService.LoadData(neId, body.UserName, num) + } c.JSON(200, result.OkData(data)) } diff --git a/features/ue/ims_user/controller.go b/features/ue/ims_user/controller.go index 48251db7..9873702f 100644 --- a/features/ue/ims_user/controller.go +++ b/features/ue/ims_user/controller.go @@ -20,16 +20,16 @@ import ( // 实例化控制层 Controller 结构体 var NewController = &Controller{ - volteUserService: NewVoLTEService, - neInfoService: neService.NewNeInfo, + imsUserService: NewVoLTEService, + neInfoService: neService.NewNeInfo, } // IMS用户信息 控制层处理 // // @Description IMS用户信息 控制层处理 type Controller struct { - volteUserService *Service // IMS User信息服务 - neInfoService *neService.NeInfo // 网元信息服务 + imsUserService *Service // IMS User信息服务 + neInfoService *neService.NeInfo // 网元信息服务 } func (s *Controller) ResetData(c *gin.Context) { @@ -40,7 +40,7 @@ func (s *Controller) ResetData(c *gin.Context) { return } - data := s.volteUserService.ResetData(neId) + data := s.imsUserService.ResetData(neId) c.JSON(200, result.OkData(data)) } @@ -57,7 +57,7 @@ func (s *Controller) List(c *gin.Context) { } } } - data := s.volteUserService.SelectPage(querys) + data := s.imsUserService.SelectPage(querys) c.JSON(200, result.Ok(data)) } @@ -98,8 +98,8 @@ func (s *Controller) Info(c *gin.Context) { } // 解析返回的数据 - u := s.volteUserService.ParseInfo(imsi, neId, data) - s.volteUserService.Insert(neId, u) + u := s.imsUserService.ParseInfo(imsi, neId, data) + s.imsUserService.Insert(neId, u) c.JSON(200, result.OkData(u)) } @@ -111,9 +111,9 @@ func (s *Controller) Add(c *gin.Context) { return } - var body VoLTEUser + var body IMSUser err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || len(body.IMSI) < IMSI_MAX_LENGTH { + if err != nil || (len(body.IMSI) < IMSI_MAX_LENGTH && body.Tag == TAG_VoLTE) { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -134,7 +134,7 @@ func (s *Controller) Add(c *gin.Context) { // 发送MML cmd := fmt.Sprintf("add imsuser:imsi=%s,", body.IMSI) - cmd += s.volteUserService.ParseCommandParams(body) + cmd += s.imsUserService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -144,7 +144,7 @@ func (s *Controller) Add(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { body.NeId = neId - s.volteUserService.Insert(neId, body) + s.imsUserService.Insert(neId, body) } c.JSON(200, result.OkData(data)) } @@ -158,9 +158,9 @@ func (s *Controller) Adds(c *gin.Context) { return } - var body VoLTEUser + var body IMSUser err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || len(body.IMSI) < IMSI_MAX_LENGTH { + if err != nil || (len(body.IMSI) < IMSI_MAX_LENGTH && body.Tag == TAG_VoLTE) { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -181,7 +181,7 @@ func (s *Controller) Adds(c *gin.Context) { // 发送MML cmd := fmt.Sprintf("baa imsuser:start_imsi=%s,start_msisdn=%s,sub_num=%s,", body.IMSI, body.MSISDN, num) - cmd += s.volteUserService.ParseCommandParams(body) + cmd += s.imsUserService.ParseCommandParams(body) // 去除msisdn参数,避免重复 omemsisdn := fmt.Sprintf(",msisdn=%s,", body.MSISDN) cmd = strings.Replace(cmd, omemsisdn, ",", 1) @@ -202,9 +202,9 @@ func (s *Controller) Edit(c *gin.Context) { return } - var body VoLTEUser + var body IMSUser err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || len(body.IMSI) < IMSI_MAX_LENGTH { + if err != nil || (len(body.IMSI) < IMSI_MAX_LENGTH && body.Tag == TAG_VoLTE) { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -225,7 +225,7 @@ func (s *Controller) Edit(c *gin.Context) { // 发送MML cmd := fmt.Sprintf("mod imsuser:imsi=%s,", body.IMSI) - cmd += s.volteUserService.ParseCommandParams(body) + cmd += s.imsUserService.ParseCommandParams(body) data, err := telnet.ConvertToStr(telnetClient, cmd) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -235,7 +235,7 @@ func (s *Controller) Edit(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { body.NeId = neId - s.volteUserService.Insert(neId, body) + s.imsUserService.Insert(neId, body) } c.JSON(200, result.OkData(data)) } @@ -244,7 +244,7 @@ func (s *Controller) Remove(c *gin.Context) { language := ctx.AcceptLanguage(c) neId := c.Param("neId") imsi := c.Param("imsi") - if neId == "" || len(imsi) < IMSI_MAX_LENGTH { + if neId == "" || imsi == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -282,7 +282,7 @@ func (s *Controller) Remove(c *gin.Context) { } // 命令ok时 if strings.Contains(data, "ok") { - s.volteUserService.Delete(neId, imsi) + s.imsUserService.Delete(neId, imsi) } resultData[imsi] = data } @@ -295,7 +295,7 @@ func (s *Controller) Removes(c *gin.Context) { neId := c.Param("neId") imsi := c.Param("imsi") num := c.Param("num") - if neId == "" || len(imsi) < IMSI_MAX_LENGTH || num == "" { + if neId == "" || imsi == "" || num == "" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -324,7 +324,7 @@ func (s *Controller) Removes(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.volteUserService.LoadData(neId, imsi, num) + s.imsUserService.LoadData(neId, imsi, num) } c.JSON(200, result.OkData(data)) } @@ -357,15 +357,15 @@ func (s *Controller) Export(c *gin.Context) { querys["pageNum"] = 1 querys["pageSize"] = 10000 - data := s.volteUserService.SelectPage(querys) + data := s.imsUserService.SelectPage(querys) if parse.Number(data["total"]) == 0 { // 导出数据记录为空 c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) return } - rows := data["rows"].([]VoLTEUser) + rows := data["rows"].([]IMSUser) - // rows := s.volteUserService.SelectList(VoLTEUser{NeId: neId}) + // rows := s.imsUserService.SelectList(IMSUser{NeId: neId}) if len(rows) <= 0 { // 导出数据记录为空 c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty"))) @@ -474,11 +474,11 @@ func (s *Controller) Import(c *gin.Context) { if strings.Contains(data, "ok") { if strings.HasSuffix(body.UploadPath, ".csv") { data := file.ReadFileCSV(localFilePath) - go s.volteUserService.InsertData(neInfo.NeId, "csv", data) + go s.imsUserService.InsertData(neInfo.NeId, "csv", data) } if strings.HasSuffix(body.UploadPath, ".txt") { data := file.ReadFileTXT(",", localFilePath) - go s.volteUserService.InsertData(neInfo.NeId, "txt", data) + go s.imsUserService.InsertData(neInfo.NeId, "txt", data) } } c.JSON(200, result.OkMsg(data)) diff --git a/features/ue/ims_user/model.go b/features/ue/ims_user/model.go index 5dbb1858..2c7f58f6 100644 --- a/features/ue/ims_user/model.go +++ b/features/ue/ims_user/model.go @@ -1,26 +1,75 @@ -package ims_user - -const ( - // IMSI 号码长度 - IMSI_MAX_LENGTH = 15 - // MSISDN 号码长度 - MSISDN_MAX_LENGTH = 15 -) - -// @Description VoLTE用户信息 -type VoLTEUser struct { - ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 - NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识 - IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID - MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 - Tag string `json:"tag" gorm:"column:tag"` // Tag: 0=VoIP, 1=VoLTE - VNI string `json:"vni" gorm:"column:vni"` // VNI - - TenantID string `json:"tenantID" gorm:"column:tenant_id"` - TenantName string `json:"tenantName" gorm:"-"` -} - -// TableName 表名称 -func (*VoLTEUser) TableName() string { - return "u_ims_user" -} +package ims_user + +import ( + "fmt" + "strconv" + "strings" +) + +const ( + // IMSI 号码长度 + IMSI_MAX_LENGTH = 15 + // MSISDN 号码长度 + MSISDN_MAX_LENGTH = 15 +) + +type CallTag int + +const ( + TAG_VoIP CallTag = iota // VoIP标记 + TAG_VoLTE // VoLTE标记 + TAG_UNKNOWN // 未知标记 +) + +func (ct CallTag) Enum() string { + switch ct { + case TAG_VoIP: + return "VoIP" + case TAG_VoLTE: + return "VoLTE" + default: + return "unknown" + } +} + +func (ct CallTag) String() string { + return fmt.Sprintf("%d", ct) +} + +// ParseCallTag 将字符串转换为 CallTag 枚举类型 +func ParseCallTag(s string) CallTag { + if i, err := strconv.Atoi(s); err == nil { + return CallTag(i) + } + // 如果转换失败,则按名称匹配(忽略大小写) + switch strings.ToLower(s) { + case "voip": + return TAG_VoIP + case "volte": + return TAG_VoLTE + case "": + // 如果字符串为空,则返回未知标记 + return TAG_UNKNOWN + default: + // 默认返回 VoIP + return TAG_VoLTE + } +} + +// @Description IMS用户信息 +type IMSUser struct { + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` // 主键 + NeId string `json:"neId" gorm:"column:ne_id"` // UDM网元标识 + IMSI string `json:"imsi" gorm:"column:imsi"` // SIM卡/USIM卡ID + MSISDN string `json:"msisdn" gorm:"column:msisdn"` // 用户电话号码 + Tag CallTag `json:"tag" gorm:"column:tag"` // tag: 0=VoIP, 1=VoLTE + VNI string `json:"vni" gorm:"column:vni"` // VNI + + TenantID string `json:"tenantID" gorm:"column:tenant_id"` + TenantName string `json:"tenantName" gorm:"-"` +} + +// TableName 表名称 +func (*IMSUser) TableName() string { + return "u_ims_user" +} diff --git a/go.mod b/go.mod index 7f3eebc1..d94ed172 100644 --- a/go.mod +++ b/go.mod @@ -43,6 +43,8 @@ require ( xorm.io/xorm v1.3.9 ) +require github.com/google/go-cmp v0.6.0 // indirect + require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/KyleBanks/depth v1.2.1 // indirect