feat: 完成客户第12条需求+多系统改造

1. 新增预警表添加工单号字段,支持按工单号检索预警
2. 添加工单过滤在制品/绩效报表/预警中心查询
3. 补全WMS台账字段口径与权限配置
4. 修复备料单与数量不符处理流程
5. 新增配送进度/库位联动/自动出库功能
6. 修复AGV配送状态更新逻辑
7. 优化退料与库存管理细节
This commit is contained in:
SunYF
2026-09-19 17:04:58 +08:00
parent 62e45b7379
commit 05b0b8a909
89 changed files with 7912 additions and 429 deletions
+12 -3
View File
@@ -7,8 +7,15 @@ import (
)
// OrderMaterialLedger 工单物料台账(WMS 侧)
// 维护:物料总需求数量、累计已出库数量、剩余待出库数量
// 强约束:累计出库 ≤ 工单总需求量;等于时领料完结,禁止再出库
//
// 字段口径(2026-09-19 定稿,一个字段只有一个写者;详见 临时.md §2):
// - total_qty 需求总量 [写者:MES 同步台账]
// - out_qty 累计已发出 [写者:出库]
// - returned_qty 累计已退回 [写者:退库收货]
// - consumed_qty 累计已消耗 [写者:报工反冲核销]
//
// 派生量:net_out_qty = out_qty returned_qty(净领用,用于超量拦截与「领料完结」判定)。
// 强约束:net_out_qty ≤ total_qty;等于时领料完结。退料后净额回落,可再次补料。
type OrderMaterialLedger struct {
ent.Schema
}
@@ -19,7 +26,9 @@ func (OrderMaterialLedger) Fields() []ent.Field {
field.String("material_code").Comment("物料编码"),
field.String("material_name").Optional().Comment("物料名称(冗余)"),
field.Int("total_qty").Default(0).Comment("物料总需求数量"),
field.Int("out_qty").Default(0).Comment("累计已出库数量"),
field.Int("out_qty").Default(0).Comment("累计已发出数量(仅出库写入)"),
field.Int("returned_qty").Default(0).Comment("累计已退回数量(仅退库收货写入)"),
field.Int("consumed_qty").Default(0).Comment("累计已消耗数量(仅报工反冲核销写入;不动库存)"),
field.String("status").Default("进行中").Comment("进行中/领料完结"),
// 目标工位:备料送到哪个装配工位(客户诉求 L297-300;MES 同步台账时传入)
field.String("target_station").Optional().Comment("目标工位(装配工位号)"),
+14 -4
View File
@@ -7,9 +7,11 @@ import (
)
// OutboundOrder 出库统一主表
// 所有出库(备料出库 workorder / 通用出库 general / 装箱)都落在这一张表,
// 所有出库(备料出库 workorder / 补料出库 refill / 通用出库 general)都落在这一张表,
// 用 outbound_type 区分;装箱属性(箱号/SN清单/合同号)直接存本表,不再单独建装箱表。
// 备料出库强约束:累计出库 ≤ 工单 BOM 需求量MES 校验),WMS 侧校验 order_no 对应台账
// 备料出库强约束:净领用(out_qty returned_qty) ≤ 工单 BOM 需求量WMS 侧台账校验
//
// 注:报工反冲不再生成出库单(2026-09-19 起反冲只核销台账 consumed_qty,不做物理位移)。
type OutboundOrder struct {
ent.Schema
}
@@ -17,8 +19,12 @@ type OutboundOrder struct {
func (OutboundOrder) Fields() []ent.Field {
return []ent.Field{
field.String("outbound_no").Unique().Comment("出库单号"),
// 类型:workorder(工单领料/MES) general(通用出库,不依赖工单)
// 类型:workorder(备料出库/MES) refill(工位叫料补料) general(通用出库,不依赖工单)
field.String("outbound_type").Default("workorder").Comment("出库类型"),
// 出库单状态:出库即扣库存,故创建即为「已出库」;叫 AGV 配送到位后置「已送达」。
// 「已接料」不在本表(归备料单 material_request.received_qty),避免三处状态互斗。
field.String("status").Default("已出库").Comment("出库单状态 已出库/已送达"),
field.Bool("need_agv").Default(false).Comment("是否需要AGV配送到接驳台"),
// 出库类别(客户诉求 问题记录 L96-108):通用出库先点选类别——
// return(退料)/sample(样品)/scrap(报废)/deliver(发货)/other(其他,手输原因)
field.String("outbound_category").Optional().Comment("出库类别 return/sample/scrap/deliver/other"),
@@ -32,7 +38,11 @@ func (OutboundOrder) Fields() []ent.Field {
field.String("material_name").Optional().Comment("物料名称(冗余)"),
field.Int("manage_mode").Default(1).Comment("管理粒度 1批次/2序列号"),
field.String("batch_no").Optional().Comment("批次号(结构件)"),
field.String("zone_code").Optional().Comment("出库区域"),
// 出库库位四级(客户诉求:出库与入库同口径,2026-09-19 补齐)
field.String("zone_code").Optional().Comment("出库区域(大区)"),
field.String("shelf_no").Optional().Comment("货架号(与入库同口径)"),
field.String("layer_no").Optional().Comment("第几层(与入库同口径)"),
field.String("position_no").Optional().Comment("位置号(与入库同口径)"),
field.Int("quantity").Default(0).Comment("本次出库总数量"),
field.String("operator").Optional().Comment("操作人"),
field.String("reviewer").Optional().Comment("复核人"),