如何通过JeecgBoot集成Flowable实现企业级流程自动化:从配置到落地全指南
企业级应用开发中,流程审批系统往往面临开发周期长、维护成本高、业务变更响应慢等痛点。传统开发模式下,一个简单的请假流程可能需要编写数百行代码处理节点跳转、权限控制和状态管理,而业务规则变更时又需重新编码部署。JeecgBoot框架通过深度整合Flowable工作流引擎,提供了可视化流程设计、低代码表单配置和灵活业务集成能力,使开发者能够以"配置即开发"的方式构建企业流程系统。本文将系统讲解如何在JeecgBoot中从零开始构建完整的流程应用,涵盖环境配置、流程设计、业务集成到场景落地的全流程实践。
一、核心价值:为什么选择JeecgBoot+Flowable
JeecgBoot与Flowable的组合为企业流程开发带来三大核心价值:首先是开发效率提升,通过可视化设计器将流程开发周期从周级缩短至天级;其次是业务灵活性,支持流程运行时动态调整,满足企业复杂多变的审批规则;最后是系统集成度,与JeecgBoot现有权限体系、表单引擎和业务模块无缝衔接。这种"低代码+高扩展"的模式特别适合中大型企业的流程数字化需求,既能快速响应业务变化,又保留了代码级定制的可能性。
技术原理简析
Flowable作为基于BPMN 2.0规范的轻量级流程引擎,可类比为"业务流程的操作系统"——它负责解析流程定义(类似操作系统解析可执行文件)、管理流程实例生命周期(类似进程管理)、协调各任务节点执行(类似任务调度)。JeecgBoot则在Flowable基础上构建了企业级应用所需的上层建筑,包括可视化设计界面、表单引擎、权限控制和业务集成接口,形成完整的"流程开发工作台"。
二、实践路径:四阶段构建流程应用
2.1 准备阶段:环境配置与依赖管理
开发环境要求:
- JDK 8+
- MySQL 5.7+
- Maven 3.6+
- Node.js 14+(前端构建)
项目构建步骤:
# 克隆代码仓库
git clone https://gitcode.com/GitHub_Trending/je/jeecg-boot
cd jeecg-boot
# 后端构建
mvn clean install -Dmaven.test.skip=true
# 前端构建(进入前端目录)
cd jeecgboot-vue3
npm install
npm run dev
核心依赖说明: JeecgBoot已预置Flowable相关依赖,主要包括:
- flowable-spring-boot-starter:流程引擎核心包
- flowable-ui-modeler-rest:流程设计器REST接口
- jeecg-boot-base-core:JeecgBoot基础核心模块,包含流程通用配置
[流程引擎配置] 实现路径:jeecg-module-system/jeecg-system-biz/src/main/resources/application.yml
2.2 设计阶段:流程建模与表单配置
流程设计器使用: 通过系统菜单"流程管理→流程设计"访问在线设计器,主要功能区域包括:
- 左侧工具栏:BPMN标准节点库(开始事件、用户任务、网关等)
- 中间画布:拖拽式流程绘制区域
- 右侧属性面板:节点属性配置(负责人、表单关联、条件表达式等)
表单关联策略: JeecgBoot支持三种表单与流程节点的绑定方式:
| 表单类型 | 技术实现 | 适用场景 |
|---|---|---|
| 在线表单 | 通过Online表单设计器创建,JSON格式存储 | 简单数据收集场景,如请假单、报销单 |
| 编码表单 | 自定义Vue组件,通过路由地址关联 | 复杂业务逻辑,如合同审批、项目立项 |
| 外部链接 | 配置第三方系统URL,支持参数传递 | 跨系统流程集成,如ERP单据审批 |
流程变量设计: 关键流程变量应包含:
- businessKey:业务表主键,用于关联业务数据
- assignee:任务负责人ID
- approvalResult:审批结果(通过/驳回)
- approveComment:审批意见
2.3 开发阶段:服务实现与API集成
核心服务开发: 流程发起服务实现示例:
@Service
public class ContractApprovalServiceImpl implements IContractApprovalService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private ContractMapper contractMapper;
/**
* 发起合同审批流程
* @param contract 合同实体
* @return 流程实例ID
*/
@Override
@Transactional
public String startApproval(Contract contract) {
// 1. 保存业务数据
contractMapper.insert(contract);
// 2. 准备流程变量
Map<String, Object> variables = new HashMap<>(4);
variables.put("businessKey", contract.getId()); // 业务主键
variables.put("applyUserId", SecurityUtils.getCurrentUserId()); // 当前申请人
variables.put("contractAmount", contract.getAmount()); // 合同金额(用于网关判断)
// 3. 启动流程实例(processKey为流程设计时定义的标识)
ProcessInstance instance = runtimeService.startProcessInstanceByKey("contractApproval", variables);
// 4. 更新业务表中的流程实例ID
contract.setProcessInstanceId(instance.getId());
contractMapper.updateById(contract);
return instance.getId();
}
}
任务分配策略: 实现动态负责人分配的两种方式:
- 角色分配:在流程设计器中直接指定角色编码,适合固定权限体系
- 表达式分配:通过EL表达式动态计算负责人,如:
${assigneeService.findDeptManager(applyUserId)}
其中AssigneeService需实现自定义逻辑:
@Component
public class AssigneeService {
@Autowired
private UserMapper userMapper;
/**
* 根据申请人ID查询部门经理
*/
public String findDeptManager(String applyUserId) {
User user = userMapper.selectById(applyUserId);
return user.getDeptManagerId();
}
}
2.4 集成阶段:业务对接与权限控制
业务数据关联: 推荐采用"双向关联"模式:
- 流程变量存储业务主键(businessKey)
- 业务表增加process_instance_id字段存储流程实例ID
流程监听器应用: 通过监听器实现业务状态自动更新:
@Component
public class ContractProcessListener implements ExecutionListener {
@Autowired
private ContractMapper contractMapper;
@Override
public void notify(DelegateExecution execution) {
String processInstanceId = execution.getProcessInstanceId();
String eventName = execution.getEventName();
// 流程结束时更新业务状态
if ("end".equals(eventName)) {
Contract contract = contractMapper.selectOne(
new QueryWrapper<Contract>().eq("process_instance_id", processInstanceId)
);
// 根据流程结果更新合同状态
Boolean approved = (Boolean) execution.getVariable("approvalResult");
contract.setStatus(approved ? "APPROVED" : "REJECTED");
contractMapper.updateById(contract);
}
}
}
权限控制要点:
- 流程定义权限:通过角色控制谁可以查看/编辑流程定义
- 流程实例权限:基于业务数据权限过滤可见的流程实例
- 任务处理权限:结合JeecgBoot权限体系控制任务处理范围
三、场景落地:采购审批流程实战
3.1 流程设计
采购审批流程包含以下关键节点:
- 申请人提交采购单(开始事件)
- 部门经理审批(用户任务)
- 金额判断网关(排他网关)
- 金额≤10万:财务审核
- 金额>10万:总经理审批→财务审核
- 财务打款(用户任务)
- 流程结束(结束事件)
3.2 流程定义与部署
通过设计器完成流程建模后,点击"部署"按钮发布流程。系统自动在ACT_RE_PROCDEF表中创建流程定义记录,格式为"processKey:version"。
3.3 关键代码实现
采购单实体类:
@Data
@TableName("oa_purchase")
public class OaPurchase {
@TableId(type = IdType.ASSIGN_ID)
private String id;
private String processInstanceId; // 流程实例ID
private String purchaseNo; // 采购单号
private BigDecimal amount; // 采购金额
private String status; // 状态:DRAFT-草稿,APPROVING-审批中,APPROVED-已批准,REJECTED-已驳回
private String applyUserId; // 申请人ID
// 其他业务字段...
}
流程启动代码:
@PostMapping("/startProcess")
public Result<String> startProcess(@RequestBody OaPurchase purchase) {
String processInstanceId = purchaseService.startApproval(purchase);
return Result.OK(processInstanceId);
}
任务处理代码:
@PostMapping("/completeTask")
public Result<Void> completeTask(@RequestBody TaskCompleteDTO dto) {
Map<String, Object> variables = new HashMap<>();
variables.put("approvalResult", dto.getApprovalResult()); // true-通过,false-驳回
variables.put("approveComment", dto.getComment());
taskService.complete(dto.getTaskId(), variables);
return Result.OK();
}
3.4 流程流转测试
使用Postman测试流程接口:
- 提交采购单:POST /purchase/startProcess
- 查询待办任务:GET /flow/task/list
- 完成审批任务:POST /flow/task/completeTask
四、进阶技巧:优化与扩展
4.1 性能优化策略
流程实例查询优化:
- 为ACT_HI_PROCINST表的businessKey字段建立索引
- 使用历史流程查询时指定流程定义ID和业务键,避免全表扫描
并发控制:
- 高并发场景下使用乐观锁控制任务操作:
@Transactional
public void completeTaskWithLock(String taskId, Map<String, Object> variables) {
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (task == null) {
throw new BusinessException("任务不存在或已被处理");
}
// 乐观锁机制确保任务不被重复处理
taskService.complete(taskId, variables);
}
4.2 高级特性应用
动态流程调整: 通过Flowable API实现运行时流程调整:
// 流程实例跳转
runtimeService.createChangeActivityStateBuilder()
.processInstanceId(processInstanceId)
.moveActivityIdTo(currentActivityId, targetActivityId)
.changeState();
事件驱动流程: 配置消息事件实现跨流程通信:
- 在流程设计器中添加"消息中间事件"
- 发布消息触发流程:
runtimeService.messageEventReceived("contractApproved", processInstanceId);
五、技术对比与未来演进
5.1 技术选型对比
| 特性 | JeecgBoot+Flowable | 传统开发 | 商业BPM平台 |
|---|---|---|---|
| 开发效率 | 高(可视化配置) | 低(纯编码) | 高(但成本高) |
| 定制能力 | 中(配置+代码结合) | 高(完全编码) | 低(厂商锁定) |
| 维护成本 | 低(集中配置管理) | 高(代码分散) | 中(依赖厂商升级) |
| 集成能力 | 高(JeecgBoot生态) | 中(需自行集成) | 中(标准接口) |
| 成本 | 开源免费 | 人力成本高 | license费用高 |
5.2 未来演进方向
JeecgBoot流程引擎的发展将聚焦三个方向:
- AI增强:引入流程推荐引擎,基于历史数据自动推荐流程节点和审批路径
- 低代码深化:实现流程与表单的一体化设计,支持复杂业务规则可视化配置
- 微服务适配:优化流程引擎在微服务架构下的部署模式,支持跨服务流程编排
通过JeecgBoot与Flowable的深度整合,企业可以快速构建灵活、可扩展的流程自动化系统,同时避免商业BPM平台的高成本和厂商锁定风险。无论是简单的行政审批还是复杂的业务流程,这种技术组合都能提供平衡开发效率与系统扩展性的最佳实践路径。
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0243- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01
electerm开源终端/ssh/telnet/serialport/RDP/VNC/Spice/sftp/ftp客户端(linux, mac, win)JavaScript00
