Files
bj_power/bj_power_wms/internal/db/seed.go
T
SunYF ebf901ad16 chore: 完成多系统功能迭代与优化
1. 通用优化:
   - 统一系统标题为"库房客户端"/"MES产线控制",移除北自所前缀
   - 调整内置账号密码为统一123456,优化密码校验逻辑
   - 新增数据库自动创建逻辑,简化部署流程
   - 修复日志时间格式配置,优化日志输出
   - 新增纯数字密码安全提示

2. MES系统优化:
   - 新增日排产管理功能,支持增删改查与自动算料生成备料单
   - 重构BOM模块,改为按产品编码维护而非工单维度
   - 新增工艺参数模板配置与手动报工页面
   - 新增产品类型自动编码功能
   - 优化菜单结构,调整工单管理、扫码报工等页面名称与路由
   - 新增删除日排产接口与权限保护
   - 修复物料清单查询逻辑,适配新BOM结构
   - 新增refreshToken支持,优化登录会话管理

3. WMS系统优化:
   - 新增基础数据维护页面,支持区域与物料档案管理
   - 新增工单列表下拉接口,对接MES获取未完成工单优先展示
   - 优化入库管理提示文案,替换英文提示为中文
   - 修复精密件入库校验逻辑,优化错误提示
   - 优化Excel导入功能,新增备注字段支持
   - 优化登录页面与菜单文案,统一备料台账名称
   - 新增自动打开浏览器功能,优化客户端启动体验
   - 修复备料出库页面查询提示文案
   - 新增WMS与MES对接配置,完善内部API调用逻辑

4. 其他优化:
   - 删除冗余的旧版静态资源文件,更新资源引用路径
   - 新增帮助文档,完善基础数据模块说明
   - 修复多处文案不统一、英文残留问题
2026-08-29 15:30:25 +08:00

158 lines
4.2 KiB
Go

package db
import (
"context"
"log/slog"
"time"
"bj_power_wms/ent"
"golang.org/x/crypto/bcrypt"
)
// SeedIfEmpty 首次启动时预置基础数据(区域/账号/演示物料与库存)
func SeedIfEmpty(client *ent.Client) error {
ctx := context.Background()
// 1. 区域
zones, _ := client.Zone.Query().Count(ctx)
if zones == 0 {
for _, z := range []struct{ code, name string }{
{"Z01", "待检区"},
{"Z02", "合格品区"},
{"Z03", "不合格品区"},
{"Z04", "退货区"},
} {
client.Zone.Create().
SetZoneCode(z.code).
SetZoneName(z.name).
SaveX(ctx)
}
slog.Info("seed: zones created")
}
// 2. 账号(全部统一初始密码 123456)
users, _ := client.User.Query().Count(ctx)
if users == 0 {
adminHash, _ := bcrypt.GenerateFromPassword([]byte("123456"), bcrypt.DefaultCost)
opHash, _ := bcrypt.GenerateFromPassword([]byte("123456"), bcrypt.DefaultCost)
client.User.Create().
SetUsername("admin").
SetPassword(string(adminHash)).
SetRealName("系统管理员").
SetRole("admin").
SaveX(ctx)
client.User.Create().
SetUsername("store1").
SetPassword(string(opHash)).
SetRealName("一号库房保管员").
SetRole("operator").
SetDept("库房").
SaveX(ctx)
client.User.Create().
SetUsername("insp1").
SetPassword(string(opHash)).
SetRealName("质检员一号").
SetRole("inspector").
SetDept("质检").
SaveX(ctx)
slog.Info("seed: users created (admin/123456, store1/123456, insp1/123456)")
}
// 3. 演示物料与库存
materials, _ := client.Material.Query().Count(ctx)
if materials == 0 {
mats := []struct {
code, name, spec, unit string
mode int
mtype string
isBatch, isSerial bool
}{
{"GJ-BAN-001", "10mm钢板(结构件)", "2000x1000x10", "张", 1, "raw", true, false},
{"GJ-GANGGUAN-002", "无缝钢管114x8", "114x8x6000", "根", 1, "raw", true, false},
{"LJ-LUOSI-M16", "M16高强度螺栓", "M16x80 10.9级", "件", 1, "raw", true, false},
{"JM-ZHOUCHENG-6020", "精密轴承6020", "6020-2RS", "套", 2, "raw", false, true},
{"JM-DIANJI-750W", "伺服电机750W", "ECMA-C21307", "台", 2, "raw", false, true},
{"BCP-JIEKOUTI", "接驳体半成品", "-", "件", 2, "semi", false, true},
}
for _, m := range mats {
client.Material.Create().
SetCode(m.code).
SetName(m.name).
SetNillableSpec(strPtrNil(m.spec)).
SetNillableUnit(strPtrNil(m.unit)).
SetManageMode(m.mode).
SetIsBatchManaged(m.isBatch).
SetIsSerialManaged(m.isSerial).
SetMaterialType(m.mtype).
SaveX(ctx)
}
// 演示批次(已检合格)
today := time.Now().Format("2006-01-02")
client.InventoryBatch.Create().
SetBatchNo("B2026060100001").
SetMaterialCode("GJ-BAN-001").
SetNillableMaterialName(strPtrNil("10mm钢板(结构件)")).
SetQuantity(120).SetLockedQty(0).
SetNillableProductionDate(strPtrNil("2026-06-01")).
SetNillableSupplier(strPtrNil("宝钢供应商")).
SetQualityStatus("合格").
SetNillableZoneCode(strPtrNil("Z02")).
SaveX(ctx)
client.InventoryBatch.Create().
SetBatchNo("B2026060200034").
SetMaterialCode("GJ-GANGGUAN-002").
SetNillableMaterialName(strPtrNil("无缝钢管114x8")).
SetQuantity(50).SetLockedQty(0).
SetNillableProductionDate(strPtrNil(today)).
SetNillableSupplier(strPtrNil("天津钢管")).
SetQualityStatus("未检").
SetNillableZoneCode(strPtrNil("Z01")).
SaveX(ctx)
// 演示 SN(在库)
for i := 1; i <= 5; i++ {
sn := "SN20260601001" + time.Now().Format("02")
client.SerialNumber.Create().
SetSnCode(sn + itoaPad(i)).
SetMaterialCode("JM-ZHOUCHENG-6020").
SetStatus("在库").
SetQualityStatus("合格").
SetNillableCurrentZone(strPtrNil("Z02")).
SaveX(ctx)
}
slog.Info("seed: demo materials & stock created")
}
return nil
}
func strPtrNil(s string) *string {
if s == "" {
return nil
}
return &s
}
func itoaPad(n int) string {
base := "000"
return base[:len(base)-lenOfInt(n)] + intToStr(n)
}
func lenOfInt(n int) int {
c := 1
for n >= 10 {
n /= 10
c++
}
return c
}
func intToStr(n int) string {
if n < 10 {
return string(rune('0' + n))
}
return intToStr(n/10) + string(rune('0'+n%10))
}