chore: 批量完成项目多模块迭代优化

1. 废弃半成品库存表并统一库存主表
2. 修复列表排序与搜索大小写不敏感问题
3. 新增用户最近登录时间、工单BOM名称字段
4. 完善角色管理、工位选择器功能
5. 增加拧紧数据补录、成品自动回流WMS能力
6. 统一导出时间范围校验规则
7. 丰富物料/备料单筛选条件
8. 调整菜单与权限命名适配产品型号业务
This commit is contained in:
SunYF
2026-09-08 11:44:04 +08:00
parent 06689970e2
commit e852c7cd37
96 changed files with 4528 additions and 542 deletions
+17 -1
View File
@@ -22,15 +22,26 @@ import (
// 可用量 = quantity - locked_qty(锁定时为 0)。
//
// 区域(zone_code)只到 Z01~Z04 大分区级别,不引入货架/层/格(业务决策:小货架高频取货场景无需精确货位索引)。
// 半成品(semifinished)是独立的固定业务类型,不进本表(由 MES 报工闭环单独管理)。
// 统一收编(2026-09-07 定稿):半成品/成品也进本表(category 区分品类),废除独立 semi_finisheds 孤表;
// 成品由 MES 完工发码后经内部接口自动回流入库,成品 SN 与实物码解耦(系统必发号,实物可不贴码,允许手填覆盖)。
type Inventory struct {
ent.Schema
}
// 品类(category):1=原材料 2=半成品 3=成品。与 manage_mode 正交:
// manage_mode 管"怎么管"(批次数量 vs SN 单件),category 管"是什么"(原料/半成品/成品)。
const (
InvCategoryRaw = 1
InvCategorySemi = 2
InvCategoryFinished = 3
)
func (Inventory) Fields() []ent.Field {
return []ent.Field{
// 管理粒度:1=结构件(批次) 2=精密件(SN)。决定本行按"数量"还是按"单件"解释。
field.Int("manage_mode").Comment("管理粒度 1=结构件(批次) 2=精密件(SN)"),
// 品类:1=原材料 2=半成品 3=成品(统一库存主表收编 semi_finished 后新增)
field.Int("category").Default(InvCategoryRaw).Comment("品类 1=原材料 2=半成品 3=成品"),
// 物料编码,关联 materials 主数据。
field.String("material_code").Comment("物料编码(关联 materials 表)"),
@@ -63,6 +74,10 @@ func (Inventory) Fields() []ent.Field {
field.String("supplier").Optional().Comment("供应商"),
// 关联入库单号,便于正向追溯。
field.String("inbound_no").Optional().Comment("关联入库单号"),
// 关联工单号(半成品流转/成品完工回流时由 MES 传入)。
field.String("order_no").Default("").MaxLen(64).Comment("关联工单号(半成品/成品回流)"),
// 已完成工序(半成品暂存回流用,如 135)。
field.String("completed_process").Default("").MaxLen(64).Comment("已完成工序(半成品用,如 135)"),
// 备注。
field.String("remark").Optional().Comment("备注"),
@@ -74,6 +89,7 @@ func (Inventory) Fields() []ent.Field {
func (Inventory) Indexes() []ent.Index {
return []ent.Index{
index.Fields("manage_mode"),
index.Fields("category"),
index.Fields("material_code"),
index.Fields("quality_status"),
index.Fields("zone_code"),
+9 -2
View File
@@ -11,8 +11,10 @@ import (
// 管理粒度由 manage_mode 决定,贯穿整个库存链路:
// - manage_mode=1 结构件:按"批次"管理,一次到货入一批,库存以 quantity 计数;
// - manage_mode=2 精密件:按"SN 序列号"逐件管理,库存以单件行计数,可单件追溯。
// 注意:物料档案只描述"这个物料是什么、怎么管",不承载生命周期状态
// (原材料→半成品→成品的阶段由各自库存实体/inventory 表承载,不在此预判)。
// 品类由 item_type 区分(与库存主表 inventories.category 对应):
// - item_type=1 原材料 / 2 半成品 / 3 成品(成品即"产品型号"档案,MES 实时从本表拉取,
// 消除两系统双录——2026-09-08 并表定稿)。
// 注意:物料档案只描述"这个物料是什么、怎么管",不承载生命周期状态。
type Material struct {
ent.Schema
}
@@ -25,12 +27,16 @@ func (Material) Fields() []ent.Field {
field.String("spec").Optional().Comment("规格型号"),
field.String("unit").Optional().Comment("单位"),
field.String("description").Optional().Comment("描述"),
// 品类:1=原材料 2=半成品 3=成品(成品=产品型号档案)
field.Int("item_type").Default(1).Comment("品类 1原材料/2半成品/3成品"),
// 管理粒度:1=批次管理(结构件) 2=序列号管理(精密件)
field.Int("manage_mode").Default(1).Comment("管理粒度 1批次/2序列号"),
field.Bool("is_batch_managed").Default(false).Comment("是否批次管理"),
field.Bool("is_serial_managed").Default(false).Comment("是否序列号管理"),
// 所属物料模板(种类)
field.String("template_code").Optional().Comment("物料模板编码(物料种类)"),
// 启用状态:停用后不在新建工单/备料下拉出现(对齐 MES 产品型号 isActive
field.Bool("is_active").Default(true).Comment("是否启用"),
field.Int64("created_at").DefaultFunc(nowUnix).Comment("创建时间"),
field.Int64("updated_at").DefaultFunc(nowUnix).Comment("更新时间"),
}
@@ -40,5 +46,6 @@ func (Material) Indexes() []ent.Index {
return []ent.Index{
index.Fields("name"),
index.Fields("template_code"),
index.Fields("item_type"),
}
}
+2
View File
@@ -7,6 +7,8 @@ import (
)
// SemiFinished 半成品库存
// 【已废弃 2026-09-07】半成品已收编进统一库存主表 inventoriescategory=2),
// 本表仅保留历史数据(存量已迁移),新代码一律读写 inventories,禁止再写本表。
// 记录已完成工序,支持流转
type SemiFinished struct {
ent.Schema