Files
be.ems/src/modules/network_element/service/udm_sub.impl.go
2023-12-22 12:23:08 +08:00

196 lines
4.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package service
import (
"fmt"
"strings"
"ems.agt/src/framework/redis"
"ems.agt/src/modules/network_element/model"
"ems.agt/src/modules/network_element/repository"
)
// 实例化服务层 UDMSubImpl 结构体
var NewUDMSubImpl = &UDMSubImpl{
udmSubRepository: repository.NewUDMSubImpl,
}
// UDM签约信息 服务层处理
type UDMSubImpl struct {
// UDM签约信息数据信息
udmSubRepository repository.IUDMSub
}
// subDataByRedis UDM签约用户
func (r *UDMSubImpl) subDataByRedis(imsi, neID string) []model.UDMSub {
arr := []model.UDMSub{}
key := fmt.Sprintf("udm-sd:%s", imsi)
udmsdArr, err := redis.GetKeys("udmuser", key)
if err != nil {
return arr
}
for _, key := range udmsdArr {
m, err := redis.GetHash("udmuser", key)
if err != nil {
continue
}
a := model.UDMSub{
Imsi: key[7:],
Msisdn: m["gpsi"], // 46003550072 strings.TrimPrefix(m["gpsi"], "86"),
SmfSel: m["smf-sel"],
SmData: m["sm-dat"], // 1-000001&cmnet&ims&3gnet
NeID: neID,
}
// def_ambr,def_nssai,0,def_arfb,def_sar,3,1,12000,1,1000,0,1,-
if v, ok := m["am-dat"]; ok {
arr := strings.Split(v, ",")
a.Ambr = arr[0]
a.Nssai = arr[1]
a.Rat = arr[2]
a.Arfb = arr[3]
a.Sar = arr[4]
a.Cn = arr[5]
}
// 1,64,24,65,def_eps,1,2,010200000000,-
if v, ok := m["eps-dat"]; ok {
arr := strings.Split(v, ",")
// 跳过非常规数据
if len(arr) > 9 {
continue
}
a.EpsDat = v
a.EpsFlag = arr[0]
a.EpsOdb = arr[1]
a.HplmnOdb = arr[2]
a.Ard = arr[3]
a.Epstpl = arr[4]
a.ContextId = arr[5]
a.ApnContext = arr[7]
// [6] 是不要的,导入和导出不用
a.StaticIp = arr[8]
}
arr = append(arr, a)
}
return arr
}
// Save UDM签约用户-获取redis全部保存数据库
func (r *UDMSubImpl) Save(neID string) int64 {
subArr := r.subDataByRedis("*", neID)
// 数据清空后添加
go r.udmSubRepository.ClearAndInsert(neID, subArr)
return int64(len(subArr))
}
// Page UDM签约用户-分页查询数据库
func (r *UDMSubImpl) Page(query map[string]any) map[string]any {
return r.udmSubRepository.SelectPage(query)
}
// List UDM签约用户-查询数据库
func (r *UDMSubImpl) List(subUser model.UDMSub) []model.UDMSub {
return r.udmSubRepository.SelectList(subUser)
}
// Insert UDM签约用户-新增单个
// imsi长度15ki长度32opc长度0或者32
func (r *UDMSubImpl) Insert(neID string, subUser model.UDMSub) int64 {
authArr := r.subDataByRedis(subUser.Imsi, neID)
if len(authArr) > 0 {
r.udmSubRepository.Delete(neID, subUser.Imsi)
r.udmSubRepository.Inserts(authArr)
}
return 0
}
// Insert UDM签约用户-批量添加
func (r *UDMSubImpl) Inserts(neID string, subUser model.UDMSub, num string) int64 {
startIMSI := subUser.Imsi
startIMSI = startIMSI[:len(startIMSI)-len(num)] + "*"
// keys udm-sd:4600001000004*
subArr := r.subDataByRedis(startIMSI, neID)
if len(subArr) > 0 {
for _, v := range subArr {
r.udmSubRepository.Delete(neID, v.Imsi)
}
return r.udmSubRepository.Inserts(subArr)
}
return 0
}
// InsertCSV UDM签约用户-批量添加
func (r *UDMSubImpl) InsertCSV(neID string, data []map[string]string) int64 {
prefixes := make(map[string]struct{})
for _, v := range data {
imsi := v["imsi"]
if len(imsi) < 5 {
continue
}
prefix := imsi[:len(imsi)-4]
prefixes[prefix] = struct{}{}
}
// 分组插入
var num int64 = 0
for prefix := range prefixes {
r.udmSubRepository.DeletePrefixImsi(neID, prefix)
subArr := r.subDataByRedis(prefix+"*", neID)
if len(subArr) > 0 {
num += r.udmSubRepository.Inserts(subArr)
}
}
return num
}
// InsertTxt UDM签约用户-批量添加
func (r *UDMSubImpl) InsertTxt(neID string, data [][]string) int64 {
prefixes := make(map[string]struct{})
for _, v := range data {
imsi := v[0]
if len(imsi) < 5 {
continue
}
prefix := imsi[:len(imsi)-4]
prefixes[prefix] = struct{}{}
}
// 分组插入
var num int64 = 0
for prefix := range prefixes {
r.udmSubRepository.DeletePrefixImsi(neID, prefix)
subArr := r.subDataByRedis(prefix+"*", neID)
if len(subArr) > 0 {
num += r.udmSubRepository.Inserts(subArr)
}
}
return num
}
// Insert UDM签约用户-修改更新
func (r *UDMSubImpl) Update(neID string, subUser model.UDMSub) int64 {
authArr := r.subDataByRedis(subUser.Imsi, neID)
if len(authArr) > 0 {
r.udmSubRepository.Delete(neID, subUser.Imsi)
return r.udmSubRepository.Inserts(authArr)
}
return 0
}
// Insert UDM签约用户-删除单个
func (r *UDMSubImpl) Delete(neID, imsi string) int64 {
return r.udmSubRepository.Delete(neID, imsi)
}
// Insert UDM签约用户-删除范围
func (r *UDMSubImpl) Deletes(neID, imsi, num string) int64 {
prefix := imsi[:len(imsi)-len(num)-1]
// 直接删除前缀的记录
r.udmSubRepository.DeletePrefixImsi(neID, prefix)
// keys udm-sd:4600001000004*
authArr := r.subDataByRedis(prefix+"*", neID)
if len(authArr) > 0 {
return r.udmSubRepository.Inserts(authArr)
}
return 0
}