Files
bj_power/bj_power_mes/internal/eventlog/eventlog.go
T
SunYF f274da044c feat: 重构BOM架构,新增基础设置与虚拟工位管理功能
本次重构删除原有BOM物料清单表,改用工单工艺组合×工艺物料清单作为唯一用料来源;新增系统基础设置表支持WMS地址、日志保留天数等配置,新增虚拟工位作业管理后台接口与前端页签控制功能,同时优化工位号校验逻辑、事件日志自动清理与工单用料查询能力。
2026-09-23 11:41:28 +08:00

82 lines
2.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 表示不限)。
// Query 支持按事件类型/工单号/操作人/时间范围查询。
// from/to 传时间戳毫秒(0 表示不限)。
// operators:操作人候选列表(任一命中即算),历史数据里 operator 中文名/用户名混杂,调用方应同时传两者;
// admin 精确筛选单人时传单元素即可,传空切片=不过滤。
func (w *Writer) Query(ctx context.Context, eventType, workOrderNo string, operators []string, fromMs, toMs int64, page, pageSize int) ([]*ent.EventLog, int, error) {
q := w.client.EventLog.Query()
// 操作日志只收录业务操作,登录/退出(auth.*)不属于操作日志范畴,一律不展示。
q = q.Where(eventlog.Not(eventlog.EventTypeHasPrefix("auth.")))
if eventType != "" {
// 前缀匹配:前端按业务域"族"筛选(如 work.order. / daily.plan.
q = q.Where(eventlog.EventTypeHasPrefix(eventType))
}
if workOrderNo != "" {
q = q.Where(eventlog.WorkOrderNo(workOrderNo))
}
if len(operators) > 0 {
q = q.Where(eventlog.OperatorIn(operators...))
}
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
}
// CleanupBefore 删除早于 cutoff 的操作日志(基础设置「事件日志保留天数」用),返回删除条数。
func (w *Writer) CleanupBefore(ctx context.Context, cutoff time.Time) (int, error) {
n, err := w.client.EventLog.Delete().Where(eventlog.CreatedAtLT(cutoff)).Exec(ctx)
return int(n), err
}