ruoyi-vue-pro工作流引擎:Flowable深度集成与流程实现
痛点场景:企业流程审批的特定需求
你是否还在为传统工作流无法满足特定审批场景而烦恼?面对复杂的会签、加签、转办、撤回等流程需求,标准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工作流引擎集成,通过深度定制和扩展,完美解决了流程审批的需求痛点。其核心价值体现在:
核心优势
- 双设计器模式:既满足简单流程的快速配置,又支持复杂流程的精细控制
- 完整特色功能:会签、加签、撤回、转办等流程全面支持
- 企业级高可用:多数据库支持、集群部署、性能优化
- 开放扩展架构:清晰的扩展点设计,便于二次开发
未来演进方向
随着企业数字化转型的深入,工作流引擎将继续向以下方向发展:
- 智能化审批:集成AI算法实现智能路由和自动审批
- 移动化适配:更好的移动端审批体验和离线处理能力
- 集成化生态:与更多业务系统深度集成,形成完整的数字化办公平台
- 低代码强化:进一步降低流程配置的技术门槛,让业务人员也能参与流程设计
ruoyi-vue-pro的工作流模块已经过大量企业生产环境验证,是构建企业级审批系统的理想选择。无论是传统的OA审批,还是复杂的业务流程,都能提供稳定、高效、灵活的支撑。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00