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

物料分类统一到 mdm_item_category 方案

背景

基础数据 → 物料管理在保存物料并勾选「同步到 MES」时提示「物料分类不存在」。

根因是物料分类存在两套表且未同步:

  • 「基础数据 → 物料分类」页面的新增/修改/删除走 MES 接口 MesMdItemTypeServiceImpl,只写 mes_md_item_type;
  • 物料表单的分类下拉走 /mes/md/item-type/simple-list,读的也是 mes_md_item_type;
  • 但 MDM 物料同步到 MES 时(MdmItemServiceImpl#syncItemToMes)按分类 ID 查 mdm_item_category,查不到即抛 MDM_ITEM_CATEGORY_NOT_EXISTS。

因此老分类可用(历史数据两表都有),新分类必报错。

目标

物料分类统一以 mdm_item_category 为唯一数据源:

  • MES 分类接口 /mes/md/item-type/* 保留,前端路径与出入参不变,但底层读写全部改为 mdm_item_category;
  • MDM 与 MES 的分类下拉、物料保存、同步、导入全部基于同一张表;
  • mes_md_item_type 不再写入,仅作为历史备份保留。

改动范围

后端

模块 文件 改动
mdm MdmItemCategoryApi 增加 create / update / delete / 全量列表 RPC 方法
mdm MdmItemCategoryApiImpl 实现上述方法
mdm MdmItemCategorySaveReqDTO(新增) RPC 写入参数
mdm MdmItemCategoryRespDTO 补 remark、createTime
mdm MdmItemCategoryService(Impl) 增加全量列表方法
mes MesMdItemTypeServiceImpl 增删改查、子分类、导入全部改为调用 MDM 分类 API

前端

无需改动。 页面调用的仍是对外路径:

  • 分类管理页:/mes/md/item-type/list|get|create|update|delete|import
  • 分类下拉:/mes/md/item-type/simple-list
  • MDM 物料页分类下拉:同样调用 /mes/md/item-type/simple-list

响应字段保持 id / parentId / code / name / itemOrProduct / sort / status / remark / createTime。

数据迁移

上线前执行 docs/sql/mdm_item_category_migration.sql,把 mes_md_item_type 全量(含已逻辑删除记录)按**原 ID** 迁移到 mdm_item_category,保证:

  • mes_md_item.item_type_id、mdm_item.category_id 等历史外键继续有效;
  • item_type 由 item_or_product 推导:PRODUCT → 2(产品),其余 → 1(物料);
  • 脚本可重复执行(按主键 upsert)。

迁移后新分类由 mdm_item_category 自增 ID 生成,两套 ID 体系自然收敛为一套。

业务规则

场景 规则
新增分类 写 mdm_item_category,编码全局唯一、同一父级下名称唯一(由 MDM 校验)
修改分类 按原 ID 更新 mdm_item_category
删除分类 先校验 MES 物料引用,再由 MDM 校验子分类与 MDM 物料引用
物料保存 + 同步 MES 按 categoryId 查 mdm_item_category 取 code,正常同步
物料导入 按分类名称在 mdm_item_category 中解析
设备联动物料 EQUIPMENT 分类迁移后 MDM 侧可正常按 code 解析

验证

  1. 执行迁移 SQL,核对 mes_md_item_type 与 mdm_item_category 记录数、ID 一一对应。
  2. 「基础数据 → 物料分类」新增「测试」分类,确认 mdm_item_category 出现记录、mes_md_item_type 不新增。
  3. 「基础数据 → 物料管理」编辑物料,选择「测试」,勾选「同步到 MES」保存,应成功。
  4. 分类下拉、物料列表分类名称展示、分类编辑回显(含备注)正常。
  5. 分类导入、物料按分类名称导入正常。