diff --git a/flowable/流程产品设计.md b/flowable/流程产品设计.md new file mode 100644 index 00000000..4ef42952 --- /dev/null +++ b/flowable/流程产品设计.md @@ -0,0 +1,99 @@ + + +## 一、 产品功能矩阵 + +| 维度 | 功能点 | 业务描述 | +| :--- | :--- | :--- | +| **流程建模** | **拓扑解析与保存** | 解析执行节点、串/并行网关及连线拓扑;支持流程模板版本管理。 | +| | **节点配置映射** | 支持节点级参数配置,包括执行模式(自动/手动)与调用模式(同步/异步)。 | +| **数据管理** | **参数快照** | 保存算例启动时的输入参数与仿真参数,支持运行中动态更新。 | +| | **文件 I/O 管控** | 自动初始化本地磁盘执行空间;支持基于规则的前序输出文件自动筛选。 | +| **执行控制** | **多样化启动** | 支持“一键全量启动”与“指定任意节点启动”。 | +| | **精细化状态机** | 流程与节点两级状态管控(待执行/执行中/暂停/完成/异常/取消)。 | +| **异常恢复** | **双重重试机制** | 支持“当前节点原位重试”与“前置节点回退重试”。 | +| | **人工干预** | 支持“强制放行/跳过”失败节点。 | + +--- + +## 二、 核心数据库设计 (Database Schema) + +### 1. 流程模板表 `simulation_flow_template` +* **uuid**: 模板唯一标识(替代原 `processDefinitionId`)。 +* **viewContent**: 静态拓扑 JSON(节点、连线、网关)。 +* **approveFlowId**: 关联的审批流 ID。 + +### 2. 流程实例表 (算例表) `simulation_run` +* **uuid**: 算例唯一标识(替代原 `processInstanceId`)。 +* **status**: 总状态(INIT, RUNNING, SUSPENDED, SUCCESS, ERROR, CANCELLED)。 +* **viewContent**: **实例运行快照**(启动时从模板拷贝,保证运行中不受模板修改影响)。 +* **progress**: `totalStep` / `currentStep` / `currentStepName`。 +* **paramJson**: 流程全局启动参数。 + +### 3. 流程节点实例表 `simulation_flow_node` +* **runId / nodeId**: 联合主键。 +* **pre_node_ids / next_node_ids**: 存储入度与出度 ID 列表。 +* **status**: 节点状态(含 `WAITING_CALLBACK`, `WAITING_USER` 等中间态)。 +* **inputDirId / outPutDirId**: 物理 I/O 目录关联。 +* **paramJson**: 节点局部配置参数(含 `isAsync`, `executeMode`)。 +* **requestJson / resultJson**: 记录执行器入参及回调/执行结果。 + +--- + +## 三、 系统核心组件 (Core Components) + +### 1. 解析与构建器 (Parser) +* **职责**:解析 `viewContent` JSON。 +* **逻辑**:在算例实例化时,一次性计算每个节点的入度(依赖项)与出度(触发项),打平存储至 `simulation_flow_node`,后续流转不再解析 JSON。 + +### 2. 调度推进器 (Dispatcher) +* **核心动作**: + * **寻找下游**:节点 `SUCCESS` 后,获取其 `next_node_ids`。 + * **并行汇聚 (AND-Join)**:检查下游节点的所有 `pre_node_ids` 是否全部为 `SUCCESS`。 +* **并发控制**:采用 **Redisson 分布式锁 (锁粒度: runId + targetNodeId)** + **状态机 CAS (INIT -> RUNNING)**,防止并行分支冲突导致节点重复执行。 + +### 3. 执行器工厂 (Executor Factory) +* **IProcessExecutor 接口**:定义 `execute`(执行)与 `cancel`(强杀)。 +* **算子实现**: + * `HpcExecutor`:提交 HPC 任务,更新状态为 `WAITING_CALLBACK`。 + * `LocalAppExecutor`:拉起本地应用,支持同步或异步模式。 + + +### 4. 异步回调中心 (Callback Center) +* **职责**:接收外部系统(HPC/本地应用)的结果回传。 +* **逻辑**:更新节点状态与 `resultJson` -> 判定 `SUCCESS` -> 唤醒 `Dispatcher.dispatchNext()`。 + +--- + +## 四、 关键业务逻辑流转 + +### 1. 执行模式管控 (Auto vs Manual) +* **触发点**:`Dispatcher` 准备唤醒节点前。 +* **逻辑**:检查 `executeMode`,若为 `MANUAL` 则将状态设为 `WAITING_USER` 并停机;待用户调用 `/continueServiceTask` 后,再由 `ExecutorFactory` 真正拉起。 + +### 2. 调用模式管控 (Async vs Sync) +* **触发点**:`Executor.execute()` 内部。 +* **逻辑**: + * `isAsync: true` -> 记录异步任务,节点设为 `WAITING_CALLBACK`,释放线程。 + * `isAsync: false` -> 执行完逻辑后立即将状态设为 `SUCCESS`,手动触发 `Dispatcher`。 + +### 3. 异常管控与干预 +* **强制放行**:手动将 `ERROR` 节点改为 `SUCCESS`,由管理员触发 `Dispatcher` 继续向下。 +* **重试节点**:将 `ERROR` 改回 `INIT`,清理旧数据,由 `ExecutorFactory` 重新拉起。 +* **暂停/恢复**:修改 `simulation_run.status`;`Dispatcher` 每次调度前校验此状态。 + +--- + +## 五、 待完成与深度设计 (To-be-discussed) + +### 1. 物理取消与防回调重新激活 +* **取消逻辑**:取消算例时,需递归调用所有运行中节点的 `Executor.cancel()`(如 HPC 作业)。 +* **防御机制**:回调中心增加状态校验,若节点状态已为 `CANCELLED`,则丢弃后续回传的 `SUCCESS` 信号。 + +### 2. 精细化状态机 +* 定义严格的状态跳转矩阵(例如:`SUCCESS` 节点禁止跳转回 `RUNNING`,除非经过重置)。 + +### 3. 级联回退重试 (Rewind/Retry) +* **算法**:从选定节点开始,通过 `next_node_ids` **BFS(广度优先搜索)** 找到所有子图节点。 +* **清理**:物理强杀运行中节点 -> 逻辑重置所有子图节点为 `INIT` -> 清理磁盘目录 -> 重新启动。 + +---