【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:MES 制造执行模块,一个被严重低估的「工业级 ERP 核心」

大家好,我是你们的 RuoYi-Vue-Pro 源码拆解系列作者-腻害兔。今天这一期,我们来啃一块真正的硬骨头------MES 制造执行系统模块(yudao-module-mes)

说实话,在开始分析之前,我对 MES 模块的预期并不高。毕竟 RuoYi 的基因是「后台管理框架」,能把制造执行做到什么程度?但当我把 127 个 Controller、134 个 Service、133 个数据对象、65 个枚举类全部读完之后,我沉默了------这个模块的完整度,已经不是一个「后台管理框架的附属功能」了,它是一个正儿八经的工业级 MES 系统

废话不多说,直接上干货!


一、今日模块概览

一句话总结:yudao-module-mes 是一个覆盖制造执行全流程的工业级系统,包含 9 大子模块------主数据管理、生产排程与工单、车间工艺路线、质量检验(IQC/IPQC/OQC/RQC)、设备管理、工装管理、排班日历、仓储物流、自动编码,以及生产看板统计。

它解决的核心问题是:把工厂从「纸质单据 + Excel 管理」升级到「数字化制造执行」。你可以把它理解为一个「轻量级 MES + 轻量级 WMS」的组合体------虽然不可能做到 SAP ME 或 Siemens Opcenter 那种企业级深度,但在中小制造企业的日常生产管理、质量追溯、设备维护这些核心场景下,它已经能跑通完整的业务闭环了。

在整个 RuoYi 体系中,MES 模块的定位非常特殊:它是 RuoYi 从「通用管理后台」走向「行业解决方案」的关键一步。配合前面分析过的 ERP 模块(采购、库存、销售、财务),RuoYi 实际上已经具备了覆盖「采购 → 生产 → 质检 → 入库 → 销售」全链路的 ERP+MES 能力。


二、技术选型分析

2.1 整体架构:单体模块内聚,不做微服务拆分

MES 模块没有像某些大型 MES 产品那样拆成独立的微服务,而是作为一个标准的 Spring Boot 模块嵌入 RuoYi 体系。依赖关系如下:

依赖 用途 替代方案
yudao-module-system 用户、权限、租户 无(核心依赖)
yudao-spring-boot-starter-web REST API
yudao-spring-boot-starter-security 权限控制 Shiro
yudao-spring-boot-starter-mybatis ORM JPA/Hibernate
yudao-spring-boot-starter-redis 自动编码序列号生成 数据库自增
yudao-spring-boot-starter-excel 导入导出 Apache POI 原生

为什么不做微服务拆分? 因为 MES 的核心用户是中小型制造企业,部署环境通常是单机或小型集群。微服务带来的运维复杂度(服务注册、配置中心、链路追踪)对这类客户来说是负担而非收益。单体模块内聚 + 标准 Spring Boot 部署,是最务实的选择。

为什么用 MyBatis-Plus 而不是 JPA? 制造业的查询场景极其复杂------批次追溯需要多表 JOIN,待检任务需要 UNION ALL 聚合 6 个来源,库存台账需要多维度分组统计。JPA 的 Criteria API 在这些场景下写起来非常痛苦,而 MyBatis-Plus 的 XML Mapper 可以精确控制 SQL,性能也更可控。

2.2 自动编码:Redis 原子计数器

MES 中有一个非常有意思的设计------自动编码生成器。工厂里的工单号、检验单号、批次号都需要按规则自动生成,比如 WO-20260727-0001。

RuoYi 用 Redis 的 setIfAbsent + increment 实现分布式安全的序列号生成,支持按年/月/日/时/分/输入字符等多种周期重置策略。

为什么不用数据库自增? 因为编码规则需要支持「前缀 + 日期 + 序号」的组合格式,数据库自增只能解决序号部分。而且 Redis 的原子操作在并发场景下性能远优于数据库行锁。

划重点: 这个自动编码模块的设计思路可以迁移到任何需要「规则化编号生成」的场景------订单号、合同号、发票号、物流单号,本质上都是同一个问题。


三、需求溯源推演

