package handler import ( "net/http" "strconv" "bj_power_wms/ent/user" "bj_power_wms/internal/svc" ) // eventLogListHandler GET /api/event/logs 操作日志分页查询 // 筛选:eventType(事件类型) operator(操作人) entityType(对象类型) from/to(unix 秒) // 可见性:admin 可看全部并可按操作人筛选;普通用户强制只看自己的日志(忽略 operator 参数)。 // operatorName:操作人中文名(users.real_name,按 operator 批量映射,历史数据同样生效)。 func eventLogListHandler(ctx *svc.ServiceContext) http.HandlerFunc { return requirePerm(ctx, "eventlog:manage", func(w http.ResponseWriter, r *http.Request) { q := r.URL.Query() page, _ := strconv.Atoi(q.Get("page")) pageSize, _ := strconv.Atoi(q.Get("pageSize")) from, _ := strconv.ParseInt(q.Get("from"), 10, 64) to, _ := strconv.ParseInt(q.Get("to"), 10, 64) isAdmin := roleFromRequest(r) == "admin" operator := q.Get("operator") if !isAdmin { // 普通用户仅能查看自己的操作日志 operator = r.Header.Get("X-Username") } list, total, err := ctx.EventLog.Query(ctx0(), q.Get("eventType"), operator, q.Get("entityType"), from, to, page, pageSize) if err != nil { fail(w, http.StatusInternalServerError, err.Error()) return } // 批量映射操作人中文名(real_name),缺档/系统写入显示原用户名 ops := make([]string, 0, len(list)) for _, e := range list { ops = append(ops, e.Operator) } nameMap := realNameMapOf(ctx, ops) rows := make([]map[string]any, 0, len(list)) for _, e := range list { name := nameMap[e.Operator] if name == "" { name = e.Operator } rows = append(rows, map[string]any{ "id": e.ID, "eventType": e.EventType, "description": e.Description, "entityType": e.EntityType, "entityId": e.EntityID, "operator": e.Operator, "operatorName": name, "payload": e.Payload, "createdAt": e.CreatedAt, }) } ok(w, map[string]any{"list": rows, "total": total, "isAdmin": isAdmin}) }) } // realNameMapOf 批量取操作人中文名 func realNameMapOf(ctx *svc.ServiceContext, operators []string) map[string]string { set := make([]string, 0, len(operators)) seen := map[string]bool{} for _, op := range operators { if op != "" && !seen[op] { seen[op] = true set = append(set, op) } } out := map[string]string{} if len(set) == 0 { return out } us, err := ctx.EntClient.User.Query().Where(user.UsernameIn(set...)).All(ctx0()) if err != nil { return out } for _, u := range us { if u.RealName != "" { out[u.Username] = u.RealName } } return out }