首页
/ ruoyi-vue-pro工作流引擎:Flowable深度集成与流程实现

ruoyi-vue-pro工作流引擎:Flowable深度集成与流程实现

2026-02-04 04:20:18作者:裴麒琰

痛点场景:企业流程审批的特定需求

你是否还在为传统工作流无法满足特定审批场景而烦恼?面对复杂的会签、加签、转办、撤回等流程需求,标准BPMN规范往往显得力不从心。ruoyi-vue-pro基于Flowable深度定制,完美解决了这一痛点!

通过本文,你将获得:

  • ✅ Flowable在企业级应用中的深度集成方案
  • ✅ 流程操作的完整实现解析
  • ✅ 双设计器模式(仿钉钉+BPMN)的最佳实践
  • ✅ 会签、加签、转办、撤回等特色功能源码分析
  • ✅ 生产环境验证的高可用工作流架构

技术架构:Flowable深度集成设计

ruoyi-vue-pro采用分层架构设计,工作流模块作为独立业务模块,与系统其他模块松耦合集成。

核心依赖配置

<!-- Flowable 工作流相关 -->
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter-process</artifactId>
</dependency>
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter-actuator</artifactId>
</dependency>

架构分层设计

graph TB
    A[前端界面] --> B[Controller层]
    B --> C[Service服务层]
    C --> D[Flowable引擎]
    D --> E[数据库持久化]
    
    subgraph 流程扩展
        F[会签处理器]
        G[加签管理器]
        H[撤回引擎]
        I[转办委派器]
    end
    
    C --> F
    C --> G
    C --> H
    C --> I

流程功能实现详解

1. 会签功能实现

会签(Countersign)是企业流程中常见的多人同时审批场景。ruoyi-vue-pro支持三种会签模式:

会签类型 审批规则 适用场景
全员会签 所有审批人必须同意 重要决策、财务审批
或签 任意一人审批即可 日常事务、快速流程
比例会签 按设定比例通过 集体决策、评审流程

会签核心代码实现:

public class BpmUserTaskActivityBehavior {
    // 多实例任务处理
    if (isMultiInstance(task)) {
        // 从Variable中获取会签配置
        MultiInstanceLoopCharacteristics multiInstance = 
            (MultiInstanceLoopCharacteristics) userTask.getLoopCharacteristics();
        String completionCondition = multiInstance.getCompletionCondition();
        
        // 处理不同的会签类型
        if (completionCondition.contains("nrOfCompletedInstances/nrOfInstances")) {
            // 比例会签逻辑
            handleRatioCountersign(task, completionCondition);
        } else if (completionCondition.contains("nrOfCompletedInstances > 0")) {
            // 或签逻辑
            handleOrCountersign(task);
        } else {
            // 全员会签逻辑
            handleAllCountersign(task);
        }
    }
}

2. 加签功能实现

加签(Add Sign)允许当前审批人根据需要增加审批节点,支持向前加签和向后加签两种模式。

加签类型枚举定义:

public enum BpmTaskSignTypeEnum {
    /**
     * 向前加签,需要前置任务审批完成,才回到原审批人
     */
    BEFORE("before", "向前加签"),
    
    /**
     * 向后加签,需要后置任务全部审批完,才会通过原审批人节点
     */
    AFTER("after", "向后加签");
    
    // 省略getter方法
}

加签业务流程:

sequenceDiagram
    participant A as 当前审批人
    participant B as 系统
    participant C as 加签人
    participant D as Flowable引擎
    
    A->>B: 发起加签请求
    B->>D: 创建加签任务
    D->>C: 分配加签任务
    C->>D: 审批加签任务
    D->>B: 返回审批结果
    B->>A: 通知原审批人
    
    alt 向前加签
        A->>A: 等待加签完成
    else 向后加签
        A->>A: 继续后续流程
    end

3. 撤回功能实现

撤回(Withdraw)功能允许审批人在特定条件下撤销已提交的审批,这是流程灵活性需求。

