1. 移除工单、工件、日排产中的冗余工位组合/接驳台字段 2. 新增工位接驳台编码字段与唯一约束,关联WMS接驳台主数据 3. 重构日排产为工位产量分配模式,替代原接驳台列表 4. 新增备料单工位级字段与分批出库支持 5. 移除定时同步可生产数量,改为WMS实时拉取接口 6. 过滤操作日志,排除登录/退出相关日志 7. 调整仪表盘工序展示逻辑为今日派工路线 8. 新增接驳台维护菜单与基础数据
89 lines
2.6 KiB
Go
89 lines
2.6 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()
|
||
// 操作日志只收录业务操作,登录/退出(auth.*)不属于操作日志范畴,一律不展示。
|
||
q = q.Where(eventlog.Not(eventlog.EventTypeHasPrefix("auth.")))
|
||
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
|
||
}
|