|
13 | 13 | - `title`: 流程名称 |
14 | 14 | - `form`: 流程表单定义 (`FormMeta`) |
15 | 15 | - `nodes`: 节点列表 (`List<IFlowNode>`) |
16 | | - - `edges`: 节点连接关系 (`List<FlowEdge>`) |
17 | 16 | - `operatorCreateScript`: 创建者匹配脚本 |
18 | | - - `isInterfere`: 是否开启干预 |
19 | | - - `isRevoke`: 是否开启撤销 |
| 17 | + - `strategies`: 流程策略列表 (`List<IWorkflowStrategy>`) |
20 | 18 | - `createdOperator`: 创建者ID |
21 | 19 | - `createdTime`: 创建时间 |
| 20 | + - `updatedTime`: 更新时间 |
22 | 21 | - `schema`: 流程版本标识 |
23 | 22 | - **核心方法**: |
24 | 23 | - `verify()`: 验证流程定义的合法性 |
25 | | - - `nextNodes(IFlowNode)`: 获取指定节点的后续节点 |
| 24 | + - `nextNodes(IFlowNode)`: 获取指定节点的后续节点(通过FlowNodeEdgeManager遍历blocks) |
26 | 25 | - `getStartNode()`: 获取开始节点 |
27 | 26 | - `getEndNode()`: 获取结束节点 |
28 | 27 | - `toJson()`: 序列化为JSON |
29 | 28 | - `formJson(String)`: 从JSON反序列化(静态方法) |
| 29 | +- **数据结构说明**: |
| 30 | + - 节点关系通过`blocks`属性实现层次化结构,不再使用单独的`edges`边关系 |
| 31 | + - 流程策略(InterfereStrategy、UrgeStrategy)在流程级别配置 |
30 | 32 |
|
31 | 33 | #### WorkflowBuilder |
32 | 34 | - **位置**: `com.codingapi.flow.workflow.WorkflowBuilder` |
|
47 | 49 | 3. `generateCurrentRecords(FlowSession)`: 生成当前节点的流程记录 |
48 | 50 | 4. `isDone(FlowSession)`: 判断节点是否完成 |
49 | 51 | 5. `fillNewRecord(FlowSession, FlowRecord)`: 填充新记录数据 |
50 | | - 6. `filterBranches()`: 过滤条件分支 |
51 | | - 7. `actionManager()`: 获取动作管理器 |
52 | | - 8. `nodeStrategyManager()`: 获取策略管理器 |
| 52 | + 6. `blocks()`: 获取当前节点的子节点列表(块节点有子节点,其他节点返回null或空) |
| 53 | + 7. `filterBranches()`: 过滤条件分支(块节点用于筛选执行的分支) |
| 54 | + 8. `actionManager()`: 获取动作管理器 |
| 55 | + 9. `nodeStrategyManager()`: 获取策略管理器 |
53 | 56 |
|
54 | 57 | #### BaseFlowNode |
55 | 58 | - **位置**: `com.codingapi.flow.node.BaseFlowNode` |
56 | 59 | - **职责**: 所有节点的抽象基类,实现IFlowNode的默认行为 |
57 | | -- **核心属性**: `id`, `name`, `order`, `actions`, `strategies` |
| 60 | +- **核心属性**: `id`, `name`, `order`, `actions`, `strategies`, `blocks`(子节点列表) |
58 | 61 | - **核心方法**: |
59 | 62 | - `isWaitParallelRecord()`: 判断是否等待并行节点汇聚 |
60 | 63 | - `verifySession()`: 委托给ActionManager和StrategyManager验证 |
61 | 64 | - `setActions()`: 支持动作的复制更新(CustomAction除外) |
62 | 65 | - `setStrategies()`: 支持策略的复制更新 |
| 66 | + - `blocks()`: 返回子节点列表 |
| 67 | + - `toMap()`: 序列化为Map(包含blocks字段) |
| 68 | + - `fromMap()`: 从Map反序列化(从blocks字段加载子节点) |
63 | 69 |
|
64 | 70 | #### BaseAuditNode |
65 | 71 | - **位置**: `com.codingapi.flow.node.BaseAuditNode` |
|
73 | 79 | - `isDone()`: 通过StrategyManager判断多人审批完成状态 |
74 | 80 | - `generateCurrentRecords()`: 通过StrategyManager加载操作者并生成记录 |
75 | 81 |
|
76 | | -#### 节点类型一览 (12种) |
| 82 | +#### 块节点系统 (Block Nodes System) |
| 83 | + |
| 84 | +**数据结构变更说明**: |
| 85 | +- 旧设计: 使用独立的`FlowEdge`对象和`edges`列表表示节点连接关系 |
| 86 | +- 新设计: 使用层次化的`blocks`属性,节点包含子节点形成树形结构 |
| 87 | + |
| 88 | +**FlowNodeState** - 节点状态分类 |
| 89 | +- **位置**: `com.codingapi.flow.manager.FlowNodeState` |
| 90 | +- **职责**: 对节点进行分类,判断节点类型 |
| 91 | +- **节点分类**: |
| 92 | + - **块节点 (Block Nodes)**: `CONDITION`, `INCLUSIVE`, `PARALLEL` - 包含子节点的容器节点 |
| 93 | + - **分支节点 (Branch Nodes)**: `CONDITION_BRANCH`, `INCLUSIVE_BRANCH`, `PARALLEL_BRANCH` - 作为块节点的子节点 |
| 94 | +- **核心方法**: |
| 95 | + - `isBlockNode()`: 判断是否为块节点(有blocks属性) |
| 96 | + - `isBranchNode()`: 判断是否为分支节点 |
| 97 | + - `getBlocks()`: 获取节点的子节点列表 |
| 98 | + - `getFirstBlocks()`: 获取第一个子节点(用于分支节点) |
| 99 | + |
| 100 | +**FlowNodeEdgeManager** - 节点关系管理器 |
| 101 | +- **位置**: `com.codingapi.flow.manager.FlowNodeEdgeManager` |
| 102 | +- **职责**: 管理节点之间的连接关系,通过遍历blocks实现 |
| 103 | +- **核心方法**: |
| 104 | + - `getNextNodes(IFlowNode)`: 获取指定节点的后续节点 |
| 105 | + - `loadNextNodes()`: 递归加载下一节点(遍历blocks) |
| 106 | +- **遍历逻辑**: |
| 107 | + 1. 如果当前节点是块节点,返回其blocks |
| 108 | + 2. 如果当前节点是分支节点,返回其第一个block |
| 109 | + 3. 否则返回节点列表中的下一个节点 |
| 110 | + 4. 递归处理嵌套的blocks |
| 111 | + |
| 112 | +**NodeMapBuilder** - 节点映射构建器 |
| 113 | +- **位置**: `com.codingapi.flow.builder.NodeMapBuilder` |
| 114 | +- **职责**: 从Map数据构建节点对象 |
| 115 | +- **核心方法**: |
| 116 | + - `loadNodes(Map)`: 从Map的"blocks"键加载子节点列表 |
| 117 | + - `loadActions(Map)`: 加载节点动作 |
| 118 | + - `loadNodeStrategies(Map)`: 加载节点策略 |
| 119 | + |
| 120 | +**节点关系示例**: |
| 121 | +``` |
| 122 | +Workflow |
| 123 | +├── StartNode |
| 124 | +├── ApprovalNode |
| 125 | +├── ConditionNode (块节点) |
| 126 | +│ ├── blocks: |
| 127 | +│ │ ├── ConditionBranchNode (order=1) |
| 128 | +│ │ │ └── blocks: [NotifyNode, EndNode] |
| 129 | +│ │ └── ConditionBranchNode (order=2) |
| 130 | +│ │ └── blocks: [HandleNode, EndNode] |
| 131 | +└── EndNode |
| 132 | +``` |
| 133 | + |
| 134 | +#### 节点类型一览 (15种) |
| 135 | + |
| 136 | +**基础节点 (9种)**: |
| 137 | + |
| 138 | +| 节点类型 | 类名 | NODE_TYPE | 说明 | |
| 139 | +|---------|------|-----------|------| |
| 140 | +| 开始节点 | StartNode | `START` | 流程起点 | |
| 141 | +| 结束节点 | EndNode | `END` | 流程终点 | |
| 142 | +| 审批节点 | ApprovalNode | `APPROVAL` | 需要审批的任务节点 | |
| 143 | +| 办理节点 | HandleNode | `HANDLE` | 需要办理的任务节点 | |
| 144 | +| 路由分支 | RouterNode | `ROUTER` | 普通路由节点 | |
| 145 | +| 通知节点 | NotifyNode | `NOTIFY` | 发送通知 | |
| 146 | +| 延迟节点 | DelayNode | `DELAY` | 延迟执行 | |
| 147 | +| 触发节点 | TriggerNode | `TRIGGER` | 事件触发 | |
| 148 | +| 子流程节点 | SubProcessNode | `SUB_PROCESS` | 嵌套子流程 | |
| 149 | + |
| 150 | +**块节点/容器节点 (3种)** - 包含子节点(blocks): |
| 151 | + |
| 152 | +| 节点类型 | 类名 | NODE_TYPE | 说明 | |
| 153 | +|---------|------|-----------|------| |
| 154 | +| 条件控制 | ConditionNode | `CONDITION` | 条件分支容器,包含多个ConditionBranchNode | |
| 155 | +| 并行控制 | ParallelNode | `PARALLEL` | 并行分支容器,包含多个ParallelBranchNode | |
| 156 | +| 包容控制 | InclusiveNode | `INCLUSIVE` | 包容分支容器,包含多个InclusiveBranchNode | |
| 157 | + |
| 158 | +**分支节点 (3种)** - 作为块节点的子节点: |
77 | 159 |
|
78 | 160 | | 节点类型 | 类名 | NODE_TYPE | 说明 | |
79 | 161 | |---------|------|-----------|------| |
80 | | -| 开始节点 | StartNode | `start` | 流程起点 | |
81 | | -| 结束节点 | EndNode | `end` | 流程终点 | |
82 | | -| 审批节点 | ApprovalNode | `approval` | 需要审批的任务节点 | |
83 | | -| 办理节点 | HandleNode | `handle` | 需要办理的任务节点 | |
84 | | -| 条件分支 | ConditionBranchNode | `condition_branch` | 按条件路由 | |
85 | | -| 并行分支 | ParallelBranchNode | `parallel_branch` | 并行执行多个分支 | |
86 | | -| 路由分支 | RouterNode | `router` | 普通路由节点 | |
87 | | -| 包容分支 | InclusiveBranchNode | `inclusive_branch` | 包容性分支 | |
88 | | -| 通知节点 | NotifyNode | `notify` | 发送通知 | |
89 | | -| 延迟节点 | DelayNode | `delay` | 延迟执行 | |
90 | | -| 触发节点 | TriggerNode | `trigger` | 事件触发 | |
91 | | -| 子流程节点 | SubProcessNode | `sub_process` | 嵌套子流程 | |
| 162 | +| 条件分支 | ConditionBranchNode | `CONDITION_BRANCH` | 条件控制下的分支,包含条件脚本 | |
| 163 | +| 并行分支 | ParallelBranchNode | `PARALLEL_BRANCH` | 并行控制下的分支 | |
| 164 | +| 包容分支 | InclusiveBranchNode | `INCLUSIVE_BRANCH` | 包容控制下的分支 | |
92 | 165 |
|
93 | 166 | --- |
94 | 167 |
|
|
0 commit comments