让我尝试还原 MES 模块最初的产品需求文档可能长什么样:

html 复制代码
【PRD 片段:MES 制造执行模块 v1.0】

背景:我们的客户群体从纯互联网企业扩展到了中小制造企业。
这些客户的核心痛点是:
1. 生产工单还在用纸质单据流转,无法实时追踪进度
2. 质量检验记录散落在 Excel 里,出了问题无法追溯批次
3. 设备维护靠人工记忆,经常漏检导致停机
4. 仓库库存和实际生产脱节,经常缺料或积压

核心需求:
- 工单全生命周期管理(创建 → 确认 → 生产 → 报工 → 完工)
- 四道质量检验关卡(来料 IQC、过程 IPQC、出货 OQC、退货 RQC)
- 设备台账 + 点检计划 + 维修工单
- 批次正向/反向追溯(原料批次 → 成品批次双向追溯)
- 生产看板(工单状态分布、产量趋势、设备状态)

非功能需求:
- 支持多租户(SaaS 模式交付)
- 支持 Excel 批量导入导出(工厂用户习惯)
- 编码规则可配置(不同工厂有不同的编号习惯)

从现有代码来看,这个 PRD 的核心需求几乎全部实现了,而且在很多方面还做了超出预期的扩展------比如 Andon 安灯系统(车间异常报警)、工装管理、虚拟线边仓、条码管理等,这些都不是最初 PRD 里一定会有的功能,说明团队在实际落地过程中深入理解了制造业的真实场景。

不过也有「设计不足」的地方------比如没有看到与 PLC/SCADA 等工业控制系统的集成接口,没有 OEE(设备综合效率)计算,没有 APS(高级排程)算法。这些是更高级的 MES 功能,可能需要后续迭代。


四、竞品对标分析

维度 RuoYi MES JeecgBoot 黑湖智造 鼎捷 T100
定位 开源 ERP 的制造扩展 低代码平台的制造模板 SaaS 化专业 MES 传统 ERP 的制造模块
工单管理 完整(状态机驱动) 基础 CRUD 完整 + 移动端 完整 + 复杂排程
质量检验 四道关卡 + 模板化 基础检验单 完整 QMS 完整 QMS
批次追溯 正反向追溯 不支持 完整追溯链 完整追溯链
设备管理 台账 + 点检 + 维修 基础台账 IoT 集成 完整 EAM
排班管理 班组 + 班次 + 计划 不支持 不支持 支持
仓储管理 完整 WMS(30+ 实体) 基础库存 集成第三方 完整 WMS
部署方式 私有化/云部署 私有化 SaaS 订阅 私有化
价格 开源免费 开源免费 按用户数收费 百万级授权费
扩展性 模块化可插拔 低代码扩展 API 有限 定制开发

RuoYi MES 的差异化优势:

  1. 开源免费 + 完整闭环:在开源领域,能做到「工单 → 生产 → 质检 → 入库」全链路跑通的项目极少,RuoYi 是少数之一。
  2. 与 ERP 天然集成:采购、销售、库存、财务模块已经存在,MES 不需要做额外的集成开发。
  3. 多租户支持:天生支持 SaaS 模式交付,适合做制造行业的 SaaS 平台。

RuoYi MES 的短板:

  1. 缺少工业协议集成:没有 OPC-UA、Modbus 等工业协议支持,无法直接对接生产设备。
  2. 缺少高级排程:没有 APS 算法,排产靠人工,无法做有限产能排程。
  3. 移动端支持弱:车间工人需要用手机/平板报工,目前主要依赖 Web 端。

五、核心业务流程

5.1 生产工单全生命周期

这是 MES 最核心的流程,从工单创建到完工入库的完整链路:

5.2 质量检验流程

RuoYi 的质量检验设计非常讲究,采用了模板化检验的思路:

划重点: PendingInspect 这个设计非常巧妙------它用一条 UNION ALL 查询把 6 个不同业务来源的待检任务聚合到一个统一队列里,质检员只需要看一个页面就能处理所有待检任务。这种「统一入口 + 分类处理」的设计思路值得所有做 B 端产品的同学学习。

