feat&refactor: 完成多模块功能迭代与配置优化

本次提交覆盖多个业务模块的功能完善与体验优化:
1.  **鉴权与配置调整**:
    - 统一JWT滑动续签逻辑,简化Token存储,移除RefreshToken相关冗余代码
    - 调整多项目配置文件中JWT过期时间为3600秒,统一会话闲置窗口
    - 工位配置放开1~12限制,改为仅校验大于0
2.  **术语统一替换**:全链路将"精密件"替换为"电气件",修正物料管理描述
3.  **功能新增**:
    - 新增工位类型、工艺路线与产线点位台账模块
    - 添加工艺PDF预览面板、工位终端代理转发接口
    - 新增操作日志按操作人列表筛选、工位登出日志记录
    - 新增PLC移料指令与产线点位状态管理
4.  **业务流程优化**:
    - 调整BOM物料删除校验逻辑,优化工单备料计算
    - 补充物料图号、检测单号等追溯字段
    - 完善工艺流程图与工位绑定关系说明
    - 优化前端页面文案与交互细节
5.  **代码规范与维护**:
    - 新增通用工具函数与前端静态资源
    - 整理路由权限与中间件逻辑
    - 修复部分接口与配置的不兼容问题
This commit is contained in:
SunYF
2026-09-10 16:59:15 +08:00
parent 6d8bb75696
commit 0ab21b1234
202 changed files with 21397 additions and 3172 deletions
+25 -37
View File
@@ -4,10 +4,7 @@ import (
"context"
"strconv"
"bj_power_mes/ent"
"bj_power_mes/ent/permission"
"bj_power_mes/ent/processflow"
"bj_power_mes/ent/processstep"
"bj_power_mes/ent/role"
"bj_power_mes/ent/station"
"bj_power_mes/ent/user"
@@ -29,13 +26,14 @@ func (s *Service) Seed(ctx context.Context) error {
codes = []string{
"produce.workorder", "produce.dailyplan", "produce.bom", "produce.material", "produce.scan",
"produce.trace", "produce.torque", "produce.plc", "produce.product",
"produce.processflow", "produce.station", "produce.performance",
"produce.processflow", "produce.station", "produce.performance", "produce.route",
// 按钮级权限(块2
"produce.workorder:add", "produce.workorder:edit", "produce.workorder:delete",
"produce.workorder:dailyplan", "produce.bom:edit", "produce.material:generate",
"produce.plc:send", "produce.product:add", "produce.product:edit", "produce.product:delete",
"produce.processflow:add", "produce.processflow:edit", "produce.processflow:delete",
"produce.processflow:upload", "produce.station:edit",
"produce.route:add", "produce.route:edit", "produce.route:delete",
}
} else if r.code == "INSPECTOR" {
codes = []string{"produce.trace", "produce.torque", "produce.performance", "sys.eventlog",
@@ -77,6 +75,7 @@ func (s *Service) Seed(ctx context.Context) error {
{"produce.torque", "拧紧查询", "MENU", "/torque"},
{"produce.processflow", "工艺流程", "MENU", "/process-flow"},
{"produce.station", "关联工位", "MENU", "/station"},
{"produce.route", "工艺路线", "MENU", "/process-route"},
{"produce.performance", "绩效报表", "MENU", "/performance"},
{"produce.scan", "手动报工", "MENU", "/scan"},
{"produce.trace", "工件追溯", "MENU", "/trace"},
@@ -114,6 +113,9 @@ func (s *Service) Seed(ctx context.Context) error {
{"produce.processflow:delete", "工艺流程-删除", "BUTTON", "", "produce.processflow"},
{"produce.processflow:upload", "工艺流程-上传图纸", "BUTTON", "", "produce.processflow"},
{"produce.station:edit", "工位-绑定", "BUTTON", "", "produce.station"},
{"produce.route:add", "工艺路线-新增", "BUTTON", "", "produce.route"},
{"produce.route:edit", "工艺路线-编辑", "BUTTON", "", "produce.route"},
{"produce.route:delete", "工艺路线-删除", "BUTTON", "", "produce.route"},
{"sys.account:add", "账号-新增", "BUTTON", "", "sys.account"},
{"sys.account:edit", "账号-编辑", "BUTTON", "", "sys.account"},
{"sys.account:delete", "账号-删除", "BUTTON", "", "sys.account"},
@@ -145,48 +147,34 @@ func (s *Service) Seed(ctx context.Context) error {
// 3.2 旧版权限码迁移(sys.rbac 家族 → sys.account / sys.role,幂等)
migrateLegacySysRbac(ctx, s)
// 4. 12 个工位默认工艺流程 + 工位绑定流程挂 process_code,工位绑流程
// 4. 初始化工位默认工艺流程工位绑定流程,流程承载步骤
seedFlowsAndStations(ctx, s)
return nil
}
func seedFlowsAndStations(ctx context.Context, s *Service) {
// 每个工位(1~12)若未配置工艺流程,则创建默认流程并绑定;已有流程则跳过
// 初始数据:12 个工位(工位数量以数据库为准,这里只做首次初始化;要 13 个就往 station 表插一行)
for i := 1; i <= 12; i++ {
flow, err := s.ctx.EntClient.ProcessFlow.Query().
Where(processflow.ProcessCode(i)).
Order(ent.Asc(processflow.FieldID)).First(ctx)
if err != nil {
flow, _ = s.ctx.EntClient.ProcessFlow.Create().
SetName("工位" + strconv.Itoa(i) + "_默认").
SetProcessCode(i).SetStatus("ACTIVE").SetRemark("默认工艺流程").Save(ctx)
}
if flow == nil {
continue
}
cnt, _ := s.ctx.EntClient.ProcessStep.Query().Where(processstep.FlowId(flow.ID)).Count(ctx)
if cnt == 0 {
stepID := 0
if step, err := s.ctx.EntClient.ProcessStep.Create().
SetFlowId(flow.ID).SetProcessCode(i).SetSeq(1).SetName("装配完成").
SetCollectType("NONE").Save(ctx); err == nil {
stepID = step.ID
}
if i == 3 && stepID > 0 {
_, _ = s.ctx.EntClient.ProcessStep.Create().
SetFlowId(flow.ID).SetProcessCode(i).SetSeq(2).SetName("拧紧扭矩").
SetCollectType("AUTO").SetIsTorque(true).Save(ctx)
}
}
// 工位 N 绑定工位 N 的默认流程
st, err := s.ctx.EntClient.Station.Query().Where(station.StationNo(i)).First(ctx)
if err != nil {
_, _ = s.ctx.EntClient.Station.Create().
SetStationNo(i).SetName("装配工位" + strconv.Itoa(i)).
SetFlowId(flow.ID).SetStatus("ENABLED").Save(ctx)
} else if st.FlowId == 0 {
_, _ = s.ctx.EntClient.Station.UpdateOneID(st.ID).SetFlowId(flow.ID).Save(ctx)
st, _ = s.ctx.EntClient.Station.Create().
SetStationNo(i).SetName("装配工位" + strconv.Itoa(i)).SetStatus("ENABLED").Save(ctx)
}
if st == nil || st.FlowId > 0 {
continue
}
flow, err := s.ctx.EntClient.ProcessFlow.Create().
SetName("工位" + strconv.Itoa(i) + "_默认").
SetStatus("ACTIVE").SetRemark("默认工艺流程").Save(ctx)
if err != nil {
continue
}
if _, err := s.ctx.EntClient.ProcessStep.Create().
SetFlowId(flow.ID).SetSeq(1).SetName("装配完成").SetCollectType("NONE").Save(ctx); err == nil && i == 3 {
_, _ = s.ctx.EntClient.ProcessStep.Create().
SetFlowId(flow.ID).SetSeq(2).SetName("拧紧扭矩").SetCollectType("AUTO").SetIsTorque(true).Save(ctx)
}
_, _ = s.ctx.EntClient.Station.UpdateOneID(st.ID).SetFlowId(flow.ID).Save(ctx)
}
}