本次提交覆盖多个业务模块的功能完善与体验优化:
1. **鉴权与配置调整**:
- 统一JWT滑动续签逻辑,简化Token存储,移除RefreshToken相关冗余代码
- 调整多项目配置文件中JWT过期时间为3600秒,统一会话闲置窗口
- 工位配置放开1~12限制,改为仅校验大于0
2. **术语统一替换**:全链路将"精密件"替换为"电气件",修正物料管理描述
3. **功能新增**:
- 新增工位类型、工艺路线与产线点位台账模块
- 添加工艺PDF预览面板、工位终端代理转发接口
- 新增操作日志按操作人列表筛选、工位登出日志记录
- 新增PLC移料指令与产线点位状态管理
4. **业务流程优化**:
- 调整BOM物料删除校验逻辑,优化工单备料计算
- 补充物料图号、检测单号等追溯字段
- 完善工艺流程图与工位绑定关系说明
- 优化前端页面文案与交互细节
5. **代码规范与维护**:
- 新增通用工具函数与前端静态资源
- 整理路由权限与中间件逻辑
- 修复部分接口与配置的不兼容问题
100 lines
5.0 KiB
Go
100 lines
5.0 KiB
Go
package schema
|
||
|
||
import (
|
||
"entgo.io/ent"
|
||
"entgo.io/ent/schema/field"
|
||
"entgo.io/ent/schema/index"
|
||
)
|
||
|
||
// Inventory 统一库存台账
|
||
//
|
||
// 业务背景:原系统把库存拆成「结构件批次(inventory_batch)」与「电气件序列号(serial_number)」
|
||
// 两张表,导致 锁库存 / 导出 / 汇总 都要分别写两套逻辑,运维成本高且容易不一致。
|
||
// 现合并为一张表,用 manage_mode 区分管理粒度,对外提供统一的 锁/查询/汇总/盘点 能力。
|
||
//
|
||
// 两种管理粒度的存储约定:
|
||
// - manage_mode = 1 结构件(批次管理):
|
||
// 一条记录 = 一个批次,quantity 表示该批次当前余量,locked_qty 表示已锁定件数。
|
||
// 可用量 = quantity - locked_qty。出库/盘点都按"数量"增减。
|
||
// - manage_mode = 2 电气件(SN 管理):
|
||
// 一条记录 = 一个单件(SN),quantity 恒为 1,locked_qty 为 0 或 1(锁定时=1)。
|
||
// 生命周期用 status 字段跟踪:在库/锁定/出库/使用/报废。
|
||
// 可用量 = quantity - locked_qty(锁定时为 0)。
|
||
//
|
||
// 区域(zone_code)只到 Z01~Z04 大分区级别,不引入货架/层/格(业务决策:小货架高频取货场景无需精确货位索引)。
|
||
// 统一收编(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 表)"),
|
||
// 物料名称冗余存储,查询时无需再 join 主数据。
|
||
field.String("material_name").Optional().Comment("物料名称(冗余,便于直接展示)"),
|
||
|
||
// 批次号:结构件必填(系统生成);电气件可填所属批次用于分组追溯。
|
||
field.String("batch_no").Optional().Comment("批次号(系统生成);电气件可关联所属批次"),
|
||
// 序列号:仅电气件填写,作为单件唯一追溯锚点。空字符串不保证唯一,由代码层查重。
|
||
field.String("sn_code").Optional().Comment("序列号(SN,仅电气件);空值表示非 SN 行"),
|
||
|
||
// 数量:结构件=批次余量;电气件恒为 1。
|
||
field.Int("quantity").Default(0).Comment("数量:结构件=批次余量;电气件=1"),
|
||
// 已锁定数量:结构件=锁定件数;电气件=0或1。可用量 = quantity - locked_qty。
|
||
field.Int("locked_qty").Default(0).Comment("已锁定数量(库存占用):结构件=件数;电气件=0/1"),
|
||
|
||
// 检验状态,由质量检验模块翻转。
|
||
field.String("quality_status").Default("未检").Comment("检验状态 未检/合格/不合格"),
|
||
// 所在区域(大分区)。
|
||
field.String("zone_code").Optional().Comment("所在区域(Z01~Z04 大分区)"),
|
||
|
||
// 生命周期状态:
|
||
// 结构件一律"在库"(锁定看 locked_qty,不靠本字段);
|
||
// 电气件随业务流转:在库/锁定/出库/使用/报废。
|
||
field.String("status").Default("在库").Comment("生命周期:在库/锁定/出库/使用/报废(电气件用;结构件恒在库)"),
|
||
|
||
// 生产日期(结构件批次用)。
|
||
field.String("production_date").Optional().Comment("生产日期"),
|
||
// 供应商(结构件批次用)。
|
||
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("备注"),
|
||
|
||
field.Int64("created_at").DefaultFunc(nowUnix),
|
||
field.Int64("updated_at").DefaultFunc(nowUnix),
|
||
}
|
||
}
|
||
|
||
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"),
|
||
index.Fields("batch_no"),
|
||
index.Fields("sn_code"),
|
||
}
|
||
}
|