5.3 批次追溯流程

批次追溯是制造业的刚需------出了问题要能快速定位是哪批原料、哪个工单、哪道工序出的问题。

正向追溯(原料 → 成品):

原料批次 → 物料消耗明细 → 物料消耗单 → 生产报工 → 成品产出 → 成品批次

反向追溯(成品 → 原料):

成品批次 → 成品产出明细 → 成品产出单 → 物料消耗 → 物料消耗明细 → 原料批次

代码中通过 MesWmBatchMapper.xml 的两个 SQL 实现了这两个方向的追溯查询,本质上是在 wm_item_consume_detail 和 wm_product_produce_detail 两张关联表之间做递归查询。


六、数据模型解读

MES 模块有 133 个数据对象,是整个 RuoYi 体系中实体最多的模块。让我梳理一下核心的数据模型关系:

6.1 主数据层(MD)------ 一切的基础

java 复制代码
MesMdItemDO(物料/产品)
  ├── MesMdItemTypeDO(物料分类)
  ├── MesMdUnitMeasureDO(计量单位)
  ├── MesMdProductBomDO(BOM 物料清单)
  ├── MesMdProductSopDO(标准作业指导书)
  └── MesMdProductSipDO(标准检验指导书)

MesMdWorkstationDO(工位)
  ├── MesMdWorkstationMachineDO(关联设备)
  ├── MesMdWorkstationToolDO(关联工装)
  └── MesMdWorkstationWorkerDO(关联工人)

6.2 生产执行层(PRO)------ 核心业务流

java 复制代码
MesProWorkOrderDO(工单)
  ├── MesProWorkOrderBomDO(工单 BOM)
  ├── MesProTaskDO(生产任务)
  │   └── MesProTaskIssueDO(任务领料)
  ├── MesProFeedbackDO(报工记录)
  └── MesProCardDO(流转卡)

MesProRouteDO(工艺路线)
  └── MesProRouteProcessDO(路线工序)
      └── MesProProcessContentDO(工序内容)

6.3 仓储物流层(WM)------ 最庞大的子模块

仓储模块有 30+ 个实体,采用了三层单据结构

单据头(Header)→ 单据行(Line)→ 单据明细(Detail)

比如入库流程:MesWmItemReceiptDO(入库单头)→ MesWmItemReceiptLineDO(入库行,按物料)→ MesWmItemReceiptDetailDO(入库明细,按批次)。

为什么要三层结构? 因为制造业的入库场景比电商复杂得多------同一批物料可能来自不同供应商、不同批次、不同质检状态,需要精确到每一笔明细。

6.4 值得学习的设计模式

设计模式 应用场景 代码体现
状态机 工单/报工/检验单流转 各 StatusEnum + Service 中的状态校验
策略模式 自动编码生成 MesMdAutoCodePartStrategy 4 种实现
模板方法 质量检验 Template → Indicator → 实例化为检验单
主从表 所有业务单据 Header → Line → Detail 三层结构
虚拟仓库 线边仓管理 WIP_VIRTUAL_WAREHOUSE 常量

七、产品设计亮点与槽点

亮点

1. 待检任务的 UNION ALL 聚合设计

这是整个 MES 模块让我最眼前一亮的设计。MesQcPendingInspectMapper.xml 用一条 SQL 把 6 个不同业务来源的待检任务(到货、外协、生产、销售、退货入库、销售退货)聚合到一个统一队列。质检员打开一个页面就能看到所有待检任务,不需要在 6 个菜单之间来回切换。

这种设计的本质是:把「系统视角的数据组织」转化为「用户视角的任务组织」。系统里数据是按业务类型分散存储的,但用户需要的是「我接下来要做什么」。这个设计思路可以迁移到任何有「多来源待办任务」的场景。

2. 自动编码的策略模式设计

自动编码模块用了策略模式,把编码规则拆成 4 种「零件」:固定字符、日期、输入字符、序列号。用户通过组合这些零件来定义编码规则,比如 WO-{YYYYMMDD}-{0000}。序列号部分用 Redis 原子计数器实现,支持按周期自动重置。

