fix: UDM批量操作加载数据根据前缀重载

This commit is contained in:
TsMask
2025-10-11 09:49:49 +08:00
parent 4da212739e
commit 13b2ce3e64
10 changed files with 109 additions and 134 deletions

View File

@@ -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 {

View File

@@ -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:"-"`

View File

@@ -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长度15ki长度32opc长度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))

View File

@@ -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)
}
}

View File

@@ -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)
}
}