# abstract-flow-engine
**Repository Path**: panda_student/abstract-flow-engine
## Basic Information
- **Project Name**: abstract-flow-engine
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-10
- **Last Updated**: 2025-11-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 抽象审批流程引擎框架
一个基于Java的轻量级、可扩展的审批流程引擎框架,采用面向对象设计,遵循SOLID原则,支持自定义审批节点和流程定义。
## 功能特性
- ✅ 流程定义管理
- ✅ 流程实例执行
- ✅ 审批节点抽象
- ✅ 流程状态管理
- ✅ 节点历史记录
- ✅ 单元测试覆盖
- ✅ 可扩展架构
## 快速开始
### 1. 添加依赖
```xml
com.flowengine
abstract-flow-engine
1.0.0
```
### 2. 创建自定义审批节点
```java
package com.example;
import com.flowengine.*;
/**
* 自定义审批节点示例
*/
public class CustomApprovalNode extends AbstractApprovalNode {
private final String nextNodeId;
public CustomApprovalNode(String nodeId, String nodeName, String nextNodeId) {
super(nodeId, nodeName, "custom");
this.nextNodeId = nextNodeId;
}
@Override
protected NodeResult doExecute(FlowContext context) {
// 实现自定义审批逻辑
String amount = (String) context.getVariable("amount");
if (amount != null && Integer.parseInt(amount) <= 1000) {
// 金额小于等于1000,自动审批通过
return createSuccessResult("金额在限额内,自动审批通过");
} else {
// 需要人工审批
return createNeedReapprovalResult("金额超过限额,需要人工审批");
}
}
@Override
public String getNextNodeId(FlowContext context) {
return nextNodeId;
}
@Override
public String getAssignee(FlowContext context) {
// 根据业务逻辑动态分配处理人
String department = (String) context.getVariable("department");
if ("技术部".equals(department)) {
return "tech-approver";
} else {
return "default-approver";
}
}
}
```
### 3. 创建自定义流程引擎
```java
package com.example;
import com.flowengine.*;
import java.util.*;
/**
* 自定义流程引擎示例
*/
public class CustomFlowEngine extends AbstractFlowEngine {
@Override
protected String generateFlowInstanceId() {
return "flow-" + UUID.randomUUID().toString().substring(0, 8);
}
@Override
protected String getStartNodeId(String flowDefinitionId) {
// 根据流程定义ID返回起始节点ID
switch (flowDefinitionId) {
case "expense-approval":
return "start-expense";
case "leave-approval":
return "start-leave";
default:
return "start-default";
}
}
@Override
protected FlowContext createFlowContext(FlowInstance instance) {
return new DefaultFlowContext(
instance.getFlowInstanceId(),
instance.getFlowDefinitionId(),
instance.getInitiator(),
instance.getVariables()
);
}
@Override
protected void recordNodeHistory(FlowInstance instance, ApprovalNode node, NodeResult result) {
NodeHistory history = new NodeHistory(
node.getNodeId(),
node.getNodeName(),
node.getNodeType(),
result.getStatus(),
instance.getCurrentAssignee(),
new Date(),
instance.getApprovalComment(),
result.getMessage()
);
instance.addHistory(history);
}
/**
* 初始化流程定义
*/
public void initializeFlowDefinitions() {
// 创建费用审批流程
createExpenseApprovalFlow();
// 创建请假审批流程
createLeaveApprovalFlow();
}
private void createExpenseApprovalFlow() {
// 创建节点
CustomApprovalNode startNode = new CustomApprovalNode("start-expense", "费用申请开始", "amount-check");
CustomApprovalNode amountCheckNode = new CustomApprovalNode("amount-check", "金额检查", "manager-approval");
CustomApprovalNode managerNode = new CustomApprovalNode("manager-approval", "经理审批", "finance-approval");
CustomApprovalNode financeNode = new CustomApprovalNode("finance-approval", "财务审批", null);
// 注册节点
registerNode(startNode);
registerNode(amountCheckNode);
registerNode(managerNode);
registerNode(financeNode);
// 创建流程定义
FlowDefinition definition = new FlowDefinition(
"expense-approval",
"费用审批流程",
"员工费用报销审批流程",
"start-expense",
Arrays.asList(
new NodeDefinition("start-expense", "费用申请开始", "start", null, "amount-check", new HashMap<>()),
new NodeDefinition("amount-check", "金额检查", "custom", null, "manager-approval", new HashMap<>()),
new NodeDefinition("manager-approval", "经理审批", "custom", null, "finance-approval", new HashMap<>()),
new NodeDefinition("finance-approval", "财务审批", "custom", null, null, new HashMap<>())
),
"1.0"
);
registerFlowDefinition(definition);
}
private void createLeaveApprovalFlow() {
// 创建请假审批流程节点...
// 类似费用审批流程的实现
}
}
```
### 4. 使用流程引擎
```java
package com.example;
import java.util.*;
public class FlowEngineDemo {
public static void main(String[] args) {
// 创建流程引擎实例
CustomFlowEngine flowEngine = new CustomFlowEngine();
flowEngine.initializeFlowDefinitions();
// 启动费用审批流程
Map variables = new HashMap<>();
variables.put("amount", "800");
variables.put("department", "技术部");
variables.put("reason", "项目差旅费用");
String flowInstanceId = flowEngine.startFlow("expense-approval", "employee123", variables);
System.out.println("流程启动成功,实例ID: " + flowInstanceId);
// 执行流程
FlowResult result = flowEngine.executeFlow(flowInstanceId);
System.out.println("流程执行结果: " + result.isSuccess());
// 获取当前节点信息
NodeInfo currentNode = flowEngine.getCurrentNode(flowInstanceId);
if (currentNode != null) {
System.out.println("当前节点: " + currentNode.getNodeName());
}
// 审批通过当前节点
FlowResult approveResult = flowEngine.approve(flowInstanceId, "manager1", "同意报销");
System.out.println("审批结果: " + approveResult.getMessage());
// 获取流程历史
List history = flowEngine.getFlowHistory(flowInstanceId);
for (NodeHistory record : history) {
System.out.println("节点: " + record.getNodeName() + ", 状态: " + record.getStatus());
}
}
}
```
## 核心类说明
### 主要接口
- `FlowEngine` - 流程引擎核心接口
- `ApprovalNode` - 审批节点接口
- `FlowContext` - 流程上下文接口
### 主要抽象类
- `AbstractFlowEngine` - 抽象流程引擎基类
- `AbstractApprovalNode` - 抽象审批节点基类
### 主要实体类
- `FlowDefinition` - 流程定义
- `FlowInstance` - 流程实例
- `NodeDefinition` - 节点定义
- `NodeHistory` - 节点历史记录
- `FlowResult` - 流程执行结果
- `NodeResult` - 节点执行结果
## 测试
项目包含完整的单元测试,确保框架功能的正确性:
```bash
mvn test
```
## 扩展指南
### 自定义审批节点
1. 继承 `AbstractApprovalNode` 类
2. 实现 `doExecute()` 方法,编写审批逻辑
3. 重写 `getNextNodeId()` 方法,定义节点路由
4. 重写 `getAssignee()` 方法,动态分配处理人
### 自定义流程引擎
1. 继承 `AbstractFlowEngine` 类
2. 实现抽象方法:
- `generateFlowInstanceId()` - 生成流程实例ID
- `getStartNodeId()` - 获取起始节点ID
- `createFlowContext()` - 创建流程上下文
- `recordNodeHistory()` - 记录节点历史
## 最佳实践
1. **节点设计**:每个节点职责单一,避免复杂逻辑
2. **错误处理**:在节点执行中妥善处理异常情况
3. **状态管理**:合理使用流程状态和节点状态
4. **历史记录**:记录完整的审批历史便于审计
5. **测试覆盖**:为自定义节点编写单元测试
## 版本信息
- 当前版本:1.0.0
- Java版本:8+
- 测试框架:JUnit 5
- 构建工具:Maven
## 许可证
MIT License