本次提交覆盖多个业务模块的功能完善与体验优化:
1. **鉴权与配置调整**:
- 统一JWT滑动续签逻辑,简化Token存储,移除RefreshToken相关冗余代码
- 调整多项目配置文件中JWT过期时间为3600秒,统一会话闲置窗口
- 工位配置放开1~12限制,改为仅校验大于0
2. **术语统一替换**:全链路将"精密件"替换为"电气件",修正物料管理描述
3. **功能新增**:
- 新增工位类型、工艺路线与产线点位台账模块
- 添加工艺PDF预览面板、工位终端代理转发接口
- 新增操作日志按操作人列表筛选、工位登出日志记录
- 新增PLC移料指令与产线点位状态管理
4. **业务流程优化**:
- 调整BOM物料删除校验逻辑,优化工单备料计算
- 补充物料图号、检测单号等追溯字段
- 完善工艺流程图与工位绑定关系说明
- 优化前端页面文案与交互细节
5. **代码规范与维护**:
- 新增通用工具函数与前端静态资源
- 整理路由权限与中间件逻辑
- 修复部分接口与配置的不兼容问题
189 lines
5.0 KiB
Go
189 lines
5.0 KiB
Go
package db
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"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
|
||
isBatch, isSerial bool
|
||
}{
|
||
{"GJ-BAN-001", "10mm钢板(结构件)", "2000x1000x10", "张", 1, true, false},
|
||
{"GJ-GANGGUAN-002", "无缝钢管114x8", "114x8x6000", "根", 1, true, false},
|
||
{"LJ-LUOSI-M16", "M16高强度螺栓", "M16x80 10.9级", "件", 1, true, false},
|
||
{"JM-ZHOUCHENG-6020", "精密轴承6020", "6020-2RS", "套", 2, false, true},
|
||
{"JM-DIANJI-750W", "伺服电机750W", "ECMA-C21307", "台", 2, false, true},
|
||
{"BCP-JIEKOUTI", "接驳体半成品", "-", "件", 2, 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).
|
||
SaveX(ctx)
|
||
}
|
||
|
||
// 演示库存(统一 inventory 表,manage_mode 区分结构件/电气件)
|
||
today := time.Now().Format("2006-01-02")
|
||
// 结构件批次(已检合格)
|
||
client.Inventory.Create().
|
||
SetManageMode(1).
|
||
SetMaterialCode("GJ-BAN-001").
|
||
SetNillableMaterialName(strPtrNil("10mm钢板(结构件)")).
|
||
SetBatchNo("B2026060100001").
|
||
SetQuantity(120).SetLockedQty(0).
|
||
SetNillableProductionDate(strPtrNil("2026-06-01")).
|
||
SetNillableSupplier(strPtrNil("宝钢供应商")).
|
||
SetQualityStatus("合格").
|
||
SetNillableZoneCode(strPtrNil("Z02")).
|
||
SetStatus("在库").
|
||
SaveX(ctx)
|
||
client.Inventory.Create().
|
||
SetManageMode(1).
|
||
SetMaterialCode("GJ-GANGGUAN-002").
|
||
SetNillableMaterialName(strPtrNil("无缝钢管114x8")).
|
||
SetBatchNo("B2026060200034").
|
||
SetQuantity(50).SetLockedQty(0).
|
||
SetNillableProductionDate(strPtrNil(today)).
|
||
SetNillableSupplier(strPtrNil("天津钢管")).
|
||
SetQualityStatus("未检").
|
||
SetNillableZoneCode(strPtrNil("Z01")).
|
||
SetStatus("在库").
|
||
SaveX(ctx)
|
||
|
||
// 电气件 SN(在库,合格)
|
||
for i := 1; i <= 5; i++ {
|
||
client.Inventory.Create().
|
||
SetManageMode(2).
|
||
SetMaterialCode("JM-ZHOUCHENG-6020").
|
||
SetNillableMaterialName(strPtrNil("精密轴承6020")).
|
||
SetSnCode("SN20260601001" + itoaPad(i)).
|
||
SetQuantity(1).SetLockedQty(0).
|
||
SetQualityStatus("合格").
|
||
SetNillableZoneCode(strPtrNil("Z02")).
|
||
SetStatus("在库").
|
||
SaveX(ctx)
|
||
}
|
||
slog.Info("seed: demo materials & stock created")
|
||
}
|
||
|
||
// 4. 接驳台主数据 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
|
||
}
|
||
|
||
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))
|
||
}
|