feat: 完成多模块迭代更新

- 新增过程巡检按步骤上报、数量不符上报、工位退料功能
- 增加工单工程编号三级归属字段
- 新增物料安全库存与缺货预警
- 新增附件管理、退库单管理模块
- 优化生产看板展示逻辑与前端页面文案
- 清理冗余的工艺路线相关代码与备份文件
This commit is contained in:
SunYF
2026-09-15 16:37:39 +08:00
parent 951f3dfecd
commit 4a5e2d7bac
494 changed files with 24702 additions and 139223 deletions
+43
View File
@@ -0,0 +1,43 @@
package schema
import (
"entgo.io/ent"
"entgo.io/ent/schema/field"
"entgo.io/ent/schema/index"
)
// Attachment 附件(挂载在业务单据/档案上的文件)
//
// 客户诉求(问题记录 L30):"列表可以查看附件、上传附件"——入库单/物料档案/检验记录
// 都要能挂图纸 PDF、检验报告、成品资料。故用统一单表,biz_type 区分挂载对象:
//
// biz_type=inbound biz_id=入库单号(inbound_no)
// biz_type=material biz_id=物料编码(material.code)
// biz_type=inspection biz_id=检验记录ID(inspection_records.id)
// biz_type=semi biz_id=半成品 SN
// biz_type=outbound biz_id=出库单号
//
// 磁盘落盘约定:uploads/<uuid><ext>(纯 ASCII 文件名,避免中文 URL 编码问题),
// 原始文件名存 file_name,预览走静态路由 GET /uploads/:name。
type Attachment struct {
ent.Schema
}
func (Attachment) Fields() []ent.Field {
return []ent.Field{
field.String("biz_type").Comment("业务类型 inbound/material/inspection/semi/outbound"),
field.String("biz_id").Comment("业务对象标识(单号/编码/ID)"),
field.String("file_name").Comment("原始文件名(含扩展名)"),
field.String("file_path").Comment("磁盘相对文件名(uuid+ext)"),
field.Int64("file_size").Default(0).Comment("文件大小(字节)"),
field.String("mime_type").Optional().Comment("MIME 类型"),
field.String("uploaded_by").Optional().Comment("上传人"),
field.Int64("created_at").DefaultFunc(nowUnix),
}
}
func (Attachment) Indexes() []ent.Index {
return []ent.Index{
index.Fields("biz_type", "biz_id"),
}
}
+6 -2
View File
@@ -14,8 +14,8 @@ type InboundOrder struct {
func (InboundOrder) Fields() []ent.Field {
return []ent.Field{
field.String("inbound_no").Unique().Comment("入库单号"),
// 类型:purchase(采购) semi(半成品) finished(成品) return(退货)
field.String("inbound_type").Default("purchase").Comment("入库类型"),
// 类型:purchase(采购/结构件) semi(半成品) finished(成品) return(退货) other(其他入库)
field.String("inbound_type").Default("purchase").Comment("入库类型 purchase/semi/finished/return/other"),
field.String("material_code").Comment("物料编码"),
field.String("material_name").Optional().Comment("物料名称(冗余)"),
// 管理粒度 1批次(结构件)/2序列号(电气件),冗余自物料档案,便于单单据直接判断
@@ -27,6 +27,10 @@ func (InboundOrder) Fields() []ent.Field {
field.String("remark").Optional().Comment("备注"),
// 检测单号:入库检报告单号,必填以闭环质量追溯
field.String("inspection_no").Comment("检测单号(入库检报告单号)"),
// 归属(客户诉求 问题记录 L54:入库记录增加 工单号/科技项目号/无)
// ownership_type: workorder(工单号) / project(科技项目号) / none(无)
field.String("ownership_type").Default("none").Comment("归属类型 workorder/project/none"),
field.String("ownership_no").Optional().Comment("归属编号(工单号/科技项目号)"),
field.Int64("created_at").DefaultFunc(nowUnix).Comment("创建时间"),
}
}
+5
View File
@@ -31,6 +31,11 @@ func (InspectionRecord) Fields() []ent.Field {
// 检测单号:对应的检验报告单号(与入库单检测单号关联)
field.String("inspection_no").Optional().Comment("检测单号(检验报告单号)"),
field.String("report_no").Optional().Comment("报检单号(生产报检关联)"),
// 不合格品处置(客户诉求 问题记录 L135-145:不合格不入库、不上产线,仅合格品计入库存数量)
// NONE=不适用(合格或未判定) / RETURN=退货 / SCRAP=报废 / PARTIAL=部分入库(合格数入库、不合格数退或废)
field.String("disposal_type").Default("NONE").Comment("不合格处置 NONE/RETURN/SCRAP/PARTIAL"),
field.String("disposal_remark").Optional().Comment("处置说明(报废/退货原因)"),
field.String("return_tracking_no").Optional().Comment("退货货运单号"),
field.String("remark").Optional().Comment("备注"),
field.Int64("created_at").DefaultFunc(nowUnix),
field.Int64("updated_at").DefaultFunc(nowUnix),
+4 -2
View File
@@ -27,8 +27,8 @@ 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=半成品 3=成品 4=其他(辅料/工装/试验设备,客户诉求 问题记录 L50
field.Int("item_type").Default(1).Comment("品类 1原材料/2半成品/3成品/4其他"),
// 管理粒度:1=批次管理(结构件) 2=序列号管理(电气件)
field.Int("manage_mode").Default(1).Comment("管理粒度 1批次/2序列号"),
field.Bool("is_batch_managed").Default(false).Comment("是否批次管理"),
@@ -37,6 +37,8 @@ func (Material) Fields() []ent.Field {
field.String("template_code").Optional().Comment("物料模板编码(物料种类)"),
// 图号(零件图纸编号,用于装配定位与追溯,可选)
field.String("drawing_no").Optional().Comment("图号(图纸编号)"),
// 安全库存:低于该值触发缺货预警(客户诉求 问题记录 L473:安全库存/缺货预警进 WMS 首页)
field.Int("safety_stock").Default(0).Comment("安全库存(低于则缺货预警,0=不预警)"),
// 启用状态:停用后不在新建工单/备料下拉出现(对齐 MES 产品型号 isActive
field.Bool("is_active").Default(true).Comment("是否启用"),
field.Int64("created_at").DefaultFunc(nowUnix).Comment("创建时间"),
@@ -21,6 +21,8 @@ func (OrderMaterialLedger) Fields() []ent.Field {
field.Int("total_qty").Default(0).Comment("物料总需求数量"),
field.Int("out_qty").Default(0).Comment("累计已出库数量"),
field.String("status").Default("进行中").Comment("进行中/领料完结"),
// 目标工位:备料送到哪个装配工位(客户诉求 L297-300;MES 同步台账时传入)
field.String("target_station").Optional().Comment("目标工位(装配工位号)"),
field.String("remark").Optional().Comment("备注"),
field.Int64("created_at").DefaultFunc(nowUnix),
field.Int64("updated_at").DefaultFunc(nowUnix),
+45
View File
@@ -0,0 +1,45 @@
package schema
import (
"entgo.io/ent"
"entgo.io/ent/schema/field"
"entgo.io/ent/schema/index"
)
// ReturnOrder 退库单(客户诉求 问题记录 L488/L491):
// 工位将原材料退给库房 → MES 调用本内部接口预建「待确认收货」退库单 →
// WMS 库管在「退库单」页确认收货,库存加回,链路封闭。
type ReturnOrder struct {
ent.Schema
}
func (ReturnOrder) Fields() []ent.Field {
return []ent.Field{
field.String("return_no").Unique().Comment("退库单号"),
field.String("source_type").Default("station").Comment("来源 station=工位退库"),
field.String("order_no").Default("").Comment("关联工单号"),
field.Int("station_no").Default(0).Comment("退库工位号"),
field.String("sn").Default("").Comment("工件SN(可空)"),
field.String("material_code").Comment("物料编码"),
field.String("material_name").Optional().Comment("物料名称(冗余)"),
field.String("spec").Optional().Comment("规格"),
field.Int("qty").Default(0).Comment("退库数量"),
field.String("unit").Default("").Comment("单位"),
field.String("reason").Default("").Comment("退库原因"),
// 待确认 PENDING / 已收货 RECEIVED
field.String("status").Default("PENDING").Comment("PENDING/RECEIVED"),
field.String("operator").Default("").Comment("退库发起人(工位终端操作人)"),
field.String("receive_by").Default("").Comment("WMS 确认收货人"),
field.Int64("created_at").DefaultFunc(nowUnix).Comment("创建时间"),
field.Int64("receive_at").Default(0).Comment("确认收货时间"),
}
}
func (ReturnOrder) Indexes() []ent.Index {
return []ent.Index{
index.Fields("status"),
index.Fields("order_no"),
index.Fields("station_no"),
index.Fields("material_code"),
}
}
+10 -4
View File
@@ -5,10 +5,10 @@ import (
"entgo.io/ent/schema/field"
)
// Zone 库房区域(大分区)
// 仅作为"大分区"维度(如 待检区/标准存储区/暂存区/退货区),编码 Z01~Z04。
// 业务决策:小货架高频取货场景无需"货架-层-格"精确货位,系统管到区域即可,
// 货架内部由仓管经验定位,不给现场增加录入负担。库存(inventory)只关联 zone_code
// Zone 库房区域
// 客户诉求(问题记录 L32/L169 + 本轮 D5):区域要能定位到「货架号 + 第几层 + 位置号」,
// 且用户明确"编码规则手填"(L584)——故仅加三个可填文本字段,不做编号规则校验、不做级联实体。
// 完整库位串 = 区域编码 / 货架号 / 层 / 位置号(示例 Z01 / A / 3 / 12
type Zone struct {
ent.Schema
}
@@ -18,6 +18,12 @@ func (Zone) Fields() []ent.Field {
field.String("zone_code").Unique().Comment("区域编码"),
field.String("zone_name").Comment("区域名称"),
field.String("description").Optional().Comment("描述"),
// 货架号(手填,如 A/03
field.String("shelf_no").Optional().Comment("货架号(手填)"),
// 第几层(手填,如 3
field.String("layer_no").Optional().Comment("第几层(手填)"),
// 位置号(手填,如 12
field.String("position_no").Optional().Comment("位置号(手填)"),
field.String("status").Default("启用").Comment("状态:启用/停用"),
field.Int64("created_at").DefaultFunc(nowUnix),
field.Int64("updated_at").DefaultFunc(nowUnix).Optional().Comment("更新时间"),