这个设计的精妙之处在于:把「编码规则」这个看似简单实则复杂的问题,用组合模式拆解成了可配置、可扩展的零件系统。不同工厂有不同的编号习惯,但通过这个零件系统都能满足。

3. 批次双向追溯

正向追溯(原料 → 成品)和反向追溯(成品 → 原料)两个方向的 SQL 查询,覆盖了制造业最核心的质量追溯需求。出了问题,几分钟就能定位到问题批次和影响范围。

槽点

1. 缺少与工业设备的集成接口

作为一个 MES 系统,没有 OPC-UA、Modbus、MQTT 等工业协议的集成,意味着所有生产数据都需要人工录入。这在中小工厂可能还能接受,但如果要做真正的「智能制造」,这是必须补上的短板。

改进建议: 可以增加一个 yudao-spring-boot-starter-iot-mes 的 Starter,封装常见的工业协议适配,让 MES 模块能直接采集设备数据(产量、温度、转速等)。

2. 排产能力偏弱

目前的工单排产基本是「人工创建 + 手动分配」,没有基于产能、交期、优先级的自动排程算法。对于订单量大的工厂,这会成为一个瓶颈。

改进建议: 可以引入简单的 APS 算法(如基于规则的排程),至少实现「按交期自动排序 + 产能校验」的基础能力。


八、发散性思考

8.1 如果让我重新设计

我会做以下调整:

  1. 引入事件驱动架构:目前 MES 模块内部是紧耦合的------工单完工直接调用入库 Service。如果改用事件驱动(Spring Event 或消息队列),工单完工发布一个 WorkOrderFinishedEvent,入库、质检、统计等模块各自监听处理,模块间的耦合度会大幅降低。

  2. 移动端优先的报工体验:车间工人不太可能坐在电脑前报工。应该设计一个轻量的 H5 或小程序端,支持扫码报工、拍照上传、语音录入等功能。

  3. OEE 设备综合效率计算:这是制造业的核心指标(可用率 × 表现率 × 质量率),目前模块里没有这个计算。可以基于设备运行数据和生产数据自动计算 OEE。

8.2 设计思路的迁移场景

MES 模块的很多设计思路可以迁移到其他领域:

  • 批次追溯 → 食品行业的溯源系统、医药行业的 GMP 追溯
  • 模板化检验 → 任何需要「标准化检查流程」的场景(安全检查、合规审计)
  • 自动编码 → 任何需要「规则化编号」的系统(合同管理、档案管理)
  • 待检任务聚合 → 任何有「多来源待办」的系统(审批中心、任务中心)

8.3 AI 增强方向

MES 模块有几个可以结合 AI/大模型的增强点:

  1. 智能排产:用机器学习模型预测订单交期,结合产能数据做智能排程。
  2. 质量预测:基于历史检验数据,预测哪些批次可能不合格,提前预警。
  3. 设备预测性维护:基于设备运行数据,预测设备何时可能故障,提前安排维护。
  4. 自然语言报工:工人可以用语音说「A 工位完成了 50 件,合格 48 件」,AI 自动解析并录入系统。

九、关键代码导读

以下是 5 个最值得阅读的代码文件,它们体现了 MES 模块的设计精髓:

1. MesQcPendingInspectMapper.xml

  • 路径:yudao-module-mes/src/main/resources/mapper/
  • 为什么值得读:这个文件用一条 UNION ALL 查询聚合了 6 个不同业务来源的待检任务,是「统一任务队列」设计的典范。学习如何用 SQL 把分散的数据组织成用户友好的视图。
  • 能学到什么:复杂 SQL 的编写技巧、多表 UNION 的性能考量、业务视角的数据建模。

2. MesMdAutoCodeSerialNumberPartStrategy.java

  • 路径:yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/autocode/
  • 为什么值得读:这个文件实现了基于 Redis 的分布式序列号生成器,支持多种周期重置策略和零填充格式。是策略模式的教科书级实现。
  • 能学到什么:策略模式、Redis 原子操作、序列号生成的工程实践。

