# 最终修正落地方案(PM + 架构联合稿) 版本: v1.0 适用范围: 替代/修正 docs/01、docs/02、docs/03 中的关键设计,统一数据库为 MySQL 8.0,并固化 MVP 可落地路径。 — 一、产品与范围(MVP) - 目标:可视化工作流平台,支持编辑器(ReactFlow)、节点配置(动态表单/字段映射/表达式)、执行、审批。 - 明确不做(MVP):并行/子流程、定时/Webhook 触发、版本管理、多租户、复杂鉴权/监控、插件市场、AI 辅助。 - 闭环路径:前端构建 JSON → 后端转 BPMN(含条件分支)部署到 Flowable → 同步执行(审批点暂停并恢复)→ 执行/日志/任务可查询。 二、关键技术决策(统一口径) - 数据库:MySQL 8.0(JSON 类型用于 definition/fields/output_schema/input/output 等),字符集 utf8mb4。 - 表达式:仅采用 Jakarta EL (JUEL);Map-only 访问,禁用类/方法反射调用;前端不直接执行表达式,仅做占位/静态提示(第二期可加后端沙箱预览)。 - 执行:MVP 同步执行;Flowable 全局异步执行器关闭(async-executor-activate=false);审批链路天然异步(等待用户完成任务)。 - 条件分支:JSON 模型以 edge.condition(JUEL 表达式)表示;转换层生成 ExclusiveGateway + 条件 SequenceFlow。 - 节点扩展:Spring 插件化(WorkflowNode 接口 + NodeTypeMetadata + outputSchema),NodeTypeRegistry 负责注册/查询。 - HTTP 客户端:WebClient(Spring WebFlux),统一超时与重试策略;不混用 MVC + WebFlux。 三、架构总览(修正摘要) - 后端:Spring Boot 3.2 + Flowable 7.0.1 + MySQL 8.0 + Redis 7 + Jakarta EL;REST API(/api/workflows、/api/node-types、/api/tasks)。 - 前端:React 18 + TypeScript 5 + ReactFlow 11 + AntD 5 + Zustand + Axios;Vite 构建。 - 部署:Docker Compose(mysql:8、redis:7、backend),Nginx 反向代理(生产)。 四、后端落地清单 1) 依赖与配置 - POM 仅保留 spring-boot-starter-webflux;移除 spring-boot-starter-web;添加 jakarta.el 依赖;数据库驱动改为 mysql-connector-j。 - application.yml: - datasource.url=jdbc:mysql://.../workflow_db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC - driver=com.mysql.cj.jdbc.Driver - flowable.async-executor-activate=false(MVP 同步) 2) DDL(MySQL 8) - 将所有 JSONB 改为 JSON;去除 ::jsonb 强制类型转换;示例插入用合法 JSON 字符串。 - 关键表: - workflow_definitions(definition JSON, flowable_* 索引列保留) - node_types(fields JSON, output_schema JSON) - workflow_executions(input JSON) - node_execution_logs(input JSON, output JSON) 3) Flowable 集成修正 - ServiceTask 使用 delegateExpression("${genericNodeExecutor}"),由 Spring 托管,保证 @Autowired 生效。 - GenericNodeExecutor 从 execution.getCurrentFlowElement() 的 FieldExtension 读取 nodeType/nodeConfig,不再误用 execution 变量。 - WorkflowConverter: - 添加 ExclusiveGateway 与条件 SequenceFlow;对 edge.condition 设置 conditionExpression。 - 保留 start→first 与 last→end 的连线(无条件)。 4) 表达式引擎(JUEL - Jakarta EL) - import jakarta.el.*;构建 StandardELContext;注入 nodes/workflow/env 三大命名空间。 - 缓存表达式编译结果(LRU),无 ${} 的字符串走快路径直接返回。 - 安全:黑名单不足以防御,辅以受限 ELResolver(仅 Map/property 解析),禁用方法调用。 5) HTTP 节点 - 实现基于 WebClient:连接/响应超时;可选重试(限定幂等方法)。 - 输入:url/method/headers/body/timeout;输出:statusCode/body/headers/elapsed。 6) 观察性 - 写入 node_execution_logs:status、input、output、错误、时长;为 execution_id、status、时间建立索引。 - 审批与执行历史接口完成:执行详情包含各节点输入/输出摘要(注意脱敏)。 五、前端落地清单 - 字段映射:基于上游节点的 outputSchema 构建树;表达式值统一存储为“完整 ${...}”字符串。 - 表达式括号处理修复:使用正则 /^\$\{|\}$/g 去括号;选择时拼接为 `\${${val}}`。 - Zustand:统一管理 nodes/edges/selectedNode/currentWorkflow;保存时构建规范化 JSON。 - 性能:节点组件 memo、事件节流;避免使用不存在的 ReactFlow 属性。 六、API 与契约(MVP 必备) - /api/workflows:create/update/get/list/delete/execute、getExecutions、getExecutionDetail。 - /api/node-types:list/get/by-category(返回 NodeTypeMetadata,含 fields/outputSchema)。 - /api/tasks:list/detail/complete/form(审批流)。 - 错误码:4xx(校验/鉴权)、5xx(系统错误);分页与筛选采用标准 query 参数。 七、验收标准(MVP) - 功能: - 场景 A:HTTP → 审批 → 邮件,端到端成功;审批暂停与恢复链路可见。 - 场景 B:条件分支生效(200→邮件,否则→另一分支)。 - 性能:10 节点链路 < 500ms(不含审批),表达式评估基准 > 10k QPS,画布 100+ 节点不卡顿。 - 质量:核心模块单测覆盖 > 60%,E2E 场景跑通;关键事件与错误可观测。 八、两周 PoC 计划 - Week 1: - 完成 JSON→BPMN(ServiceTask + UserTask + ExclusiveGateway + 条件边) - JUEL 上下文与缓存;HTTP 节点(WebClient) - NodeTypeRegistry 注册/查询;node_types/definitions 基础表 - Week 2: - 审批任务 API(列表/表单/完成);执行历史与节点日志入库 - 前端编辑器/配置面板/字段映射;审批中心 - 样例工作流 A/B 端到端自测并出基准数据 九、风险与缓解 - 转换层复杂:以最小节点集(HTTP/条件/变量/邮件/审批)完成 PoC,随后逐步扩展。 - 表达式安全:Map-only ELResolver + 严格长度/关键字校验;第二期引入后端沙箱预览接口。 - MySQL JSON 性能:关键查询加合适索引;大 JSON 字段只作存储与读取,不进行复杂查询。 十、后续演进(非 MVP) - 异步执行(队列/线程池/回调)、定时/Webhook 触发、循环/并行/子流程、工作流版本管理、更多节点库、监控大盘、权限与多租户、导入导出、AI 辅助。