大家好,我是你们的 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 的差异化优势:
- 开源免费 + 完整闭环:在开源领域,能做到「工单 → 生产 → 质检 → 入库」全链路跑通的项目极少,RuoYi 是少数之一。
- 与 ERP 天然集成:采购、销售、库存、财务模块已经存在,MES 不需要做额外的集成开发。
- 多租户支持:天生支持 SaaS 模式交付,适合做制造行业的 SaaS 平台。
RuoYi MES 的短板:
- 缺少工业协议集成:没有 OPC-UA、Modbus 等工业协议支持,无法直接对接生产设备。
- 缺少高级排程:没有 APS 算法,排产靠人工,无法做有限产能排程。
- 移动端支持弱:车间工人需要用手机/平板报工,目前主要依赖 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 如果让我重新设计
我会做以下调整:
-
引入事件驱动架构:目前 MES 模块内部是紧耦合的------工单完工直接调用入库 Service。如果改用事件驱动(Spring Event 或消息队列),工单完工发布一个 WorkOrderFinishedEvent,入库、质检、统计等模块各自监听处理,模块间的耦合度会大幅降低。
-
移动端优先的报工体验:车间工人不太可能坐在电脑前报工。应该设计一个轻量的 H5 或小程序端,支持扫码报工、拍照上传、语音录入等功能。
-
OEE 设备综合效率计算:这是制造业的核心指标(可用率 × 表现率 × 质量率),目前模块里没有这个计算。可以基于设备运行数据和生产数据自动计算 OEE。
8.2 设计思路的迁移场景
MES 模块的很多设计思路可以迁移到其他领域:
- 批次追溯 → 食品行业的溯源系统、医药行业的 GMP 追溯
- 模板化检验 → 任何需要「标准化检查流程」的场景(安全检查、合规审计)
- 自动编码 → 任何需要「规则化编号」的系统(合同管理、档案管理)
- 待检任务聚合 → 任何有「多来源待办」的系统(审批中心、任务中心)
8.3 AI 增强方向
MES 模块有几个可以结合 AI/大模型的增强点:
- 智能排产:用机器学习模型预测订单交期,结合产能数据做智能排程。
- 质量预测:基于历史检验数据,预测哪些批次可能不合格,提前预警。
- 设备预测性维护:基于设备运行数据,预测设备何时可能故障,提前安排维护。
- 自然语言报工:工人可以用语音说「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 模块在库位管理、批次追溯、出入库流程上会有更深度的设计。敬请期待~
觉得有用的话,点个赞支持一下呗~ 你们的点赞是我持续更新的动力!