## 3.8.1 更新与兼容说明


* 添加 `solon-flow` FlowContext:toJson,fromJson 序列化方法（方便持久化和恢复）
* 添加 `solon-flow` NodeTrace 类
* 添加 `solon-flow` NodeSpec.then 方法
* 添加 `solon-flow` FlowEngine.then 方法
* 添加 `solon-flow` FlowContext.with 方法（强调方法域内的变量）
* 添加 `solon-flow` FlowContext.containsKey 方法
* 添加 `solon-flow` FlowContext.isStopped 方法（用于外部检测）
* 添加 `solon-flow` NamedTaskComponent 接口，方便智能体开发
* 添加 `solon-flow` 多图多引擎状态记录与序列化支持
* 添加 `solon-flow-workflow` findNextTasks 替代 getTasks（后者标为弃用）
* 添加 `solon-flow-workflow` claimTask、findTask 替代 getTask（后者标为弃用，逻辑转为新的 claimTask）
* 添加 `solon-flow-workflow` WorkflowIntent 替代之前的临时变量（扩展更方便）
* 优化 `solon-flow` FlowContext 接口设计，并增加持久化辅助方法
* 优化 `solon-flow` FlowContext.eventBus 内部实现改为字段模式
* 优化 `solon-flow` start 类型节点改为自由流出像 activity 一样（只是没有任务）
* 优化 `solon-flow` loop 类型节点改为自由流出像 activity 一样
* 优化 `solon-flow` 引擎的 onNodeEnd 执行时机（改为任务执行之后，连接流出之前）
* 优化 `solon-flow` 引擎的 onNodeStart 执行时机（改为任务执行之前，连接流入之后）
* 优化 `solon-flow` 引擎的 reverting 处理（支持跨引擎多图场景）
* 优化 `solon-flow` Node,Link toString 处理（加 whenComponent）
* 优化 `solon-flow` FlowExchanger.runGraph 如果子图没有结束，则当前分支中断
* 调整 `solon-flow` 移除 FlowContext:incrAdd,incrGet 弃用预览接口
* 调整 `solon-flow` FlowContext:executor 转移到 FlowDriver
* 调整 `solon-flow` FlowInterceptor:doIntercept 更名为 interceptFlow，并标为 default（扩展时语义清晰，且不需要强制实现）
* 调整 `solon-flow` NodeTrace 更名为 NodeRecord，并增加 FlowTrace 类。支持跨图多引擎场景
* 调整 `solon-flow` “执行深度”改为“执行步数”（更符合实际需求）
* 调整 `solon-flow-workflow` Action Jump 规范，目标节点设为 WAITING（之前为 COMPLETED）
* 调整 `solon-flow-workflow` getTask（由新名 claimTask 替代） 没有权限时返回 null（之前返回一个未知状态的任务，容易误解）
* 调整 `solon-flow-workflow` WorkflowService 改为 WorkflowExecutor，缩小概念范围（前者仍可用但标为弃用）
* 修复 `solon-flow` FlowContext 跨多引擎中转时 exchanger 的冲突问题
* 修复 `solon-flow` 跨图单步执行时，步数传导会失效的问题
* 修复 `solon-flow` ActorStateController 没有对应的元信息会失效的问题
* 修复 `solon-flow-workflow` 跨图单步执行时，步数传导会失效的问题

兼容变化对照表：

| 旧名称                         | 新名称                    | 备注                                |
|-----------------------------|------------------------|-----------------------------------|
| WorkflowService             | WorkflowExecutor       | 缩小概念范围（前者标为弃用）                    |
| FlowInterceptor:doIntercept | interceptFlow          | 扩展时语义清晰（方便与 ToolInterceptor 合到一起） |
| FlowContext:executor        | FlowDriver:getExecutor | 上下文不适合配置线程池                       |
| FlowContext:incrAdd,incrGet | /                      | 移除                                |
| NodeTrace                   | NodeRecord             | 支持跨图多引擎场景                         |
| /                           | FlowTrace              | 支持跨图多引擎场景                         |


WorkflowExecutor （更清晰的）接口对照表：


