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长度15,ki长度32,opc长度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 }