# 任务拆分 — 应用级业务流程编排器 > change: `application-business-process-orchestrator` > 当前阶段:Apply/M1,先实施控制面与画布,不接管正式触发 > 拆分顺序:协议冻结 → 数据模型 → 控制面 → 持久化运行 → 节点执行 → Flowable 恢复 → 发布 → 前端 → 迁移收口 > 每个编码任务必须独立提交、同步文档并按增量差异验证 ## 前置条件 - [x] 用户明确确认 `spec.md` 第 9 章全部默认决策并完成 HARD-GATE 记录。 - [x] 进入 `/apply` 前读取根 `AGENTS.md`、当前 `spec.md/tasks.md`、`code-copilot/memory/*` 和相关 Skill。 - [x] 创建 `test-spec.md` 与 `execution-log.md`,并读取 `code-copilot/rules/automated-testing-standard.md` 形成增量验证基线。 - [x] 实施前重新扫描 `forge-server/db/migration`;当前最新为并行变更中的 `V1.0.82`,本变更使用连续未占用的 `V1.0.83/V1.0.84`,Task 7 以新增 `V1.0.85` 补齐运行时开始权限,不修改已提交脚本或并行 `V1.0.82`。 - [x] 已确认节点调用合同:审批复用 `BusinessFlowService/FlowClient`,消息与企业协同复用 `BusinessActionStepExecutor + MessageService/CollaborationMessageChannel`;统一能力平台提供 `CapabilityRegistry`,但 generator 尚无受控桥接,完成 Task 9B 前节点必须标为不可用;不提供自由 URL。 - [ ] 确认采购审批样例和目标测试应用的当前发布版本、旧触发器、FLOW Binding、业务动作及运行中 Flowable 实例基线。 - [x] 所有 19 位 ID 在前端和 JSON 中按字符串处理;所有业务数据继续使用 `businessKey=:`。 - [x] 已在 `test-spec.md` 完成状态、审批权限、定时身份、外部调用、旧配置迁移和回调幂等专项审查;真实环境验收门禁继续保留。 ## 里程碑 | 里程碑 | 范围 | 完成标志 | |---|---|---| | M1 控制面与画布 | Task 0-7、Task 14-16 | 应用可创建、复制、保存、校验业务流程草稿;节点配置和应用工作台入口完整,尚不接管正式触发 | | M2 运行、审批与发布 | Task 8A-8B、Task 9A-9B、Task 10-13 | 事件/定时/手动触发可持久化执行,审批节点可等待和恢复,应用发布固定流程版本 | | M3 迁移与收口 | Task 17-18 | 旧配置可预览/迁移,样例切换,旧普通入口停止写入且历史运行不受影响 | | M4 验证与审查 | Task 19 | Spec 合规、自动化、构建、真实 Flowable E2E 和迁移演练完成 | ## 功能追踪 | Spec 功能 | 主要实现 Task | 验证 Task | |---|---|---| | 功能 1-4:应用流程资产、主对象、单开始节点与审批并发 | Task 1-4、Task 7、Task 11、Task 16 | Task 19 | | 功能 5-8:独立协议、校验器与画布基础 | Task 0、Task 6、Task 14-15 | Task 19 | | 功能 9-12:事件、业务语义、定时与手动开始 | Task 10、Task 13、Task 15 | Task 19 | | 功能 13-18:条件、动作、消息、受治理能力、结束与子流程 | Task 6、Task 8A-9B、Task 10、Task 15 | Task 19 | | 功能 19-23:Flowable 审批子流程、等待、恢复与状态修复 | Task 11、Task 15 | Task 19 | | 功能 24-30:持久化运行、幂等、重试、身份与数据权限 | Task 1、Task 4-5、Task 8A-9B、Task 10-11、Task 13 | Task 19 | | 功能 31-35:应用发布、版本、回滚、运行治理与就绪检查 | Task 3、Task 5、Task 12-13、Task 16 | Task 19 | | 功能 36-40:迁移、旧入口收口与采购审批样例 | Task 17-18 | Task 19 | 建议实施顺序为 `Task 0 → Task 1-7 → Task 14-16 → Task 12 → Task 8A-8B → Task 9A-9B → Task 10-11 → Task 13 → Task 17-19`。其中 Task 12 必须先冻结应用发布快照和已发布版本解析合同,Task 10 才能把正式事件和定时触发路由到该快照;Task 编号表达领域拆分,不代表可以忽略这项依赖。 ## 执行状态 - [x] Research:完成应用、对象、触发器、业务动作、Flowable、DingFlowDesigner 和应用发布现状调查。 - [x] Proposal:生成 `spec.md` 和本 `tasks.md`,未修改生产代码或数据库。 - [x] HARD-GATE:用户确认首版协议、审批并发、定时发起人、旧入口退出、子流程和 Webhook 边界。 - [ ] Apply/M1:控制面与画布(进行中)。 - [ ] Apply/M2:运行、审批和发布。 - [ ] Apply/M3:迁移与旧入口收口。 - [ ] Review/Test/UAT:自动化、构建、浏览器、数据库、Flowable 和迁移演练。 ## Task 0:冻结协议、文件清单与测试基线 **状态:completed(2026-08-03)**。协议样例、身份矩阵、状态机、安全审查与验证矩阵冻结在 `test-spec.md`;基线证据记录在 `execution-log.md`。 - **目标**:在修改生产代码前冻结首版节点范围、Schema 示例、状态机、身份矩阵、迁移样例和测试命令。 - **涉及文件**: - `code-copilot/changes/application-business-process-orchestrator/spec.md` — 回填第 9、13 章确认记录。 - `code-copilot/changes/application-business-process-orchestrator/tasks.md` — 回填任务状态和最终文件清单。 - `code-copilot/changes/application-business-process-orchestrator/test-spec.md` — 新增协议、服务、迁移、前端和 E2E 测试矩阵。 - `code-copilot/changes/application-business-process-orchestrator/execution-log.md` — 新增环境、基线、命令、结果和清理记录。 - **关键产物**: - `businessProcessJson` 完整示例:手动提交审批、记录新增自动化、定时分层提醒各一份。 - 身份矩阵:`MANUAL/EVENT/SCHEDULE/PROCESS_CALLBACK/EXTERNAL` 对应 actor、tenant、activeOrg 和失败策略。 - 状态机:process run、node run、approval wait 的合法状态转换和 CAS 条件。 - **验收**:不存在未决节点类型、自由 URL Webhook 或“实现时再定”的协议字段;测试 Spec 可追溯到 Spec 功能 1-40。 ## Task 1:新增流程定义与版本数据库结构 **状态:implemented(2026-08-03)**。`V1.0.83/V1.0.84` 已实现并通过静态检查;MySQL 8 新库、存量库和重复 Flyway 实跑留待 Task 19 真实环境门禁。 - **目标**:创建应用级流程定义、不可变版本、运行实例、节点运行和权限资源表结构。 - **涉及文件**: - `forge-server/db/migration/V1.0.83__add_application_business_process.sql` — 新增四张表、业务唯一索引、运行索引和审计字段。 - `forge-server/db/migration/V1.0.84__add_application_business_process_resources.sql` — 新增字典、菜单/API 权限和 `PROCESSES` 发布步骤相关资源。 - **关键约束**: - `ai_business_process.del_flag`、`ai_business_process_version.del_flag` 使用 `BIGINT NOT NULL DEFAULT 0`,逻辑删除写当前主键。 - 流程编码唯一索引覆盖 `tenant_id + application_id + process_code + del_flag`;非空简单旧来源增加 `tenant_id + legacy_source_type + legacy_source_id + del_flag` 唯一索引,合并来源由迁移服务锁定并校验全部来源。 - `ai_business_process_run.subject_record_id` 使用字符串列,兼容不同业务主键且不损失雪花 ID 精度。 - JSON 字段使用 `LONGTEXT` 并在服务端解析;索引只覆盖租户、应用、流程、状态、业务键、幂等键和时间等稳定列。 - Flyway 使用 `information_schema`、`CREATE TABLE IF NOT EXISTS` 和 `INSERT ... WHERE NOT EXISTS` 防重复,内置数据 `tenant_id=1`。 - **验证**:MySQL 8 新库、存量库、重复执行和 `forge_schema_history` 检查;禁止在 SQL 中转换旧画布 JSON。 ## Task 2:流程定义持久层 **状态:completed(2026-08-03)**。已实现租户/应用/主对象失败关闭查询、草稿 hash CAS 和主键墓碑逻辑删除,并通过 3 项 Mapper 契约测试。 - **目标**:建立流程定义实体、Mapper XML 和活动记录查询,所有查询显式限定租户与逻辑删除。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessProcess.java` — 新增流程定义实体和显式 `@TableLogic(value="0", delval="id")`。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/mapper/BusinessProcessMapper.java` — 新增定义查询和 CAS 更新签名。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/mapper/BusinessProcessMapper.xml` — 新增应用分页、编码查询、发布状态和逻辑删除 SQL。 - **关键签名**: ```java Page selectPage(Long tenantId, Long applicationId, String keyword, String status, Page page); AiBusinessProcess selectActiveByCode(Long tenantId, Long applicationId, String processCode); int updateDraftSchema(Long tenantId, Long id, String schemaJson, String schemaHash, String designStatus, Long updateBy); int logicalDelete(Long tenantId, Long id, Long updateBy); ``` - **验收**:同应用有效编码唯一;跨租户、已删除、停用应用和共享对象误匹配用例失败关闭。 ## Task 3:流程版本持久层 **状态:completed(2026-08-03)**。已实现不可变版本实体、固定版本/应用版本读取和显式插入合同;Mapper XML 不提供任何更新版本正文的路径。 - **目标**:建立不可变流程版本和依赖快照存储,禁止已发布版本原地修改。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessProcessVersion.java` — 新增版本实体并显式声明 `@TableLogic(value="0", delval="id")`。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/mapper/BusinessProcessVersionMapper.java` — 新增版本插入、列表和固定版本读取签名。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/mapper/BusinessProcessVersionMapper.xml` — 新增显式租户/逻辑删除过滤和版本唯一查询。 - **关键签名**: ```java AiBusinessProcessVersion selectPublishedVersion(Long tenantId, Long processId, Integer versionNo); List selectPublishedByApplication(Long tenantId, Long applicationId, Collection processIds); int insertImmutable(AiBusinessProcessVersion version); ``` - **验收**:相同 `processId + versionNo` 重复发布幂等命中相同 hash,不同 hash 冲突;任何 update 版本正文的路径均不存在。 ## Task 4:流程运行与节点运行持久层 **状态:completed(2026-08-03)**。已实现 run/node 实体、幂等读取、租户内恢复扫描、流程与节点强 CAS、失败重试计数和不可复活节点尝试。 - **目标**:为异步执行、审批等待、回调恢复、重试和时间线提供持久化状态与 CAS。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessProcessRun.java` — 新增流程运行实体。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessProcessNodeRun.java` — 新增节点运行实体。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/mapper/BusinessProcessRunMapper.java` — 新增运行创建、锁定、状态 CAS、恢复和分页签名。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/mapper/BusinessProcessRunMapper.xml` — 实现运行查询、审批关联、幂等命中和恢复扫描。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/mapper/BusinessProcessNodeRunMapper.java` — 新增节点尝试和结果更新签名;仅 `insert/selectById/updateById` 等 MyBatis-Plus 内置单表方法可直接复用,CAS 和全部自定义查询必须写在 Mapper XML。 - **关键签名**: ```java AiBusinessProcessRun selectByIdempotencyKey(Long tenantId, Long processVersionId, String idempotencyKey); int compareAndSetStatus(Long tenantId, Long runId, String expectedStatus, String nextStatus, String currentNodeId, LocalDateTime nextRetryTime); AiBusinessProcessRun selectWaitingByProcessInstanceId(Long tenantId, String processInstanceId); List selectRecoverableRuns(LocalDateTime before, int limit); int insertAttempt(AiBusinessProcessNodeRun nodeRun); int completeAttempt(Long tenantId, Long id, String expectedStatus, String nextStatus, String outputSummary, String errorCode, String errorSummary); ``` - **验收**:并发创建相同幂等键只返回一个 run;重复回调、重复重试和状态越级更新不能推进两次。 ## Task 5:节点运行 XML 与安全日志查询 **状态:completed(2026-08-03)**。已实现运行分页、节点时间线/最后尝试/可重试/审批关联查询和安全摘要 VO;对外 ID 全部为字符串。 - **目标**:补齐节点时间线、可重试节点、审批关联和安全摘要查询,不让 Controller 或 Service 拼装 SQL。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/mapper/BusinessProcessNodeRunMapper.xml` — 新增时间线、最后尝试、可重试和关联 ID 查询。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessprocess/BusinessProcessRunQueryDTO.java` — 新增应用、流程、对象、记录、状态和时间过滤。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessprocess/BusinessProcessRunVO.java` — 新增运行列表响应,ID 均序列化为字符串。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessprocess/BusinessProcessRunDetailVO.java` — 新增运行详情和节点时间线响应。 - **关键签名**: ```java List selectTimeline(Long tenantId, Long runId); AiBusinessProcessNodeRun selectLatestAttempt(Long tenantId, Long runId, String nodeId); Page selectRunPage(Long tenantId, BusinessProcessRunQueryDTO query, Page page); ``` - **验收**:日志只返回安全摘要和错误码;输入/输出正文、Authorization、Token、Secret 和数据库连接异常不进入响应或日志。 ## Task 6:冻结 businessProcessJson 领域协议与校验器 **状态:completed(2026-08-03)**。已实现强类型 1.0 协议、稳定规范化/hash、图与依赖失败关闭校验、敏感配置拦截,并用三份冻结样例和 10 项校验器测试验证。 - **目标**:定义独立于 BPMN 的强类型业务编排协议和服务端发布校验。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/businessprocess/schema/BusinessProcessSchema.java` — 定义根协议、subject、policies 和 dependencies。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/businessprocess/schema/BusinessProcessNode.java` — 定义节点 ID、类型、名称、配置和标准出口。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/businessprocess/schema/BusinessProcessEdge.java` — 定义 source/target/sourcePort/condition/default。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/businessprocess/validation/BusinessProcessSchemaValidator.java` — 实现结构、DAG、可达性、依赖和权限校验。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessprocess/BusinessProcessValidationVO.java` — 返回 error/warning、nodeId、fieldPath 和修复建议。 - **关键签名**: ```java public BusinessProcessValidationVO validate(BusinessProcessSchema schema, BusinessProcessValidationContext context); public BusinessProcessSchema normalize(String schemaJson); public String canonicalJson(BusinessProcessSchema schema); public String schemaHash(BusinessProcessSchema schema); ``` - **验收**:拒绝多个开始节点、环、悬空边、不可达节点、无结束路径、未知节点、无效出口、递归子流程、失效对象/字段和自由 URL/Secret。 ## Task 7:流程定义控制面 Service 与 API **状态:completed(2026-08-03)**。已实现应用级 CRUD、草稿 hash CAS、同应用复制、校验上下文、启停与删除引用门禁;定向测试 31/31、Mapper XML、权限迁移静态检查和 Admin 47 模块聚合编译通过。 - **目标**:提供应用级流程 CRUD、草稿保存、校验、启停和逻辑删除,普通调用不得读取其它应用资产。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessprocess/BusinessProcessDTO.java` — 新增创建/修改 DTO。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessprocess/BusinessProcessSchemaDTO.java` — 新增草稿协议和客户端基线 hash。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessprocess/BusinessProcessVO.java` — 新增列表和设计详情响应。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessService.java` — 新增控制面和乐观并发服务。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/BusinessProcessController.java` — 新增 `/ai/business/process` 管理接口和权限注解。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/businessprocess/validation/BusinessProcessValidationContextResolver.java` — 从应用对象、发布快照、权限目录和已发布 Flowable 模型解析失败关闭的校验上下文。 - `forge-server/db/migration/V1.0.85__add_business_process_start_permission.sql` — 注册默认手动开始权限并仅继承既有应用运行权限角色。 - **关键签名**: ```java public BusinessProcessVO create(BusinessProcessDTO dto); public BusinessProcessVO copy(Long sourceProcessId, BusinessProcessDTO dto); public BusinessProcessVO getDesigner(Long processId); public BusinessProcessVO saveSchema(Long processId, BusinessProcessSchemaDTO dto); public BusinessProcessValidationVO validate(Long processId); public void updateStatus(Long processId, Integer status); public void logicalDelete(Long processId); ``` - **验收**:应用/主对象必须同租户且已关联;复制流程必须生成新 `processCode`,只复制草稿协议并重建节点 ID,不复制发布版本、运行状态或旧来源标识;删除有运行实例或有效发布引用的流程被阻断;草稿 hash 冲突返回明确版本冲突。 ## Task 8A:持久化业务流程核心状态机 - **目标**:创建流程运行实例、按图调度节点、持久化检查点并支持恢复和人工重试。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessOrchestrator.java` — 新增 start/execute/resume/retry/cancel 主状态机。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessRunService.java` — 新增运行创建、CAS、上下文清洗和时间线服务。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessNodeExecutor.java` — 定义节点执行器 SPI。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessExecutionContext.java` — 定义不可变运行上下文和可信身份。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessprocess/BusinessProcessNodeResult.java` — 定义 COMPLETED/WAITING/FAILED、输出端口和关联 ID。 - **关键签名**: ```java public BusinessProcessRunVO start(BusinessProcessStartCommand command); public void execute(Long runId); public void resume(BusinessProcessResumeCommand command); public BusinessProcessRunVO retry(Long runId); public BusinessProcessRunVO cancel(Long runId); interface BusinessProcessNodeExecutor { String supportType(); BusinessProcessNodeResult execute(BusinessProcessExecutionContext context, BusinessProcessNode node); } ``` - **验收**:先落 run 再异步执行;服务中断后可以从最后检查点恢复;节点调度严格服从已发布 DAG 和 CAS;未知节点失败关闭。 ## Task 8B:实现条件、结束与子流程节点 - **目标**:补齐不依赖外部动作引擎的内置节点,并冻结分支、终态和子流程调用边界。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessConditionEvaluator.java` — 统一执行开始过滤和条件节点使用的结构化 AND/OR、字段及上下文规则。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/ConditionProcessNodeExecutor.java` — 执行结构化条件并选择唯一命中出口或默认出口。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/EndProcessNodeExecutor.java` — 只归并流程终态,不执行隐藏字段更新或外部副作用。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/SubProcessNodeExecutor.java` — 启动同应用固定版本子流程,校验静态递归、运行深度、租户和可信身份继承。 - **关键签名**: ```java public BusinessProcessConditionResult evaluate(BusinessProcessExecutionContext context, BusinessProcessCondition condition); public BusinessProcessNodeResult execute(BusinessProcessExecutionContext context, BusinessProcessNode node); ``` - **验收**:多分支只选择明确命中或唯一默认出口;结束节点无隐藏副作用;递归或超过深度 5 的子流程失败关闭;子流程固定版本、租户和执行身份不可由画布覆盖。 ## Task 9A:抽取公共业务动作步骤运行合同 - **目标**:让旧业务动作、新业务流程动作节点和旧触发器共享一个步骤执行实现,消除动作类型分支复制。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessActionStepRuntime.java` — 新增步骤执行器注册、单步/多步执行和结果归一化。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessActionExecutionService.java` — 改为委托 `BusinessActionStepRuntime`,保持现有 API 合同。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/ActionProcessNodeExecutor.java` — 将流程动作节点转换为受控 `BusinessActionStepDTO` 并执行。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessTriggerExecutor.java` — 旧触发器进入兼容适配,不再维护第二套动作执行细节。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessActionStepExecutor.java` — 补充幂等、可重试和敏感摘要合同说明,不改变现有实现类型。 - **关键签名**: ```java public BusinessActionStepResultVO executeStep(BusinessActionExecutionContext context, BusinessActionStepDTO step, String idempotencyKey); public List executeSteps(BusinessActionExecutionContext context, List steps, String idempotencyPrefix); ``` - **验收**:更新记录、创建记录和已发布业务动作均通过公共合同执行;相同 process run/node 重试不重复产生记录或审批;不支持动作明确失败;现有业务动作合同测试不回归。 ## Task 9B:接入消息与受治理能力动作 - **目标**:让消息模块、企业集成和统一能力开放平台通过公共动作合同接入流程,不向画布开放 Secret 或自由 URL。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/GovernedCapabilityActionStepExecutor.java` — 仅按已发布能力/企业集成连接引用调用受治理外部能力,不接受自由 URL 或客户端凭据。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/SendMessageActionStepExecutor.java` — 补齐消息模板、通道、接收人规则和稳定消息幂等键,不在流程上下文保存通道 Secret。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/businessapp/GovernedActionStepExecutorTest.java` — 覆盖消息幂等、能力白名单、失效引用、自由 URL 和敏感配置拒绝。 - **关键签名**: ```java public String supportType(); public BusinessActionStepResultVO execute(BusinessActionExecutionContext context, BusinessActionStepDTO step, String idempotencyKey); ``` - **验收**:消息和受治理能力引用通过公共合同执行;重复调用不重复发送消息或制造外部副作用;自由 URL、客户端凭据、失效能力和不可用通道明确失败。 ## Task 10:事件、条件与定时开始节点 - **目标**:将业务事件和统一扫描任务路由到已发布业务流程,不再要求新配置写入 `ai_business_trigger`。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessTriggerDispatcher.java` — 按应用发布快照匹配开始节点并同步创建 run。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessEvent.java` — 增加稳定 eventId、`FORM_SUBMITTED/ACTION_EXECUTED` 和可信身份摘要。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessEventPublisher.java` — 事务完成后优先分发新流程,旧触发器保留兼容。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessTriggerSchedulerService.java` — 保留 Job/锁/候选记录扫描,配置来源切换为已发布定时开始节点。 - **关键签名**: ```java public List dispatch(BusinessEvent event); public boolean matches(BusinessProcessSchema schema, BusinessProcessNode startNode, BusinessEvent event); public String scanScheduledProcesses(); ``` - **验收**:事件重复投递只创建一个流程 run;草稿保存不触发;定时扫描不读取未发布流程;旧触发器兼容结果保持。 ## Task 11:审批子流程启动、等待与回调恢复 - **目标**:把 Flowable 作为可等待审批节点接入业务编排器,同时保留任务表单和状态修复权威链路。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/ApprovalProcessNodeExecutor.java` — 启动固定版本审批并返回 WAITING。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessApprovalResumeListener.java` — 监听通过/驳回/取消结果并恢复唯一节点。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/event/BusinessProcessFlowResultEvent.java` — 定义 tenant、businessKey、processInstanceId、result 和安全变量摘要。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowService.java` — 支持显式审批节点上下文并在事务提交后发布恢复事件。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowVariableResolver.java` — 校验业务流程版本固定的字段/变量映射。 - **关键签名**: ```java public BusinessProcessNodeResult execute(BusinessProcessExecutionContext context, BusinessProcessNode approvalNode); public void onFlowResult(BusinessProcessFlowResultEvent event); public BusinessFlowRuntimeVO startFromBusinessProcess(BusinessProcessApprovalStartCommand command); ``` - **验收**:启动失败不进入 WAITING;回调按 `processInstanceId + businessKey` 唯一恢复;重复/乱序/跨租户回调不重复执行后续动作。 ## Task 12:应用发布流程版本和依赖快照 **状态:completed(2026-08-04)**。应用协调发布已新增可恢复 `PROCESSES` 步骤,默认选择应用内全部启用流程,并以候选快照中的草稿 hash 固定恢复边界;候选缺少所选流程摘要时失败关闭,不回退当前草稿。每个应用版本生成或幂等复用不可变流程版本,依赖快照固定业务对象设计版本及 Flowable `model/正版本号/processDefinitionId/deploymentId`。应用快照已增加 `processes/publishedProcessVersions/runtimeActions` 白名单字段,回滚只恢复流程发布投影、不修改历史运行实例。`runtimeActions` 本任务仅冻结稳定空字段,实际 `START_PROCESS` 编译仍由 Task 13 交付。 - **目标**:把业务流程纳入应用就绪检查、不可变快照、可恢复发布和回滚。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/constant/BusinessApplicationPublishStep.java` — 在 `SNAPSHOT` 后增加 `PROCESSES`。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessPublishService.java` — 校验草稿、生成版本和固定依赖。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationSnapshotService.java` — 增加 process/version/runtimeActions 白名单快照。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationPublishService.java` — 执行和恢复 `PROCESSES` 步骤。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationReadinessService.java` — 增加流程图、对象、审批版本、按钮权限和并发冲突检查。 - **关键签名**: ```java public BusinessProcessPublishResult publishForApplication(Long applicationId, Integer applicationVersion, Collection processIds); public List resolvePublishedSnapshots(Long applicationId, Collection processIds); ``` - **验收**:草稿修改不影响正式触发;相同发布运行重试不重复生成不同版本;应用回滚恢复流程投影但不改变运行中实例。 ## Task 13:手动开始节点编译为页面动作 - **目标**:将已发布手动开始节点投影为 `START_PROCESS` 列表/详情/表单动作,前端只提交流程编码和记录 ID。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessRuntimeActionCompiler.java` — 编译位置、权限、可见条件、确认文案和稳定动作 key。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationRuntimeService.java` — 从发布快照返回流程动作投影。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/BusinessProcessRuntimeController.java` — 新增手动 start、run 详情、retry/cancel 接口。 - `forge-admin-ui/src/components/ai-form/AiCrudPage.vue` — 支持 `START_PROCESS` 加载态、确认、成功刷新和错误展示。 - `forge-admin-ui/src/views/ai/crud-page.vue` — 归一化运行时流程动作并避免与内置新增/编辑按钮冲突。 - **关键签名**: ```java public List> compileActions(BusinessProcessSnapshot snapshot); public RespInfo start(String applicationCode, String processCode, BusinessProcessManualStartDTO dto); ``` - **验收**:客户端篡改对象、流程、actor、状态或字段数据不能绕过服务端;同一按钮重复提交幂等;无权限动作不展示且直接调用也拒绝。 ## Task 14:前端独立业务流程协议与画布基础 **状态:completed(2026-08-03)**。已冻结前端 `businessProcessJson 1.0` 创建/归一化/稳定 hash 合同,新增八类业务节点注册表、DAG 图操作与历史状态,并以适配层复用现有画布、连线和布局;定向与既有回归共 48 项、ESLint 和生产构建通过。 - **目标**:复用图形基础建立独立业务画布,不改变 DingFlowDesigner 的审批协议和 BPMN 转换。 - **涉及文件**: - `forge-admin-ui/src/components/business-process-designer/business-process-schema.js` — 定义创建、归一化、克隆、hash 输入和协议迁移。 - `forge-admin-ui/src/components/business-process-designer/business-process-node-types.js` — 定义开始、条件、动作、审批、子流程和结束节点注册表。 - `forge-admin-ui/src/components/business-process-designer/useBusinessProcessDesigner.js` — 提供节点/边 CRUD、DAG 分支、撤销重做和选择状态。 - `forge-admin-ui/src/components/business-process-designer/BusinessProcessCanvas.vue` — 复用或包装 `FlowCanvas`、EdgeLayer 和布局能力。 - `forge-admin-ui/src/components/flow-designer/canvas/FlowCanvas.vue` — 已确认现有 `edges/nodes/toolbar` 插槽足够,本任务无需修改,保持 DingFlowDesigner 默认行为和测试。 - **关键签名**: ```javascript export function createBusinessProcessSchema({ processCode, objectRef, startType }) export function normalizeBusinessProcessSchema(input) export function validateBusinessProcessGraph(schema, context) export function useBusinessProcessDesigner(initialSchema) ``` - **验收**:业务协议不能被 `convertJsonToBpmn` 消费;现有 DingFlowDesigner roundtrip 测试通过;多个开始节点、环和悬空边在保存前提示。 ## Task 15:前端节点配置与审批设计器衔接 **状态:completed(2026-08-03)**。已完成克制的业务编排工作台、独立节点渲染器、结构化触发/条件/动作/审批/子流程/结束配置、依赖自动同步、草稿自动/显式保存状态、hash 冲突提示、问题定位与离开保护;审批配置复用真实 `flow/design.vue`,不在业务画布复制审批内部能力。 - **目标**:为首版节点提供业务化右侧配置,审批节点打开真实流程设计器。 - **涉及文件**: - `forge-admin-ui/src/components/business-process-designer/BusinessProcessDesigner.vue` — 组合工具栏、画布、节点面板、问题列表和保存状态。 - `forge-admin-ui/src/components/business-process-designer/BusinessProcessNodeRenderer.vue` — 按节点注册表渲染稳定卡片和出口。 - `forge-admin-ui/src/components/business-process-designer/BusinessProcessNodeConfigDrawer.vue` — 路由到对应结构化配置组件。 - `forge-admin-ui/src/components/business-process-designer/StartNodeConfig.vue` — 配置事件、定时、手动位置、条件和身份提示。 - `forge-admin-ui/src/components/business-process-designer/ActionAndApprovalNodeConfig.vue` — 配置动作、字段映射、消息/能力引用、审批模型和结果出口,并内嵌 `flow/design.vue`。 - **关键事件**: ```javascript defineEmits(['save', 'validate', 'open-flow-designer', 'dirty-change', 'locate-issue']) ``` - **验收**:普通模式无 JSON、SpEL、Java、SQL 和自由 URL;审批节点内部配置只在真实流程设计器保存;关闭后刷新模型版本和节点摘要;草稿具备防抖自动保存状态、显式保存和 hash 冲突提示,离开未保存页面必须确认。 ## Task 16:应用工作台业务流程核心面板 **状态:completed(2026-08-03)**。已用应用级流程列表替换旧三入口聚合,接通创建、复制、设计、启停、逻辑删除、筛选状态回传和应用发布入口;新增全屏设计路由,完成服务端 hash CAS、保存后校验、409 冲突、目录刷新和离开确认。运行记录与迁移服务尚未交付,当前以明确预留态展示且未虚构接口。 - **目标**:用流程列表、画布、运行记录和迁移问题替换当前三个跳转按钮。 - **涉及文件**: - `forge-admin-ui/src/views/app-center/application-workspace/ApplicationProcessPanel.vue` — 新增流程列表、创建、复制、设计、启停、运行和迁移入口。 - `forge-admin-ui/src/views/app-center/application.[applicationCode].vue` — 将 `automation` 组件切换为 `ApplicationProcessPanel` 并传入应用发布上下文。 - `forge-admin-ui/src/views/app-center/application-workspace/ApplicationWorkspaceNav.vue` — 文案统一为“业务流程 / 触发、审批与自动化”。 - `forge-admin-ui/src/views/app-center/business-process.[processId].vue` — 新增全屏业务流程设计路由页面。 - `forge-admin-ui/src/api/business-process.js` — 新增流程、Schema、校验、运行和迁移 API 封装。 - **关键交互**: ```javascript function createProcess() function openDesigner(processId) function openRunDetail(runId) function previewMigration() function requestApplicationPublish() ``` - **验收**:用户从应用进入后无需先选择对象设计器面板;新流程在当前应用选择主对象;设计器新页签返回后保持原应用和筛选状态。 ## Task 17:迁移预览、幂等执行与问题报告 - **目标**:把旧触发器、对象 FLOW Binding 和审批结果动作转换为新流程草稿,不用 Flyway 猜测 JSON 语义。 - **涉及文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessMigrationService.java` — 实现 preview/apply、来源合并、幂等和问题分类。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessprocess/BusinessProcessMigrationDTO.java` — 定义 applicationId、sourceIds、previewHash 和执行策略。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessprocess/BusinessProcessMigrationPreviewVO.java` — 返回生成图、旧来源、警告和阻塞项。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/BusinessProcessMigrationController.java` — 新增 preview/apply/issues 权限接口。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/resources/mapper/BusinessBindingMapper.xml` — 补充按应用/对象批量读取旧 FLOW/TRIGGER/ACTION 来源的 XML 查询,不修改旧记录。 - **关键签名**: ```java public BusinessProcessMigrationPreviewVO preview(BusinessProcessMigrationDTO dto); public BusinessProcessMigrationResultVO apply(BusinessProcessMigrationDTO dto); public List listIssues(Long applicationId); ``` - **验收**:预览不写数据;apply 要求 previewHash 一致;重复执行返回相同流程;无法转换项阻塞而不是静默跳过;旧配置不物理删除。 ## Task 18:旧入口停写与采购审批样例迁移 - **目标**:在迁移验证完成后收口普通入口,并将采购审批样例切换为可验证的新画布流程。 - **涉及文件**: - `forge-admin-ui/src/views/app-center/object-designer.[objectCode].vue` — 隐藏旧 `flow-app/triggers/actions` 普通入口,保留迁移问题和高级兼容诊断。 - `forge-admin-ui/src/views/app-center/application-workspace/ApplicationAutomationPanel.vue` — 删除工作台引用后保留兼容组件或标记待后续删除,不再作为主入口。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/BusinessTriggerController.java` — 迁移完成应用的写接口返回只读迁移提示,查询/日志兼容保留。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/controller/BusinessFlowController.java` — 旧 binding 写接口增加迁移状态保护,任务表单和运行接口不变。 - `forge-server/db/seed/demo/application_business_process_purchase_sample.sql` — 新增或调整演示 seed,以应用流程协议引用现有采购 BPMN,不覆盖已编辑 BPMN XML。 - **验收**:普通用户只有一个可写业务流程入口;旧运行中审批继续办理;旧日志可查;采购“提交审批 → 审批 → 状态 → 消息”在一张业务画布可见。 ## Task 19:自动化验证、两阶段审查与部署门禁 - **目标**:按自动化测试标准验证协议、迁移、运行、审批、权限、发布和前端体验,完成 Spec 合规和代码质量审查。 - **新增/修改测试文件**: - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/businessprocess/BusinessProcessSchemaValidatorTest.java` — 图、字段、依赖、循环和敏感配置。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessOrchestratorTest.java` — 状态机、幂等、恢复、分支和重试。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/businessprocess/ApprovalProcessNodeExecutorTest.java` — 启动、等待、回调、重复和乱序。 - `forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java/com/mdframe/forge/plugin/generator/service/businessprocess/BusinessProcessMigrationServiceTest.java` — 预览、转换、问题和重复执行。 - `forge-admin-ui/src/components/business-process-designer/__tests__/business-process-designer.spec.js` — 协议、画布、节点配置和审批设计器入口。 - **必须执行的增量命令**: ```bash cd forge-server mvn -Penable-tests -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am \ -Dtest=BusinessProcessSchemaValidatorTest,BusinessProcessOrchestratorTest,ApprovalProcessNodeExecutorTest,BusinessProcessMigrationServiceTest,GovernedActionStepExecutorTest test source ~/.nvm/nvm.sh && nvm use v20.19.0 cd forge-admin-ui pnpm exec vitest run src/components/business-process-designer/__tests__/business-process-designer.spec.js pnpm exec eslint src/components/business-process-designer src/views/app-center src/api/business-process.js pnpm build ``` - **数据库验证**:新库、存量库、重复 Flyway;唯一索引、逻辑删除墓碑、跨租户查询和迁移幂等。 - **真实 E2E**:手动提交审批、记录新增自动化、定时分层提醒、审批通过/驳回/取消、服务重启恢复、节点失败重试、应用回滚和旧实例继续办理。 - **审查顺序**:先逐功能 1-40 做 Spec 合规审查,再做租户、权限、状态机、幂等、并发、敏感日志、SQL 和前端质量审查。 - **文档回填**:每个命令、结果、警告、跳过项、真实环境门禁和服务清理追加到 `execution-log.md`;未执行项不得表述为通过。 ## 完成门禁 - [ ] Spec 功能 1-40 均能对应至少一个完成 Task 和验证证据。 - [ ] 应用工作台不存在面向普通用户的第二套流程/触发器/审批后动作写入口。 - [ ] `DingFlowDesigner.flowJson` 与 BPMN 双向转换未被业务协议污染,现有审批设计器回归通过。 - [ ] 新流程只读取应用发布快照,草稿不能在正式运行触发。 - [ ] 同一记录重复提交、重复事件和重复回调不会创建重复审批或重复副作用。 - [ ] 旧配置和运行中实例在迁移、停写和回滚阶段均可追溯,不物理删除。 - [ ] 状态、审批权限、定时身份、外部调用和迁移完成专项人工审查。 - [ ] `spec.md/tasks.md/test-spec.md/execution-log.md` 与实际实现和验证结果一致。