# 三勾MES制造执行系统 **Repository Path**: git.fangqiu.net/jjj-mes ## Basic Information - **Project Name**: 三勾MES制造执行系统 - **Description**: 三勾MES 制造执行系统、极易二开、自定义报表、自定义消息、审批、待办等。 面向开发、二开友好的开源 MES 系统。 面向中小型制造企业,采用前后端分离架构,覆盖生产、质量、仓储、设备等核心业务。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://www.jjjshop.net - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2026-06-04 - **Last Updated**: 2026-06-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JJJ-MES 制造执行系统 **面向开发、二开友好的开源 MES 系统** 面向中小型制造企业,采用前后端分离架构,覆盖生产、质量、仓储、设备等核心业务。 --- > ### 为什么选择 JJJ-MES? > > 很多开源 MES 只提供业务功能,二次开发时仍需从零搭建基础设施。JJJ-MES 不同——它内置了一套完整的**可配置化引擎**,大部分定制需求无需改代码,通过开发端后台配置即可完成: > > | 自定义能力 | 说明 | > |-----------|------| > | **自定义审批流** | 可视化配置审批节点、条件分支、单据类型、触发器,支持多级审批和抄送 | > | **自定义报表** | 配置数据源、字段映射,自动生成生产/库存/质量等报表,支持自定义报表模板 | > | **自定义打印** | 拖拽式打印模板设计器(shared/print-designer),支持标签、条码、二维码、单据 | > | **自定义消息** | 配置消息事件、渠道(站内/短信/邮件)、模板,按规则自动触发通知 | > | **自定义待办** | 配置待办规则,审批、任务自动进入待办中心 | > | **自定义编码** | 按分类配置编码规则(前缀、流水号、日期段等),自动生成单据编号 | > | **数据字典** | 下拉选项、状态值等通过字典管理,无需硬编码 | > | **数据权限** | 基于注解的数据权限控制,按角色/部门自动过滤数据 | > > 系统分为**管理端**(业务操作)和**开发端**(底层配置)两个前端,开发端专门用于管理上述自定义能力,降低二开门槛。 ## 项目简介 JJJ-MES 提供从生产计划、车间执行、质量检验到仓储物流的业务管理能力。系统分为后端服务(jjj_mes)、管理端前端(jjj_mes_admin)、开发端前端(jjj_mes_dev)、共享组件(shared)四个部分,支持单体部署和微服务部署两种模式。 ## 技术栈 | 层级 | 技术 | |------|------| | 后端框架 | Java 17 + Spring Boot 3.1.5 | | Web 容器 | Undertow | | 构建工具 | Maven 多模块 | | 数据库 | MySQL | | 管理端前端(jjj_mes_admin) | Vue 3 + Vite + Element Plus + Pinia + ECharts | | 开发端前端(jjj_mes_dev) | Vue 3 + Vite + Element Plus + Pinia + vuedraggable | | 微服务(可选) | Spring Cloud Gateway + Nacos + Sentinel + XXL-Job | ## 后端架构 # JJJ-MES 系统架构 ## 一、整体架构总览 ```mermaid graph TB subgraph 客户端 A["管理端 jjj_mes_admin\nVue3 + Element Plus"] B["开发端 jjj_mes_dev\nVue3 + Element Plus"] C["移动端"] end D["接入层\nUndertow + Shiro/JWT + XSS过滤"] subgraph API路由 E["/admin/* 管理端API"] F["/dev/* 开发端API"] G["/front/* 移动端API"] end H["Controller 层\nParam入参 → Service调用 → VO出参"] I["Service 层(多端共用)\n业务逻辑 + 事务控制"] J["SPI 扩展层\n审批/打印/报表/待办 Provider"] K["Mapper 层\nMyBatis-Plus BaseMapper"] L[("MySQL")] A --> D B --> D C --> D D --> E & F & G E & F & G --> H H --> I I <--> J I --> K --> L style D fill:#E8F5E9,stroke:#2E7D32,color:#1B5E20 style H fill:#F3E5F5,stroke:#6A1B9A,color:#4A148C style I fill:#FFF8E1,stroke:#F57F17,color:#E65100 style J fill:#FCE4EC,stroke:#C62828,color:#B71C1C style K fill:#E0F2F1,stroke:#00695C,color:#004D40 style L fill:#B2DFDB,stroke:#00695C,color:#004D40 ``` --- ## 二、业务模块与公共模块 ```mermaid graph LR subgraph 业务模块 P["生产管理\njjj-module-prod"] Q["质量管理\njjj-module-qc"] W["仓储管理\njjj-module-wh"] AS["设备/工装\njjj-module-asset"] SC["排班考勤\njjj-module-schedule"] BD["基础数据\njjj-module-basedata"] end subgraph SPI接口 FA["flow-api\nFlowVoProvider"] PA["print-api\nPrintDataProvider"] RA["report-api\nReportDataProvider"] TA["task-api\nTaskDataProvider"] end subgraph 公共模块 AP["审批引擎\njjj-module-approval"] PR["打印服务\njjj-module-print"] RP["报表服务\njjj-module-report"] TK["待办中心\njjj-module-approval"] MS["消息中心\njjj-module-message"] end P & Q & W & AS & SC & BD -->|实现 Provider| FA & PA & RA & TA FA --> AP PA --> PR RA --> RP TA --> TK style FA fill:#FCE4EC,stroke:#C62828,color:#B71C1C style PA fill:#FCE4EC,stroke:#C62828,color:#B71C1C style RA fill:#FCE4EC,stroke:#C62828,color:#B71C1C style TA fill:#FCE4EC,stroke:#C62828,color:#B71C1C ``` ## 三、模块内部分层结构 以生产模块 `jjj-module-prod` 为例: ```mermaid graph TB AC2["Controller\nadmin/mobile"] SVC["Service 接口\nIWorkOrderService"] IMPL["Service 实现\nWorkOrderServiceImpl"] MAP2["Mapper\nWorkOrderMapper"] DB[("MySQL")] FL["审批集成\nFlowVoProvider"] PRT["打印集成\nPrintDataProvider"] TSK["待办集成\nTaskDataProvider"] AC2 -->|"Param 入参"| SVC SVC --> IMPL IMPL --> MAP2 --> DB IMPL --> FL IMPL --> PRT IMPL --> TSK SVC -->|"VO 出参"| AC2 style AC2 fill:#E3F2FD,stroke:#1565C0,color:#0D47A1 style SVC fill:#F3E5F5,stroke:#6A1B9A,color:#4A148C style IMPL fill:#FFF8E1,stroke:#F57F17,color:#E65100 style MAP2 fill:#E0F2F1,stroke:#00695C,color:#004D40 style FL fill:#FCE4EC,stroke:#C62828,color:#B71C1C style PRT fill:#FCE4EC,stroke:#C62828,color:#B71C1C style TSK fill:#FCE4EC,stroke:#C62828,color:#B71C1C ``` 各层职责: - **Controller**:接收 Param、校验参数、调用 Service、返回 VO,admin 和 mobile 各自独立 - **Service**:业务逻辑 + 事务控制,common 层多端共用 - **Mapper**:继承 MyBatis-Plus BaseMapper,自动 CRUD - **SPI 集成**:业务模块实现 Provider 接口,接入审批/打印/待办,零侵入公共模块 ## 四、横切关注点(AOP) ```mermaid graph LR REQ["请求进入"] --> SHIRO["Shiro + JWT\n认证鉴权"] SHIRO --> XSS["XSS 过滤"] XSS --> CTRL["Controller"] CTRL --> PERM["@RequiresPermissions\n权限校验"] PERM --> LOG["@OperationLog\n操作日志"] LOG --> VALID["@Validated\n参数校验"] VALID --> SVC["Service"] SVC --> DP["@DataPermission\n数据权限拦截"] DP --> MAPPER["Mapper → MySQL"] style SHIRO fill:#E8F5E9,stroke:#2E7D32,color:#1B5E20 style PERM fill:#ECEFF1,stroke:#455A64,color:#263238 style LOG fill:#ECEFF1,stroke:#455A64,color:#263238 style DP fill:#ECEFF1,stroke:#455A64,color:#263238 ``` --- ## 五、请求流转示例 以 **管理端创建生产工单** 为例: ``` 1. 管理端前端 (jjj_mes_admin) │ POST /api/admin/prod/workorder/add │ Body: WorkOrderCreateParam (JSON) ▼ 2. Undertow 容器接收请求 │ → XSS 过滤器:清洗输入参数 │ → Shiro 拦截器:校验 JWT Token → 解析用户身份和权限 ▼ 3. API 路由(按 URL 前缀分发) │ /admin/* → 管理端 Controller │ /dev/* → 开发端 Controller │ /mobile/* → 移动端 Controller ▼ 4. WorkOrderController(Controller 层) │ @RequiresPermissions("/prod/workorder/add") ← 权限校验 │ @OperationLog(type = ADD) ← AOP 记录操作日志 │ @Validated WorkOrderCreateParam ← 参数校验 │ → 调用 workOrderService.add(param) │ → 返回 ApiResult.ok(vo) ▼ 5. WorkOrderServiceImpl(Service 层 - common 共用) │ ← @DataPermission AOP 自动注入数据权限条件 │ │ a. 调用 CodeRule 自动生成工单编号 (WO-20260402-001) │ b. 校验生产计划、产品、工艺路线 │ c. 组装 WorkOrder Entity → Mapper.insert() │ d. 触发 SPI:TodoTaskFacade.createTodoTask() → 自动创建待办 │ e. 触发 SPI:审批流自动发起(如果配置了审批规则) ▼ 6. WorkOrderMapper → MyBatis-Plus → MySQL │ INSERT INTO prod_work_order (...) ▼ 7. 响应返回 ApiResult { code: 1, message: "success", data: WorkOrderVO } ``` ## 六、SPI 扩展流转(以打印为例) ``` 1. 用户点击「打印工单」 ▼ 2. PrintService 收到请求(模板ID + 业务单据ID) │ → 查询 PrintTemplate → 读取 voName = "ProdOrderVoFieldVO" ▼ 3. SPI 路由:按 voName 匹配 PrintDataProvider │ ProdOrderDataProvider.supportVoName() = "ProdOrderVoFieldVO" ✅ ▼ 4. ProdOrderDataProvider.getData(id) │ → 查询 WorkOrder + 关联数据 → 返回 Map ▼ 5. PrintService 填充模板 → 生成打印内容 同样模式用于:审批流(FlowVoProvider)、报表(ReportDataProvider)、待办(TaskDataProvider) ``` ### 分层规范 每个业务模块(如 `jjj-module-prod`)内部严格按以下分层组织,职责清晰,不允许跨层调用: ``` net.jjjshop.prod ├── admin/ # 管理端接口层 │ ├── controller/ # Controller —— 只做参数校验和结果包装,不写业务逻辑 │ ├── param/ # 入参对象(CreateParam / UpdateParam / QueryParam) │ └── vo/ # 出参对象(VO),与 Entity 严格隔离 ├── mobile/ # 移动端接口层(结构同 admin) │ ├── controller/ │ ├── param/ │ └── vo/ └── common/ # 公共业务层(admin 和 mobile 共用) ├── entity/ # 数据库实体(MyBatis-Plus @TableName) ├── enums/ # 业务枚举 ├── mapper/ # Mapper 接口(继承 BaseMapper) ├── service/ # Service 接口(继承 IService) ├── service/impl/ # Service 实现(继承 BaseServiceImpl) ├── flow/ # 审批流集成(实现 FlowVoProvider) ├── print/ # 打印集成(实现 PrintDataProvider / PrintVoProvider) └── task/ # 待办集成(实现 TaskDataProvider / TaskVoProvider) ``` 关键约束: - Controller → Service → Mapper,单向依赖,不允许反向调用 - Entity 只出现在 common 层,Controller 层只接收 Param、只返回 VO - admin 和 mobile 共用同一套 Service/Mapper,通过不同的 Controller + Param/VO 对外暴露 ### 基础框架(jjj-boot-base-core) 所有模块的公共底座,提供: | 能力 | 实现 | |------|------| | 统一返回格式 | `ApiResult` 封装 code/message/data | | Controller 基类 | `BaseController` | | Service 基类 | `BaseServiceImpl` 继承 MyBatis-Plus ServiceImpl | | 认证鉴权 | Shiro + JWT(token 签发/校验/刷新) | | 数据权限 | `@DataPermission` 注解 + `DataPermissionInterceptor` 自动拦截 | | 操作日志 | `@OperationLog` 注解 + AOP 自动记录 | | 参数校验 | Jakarta Validation + 自定义校验器 | | XSS 防护 | XSS 过滤器 | | 数据脱敏 | `@Desensitization` 注解 | | 文件上传 | 工厂模式,可扩展存储方式 | | 分页 | 统一分页参数和分页结果封装 | | 全局异常 | `GlobalErrorController` 统一异常处理 | ### SPI 扩展机制 公共模块(审批、打印、报表、待办)通过 API 模块定义 Provider 接口,业务模块实现并注册到 Spring 容器,实现模块间解耦: ``` jjj-module-print-api 定义 PrintDataProvider / PrintVoProvider 接口 jjj-module-report-api 定义 ReportDataProvider / ReportVoProvider 接口 jjj-module-task-api 定义 TaskDataProvider / TaskVoProvider / TodoTaskFacade 接口 jjj-module-flow-api 定义 FlowVoProvider 接口 ``` 业务模块只需实现对应 Provider 接口,公共模块按 `supportVoName()` 自动路由,无需修改公共模块代码。例如生产模块的打印集成: ```java // jjj-module-prod 中实现 PrintDataProvider @Service public class ProdOrderDataProvider implements PrintDataProvider { @Override public String supportVoName() { return "ProdOrderVoFieldVO"; } @Override public Map getData(Long id) { // 查询生产工单数据,返回给打印模块 } } ``` 新增业务模块需要接入打印/报表/审批/待办时,只需在自己模块内实现对应 Provider,零侵入。 ### 多端 API 隔离 后端通过 URL 前缀区分不同端的 API: | 端 | URL 前缀 | 对应模块 | |----|---------|---------| | 管理端 | `/admin/` | `jjj-module-admin` + 各业务模块 `admin/controller` | | 开发端 | `/dev/` | `jjj-module-dev` + 各公共模块 `dev/controller` | | 移动端 | `/mobile/` | 各业务模块 `mobile/controller` | 三端共用同一套 Service/Entity/Mapper,通过不同的 Controller + Param + VO 实现接口隔离,权限独立控制(Shiro `@RequiresPermissions`)。 ## 项目结构 ``` jjj_mes_git/ ├── jjj_mes/ # 后端 Java 源码 │ ├── jjj-boot-base-core/ # 核心基础框架 │ ├── jjj-module-system/ │ │ ├── jjj-module-business/ # 业务模块 │ │ │ ├── jjj-module-prod/ # 生产管理 │ │ │ ├── jjj-module-qc/ # 质量管理 │ │ │ ├── jjj-module-wh/ # 仓储管理 │ │ │ ├── jjj-module-basedata/ # 基础数据 │ │ │ ├── jjj-module-asset/ # 设备与工装夹具 │ │ │ ├── jjj-module-schedule/ # 排班考勤 │ │ │ └── jjj-module-dashboard/ # 仪表盘 │ │ ├── jjj-module-common/ # 公共模块 │ │ │ ├── jjj-module-approval/ # 审批流程 │ │ │ ├── jjj-module-message/ # 消息通知 │ │ │ ├── jjj-module-print/ # 打印管理 │ │ │ ├── jjj-module-report/ # 报表管理 │ │ │ ├── jjj-module-org/ # 组织架构 │ │ │ └── jjj-module-base/ # 数据字典/编码规则 │ │ ├── jjj-module-admin/ # 管理端 API │ │ ├── jjj-module-dev/ # 开发端 API │ │ ├── jjj-module-core/ # 核心模块 │ │ └── jjj-system-start/ # 启动入口(端口 8899) │ └── jjj-server-cloud/ # 微服务模块(Gateway/Sentinel/XXL-Job) ├── jjj_mes_admin/ # 管理端前端(Vue 3) ├── jjj_mes_dev/ # 开发端前端(Vue 3) ├── shared/ │ └── print-designer/ # 打印模板设计器组件 ├── db/ # 数据库初始化脚本 └── md/ # 项目文档 ``` ## 功能模块 ### 管理端(jjj_mes_admin) 面向工厂管理人员和车间操作人员使用。 | 模块 | 功能 | |------|------| | 生产管理 | 生产计划、生产工单、工序报工、工艺路线、投料管理、排程、质量检验 | | 质量管理 | IQC来料检验、PQC过程检验、FQC成品检验、OQC出货检验、检验标准、不良品处理 | | 仓储管理 | 采购入库、销售出库、领料/退料、调拨、盘点、库存查询、仓库/库区/库位管理 | | 设备管理 | 设备台账、设备类型、保养计划、点检项目、维修工单 | | 工装夹具 | 工装台账、类型管理、借用/归还/使用记录 | | 基础数据 | 产品管理、产品分类、BOM管理、客户、供应商、车间、工位、计量单位 | | 排班考勤 | 班次设置、排班计划、考勤记录、请假、加班、调班 | | 组织架构 | 部门、岗位、角色、用户管理 | | 审批流程 | 审批流配置、表单配置、待办任务、审批规则 | | 消息通知 | 消息规则、消息日志 | | 打印管理 | 打印模板、打印分类、打印任务、打印历史、打印机配置 | | 统计报表 | 生产报表、库存报表、质量报表、自定义报表 | | 看板 | 实时生产看板、产能看板、质量看板、效率看板、不良看板 | | 待办中心 | 我的待办、全部待办、待办规则 | | 系统设置 | 数据字典、编码规则、单位换算、审批流、消息规则、文件管理 | ### 开发端(jjj_mes_dev) 面向系统开发和运维人员使用,管理底层配置。 | 模块 | 功能 | |------|------| | 权限管理 | 菜单/接口权限配置、开发端角色、开发端用户 | | 数据字典 | 字典分类与字典项管理 | | 编码规则 | 编码分类、编码规则配置 | | 审批流配置 | 流程条件、单据类型、节点类型、触发器、任务类型 | | 消息配置 | 消息渠道、消息事件、消息模板、调试工具 | | 打印配置 | 打印模板设计、数据绑定、模板分类 | | 报表配置 | 报表模板设计、数据源管理、字段绑定 | | 系统设置 | 系统参数、区域管理 | | 日志管理 | 登录日志、操作日志 | ### 共享组件(shared) | 组件 | 说明 | |------|------| | print-designer | 打印模板可视化设计器,支持拖拽布局,管理端和开发端共用 | ## 数据库 `db/` 目录包含以下初始化脚本: | 脚本 | 内容 | |------|------| | init.sql | 初始脚本 | | nacos.sql | 微服务部署macos表 | ## 快速开始 ### 环境要求 | 环境 | 版本 | |------|------| | JDK | 17+ | | Maven | 3.8+ | | MySQL | 8.0+ | | Node.js | 16+(前端) | ### 1. 初始化数据库 ```bash # 创建数据库后,依次执行 db/ 目录下的 SQL 脚本 ``` ### 2. 启动后端 ```bash # 修改数据库连接配置 # 文件:jjj_mes/jjj-module-system/jjj-system-start/src/main/resources/config/application-dev.yml cd jjj_mes mvn clean package -DskipTests java -jar jjj-module-system/jjj-system-start/target/*.jar # 后端默认端口:8899,接口前缀:/api ``` ### 3. 启动管理端前端 ```bash cd jjj_mes_admin npm install npm run dev ``` ### 4. 启动开发端前端 ```bash cd jjj_mes_dev npm install npm run dev ``` ## 部署模式 - **单体模式**:通过 `jjj-system-start` 直接启动,适合中小规模部署 - **微服务模式**:通过 `jjj-server-cloud` 启动,包含 Gateway 网关、Nacos 注册中心、Sentinel 限流、XXL-Job 定时任务 ## 系统截图 | ![输入图片说明](https://www.jjjshop.net/gitee/mes-java/1.png "1.png") | ![输入图片说明](https://www.jjjshop.net/gitee/mes-java/2.png "2.png") | |---|---| | ![输入图片说明](https://www.jjjshop.net/gitee/mes-java/3.png "3.png") | ![输入图片说明](https://www.jjjshop.net/gitee/mes-java/4.png "4.png") | | ![输入图片说明](https://www.jjjshop.net/gitee/mes-java/5.png "5.png") | ![输入图片说明](https://www.jjjshop.net/gitee/mes-java/6.png "6.png") | ## 加群交流 官网地址: [https://www.jjjshop.net](https://www.jjjshop.net) 交流QQ群:970137749 --- 如果这个项目对你有帮助,欢迎 Star 支持!