execution-log.md 16 KB

变更日志 — 我的工作台 + 节点就地配置 + 渲染引擎收敛

记录决策、踩坑和知识发现。知识飞轮的输入。

时间线

时间 阶段 事件 备注
2026-06-29 propose 用户在第二轮 spec 后反馈"还有结构性问题没解" 引出三大问题:我的工作台 / 应用中心节点就地配置 / 双渲染引擎收敛
2026-06-29 propose 创建变更目录 code-copilot/changes/business-workspace-and-inline-flow-config/,生成 spec.md / tasks.md / test-spec.md / execution-log.md unified-app-flow-experience 拆开,独立迭代
2026-06-29 propose HARD-GATE 六项确认完成(保持并列 / 支持网关 / 分批离线迁移 / 本轮清理 form-create / summary 默认 + 偏好 / 仅 4 项 + summary) 调整:新增 B8 网关业务化就地配置 + C7 form-create 完全清理(含前置硬条件 + 回滚预案 + 7 天观察期)

技术决策

决策 选择 放弃的方案 原因
三个子迭代独立交付 A / B / C 任一可单独发布 一锤子全做完 用户可按业务节奏分批;任一阻塞不影响其他
统一渲染引擎 AiForm 引入第三方表单引擎 自研 AiForm 已能覆盖 90% 场景;不引入外部依赖
schema 迁移落点 新列 form_schema,旧列 form_json 保留兜底 原地改写 灰度安全;可降级;可重入
节点配置数据所有权 应用中心就地保存共享 BPMN 节点属性 新建"应用中心节点配置表" 避免双写,数据所有权清晰
并发编辑保护 乐观锁(updateTime) 悲观锁 / 拒绝双端 用户体验更好;冲突很少;UI 兜底
顶部导航 应用中心 / 工作台 / 能力中心 三级,保持并列(用户 2026-06-29 确认) 应用中心内嵌"工作台 Tab";工作台收编应用中心 IA 干净;应用中心 = 配置入口 / 工作台 = 日常事务
网关就地编辑 本轮支持 exclusiveGateway + inclusiveGateway 业务化就地编辑(用户确认) 第一版不支持,所有网关只能进完整设计器 同意/驳回路由是业务高频场景,分离体验割裂;用 isInlineEditable 判定复杂度兜底
form-create 下线节奏 本轮完成代码清理(用户确认);保留 form_json 列一个大版本作兜底 仅 deprecate 不删;下一轮单独清理 用户明确要求一次性收口;前置硬条件 + 回滚预案 + 7 天观察期降低风险
工作台默认页 summary,用户偏好可记忆 直接到 todo 列表 聚合首页提供决策入口,列表深处难发现;用 ai_user_setting 落地
路由兼容期 保留 2 个大版本 立刻 redirect 老链接 / 通知 / 邮件需要迁移时间
应用中心节点配置入口 弹窗打开真实流程设计器 应用中心自建节点配置抽屉 用户明确要求在流程图节点上下文中配置,避免两套节点配置入口割裂
代码应用字段面板 应用中心不展示“表单字段”面板 只读字段目录 用户认为字段来自表单/Provider,不应在应用设计里再出现字段配置心智
业务字段变量 自动注入全部业务字段 人工维护变量映射 流程设计节点条件会从表单字段里选字段,人工映射是重复配置
节点表单权限主数据 BPMN 节点配置为准,应用中心不再保存 nodeForms 应用中心保存一份 nodeForms 副本 避免低代码应用保存后覆盖流程设计器字段权限

踩坑记录

问题 原因 解决方案 沉淀?
(propose 阶段无踩坑,apply 时补充)

知识发现

