本次迭代覆盖MES与WMS核心业务: 1. 新增接驳台托盘传感器读取与AGV对接能力 2. 完善工单排产、备料流程与权限体系拆分 3. 优化看板接口与前端路由、样式 4. 新增操作日志、库存盘点与角色保护逻辑 5. 修复代理地址、BOM保存等已知问题
87 lines
2.4 KiB
Go
87 lines
2.4 KiB
Go
// Package eventlog 提供操作日志(事件审计)的统一写入与查询封装。
|
||
// 参照 MES(bj_power_mes/internal/eventlog)模型,按 WMS 约定落地:
|
||
// - 表 event_log,时间字段为 Int64 unix 秒
|
||
// - 写库失败只记服务日志,绝不阻断业务
|
||
package eventlog
|
||
|
||
import (
|
||
"context"
|
||
"log/slog"
|
||
"time"
|
||
|
||
"bj_power_wms/ent"
|
||
"bj_power_wms/ent/eventlog"
|
||
)
|
||
|
||
// Writer 操作日志写入/查询器
|
||
type Writer struct {
|
||
client *ent.Client
|
||
}
|
||
|
||
// NewWriter 构造 Writer
|
||
func NewWriter(client *ent.Client) *Writer {
|
||
return &Writer{client: client}
|
||
}
|
||
|
||
// Write 记录一条操作日志。
|
||
// eventType 事件类型(如 user.create / inbound.create / auth.login),
|
||
// operator 操作人(用户名),entityType/entityId 描述业务对象,description 中文描述,payload 扩展负载。
|
||
func (w *Writer) Write(ctx context.Context, eventType, operator, entityType, entityID, description string, payload map[string]any) {
|
||
if ctx == nil {
|
||
ctx = context.Background()
|
||
}
|
||
b := w.client.EventLog.Create().
|
||
SetEventType(eventType).
|
||
SetOperator(operator).
|
||
SetEntityType(entityType).
|
||
SetEntityID(entityID).
|
||
SetDescription(description).
|
||
SetCreatedAt(time.Now().Unix())
|
||
if len(payload) > 0 {
|
||
b.SetPayload(payload)
|
||
}
|
||
if _, err := b.Save(ctx); err != nil {
|
||
slog.Warn("操作日志写入失败", "eventType", eventType, "error", err.Error())
|
||
}
|
||
}
|
||
|
||
// Query 分页查询操作日志。空参数不参与过滤;from/to 为 Int64 unix 秒(含边界)。
|
||
func (w *Writer) Query(ctx context.Context, eventType, operator, entityType string, from, to int64, page, pageSize int) ([]*ent.EventLog, int, error) {
|
||
q := w.client.EventLog.Query()
|
||
if eventType != "" {
|
||
// 事件类型按前缀匹配(如 user.* / inbound.* 族),便于按业务域筛选
|
||
q = q.Where(eventlog.EventTypeHasPrefix(eventType))
|
||
}
|
||
if operator != "" {
|
||
q = q.Where(eventlog.OperatorEQ(operator))
|
||
}
|
||
if entityType != "" {
|
||
q = q.Where(eventlog.EntityTypeEQ(entityType))
|
||
}
|
||
if from > 0 {
|
||
q = q.Where(eventlog.CreatedAtGTE(from))
|
||
}
|
||
if to > 0 {
|
||
q = q.Where(eventlog.CreatedAtLTE(to))
|
||
}
|
||
total, err := q.Count(ctx)
|
||
if err != nil {
|
||
return nil, 0, err
|
||
}
|
||
if page < 1 {
|
||
page = 1
|
||
}
|
||
if pageSize < 1 {
|
||
pageSize = 20
|
||
}
|
||
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
|
||
}
|