diff --git a/features/ue/ims_user/controller.go b/features/ue/ims_user/controller.go index 7aadaee1..85091783 100644 --- a/features/ue/ims_user/controller.go +++ b/features/ue/ims_user/controller.go @@ -124,7 +124,7 @@ func (s *Controller) Add(c *gin.Context) { var body IMSUser err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || (len(body.IMSI) < IMSI_MAX_LENGTH && body.Tag == TAG_VoLTE) { + if err != nil || (len(body.IMSI) < IMSI_MAX_LENGTH && body.Tag == 1) { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -171,7 +171,7 @@ func (s *Controller) Adds(c *gin.Context) { var body IMSUser err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || (len(body.IMSI) < IMSI_MAX_LENGTH && body.Tag == TAG_VoLTE) { + if err != nil || (len(body.IMSI) < IMSI_MAX_LENGTH && body.Tag == 1) { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -215,7 +215,7 @@ func (s *Controller) Edit(c *gin.Context) { var body IMSUser err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil || (len(body.IMSI) < IMSI_MAX_LENGTH && body.Tag == TAG_VoLTE) { + if err != nil || (len(body.IMSI) < IMSI_MAX_LENGTH && body.Tag == 1) { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -412,7 +412,14 @@ func (s *Controller) Export(c *gin.Context) { data := [][]string{} data = append(data, []string{"IMSI", "MSISDN", "Tag", "VNI"}) for _, v := range rows { - data = append(data, []string{v.IMSI, v.MSISDN, v.Tag, v.VNI}) + tag := "" + if v.Tag == 0 { + tag = "VoIP" + } + if v.Tag == 1 { + tag = "VoLTE" + } + data = append(data, []string{v.IMSI, v.MSISDN, tag, v.VNI}) } // 输出到文件 if err := file.WriterFileCSV(data, filePath); err != nil { @@ -425,7 +432,14 @@ func (s *Controller) Export(c *gin.Context) { // 转换数据 data := [][]string{} for _, v := range rows { - data = append(data, []string{v.IMSI, v.MSISDN, v.Tag, v.VNI}) + tag := "" + if v.Tag == 0 { + tag = "VoIP" + } + if v.Tag == 1 { + tag = "VoLTE" + } + data = append(data, []string{v.IMSI, v.MSISDN, tag, v.VNI}) } // 输出到文件 if err := file.WriterFileTXTLine(data, ",", filePath); err != nil { diff --git a/features/ue/ims_user/model.go b/features/ue/ims_user/model.go index 2c7f58f6..a77df941 100644 --- a/features/ue/ims_user/model.go +++ b/features/ue/ims_user/model.go @@ -58,12 +58,12 @@ func ParseCallTag(s string) CallTag { // @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 + 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 int `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:"-"` diff --git a/features/ue/ims_user/service.go b/features/ue/ims_user/service.go index 49051bc6..e7d7e19c 100644 --- a/features/ue/ims_user/service.go +++ b/features/ue/ims_user/service.go @@ -2,10 +2,10 @@ package ims_user import ( "fmt" - "strconv" "strings" "be.ems/src/framework/database/redis" + "be.ems/src/framework/utils/parse" neService "be.ems/src/modules/network_element/service" ) @@ -20,8 +20,8 @@ type Service struct { } // dataByRedis UDM签约用户 db:0 中 volte:* -func (r *Service) dataByRedis(imsi, neId string) []VoLTEUser { - arr := []VoLTEUser{} +func (r *Service) dataByRedis(imsi, neId string) []IMSUser { + arr := []IMSUser{} key := fmt.Sprintf("volte:%s", imsi) source := fmt.Sprintf("UDM_%s", neId) @@ -71,12 +71,12 @@ func (r *Service) dataByRedis(imsi, neId string) []VoLTEUser { if len(impiParts) > 1 { vni = impiParts[1] // 输出: ims.mnc001.mcc110.3gppnetwork.org } - a := VoLTEUser{ + a := IMSUser{ NeId: neId, - IMSI: imsi, // volte:360000100000130:8612300000130 - MSISDN: msisdn, // 8612300000130 - Tag: m["tag"], // volte = tag - VNI: vni, // ims.mnc001.mcc110.3gppnetwork.org + IMSI: imsi, // volte:360000100000130:8612300000130 + MSISDN: msisdn, // 8612300000130 + Tag: int(parse.Number(m["tag"])), // volte = tag + VNI: vni, // ims.mnc001.mcc110.3gppnetwork.org } arr = append(arr, a) } @@ -92,7 +92,7 @@ func (r *Service) ResetData(neId string) int64 { } // ParseInfo 解析单个用户imsi签约信息 data从命令MML得到的结果 -func (r *Service) ParseInfo(imsi, neId string, data map[string]string) VoLTEUser { +func (r *Service) ParseInfo(imsi, neId string, data map[string]string) IMSUser { u := r.volteRepository.SelectByIMSIAndNeID(imsi, neId) msisdn := data["msisdn"] @@ -104,7 +104,7 @@ func (r *Service) ParseInfo(imsi, neId string, data map[string]string) VoLTEUser u.NeId = neId u.IMSI = imsi u.MSISDN = msisdn - u.Tag = data["volte_tag"] + u.Tag = int(parse.Number(data["volte_tag"])) u.VNI = data["VNI"] return u } @@ -115,13 +115,13 @@ func (r *Service) SelectPage(query map[string]any) map[string]any { } // SelectList 查询数据库 -func (r *Service) SelectList(u VoLTEUser) []VoLTEUser { +func (r *Service) SelectList(u IMSUser) []IMSUser { return r.volteRepository.SelectList(u) } // Insert 从数据中读取后删除imsi再存入数据库 // imsi长度15,ki长度32,opc长度0或者32 -func (r *Service) Insert(neId string, u VoLTEUser) int64 { +func (r *Service) Insert(neId string, u IMSUser) int64 { uArr := r.dataByRedis(u.IMSI, neId) if len(uArr) > 0 { r.volteRepository.Delete(u.IMSI, neId) @@ -176,33 +176,26 @@ func (r *Service) Delete(neId, imsi string) int64 { // LoadData 重新加载从imsi开始num的数据 func (r *Service) LoadData(neId, imsiOrMsisdn, num string) { - startIMSIOrMsisdn, _ := strconv.ParseInt(imsiOrMsisdn, 10, 64) - subNum, _ := strconv.ParseInt(num, 10, 64) - var i int64 - for i = 0; i < subNum; i++ { - keyIMSI := fmt.Sprintf("%015d", startIMSIOrMsisdn+i) - if !strings.HasPrefix(imsiOrMsisdn, "0") { - keyIMSI = fmt.Sprintf("%d", startIMSIOrMsisdn+i) - } - // 删除原数据 - r.volteRepository.Delete(keyIMSI, neId) - arr := r.dataByRedis(keyIMSI, neId) - if len(arr) < 1 { - continue - } + // 直接删除前缀的记录 + index := len(imsiOrMsisdn) - len(num) - 1 + prefix := imsiOrMsisdn[:index] + r.volteRepository.DeletePrefixByIMSI(neId, prefix) + // 加载数据 + arr := r.dataByRedis(neId, prefix+"*") + if len(arr) > 0 { r.volteRepository.Inserts(arr) } } // ParseCommandParams 解析数据组成命令参数 msisdn=xx,xx=xx,... -func (r *Service) ParseCommandParams(item VoLTEUser) string { +func (r *Service) ParseCommandParams(item IMSUser) string { var conditions []string if item.MSISDN != "" { conditions = append(conditions, fmt.Sprintf("msisdn=%s", item.MSISDN)) } - if item.Tag != "" { - conditions = append(conditions, fmt.Sprintf("volte=%s", item.Tag)) + if item.Tag < 2 { + conditions = append(conditions, fmt.Sprintf("volte=%d", item.Tag)) } if item.VNI != "" { conditions = append(conditions, fmt.Sprintf("vni=%s", item.VNI)) diff --git a/features/ue/service/ims_user.go b/features/ue/service/ims_user.go index fc618ba3..e0e13eb5 100644 --- a/features/ue/service/ims_user.go +++ b/features/ue/service/ims_user.go @@ -2,7 +2,6 @@ package service import ( "fmt" - "strconv" "strings" "time" @@ -186,20 +185,13 @@ func (r *IMSUserService) Delete(neId, imsi string) int64 { // LoadData 重新加载从imsi开始num的数据 func (r *IMSUserService) LoadData(neId, imsiOrMsisdn, num string) { - startIMSIOrMsisdn, _ := strconv.ParseInt(imsiOrMsisdn, 10, 64) - subNum, _ := strconv.ParseInt(num, 10, 64) - var i int64 - for i = 0; i < subNum; i++ { - keyIMSI := fmt.Sprintf("%015d", startIMSIOrMsisdn+i) - if !strings.HasPrefix(imsiOrMsisdn, "0") { - keyIMSI = fmt.Sprintf("%d", startIMSIOrMsisdn+i) - } - // 删除原数据 - r.imsUserRepository.Delete(keyIMSI, neId) - arr := r.dataByRedis(keyIMSI+":*", neId) - if len(arr) < 1 { - continue - } + // 直接删除前缀的记录 + index := len(imsiOrMsisdn) - len(num) - 1 + prefix := imsiOrMsisdn[:index] + r.imsUserRepository.DeletePrefixByIMSI(prefix, neId) + // 加载数据 + arr := r.dataByRedis(prefix+"*", neId) + if len(arr) > 0 { r.imsUserRepository.Inserts(arr) } } diff --git a/features/ue/service/voip_auth.go b/features/ue/service/voip_auth.go index a1e9e20c..6049e84d 100644 --- a/features/ue/service/voip_auth.go +++ b/features/ue/service/voip_auth.go @@ -2,7 +2,6 @@ package service import ( "fmt" - "strconv" "strings" "time" @@ -163,18 +162,14 @@ func (r *VoIPAuthService) Delete(neId, userName string) int64 { } // LoadData 重新加载从userName开始num的数据 -func (r *VoIPAuthService) LoadData(neId, userName, num string) { - startUserName, _ := strconv.ParseInt(userName, 10, 64) - subNum, _ := strconv.ParseInt(num, 10, 64) - var i int64 - for i = 0; i < subNum; i++ { - keyUserName := fmt.Sprintf("%d", startUserName+i) - // 删除原数据 - r.voipAuthRepository.Delete(keyUserName, neId) - arr := r.dataByRedis(keyUserName, neId) - if len(arr) < 1 { - continue - } +func (r *VoIPAuthService) LoadData(neId, username, num string) { + // 直接删除前缀的记录 + index := len(username) - len(num) - 1 + prefix := username[:index] + r.voipAuthRepository.DeletePrefixByUserName(prefix, neId) + // 加载数据 + arr := r.dataByRedis(prefix+"*", neId) + if len(arr) > 0 { r.voipAuthRepository.Inserts(arr) } } diff --git a/src/modules/network_data/controller/udm_sub.go b/src/modules/network_data/controller/udm_sub.go index 5050b1c7..bb7c47df 100644 --- a/src/modules/network_data/controller/udm_sub.go +++ b/src/modules/network_data/controller/udm_sub.go @@ -446,7 +446,7 @@ func (s *UDMSubController) Removes(c *gin.Context) { // 命令ok时 if strings.Contains(data, "ok") { - s.udmSubService.LoadData(neId, imsi, num, "-(Deleted)-") + s.udmSubService.LoadData(neId, imsi, num, "") } c.JSON(200, result.OkData(data)) } diff --git a/src/modules/network_data/service/udm_auth.go b/src/modules/network_data/service/udm_auth.go index d08b5e60..e437c85b 100644 --- a/src/modules/network_data/service/udm_auth.go +++ b/src/modules/network_data/service/udm_auth.go @@ -2,7 +2,6 @@ package service import ( "fmt" - "strconv" "strings" "time" @@ -181,18 +180,13 @@ func (r *UDMAuthUser) Delete(imsi, neId string) int64 { // LoadData 重新加载从imsi开始num的数据 func (r *UDMAuthUser) LoadData(neId, imsi, num string) { - startIMSI, _ := strconv.ParseInt(imsi, 10, 64) - subNum, _ := strconv.ParseInt(num, 10, 64) - var i int64 - for i = 0; i < subNum; i++ { - keyIMSI := fmt.Sprintf("%015d", startIMSI+i) - // 删除原数据 - r.udmAuthRepository.Delete(keyIMSI, neId) - // 加载数据 - arr := r.dataByRedis(keyIMSI, neId) - if len(arr) < 1 { - continue - } + // 直接删除前缀的记录 + idx := len(imsi) - len(num) - 1 + prefix := imsi[:idx] + r.udmAuthRepository.DeletePrefixByIMSI(neId, prefix) + // keys ausf:4600001000004* + arr := r.dataByRedis(prefix+"*", neId) + if len(arr) > 0 { r.udmAuthRepository.Inserts(arr) } } diff --git a/src/modules/network_data/service/udm_sub.go b/src/modules/network_data/service/udm_sub.go index 034e3bdf..9a2ec37b 100644 --- a/src/modules/network_data/service/udm_sub.go +++ b/src/modules/network_data/service/udm_sub.go @@ -272,38 +272,40 @@ func (r *UDMSubUser) Delete(neId, imsi string) int64 { } // LoadData 重新加载从imsi开始num的数据 -// remark不为空,则新增到拓展信息,删除标记为-(Deleted)- func (r *UDMSubUser) LoadData(neId, imsi, num, remark string) { - startIMSI, _ := strconv.ParseInt(imsi, 10, 64) subNum, _ := strconv.ParseInt(num, 10, 64) - var i int64 - for i = 0; i < subNum; i++ { - keyIMSI := fmt.Sprintf("%015d", startIMSI+i) - // 删除原数据 - r.udmSubRepository.Delete(keyIMSI, neId) - if remark == "-(Deleted)-" { - r.udmUserInfoRepository.Delete(keyIMSI, "%") - } - // 加载数据,删除标记为-(Deleted)-加载为空不插入 - arr := r.dataByRedis(keyIMSI, neId) - if len(arr) < 1 { - continue - } - r.udmSubRepository.Inserts(arr) + // 直接删除前缀的记录 + index := len(imsi) - len(num) - 1 + prefix := imsi[:index] + r.udmSubRepository.DeletePrefixByIMSI(prefix, neId) + // r.udmUserInfoRepository.Delete(prefix, "%") + // 加载数据 + arr := r.dataByRedis(prefix+"*", neId) + if len(arr) > 0 { // 拓展信息 if remark != "" { + startIMSI, _ := strconv.ParseInt(imsi, 10, 64) + endIMSI := startIMSI + subNum uarr := make([]model.UDMUserInfo, 0, len(arr)) for _, v := range arr { - uarr = append(uarr, model.UDMUserInfo{ - IMSI: v.IMSI, - MSISDN: v.MSISDN, - NeId: v.NeId, - Remark: remark, - }) + itemIMSI, err := strconv.ParseInt(v.IMSI, 10, 64) + if err != nil { + continue + } + // 只处理在范围内的IMSI + if itemIMSI >= startIMSI && itemIMSI < endIMSI { + uarr = append(uarr, model.UDMUserInfo{ + NeId: v.NeId, + IMSI: v.IMSI, + MSISDN: v.MSISDN, + Remark: remark, + }) + r.udmUserInfoRepository.Delete(neId, v.IMSI) + } } - r.udmUserInfoRepository.Delete(keyIMSI, neId) r.udmUserInfoRepository.Inserts(uarr) } + r.udmSubRepository.Inserts(arr) } } diff --git a/src/modules/network_data/service/udm_voip.go b/src/modules/network_data/service/udm_voip.go index 679bb7cf..ef39ffb2 100644 --- a/src/modules/network_data/service/udm_voip.go +++ b/src/modules/network_data/service/udm_voip.go @@ -2,7 +2,6 @@ package service import ( "fmt" - "strconv" "strings" "time" @@ -170,18 +169,13 @@ func (r UDMVOIPUser) Delete(username, neId string) int64 { // LoadData 重新加载从username开始num的数据 func (r UDMVOIPUser) LoadData(neId, username, num string) { - startUserName, _ := strconv.ParseInt(username, 10, 64) - subNum, _ := strconv.ParseInt(num, 10, 64) - var i int64 - for i = 0; i < subNum; i++ { - keyUserName := fmt.Sprintf("%d", startUserName+i) - // 删除原数据 - r.udmVOIPRepository.Delete(keyUserName, neId) - // 加载数据 - arr := r.dataByRedis(keyUserName, neId) - if len(arr) < 1 { - continue - } + // 直接删除前缀的记录 + index := len(username) - len(num) - 1 + prefix := username[:index] + r.udmVOIPRepository.DeletePrefixByUserName(neId, prefix) + // 加载数据 + arr := r.dataByRedis(neId, prefix+"*") + if len(arr) > 0 { r.udmVOIPRepository.Inserts(arr) } } diff --git a/src/modules/network_data/service/udm_volte_ims.go b/src/modules/network_data/service/udm_volte_ims.go index e0aa7060..1ab31184 100644 --- a/src/modules/network_data/service/udm_volte_ims.go +++ b/src/modules/network_data/service/udm_volte_ims.go @@ -2,7 +2,6 @@ package service import ( "fmt" - "strconv" "strings" "time" @@ -192,21 +191,13 @@ func (r UDMVolteIMSUser) Delete(imsi, neId string) int64 { // LoadData 重新加载从imsi开始num的数据 func (r UDMVolteIMSUser) LoadData(neId, imsiOrMsisdn, num string) { - startIMSIOrMsisdn, _ := strconv.ParseInt(imsiOrMsisdn, 10, 64) - subNum, _ := strconv.ParseInt(num, 10, 64) - var i int64 - for i = 0; i < subNum; i++ { - keyIMSI := fmt.Sprintf("%015d", startIMSIOrMsisdn+i) - if !strings.HasPrefix(imsiOrMsisdn, "0") { - keyIMSI = fmt.Sprintf("%d", startIMSIOrMsisdn+i) - } - // 删除原数据 - r.udmVolteIMSRepository.Delete(keyIMSI, neId) - // 加载数据 - arr := r.dataByRedis(keyIMSI+":*", neId) - if len(arr) < 1 { - continue - } + // 直接删除前缀的记录 + index := len(imsiOrMsisdn) - len(num) - 1 + prefix := imsiOrMsisdn[:index] + r.udmVolteIMSRepository.DeletePrefixByIMSI(neId, prefix) + // 加载数据 + arr := r.dataByRedis(neId, prefix+"*") + if len(arr) > 0 { r.udmVolteIMSRepository.Inserts(arr) } }