每个 task 后实时记录,/archive 时逐条确认沉淀到 code-copilot/memory/knowledge/

  • 关键词: workspace top-nav IA — 工作台作为顶级导航与应用中心并列,徽标驱动用户感知,避免被埋进二级菜单
  • 关键词: workspace default page user preferenceai_user_setting.workspace.default_page 记录用户偏好,默认 summary,接口异常回退 summary 不白屏
  • 关键词: flow node inline config drawer — 节点就地配置抽屉组件抽取,与 BPMN 画布解耦,可跨页面复用
  • 关键词: BPMN node optimistic lock — 节点配置乐观锁基于 updateTime,冲突时 409 + UI 确认覆盖
  • 关键词: gateway inline edit — exclusiveGateway / inclusiveGateway 业务化就地编辑;isInlineEditable 判定 = 字段+简单运算符+字面值 且 ≤5 分支;BPMN 表达式作为高级回显
  • 关键词: gateway business-bpmn round-trip — 网关业务化 ↔ BPMN 表达式双向转换;保存后立即回读对比,偏差立即报错
  • 关键词: gateway preset — 同意/驳回/退回/终止 4 个快捷预设;用户一键应用避免手写表达式
  • 关键词: form-create -> AiForm adapter — 适配层支持 10 种基础控件 1:1 映射,未知控件通过 unknownFields 兜底
  • 关键词: schema migration log tableai_flow_schema_migration_log 表记录每个节点的迁移状态,支持重试 + dry-run
  • 关键词: feature flag flow.form.engine — 双引擎切换通过 feature flag,租户级灰度,C7 完成后移除
  • 关键词: form-create purge precheck — C7 前置硬条件自动化检查:迁移 100% + flag 24h 稳定 + 监控指标正常,三者全绿才能 purge
  • 关键词: form-create rollback rebuildFormSchemaRebuildFromFormJsonJob 演练从 form_json 重建 form_schema,C7 上线前必跑一次
  • 关键词: form_json column retention — C7 清理代码后 form_json 列保留一个大版本作兜底,下下轮变更才 DROP COLUMN

Spec-Code 偏差记录