撤回核心业务逻辑:

@Override
@Transactional(rollbackFor = Exception.class)
public void withdrawTask(Long userId, String taskId) {
    // 1. 校验任务存在且属于当前用户
    Task task = validateTask(userId, taskId);
    
    // 2. 校验流程实例正在运行
    ProcessInstance instance = processInstanceService.getProcessInstance(
        task.getProcessInstanceId());
    if (!instance.isEnded()) {
        throw exception(TASK_WITHDRAW_FAIL_PROCESS_NOT_RUNNING);
    }
    
    // 3. 判断此流程是否允许撤回
    BpmProcessDefinitionInfoDO definitionInfo = bpmProcessDefinitionService
        .getProcessDefinitionInfo(task.getProcessDefinitionId());
    if (!definitionInfo.getAllowWithdraw()) {
        throw exception(TASK_WITHDRAW_FAIL_NOT_ALLOW);
    }
    
    // 4. 执行撤回操作
    runtimeService.createProcessInstanceModification(task.getProcessInstanceId())
        .moveExecutionsToSingleActivityId(withdrawExecutionIds, 
            taskInstance.getTaskDefinitionKey());
    
    // 5. 添加撤回评论记录
    taskService.addComment(task.getId(), task.getProcessInstanceId(), 
        BpmCommentTypeEnum.CANCEL.getType(),
        BpmCommentTypeEnum.CANCEL.formatComment("前一节点撤回"));
}

4. 转办与委派功能

转办(Transfer)和委派(Delegate)都是任务重新分配机制,但有着不同的业务含义:

功能 业务含义 处理流程
转办 彻底转移审批责任 A转给B后,B审批完成即结束
委派 临时委托审批权限 A转给B,B审批后返回给A继续审批

转办与委派状态管理:

public class BpmTaskServiceImpl {
    
    // 处理委派任务审批
    private void approveDelegateTask(BpmTaskApproveReqVO reqVO, Task task) {
        // 委派任务特殊处理逻辑
        if (DelegationState.PENDING.equals(task.getDelegationState())) {
            // 设置委派审批结果
            taskService.resolveTask(task.getId(), reqVO.getVariables());
            
            // 更新任务状态记录
            updateTaskStatusAndReason(task.getId(), 
                BpmTaskStatusEnum.APPROVE.getStatus(), 
                reqVO.getReason());
        }
    }
}

双设计器模式:仿钉钉+BPMN

ruoyi-vue-pro创新性地采用双设计器模式,满足不同复杂度的流程设计需求。

仿钉钉设计器(SIMPLE设计器)

适用于简单业务流程,支持拖拽式配置:

flowchart TD
    A[开始节点] --> B[审批节点1]
    B --> C{条件判断}
    C -->|条件1| D[审批节点2]
    C -->|条件2| E[审批节点3]
    D --> F[结束节点]
    E --> F

特色功能:

  • 可视化表单设计
  • 拖拽式节点配置
  • 快速条件分支设置
  • 实时流程预览

BPMN标准设计器

适用于复杂业务流程,支持完整的BPMN 2.0规范:

<process id="complexProcess" name="复杂审批流程">
    <startEvent id="startEvent"/>
    <userTask id="leaderApproval" name="领导审批"
              flowable:candidateUsers="${approveUserSelectAssignees}">
        <extensionElements>
            <flowable:taskListener event="create" 
                class="cn.iocoder.yudao.module.bpm.listener.BpmUserTaskListener"/>
        </extensionElements>
    </userTask>
    <exclusiveGateway id="decisionGateway"/>
    <endEvent id="endEvent"/>
    
    <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="leaderApproval"/>
    <sequenceFlow id="flow2" sourceRef="leaderApproval" targetRef="decisionGateway"/>
</process>

高可用架构设计

数据库多版本支持

ruoyi-vue-pro的Flowable集成支持多种数据库,确保在企业环境中的高可用性:

