feat: 完成产线与仓储系统多模块迭代升级

本次迭代覆盖MES与WMS核心业务:
1. 新增接驳台托盘传感器读取与AGV对接能力
2. 完善工单排产、备料流程与权限体系拆分
3. 优化看板接口与前端路由、样式
4. 新增操作日志、库存盘点与角色保护逻辑
5. 修复代理地址、BOM保存等已知问题
This commit is contained in:
SunYF
2026-09-04 14:18:53 +08:00
parent c1fc6d32b2
commit b6799c9de4
138 changed files with 20613 additions and 2220 deletions
@@ -0,0 +1,86 @@
// Package eventlog 提供操作日志(事件审计)的统一写入与查询封装。
// 参照 MESbj_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
}