add a powershell script that supports starting MES, WMS, WMSClient, Workstation and Dashboard projects with one command, includes build and run logic for backend services and npm dev for dashboard
101 lines
3.7 KiB
Go
101 lines
3.7 KiB
Go
package logic
|
|
|
|
import (
|
|
"context"
|
|
|
|
"bj_power_mes/ent/permission"
|
|
"bj_power_mes/ent/processstep"
|
|
"bj_power_mes/ent/role"
|
|
"bj_power_mes/ent/stationprocess"
|
|
"bj_power_mes/ent/user"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
// Seed 初始化:超级管理员、默认角色、默认菜单权限、12 道工序与工位派工
|
|
func (s *Service) Seed(ctx context.Context) error {
|
|
// 1. 默认角色
|
|
roles := []struct{ name, code string }{
|
|
{"超级管理员", "SUPER_ADMIN"},
|
|
{"生产操作员", "OPERATOR"},
|
|
{"质检员", "INSPECTOR"},
|
|
}
|
|
for _, r := range roles {
|
|
if s.ctx.EntClient.Role.Query().Where(role.Code(r.code)).ExistX(ctx) {
|
|
continue
|
|
}
|
|
codes := []string{"*"}
|
|
if r.code == "OPERATOR" {
|
|
codes = []string{"produce.workorder", "produce.bom", "produce.material", "produce.scan", "produce.trace", "produce.torque", "produce.plc", "produce.product"}
|
|
} else if r.code == "INSPECTOR" {
|
|
codes = []string{"produce.trace", "produce.torque", "sys.eventlog"}
|
|
}
|
|
_ = s.ctx.EntClient.Role.Create().SetName(r.name).SetCode(r.code).SetPermissionCodes(codes).Exec(ctx)
|
|
}
|
|
|
|
// 2. 超级管理员账号 admin / Hardman_2026(对已存在的旧行做对齐,避免残留禁用状态)
|
|
hash, _ := bcrypt.GenerateFromPassword([]byte("Hardman_2026"), bcrypt.DefaultCost)
|
|
adminRole, _ := s.ctx.EntClient.Role.Query().Where(role.Code("SUPER_ADMIN")).First(ctx)
|
|
roleId := 0
|
|
if adminRole != nil {
|
|
roleId = adminRole.ID
|
|
}
|
|
if s.ctx.EntClient.User.Query().Where(user.Username("admin")).ExistX(ctx) {
|
|
_ = s.ctx.EntClient.User.Update().
|
|
Where(user.Username("admin")).
|
|
SetPassword(string(hash)).SetStatus("ENABLED").SetRoleId(roleId).Exec(ctx)
|
|
} else {
|
|
_ = s.ctx.EntClient.User.Create().
|
|
SetUsername("admin").SetPassword(string(hash)).SetName("系统管理员").
|
|
SetRoleId(roleId).SetStatus("ENABLED").Exec(ctx)
|
|
}
|
|
|
|
// 3. 默认菜单权限
|
|
menus := []struct{ code, name, typ, path string }{
|
|
{"produce.workorder", "工单管理", "MENU", "/work-order"},
|
|
{"produce.bom", "BOM", "MENU", "/bom"},
|
|
{"produce.material", "备料单", "MENU", "/material-request"},
|
|
{"produce.plc", "PLC工序下发", "MENU", "/plc-send"},
|
|
{"produce.torque", "拧紧查询", "MENU", "/torque"},
|
|
{"produce.scan", "扫码报工", "MENU", "/scan"},
|
|
{"produce.trace", "工件追溯", "MENU", "/trace"},
|
|
{"produce.product", "产品类型", "MENU", "/product-type"},
|
|
{"sys.eventlog", "操作日志", "MENU", "/event-log"},
|
|
{"sys.rbac", "角色权限管理", "MENU", "/rbac"},
|
|
}
|
|
for _, m := range menus {
|
|
if s.ctx.EntClient.Permission.Query().Where(permission.Code(m.code)).ExistX(ctx) {
|
|
continue
|
|
}
|
|
_ = s.ctx.EntClient.Permission.Create().
|
|
SetCode(m.code).SetName(m.name).SetType(m.typ).SetPath(m.path).Exec(ctx)
|
|
}
|
|
|
|
// 4. 12 道工序步骤模板(每道工序一个"装配完成"步骤 + 拧紧台阶步骤)
|
|
seedProcessSteps(ctx, s)
|
|
// 5. 12 工位 ↔ 工序 派工(工位N 默认做工序N)
|
|
for i := 1; i <= 12; i++ {
|
|
if s.ctx.EntClient.StationProcess.Query().Where(stationprocess.StationNo(i), stationprocess.ProcessCode(i)).ExistX(ctx) {
|
|
continue
|
|
}
|
|
_ = s.ctx.EntClient.StationProcess.Create().
|
|
SetStationNo(i).SetProcessCode(i).SetEffectDate("").Exec(ctx)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func seedProcessSteps(ctx context.Context, s *Service) {
|
|
for i := 1; i <= 12; i++ {
|
|
cnt, _ := s.ctx.EntClient.ProcessStep.Query().Where(processstep.ProcessCode(i)).Count(ctx)
|
|
if cnt > 0 {
|
|
continue
|
|
}
|
|
_ = s.ctx.EntClient.ProcessStep.Create().
|
|
SetProcessCode(i).SetSeq(1).SetName("装配完成").SetCollectType("NONE").Exec(ctx)
|
|
if i == 3 { // 示例:工序3 增加一个拧紧采集步骤
|
|
_ = s.ctx.EntClient.ProcessStep.Create().
|
|
SetProcessCode(3).SetSeq(2).SetName("拧紧扭矩").SetCollectType("AUTO").SetIsTorque(true).Exec(ctx)
|
|
}
|
|
}
|
|
}
|