首页
/ 如何通过JeecgBoot集成Flowable实现企业级流程自动化:从配置到落地全指南

如何通过JeecgBoot集成Flowable实现企业级流程自动化:从配置到落地全指南

2026-04-02 09:12:08作者:胡易黎Nicole

企业级应用开发中,流程审批系统往往面临开发周期长、维护成本高、业务变更响应慢等痛点。传统开发模式下,一个简单的请假流程可能需要编写数百行代码处理节点跳转、权限控制和状态管理,而业务规则变更时又需重新编码部署。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();
    }
}

任务分配策略: 实现动态负责人分配的两种方式:

  1. 角色分配:在流程设计器中直接指定角色编码,适合固定权限体系
  2. 表达式分配:通过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 流程设计

采购审批流程包含以下关键节点:

  1. 申请人提交采购单(开始事件)
  2. 部门经理审批(用户任务)
  3. 金额判断网关(排他网关)
    • 金额≤10万:财务审核
    • 金额>10万:总经理审批→财务审核
  4. 财务打款(用户任务)
  5. 流程结束(结束事件)

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测试流程接口:

  1. 提交采购单:POST /purchase/startProcess
  2. 查询待办任务:GET /flow/task/list
  3. 完成审批任务: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();

事件驱动流程: 配置消息事件实现跨流程通信:

  1. 在流程设计器中添加"消息中间事件"
  2. 发布消息触发流程:
runtimeService.messageEventReceived("contractApproved", processInstanceId);

五、技术对比与未来演进

5.1 技术选型对比

特性 JeecgBoot+Flowable 传统开发 商业BPM平台
开发效率 高(可视化配置) 低(纯编码) 高(但成本高)
定制能力 中(配置+代码结合) 高(完全编码) 低(厂商锁定)
维护成本 低(集中配置管理) 高(代码分散) 中(依赖厂商升级)
集成能力 高(JeecgBoot生态) 中(需自行集成) 中(标准接口)
成本 开源免费 人力成本高 license费用高

5.2 未来演进方向

JeecgBoot流程引擎的发展将聚焦三个方向:

  1. AI增强:引入流程推荐引擎,基于历史数据自动推荐流程节点和审批路径
  2. 低代码深化:实现流程与表单的一体化设计,支持复杂业务规则可视化配置
  3. 微服务适配:优化流程引擎在微服务架构下的部署模式,支持跨服务流程编排

通过JeecgBoot与Flowable的深度整合,企业可以快速构建灵活、可扩展的流程自动化系统,同时避免商业BPM平台的高成本和厂商锁定风险。无论是简单的行政审批还是复杂的业务流程,这种技术组合都能提供平衡开发效率与系统扩展性的最佳实践路径。

登录后查看全文
热门项目推荐
相关项目推荐