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]
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 == "<nil>" {
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 == "<nil>" || 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 == "<nil>" || 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 == "<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{
"time": timeStr,
"ngap_context": data,