数据库类型 支持状态 特色功能
MySQL ✅ 完全支持 主从复制、集群部署
Oracle ✅ 完全支持 RAC集群支持
PostgreSQL ✅ 完全支持 流复制、高可用
SQL Server ✅ 完全支持 AlwaysOn可用性组
达梦DM ✅ 国产化支持 信创环境适配

性能优化策略

1. 流程实例数据分区

-- 按租户ID进行数据分区
CREATE TABLE bpm_process_instance (
    id VARCHAR(64) NOT NULL,
    tenant_id BIGINT NOT NULL,
    -- 其他字段...
    PRIMARY KEY (id, tenant_id)
) PARTITION BY HASH(tenant_id) PARTITIONS 10;

2. 历史数据归档策略

@Component
public class BpmHistoryArchiver {
    @Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点执行
    public void archiveHistoricData() {
        // 归档30天前的历史数据
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_MONTH, -30);
        Date archiveDate = calendar.getTime();
        
        historyService.createHistoricProcessInstanceQuery()
            .finishedBefore(archiveDate)
            .list()
            .forEach(this::archiveInstance);
    }
}

实战案例:OA请假审批流程

以下是一个完整的OA请假审批流程实现示例:

流程定义配置

@Entity
@Table(name = "bpm_oa_leave")
public class BpmOALeaveDO extends BaseDO {
    @Id
    private Long id;
    
    // 请假信息
    private Long userId;
    private String type;
    private String reason;
    private Date startTime;
    private Date endTime;
    private Long duration;
    
    // 审批状态
    private Integer status;
    private String processInstanceId;
    
    // 审批结果
    private String approveReason;
    private Long approveUserId;
    private Date approveTime;
}

审批状态机设计

stateDiagram-v2
    [*] --> DRAFT: 创建草稿
    DRAFT --> APPROVING: 提交审批
    APPROVING --> APPROVED: 审批通过
    APPROVING --> REJECTED: 审批驳回
    APPROVING --> CANCELLED: 撤回取消
    REJECTED --> DRAFT: 重新编辑
    APPROVED --> [*]: 流程结束
    CANCELLED --> [*]: 流程结束

审批回调处理

@Component
public class BpmOALeaveStatusListener {
    
    @Transactional(rollbackFor = Exception.class)
    public void onProcessInstanceComplete(ProcessInstance instance) {
        // 根据流程实例ID查询请假记录
        BpmOALeaveDO leave = bpmOALeaveService.getLeaveByProcessInstanceId(
            instance.getId());
        
        if (leave != null) {
            // 更新请假状态
            if (instance.isEnded()) {
                leave.setStatus(BpmOALeaveStatusEnum.APPROVED.getStatus());
            } else if (instance.isSuspended()) {
                leave.setStatus(BpmOALeaveStatusEnum.REJECTED.getStatus());
            }
            
            // 保存更新
            bpmOALeaveService.updateLeave(leave);
        }
    }
}

总结与展望

ruoyi-vue-pro的Flowable工作流引擎集成,通过深度定制和扩展,完美解决了流程审批的需求痛点。其核心价值体现在:

核心优势

  1. 双设计器模式:既满足简单流程的快速配置,又支持复杂流程的精细控制
  2. 完整特色功能:会签、加签、撤回、转办等流程全面支持
  3. 企业级高可用:多数据库支持、集群部署、性能优化
  4. 开放扩展架构:清晰的扩展点设计,便于二次开发

未来演进方向

随着企业数字化转型的深入,工作流引擎将继续向以下方向发展:

  • 智能化审批:集成AI算法实现智能路由和自动审批
  • 移动化适配:更好的移动端审批体验和离线处理能力
  • 集成化生态:与更多业务系统深度集成,形成完整的数字化办公平台
  • 低代码强化:进一步降低流程配置的技术门槛,让业务人员也能参与流程设计

ruoyi-vue-pro的工作流模块已经过大量企业生产环境验证,是构建企业级审批系统的理想选择。无论是传统的OA审批,还是复杂的业务流程,都能提供稳定、高效、灵活的支撑。

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