状态:已确认并完成实施(2026-09-17)。决策点定稿见文末「6. 确认结论」。
一袋一码的生产逻辑调整:
| 对象 | 现状 |
|---|---|
| 数据包生成 | POST /mes/pro/bag-code/generate 仅传 count,生成空白袋码(无品种/批次/托盘) |
| 批次 | mes_pro_batch.itemId 绑定品种;批次号 = PC + 日期 + 产线编码 + 品种编码 + 流水号 |
| 托盘 | 手动创建(批量生成/预生成),创建时填 capacity 可装袋数;袋码手动绑托盘并校验容量 |
| 品种→单位 | mdm_item.unitMeasureId → mdm_unit_measure.type(类型选项:48千克/100千克/吨,本次已加) |
| 追溯 | 扫码追溯的品种信息取自批次 batch.itemId |
换算规则(后端计算,不信任前端传值):
| 品种主单位类型 | 输入 | 生成结果 |
|---|---|---|
| 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 个"。
PUT /mes/pro/bag-code/bind-batch 流程不变,新增级联:
批次号-P序号,回写批次托盘数。mes_pro_bag_code 新增:item_id、item_code、item_name(冗余)。
pallet_id 保持可空(吨类型)。itemId;DO 与数据库列 mes_pro_batch.item_id 保留(历史数据、追溯回退用),注释标记"已废弃"。PC + yyyyMMdd + 产线编码 + 流水号(generateBatchCode 不再拼品种编码;自动编码规则配置无需改)。capacity 入参;表单去掉「可装袋数」字段;列表去掉该列。DB 列保留兼容历史。capacity 判空逻辑天然跳过,删除相关校验代码)。auto_generated 字段 = true)。/get-by-code、TraceRespVO):品种改为**优先取袋码 item_id,历史袋码回退批次 itemId**。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 注释标记废弃
| 层 | 文件 | 改动 |
|---|---|---|
| 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 | 移除可装袋数 |
PC + yyyyMMdd + 产线编码 + 流水号。mes_pro_bag_code 新增 item_id/item_code/item_name;mdm_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 通过。GET /mes/pro/pallet/unbound-list:batch_id 为空、无正式托盘码且未作废的临时托盘。docs/mes_bag_code_package_refactor_integration.md。POST /mes/pro/bag-code/raw-generate:仅选品种+袋码数量即生成对应数量袋码(带品种冗余、uuid 成组),**不校验计量单位类型、不生成托盘**;后续录入批次/绑托盘/印刷/删除与数据包袋码一致。赋码管理页工具栏加「生成原始袋码」弹窗入口。mvn compile -pl yudao-module-mes -am -q 通过、前端类型检查改动文件零错误。MdmItemSelect 选择组件),按 mes_pro_bag_code.item_id 等值过滤;分页与导出 Excel 同口径生效。item_id 为空,选择品种后不会命中(属正常)。§3.3 原「编码/名称可检索本期不做,仅展示」就此升级为按品种编号检索。