编辑 | blame | 历史 | 原始文档

一袋一码生产逻辑改造 - 需求方案

状态:已确认并完成实施(2026-09-17)。决策点定稿见文末「6. 确认结论」。

1. 需求背景

一袋一码的生产逻辑调整:

  • 批次生产管理**不再绑定品种**,品种下沉到「赋码管理」的数据包上。
  • 生成数据包时选择**品种**并输入**托盘数**,系统按品种主计量单位的「类型」自动计算袋码数量并生成袋码。
  • 按托盘数**自动生成托盘并自动绑定**袋码;托盘不再需要「可装袋数」。
  • 品种为「吨」时无托盘:改为直接输入**袋码数**,袋码只绑生产批次、不绑托盘码。

2. 现状要点

对象 现状
数据包生成 POST /mes/pro/bag-code/generate 仅传 count,生成空白袋码(无品种/批次/托盘)
批次 mes_pro_batch.itemId 绑定品种;批次号 = PC + 日期 + 产线编码 + 品种编码 + 流水号
托盘 手动创建(批量生成/预生成),创建时填 capacity 可装袋数;袋码手动绑托盘并校验容量
品种→单位 mdm_item.unitMeasureId → mdm_unit_measure.type(类型选项:48千克/100千克/吨,本次已加)
追溯 扫码追溯的品种信息取自批次 batch.itemId

3. 改造方案

3.1 生成数据包(赋码管理,核心改动)

换算规则(后端计算,不信任前端传值):

品种主单位类型 输入 生成结果
48千克 托盘数 P 袋码 48 × P 个;自动生成 P 个托盘,每托绑定 48 个袋码
100千克 托盘数 P 袋码 100 × P 个;自动生成 P 个托盘,每托绑定 100 个袋码
袋码数 N 袋码 N 个;不生成托盘,袋码不绑托盘

| 类型为空/无法解析 | - | 报错:品种主计量单位未配置类型(48千克/100千克/吨) |

接口变更 POST /mes/pro/bag-code/generate

参数 类型 必填 说明
itemId Long 品种(mdm_item 编号)
palletCount Integer 条件必填 托盘数(类型为 N千克 时必填)
bagCount Integer 条件必填 袋码数(类型为 吨 时必填)
remark String 备注

响应新增:uuid、type、perPallet(每托袋数)、totalCount(生成袋码数)、palletIds(自动生成的托盘)

事务逻辑:一次生成 = 同一 uuid 的袋码组 + 同批自动生成的托盘;托盘先以**临时码(PL-序号)**落库并完成袋码绑定,正式托盘码在「录入批次」时生成。

生成数据包弹窗(前端):选择品种(沿用品种选择组件)→ 读取该品种主单位类型(前端查 mdm_unit_measure,类型为空给提示)→ 按类型切换输入「托盘数」或「袋码数」→ 实时预览"将生成 袋码 X 个 / 托盘 Y 个"。

3.2 录入批次(保持后录入,扩展级联)

PUT /mes/pro/bag-code/bind-batch 流程不变,新增级联:

  1. 袋码绑定批次(现状)。
  2. 该组袋码所绑定的临时托盘自动绑定同一批次,并分配正式托盘码 批次号-P序号,回写批次托盘数。
  3. 新增校验:同一数据包(同批绑定袋码)品种必须一致(生成时天然一致,防手动混选)。

3.3 袋码数据模型

mes_pro_bag_code 新增:item_iditem_codeitem_name(冗余)。

  • 列表/查询:显示品种列(编码/名称可检索本期不做,仅展示)。
  • 删除数据包(delete-by-uuid):级联删除本组**自动生成**的托盘(前提仍是全部未绑批次;已录批次维持现状不可删)。
  • 袋码不强制托盘:pallet_id 保持可空(吨类型)。

3.4 批次生产管理

  • 去掉品种字段:创建/编辑表单、列表列、查询条件、Save/Resp/Page VO 均移除 itemId;DO 与数据库列 mes_pro_batch.item_id 保留(历史数据、追溯回退用),注释标记"已废弃"。
  • 批次号规则改为 PC + yyyyMMdd + 产线编码 + 流水号generateBatchCode 不再拼品种编码;自动编码规则配置无需改)。
  • 编辑批次不再因品种变化重新生成批次号。

3.5 托盘管理

  • 批量生成/预生成接口去掉 capacity 入参;表单去掉「可装袋数」字段;列表去掉该列。DB 列保留兼容历史。
  • 袋码手动绑托盘去掉容量校验(capacity 判空逻辑天然跳过,删除相关校验代码)。
  • 托盘列表为自动生成托盘打标识(复用 auto_generated 字段 = true)。

3.6 追溯/扫码/看板(回归项)

  • 袋码追溯(/get-by-code、TraceRespVO):品种改为**优先取袋码 item_id,历史袋码回退批次 itemId**。
  • 批次追溯视图(MesProBatchTraceRespVO):保留品种返回但可能为空(历史批次有值)。
  • 扫码入库、销售出库、袋码首页看板:不直接依赖批次品种的逻辑不动,涉及处回归验证。

