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