package eventlog import ( "context" "time" "bj_power_mes/ent" "bj_power_mes/ent/eventlog" ) // Writer 封装操作日志写入 type Writer struct { client *ent.Client } func NewWriter(client *ent.Client) *Writer { return &Writer{client: client} } // Payload 可选载荷 type Payload = map[string]any // Write 记录一条操作日志(event_log 必含 workOrderNo、operator 字段) func (w *Writer) Write(ctx context.Context, eventType, workOrderNo, operator, entityType, entityId, description string, payload Payload) { b := w.client.EventLog.Create(). SetEventType(eventType). SetWorkOrderNo(workOrderNo). SetOperator(operator). SetEntityType(entityType). SetEntityId(entityId). SetDescription(description) if payload != nil { b.SetPayload(payload) } if _, err := b.Save(ctx); err != nil { _ = err } } // Writer Query 支持按事件类型/工单号/操作人/时间范围查询。 // from/to 传时间戳毫秒(0 表示不限)。 func (w *Writer) Query(ctx context.Context, eventType, workOrderNo, operator string, fromMs, toMs int64, page, pageSize int) ([]*ent.EventLog, int, error) { q := w.client.EventLog.Query() if eventType != "" { // 前缀匹配:前端按业务域"族"筛选(如 work.order. / daily.plan.) q = q.Where(eventlog.EventTypeHasPrefix(eventType)) } if workOrderNo != "" { q = q.Where(eventlog.WorkOrderNo(workOrderNo)) } if operator != "" { q = q.Where(eventlog.Operator(operator)) } if fromMs > 0 { q = q.Where(eventlog.CreatedAtGTE(time.UnixMilli(fromMs))) } if toMs > 0 { q = q.Where(eventlog.CreatedAtLTE(time.UnixMilli(toMs))) } total, err := q.Count(ctx) if err != nil { return nil, 0, err } list, err := q.Order(ent.Desc(eventlog.FieldCreatedAt), ent.Desc(eventlog.FieldID)). Offset((page - 1) * pageSize).Limit(pageSize).All(ctx) if err != nil { return nil, 0, err } return list, total, nil }