status: apply created: 2026-08-03 complexity: 🔴复杂 change:
application-business-process-orchestrator
Forge 已经以“应用”作为低代码开发主入口,一个应用可以聚合页面、表单、业务对象、访问入口和发布版本。但流程相关能力仍分散在业务对象流程绑定、自动化触发器、业务动作和 Flowable 流程设计器中。用户必须先理解这些底层资产的差异,再手工拼接“何时触发、操作哪条记录、是否发起审批、审批完成后执行什么动作”,导致应用工作台虽然以应用为入口,业务流程设计仍以对象和技术配置为中心。
本变更在应用工作台建立统一“业务流程”核心面板。一个应用可以创建多个业务流程,每个流程选择一个主业务对象作为记录主体,通过一张可视化画布完成触发、条件、审批子流程、数据动作、消息和结束结果的编排。Flowable 继续作为人工审批权威引擎,现有动作、消息、定时任务、企业集成和统一能力开放平台继续作为节点执行能力;新画布只负责应用级编排、版本、运行状态和恢复,不重造这些底层引擎。
完成后必须达到以下可验证结果:
应用工作台
├── 概览
├── 页面与表单
├── 业务流程
│ ├── 流程列表
│ ├── 业务编排画布
│ ├── 运行记录
│ └── 迁移与问题
├── 访问入口
├── 高级数据设置
└── 发布
businessProcessJson 协议、服务端校验器和发布编译器。DingFlowDesigner.flowJson 直接作为业务编排存储协议,也不把整张业务画布转换为一个大 BPMN 模型。tenantId + businessKey 检查活动实例。BusinessActionDesigner 维护审批自动化的主路径。forge-admin-ui/src/views/app-center/application-workspace/ApplicationAutomationPanel.vue 的 ApplicationAutomationPanel 按应用对象展示“业务流程、自动化触发器、业务动作”三个按钮,点击后分别打开对象设计器面板;当前“流程自动化”只是导航聚合,不是应用级流程资产。forge-admin-ui/src/views/app-center/application.[applicationCode].vue 把 automation 映射到 ApplicationAutomationPanel,工作台没有业务流程列表、画布、版本或运行记录。forge-admin-ui/src/views/app-center/object-designer.[objectCode].vue 继续分别加载 BusinessFlowAppConfigPanel、trigger.vue 和 BusinessActionDesigner,应用上下文在进入对象后退化为对象上下文。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessTrigger.java 的 AiBusinessTrigger 只保存 eventType/eventCondition/actionType/actionConfig,无法表达多步骤、审批等待、结果出口和节点级重试。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessTriggerExecutor.java 的 BusinessTriggerExecutor#executeAction 直接在 START_FLOW/SEND_MESSAGE/CREATE_RECORD/UPDATE_FIELD/WEBHOOK 之间分支;WEBHOOK 仍返回 TODO,且整个触发器只产生一次动作结果。forge-admin-ui/src/views/app-center/components/TriggerActionConfigPanel.vue 的 START_FLOW 配置固定 useMainFlow=true,要求先在对象流程配置中维护主流程,用户仍需跨入口完成同一业务链路。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessTriggerSchedulerService.java 已通过单个 LOWCODE.lowcodeBusinessTriggerScanJob 扫描定时触发器并具备集群锁、记录锁和分层提醒,应保留调度机制,只替换配置来源和启动目标。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessActionExecutionService.java 的 BusinessActionExecutionService#executeSteps 已按 BusinessActionStepExecutor.supportType() 注册并顺序执行步骤,具备步骤结果、幂等日志和失败边界。CREATE_RECORD/UPDATE_FIELD/SEND_MESSAGE/START_FLOW/DOMAIN_ACTION/FOREACH,出处为同包下 CreateRecordActionStepExecutor、UpdateFieldActionStepExecutor、SendMessageActionStepExecutor、StartFlowActionStepExecutor、DomainActionStepExecutor 和 ForeachActionStepExecutor。forge-admin-ui/src/views/app-center/components/designer/BusinessActionDesigner.vue 只对数量处理和部分嵌套步骤提供可视化,其余步骤回退高级 JSON;它把审批发起、审批结果动作和页面动作分开解释,进一步增加认知负担。BusinessTriggerExecutor 的动作分支。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowService.java 的 BusinessFlowService#startFlow 固定查询 targetType=OBJECT/bindingType=FLOW,运行时使用 objectCode:recordId 作为 businessKey。AiBusinessBinding 虽允许 APPLICATION 目标,但现有业务启动、任务表单、状态回写和 ai_business_flow_instance_link 都以业务对象和记录为事实来源,不能仅把绑定行从 OBJECT 改成 APPLICATION。BusinessFlowService 已提供流程启动锁、业务实例链接、变量映射、任务表单、回调和结果事件,应由审批子流程节点调用,不新增第二条前端自定义启动链路。.agents/skills/forge-business-flow-development/references/bpmn-configuration.md 与 code-copilot/memory/decisions.md 已冻结:审批节点表单、字段权限、审批人、会签、驳回和监听器归真实流程设计器维护,应用中心只能维护业务对象、流程模型和变量映射。forge-admin-ui/src/components/flow-designer/constants/node-types.js 把 flowJson 的 12 类节点直接映射到 BPMN StartEvent/UserTask/ServiceTask/Gateway/SubProcess/CallActivity。forge-admin-ui/src/components/flow-designer/converter/json-to-bpmn.js 的 convertJsonToBpmn 会把整份 flowJson 写成 BPMN 2.0 XML;协议中没有应用、主业务对象、触发身份、节点重试和发布依赖语义。forge-admin-ui/src/components/flow-designer/composables/useFlowDesigner.js 已提供节点/边增删、分支、布局、撤销重做等可复用图编辑能力,但新增条件分支会默认创建审批人节点,不能直接用于通用业务节点。FlowCanvas、连线、布局、选择、撤销重做等视图基础;业务流程使用独立节点注册表和 businessProcessJson,现有 DingFlowDesigner 继续服务 BPMN 审批设计。forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessApplicationSnapshotService.java 已把应用、对象、入口、绑定、扩展和权限写入白名单化快照,并清洗敏感键。BusinessApplicationPublishService 和 BusinessApplicationPublishStep 已按 PRECHECK/SNAPSHOT/OBJECTS/ENTRIES/PAGE_MENUS/EXTENSIONS/COMMIT 执行可恢复发布步骤,可新增 PROCESSES 步骤和流程版本引用,不另建第二套应用发布入口。forge-admin-ui/src/components/ai-form/AiCrudPage.vue 已识别 START_FLOW/COMMAND 等运行时动作,适合增加稳定的 START_PROCESS 动作类型,由应用发布编译生成,不在浏览器动态注册后端能力。@Async 触发执行没有应用级持久化运行实例;服务重启后无法从审批等待节点或失败节点恢复整张业务链路。processCode 唯一,编码创建后不可修改。businessKey=<objectCode>:<recordId>。businessProcessJson,至少包含 schemaVersion/processCode/subject/nodes/edges/policies/dependencies,所有 ID 以字符串传输。flowJson 含义来兼容业务节点。RECORD_CREATED/RECORD_UPDATED/RECORD_DELETED/STATUS_CHANGED/FIELD_CHANGED/FLOW_APPROVED/FLOW_REJECTED/FLOW_CANCELED 和结构化条件。FORM_SUBMITTED/ACTION_EXECUTED 业务语义事件;审批场景默认使用显式“提交审批”,不把普通草稿保存等同于业务提交。LOWCODE.lowcodeBusinessTriggerScanJob 统一扫描。START_PROCESS 页面动作;按钮权限、可见条件、确认文案和幂等键由服务端发布快照固定。SUCCESS/REJECTED/FAILED/CANCELED 结果,不执行隐藏状态回写;业务状态变化必须使用显式更新记录节点或审批状态映射。flow/design.vue 和 DingFlowDesigner;审批人、会签、抄送、驳回、退回、监听器和节点字段权限只写 BPMN。processInstanceId 和 ai_business_flow_instance_link,业务流程运行实例进入 WAITING;不得在画布执行线程中轮询 Flowable。processInstanceId + businessKey 恢复唯一等待节点,并从 APPROVED/REJECTED/CANCELED/FAILED 出口继续。PENDING/RUNNING/WAITING/SUCCESS/FAILED/CANCELED。BusinessActionStepExecutor 抽为公共步骤运行服务,新触发器和旧业务动作共用同一执行合同。runId + nodeId 稳定键,重试不能重复创建记录、重复发起审批或重复发送消息。PROCESSES 步骤,为每个选中流程生成不可变版本,并把业务流程版本、业务对象版本、Flowable 模型版本和能力引用写入应用快照。legacySourceType + legacySourceId 幂等;简单触发器转换为“开始节点 → 动作/审批节点 → 结束节点”,审批结果动作转换为结果出口后的显式动作。businessKey 的来源;对象仍可被多个应用复用。businessProcessJson 是应用业务编排事实来源;flowJson/BPMN XML 是审批子流程事实来源,二者不能双写同一审批节点配置。APPROVED/REJECTED/CANCELED/FAILED 是审批节点标准出口。一般字段判断使用条件节点,不要求用户再次编写“审批是否通过”的重复条件。RECORD_CREATED 表示业务记录新增成功,不等同于“提交审批”。草稿型单据默认通过 FORM_SUBMITTED 或手动“提交审批”开始流程。applicationCode + processCode,不能把整份流程 JSON 或 Flowable 参数下发到前端。DRAFT/IN_PROCESS/NEED_MODIFY/APPROVED/REJECTED/CANCELED,具体字典可以由对象配置扩展。businessKey=<objectCode>:<recordId>,前端与 JSON 中的雪花 ID 全部使用字符串。WAITING 状态、流程实例匹配、结果尚未消费;重复回调返回幂等成功。进入实施时已重新扫描 Flyway 目录:当前最新为并行变更中的 V1.0.82,本变更连续使用未占用的 V1.0.83/V1.0.84;若提交前出现新版本占用,必须 Reverse Sync 后顺延,禁止覆盖或修改已执行脚本。
| 操作 | 表名 | 关键字段/索引 | 说明 |
|---|---|---|---|
| 新增 | ai_business_process |
id, tenant_id, application_id, process_code, process_name, subject_object_id, subject_object_code, draft_schema_json, design_status, current_version, published_version, status, legacy_source_type, legacy_source_id, del_flag;有效唯一索引 (tenant_id, application_id, process_code, del_flag);非空旧来源唯一索引 (tenant_id, legacy_source_type, legacy_source_id, del_flag) |
应用级流程定义和当前草稿;del_flag BIGINT 删除时写主键;旧来源唯一索引保障简单来源迁移幂等,合并来源继续由迁移服务和 metadata.legacySources[] 校验 |
| 新增 | ai_business_process_version |
id, tenant_id, process_id, version_no, schema_version, schema_json, schema_hash, dependency_snapshot_json, publish_time, status, del_flag;唯一索引 (tenant_id, process_id, version_no, del_flag) |
不可变发布版本和依赖快照,不提供普通修改接口 |
| 新增 | ai_business_process_run |
id, tenant_id, application_id, process_id, process_version_id, process_code, subject_object_code, subject_record_id, business_key, trigger_type, source_event_id, idempotency_key, actor_type, actor_user_id, active_org_id, status, current_node_id, flow_process_instance_id, context_snapshot, retry_count, next_retry_time, error_code, error_summary, start_time, end_time;唯一索引 (tenant_id, process_version_id, idempotency_key) |
持久化编排实例、审批等待关联和恢复检查点 |
| 新增 | ai_business_process_node_run |
id, tenant_id, run_id, node_id, node_type, attempt_no, status, idempotency_key, correlation_id, input_summary, output_summary, error_code, error_summary, next_retry_time, start_time, end_time;唯一索引 (tenant_id, run_id, node_id, attempt_no) |
节点时间线、重试和安全摘要 |
上述表全部包含 create_by/create_time/create_dept/update_by/update_time,字符集 utf8mb4、引擎 InnoDB。定义和版本表属于用户可见设计元数据,使用逻辑删除;运行与节点运行表属于审计运行表,不提供行级删除接口,超期数据由后续明确留存任务物理清理。
| 操作 | 对象 | 变更 | 说明 |
|---|---|---|---|
| 修改 | 应用发布快照 JSON | 增加 processes[]、publishedProcessVersions[] 和 runtimeActions[] |
固定业务流程版本、依赖和手动动作投影 |
| 兼容读取 | ai_business_trigger |
不新增新配置;迁移后进入只读兼容 | 不物理删除,旧运行和回滚继续可追溯 |
| 兼容读取 | ai_business_binding |
旧 OBJECT/FLOW 绑定继续服务运行中实例;新流程不再以该表作为编排事实来源 |
BPMN 节点表单兼容兜底继续保留 |
| 保留 | 业务对象动作配置和 ai_business_action_execution_log |
继续作为原子业务动作和执行审计 | 取消分散主入口,不删除运行时能力 |
| 修改 | sys_resource |
新增业务流程管理、运行记录、重试、迁移预览/执行 API 权限 | tenant_id=1,全部使用 NOT EXISTS |
ai_business_process.legacy_source_type/legacy_source_id 用于记录 TRIGGER/FLOW_BINDING/AUTOMATION_ACTION 来源并建立幂等迁移约束。同一旧配置重复执行迁移时返回已有流程,不重复创建。包含多个旧来源的合并流程在 draft_schema_json.metadata.legacySources[] 保存脱敏引用,迁移报告列出被合并关系。
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 新增 | /ai/business/process/page |
GET | 按应用分页查询业务流程 |
| 新增 | /ai/business/process/:id |
GET | 查询流程定义、草稿摘要和发布状态 |
| 新增 | /ai/business/process |
POST | 在应用内创建业务流程 |
| 新增 | /ai/business/process/:id/copy |
POST | 在同一应用内复制流程为新草稿;必须提供新的唯一编码,不复制发布和运行状态 |
| 新增 | /ai/business/process |
PUT | 修改名称、描述、主对象和草稿协议;编码不可修改 |
| 新增 | /ai/business/process/:id |
DELETE | 无运行中实例和有效发布引用时逻辑删除 |
| 新增 | /ai/business/process/:id/designer |
GET | 获取完整草稿、字段目录、节点能力和依赖候选 |
| 新增 | /ai/business/process/:id/schema |
PUT | 保存 businessProcessJson 草稿和摘要哈希 |
| 新增 | /ai/business/process/:id/validate |
POST | 执行发布前图、对象、字段、身份和依赖校验 |
| 新增 | /ai/business/process/:id/status |
PUT | 启用或停用新触发,不改变历史版本 |
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 新增 | /ai/business/process/runtime/:applicationCode/:processCode/start |
POST | 执行已发布手动开始节点;服务端重新加载业务记录和权限 |
| 新增 | /ai/business/process/run/page |
GET | 查询应用级流程运行记录 |
| 新增 | /ai/business/process/run/:id |
GET | 查询运行详情和节点时间线 |
| 新增 | /ai/business/process/run/:id/retry |
POST | 对可重试失败实例执行受权限控制的人工重试 |
| 新增 | /ai/business/process/run/:id/cancel |
POST | 取消尚未进入不可逆终态的业务流程运行;审批取消仍调用 Flowable 受控接口 |
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 新增 | /ai/business/process/migration/preview |
POST | 按应用预览旧触发器、绑定和动作转换结果 |
| 新增 | /ai/business/process/migration/apply |
POST | 对预览签名一致的结果执行幂等迁移 |
| 新增 | /ai/business/process/migration/issues |
GET | 查询无法自动转换、字段失效和审批冲突问题 |
旧 /ai/business/trigger/** 和 /ai/business/flow/binding/** 在迁移期保留兼容。停止编辑前先在前端移除普通入口并对写接口增加迁移状态保护,不能直接删除 Controller 或数据库表。
forge-plugin-generator/domain/entity:新增流程定义、版本、运行和节点运行实体。forge-plugin-generator/mapper 与 resources/mapper:新增 XML 查询、CAS 状态迁移、运行锁定和迁移查询。forge-plugin-generator/service/businessprocess:新增 Schema、校验、编译、触发分发、编排运行、节点注册、审批恢复、发布和迁移服务。BusinessEventPublisher/BusinessTriggerExecutor/BusinessTriggerSchedulerService:新配置优先进入编排器,旧配置保留兼容适配。BusinessActionExecutionService 及步骤执行器:抽取公共步骤运行合同,供业务动作与流程动作节点共同使用。BusinessFlowService:支持显式审批节点上下文、返回关联信息并发布可靠恢复事件,任务表单和状态回写逻辑不迁移到新模块。BusinessApplicationSnapshotService/BusinessApplicationPublishService/BusinessApplicationRuntimeService:加入流程版本、PROCESSES 发布步骤和手动动作投影。forge-server/db/migration:新增表、索引、字典和权限资源;迁移 JSON 语义由 Java 服务处理,不在 Flyway 中拼接复杂画布。application-workspace/ApplicationAutomationPanel.vue:替换为应用级业务流程列表、运行记录和迁移问题入口。application.[applicationCode].vue 与 ApplicationWorkspaceNav.vue:将 automation 收口为唯一“业务流程”核心分区。components/business-process-designer/:新增业务画布、节点注册、节点卡片、配置面板、协议归一化和校验提示。components/flow-designer/:只抽取可复用图基础,不改变 DingFlowDesigner 的 BPMN 语义和转换测试。object-designer.[objectCode].vue:迁移完成后移除普通用户的旧流程绑定、触发器和自动化动作入口,保留高级兼容诊断。AiCrudPage.vue 与 views/ai/crud-page.vue:新增 START_PROCESS 动作协议、加载态、确认、权限和运行结果处理。api/business-process.js:新增设计、运行和迁移 API。ai_business_flow_instance_link、Flowable 历史、旧触发器日志和业务动作日志继续保留。processes 协议。⚠️ 本变更涉及业务状态流转、审批权限、定时服务身份、跨系统调用和旧配置迁移,进入
/apply前必须完成人工安全与状态机审查。
| 风险 | 级别 | 控制措施 |
|---|---|---|
| 把业务画布错误转换为大 BPMN,导致审批和自动化双重事实来源 | Critical | 新建 businessProcessJson,只复用画布基础;审批节点引用独立 BPMN |
| 同一记录重复发起审批 | Critical | 活动实例检查、流程运行唯一键、审批节点幂等键和 Flowable 启动锁 |
| 回调乱序或重复导致审批后动作重复 | Critical | 节点 CAS、processInstanceId 关联、结果一次性消费和动作幂等键 |
| 定时任务以错误用户或管理员发起审批 | Critical | 显式服务身份和发起人策略;没有合法普通用户时失败关闭 |
| 状态更新绕过业务状态机 | 高 | 状态动作调用领域状态服务;发布校验识别高风险字段,禁止通用字段节点直接改受保护状态 |
| 旧配置清理破坏运行实例和回滚 | 高 | 只读兼容、幂等迁移、逻辑删除、旧快照保留和分阶段停写 |
| 外部调用泄露 Secret 或形成 SSRF | 高 | 只引用统一能力/企业集成连接;快照敏感键清洗和出站白名单 |
| 服务重启丢失等待或失败节点 | 高 | 持久化 run/node_run,启动扫描恢复 PENDING/RUNNING/WAITING 异常状态 |
| 应用发布与流程版本部分成功 | 高 | 新增可恢复 PROCESSES 步骤、不可变版本和幂等提交,不伪装全局事务 |
| 画布协议无限扩张导致运行时不可控 | 中 | schemaVersion、节点白名单、DAG、最大节点数/分支数/子流程深度和严格校验 |
PROCESSES 步骤失败时保留发布运行单和候选快照,不提交应用新版本;重试复用同一运行单。PROCESSES 步骤和回滚快照。/test 或编码阶段验证前创建 test-spec.md 和 execution-log.md,并读取 code-copilot/rules/automated-testing-standard.md。以下采用推荐默认值写入 Proposal,用户明确确认后才能进入 /apply:
FOREACH 动作中存在。businessKey 同时只允许一个活动审批子流程;多个应用级自动化可以并行。businessKey。DingFlowDesigner 的渲染、布局和历史能力可以抽取;flowJson 与 BPMN 双向转换保持不变,新建版本化 businessProcessJson。| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Research | completed | 本 spec.md、现有应用/触发器/动作/Flowable/发布代码 |
已核对当前入口、协议、执行器和迁移边界,未修改生产代码 |
| Proposal | completed | spec.md, tasks.md |
已形成应用级业务流程编排器提案和任务拆分,未创建测试或执行日志 |
| HARD-GATE | completed | 本 spec.md、tasks.md、test-spec.md、execution-log.md |
用户于 2026-08-03 明确要求开始开发,按第 9 章六项推荐默认值进入 /apply |
| Apply/M1 | in_progress | 当前变更目录及后续 Task 1-7、14-16 实现文件 | 先完成控制面与画布,不接管正式触发 |
| Apply/M2-发布边界 | completed | Task 12 后端发布、快照、就绪检查与回滚投影 | 已固定不可变流程/对象/Flowable 版本;正式触发与手动动作仍由 Task 10/13 接入 |
flowJson 承载应用自动化。tasks.md 顺序进入 /apply;状态、权限、幂等、迁移和真实 Flowable 联调门禁继续保留。tasks.md 进入 /apply,修改生产代码、Flyway 脚本、前端页面和样例;不授权自动启动真实服务、执行数据库迁移或改变现有 Flowable 运行态。