status: applying (2026-06-29 已执行工作台底座,并按用户纠偏修复应用中心/流程配置体验) created: 2026-06-29 complexity: 🔴 复杂(结构性变更,3 个独立子迭代) related:
code-copilot/changes/unified-business-flow-app-config/spec.md(第一轮整合:统一配置 Facade)code-copilot/changes/unified-app-flow-experience/spec.md(第二轮整合:7 个具体痛点 + 菜单弱化)- 本变更(第三轮整合:产品结构性重组)
unified-business-flow-app-config(第一轮)打通后端契约,unified-app-flow-experience(第二轮)修复用户感知 7 个痛点。两轮做完后仍有 3 个结构性问题 没解,让"业务应用"与"流程管理"无法真正合体:
| 结构性问题 | 现状 | 用户感受 |
|---|---|---|
| A. 没有"我的工作台"产品概念 | 待办 / 已办 / 我发起 / 抄送我 仍然挂在 /flow/* 路由下 |
弱化 /flow/* 后,普通业务用户找不到待办入口;"流程"作为模块名仍然出现在导航 |
| B. 节点配置必须跳出应用中心 | 应用中心"业务流程"tab → 点按钮 → 跳 /flow/design → 进画布选节点 |
"两个模块拼在一起",用户始终意识到自己离开了业务应用 |
| C. 双渲染引擎共存 | 业务侧 AiForm、流程节点动态表单 FlowFormCreateRenderer(form-create) |
同一个待办列表里两种样式;独立流程的待办与业务待办视觉割裂 |
本变更目标:把上述 3 个结构性问题落地为一轮独立变更,但拆成 3 个可独立交付的子迭代(A / B / C),用户可按业务节奏分批发布。
完成后期望效果(采购单审批 + 任意独立审批流程为试金石):
应用中心 │ 我的工作台 │ 能力中心(高级)。普通业务用户日常只在前两项之间切换。AiForm,form-create 完成迁移并标记为 deprecated。非目标(明确不做):
BusinessFlowAppConfigService / BusinessFlowService 的契约(前两轮已稳定)。顶部导航当前结构:
forge-admin-ui/src/views/app-center/index.vue:9 顶部按钮"能力中心"跳 /app-center/engines。forge-admin-ui/src/router/index.js:/app-center/* 与 /flow/* 是平级路由,没有"我的工作台"概念。forge-admin-ui/src/layout/components/AppHeader.vue(待核对路径),承担顶部导航与切换。待办相关页面:
forge-admin-ui/src/views/flow/todo.vue — 我的待办(已在第二轮 spec 改造列表中文名 / 字段权限 / 移除技术标签)。forge-admin-ui/src/views/flow/done.vue — 我的已办。forge-admin-ui/src/views/flow/started.vue — 我发起的。forge-admin-ui/src/views/flow/cc.vue — 抄送我的。/flow/* 管理类页面(第二轮 spec F5/Task 8 已规划弱化):
forge-admin-ui/src/views/flow/model.vue 流程模型库forge-admin-ui/src/views/flow/form.vue 通用表单管理forge-admin-ui/src/views/flow/template.vue 流程模板forge-admin-ui/src/views/flow/monitor.vue 流程监控forge-admin-ui/src/views/app-center/components/designer/BusinessFlowBindingPanel.vue:227 按钮"打开流程设计器",点击触发 openFlowDesigner(同文件 :829-843):router.push({ path: '/flow/design', query: { id: modelId, businessObjectCode, codeApp, source: 'appCenter' } })。forge-admin-ui/src/views/flow/design.vue:686 通过 businessFlowFormAssets API 拿业务侧资产;design.vue:903-922 业务上下文存在时使用业务资产,否则使用通用表单。节点抽屉组件(第二轮 spec F4 改造的卡片化目标):
forge-admin-ui/src/components/flow-designer/panel/NodeConfigDrawer.vue 抽屉壳forge-admin-ui/src/components/flow-designer/panel/ApproverConfig.vue 审批办理 / 表单权限 tabforge-admin-ui/src/components/flow-designer/panel/FormPermissionConfig.vue 字段权限矩阵forge-admin-ui/src/components/flow-designer/DingFlowDesigner.vue 钉钉式画布壳应用中心"业务流程"tab 当前结构:
forge-admin-ui/src/views/app-center/components/designer/BusinessFlowAppConfigPanel.vue 子 tab:document(单据)+ flow(绑定)。BusinessFlowBindingPanel.vue 内容:流程模型选择 / 业务记录绑定 / 变量映射 / 节点列表(只展示,不可编辑)/ "打开流程设计器"按钮。businessFlowFormAssets + 流程模型节点结构。业务侧渲染(AiForm):
forge-admin-ui/src/components/ai-form/AiForm.vue —— 自研引擎,支持 schema 驱动、双列布局、字段插槽。forge-admin-ui/src/components/ai-form/AiCrudPage.vue —— 业务运行时列表 + 详情 + 表单一体。field-permissions prop。流程节点动态表单(form-create):
forge-admin-ui/src/components/flow-form-create/FlowFormCreateRenderer.vue:46,64,115,144-147 —— form-create 引擎,消费 formJson schema 与 fieldPermissions。/flow/design 节点 formJson 由 BPMN 节点属性承载,与业务对象解耦。流程通用表单管理:
forge-admin-ui/src/views/flow/form.vue —— 通用表单 CRUD,schema 也是 form-create 格式。forge-admin-ui/src/views/flow/template.vue —— 模板含表单字段。AiForm 与 form-create schema 差异:
[{code, label, type, required, options, ...}] 扁平字段数组。businessFlowFormAssets + 模型节点)已经存在,本轮只需把"只展示"升级为"就地编辑"。NodeConfigDrawer / ApproverConfig / FormPermissionConfig 三个组件本身已经做了流程设计器侧的节点配置,本轮可以把它们封装成独立组件,供应用中心嵌入。BusinessFlowAppConfigService / Flow API 写 BPMN 节点属性)。formJson 全部基于 form-create;下线需要写 schema 迁移脚本 + 兼容期共存;存量流程模型的 formJson 不能丢。/flow/design 入口仍然存在,必须明确"两个入口都能配,且最后一次保存为准"。否则会产生数据竞态。按子迭代分组(A/B/C);每个子迭代结束都可独立发布。
/flow/todo /flow/done /flow/started /flow/cc 在路由层保留兼容(直接访问仍可用),同时新增 /workspace/todo 等路由,菜单只显示新路由。/workspace/started。/workspace 默认页展示"今日待办数 / 本周已办数 / 我发起的进行中数 / 抄送我的数"四个卡片,点击进入子页。NodeConfigDrawer / ApproverConfig / FormPermissionConfig 抽成无 BPMN 画布依赖的独立组件 FlowNodeInlineConfig.vue,输入 modelKey + nodeId + businessObjectCode,输出节点配置变更事件。BusinessFlowBindingPanel.vue 中的节点列表从"只展示"升级为可点击;选中节点后右侧抽屉就地打开 FlowNodeInlineConfig,编辑审批办理 / 表单权限 / 高级设置。/flow/design?source=appCenter;用户需要画 BPMN / 编辑条件线时使用。${approvalResult == 'reject'} 等)到"高级设置"折叠区。<sequenceFlow> 的 <conditionExpression>),与完整流程设计器保存契约一致。BusinessFlowService.isInlineEditable(gatewayNode) 给出。formCreateToAiSchema(formJson),把 form-create 嵌套 JSON 转为 AiForm 扁平 schema;不支持转换的字段(自定义组件)保留 raw JSON,AiForm 通过"未知字段插槽"兜底。todo.vue 中 FlowFormCreateRenderer 替换为 AiForm + 适配层;保留 FlowFormCreateRenderer 作为兼容路径(feature flag 控制),仅在 C7 之前过渡使用。/flow/form.vue / /flow/template.vue 表单编辑器从 form-create 改为 AiForm 表单设计器(复用业务对象设计器的 form 面板)。FormCreateSchemaMigrationJob(一次性 / 可重入 / 支持 dry-run / 分批离线),把存量 ai_flow_model_node.form_json 转换为 AiForm schema 并落库到新列 form_schema;旧列保留作为兜底,直至 C7 清理后才能删除。@deprecated 注释 + 编译期警告;新流程不允许选择 form-create 模式;为 C7 清理做准备。form_schema 列填充完毕,feature flag flow.form.engine=ai 全量打开 24h 无回滚。forge-admin-ui/src/components/flow-form-create/FlowFormCreateRenderer.vue 与相关 form-create 组件目录。form-create-designer 依赖(如有):forge-admin-ui/package.json 卸载 form-create 相关包。flow.form.engine(不再需要双引擎切换)。ai_flow_model_node.form_json 字段保留一个大版本作为最终降级兜底,下下轮变更再 DROP COLUMN。form_json 列即时重建 form_schema。应用中心 / 我的工作台 / 能力中心。其中"能力中心"对普通业务用户不显示(requireRole=['superadmin'],沿用第二轮决策)。pending),点击徽标进入 /workspace/todo。/flow/todo /flow/done /flow/started /flow/cc 仍可直接访问,路由表保留但菜单不显示。updateTime;保存时 server 校验 updateTime 不匹配则返回 409 + 提示。exclusiveGateway(排他网关)与 inclusiveGateway(包容网关)支持就地编辑;parallelGateway(并行网关)只展示不可编辑(没有条件可配);事件网关 / 复杂网关在完整设计器中编辑。<conditionExpression xsi:type="tFormalExpression"> 写回 BPMN。isInlineEditable(gatewayNode) 判定规则 = "出向条件全部由 (字段 + 简单运算符 + 字面值) 构成 且 分支数 ≤ 5";超出范围则就地编辑禁用,引导跳完整设计器。formCreateToAiSchema 必须支持以下 form-create 字段类型:input / textarea / number / select / radio / checkbox / date / datetime / switch / upload;不支持的类型保留 raw JSON,渲染时显示"该字段需要在流程独立设计器中编辑"。AiForm + 适配层 (默认) > FlowFormCreateRenderer (feature flag 兜底);feature flag 名:flow.form.engine=ai|formCreate,默认 ai。C7 完成后 feature flag 被移除。FormCreateSchemaMigrationJob 必须可重入 + 幂等 + 支持 dry-run + 分批离线模式;迁移失败的节点保留原状态并记录到 ai_flow_schema_migration_log。/flow/form 表单设计器复用同一组件,避免双重表单设计器。form_schema 列已填充 (b) feature flag flow.form.engine=ai 在生产全量开启至少 24 小时 (c) 监控指标(待办表单渲染错误率、字段权限失效率)无异常。任一条件不满足时,C7 不得执行。ai_flow_model_node.form_json 列保留一个大版本作为最终兜底,期间若需回滚,从该列重建 form_schema;下下轮变更再 DROP COLUMN。| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 新增 | ai_flow_model_node |
增列 form_schema TEXT NULL |
AiForm schema 落库列,旧 form_json 保留兜底;C7 清理后保留一个大版本作为最终兜底。 |
| 新增 | ai_flow_schema_migration_log |
(id, model_key, node_id, status, message, migrated_at, dry_run) | 迁移工具日志表,支持 dry_run 标志区分演练与实际。 |
| 可选 | ai_flow_model_node |
增列 update_time 索引 |
支持并发编辑校验。 |
| 新增 | ai_user_setting |
key=workspace.default_page (value=summary |
todo) |
| 新增(B8) | ai_flow_model_node |
增列 gateway_inline_config TEXT NULL |
网关业务化条件配置缓存(避免每次解析 BPMN 表达式);不强制使用,BPMN <conditionExpression> 仍是权威源。 |
首期 Flyway 脚本:
V1.0.85__add_flow_model_node_form_schema.sqlV1.0.86__create_flow_schema_migration_log.sqlV1.0.87__add_user_setting_workspace_default_page.sqlV1.0.88__add_flow_model_node_gateway_inline_config.sql| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 新增 | /ai/workspace/summary |
GET | 工作台首页四个聚合数(待办 / 已办本周 / 我发起的进行中 / 抄送我未读)。 |
| 新增 | /ai/workspace/todo-count |
GET | 顶部徽标轮询接口(轻量,仅返回数字)。 |
| 新增 | /ai/user/setting/workspace-default-page |
GET/PUT | 用户偏好:进入 /workspace 时默认页(summary / todo),存于 ai_user_setting。 |
| 新增 | /ai/business/flow/node/{modelKey}/{nodeId}/config |
GET | 节点配置详情(应用中心就地配置抽屉用,含 nodeType 标记是否网关)。 |
| 新增 | /ai/business/flow/node/{modelKey}/{nodeId}/config |
PUT | 保存节点配置(含 expectedUpdateTime 用于并发校验)。 |
| 新增 | /ai/business/flow/model/{modelKey}/inline-nodes |
GET | 应用中心步骤条数据(人工任务节点 + 网关节点摘要,含 inlineEditable 标志)。 |
| 新增 | /ai/business/flow/gateway/{modelKey}/{nodeId}/config |
GET | 网关节点业务化条件配置详情(出向条件列表 + 流转目标 + isInlineEditable)。 |
| 新增 | /ai/business/flow/gateway/{modelKey}/{nodeId}/config |
PUT | 保存网关业务化条件(含 expectedUpdateTime)。 |
| 新增 | /ai/business/flow/gateway/presets |
GET | 网关条件预设列表(同意/驳回/退回/终止)。 |
| 新增 | /ai/business/flow/schema/migration/{modelKey} |
POST | 触发单个流程模型的 schema 迁移(管理员,支持 dryRun 参数)。 |
| 新增 | /ai/business/flow/schema/migration |
POST | 批量触发全部模型 schema 迁移(运维,支持 dryRun 与 batchSize)。 |
| 删除(C7) | /ai/flow/form-create/preview 等 |
— | form-create 相关接口若存在,C7 阶段删除。 |
后端:
forge-plugin-generator:BusinessFlowService 新增节点就地配置 API、迁移服务、工作台聚合服务。forge-plugin-flow:FlowModelNodeMapper 增列 form_schema;并发编辑校验。WorkspaceController / WorkspaceService。FormCreateSchemaMigrationJob。前端:
forge-admin-ui/src/views/workspace/ 目录(index、todo、done、started、cc、summary)。AppHeader.vue 待核对路径)。forge-admin-ui/src/router/index.js 增加 /workspace/* 路由组。forge-admin-ui/src/components/flow-inline/FlowNodeInlineConfig.vue(节点就地配置抽屉壳)+ FlowNodeStepList.vue(步骤条)。BusinessFlowBindingPanel.vue 嵌入步骤条 + 就地抽屉。AiForm.vue 增加 form-create schema 适配层。todo.vue 渲染分支替换。flow/form.vue flow/template.vue 表单设计器替换。数据库:新增 2 张表结构变更 + 1 个索引。
⚠️ 本变更涉及流程节点配置数据写入路径、表单 schema 迁移、form-create 代码清理,必须重点验证。
/flow/todo 等链接(包括邮件通知、消息中心、移动端)必须可访问;后端 redirect 兜底。<conditionExpression> 的双向转换必须语义等价;保存后立即回读对比,发现偏差立即报错。isInlineEditable 误判会让用户在就地配置看不到复杂网关;建议给出"看不到的网关"列表,而非完全隐藏。flow.form.engine 切换必须支持租户级灰度,先 1 个租户验证再全量。FormCreateSchemaMigrationJob 必须支持重复执行不副作用、dry-run 模式、批次大小可调;迁移失败可重试。form_json 保留一个大版本作兜底;必须演练"从 form_json 即时重建 form_schema"路径。测试范围:
覆盖率目标:
独立 Test Spec:是,见 test-spec.md。
flow.form.engine)。(2026-06-29 用户确认)form_json 列保留一个大版本作为最终兜底。(2026-06-29 用户确认)/ai/user/setting/workspace-default-page 接口与 ai_user_setting key=workspace.default_page。(2026-06-29 用户确认)HARD-GATE 已通过。
form_schema 新列保存 AiForm schema,form_json 保留作 form-create 兜底;切换通过 feature flag。updateTime / version 字段在保存时校验;冲突时由用户决定覆盖或合并。/flow/todo 等旧路由保留 2 个大版本周期后移除,给老链接 / 通知充分迁移时间。| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Task 0 | propose | spec.md, tasks.md, test-spec.md, execution-log.md |
SDD 提案,未涉及业务代码。 |
| 子迭代 A | partial | WorkspaceController.java, WorkspaceService.java, WorkspaceSummaryVO.java, FlowTaskMapper.xml, FlowCcMapper.xml, workspace/*, BusinessTopNav.vue, router/index.js |
A1/A2/A3 核心完成;用户偏好默认页、A4 toast、A5 菜单迁移待后续。 |
| 子迭代 B | pending | — | 应用中心节点就地配置(含网关 B8)。 |
| 子迭代 C | pending | — | 渲染引擎收敛到 AiForm(含 C7 form-create 完全清理)。 |
尚未进入 /review。
/flow/* 旧路由 2 个大版本兼容期,不删除。/apply 待后续指令)。本节覆盖 §3.B 中“应用中心节点就地配置”和 §9 中“工作台保持并列”的早期计划。以用户本轮 6 条反馈为准。
| 用户反馈 | 执行结论 | 落地方式 |
|---|---|---|
| 应用设计不要再出现“表单字段”配置 | 代码应用设计入口不展示独立表单字段面板 | object-designer.[objectCode].vue 的代码应用导航只保留 flow-app |
| 点击节点配置应弹出流程设计页面,不要跳页 | 应用中心打开完整流程设计器弹窗,用户在真实流程图节点抽屉中配置 | BusinessFlowBindingPanel.vue 内嵌 flow/design.vue,设计器 embedded 模式关闭弹窗 |
| 流程认识业务字段不需要人工配置 | 前端保存时自动按业务字段生成同名变量映射;后端启动流程时兜底注入全部业务字段变量 | BusinessFlowBindingPanel.vue 自动生成 variableMapping;BusinessFlowService.buildFlowVariables() 注入 camel/snake 变体 |
| 审批动态表单样式乱,字段权限不好使 | 待办/已办动态表单统一切到 AiForm 渲染,复用字段权限解析 |
新增 formCreateToAiSchema(),todo.vue / done.vue 使用 AiForm |
| 低代码应用保存后字段权限被覆盖 | 应用中心不再保存新的 nodeForms 副本,避免覆盖流程设计器节点配置 |
BusinessFlowBindingPanel.vue 保存 payload 中 nodeForms: [],运行时以 BPMN 节点配置为准 |
| 应用中心工作台入口重复 | 应用中心顶部暂时隐藏“我的工作台”,保留外部菜单入口 | BusinessTopNav.vue 只展示应用中心/能力中心,并停用 todo-count 轮询 |
补充修复:http://localhost:3000/dev-api/api/workspace/todo-count 404 的直接原因是 Vite 3000 开发服务缺少 /dev-api/api/workspace 代理规则。本轮在 vite.config.js 中新增 workspace 专用代理,必须重启 3000 端口 Vite 后生效。