From 10723d9568057cdb49d4dacdd3c4b1d6c8072f64 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 20 Oct 2025 19:29:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20AMF-audit=E6=97=A5=E5=BF=97=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=8E=A5=E5=8F=A3=E9=BB=98=E8=AE=A4=E4=B8=80=E5=B0=8F?= =?UTF-8?q?=E6=97=B6=E6=B3=A8=E5=86=8C=E7=94=A8=E6=88=B7=E5=B8=A6=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=8F=82=E6=95=B0=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 | 134 ++++++++++++++++----- 1 file changed, 104 insertions(+), 30 deletions(-) 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,