4. 数据库变更(mom-thzy)

ALTER TABLE mes_pro_bag_code ADD COLUMN item_id BIGINT NULL COMMENT '品种(物料)编号' AFTER pallet_code;
ALTER TABLE mes_pro_bag_code ADD COLUMN item_code VARCHAR(64) NULL COMMENT '品种编码(冗余)' AFTER item_id;
ALTER TABLE mes_pro_bag_code ADD COLUMN item_name VARCHAR(255) NULL COMMENT '品种名称(冗余)' AFTER item_code;
-- mes_pro_batch.item_id 保留不删,Java 注释标记废弃

5. 前后端改动清单

文件 改动
DB mes_pro_bag_code +item_id/item_code/item_name
后端 MesProBagCodeGenerateReqVO/RespVO、ServiceImpl 新参数、类型换算、自动建托盘、事务
后端 MesProBagCodeDO/RespVO/Mapper +品种字段
后端 bind-batch 流程 级联托盘绑批次、品种一致性校验
后端 MesProBatchServiceImpl/VO 去品种、批次号规则、编辑逻辑
后端 MesProPalletServiceImpl/VO 去 capacity 入参与校验
后端 delete-by-uuid 级联删自动托盘
后端 追溯 VO 品种优先袋码、回退批次
前端 pro/bagCode generate-form 品种+托盘数/袋码数表单
前端 pro/bagCode 列表 +品种列
前端 pro/batch form/list/search 移除品种
前端 pro/pallet form/list 移除可装袋数

6. 确认结论(定稿)

  1. 混品种:要。一次 bind-batch 勾选的袋码品种必须一致,否则报错「录入批次的袋码必须属于同一品种」(历史空白袋码不参与校验)。
  2. 自动托盘可否再手动增绑:无容量上限,装满后仍可继续手动绑入袋码。
  3. 批次列表历史数据:老批次 itemId 直接不展示即可,无数据迁移;追溯视图保留批次品种做历史回退。
  4. 流程与批次号:保持「先生成数据包、后录入批次」;批次号规则改为 PC + yyyyMMdd + 产线编码 + 流水号

7. 实施记录(2026-09-17)

  • DB(mom-thzy):mes_pro_bag_code 新增 item_id/item_code/item_namemdm_unit_measure.type(48千克/100千克/吨);mes_pro_batch.item_id 保留标废弃。
  • 后端:generate 重写(类型换算+自动临时托盘)、bind-batch 级联托盘正式码+品种一致校验、delete-by-uuid 级联删自动托盘、replace 继承品种、托盘创建去 capacity 入参、袋码绑托盘去容量校验、批次 VO/Service 去品种、批次号单产线要素、袋码/公共追溯与二维码标签品种「袋码优先、批次回退」。
  • 前端:袋码生成弹窗(品种+托盘数/袋码数动态+预览)、列表品种列;批次表单/列表/搜索去品种;托盘表单/列表去可装袋数、列表加「自动生成」标识、绑托盘下拉去容量提示。
  • 编译:mvn compile -pl yudao-module-mes -am -q 通过。

8. 补充需求:批次操作绑定托盘(2026-09-17)

  • 批次新增/补录/编辑均可选「绑定托盘」(多选、非必填):勾选后批次状态直接置**生产中**,同事务复用托盘绑定批次逻辑(正式托盘码、托盘下袋码级联录入、品种一致校验),任一步失败整体回滚。
  • 编辑时仅传本次新增勾选的托盘;已绑定托盘不在下拉中(unbound-list 已过滤),不支持解绑,未勾选不改状态、不截断回退。
  • 新接口 GET /mes/pro/pallet/unbound-list:batch_id 为空、无正式托盘码且未作废的临时托盘。
  • 前端联调细则见 docs/mes_bag_code_package_refactor_integration.md

9. 补充需求:原始袋码与列表排序(2026-09-17)

  • 新增 POST /mes/pro/bag-code/raw-generate:仅选品种+袋码数量即生成对应数量袋码(带品种冗余、uuid 成组),**不校验计量单位类型、不生成托盘**;后续录入批次/绑托盘/印刷/删除与数据包袋码一致。赋码管理页工具栏加「生成原始袋码」弹窗入口。
  • 袋码分页查询改为按**创建时间倒序**(同秒按编号倒序),原「袋序号升序」废弃。
  • 编译 mvn compile -pl yudao-module-mes -am -q 通过、前端类型检查改动文件零错误。

10. 补充需求:袋码列表品种查询(2026-09-17)

  • 赋码管理列表搜索区新增「品种」条件(复用 MdmItemSelect 选择组件),按 mes_pro_bag_code.item_id 等值过滤;分页与导出 Excel 同口径生效。
  • 历史空白袋码 item_id 为空,选择品种后不会命中(属正常)。§3.3 原「编码/名称可检索本期不做,仅展示」就此升级为按品种编号检索。