package db import ( "context" "fmt" "log/slog" "bj_power_wms/ent" "golang.org/x/crypto/bcrypt" ) // SeedIfEmpty 首次启动/重置后预置「系统运行必需的基础主数据」,不含任何演示业务数据。 // // 生产环境口径(用户裁决 2026-09-20):种子只允许写入系统跑起来所必需的固定主数据, // 严禁预置演示物料/演示库存/演示账号等假业务数据。具体: // - 管理员账号:admin(初始密码 123456,登录后应立即修改);其余账号由管理员在「账号管理」按需创建、分配角色; // - 接驳台:DOCK01~20(产线,DOCKn↔工位n)+ DOCK21(库房收货),系统预置只读主数据(dock.go 不提供增删改,只能靠种子写入)。 // // 不预置区域/库位:区域是现场库房布局,因项目而异,且「区域维护」页面可增删改,由实施按现场实际建立,不硬编码进种子。 // 权限与角色不在此:由 handler.SeedRBAC 幂等初始化(reset-all/seed 命令与 POST /api/rbac/seed 共用同一函数)。 func SeedIfEmpty(client *ent.Client) error { ctx := context.Background() // 1. 管理员账号(唯一预置账号;初始密码 123456,登录后应立即修改) users, _ := client.User.Query().Count(ctx) if users == 0 { adminHash, _ := bcrypt.GenerateFromPassword([]byte("123456"), bcrypt.DefaultCost) client.User.Create(). SetUsername("admin"). SetPassword(string(adminHash)). SetRealName("系统管理员"). SetRole("admin"). SaveX(ctx) slog.Info("seed: admin user created (admin/123456)") } // 2. 接驳台主数据 DOCK01~20(产线, DOCKn↔工位n) + DOCK21(库房) docks, _ := client.Dock.Query().Count(ctx) if docks == 0 { for i := 1; i <= 20; i++ { code := fmt.Sprintf("DOCK%02d", i) client.Dock.Create(). SetDockCode(code). SetName("产线接驳台 " + code + "(工位" + fmt.Sprintf("%d", i) + ")"). SetDockType("line"). SetStationNo(i). SetHasPallet(false). SetStatus("ENABLED"). SaveX(ctx) } client.Dock.Create(). SetDockCode("DOCK21"). SetName("库房收货接驳台"). SetDockType("store"). SetStationNo(0). SetHasPallet(false). SetStatus("ENABLED"). SaveX(ctx) slog.Info("seed: 21 docks created") } return nil }