ref: 网元数据将网元特有拆分直连模块

This commit is contained in:
TsMask
2025-06-11 16:32:50 +08:00
parent 1f3e07d5c7
commit f9648d1b26
56 changed files with 570 additions and 619 deletions

View File

@@ -0,0 +1,175 @@
package service
import (
"fmt"
"strconv"
"strings"
"be.ems/src/framework/database/redis"
neService "be.ems/src/modules/network_element/service"
"be.ems/src/modules/network_link/model"
"be.ems/src/modules/network_link/repository"
)
// 实例化服务层 UDMVOIPUser 结构体
var NewUDMVOIPUser = &UDMVOIPUser{
udmVOIPRepository: repository.NewUDMVOIPUser,
}
// UDMVOIP信息 服务层处理
type UDMVOIPUser struct {
// UDMVOIP信息数据信息
udmVOIPRepository *repository.UDMVOIPUser
}
// dataByRedis UDMVOIP用户 db:0 中 voip:*
func (r UDMVOIPUser) dataByRedis(coreUid, neUid, username string) []model.UDMVOIPUser {
arr := []model.UDMVOIPUser{}
key := fmt.Sprintf("voip:%s", username)
source := fmt.Sprintf("UDM_%s", neUid)
// 网元主机的Redis客户端
redisClient, err := neService.NewNeInfo.NeRunRedisClient(coreUid, neUid)
if err != nil {
return arr
}
defer func() {
redisClient.Close()
redis.ConnectPush(source, nil)
}()
redis.ConnectPush(source, redisClient.Client)
voipArr, err := redis.GetKeys(source, key)
if err != nil {
return arr
}
mkv, err := redis.GetHashBatch(source, voipArr)
if err != nil {
return arr
}
for k, m := range mkv {
// 跳过-号数据 voip:360000100000130
username, hasPrefix := strings.CutPrefix(k, "voip:")
if strings.Contains(username, "-") || !hasPrefix {
continue
}
a := model.UDMVOIPUser{
CoreUID: coreUid,
NeUID: neUid,
NeType: "UDM",
UserName: username,
Password: m["password"],
}
arr = append(arr, a)
}
return arr
}
// ResetData 重置VOIP用户数据清空数据库重新同步Redis数据
func (r UDMVOIPUser) ResetData(coreUid, neUid string) int64 {
arr := r.dataByRedis(coreUid, neUid, "*")
// 数据清空后添加
go r.udmVOIPRepository.ClearAndInsert(coreUid, neUid, arr)
return int64(len(arr))
}
// ParseInfo 解析单个用户userName信息 data从命令MML得到的结果
func (r UDMVOIPUser) ParseInfo(coreUid, neUid string, data map[string]string) model.UDMVOIPUser {
u := model.UDMVOIPUser{
CoreUID: coreUid,
NeUID: neUid,
NeType: "UDM",
UserName: data["username"],
Password: data["password"],
}
// 赋予ID
item := r.udmVOIPRepository.SelectByUserName(coreUid, neUid, u.UserName)
if item.ID != "" {
u.ID = item.ID
}
return u
}
// FindByPage 分页查询数据库
func (r UDMVOIPUser) FindByPage(query map[string]string) (int64, []model.UDMVOIPUser) {
return r.udmVOIPRepository.SelectPage(query)
}
// Find 查询数据库
func (r UDMVOIPUser) Find(u model.UDMVOIPUser) []model.UDMVOIPUser {
return r.udmVOIPRepository.SelectList(u)
}
// Insert 从数据中读取后删除username再存入数据库
func (r UDMVOIPUser) Insert(coreUid, neUid string, username string) int64 {
uArr := r.dataByRedis(coreUid, neUid, username)
if len(uArr) > 0 {
r.udmVOIPRepository.DeleteByUserName(coreUid, neUid, username)
return r.udmVOIPRepository.Inserts(uArr)
}
return 0
}
// InsertData 导入文件数据 dataType目前两种txt/csv
func (r UDMVOIPUser) InsertData(coreUid, neUid, dataType string, data any) int64 {
// imsi截取前缀,重新获取部分数据
prefixes := make(map[string]struct{})
if dataType == "csv" {
for _, v := range data.([]map[string]string) {
username := v["username"]
if len(username) < 4 {
continue
}
prefix := username[:len(username)-3]
prefixes[prefix] = struct{}{}
}
}
if dataType == "txt" {
for _, v := range data.([][]string) {
username := v[0]
if len(username) < 4 {
continue
}
prefix := username[:len(username)-3]
prefixes[prefix] = struct{}{}
}
}
// 根据前缀重新加载插入
var num int64 = 0
for prefix := range prefixes {
// 直接删除前缀的记录
r.udmVOIPRepository.DeletePrefixByUserName(coreUid, neUid, prefix)
// keys voip:4600001000004*
arr := r.dataByRedis(coreUid, neUid, prefix+"*")
if len(arr) > 0 {
num += r.udmVOIPRepository.Inserts(arr)
}
}
return num
}
// Delete 删除单个不重新加载
func (r UDMVOIPUser) Delete(coreUid, neUid, username string) int64 {
return r.udmVOIPRepository.DeleteByUserName(coreUid, neUid, username)
}
// LoadData 重新加载从username开始num的数据
func (r UDMVOIPUser) LoadData(coreUid, neUid, username string, num int64) {
startUserName, _ := strconv.ParseInt(username, 10, 64)
var i int64
for i = 0; i < num; i++ {
keyUserName := fmt.Sprintf("%d", startUserName+i)
// 删除原数据
r.udmVOIPRepository.DeleteByUserName(coreUid, neUid, keyUserName)
// 加载数据
arr := r.dataByRedis(coreUid, neUid, keyUserName)
if len(arr) < 1 {
continue
}
r.udmVOIPRepository.Inserts(arr)
}
}