偏差点 Spec 预期 实际情况 处理方式
工作台接口路径 GET /ai/workspace/summaryGET /ai/workspace/todo-count 现有流程前端和 flow server 均使用 /api/flow/* 风格,本轮新增为 GET /api/workspace/summaryGET /api/workspace/todo-count 保持现有 API 前缀一致;后续如统一 /ai/*,再加兼容转发或调整前端 API
用户偏好默认页 新增 /ai/user/setting/workspace-default-page,支持 summary/todo 偏好 本轮未实现,/workspace 固定重定向 /workspace/summary 保留为 A3 剩余项,下一小步补后端 setting 和前端 fallback
菜单迁移 隐藏旧 /flow/todo 等菜单入口 本轮未改数据库菜单资源,新增 /workspace/* 已登录白名单和工作台内侧栏 A5 单独执行,避免无 Flyway/菜单资源脚本的半迁移
应用中心工作台入口 早期 A2 计划显示“我的工作台”按钮和徽标 用户反馈与外部工作台菜单重复,本轮在应用中心隐藏工作台按钮和 todo-count 轮询 保留 /workspace/* 路由和外部菜单,应用中心顶部只保留应用中心/能力中心
应用中心节点就地配置 早期 B1-B8 计划自建节点抽屉/步骤条/网关配置 用户要求点击节点配置直接弹真实流程设计器页面 B1-B8 暂停,改为 BusinessFlowBindingPanel 内嵌 flow/design.vue
流程变量映射 早期页面提供“让流程认识业务字段”配置 用户认为无需配置 移除 UI;前端自动生成同名映射,后端启动时兜底注入业务字段

/apply 阶段如发现偏差,按此格式记录并同步更新 spec.md。

代码质量备忘

  • FlowNodeInlineConfig.vue / FlowGatewayInlineConfig.vue 方案已被本轮用户纠偏暂停;应用中心应打开真实流程设计器,节点配置继续归 BPMN 节点抽屉。
  • formCreateToAiSchema 适配层建议放在 components/ai-form/adapters/,并独立单测;未知字段必须 raise 警告日志(一次性)便于排查。
  • WorkspaceService 聚合接口注意数据库查询合并(避免 4 次独立 count),用单条 SQL 或缓存兜底。
  • 顶部徽标轮询 30s 建议用 useIntervalFn(VueUse),页面隐藏时暂停。
  • 迁移工具 FormCreateSchemaMigrationJob 必须支持 dry-run 模式(先打印迁移计划,不写库)+ batchSize 参数;运维使用安全。
  • 步骤条对长流程(>20 节点)滚动 + 搜索 UX 要在 B2 完成时确认;可参考 GitLab CI 流水线视觉。
  • 应用中心 + 流程设计器双入口编辑节点,文档里必须明确"以最后保存为准",避免用户误解为"两个独立配置"。
  • 网关 convertToBpmnExpression / parseBpmnExpression 必须互逆;建议加 round-trip 属性测试(property-based test)。
  • C7 清理前的备份 tag (pre-form-create-purge) 必须打在 main 分支上,且包含 lockfile;回滚时可整体回退。
  • C7 清理后建议运行依赖分析工具(如 pnpm why @form-create/element-ui)确认无残留间接引用。
  • 工作台偏好接口异常时回退 summary 必须前端兜底,不可阻塞页面加载;后端接口可异步重试。

Apply 执行记录

2026-06-29 — 子迭代 A 工作台底座(A1/A2/A3 核心)

变更范围

  • 后端:新增 WorkspaceControllerWorkspaceServiceWorkspaceSummaryVO,并在 FlowTaskMapper.xml / FlowCcMapper.xml 增加工作台统计 SQL。
  • 前端:新增 BusinessTopNavapi/workspace.jsviews/workspace/*;应用中心和能力中心接入顶部三项导航;权限守卫允许已登录用户访问 /workspace/*
  • 路由:手写 /workspace 父子路由,Vite 自动路由排除 views/workspace,旧 /flow/todo /flow/done /flow/started /flow/cc 保留。

执行命令与结果

命令 结果 备注
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-flow test -DskipITs 通过 Maven 显示 BUILD SUCCESS,但该模块测试被 POM 配置跳过:Tests are skipped
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm test --run 失败 项目 test 脚本已是 vitest run,额外 --run 被 pnpm 判定为未知参数。
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm test 通过 40 passed (40)360 passed (360);存在既有 Vue/测试 mock 警告,不阻断。
mvn -pl forge-flow/forge-flow-server -am compile -DskipTests 失败 当前 shell Java 版本不支持 target 17:无效的目标发行版: 17
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-flow/forge-flow-server -am compile -DskipTests 通过 Reactor 到 forge-flow-server 全部 BUILD SUCCESS
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm build 通过 ✓ built in 1m 48s;存在既有动态导入 chunk 和 CSS // 注释 warning。
git diff --check 通过 无空白错误。
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm exec vite --host 127.0.0.1 --port 5174 --strictPort 已启动 本轮前端 dev server:http://127.0.0.1:5174/,PID 6596

跳过项

  • 未启动本地后端 / 前端服务,未做浏览器点击验证;本轮以编译、单测、生产构建确认可集成性。
  • 未执行真实接口 curl;需要本地数据库、Redis 和登录 token。
  • A4 提交成功 toast、A5 菜单数据迁移、用户偏好默认页接口未纳入本轮。

服务清理

  • 本轮启动的前端 dev server 保留运行,便于用户验证:http://127.0.0.1:5174/,PID 6596。未启动后端服务。

2026-06-29 — 用户纠偏修复(6 项反馈 + 3000 workspace 代理)

变更范围

  • 应用中心代码应用设计器:隐藏“表单字段”面板,仅保留“业务流程配置”。
  • 业务流程配置:移除人工变量映射 UI;“打开流程设计器”改为全屏弹窗内嵌真实 flow/design.vue
  • 节点配置所有权:应用中心保存时不再写入新的 nodeForms,避免覆盖流程设计器节点字段权限。
  • 流程变量:前端自动生成业务字段同名映射,后端启动流程时额外把业务记录字段注入为流程变量,并兼容 camel/snake 命名。
  • 审批动态表单:待办/已办的节点动态表单改用 AiForm,通过 formCreateToAiSchema 兼容旧 form-create schema。
  • 应用中心顶部:隐藏重复“我的工作台”入口和 todo-count 轮询。
  • Vite 代理:新增 /dev-api/api/workspace 代理规则,解决 http://localhost:3000/dev-api/api/workspace/todo-count 命中前端 404 的问题。

执行命令与结果

命令 结果 备注
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm exec eslint src/views/flow/todo.vue src/views/flow/done.vue src/views/flow/design.vue src/views/app-center/components/designer/BusinessFlowBindingPanel.vue src/views/app-center/components/designer/BusinessFlowAppConfigPanel.vue 'src/views/app-center/object-designer.[objectCode].vue' src/components/business-top-nav/BusinessTopNav.vue src/components/ai-form/adapters/formCreate.js 通过 定向覆盖本轮前端改动。
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests 通过 覆盖 generator 业务流程服务改动。
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm build 通过 ✓ built in 1m 35s;存在既有动态导入 chunk 与 CSS warning。
git diff --check 通过 无空白错误。
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm exec vite --host 127.0.0.1 --port 3000 --strictPort 已启动 http://127.0.0.1:3000/,PID 43562
curl -i -s http://127.0.0.1:3000/dev-api/api/workspace/todo-count \| head -n 40 通过 返回 HTTP/1.1 200 OK{"code":401,"message":"未提供登录凭证"...};证明请求已进入后端鉴权链路,不再是前端 404。

跳过项

  • 未执行浏览器点击验证;需要后端服务、登录态和实际流程模型配合验证弹窗内节点配置保存回读。
  • 未执行带登录 token 的 workspace 业务数值验证;当前只验证无登录态下代理不再 404。

服务清理

  • 本段未新启动服务;已有 http://127.0.0.1:5174/(PID 6596)保持运行。
  • 已停止 3000 端口旧 Vite 进程(PID 74006),并重启为 PID 43562,用于用户继续验证。

2026-06-30 — 采购待办表单渲染与字段权限修复

变更范围

  • 待办审批:business-code 表单优先使用其 formUrl 指向的业务组件渲染,采购审批走 /business/purchase-order-test 专用任务表单,不再被通用 AiForm 摊平成字段清单。
  • 前端权限:useBusinessTaskFormContext 以后台返回的 fields 清单作为字段显示/编辑边界,未返回的字段默认不可见不可编辑。
  • 后端权限:业务对象和代码表单在存在显式字段权限时,未列入权限的字段默认不可见;无权限配置时保持旧的全量只读兜底。

执行命令与结果

命令 结果 备注
git diff --check -- forge-admin-ui/src/views/flow/todo.vue forge-admin-ui/src/composables/useBusinessTaskFormContext.js forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowService.java 通过 无空白错误。
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm exec eslint src/views/flow/todo.vue src/composables/useBusinessTaskFormContext.js 通过 定向覆盖本轮前端改动。
mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests 失败 当前 shell Java 版本不支持 target 17:无效的目标发行版: 17
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:$PATH mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests 通过 BUILD SUCCESS;存在既有 deprecation / unchecked 编译提示,不阻断。

跳过项

  • 未启动前后端做采购流程页面点击验证;需要本地登录态、后端服务和一条处于待办节点的采购单实例。
  • 未执行全量 pnpm build;本轮只改待办渲染分支和字段权限上下文,已做定向 ESLint 与后端目标模块编译。

服务清理

  • 本轮未启动新的服务,无需清理。