# 流程引擎客户端(forge-flow-client)
流程引擎 REST 客户端模块,支持通过注解将业务方法与流程实例绑定,自动启动流程和处理流程事件。
## 快速开始
### 1. 引入依赖
```xml
com.mdframe.forge
forge-flow-client
```
### 2. 配置流程服务地址
```yaml
forge:
flow:
client:
url: http://localhost:8080 # 流程服务地址
token: your-auth-token # 服务间认证 Token(可选)
connect-timeout: 3000 # 连接超时(ms)
read-timeout: 10000 # 读取超时(ms)
redis-subscribe: true # 是否启用 Redis Pub/Sub 订阅流程事件
```
## 核心功能
### 注解驱动的流程集成
#### `@FlowBind` — 绑定流程模型
标注在 Service 类上,声明该类与某个流程模型关联:
```java
@Service
@FlowBind(modelKey = "leave", businessType = "leave_request")
public class LeaveService {
// ...
}
```
#### `@FlowStart` — 自动启动流程
标注在方法上,方法执行成功后自动启动流程:
```java
@FlowStart(
businessKeySpEl = "#result.id",
titleSpEl = "#request.title",
variablesSpEl = "#request.variables"
)
public LeaveResult submitLeave(LeaveRequest request) {
// 提交请假申请...
return result; // 方法成功后自动启动流程
}
```
| 属性 | 说明 |
|------|------|
| `modelKey` | 流程模型编码(可选,默认取类级别 `@FlowBind` 的值) |
| `businessKeySpEl` | **必填**,业务主键 SpEL 表达式 |
| `titleSpEl` | 流程标题 SpEL |
| `userIdSpEl` | 申请人 ID SpEL |
| `userNameSpEl` | 申请人姓名 SpEL |
| `deptIdSpEl` | 申请部门 ID SpEL |
| `deptNameSpEl` | 申请部门名称 SpEL |
| `variablesSpEl` | 流程变量 SpEL |
| `skipOnError` | 发生异常时是否跳过(默认 true) |
#### `@FlowCallback` — 流程事件回调
标注在方法上,接收流程引擎推送的事件:
```java
@FlowCallback(on = {FlowEventContext.ON_COMPLETED, FlowEventContext.ON_REJECTED})
public void onFlowComplete(FlowEventContext context) {
if (context.getEventType().equals(FlowEventContext.ON_COMPLETED)) {
// 流程审批通过
leaveService.approve(context.getBusinessKey());
} else {
// 流程被驳回
leaveService.reject(context.getBusinessKey());
}
}
```
| 属性 | 说明 |
|------|------|
| `on` | 监听的事件类型列表 |
**可用事件类型**:
| 事件常量 | 说明 |
|----------|------|
| `ON_COMPLETED` | 流程完成(审批通过) |
| `ON_REJECTED` | 流程被驳回 |
| `ON_CANCELED` | 流程被取消 |
| `ON_TASK_CREATED` | 任务创建 |
| `ON_TASK_COMPLETED` | 任务完成 |
| `ON_TASK_ASSIGNED` | 任务被分配 |
### `FlowEventContext`
流程事件上下文,传递给 `@FlowCallback` 方法:
| 字段 | 说明 |
|------|------|
| `event` / `eventType` | 事件类型 |
| `businessKey` | 业务主键 |
| `processInstanceId` | 流程实例 ID |
| `processDefKey` | 流程定义编码 |
| `title` | 流程标题 |
| `startUserId` / `applyUserId` | 申请人 ID |
| `startUserName` / `applyUserName` | 申请人姓名 |
| `eventTime` | 事件时间 |
| `lastComment` | 最新审批意见 |
| `taskId` | 任务 ID |
| `taskName` | 任务名称 |
| `assigneeId` | 处理人 ID |
| `assigneeName` | 处理人姓名 |
| `comment` | 审批意见 |
| `variables` | 流程变量 |
## REST API 封装
`FlowClient` 封装了以下流程服务接口调用:
### 流程操作
| 方法 | 说明 |
|------|------|
| `startProcess()` | 启动流程 |
| `getProcessStatus()` | 查询流程状态 |
| `terminateProcess()` | 终止流程 |
| `withdrawProcess()` | 撤回流程 |
| `getProcessVariables()` | 获取流程变量 |
| `updateProcessVariables()` | 更新流程变量 |
### 任务操作
| 方法 | 说明 |
|------|------|
| `approve()` | 审批通过 |
| `reject()` | 驳回 |
| `delegate()` | 转交任务 |
| `claimTask()` | 签收任务 |
| `remind()` | 催办 |
### 查询
| 方法 | 说明 |
|------|------|
| `getTodoTasks()` | 待办任务列表 |
| `getDoneTasks()` | 已办任务列表 |
| `getStartedTasks()` | 我发起的流程 |
| `getProcessComments()` | 获取审批意见列表 |
| `getProcessDiagram()` | 获取流程图 |
| `getModelList()` | 获取流程模型列表 |
## 动态 Token
`FlowTokenProvider` 接口支持动态获取认证 Token:
```java
@Component
public class MyFlowTokenProvider implements FlowTokenProvider {
@Override
public String getToken() {
// 从配置中心/缓存中获取动态 Token
return configService.getFlowToken();
}
}
```
## 核心组件
| 组件 | 说明 |
|------|------|
| `FlowClient` | 流程服务 HTTP 客户端 |
| `FlowStartAspect` | `@FlowStart` AOP 切面 |
| `FlowEventSubscriber` | Redis Pub/Sub 事件订阅,路由到 `@FlowCallback` 方法 |
| `FlowClientHelperAutoConfiguration` | 辅助组件自动配置 |
| `FlowResult` | 流程服务统一响应体 |
| `FlowClientException` | 流程客户端自定义异常 |