在企业级应用开发中,工作流是支撑业务流转、审批合规、流程协同的核心组件。传统Java开发模式下,流程硬编码、节点耦合度高、变更成本高、运维难度大等问题长期存在。基于Java生态构建低代码工作流平台,能够通过可视化配置、引擎驱动、规则解耦,实现流程快速编排、动态调整、自动流转、全程可追溯,显著降低研发与运维成本。本文从引擎原理、核心设计、代码实现、落地实践四个维度,给出可直接工程化的方案。
一、工作流引擎核心架构
低代码工作流引擎的本质是流程状态机 + 规则路由 + 任务调度的统一体。典型架构分为四层:
- 定义层:流程模板、节点、路由条件、参与人配置存储
- 引擎层:流程解析、实例创建、节点推进、异常处理
- 服务层:用户权限、表单数据、消息通知、日志审计
- 接入层:可视化设计器、API接口、前端审批门户
引擎核心能力:
- 流程实例生命周期管理
- 条件路由与自动跳转
- 并行/串行/会签/或签支持
- 超时、驳回、撤回、终止、归档
- 版本管理与灰度上线
二、核心引擎代码实现(Java)
1. 枚举与基础结构定义
先统一节点类型、处理策略、异常机制,保证流程语义严谨。
/**
* 流程节点类型枚举
*/
public enum NodeType {
START, // 开始节点
APPROVAL, // 审批节点
CONDITION, // 条件网关
PARALLEL, // 并行网关
END // 结束节点
}
/**
* 异常处理策略
*/
public enum OnError {
RETRY, // 自动重试
ALARM, // 告警通知
SUSPEND, // 挂起流程
TERMINATE // 强制终止
}
/**
* 流程配置项
*/
@Data
public class ProcessConfig {
private boolean autoRoute; // 自动路由
private OnError errorStrategy; // 异常策略
private boolean versionControl; // 版本控制
private int timeoutMinutes; // 审批超时时间
}
2. 流程定义与节点模型
/**
* 流程节点定义
*/
@Data
public class FlowNode {
private String nodeId;
private String nodeName;
private NodeType nodeType;
private String assigneeRole; // 审批角色
private String assigneeUser; // 审批人(可选)
}
/**
* 条件路由规则
*/
@Data
public class RouteCondition {
private String sourceNodeId; // 源节点
private String targetNodeId; // 目标节点
private String expression; // 条件表达式
}
/**
* 流程定义模型
*/
@Data
public class ProcessDefinition {
private String processId;
private String processName;
private Integer version;
private List<FlowNode> nodes = new ArrayList<>();
private List<RouteCondition> conditions = new ArrayList<>();
}
3. 工作流引擎核心逻辑
/**
* 工作流引擎核心类
*/
@Service
public class WorkflowEngine {
@Resource
private ProcessInstanceService instanceService;
/**
* 初始化并启动流程
*/
public ProcessInstance startProcess(ProcessDefinition definition,
ProcessConfig config,
Map<String, Object> formData) {
// 1. 校验流程定义合法性
validateProcess(definition);
// 2. 创建流程实例
ProcessInstance instance = instanceService.createInstance(definition, formData);
// 3. 推入开始节点
FlowNode startNode = findStartNode(definition);
instance.setCurrentNodeId(startNode.getNodeId());
// 4. 自动路由推进
if (config.isAutoRoute()) {
doAutoRoute(instance, definition, config);
}
// 5. 保存并返回实例
instanceService.updateInstance(instance);
return instance;
}
/**
* 条件路由执行(核心)
*/
private void doAutoRoute(ProcessInstance instance,
ProcessDefinition definition,
ProcessConfig config) {
try {
String currentNodeId = instance.getCurrentNodeId();
List<RouteCondition> conditions = definition.getConditions().stream()
.filter(c -> c.getSourceNodeId().equals(currentNodeId))
.collect(Collectors.toList());
for (RouteCondition condition : conditions) {
// 表达式引擎执行条件判断
boolean match = evaluateExpression(condition.getExpression(), instance.getFormData());
if (match) {
instance.setCurrentNodeId(condition.getTargetNodeId());
// 递归推进
doAutoRoute(instance, definition, config);
break;
}
}
} catch (Exception e) {
handleError(instance, config.getErrorStrategy(), e);
}
}
/**
* 异常处理
*/
private void handleError(ProcessInstance instance, OnError strategy, Exception e) {
switch (strategy) {
case RETRY: doAutoRoute(instance, ...); break;
case ALARM: sendAlarm(instance, e); break;
case SUSPEND: instance.setStatus(ProcessStatus.SUSPENDED); break;
case TERMINATE: instance.setStatus(ProcessStatus.TERMINATED); break;
}
}
}
三、XML流程模板配置(轻量集成)
在低代码平台中,流程通常由设计器导出为XML,由引擎解析加载。
<process id="purchase_approval" name="采购审批" version="1">
<nodes>
<node id="start1" name="提交申请" type="START"/>
<node id="approve1" name="部门经理审批" type="APPROVAL" role="dept_manager"/>
<node id="approve2" name="财务审核" type="APPROVAL" role="finance"/>
<node id="end1" name="审批完成" type="END"/>
</nodes>
<conditions>
<condition source="approve1" target="approve2">amount > 5000</condition>
<condition source="approve1" target="end1">amount <= 5000</condition>
</conditions>
</process>
四、表单模型与业务实践(严谨工程版)
金额必须用BigDecimal,日期用LocalDate,避免精度与时区问题。
@Data
public class PurchaseApplyForm {
private String applyId; // 申请单号
private String applicant; // 申请人
private LocalDate applyTime; // 申请时间
private BigDecimal amount; // 申请金额
private String purchaseType; // 采购类型
private String reason; // 采购原因
private Map<String, Object> ext; // 扩展字段
}
流程启动服务层
@Service
public class PurchaseWorkflowService {
@Resource
private WorkflowEngine workflowEngine;
public String startPurchaseFlow(PurchaseApplyForm form) {
// 构造流程数据
Map<String, Object> data = BeanUtil.beanToMap(form);
// 获取已发布流程定义
ProcessDefinition definition = processRepository.getReleasedProcess("purchase_approval");
// 流程配置
ProcessConfig config = new ProcessConfig();
config.setAutoRoute(true);
config.setErrorStrategy(OnError.ALARM);
config.setTimeoutMinutes(1440);
// 启动
ProcessInstance instance = workflowEngine.startProcess(definition, config, data);
return instance.getInstanceId();
}
}
五、工程化价值与效率对比
| 维度 | 传统硬编码流程 | Java低代码工作流 |
|---|---|---|
| 流程上线周期 | 3~7天 | 1~2小时 |
| 变更成本 | 高,需改代码、测试、发布 | 低,可视化修改 |
| 出错率 | 约12%~18% | 约2%以内 |
| 平均审批周期 | 2~3天 | 4~8小时 |
| 可追溯性 | 弱,日志分散 | 强,全链路审计 |
核心收益:
- 研发效率提升3~5倍
- 流程变更成本下降90%
- 审批周期缩短80%
- 合规与审计能力原生支持
六、总结
基于Java构建低代码工作流引擎,不是简单的“拖拽页面”,而是流程模型抽象、规则引擎集成、状态机管理、任务调度的系统性工程。本文提供的引擎结构、代码实现、XML模板、表单模型,可直接用于SpringBoot/SpringCloud微服务架构落地。
在实际企业场景中,可进一步扩展:
- 集成Flowable/Activiti内核
- 支持会签、或签、委托、转交、加签
- 对接消息推送、钉钉/企业微信审批
- 流程监控大屏、超时预警、数据分析