| WorkflowService 旧接口  | WorkflowExecutor 新接口 | 备注                                 |
|----------------------|----------------------|------------------------------------|
| getTask              | claimTask            | 认领任务：权限匹配 + 状态激活                   |
| getTask              | findTask             | 查询任务：查找下一个待处理节点，或者结束节点                               |
| getTask              | /                    | 原来的功能混乱，新的拆解成 claimTask 和 findTask |
| getTasks             | findNextTasks        | 查询下一步任务列表                          |
| getState             | getState             | 获取状态                               |
| postTask             | submitTask           | 提交任务                               |




新特性预览：上下文序列化与持久化


```java
//恢复的上下文
FlowContext context = FlowContext.fromJson(json);
//新上下文
FlowContext context = FlowContext.of();

//从恢复上下文开始持行
flowEngine.eval(graph, context);

//转为 json（方便持久化）
json = context.toJson();
```

新特性预览：WorkflowExecutor

```java
// 1. 创建执行器
WorkflowExecutor workflow = WorkflowExecutor.of(engine, controller, repository);

// 2. 认领任务（检查是否有可操作的待处理任务）
Task current = workflow.claimTask(graph, context);
if (current != null) {
    // 3. 提交任务处理
    workflow.submitTask(current, TaskAction.FORWARD, context);
}

// 4. 查找后续可能任务（下一步）
Collection<Task> nextTasks = workflow.findNextTasks(graph, context);
```




## 3.8.0 更新与兼容说明


* 新增 `solon-flow-workflow` 插件（替代 FlowStatefulService 接口）



兼容变化对照表：

| 旧名称                      | 新名称                            | 说明                            |  
|--------------------------|--------------------------------|-------------------------------|
| `GraphDecl`              | `GraphSpec`                    | 图定义                           |
| `LinkDecl`               | `LinkSpec`                     | 连接定义                          |
| `NodeDecl`               | `NodeSpec`                     | 节点定义                          |
| `Condition`              | `ConditionDesc`                | 条件描述                          |
| `Task`                   | `TaskDesc`                     | 任务描述（可避免与 workflow 的概念冲突） |
|                          |                                |                               |
| `FlowStatefulService`    | `WorkflowService`              | 工作流服务                         |
| `StatefulTask`           | `Task`                         | 任务                            | 
| `Operation`              | `TaskAction`                   | 任动工作                          | 
| `TaskType`               | `TaskState`                    | 任务状态                          | 
|                          |                                |                               |
| `Evaluation.runTest(..)` | `Evaluation.runCondition(..)`  | 运行条件                          |


FlowStatefulService 到 WorkflowService 的接口变化对照表：

| 旧名称                          | 新名称                     | 说明     |  
|------------------------------|-------------------------|--------|
| `postOperation(..)`          | `postTask(..)`          | 提交任务   |
| `postOperationIfWaiting(..)` | `postTaskIfWaiting(..)` | 提交任务   |
|                              |                         |        |
| `evel(..)`                   | /                       | 执行     |
| `stepForward(..)`            | /                       | 单步前进   |
| `stepBack(..)`               | /                       | 单步后退   |
|                              |                         |        |
| /                            | `getState(..)`          | 获取状态   |



新特性预览：Graph 硬编码方式（及修改能力增强）

```java
//硬编码
Graph graph = Graph.create("demo1", "示例", spec -> {
    spec.addStart("start").title("开始").linkAdd("01");
    spec.addActivity("n1").task("@AaMetaProcessCom").linkAdd("end");
    spec.addEnd("end").title("结束");
});

//修改
Graph graphNew = Graph.copy(graph, spec -> {
    spec.getNode("n1").linkRemove("end").linkAdd("n2"); //移掉 n1 连接；改为 n2 连接
    spec.addActivity("n2").linkAdd("end");
});
```

新特性预览：FlowContext:lastNodeId （计算的中断与恢复）。参考：https://solon.noear.org/article/1246

```java
flowEngine.eval(graph, context.lastNodeId(), context);
//...（从上一个节点开始执行）
flowEngine.eval(graph, context.lastNodeId(), context);
```


新特性预览：WorkflowService（原名 FlowStatefulService）

```java
WorkflowService workflow = WorkflowService.of(engine, WorkflowDriver.builder()
        .stateController(new ActorStateController()) 
        .stateRepository(new InMemoryStateRepository()) 
        .build());


//1. 取出任务
Task task = workflow.getTask(graph, context);

//2. 提交任务
workflow.postTask(task.getNode(), TaskAction.FORWARD, context);
```
