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
+27 -6
View File
@@ -198,9 +198,14 @@ func createUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
}
role := roleOrDefault(req.Role)
// role 字符串与 role_id 用同一角色语义:优先 role_id(数据化),否则按字符串回退。
// 若用户给的是 role_code,尝试从 roles 表反查 role_id。
// 显式给 role_id 时回填 role 字符串为该角色实际 code(前端 UserManage 只传 roleId,避免 role 落成 operator);
// 只给 role_code 时反查 roles 表补 role_id。
roleID := req.RoleID
if roleID == 0 {
if roleID > 0 {
if rl, err := ctx.EntClient.Role.Get(ctx0(), roleID); err == nil {
role = rl.Code
}
} else if role != "" {
if rl, err := ctx.EntClient.Role.Query().Where(userrole.CodeEQ(role)).Only(ctx0()); err == nil {
roleID = rl.ID
}
@@ -217,6 +222,8 @@ func createUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
fail(w, http.StatusInternalServerError, err.Error())
return
}
ctx.EventLog.Write(ctx0(), "user.create", r.Header.Get("X-Username"), "user", strconv.Itoa(u.ID),
"新建账号 "+u.Username, map[string]any{"roleId": roleID, "dept": req.Dept})
ok(w, userDTO(u))
})
}
@@ -251,11 +258,17 @@ func updateUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
if req.RealName != "" {
upd.SetRealName(req.RealName)
}
if req.Role != "" {
upd.SetRole(roleOrDefault(req.Role))
}
if req.RoleID > 0 {
upd.SetRoleID(req.RoleID)
// 显式给 role_id:同步回填 role 字符串为该角色实际 code,避免双字段不一致
if rl, err := ctx.EntClient.Role.Get(ctx0(), req.RoleID); err == nil {
upd.SetRole(rl.Code).SetRoleID(rl.ID)
}
} else if req.Role != "" {
role := roleOrDefault(req.Role)
upd.SetRole(role)
if rl, err := ctx.EntClient.Role.Query().Where(userrole.CodeEQ(role)).Only(ctx0()); err == nil {
upd.SetRoleID(rl.ID)
}
}
if req.Dept != "" {
upd.SetNillableDept(strPtr(req.Dept))
@@ -281,6 +294,12 @@ func updateUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
fail(w, http.StatusInternalServerError, err.Error())
return
}
ctx.EventLog.Write(ctx0(), "user.update", r.Header.Get("X-Username"), "user", strconv.Itoa(u.ID),
"编辑账号 "+target.Username, map[string]any{
"resetPassword": req.Password != "",
"isActive": req.IsActive != nil,
"changedRole": req.Role != "" || req.RoleID > 0,
})
ok(w, userDTO(u))
})
}
@@ -322,6 +341,8 @@ func deleteUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
fail(w, http.StatusInternalServerError, err.Error())
return
}
ctx.EventLog.Write(ctx0(), "user.delete", r.Header.Get("X-Username"), "user", strconv.Itoa(req.ID),
"删除账号 "+target.Username, map[string]any{"role": target.Role})
ok(w, nil)
})
}