feat: AMF-audit日志文件接口默认一小时注册用户带时间参数查询

This commit is contained in:
TsMask
2025-10-20 19:29:35 +08:00
parent 8ec9b3d161
commit 10723d9568

View File

@@ -388,9 +388,10 @@ func (s *AMFController) NbStateList(c *gin.Context) {
// @Router /neData/amf/log/audit [get] // @Router /neData/amf/log/audit [get]
func (s *AMFController) AuditLog(c *gin.Context) { func (s *AMFController) AuditLog(c *gin.Context) {
var query struct { var query struct {
NeId string `form:"neId" binding:"required"` NeId string `form:"neId" binding:"required"` // 网元ID
BeginTime int64 `json:"beginTime" form:"beginTime"` LastTime int64 `json:"lastTime" form:"lastTime"` // 单位分钟可设置为最小1分钟至最大24小时
EndTime int64 `json:"endTime" form:"endTime"` SuPI string `json:"supi" form:"supi"` // IMSI号码
OpType string `json:"opType" form:"opType"` // 操作类型 REGISTRATION DE-REGISTRATION SERVICE-REQ RELEASE-REQ
} }
if err := c.ShouldBindQuery(&query); err != nil { if err := c.ShouldBindQuery(&query); err != nil {
errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err)) errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
@@ -398,14 +399,9 @@ func (s *AMFController) AuditLog(c *gin.Context) {
return return
} }
// 处理时间范围 queryOpType := query.OpType
if query.BeginTime != 0 && query.BeginTime < 1e12 { if queryOpType == "" || queryOpType == "<nil>" {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "begin time must ms")) queryOpType = "REGISTRATION"
return
}
if query.EndTime != 0 && query.EndTime < 1e12 {
c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_CHEACK, "end time must ms"))
return
} }
auditLog, err := neDataService.NewAMF.GetAuditLog(query.NeId) auditLog, err := neDataService.NewAMF.GetAuditLog(query.NeId)
@@ -443,56 +439,134 @@ func (s *AMFController) AuditLog(c *gin.Context) {
// 响应格式 // 响应格式
timeStr := "" timeStr := ""
data := make([]map[string]any, 0) data := make([]map[string]any, 0)
if query.BeginTime > 1e12 && query.EndTime > 1e12 {
switch {
default:
// 验证时间范围在1分钟到24小时之间
if query.LastTime < 1 || query.LastTime > 1440 { // 24小时 = 1440分钟
// 可以返回错误或者限制在有效范围内
query.LastTime = 60 // 默认设置为1小时
}
// 时间处理 // 时间处理
beginT := time.UnixMilli(query.BeginTime) beginT := time.Now().Add(time.Duration(-query.LastTime) * time.Minute)
endT := time.UnixMilli(query.EndTime) endT := time.Now()
timeStr = fmt.Sprintf("%s - %s", beginT.Format(time.DateTime), endT.Format(time.DateTime)) timeStr = fmt.Sprintf("%s - %s", beginT.Format(time.DateTime), endT.Format(time.DateTime))
for _, v := range auditLog { for _, v := range auditLog {
// 先过滤操作类型为REGISTRATION的记录
opType := fmt.Sprint(v["op_type"])
if opType == "" || opType == "<nil>" || opType != queryOpType {
continue
}
// 检查时间字段
timeV, ok := v["time"].(string) timeV, ok := v["time"].(string)
if !ok { if !ok {
continue continue
} }
// 解析时间 // 解析时间
t, err := time.Parse(time.DateTime, timeV) t, err := time.Parse(time.DateTime, timeV)
if err != nil { if err != nil {
continue continue
} }
// 检查时间是否在范围内 // 修正时间范围判断逻辑
if t.After(beginT) && t.After(endT) { if t.After(beginT) && !t.After(endT) { // 时间在开始时间之后,并且不超过结束时间
data = append(data, map[string]any{ data = append(data, map[string]any{
"supi": fmt.Sprint(v["supi"]), "supi": fmt.Sprint(v["supi"]),
"amf_ue_ngap_id": parse.Number(v["amf_ue_ngap_id"]), "amf_ue_ngap_id": parse.Number(v["amf_ue_ngap_id"]),
"ran_ue_ngap_id": parse.Number(v["ran_ue_ngap_id"]), "ran_ue_ngap_id": parse.Number(v["ran_ue_ngap_id"]),
"gnb_id": parse.Number(v["gnb_id"]), "gnb_id": parse.Number(v["gnb_id"]),
"time": timeV, "op_type": fmt.Sprint(v["op_type"]),
"time": fmt.Sprint(v["time"]),
}) })
} }
} }
} else { case query.LastTime > 0 && query.SuPI != "":
lastItem := auditLog[0] // 验证时间范围在1分钟到24小时之间
lastTime := "" if query.LastTime < 1 || query.LastTime > 1440 { // 24小时 = 1440分钟
if timeV, ok := lastItem["time"].(string); ok { // 可以返回错误或者限制在有效范围内
lastTime = timeV[:19] query.LastTime = 60 // 默认设置为1小时
} }
timeStr = lastTime
// 时间处理
beginT := time.Now().Add(time.Duration(-query.LastTime) * time.Minute)
endT := time.Now()
timeStr = fmt.Sprintf("%s - %s", beginT.Format(time.DateTime), endT.Format(time.DateTime))
for _, v := range auditLog { for _, v := range auditLog {
// 先过滤操作类型为REGISTRATION的记录
opType := fmt.Sprint(v["op_type"])
if opType == "" || opType == "<nil>" || opType != queryOpType {
continue
}
supiV, ok := v["supi"].(string)
if !ok {
continue
}
// 检查时间字段
timeV, ok := v["time"].(string) timeV, ok := v["time"].(string)
if !ok { if !ok {
continue continue
} }
if !strings.HasPrefix(timeV, lastTime) {
// 解析时间
t, err := time.Parse(time.DateTime, timeV)
if err != nil {
continue continue
} }
data = append(data, map[string]any{
"supi": fmt.Sprint(v["supi"]), // 修正时间范围判断逻辑
"amf_ue_ngap_id": parse.Number(v["amf_ue_ngap_id"]), if t.After(beginT) && !t.After(endT) && supiV == query.SuPI { // 时间在开始时间之后,并且不超过结束时间
"ran_ue_ngap_id": parse.Number(v["ran_ue_ngap_id"]), data = append(data, map[string]any{
"gnb_id": parse.Number(v["gnb_id"]), "supi": fmt.Sprint(v["supi"]),
}) "amf_ue_ngap_id": parse.Number(v["amf_ue_ngap_id"]),
"ran_ue_ngap_id": parse.Number(v["ran_ue_ngap_id"]),
"gnb_id": parse.Number(v["gnb_id"]),
"op_type": fmt.Sprint(v["op_type"]),
"time": fmt.Sprint(v["time"]),
})
}
}
case query.SuPI != "":
for _, v := range auditLog {
// 先过滤操作类型为REGISTRATION的记录
opType := fmt.Sprint(v["op_type"])
if opType == "" || opType == "<nil>" || opType != queryOpType {
continue
}
supiV, ok := v["supi"].(string)
if !ok {
continue
}
if supiV == query.SuPI {
data = append(data, map[string]any{
"supi": fmt.Sprint(v["supi"]),
"amf_ue_ngap_id": parse.Number(v["amf_ue_ngap_id"]),
"ran_ue_ngap_id": parse.Number(v["ran_ue_ngap_id"]),
"gnb_id": parse.Number(v["gnb_id"]),
"op_type": fmt.Sprint(v["op_type"]),
"time": fmt.Sprint(v["time"]),
})
}
}
// 时间处理
if len(data) == 1 {
timeStr = data[0]["time"].(string)
}
if len(data) > 1 {
beginT := data[0]["time"].(string)
endT := data[len(data)-1]["time"].(string)
timeStr = fmt.Sprintf("%s - %s", beginT, endT)
} }
} }
c.JSON(200, map[string]any{ c.JSON(200, map[string]any{
"time": timeStr, "time": timeStr,
"ngap_context": data, "ngap_context": data,