feat: 完成产线MES系统全流程功能迭代与优化

本提交完成了多个核心模块的功能完善与业务对齐:
1. 工位终端:固定工位配置、移除自选工位逻辑、适配配置化工位号
2. MES核心:重构工位组合逻辑、新增工单/流程状态管理、补全报工/追溯逻辑
3. WMS客户端:新增修改密码功能、优化帮助弹窗逻辑
4. 文档与权限:补充完整操作手册、统一菜单名称与权限描述
5. 修复多业务校验:排产数量校验、工单状态校验、工位绑定规则
This commit is contained in:
SunYF
2026-08-31 12:58:28 +08:00
parent a3145a8bd6
commit ae4c292487
53 changed files with 1475 additions and 912 deletions
+49
View File
@@ -124,3 +124,52 @@ func roleOrDefault(r string) string {
return "operator"
}
}
// changePasswordHandler POST /api/user/change-password(需登录 JWT
// 当前登录用户修改自己的密码;登录人由中间件写入的 X-Username 头确定。
func changePasswordHandler(ctx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
username := strings.TrimSpace(r.Header.Get("X-Username"))
if username == "" {
fail(w, http.StatusUnauthorized, "未登录或登录状态缺失")
return
}
var req struct {
OldPassword string `json:"oldPassword"`
NewPassword string `json:"newPassword"`
}
if err := parseJSON(r, &req); err != nil {
fail(w, http.StatusBadRequest, "参数错误")
return
}
if req.OldPassword == "" || req.NewPassword == "" {
fail(w, http.StatusBadRequest, "请输入旧密码和新密码")
return
}
if len(req.NewPassword) < 6 {
fail(w, http.StatusBadRequest, "新密码长度至少 6 位")
return
}
u, err := ctx.EntClient.User.Query().
Where(user.UsernameEQ(username)).
Only(ctx0())
if err != nil {
fail(w, http.StatusNotFound, "用户不存在")
return
}
if bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(req.OldPassword)) != nil {
fail(w, http.StatusBadRequest, "旧密码不正确")
return
}
hash, err := bcrypt.GenerateFromPassword([]byte(req.NewPassword), bcrypt.DefaultCost)
if err != nil {
fail(w, http.StatusInternalServerError, "密码加密失败")
return
}
if err := ctx.EntClient.User.UpdateOneID(u.ID).SetPassword(string(hash)).Exec(ctx0()); err != nil {
fail(w, http.StatusInternalServerError, "密码保存失败")
return
}
ok(w, nil)
}
}
+7
View File
@@ -19,6 +19,13 @@ func RegisterHandlers(server *rest.Server, ctx *svc.ServiceContext) {
server.Use(authInterceptor(ctx))
// 当前登录用户(JWT 鉴权)
server.AddRoutes(
[]rest.Route{
{Method: http.MethodPost, Path: "/api/user/change-password", Handler: changePasswordHandler(ctx)},
},
)
// 物料档案
server.AddRoutes(
[]rest.Route{