3. MesWmBatchMapper.xml

  • 路径:yudao-module-mes/src/main/resources/mapper/
  • 为什么值得读:实现了批次正向追溯和反向追溯两个方向的 SQL 查询。这是制造业质量追溯的核心能力。
  • 能学到什么:多表关联查询、递归追溯的数据建模、制造业批次管理的业务理解。

4. MesProWorkOrderServiceImpl.java

  • 路径:yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/
  • 为什么值得读:工单是整个 MES 的核心实体,这个 Service 实现了工单从创建到完工的完整状态机流转,包括确认、完工、取消等状态变更的业务规则。
  • 能学到什么:状态机模式的工程实现、业务规则校验、事务管理。

5. MesHomeStatisticsMapper.xml

  • 路径:yudao-module-mes/src/main/resources/mapper/
  • 为什么值得读:生产看板的后端 SQL,包括工单状态分布、产量趋势、设备状态统计等聚合查询。学习如何用 SQL 高效生成统计报表。
  • 能学到什么:聚合查询优化、统计报表的 SQL 设计、数据可视化的后端支撑。

建议阅读顺序:先看 MesHomeStatisticsMapper.xml 了解全局 → 再看 MesProWorkOrderServiceImpl.java 理解核心流程 → 然后看 MesQcPendingInspectMapper.xml 学习巧妙设计 → 接着看 MesMdAutoCodeSerialNumberPartStrategy.java 学习设计模式 → 最后看 MesWmBatchMapper.xml 理解追溯机制。


十、总结

RuoYi-Vue-Pro 的 MES 模块是一个被严重低估的存在。127 个 Controller、134 个 Service、133 个数据对象------这个体量已经超过了 RuoYi 体系中大多数业务模块。它不是那种「做个样子」的附属功能,而是一个真正能跑通制造执行全流程的工业级系统。

从产品经理的视角来看,这个模块的价值在于:它让 RuoYi 从一个「通用管理后台」升级为一个「制造业数字化平台」。配合 ERP 模块,RuoYi 已经具备了覆盖「采购 → 生产 → 质检 → 入库 → 销售 → 财务」全链路的能力。对于中小制造企业来说,这可能就是他们数字化转型的第一步。

从技术视角来看,MES 模块的架构设计也有很多值得学习的地方:策略模式的自动编码、UNION ALL 的待检任务聚合、三层单据结构、批次双向追溯、Redis 原子计数器......每一个设计决策背后,都有清晰的问题驱动和取舍逻辑。

下一篇预告 :MES 啃完了,还剩最后一块硬骨头------WMS 仓库管理模块(yudao-module-wms)。虽然 MES 里已经包含了大量仓储功能,但独立的 WMS 模块在库位管理、批次追溯、出入库流程上会有更深度的设计。敬请期待~


觉得有用的话,点个赞支持一下呗~ 你们的点赞是我持续更新的动力!

相关推荐
zzzzzz3101 小时前
做了5年后端,我整理了10个最让我怀疑人生的奇葩需求
https·产品经理·ava
勇往直前plus10 小时前
Vue3(篇一) 核心概念——响应式模板语法与组件基础
前端·javascript·vue.js
咩咩啃树皮10 小时前
第43篇:Vue3计算属性(computed)完全精讲——缓存机制、依赖计算、业务最优解
前端·vue.js·缓存
威联通网络存储14 小时前
TS-h2490FU在面板制造Array段AOI缺陷画廊中的并联
python·制造
Infedium15 小时前
英特物理AI仿真赋能制造!打破传统有限元瓶颈,研发提效降本翻倍
人工智能·制造
郝亚军15 小时前
webstorm如何创建vue 3.js
javascript·vue.js·webstorm
用户831348593069818 小时前
Cesium 实现行政区内部遮罩
vue.js·webgl·cesium
卤蛋fg618 小时前
vxe-table 自定义复制粘贴逻辑:精确控制单元格数据转换
vue.js
张人玉20 小时前
基于 Vue 3 + ECharts + Express + SQLite 构建的新能源汽车销量数据分析与可视化平台——新能源汽车销量数据分析系统
数据库·vue.js·sqlite·echarts