From bafd3b7c9f989679bfe86aad021336f841b488fa Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 27 Dec 2024 18:23:13 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20IMS/SMSC=E5=AF=BC=E5=87=BA=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=8A=BD=E7=A6=BB=E5=88=B0service=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_data/controller/ims.go | 103 +---------------- src/modules/network_data/controller/smsc.go | 94 +--------------- .../network_data/service/cdr_event_ims.go | 105 ++++++++++++++++++ .../network_data/service/cdr_event_smsc.go | 96 ++++++++++++++++ 4 files changed, 207 insertions(+), 191 deletions(-) diff --git a/src/modules/network_data/controller/ims.go b/src/modules/network_data/controller/ims.go index 207ba191..3b4aaa9f 100644 --- a/src/modules/network_data/controller/ims.go +++ b/src/modules/network_data/controller/ims.go @@ -1,26 +1,20 @@ package controller import ( - "encoding/json" "fmt" - "strconv" "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/logger" "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" - sysService "be.ems/src/modules/system/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 IMSController 结构体 @@ -94,7 +88,7 @@ func (s *IMSController) CDRExport(c *gin.Context) { language := ctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 var querys model.CDREventIMSQuery - if err := c.ShouldBindBodyWith(&querys, binding.JSON); err != nil { + if err := c.ShouldBindBodyWithJSON(&querys); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -118,99 +112,8 @@ func (s *IMSController) CDRExport(c *gin.Context) { // 导出文件名称 fileName := fmt.Sprintf("ims_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) - // 第一行表头标题 - headerCells := map[string]string{ - "A1": "ID", - "B1": "Record Behavior", - "C1": "Type", - "D1": "Caller", - "E1": "Called", - "F1": "Duration", - "G1": "Result", - "H1": "Time", - } - // 读取字典数据 CDR SIP响应代码类别类型 - dictCDRSipCode := sysService.NewSysDictData.SelectDictDataByType("cdr_sip_code") - // 读取字典数据 CDR 呼叫类型 - dictCDRCallType := sysService.NewSysDictData.SelectDictDataByType("cdr_call_type") - // 从第二行开始的数据 - dataCells := make([]map[string]any, 0) - for i, row := range rows { - idx := strconv.Itoa(i + 2) - // 解析 JSON 字符串为 map - var cdrJSON map[string]interface{} - err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON) - if err != nil { - logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) - continue - } - // 记录类型 - recordType := "" - if v, ok := cdrJSON["recordType"]; ok && v != nil { - recordType = v.(string) - } - // 呼叫类型 - callType := "sms" - callTypeLable := "SMS" - if v, ok := cdrJSON["callType"]; ok && v != nil { - callType = v.(string) - for _, v := range dictCDRCallType { - if callType == v.DictValue { - callTypeLable = i18n.TKey(language, v.DictLabel) - break - } - } - } - // 被叫 - called := "" - if v, ok := cdrJSON["calledParty"]; ok && v != nil { - called = v.(string) - } - // 主叫 - caller := "" - if v, ok := cdrJSON["callerParty"]; ok && v != nil { - caller = v.(string) - } - // 时长 - duration := "-" - if v, ok := cdrJSON["callDuration"]; ok && v != nil && callType != "sms" { - duration = fmt.Sprint(parse.Number(v)) - } - // 呼叫结果 非短信都有code作为结果 sms短信都ok - callResult := "Success" - if v, ok := cdrJSON["cause"]; ok && v != nil && callType != "sms" { - cause := fmt.Sprint(v) - for _, v := range dictCDRSipCode { - if cause == v.DictValue { - callResult = i18n.TKey(language, v.DictLabel) - break - } - } - } - // 取时间 - timeStr := "" - if v, ok := cdrJSON["releaseTime"]; ok && v != nil { - if releaseTime := parse.Number(v); releaseTime > 0 { - timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) - } else { - timeStr = v.(string) - } - } - - dataCells = append(dataCells, map[string]any{ - "A" + idx: row.ID, - "B" + idx: recordType, - "C" + idx: callTypeLable, - "D" + idx: caller, - "E" + idx: called, - "F" + idx: duration, - "G" + idx: callResult, - "H" + idx: timeStr, - }) - } - // 导出数据表格 - saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") + saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName, language) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return diff --git a/src/modules/network_data/controller/smsc.go b/src/modules/network_data/controller/smsc.go index 11ef32ec..929b0b9c 100644 --- a/src/modules/network_data/controller/smsc.go +++ b/src/modules/network_data/controller/smsc.go @@ -1,25 +1,19 @@ package controller import ( - "encoding/json" "fmt" - "strconv" "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/logger" "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neService "be.ems/src/modules/network_element/service" - sysService "be.ems/src/modules/system/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 SMSCController 结构体 @@ -93,7 +87,7 @@ func (s *SMSCController) CDRExport(c *gin.Context) { language := ctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 var querys model.CDREventSMSCQuery - if err := c.ShouldBindBodyWith(&querys, binding.JSON); err != nil { + if err := c.ShouldBindBodyWithJSON(&querys); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -117,90 +111,8 @@ func (s *SMSCController) CDRExport(c *gin.Context) { // 导出文件名称 fileName := fmt.Sprintf("smsc_cdr_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) - // 第一行表头标题 - headerCells := map[string]string{ - "A1": "ID", - "B1": "Record Behavior", - "C1": "Service Type", - "D1": "Caller", - "E1": "Called", - "F1": "Result", - "G1": "Time", - } - // 读取字典数据 CDR 原因码 - dictCDRCauseCode := sysService.NewSysDictData.SelectDictDataByType("cdr_cause_code") - // 从第二行开始的数据 - dataCells := make([]map[string]any, 0) - for i, row := range rows { - idx := strconv.Itoa(i + 2) - // 解析 JSON 字符串为 map - var cdrJSON map[string]interface{} - err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON) - if err != nil { - logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) - continue - } - // 记录类型 - recordType := "" - if v, ok := cdrJSON["recordType"]; ok && v != nil { - recordType = v.(string) - } - // 服务类型 - serviceType := "" - if v, ok := cdrJSON["serviceType"]; ok && v != nil { - serviceType = v.(string) - } - // 被叫 - called := "" - if v, ok := cdrJSON["calledParty"]; ok && v != nil { - called = v.(string) - } - // 主叫 - caller := "" - if v, ok := cdrJSON["callerParty"]; ok && v != nil { - caller = v.(string) - } - // 呼叫结果 0失败,1成功 - callResult := "Fail" - if v, ok := cdrJSON["result"]; ok && v != nil { - resultVal := parse.Number(v) - if resultVal == 1 { - callResult = "Success" - } - } - // 结果原因 - if v, ok := cdrJSON["cause"]; ok && v != nil && callResult == "Fail" { - cause := fmt.Sprint(v) - for _, v := range dictCDRCauseCode { - if cause == v.DictValue { - callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DictLabel)) - break - } - } - } - // 取时间 - timeStr := "" - if v, ok := cdrJSON["updateTime"]; ok && v != nil { - if releaseTime := parse.Number(v); releaseTime > 0 { - timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) - } else { - timeStr = v.(string) - } - } - - dataCells = append(dataCells, map[string]any{ - "A" + idx: row.ID, - "B" + idx: recordType, - "C" + idx: serviceType, - "D" + idx: caller, - "E" + idx: called, - "F" + idx: callResult, - "G" + idx: timeStr, - }) - } - // 导出数据表格 - saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") + saveFilePath, err := s.cdrEventService.ExportXlsx(rows, fileName, language) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return diff --git a/src/modules/network_data/service/cdr_event_ims.go b/src/modules/network_data/service/cdr_event_ims.go index 4ce3c3a0..1291c814 100644 --- a/src/modules/network_data/service/cdr_event_ims.go +++ b/src/modules/network_data/service/cdr_event_ims.go @@ -1,10 +1,18 @@ package service import ( + "encoding/json" "fmt" + "strconv" + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" + sysService "be.ems/src/modules/system/service" ) // 实例化数据层 CDREventIMS 结构体 @@ -37,3 +45,100 @@ func (r *CDREventIMS) DeleteByIds(cdrIds []string) (int64, error) { // 删除信息失败! return 0, fmt.Errorf("delete fail") } + +// ExportXlsx 导出数据到 xlsx 文件 +func (r CDREventIMS) ExportXlsx(rows []model.CDREventIMS, fileName, language string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "ID", + "B1": "Record Behavior", + "C1": "Type", + "D1": "Caller", + "E1": "Called", + "F1": "Duration", + "G1": "Result", + "H1": "Time", + } + // 读取字典数据 CDR SIP响应代码类别类型 + dictCDRSipCode := sysService.NewSysDictData.SelectDictDataByType("cdr_sip_code") + // 读取字典数据 CDR 呼叫类型 + dictCDRCallType := sysService.NewSysDictData.SelectDictDataByType("cdr_call_type") + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 解析 JSON 字符串为 map + var cdrJSON map[string]interface{} + err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON) + if err != nil { + logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) + continue + } + // 记录类型 + recordType := "" + if v, ok := cdrJSON["recordType"]; ok && v != nil { + recordType = v.(string) + } + // 呼叫类型 + callType := "sms" + callTypeLable := "SMS" + if v, ok := cdrJSON["callType"]; ok && v != nil { + callType = v.(string) + for _, v := range dictCDRCallType { + if callType == v.DictValue { + callTypeLable = i18n.TKey(language, v.DictLabel) + break + } + } + } + // 被叫 + called := "" + if v, ok := cdrJSON["calledParty"]; ok && v != nil { + called = v.(string) + } + // 主叫 + caller := "" + if v, ok := cdrJSON["callerParty"]; ok && v != nil { + caller = v.(string) + } + // 时长 + duration := "-" + if v, ok := cdrJSON["callDuration"]; ok && v != nil && callType != "sms" { + duration = fmt.Sprint(parse.Number(v)) + } + // 呼叫结果 非短信都有code作为结果 sms短信都ok + callResult := "Success" + if v, ok := cdrJSON["cause"]; ok && v != nil && callType != "sms" { + cause := fmt.Sprint(v) + for _, v := range dictCDRSipCode { + if cause == v.DictValue { + callResult = i18n.TKey(language, v.DictLabel) + break + } + } + } + // 取时间 + timeStr := "" + if v, ok := cdrJSON["releaseTime"]; ok && v != nil { + if releaseTime := parse.Number(v); releaseTime > 0 { + timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) + } else { + timeStr = v.(string) + } + } + + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: recordType, + "C" + idx: callTypeLable, + "D" + idx: caller, + "E" + idx: called, + "F" + idx: duration, + "G" + idx: callResult, + "H" + idx: timeStr, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") +} diff --git a/src/modules/network_data/service/cdr_event_smsc.go b/src/modules/network_data/service/cdr_event_smsc.go index 27173df3..04b6837d 100644 --- a/src/modules/network_data/service/cdr_event_smsc.go +++ b/src/modules/network_data/service/cdr_event_smsc.go @@ -1,10 +1,18 @@ package service import ( + "encoding/json" "fmt" + "strconv" + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" + sysService "be.ems/src/modules/system/service" ) // 实例化数据层 CDREventSMSC 结构体 @@ -37,3 +45,91 @@ func (r *CDREventSMSC) DeleteByIds(cdrIds []string) (int64, error) { // 删除信息失败! return 0, fmt.Errorf("delete fail") } + +// ExportXlsx 导出数据到 xlsx 文件 +func (r CDREventSMSC) ExportXlsx(rows []model.CDREventSMSC, fileName, language string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "ID", + "B1": "Record Behavior", + "C1": "Service Type", + "D1": "Caller", + "E1": "Called", + "F1": "Result", + "G1": "Time", + } + // 读取字典数据 CDR 原因码 + dictCDRCauseCode := sysService.NewSysDictData.SelectDictDataByType("cdr_cause_code") + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 解析 JSON 字符串为 map + var cdrJSON map[string]interface{} + err := json.Unmarshal([]byte(row.CDRJSONStr), &cdrJSON) + if err != nil { + logger.Warnf("CDRExport Error parsing JSON: %s", err.Error()) + continue + } + // 记录类型 + recordType := "" + if v, ok := cdrJSON["recordType"]; ok && v != nil { + recordType = v.(string) + } + // 服务类型 + serviceType := "" + if v, ok := cdrJSON["serviceType"]; ok && v != nil { + serviceType = v.(string) + } + // 被叫 + called := "" + if v, ok := cdrJSON["calledParty"]; ok && v != nil { + called = v.(string) + } + // 主叫 + caller := "" + if v, ok := cdrJSON["callerParty"]; ok && v != nil { + caller = v.(string) + } + // 呼叫结果 0失败,1成功 + callResult := "Fail" + if v, ok := cdrJSON["result"]; ok && v != nil { + resultVal := parse.Number(v) + if resultVal == 1 { + callResult = "Success" + } + } + // 结果原因 + if v, ok := cdrJSON["cause"]; ok && v != nil && callResult == "Fail" { + cause := fmt.Sprint(v) + for _, v := range dictCDRCauseCode { + if cause == v.DictValue { + callResult = fmt.Sprintf("%s, %s", callResult, i18n.TKey(language, v.DictLabel)) + break + } + } + } + // 取时间 + timeStr := "" + if v, ok := cdrJSON["updateTime"]; ok && v != nil { + if releaseTime := parse.Number(v); releaseTime > 0 { + timeStr = date.ParseDateToStr(releaseTime, date.YYYY_MM_DDTHH_MM_SSZ) + } else { + timeStr = v.(string) + } + } + + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: recordType, + "C" + idx: serviceType, + "D" + idx: caller, + "E" + idx: called, + "F" + idx: callResult, + "G" + idx: timeStr, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") +} From 1cfbfa2d1b9e3ed7f1e54738ce7579defd58327d Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 27 Dec 2024 18:25:35 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20UE=E4=BA=8B=E4=BB=B6AMF/MME?= =?UTF-8?q?=E5=8C=BA=E5=88=86=E7=BD=91=E5=85=83=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_data/controller/amf.go | 151 ++++++------------ src/modules/network_data/controller/mme.go | 107 ++----------- .../network_data/service/ue_event_amf.go | 102 +++++++++++- .../network_data/service/ue_event_mme.go | 91 +++++++++++ src/modules/ws/processor/ue_connect.go | 15 ++ src/modules/ws/service/ws_send.go | 4 +- 6 files changed, 272 insertions(+), 198 deletions(-) diff --git a/src/modules/network_data/controller/amf.go b/src/modules/network_data/controller/amf.go index 98ea42c9..cdbe1434 100644 --- a/src/modules/network_data/controller/amf.go +++ b/src/modules/network_data/controller/amf.go @@ -1,25 +1,20 @@ package controller import ( - "encoding/json" "fmt" - "strconv" "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/logger" "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" - sysService "be.ems/src/modules/system/service" + "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" ) // 实例化控制层 AMFController 结构体 @@ -48,12 +43,12 @@ func (s *AMFController) UEList(c *gin.Context) { } // 查询网元获取IP - // neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) - // if neInfo.NeId != querys.NeID || neInfo.IP == "" { - // c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) - // return - // } - // querys.RmUID = neInfo.RmUID + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("AMF", querys.NeID) + if neInfo.NeId != querys.NeID || neInfo.IP == "" { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + querys.RmUID = neInfo.RmUID // 查询数据 rows, total := s.ueEventService.SelectPage(querys) @@ -93,7 +88,7 @@ func (s *AMFController) UEExport(c *gin.Context) { language := ctx.AcceptLanguage(c) // 查询结果,根据查询条件结果,单页最大值限制 var querys model.UEEventAMFQuery - if err := c.ShouldBindBodyWith(&querys, binding.JSON); err != nil { + if err := c.ShouldBindBodyWithJSON(&querys); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -101,6 +96,13 @@ func (s *AMFController) UEExport(c *gin.Context) { if querys.PageSize > 10000 { querys.PageSize = 10000 } + // 查询网元获取IP + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("AMF", querys.NeID) + if neInfo.NeId != querys.NeID || neInfo.IP == "" { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + querys.RmUID = neInfo.RmUID rows, total := s.ueEventService.SelectPage(querys) if total == 0 { // 导出数据记录为空 @@ -110,95 +112,8 @@ func (s *AMFController) UEExport(c *gin.Context) { // 导出文件名称 fileName := fmt.Sprintf("amf_ue_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) - // 第一行表头标题 - headerCells := map[string]string{ - "A1": "ID", - "B1": "IMSI", - "C1": "Event Type", - "D1": "Result", - "E1": "Time", - } - // 读取字典数据 UE 事件类型 - dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type") - // 读取字典数据 UE 事件认证代码类型 - dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code") - // 读取字典数据 UE 事件CM状态 - dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state") - // 从第二行开始的数据 - dataCells := make([]map[string]any, 0) - for i, row := range rows { - idx := strconv.Itoa(i + 2) - // 解析 JSON 字符串为 map - var eventJSON map[string]interface{} - err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON) - if err != nil { - logger.Warnf("UEExport Error parsing JSON: %s", err.Error()) - continue - } - - // 取IMSI - imsi := "" - if v, ok := eventJSON["imsi"]; ok && v != nil { - imsi = v.(string) - } - // 取类型 - eventType := "" - for _, v := range dictUEEventType { - if row.EventType == v.DictValue { - eventType = i18n.TKey(language, v.DictLabel) - break - } - } - // 取结果 - eventResult := "" - // 取时间 - timeStr := "" - if row.EventType == "auth-result" { - if v, ok := eventJSON["authTime"]; ok && v != nil { - timeStr = v.(string) - } - if v, ok := eventJSON["authCode"]; ok && v != nil { - eventResult = v.(string) - for _, v := range dictUEAauthCode { - if eventResult == v.DictValue { - eventResult = i18n.TKey(language, v.DictLabel) - break - } - } - } - } - if row.EventType == "detach" { - if v, ok := eventJSON["detachTime"]; ok && v != nil { - timeStr = v.(string) - } - eventResult = "Success" - } - if row.EventType == "cm-state" { - if v, ok := eventJSON["changeTime"]; ok && v != nil { - timeStr = v.(string) - } - if v, ok := eventJSON["status"]; ok && v != nil { - eventResult = fmt.Sprint(v) - for _, v := range dictUEEventCmState { - if eventResult == v.DictValue { - eventResult = i18n.TKey(language, v.DictLabel) - break - } - } - } - } - - dataCells = append(dataCells, map[string]any{ - "A" + idx: row.ID, - "B" + idx: imsi, - "C" + idx: eventType, - "D" + idx: eventResult, - "E" + idx: timeStr, - }) - } - // 导出数据表格 - saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") + saveFilePath, err := s.ueEventService.ExportXlsx(rows, fileName, language) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return @@ -214,7 +129,7 @@ func (s *AMFController) NbInfoList(c *gin.Context) { language := ctx.AcceptLanguage(c) var query struct { NeId string `form:"neId" binding:"required"` - NbId string `form:"nbId"` + NbId string `form:"id"` } if err := c.ShouldBindQuery(&query); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) @@ -230,7 +145,7 @@ func (s *AMFController) NbInfoList(c *gin.Context) { // 网元直连 data, err := neFetchlink.AMFNbInfoList(neInfo, map[string]string{ - "nbId": query.NbId, + "id": query.NbId, }) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) @@ -239,3 +154,33 @@ func (s *AMFController) NbInfoList(c *gin.Context) { c.JSON(200, result.OkData(data)) } + +// 接入基站状态信息列表 +// +// GET /nb/list-cfg +func (s *AMFController) NbStateList(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var query struct { + NeId string `form:"neId" binding:"required"` + } + if err := c.ShouldBindQuery(&query); err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + // 查询网元信息 + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("AMF", query.NeId) + if neInfo.NeId != query.NeId || neInfo.IP == "" { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + + // 网元直连 + data, err := neFetchlink.AMFGnbStateList(neInfo) + if err != nil { + c.JSON(200, result.ErrMsg(err.Error())) + return + } + + c.JSON(200, result.OkData(data)) +} diff --git a/src/modules/network_data/controller/mme.go b/src/modules/network_data/controller/mme.go index 6143dd6e..a6f49339 100644 --- a/src/modules/network_data/controller/mme.go +++ b/src/modules/network_data/controller/mme.go @@ -1,24 +1,18 @@ package controller import ( - "encoding/json" "fmt" - "strconv" "strings" "time" "be.ems/src/framework/i18n" - "be.ems/src/framework/logger" "be.ems/src/framework/utils/ctx" - "be.ems/src/framework/utils/date" - "be.ems/src/framework/utils/file" "be.ems/src/framework/utils/parse" "be.ems/src/framework/vo/result" "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" neFetchlink "be.ems/src/modules/network_element/fetch_link" neService "be.ems/src/modules/network_element/service" - sysService "be.ems/src/modules/system/service" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) @@ -49,12 +43,12 @@ func (s *MMEController) UEList(c *gin.Context) { } // 查询网元获取IP - // neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID(querys.NeType, querys.NeID) - // if neInfo.NeId != querys.NeID || neInfo.IP == "" { - // c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) - // return - // } - // querys.RmUID = neInfo.RmUID + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("MME", querys.NeID) + if neInfo.NeId != querys.NeID || neInfo.IP == "" { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + querys.RmUID = neInfo.RmUID // 查询数据 rows, total := s.ueEventService.SelectPage(querys) @@ -102,6 +96,13 @@ func (s *MMEController) UEExport(c *gin.Context) { if querys.PageSize > 10000 { querys.PageSize = 10000 } + // 查询网元获取IP + neInfo := s.neInfoService.SelectNeInfoByNeTypeAndNeID("MME", querys.NeID) + if neInfo.NeId != querys.NeID || neInfo.IP == "" { + c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.noNEInfo"))) + return + } + querys.RmUID = neInfo.RmUID rows, total := s.ueEventService.SelectPage(querys) if total == 0 { // 导出数据记录为空 @@ -111,84 +112,8 @@ func (s *MMEController) UEExport(c *gin.Context) { // 导出文件名称 fileName := fmt.Sprintf("mme_ue_event_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli()) - // 第一行表头标题 - headerCells := map[string]string{ - "A1": "ID", - "B1": "IMSI", - "C1": "Event Type", - "D1": "Result", - "E1": "Time", - } - // 读取字典数据 UE 事件类型 - dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type") - // 读取字典数据 UE 事件认证代码类型 - dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code") - // 读取字典数据 UE 事件CM状态 - dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state") - // 从第二行开始的数据 - dataCells := make([]map[string]any, 0) - for i, row := range rows { - idx := strconv.Itoa(i + 2) - // 解析 JSON 字符串为 map - var eventJSON map[string]interface{} - err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON) - if err != nil { - logger.Warnf("UEExport Error parsing JSON: %s", err.Error()) - continue - } - - // 取IMSI - imsi := "" - if v, ok := eventJSON["imsi"]; ok && v != nil { - imsi = v.(string) - } - // 取类型 - eventType := row.EventType - for _, v := range dictUEEventType { - if row.EventType == v.DictValue { - eventType = i18n.TKey(language, v.DictLabel) - break - } - } - // 取结果 - eventResult := "" - if v, ok := eventJSON["result"]; ok && v != nil { - eventResult = v.(string) - if row.EventType == "auth-result" { - for _, v := range dictUEAauthCode { - if eventResult == v.DictValue { - eventResult = i18n.TKey(language, v.DictLabel) - break - } - } - } - if row.EventType == "cm-state" { - for _, v := range dictUEEventCmState { - if eventResult == v.DictValue { - eventResult = i18n.TKey(language, v.DictLabel) - break - } - } - } - } - // 取时间 - timeStr := "" - if v, ok := eventJSON["timestamp"]; ok && v != nil { - rowTime := parse.Number(v) - timeStr = date.ParseDateToStr(rowTime, date.YYYY_MM_DDTHH_MM_SSZ) - } - - dataCells = append(dataCells, map[string]any{ - "A" + idx: row.ID, - "B" + idx: imsi, - "C" + idx: eventType, - "D" + idx: eventResult, - "E" + idx: timeStr, - }) - } - // 导出数据表格 - saveFilePath, err := file.WriteSheet(headerCells, dataCells, fileName, "") + saveFilePath, err := s.ueEventService.ExportXlsx(rows, fileName, language) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return @@ -204,7 +129,7 @@ func (s *MMEController) NbInfoList(c *gin.Context) { language := ctx.AcceptLanguage(c) var query struct { NeId string `form:"neId" binding:"required"` - NbId string `form:"nbId"` + NbId string `form:"id"` } if err := c.ShouldBindQuery(&query); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) @@ -220,7 +145,7 @@ func (s *MMEController) NbInfoList(c *gin.Context) { // 网元直连 data, err := neFetchlink.MMENbInfoList(neInfo, map[string]string{ - "nbId": query.NbId, + "id": query.NbId, }) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) diff --git a/src/modules/network_data/service/ue_event_amf.go b/src/modules/network_data/service/ue_event_amf.go index 8ba7cc3d..63234e6c 100644 --- a/src/modules/network_data/service/ue_event_amf.go +++ b/src/modules/network_data/service/ue_event_amf.go @@ -1,10 +1,16 @@ package service import ( + "encoding/json" "fmt" + "strconv" + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/file" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" + sysService "be.ems/src/modules/system/service" ) // 实例化数据层 UEEventAMF 结构体 @@ -14,8 +20,7 @@ var NewUEEventAMF = &UEEventAMF{ // UEEventAMF UE会话事件AMF 服务层处理 type UEEventAMF struct { - // UE会话事件数据信息 - ueEventRepository *repository.UEEventAMF + ueEventRepository *repository.UEEventAMF // UE会话事件数据信息 } // SelectPage 根据条件分页查询 @@ -38,3 +43,96 @@ func (r *UEEventAMF) DeleteByIds(ueIds []string) (int64, error) { // 删除信息失败! return 0, fmt.Errorf("delete fail") } + +// ExportXlsx 导出数据到 xlsx 文件 +func (r UEEventAMF) ExportXlsx(rows []model.UEEventAMF, fileName, language string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "ID", + "B1": "IMSI", + "C1": "Event Type", + "D1": "Result", + "E1": "Time", + } + // 读取字典数据 UE 事件类型 + dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type") + // 读取字典数据 UE 事件认证代码类型 + dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code") + // 读取字典数据 UE 事件CM状态 + dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state") + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 解析 JSON 字符串为 map + var eventJSON map[string]interface{} + err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON) + if err != nil { + logger.Warnf("UEExport Error parsing JSON: %s", err.Error()) + continue + } + + // 取IMSI + imsi := "" + if v, ok := eventJSON["imsi"]; ok && v != nil { + imsi = v.(string) + } + // 取类型 + eventType := "" + for _, v := range dictUEEventType { + if row.EventType == v.DictValue { + eventType = i18n.TKey(language, v.DictLabel) + break + } + } + // 取结果 + eventResult := "" + // 取时间 + timeStr := "" + if row.EventType == "auth-result" { + if v, ok := eventJSON["authTime"]; ok && v != nil { + timeStr = v.(string) + } + if v, ok := eventJSON["authCode"]; ok && v != nil { + eventResult = v.(string) + for _, v := range dictUEAauthCode { + if eventResult == v.DictValue { + eventResult = i18n.TKey(language, v.DictLabel) + break + } + } + } + } + if row.EventType == "detach" { + if v, ok := eventJSON["detachTime"]; ok && v != nil { + timeStr = v.(string) + } + eventResult = "Success" + } + if row.EventType == "cm-state" { + if v, ok := eventJSON["changeTime"]; ok && v != nil { + timeStr = v.(string) + } + if v, ok := eventJSON["status"]; ok && v != nil { + eventResult = fmt.Sprint(v) + for _, v := range dictUEEventCmState { + if eventResult == v.DictValue { + eventResult = i18n.TKey(language, v.DictLabel) + break + } + } + } + } + + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: imsi, + "C" + idx: eventType, + "D" + idx: eventResult, + "E" + idx: timeStr, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") +} diff --git a/src/modules/network_data/service/ue_event_mme.go b/src/modules/network_data/service/ue_event_mme.go index 2768686f..7f35a19b 100644 --- a/src/modules/network_data/service/ue_event_mme.go +++ b/src/modules/network_data/service/ue_event_mme.go @@ -1,10 +1,18 @@ package service import ( + "encoding/json" "fmt" + "strconv" + "be.ems/src/framework/i18n" + "be.ems/src/framework/logger" + "be.ems/src/framework/utils/date" + "be.ems/src/framework/utils/file" + "be.ems/src/framework/utils/parse" "be.ems/src/modules/network_data/model" "be.ems/src/modules/network_data/repository" + sysService "be.ems/src/modules/system/service" ) // 实例化数据层 UEEventMME 结构体 @@ -37,3 +45,86 @@ func (r *UEEventMME) DeleteByIds(ueIds []string) (int64, error) { // 删除信息失败! return 0, fmt.Errorf("delete fail") } + +// ExportXlsx 导出数据到 xlsx 文件 +func (r UEEventMME) ExportXlsx(rows []model.UEEventMME, fileName, language string) (string, error) { + // 第一行表头标题 + headerCells := map[string]string{ + "A1": "ID", + "B1": "IMSI", + "C1": "Event Type", + "D1": "Result", + "E1": "Time", + } + // 读取字典数据 UE 事件类型 + dictUEEventType := sysService.NewSysDictData.SelectDictDataByType("ue_event_type") + // 读取字典数据 UE 事件认证代码类型 + dictUEAauthCode := sysService.NewSysDictData.SelectDictDataByType("ue_auth_code") + // 读取字典数据 UE 事件CM状态 + dictUEEventCmState := sysService.NewSysDictData.SelectDictDataByType("ue_event_cm_state") + // 从第二行开始的数据 + dataCells := make([]map[string]any, 0) + for i, row := range rows { + idx := strconv.Itoa(i + 2) + // 解析 JSON 字符串为 map + var eventJSON map[string]interface{} + err := json.Unmarshal([]byte(row.EventJSONStr), &eventJSON) + if err != nil { + logger.Warnf("UEExport Error parsing JSON: %s", err.Error()) + continue + } + + // 取IMSI + imsi := "" + if v, ok := eventJSON["imsi"]; ok && v != nil { + imsi = v.(string) + } + // 取类型 + eventType := row.EventType + for _, v := range dictUEEventType { + if row.EventType == v.DictValue { + eventType = i18n.TKey(language, v.DictLabel) + break + } + } + // 取结果 + eventResult := "" + if v, ok := eventJSON["result"]; ok && v != nil { + eventResult = v.(string) + if row.EventType == "auth-result" { + for _, v := range dictUEAauthCode { + if eventResult == v.DictValue { + eventResult = i18n.TKey(language, v.DictLabel) + break + } + } + } + if row.EventType == "cm-state" { + for _, v := range dictUEEventCmState { + if eventResult == v.DictValue { + eventResult = i18n.TKey(language, v.DictLabel) + break + } + } + } + } + // 取时间 + timeStr := "" + if v, ok := eventJSON["timestamp"]; ok && v != nil { + rowTime := parse.Number(v) + timeStr = date.ParseDateToStr(rowTime, date.YYYY_MM_DDTHH_MM_SSZ) + } + + dataCells = append(dataCells, map[string]any{ + "A" + idx: row.ID, + "B" + idx: imsi, + "C" + idx: eventType, + "D" + idx: eventResult, + "E" + idx: timeStr, + }) + } + + // 导出数据表格 + return file.WriteSheet(headerCells, dataCells, fileName, "") + +} diff --git a/src/modules/ws/processor/ue_connect.go b/src/modules/ws/processor/ue_connect.go index 7734e41f..b875e8e8 100644 --- a/src/modules/ws/processor/ue_connect.go +++ b/src/modules/ws/processor/ue_connect.go @@ -8,6 +8,7 @@ import ( "be.ems/src/framework/vo/result" neDataModel "be.ems/src/modules/network_data/model" neDataService "be.ems/src/modules/network_data/service" + neService "be.ems/src/modules/network_element/service" ) // GetUEConnectByAMF 获取UE会话事件-AMF @@ -20,6 +21,13 @@ func GetUEConnectByAMF(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query data structure error") } + // 查询网元获取IP + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID("AMF", query.NeID) + if neInfo.NeId != query.NeID || neInfo.IP == "" { + return nil, fmt.Errorf("not fount neId info") + } + query.RmUID = neInfo.RmUID + rows, total := neDataService.NewUEEventAMF.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, @@ -38,6 +46,13 @@ func GetUEConnectByMME(requestID string, data any) ([]byte, error) { return nil, fmt.Errorf("query data structure error") } + // 查询网元获取IP + neInfo := neService.NewNeInfo.SelectNeInfoByNeTypeAndNeID("MME", query.NeID) + if neInfo.NeId != query.NeID || neInfo.IP == "" { + return nil, fmt.Errorf("not fount neId info") + } + query.RmUID = neInfo.RmUID + rows, total := neDataService.NewUEEventMME.SelectPage(query) resultByte, err := json.Marshal(result.Ok(map[string]any{ "requestId": requestID, diff --git a/src/modules/ws/service/ws_send.go b/src/modules/ws/service/ws_send.go index 70d81682..eba535b4 100644 --- a/src/modules/ws/service/ws_send.go +++ b/src/modules/ws/service/ws_send.go @@ -30,10 +30,10 @@ const ( GROUP_SMSC_CDR = "1007_" // 组号-SGWC_CDR会话事件 1008_neId GROUP_SGWC_CDR = "1008_" - // 组号-AMF_UE会话事件 + // 组号-AMF_UE会话事件 1010_neId GROUP_AMF_UE = "1010" // 组号-MME_UE会话事件 1011_neId - GROUP_MME_UE = "1011_" + GROUP_MME_UE = "1011" ) // 实例化服务层 WSSend 结构体 From b265e6368a4db25b2e58ebc64c61dc7119e906d7 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 27 Dec 2024 18:26:37 +0800 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=E7=BD=91=E5=85=83=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=95=B0=E6=8D=AE=E6=9F=A5=E8=AF=A2=E6=97=A0data?= =?UTF-8?q?=E6=97=B6=E8=BF=94=E5=9B=9E=E7=A9=BA=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_element/fetch_link/ne_config.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/modules/network_element/fetch_link/ne_config.go b/src/modules/network_element/fetch_link/ne_config.go index 4695351a..5e159b65 100644 --- a/src/modules/network_element/fetch_link/ne_config.go +++ b/src/modules/network_element/fetch_link/ne_config.go @@ -68,6 +68,10 @@ func NeConfigInfo(neInfo model.NeInfo, paramName string) (map[string]any, error) logger.Errorf("NeConfigInfo Unmarshal %s", err.Error()) return nil, err } + // 网元参数配置信息为空时是{},需要补充data属性 + if _, ok := resData["data"]; !ok { + resData["data"] = []map[string]any{} + } return resData, nil } From 06702d0f531577883797b2aa50c47a29d0742e02 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 27 Dec 2024 18:27:28 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20=E7=BD=91=E5=85=83=E7=9B=B4?= =?UTF-8?q?=E8=BF=9E=E4=BF=AE=E5=A4=8D=E6=9F=A5=E8=AF=A2data=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_element/fetch_link/amf.go | 46 +++++++++++++++++-- src/modules/network_element/fetch_link/ims.go | 8 +++- src/modules/network_element/fetch_link/mme.go | 12 +++-- 3 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/modules/network_element/fetch_link/amf.go b/src/modules/network_element/fetch_link/amf.go index ae4d44ef..65cce3bf 100644 --- a/src/modules/network_element/fetch_link/amf.go +++ b/src/modules/network_element/fetch_link/amf.go @@ -12,14 +12,14 @@ import ( // AMFNbInfoList AMF基站信息 // -// 查询参数 {"nbId":"7"} +// 查询参数 {"id":"7"} // // 返回结果 [] func AMFNbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) { neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbInfo", neInfo.IP, neInfo.Port) // 查询参数拼接 query := []string{} - if v, ok := data["nbId"]; ok && v != "" { + if v, ok := data["id"]; ok && v != "" { query = append(query, fmt.Sprintf("nbId=%s", v)) } if len(query) > 0 { @@ -44,7 +44,47 @@ func AMFNbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]an // 固定返回字段,方便前端解析 if v, ok := resData["data"]; ok && v != nil { - return v.([]map[string]any), nil + if arr := v.([]any); len(arr) > 0 { + result := make([]map[string]any, len(arr)) + for i, item := range arr { + result[i] = item.(map[string]any) + } + return result, nil + } + } + return []map[string]any{}, nil +} + +// AMFGnbStateList AMF基站状态信息,对比配置项gnbList +// +// 返回结果 [] +func AMFGnbStateList(neInfo model.NeInfo) ([]map[string]any, error) { + neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/amf/objectType/nbState", neInfo.IP, neInfo.Port) + resBytes, err := fetch.Get(neUrl, nil, 60_000) + if err != nil { + errStr := err.Error() + logger.Warnf("AMFNbInfoList Get \"%s\"", neUrl) + logger.Errorf("AMFNbInfoList %s", errStr) + return nil, fmt.Errorf("NeService AMF API Error") + } + + // 序列化结果 {"data":[{"name": "Gnb","address": "192.168.8.1","state": "INACTIVE"}]} + var resData map[string]any + err = json.Unmarshal(resBytes, &resData) + if err != nil { + logger.Errorf("AMFNbInfoList Unmarshal %s", err.Error()) + return nil, err + } + + // 固定返回字段,方便前端解析 + if v, ok := resData["data"]; ok && v != nil { + if arr := v.([]any); len(arr) > 0 { + result := make([]map[string]any, len(arr)) + for i, item := range arr { + result[i] = item.(map[string]any) + } + return result, nil + } } return []map[string]any{}, nil } diff --git a/src/modules/network_element/fetch_link/ims.go b/src/modules/network_element/fetch_link/ims.go index 2139ab6d..015da592 100644 --- a/src/modules/network_element/fetch_link/ims.go +++ b/src/modules/network_element/fetch_link/ims.go @@ -88,7 +88,13 @@ func IMSUeSessionList(neInfo model.NeInfo, data map[string]string) ([]map[string // 固定返回字段,方便前端解析 if v, ok := resData["data"]; ok && v != nil { - return v.([]map[string]any), nil + if arr := v.([]any); len(arr) > 0 { + result := make([]map[string]any, len(arr)) + for i, item := range arr { + result[i] = item.(map[string]any) + } + return result, nil + } } return []map[string]any{}, nil } diff --git a/src/modules/network_element/fetch_link/mme.go b/src/modules/network_element/fetch_link/mme.go index a7383f35..741f48d3 100644 --- a/src/modules/network_element/fetch_link/mme.go +++ b/src/modules/network_element/fetch_link/mme.go @@ -12,14 +12,14 @@ import ( // MMENbInfoList AMF基站信息 // -// 查询参数 {"nbId":"7"} +// 查询参数 {"id":"7"} // // 返回结果 [] func MMENbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]any, error) { neUrl := fmt.Sprintf("http://%s:%d/api/rest/ueManagement/v1/elementType/mme/objectType/nbInfo", neInfo.IP, neInfo.Port) // 查询参数拼接 query := []string{} - if v, ok := data["nbId"]; ok && v != "" { + if v, ok := data["id"]; ok && v != "" { query = append(query, fmt.Sprintf("nbId=%s", v)) } if len(query) > 0 { @@ -44,7 +44,13 @@ func MMENbInfoList(neInfo model.NeInfo, data map[string]string) ([]map[string]an // 固定返回字段,方便前端解析 if v, ok := resData["data"]; ok && v != nil { - return v.([]map[string]any), nil + if arr := v.([]any); len(arr) > 0 { + result := make([]map[string]any, len(arr)) + for i, item := range arr { + result[i] = item.(map[string]any) + } + return result, nil + } } return []map[string]any{}, nil } From 6118feb06b2a4a2c4cabcf14100b409e6fe4496c Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 27 Dec 2024 18:29:37 +0800 Subject: [PATCH 5/8] =?UTF-8?q?perf:=20=E9=87=8D=E6=9E=84AMF-UE=E4=B8=8A?= =?UTF-8?q?=E6=8A=A5=E6=95=B0=E6=8D=AE=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/event/event.go | 120 ++++++++++++++++++++++++++++++++-------- 1 file changed, 98 insertions(+), 22 deletions(-) diff --git a/features/event/event.go b/features/event/event.go index 1f75012b..8ec403a4 100644 --- a/features/event/event.go +++ b/features/event/event.go @@ -1,19 +1,17 @@ package event import ( - "encoding/json" "fmt" - "io" "net/http" "strings" "time" "be.ems/lib/core/ctx" "be.ems/lib/dborm" - "be.ems/lib/global" "be.ems/lib/log" "be.ems/lib/services" "be.ems/restagent/config" + "be.ems/src/framework/utils/parse" neService "be.ems/src/modules/network_element/service" wsService "be.ems/src/modules/ws/service" "github.com/gin-gonic/gin" @@ -36,34 +34,100 @@ type UEEvent struct { EventJson map[string]any `json:"eventJSON" xorm:"event_json"` } +// 旧AMF上报处理 func PostUEEventFromAMF(c *gin.Context) { log.Info("PostUEEventFromAMF processing... ") - body, err := io.ReadAll(io.LimitReader(c.Request.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Failed to io.ReadAll: ", err) - services.ResponseNotFound404UriNotExist(c.Writer, c.Request) - return - } - - //vars := mux.Vars(c.Request) eventType, ok := c.Params.Get("eventType") if !ok || eventType == "" { log.Error("eventType is empty") services.ResponseNotFound404UriNotExist(c.Writer, c.Request) return } - ueEvent := new(UEEvent) - err = json.Unmarshal(body, &ueEvent.EventJson) - if err != nil { + var body map[string]any + if err := c.ShouldBindBodyWithJSON(&body); err != nil { log.Error("Failed to Unmarshal ueEvent:", err) services.ResponseInternalServerError500ProcessError(c.Writer, err) return } - ueEvent.NeType = "AMF" - ueEvent.Timestamp = time.Now().Unix() - ueEvent.EventType = eventType - log.Trace("ueEvent AMF:", ueEvent) + + ueEvent := UEEvent{ + NeType: "AMF", + Timestamp: time.Now().Unix(), + EventType: eventType, + } + // 从eventJson中获取rmUID + if v, ok := body["rmUID"]; ok { + ueEvent.RmUID = fmt.Sprint(v) + } else { + ueEvent.RmUID = "4400HXAMF001" + } + if v, ok := body["neName"]; ok { + ueEvent.NeName = fmt.Sprint(v) + } else { + ueEvent.NeName = "AMF_001" + } + + // 统一格式 + eventJson := map[string]any{"cellID": 0, "gNBID": "", "imsi": "", "onlineNumber": 0, "result": "", "tacID": 0, "timestamp": 0, "time": 0, "type": eventType} + switch eventType { + case "auth-result": + // {"authCode":"200","authMessage":"成功","authTime":"2024-12-07 16:48:37","cellID":"3","gNBID":"1","imsi":"460002082100000","onlineNumber":1,"tacID":"81"} + if v, ok := body["imsi"]; ok { + eventJson["imsi"] = fmt.Sprint(v) + } + if v, ok := body["cellID"]; ok { + eventJson["cellID"] = fmt.Sprint(v) + } + if v, ok := body["gNBID"]; ok { + eventJson["gNBID"] = fmt.Sprint(v) + } + if v, ok := body["tacID"]; ok { + eventJson["tacID"] = fmt.Sprint(v) + } + if v, ok := body["onlineNumber"]; ok { + eventJson["onlineNumber"] = parse.Number(v) + } + if v, ok := body["authCode"]; ok { + eventJson["result"] = fmt.Sprint(v) + } + if v, ok := body["authTime"]; ok { + eventJson["timestamp"] = ueEvent.Timestamp + eventJson["time"] = fmt.Sprint(v) + } + case "detach": + // {"detachResult":0,"detachTime":"2024-12-07 18:00:47","imsi":"460002082100000"} + if v, ok := body["imsi"]; ok { + eventJson["imsi"] = fmt.Sprint(v) + } + if v, ok := body["detachResult"]; ok { + if fmt.Sprint(v) == "0" { + eventJson["result"] = "200" + } else { + eventJson["result"] = "500" + } + } + if v, ok := body["detachTime"]; ok { + eventJson["timestamp"] = ueEvent.Timestamp + eventJson["time"] = fmt.Sprint(v) + } + case "cm-state": + // {"changeTime":"2024-12-07 17:07:52","imsi":"460002082100000","onlineNumber":1,"status":2} + if v, ok := body["imsi"]; ok { + eventJson["imsi"] = fmt.Sprint(v) + } + if v, ok := body["onlineNumber"]; ok { + eventJson["onlineNumber"] = parse.Number(v) + } + if v, ok := body["status"]; ok { + eventJson["result"] = fmt.Sprint(v) + } + if v, ok := body["changeTime"]; ok { + eventJson["timestamp"] = ueEvent.Timestamp + eventJson["time"] = fmt.Sprint(v) + } + } + ueEvent.EventJson = eventJson affected, err := dborm.XormInsertTableOne("ue_event_amf", ueEvent) if err != nil && affected <= 0 { @@ -72,13 +136,20 @@ func PostUEEventFromAMF(c *gin.Context) { return } - // AMF没有RmUID,直接推送 - // 推送到ws订阅组 - wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, ueEvent) + // 发送到匹配的网元 + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(ueEvent.RmUID) + if neInfo.RmUID == ueEvent.RmUID { + // 推送到ws订阅组 + if ueEvent.NeType == "AMF" { + wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, ueEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE+"_"+neInfo.NeId, ueEvent) + } + } services.ResponseStatusOK204NoContent(c.Writer) } +// UE上报处理 func PostUEEvent(w http.ResponseWriter, r *http.Request) { log.Info("PostUEEvent processing... ") @@ -103,7 +174,12 @@ func PostUEEvent(w http.ResponseWriter, r *http.Request) { if neInfo.RmUID == ueEvent.RmUID { // 推送到ws订阅组 if ueEvent.NeType == "MME" { - wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE+neInfo.NeId, ueEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE, ueEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE+"_"+neInfo.NeId, ueEvent) + } + if ueEvent.NeType == "AMF" { + wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, ueEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE+"_"+neInfo.NeId, ueEvent) } } From 8786daa3fecf3a77f69bef51b84373e2a4b3b459 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 27 Dec 2024 18:30:14 +0800 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20=20AMF=E5=9F=BA=E7=AB=99=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/network_data/network_data.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/modules/network_data/network_data.go b/src/modules/network_data/network_data.go index faa613e5..ee2db3a7 100644 --- a/src/modules/network_data/network_data.go +++ b/src/modules/network_data/network_data.go @@ -136,6 +136,10 @@ func Setup(router *gin.Engine) { middleware.PreAuthorize(nil), controller.NewAMF.NbInfoList, ) + amfGroup.GET("/nb/list-cfg", + middleware.PreAuthorize(nil), + controller.NewAMF.NbStateList, + ) } // 网元UPF From 21e6c026ccb480526cc089c1d7560488fe02292d Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 27 Dec 2024 18:33:21 +0800 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0AMF=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=A1=B9gnbList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/param/amf_param_config.yaml | 32 ++++++++++++++++++++++++++++++ database/common/ne_config.sql | 15 +++++++------- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/config/param/amf_param_config.yaml b/config/param/amf_param_config.yaml index 96febe57..a7c0c77d 100644 --- a/config/param/amf_param_config.yaml +++ b/config/param/amf_param_config.yaml @@ -504,3 +504,35 @@ amf: filter: '{"0":"false","1":"true"}' display: "statusReportEnabled" comment: "" + gnbList: + display: "Gnb List Config" + sort: 13 + array: + - name: "index" + type: "int" + value: "0" + access: "read-only" + filter: "0~128" + display: "Index" + comment: "0~128" + - name: "name" + type: "string" + value: "Gnb" + access: "read-write" + filter: "0~64" + display: "GNB Name" + comment: "text content length 0~64" + - name: "address" + type: "string" + value: "192.168.8.1" + access: "read-write" + filter: "0~64" + display: "GNB Address" + comment: "text content length 0~64" + - name: "position" + type: "string" + value: "Area-B" + access: "read-write" + filter: "0~64" + display: "Position" + comment: "location description. Prohibition of spaces, length of text content 0-64" diff --git a/database/common/ne_config.sql b/database/common/ne_config.sql index 3073ccb3..4904116b 100644 --- a/database/common/ne_config.sql +++ b/database/common/ne_config.sql @@ -23,13 +23,14 @@ CREATE TABLE `ne_config` ( -- 初始数据对应网元 --- 更新 AMF 配置 20241218 -INSERT INTO `ne_config` VALUES (1, 'AMF', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Name\",\"filter\":\"0~64\",\"name\":\"amfName\",\"type\":\"string\",\"value\":\"AMF\",\"visible\":\"self\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Relative Capacity\",\"filter\":\"0~255\",\"name\":\"relativeCapacity\",\"type\":\"int\",\"value\":\"255\",\"visible\":\"self\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiServerIp\",\"type\":\"string\",\"value\":\"192.168.1.183\",\"visible\":\"self\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiServerPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"0~64\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF URI\",\"filter\":\"0~64\",\"name\":\"ausfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"0~64\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF URI\",\"filter\":\"0~64\",\"name\":\"smfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.150:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"0~64\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup AUSF URI\",\"filter\":\"0~64\",\"name\":\"backupAusfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.131:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup UDM URI\",\"filter\":\"0~64\",\"name\":\"backupUdmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.141:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup SMF URI\",\"filter\":\"0~64\",\"name\":\"backupSmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.151:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup PCF URI\",\"filter\":\"0~64\",\"name\":\"backupPcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.161:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LMF URI\",\"filter\":\"0~64\",\"name\":\"lmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.200:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NEF URI\",\"filter\":\"0~64\",\"name\":\"nefUri\",\"type\":\"string\",\"value\":\"http://172.16.5.210:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMEI Restriction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed IMEI Prefix\",\"filter\":\"0~128\",\"name\":\"allowedImeiPrefix\",\"type\":\"string\",\"value\":\"869583045\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Correction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN\",\"filter\":\"0~64\",\"name\":\"defaultDnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Integrity Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NIA0\\\",\\\"1\\\":\\\"NIA1\\\",\\\"2\\\":\\\"NIA2\\\",\\\"3\\\":\\\"NIA3\\\"}\",\"name\":\"integrityAlgorithm\",\"type\":\"enum\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Ciphering Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NEA0\\\",\\\"1\\\":\\\"NEA1\\\",\\\"2\\\":\\\"NEA2\\\",\\\"3\\\":\\\"NEA3\\\"}\",\"name\":\"cipheringAlgorithm\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3502\",\"filter\":\"1~65535\",\"name\":\"t3502\",\"type\":\"int\",\"value\":\"720\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3512\",\"filter\":\"1~65535\",\"name\":\"t3512\",\"type\":\"int\",\"value\":\"3600\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3513\",\"filter\":\"1~65535\",\"name\":\"t3513\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3522\",\"filter\":\"1~65535\",\"name\":\"t3522\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3550\",\"filter\":\"1~65535\",\"name\":\"t3550\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3555\",\"filter\":\"1~65535\",\"name\":\"t3555\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3560\",\"filter\":\"1~65535\",\"name\":\"t3560\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3565\",\"filter\":\"1~65535\",\"name\":\"t3565\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3570\",\"filter\":\"1~65535\",\"name\":\"t3570\",\"type\":\"int\",\"value\":\"6\"}]', 1, '', 1734421066684, 'public'); -INSERT INTO `ne_config` VALUES (2, 'AMF', 'association', 'TNL Association List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NGAP IP\",\"filter\":\"0~64\",\"name\":\"ngapIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"NGAP SCTP Port\",\"filter\":\"0~65535\",\"name\":\"ngapSctpPort\",\"type\":\"int\",\"value\":\"38412\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Weight\",\"filter\":\"0~255\",\"name\":\"weightFactor\",\"type\":\"int\",\"value\":\"255\"}]', 3, '', 1734421066702, 'self'); -INSERT INTO `ne_config` VALUES (3, 'AMF', 'guami', 'GUAMI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"}]', 5, '', 1734421066707, 'self'); -INSERT INTO `ne_config` VALUES (4, 'AMF', 'tai', 'TAI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 7, '', 1734421066711, 'public'); -INSERT INTO `ne_config` VALUES (5, 'AMF', 'slice', 'Slice List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~127\",\"display\":\"SST\",\"filter\":\"0~127\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"^[A-Fa-f0-9]{6}\",\"name\":\"sd\",\"type\":\"regex\",\"value\":\"000001\"}]', 9, '', 1734421066715, 'public'); -INSERT INTO `ne_config` VALUES (6, 'AMF', 'systemFeatOpt', 'System FeatOpt', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"dnnCorrectionEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"gutiReallocationInPRUEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"gutiReallocationInPRUEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ueRadioCapabilityMatchEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"ueRadioCapabilityMatchEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportFollowOnRequestIndication\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportFollowOnRequestIndication\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"triggerInitCtxSetupForAllNASProc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"triggerInitCtxSetupForAllNASProc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportAllAllowedNssai\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportAllAllowedNssai\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"implicitUnsubscribeEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"implicitUnsubscribeEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportRRCInactiveReport\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportRRCInactiveReport\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportMappedSecurityContext\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportMappedSecurityContext\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"optimizeSignalingProcedure\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"optimizeSignalingProcedure\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"reAuthInServiceRequestProc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"reAuthInServiceRequestProc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"skipGetSubscribedNssai\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"skipGetSubscribedNssai\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"forceIdentityRequest\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"forceIdentityRequest\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"cagEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cagEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"imeiRestrictionEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"checkSliceInTaEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"checkSliceInTaEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"uePolicyEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"uePolicyEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"smsOverNasEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"smsOverNasEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"statusReportToOmc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"statusReportToOmc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"statusReportEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"statusReportEnabled\",\"type\":\"bool\",\"value\":\"0\"}]', 11, '', 1734421066719, 'public'); +-- 更新 AMF 配置 20241227 +INSERT INTO `ne_config` VALUES (1, 'AMF', 'system', 'System Config', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AMF Name\",\"filter\":\"0~64\",\"name\":\"amfName\",\"type\":\"string\",\"value\":\"AMF\",\"visible\":\"self\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Relative Capacity\",\"filter\":\"0~255\",\"name\":\"relativeCapacity\",\"type\":\"int\",\"value\":\"255\",\"visible\":\"self\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Scheme\",\"filter\":\"{\\\"0\\\":\\\"http\\\",\\\"1\\\":\\\"https\\\"}\",\"name\":\"sbiScheme\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SBI Server IP\",\"filter\":\"0~64\",\"name\":\"sbiServerIp\",\"type\":\"string\",\"value\":\"192.168.1.183\",\"visible\":\"self\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"SBI Server Port\",\"filter\":\"0~65535\",\"name\":\"sbiServerPort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"nrfEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"0~64\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"AUSF URI\",\"filter\":\"0~64\",\"name\":\"ausfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.130:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"0~64\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SMF URI\",\"filter\":\"0~64\",\"name\":\"smfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.150:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PCF URI\",\"filter\":\"0~64\",\"name\":\"pcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.160:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup AUSF URI\",\"filter\":\"0~64\",\"name\":\"backupAusfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.131:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup UDM URI\",\"filter\":\"0~64\",\"name\":\"backupUdmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.141:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup SMF URI\",\"filter\":\"0~64\",\"name\":\"backupSmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.151:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Backup PCF URI\",\"filter\":\"0~64\",\"name\":\"backupPcfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.161:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"LMF URI\",\"filter\":\"0~64\",\"name\":\"lmfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.200:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NEF URI\",\"filter\":\"0~64\",\"name\":\"nefUri\",\"type\":\"string\",\"value\":\"http://172.16.5.210:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"IMEI Restriction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Allowed IMEI Prefix\",\"filter\":\"0~128\",\"name\":\"allowedImeiPrefix\",\"type\":\"string\",\"value\":\"869583045\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"DNN Correction Enabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Default DNN\",\"filter\":\"0~64\",\"name\":\"defaultDnn\",\"type\":\"string\",\"value\":\"internet\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Integrity Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NIA0\\\",\\\"1\\\":\\\"NIA1\\\",\\\"2\\\":\\\"NIA2\\\",\\\"3\\\":\\\"NIA3\\\"}\",\"name\":\"integrityAlgorithm\",\"type\":\"enum\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Ciphering Algorithm\",\"filter\":\"{\\\"0\\\":\\\"NEA0\\\",\\\"1\\\":\\\"NEA1\\\",\\\"2\\\":\\\"NEA2\\\",\\\"3\\\":\\\"NEA3\\\"}\",\"name\":\"cipheringAlgorithm\",\"type\":\"enum\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3502\",\"filter\":\"1~65535\",\"name\":\"t3502\",\"type\":\"int\",\"value\":\"720\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3512\",\"filter\":\"1~65535\",\"name\":\"t3512\",\"type\":\"int\",\"value\":\"3600\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3513\",\"filter\":\"1~65535\",\"name\":\"t3513\",\"type\":\"int\",\"value\":\"2\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3522\",\"filter\":\"1~65535\",\"name\":\"t3522\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3550\",\"filter\":\"1~65535\",\"name\":\"t3550\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3555\",\"filter\":\"1~65535\",\"name\":\"t3555\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3560\",\"filter\":\"1~65535\",\"name\":\"t3560\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3565\",\"filter\":\"1~65535\",\"name\":\"t3565\",\"type\":\"int\",\"value\":\"6\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"T3570\",\"filter\":\"1~65535\",\"name\":\"t3570\",\"type\":\"int\",\"value\":\"6\"}]', 1, '', 1735280218858, 'public'); +INSERT INTO `ne_config` VALUES (2, 'AMF', 'association', 'TNL Association List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NGAP IP\",\"filter\":\"0~64\",\"name\":\"ngapIp\",\"type\":\"string\",\"value\":\"192.168.1.183\"},{\"access\":\"read-write\",\"comment\":\"0~65535\",\"display\":\"NGAP SCTP Port\",\"filter\":\"0~65535\",\"name\":\"ngapSctpPort\",\"type\":\"int\",\"value\":\"38412\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Weight\",\"filter\":\"0~255\",\"name\":\"weightFactor\",\"type\":\"int\",\"value\":\"255\"}]', 3, '', 1735280218872, 'self'); +INSERT INTO `ne_config` VALUES (3, 'AMF', 'guami', 'GUAMI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~255\",\"display\":\"Region ID\",\"filter\":\"0~255\",\"name\":\"regionId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~1023\",\"display\":\"Set ID\",\"filter\":\"0~1023\",\"name\":\"setId\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"0~63\",\"display\":\"Pointer\",\"filter\":\"0~63\",\"name\":\"pointer\",\"type\":\"int\",\"value\":\"1\"}]', 5, '', 1735280218877, 'self'); +INSERT INTO `ne_config` VALUES (4, 'AMF', 'tai', 'TAI List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~16777215\",\"display\":\"TAC\",\"filter\":\"0~8\",\"name\":\"tac\",\"type\":\"string\",\"value\":\"1\"}]', 7, '', 1735280218883, 'public'); +INSERT INTO `ne_config` VALUES (5, 'AMF', 'slice', 'Slice List', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~15\",\"display\":\"Index\",\"filter\":\"0~15\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"PLMN ID\",\"filter\":\"^[0-9]{5,6}$\",\"name\":\"plmnId\",\"type\":\"regex\",\"value\":\"00101\"},{\"access\":\"read-write\",\"comment\":\"0~127\",\"display\":\"SST\",\"filter\":\"0~127\",\"name\":\"sst\",\"type\":\"int\",\"value\":\"1\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"SD\",\"filter\":\"^[A-Fa-f0-9]{6}\",\"name\":\"sd\",\"type\":\"regex\",\"value\":\"000001\"}]', 9, '', 1735280218887, 'public'); +INSERT INTO `ne_config` VALUES (6, 'AMF', 'systemFeatOpt', 'System FeatOpt', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"dnnCorrectionEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"dnnCorrectionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"gutiReallocationInPRUEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"gutiReallocationInPRUEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"ueRadioCapabilityMatchEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"ueRadioCapabilityMatchEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportFollowOnRequestIndication\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportFollowOnRequestIndication\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"triggerInitCtxSetupForAllNASProc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"triggerInitCtxSetupForAllNASProc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportAllAllowedNssai\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportAllAllowedNssai\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"implicitUnsubscribeEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"implicitUnsubscribeEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportRRCInactiveReport\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportRRCInactiveReport\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"supportMappedSecurityContext\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"supportMappedSecurityContext\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"optimizeSignalingProcedure\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"optimizeSignalingProcedure\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"reAuthInServiceRequestProc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"reAuthInServiceRequestProc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"skipGetSubscribedNssai\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"skipGetSubscribedNssai\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"forceIdentityRequest\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"forceIdentityRequest\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"cagEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"cagEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"imeiRestrictionEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"imeiRestrictionEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"checkSliceInTaEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"checkSliceInTaEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"uePolicyEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"uePolicyEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"smsOverNasEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"smsOverNasEnabled\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"statusReportToOmc\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"statusReportToOmc\",\"type\":\"bool\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"statusReportEnabled\",\"filter\":\"{\\\"0\\\":\\\"false\\\",\\\"1\\\":\\\"true\\\"}\",\"name\":\"statusReportEnabled\",\"type\":\"bool\",\"value\":\"0\"}]', 11, '', 1735280218891, 'public'); +INSERT INTO `ne_config` VALUES (7, 'AMF', 'gnbList', 'Gnb List Cfg', 'array', '[{\"access\":\"read-only\",\"comment\":\"0~128\",\"display\":\"Index\",\"filter\":\"0~128\",\"name\":\"index\",\"type\":\"int\",\"value\":\"0\"},{\"access\":\"read-write\",\"comment\":\"text content length 0~64\",\"display\":\"GNB Name\",\"filter\":\"0~64\",\"name\":\"name\",\"type\":\"string\",\"value\":\"Gnb\"},{\"access\":\"read-write\",\"comment\":\"text content length 0~64\",\"display\":\"GNB Address\",\"filter\":\"0~64\",\"name\":\"address\",\"type\":\"string\",\"value\":\"192.168.8.1\"},{\"access\":\"read-write\",\"comment\":\"location description. Prohibition of spaces, length of text content 0-64\",\"display\":\"Position\",\"filter\":\"0~64\",\"name\":\"position\",\"type\":\"string\",\"value\":\"Area-B\"}]', 13, '', 1735280218896, 'public'); INSERT INTO `ne_config` VALUES (20, 'AUSF', 'system', 'System', 'list', '[{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service IP\",\"filter\":\"\",\"name\":\"serviceIP\",\"type\":\"ipv4\",\"value\":\"172.16.5.130\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Service Port\",\"filter\":\"0~65535\",\"name\":\"servicePort\",\"type\":\"int\",\"value\":\"8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Scheme\",\"filter\":\"{\\\"0\\\":\\\"HTTP\\\", \\\"1\\\":\\\"HTTPS\\\"}\",\"name\":\"scheme\",\"type\":\"enum\",\"value\":\"http\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"NRF URI\",\"filter\":\"\",\"name\":\"nrfUri\",\"type\":\"string\",\"value\":\"http://172.16.5.180:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"UDM URI\",\"filter\":\"\",\"name\":\"udmUri\",\"type\":\"string\",\"value\":\"http://172.16.5.140:8080\"},{\"access\":\"read-write\",\"comment\":\"\",\"display\":\"Group ID\",\"filter\":\"\",\"name\":\"groupId\",\"type\":\"string\",\"value\":\"0\"}]', 1, '', 1719831209173, 'public'); From 11d326709f6540ac8ce644a253472326e916783d Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 27 Dec 2024 19:03:10 +0800 Subject: [PATCH 8/8] =?UTF-8?q?sql:=20=E6=9B=B4=E6=96=B0=E6=97=B6UE?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=A1=A8=E5=88=A0=E9=99=A4=E9=87=8D=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/ue_event.sql | 52 +++++++-------------------- database/install/ue_event_amf.sql | 2 +- database/install/ue_event_mme.sql | 2 +- database/upgrade/upg_ue_event.sql | 37 ++++++------------- database/upgrade/upg_ue_event_amf.sql | 19 ++-------- database/upgrade/upg_ue_event_mme.sql | 3 +- 6 files changed, 29 insertions(+), 86 deletions(-) diff --git a/database/install/ue_event.sql b/database/install/ue_event.sql index 2209c14a..9d8962d2 100644 --- a/database/install/ue_event.sql +++ b/database/install/ue_event.sql @@ -1,48 +1,20 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) --- --- Host: 192.168.2.219 Database: omc_db --- ------------------------------------------------------ --- Server version 10.3.38-MariaDB - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - -- -- Table structure for table `ue_event` -- DROP TABLE IF EXISTS `ue_event`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `ue_event` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ne_type` varchar(32) DEFAULT NULL, - `ne_name` varchar(64) DEFAULT NULL, - `rm_uid` varchar(32) DEFAULT NULL, - `timestamp` int(11) DEFAULT NULL, - `event_type` varchar(16) DEFAULT NULL COMMENT 'auth-result/detach/cm-state', - `event_json` longtext DEFAULT NULL, - `created_at` datetime DEFAULT current_timestamp(), +CREATE TABLE `ue_event` ( + `id` int NOT NULL AUTO_INCREMENT, + `ne_type` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, + `ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL, + `rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, + `timestamp` int DEFAULT NULL, + `event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state', + `event_json` longtext COLLATE utf8mb4_general_ci, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) USING BTREE, - KEY `id` (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + KEY `id` (`id`) USING BTREE, + KEY `idx_type_timestamp` (`ne_type`,`timestamp`,`event_type`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; -- Dump completed on 2024-03-06 17:26:59 diff --git a/database/install/ue_event_amf.sql b/database/install/ue_event_amf.sql index a3c09f75..f8bcdf2d 100644 --- a/database/install/ue_event_amf.sql +++ b/database/install/ue_event_amf.sql @@ -9,7 +9,7 @@ CREATE TABLE `ue_event_amf` ( `ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL, `rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, `timestamp` int DEFAULT NULL, - `event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'auth-result/detach/cm-state', + `event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state', `event_json` longtext COLLATE utf8mb4_general_ci, `created_at` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) USING BTREE, diff --git a/database/install/ue_event_mme.sql b/database/install/ue_event_mme.sql index 1bf28283..69c4181c 100644 --- a/database/install/ue_event_mme.sql +++ b/database/install/ue_event_mme.sql @@ -9,7 +9,7 @@ CREATE TABLE `ue_event_mme` ( `ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL, `rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, `timestamp` int DEFAULT NULL, - `event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'ECM STATUS, EMM STATUS', + `event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state', `event_json` longtext COLLATE utf8mb4_general_ci, `created_at` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) USING BTREE, diff --git a/database/upgrade/upg_ue_event.sql b/database/upgrade/upg_ue_event.sql index b60f7382..066fecde 100644 --- a/database/upgrade/upg_ue_event.sql +++ b/database/upgrade/upg_ue_event.sql @@ -1,19 +1,3 @@ -/* - Navicat Premium Data Transfer - - Source Server : local_mariadb - Source Server Type : MariaDB - Source Server Version : 100338 (10.3.38-MariaDB) - Source Host : localhost:33066 - Source Schema : omc_db - - Target Server Type : MariaDB - Target Server Version : 100338 (10.3.38-MariaDB) - File Encoding : 65001 - - Date: 22/01/2024 17:03:39 -*/ - SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; @@ -21,16 +5,17 @@ SET FOREIGN_KEY_CHECKS = 0; -- Table structure for ue_event -- ---------------------------- CREATE TABLE IF NOT EXISTS `ue_event` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ne_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `ne_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `rm_uid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `timestamp` int(11) NULL DEFAULT NULL, - `event_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'auth-result/detach/cm-state', - `event_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - `created_at` datetime NULL DEFAULT current_timestamp(), + `id` int NOT NULL AUTO_INCREMENT, + `ne_type` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, + `ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL, + `rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, + `timestamp` int DEFAULT NULL, + `event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state', + `event_json` longtext COLLATE utf8mb4_general_ci, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) USING BTREE, - INDEX `id`(`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; + KEY `id` (`id`) USING BTREE, + KEY `idx_type_timestamp` (`ne_type`,`timestamp`,`event_type`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/upg_ue_event_amf.sql b/database/upgrade/upg_ue_event_amf.sql index 7eebce3e..a9c82a0c 100644 --- a/database/upgrade/upg_ue_event_amf.sql +++ b/database/upgrade/upg_ue_event_amf.sql @@ -1,32 +1,17 @@ -/* - Navicat Premium Data Transfer - - Source Server : local_mariadb - Source Server Type : MariaDB - Source Server Version : 100338 (10.3.38-MariaDB) - Source Host : localhost:33066 - Source Schema : omc_db - - Target Server Type : MariaDB - Target Server Version : 100338 (10.3.38-MariaDB) - File Encoding : 65001 - - Date: 22/01/2024 17:03:39 -*/ - SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for ue_event_amf -- ---------------------------- +DROP TABLE IF EXISTS `ue_event_amf`; CREATE TABLE IF NOT EXISTS `ue_event_amf` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, `ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL, `rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, `timestamp` int DEFAULT NULL, - `event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'auth-result/detach/cm-state', + `event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state', `event_json` longtext COLLATE utf8mb4_general_ci, `created_at` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) USING BTREE, diff --git a/database/upgrade/upg_ue_event_mme.sql b/database/upgrade/upg_ue_event_mme.sql index f9d3b1b2..401c0cc4 100644 --- a/database/upgrade/upg_ue_event_mme.sql +++ b/database/upgrade/upg_ue_event_mme.sql @@ -4,13 +4,14 @@ SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for ue_event_mme -- ---------------------------- +DROP TABLE IF EXISTS `ue_event_mme`; CREATE TABLE IF NOT EXISTS `ue_event_mme` ( `id` int NOT NULL AUTO_INCREMENT, `ne_type` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, `ne_name` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL, `rm_uid` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL, `timestamp` int DEFAULT NULL, - `event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'ECM STATUS, EMM STATUS', + `event_type` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'auth-result/detach/cm-state', `event_json` longtext COLLATE utf8mb4_general_ci, `created_at` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) USING BTREE,