fix: UDM批量操作加载数据根据前缀重载
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -62,7 +62,7 @@ type IMSUser struct {
|
||||
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
|
||||
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"`
|
||||
|
||||
@@ -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,11 +71,11 @@ 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
|
||||
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))
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
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,
|
||||
NeId: v.NeId,
|
||||
Remark: remark,
|
||||
})
|
||||
r.udmUserInfoRepository.Delete(neId, v.IMSI)
|
||||
}
|
||||
}
|
||||
r.udmUserInfoRepository.Delete(keyIMSI, neId)
|
||||
r.udmUserInfoRepository.Inserts(uarr)
|
||||
}
|
||||
r.udmSubRepository.Inserts(arr)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
// 直接删除前缀的记录
|
||||
index := len(username) - len(num) - 1
|
||||
prefix := username[:index]
|
||||
r.udmVOIPRepository.DeletePrefixByUserName(neId, prefix)
|
||||
// 加载数据
|
||||
arr := r.dataByRedis(keyUserName, neId)
|
||||
if len(arr) < 1 {
|
||||
continue
|
||||
}
|
||||
arr := r.dataByRedis(neId, prefix+"*")
|
||||
if len(arr) > 0 {
|
||||
r.udmVOIPRepository.Inserts(arr)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
// 直接删除前缀的记录
|
||||
index := len(imsiOrMsisdn) - len(num) - 1
|
||||
prefix := imsiOrMsisdn[:index]
|
||||
r.udmVolteIMSRepository.DeletePrefixByIMSI(neId, prefix)
|
||||
// 加载数据
|
||||
arr := r.dataByRedis(keyIMSI+":*", neId)
|
||||
if len(arr) < 1 {
|
||||
continue
|
||||
}
|
||||
arr := r.dataByRedis(neId, prefix+"*")
|
||||
if len(arr) > 0 {
|
||||
r.udmVolteIMSRepository.Inserts(arr)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user