tasks.md 69 KB

任务清单:form-first-business-object-designer

status: proposed created: 2026-05-31 spec: code-copilot/changes/form-first-business-object-designer/spec.md 拆分顺序:产品决策冻结 → 表单优先协议 → fcDesigner 适配层 → Forge 业务组件 → 对象设计器体验 → 视图投影 → 级联联动 → 发布迁移 → 应用中心体验收尾 → 验证归档 原则:表单设计是普通用户第一入口;优先复用 fcDesigner;不自研完整表单画布;form-create rule/options 不是 Forge 运行时唯一事实来源;字段编码和数据库列稳定;普通模式不展示 DDL、表名、Schema、configKey。

前置条件

  • 已确认首期以 fcDesigner 作为表单设计画布,不推进完整自研画布。
  • 已确认 FormCreateDesignerAdapter.vue 是低代码表单设计适配基础。
  • 已确认 form-create rule/options 只作为设计器可编辑表示,保存和发布时必须转换为 Forge Schema。
  • 已确认 LowcodeModelSchema.fields 首期继续作为字段注册表事实来源。
  • 已确认 ai_business_object.designer_options 优先承载表单优先扩展配置;确实不足时再新增 JSON 列。
  • 已确认普通用户默认进入“表单设计”,字段资产下沉为高级维护面板。
  • 已确认表单组件删除默认只移出表单,不直接删除字段。
  • 已确认发布运行态继续使用 AiCrudPageAiFormDynamicCrudControllerLowcodeRuntimeConfigBuilder

阶段总览

阶段 目标 包含任务 交付结果
Phase 0 决策冻结 Task 0-1 明确 fcDesigner 复用边界、字段事实来源、Schema 存储策略
Phase 1 协议与 Schema Task 2-5 FormDesignerSchema、FieldRegistry、ViewSchema、LinkageSchema 协议
Phase 2 fcDesigner 适配层 Task 6-10 form-create rule/options 与 Forge Schema 双向转换
Phase 3 Forge 业务组件 Task 11-16 字典、地区、组织、用户、文件、图片、引用对象设计态/运行态组件
Phase 4 表单优先对象设计器 Task 17-21 默认表单设计入口、字段自动绑定、字段资产降级、高级属性隔离
Phase 5 视图投影 Task 22-25 查询、列表、详情从表单和字段派生,并支持视图层覆盖
Phase 6 级联联动 Task 26-29 统一级联规则,支持字典父子、关联字典、远程参数、组织/对象过滤
Phase 7 发布与兼容 Task 30-33 发布检查、旧对象迁移、运行配置生成、版本回滚
Phase 8 应用中心体验收尾与验证归档 Task 34-40 应用总览、CRM 交付验收、构建、接口、页面、CRM 端到端验收和文档回填

任务总览

Task 阶段 名称 状态 优先级
Task 0 Phase 0 产品和技术决策冻结 completed P0
Task 1 Phase 0 现有 fcDesigner 集成能力盘点 completed P0
Task 2 Phase 1 FormDesignerSchema 协议定义 completed P0
Task 3 Phase 1 字段注册表和字段绑定协议 completed P0
Task 4 Phase 1 ViewSchema 视图投影协议 completed P0
Task 5 Phase 1 LinkageSchema 级联联动协议 completed P0
Task 6 Phase 2 form-create 到 Forge Schema 转换器 completed P0
Task 7 Phase 2 Forge Schema 到 form-create 转换器 completed P0
Task 8 Phase 2 字段引用提取和脏引用修复 completed P0
Task 9 Phase 2 fcDesigner 设计器适配组件重构 completed P0
Task 10 Phase 2 设计器预览与保存事件标准化 completed P1
Task 11 Phase 3 字典组件设计态和运行态适配 completed P0
Task 12 Phase 3 地区、组织、用户组件适配 completed P0
Task 13 Phase 3 文件、图片上传组件适配 completed P1
Task 14 Phase 3 引用对象选择组件适配 completed P1
Task 15 Phase 3 子表/明细表组件适配 completed P1
Task 16 Phase 3 组件属性面板业务化 completed P0
Task 17 Phase 4 对象设计器默认入口切换为表单设计 completed P0
Task 18 Phase 4 表单拖入组件自动创建字段 completed P0
Task 19 Phase 4 字段资产面板重构 completed P0
Task 20 Phase 4 普通属性和高级属性隔离 completed P0
Task 21 Phase 4 表单设计保存和未保存变更提示 completed P0
Task 22 Phase 5 查询条件视图投影 completed P0
Task 23 Phase 5 数据列表视图投影 completed P0
Task 24 Phase 5 详情视图投影 completed P1
Task 25 Phase 5 视图层对齐、宽度、排序覆盖 completed P0
Task 26 Phase 6 级联规则编辑模型 completed P0
Task 27 Phase 6 字典父子和关联字典运行态过滤 completed P0
Task 28 Phase 6 远程参数、组织和对象引用过滤 completed P1
Task 29 Phase 6 级联发布检查和脏规则修复 completed P0
Task 30 Phase 7 发布检查支持表单优先 Schema completed P0
Task 31 Phase 7 发布编译链路接入 FormDesignerSchema completed P0
Task 32 Phase 7 旧字段优先对象迁移 completed P0
Task 33 Phase 7 设计版本和回滚兼容 completed P1
Task 34 Phase 8 应用总览和应用列表布局收敛 completed P0
Task 35 Phase 8 CRM 套件交付验收区域收敛 completed P0
Task 36 Phase 8 前端构建和 lint 验证 completed P0
Task 37 Phase 8 后端编译和接口验证 completed P0
Task 38 Phase 8 Playwright 页面冒烟验证 completed P0
Task 39 Phase 8 CRM 客户对象端到端验收 pending P0
Task 40 Phase 8 Spec、任务、执行日志回填 completed P1
Task 41 Phase 8 设计器交互回归修复 completed P0
Task 42 Phase 8 动态运行态表单组件与布局回归修复 completed P0
Task 43 Phase 8 组织数据源、运行态样式和字段 DDL 同步修复 completed P0
Task 44 Phase 8 表单布局组件与保存入口收敛 completed P0
Task 45 Phase 8 应用入口、设计器弹层和多列表单回归修复 completed P0
Task 46 Phase 8 fcDesigner 画布列数和布局组件中文化修复 completed P0

Phase 0:决策冻结

Task 0: 产品和技术决策冻结

目标: 在编码前冻结表单优先主链路,避免继续在固定字段配置和自研画布上消耗成本。

涉及文件:

  • code-copilot/changes/form-first-business-object-designer/spec.md
  • code-copilot/changes/form-first-business-object-designer/tasks.md
  • code-copilot/memory/decisions.md

执行要点:

  • 确认 fcDesigner 是首期表单画布基础。
  • 确认不从零自研完整表单设计器。
  • 确认 form-create rule/options 必须经 Forge Adapter 转换。
  • 确认普通用户默认进入“表单设计”。
  • 确认字段资产不再作为普通用户第一入口。
  • 确认表单组件删除不直接删除字段。

验收标准:

  • spec.md 第 24 章待确认问题中与首期路线相关的问题已给出结论。
  • tasks.md 前置条件全部有明确确认。
  • code-copilot/memory/decisions.md 记录“fcDesigner 优先,不自研完整画布”的项目决策。

Task 1: 现有 fcDesigner 集成能力盘点

目标: 明确当前 fcDesigner 能力边界,避免重复实现已有功能。

涉及文件:

  • forge-admin-ui/package.json
  • forge-admin-ui/src/components/form-create/FlowFormCreateDesigner.vue
  • forge-admin-ui/src/components/form-create/FlowFormCreateRenderer.vue
  • forge-admin-ui/src/components/form-create/formCreateBridge.js
  • forge-admin-ui/src/components/lowcode-builder/page/FormCreateDesignerAdapter.vue
  • forge-admin-ui/src/components/lowcode-builder/page/page-schema.js
  • forge-admin-ui/src/components/lowcode-builder/preview/LowcodePreviewPane.vue

执行要点:

  • 梳理 @form-create/designer@form-create/element-ui 版本和使用位置。
  • 梳理 FormCreateDesignerAdapter.vue 当前已经支持的字段映射、保存、预览能力。
  • 梳理 page-schema.js 已有 formCreateRule/formCreateOptions 字段引用解析逻辑。
  • 输出当前可复用能力和缺口清单。

验收标准:

  • 形成 code-copilot/changes/form-first-business-object-designer/research.md
  • research.md 明确哪些能力复用、哪些能力补齐、哪些能力不做。

Phase 1:协议与 Schema

Task 2: FormDesignerSchema 协议定义

目标: 定义 Forge 自有表单设计 Schema,作为表单优先设计器的产品层事实来源。

涉及文件:

  • 新增 forge-admin-ui/src/views/app-center/components/designer/form-first/formDesignerSchema.js
  • 新增 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/FormDesignerSchemaDTO.java
  • 修改 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessObjectDesignerDTO.java
  • 修改 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessObjectDesignerVO.java

协议字段:

  • schemaVersion
  • formKey
  • formName
  • layout
  • components
  • component.id
  • component.componentKey
  • component.label
  • component.fieldBinding
  • component.props
  • component.layout
  • component.validation
  • component.visibility

执行要点:

  • 前端提供默认 schema、normalize、validate、clone 工具。
  • 后端 DTO 使用 Map<String, Object> 承载可扩展 JSON,避免频繁改 Java 类型。
  • BusinessObjectDesignerVO 返回当前表单设计草稿。
  • BusinessObjectDesignerDTO 支持保存当前表单设计草稿。

验收标准:

  • 空对象能生成合法默认 FormDesignerSchema
  • 已有对象没有表单 Schema 时能根据字段生成默认 Schema。
  • Schema 校验能识别缺少 id、缺少 componentKey、字段组件未绑定字段等问题。

Task 3: 字段注册表和字段绑定协议

目标: 建立表单组件与业务字段的稳定绑定规则。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/form-first/formDesignerSchema.js
  • forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessFieldDTO.java
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessFieldVO.java
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFieldSchemaService.java

协议字段:

  • fieldBinding.mode: fieldvirtual
  • fieldBinding.fieldCode
  • fieldBinding.createIfMissing
  • fieldBinding.source: designerfield_assetmigration
  • fieldBinding.locked

执行要点:

  • 拖入字段组件时自动创建 fieldBinding
  • label 改名只改字段展示名称,不改已发布字段编码。
  • 虚拟组件不进入字段注册表。
  • 系统字段和已发布字段支持只读绑定。

验收标准:

  • 新拖入“单行文本”并命名“客户名称”时自动生成 customerName/customer_name
  • 已发布字段重命名不会变更 fieldCodecolumnName
  • 删除画布组件不会删除字段注册表字段。

Task 4: ViewSchema 视图投影协议

目标: 统一查询条件、数据列表、详情视图的派生配置和覆盖配置。

涉及文件:

  • 新增 forge-admin-ui/src/views/app-center/components/designer/form-first/viewSchema.js
  • 修改 forge-admin-ui/src/views/app-center/components/designer/BusinessListDesigner.vue
  • 修改 forge-admin-ui/src/views/app-center/components/designer/BusinessDetailDesigner.vue
  • 修改 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessLayoutDTO.java
  • 修改 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessLayoutVO.java

协议字段:

  • search.fields[]
  • list.columns[]
  • detail.sections[]
  • align
  • width
  • fixed
  • sortable
  • visible
  • order
  • formatter

执行要点:

  • 视图默认从字段注册表和表单 Schema 派生。
  • 用户调整查询/列表/详情时只保存覆盖项。
  • 对齐、列宽、固定列、排序属于视图层配置。

验收标准:

  • 不配置视图时能自动生成查询、列表、详情。
  • 用户设置列表列居中后,发布运行态表格列居中。
  • 用户设置查询条件右对齐后,运行态搜索表单字段右对齐。

Task 5: LinkageSchema 级联联动协议

目标: 统一描述字段联动,不把级联能力散落到单个组件属性中。

涉及文件:

  • 新增 forge-admin-ui/src/views/app-center/components/designer/form-first/linkageSchema.js
  • 修改 forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue
  • 修改 forge-admin-ui/src/views/app-center/components/designer/BusinessRelationDesigner.vue
  • 修改 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/dto/businessapp/BusinessObjectDesignerDTO.java
  • 修改 forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessObjectDesignerVO.java

协议字段:

  • ruleId
  • type
  • sourceField
  • targetField
  • dataSourceType
  • matchMode
  • dictConfig
  • remoteConfig
  • emptyStrategy
  • clearOnSourceChange

执行要点:

  • 支持 parentDictCodelinkedDictremoteParamobjectReferenceorgScope
  • 表单、查询条件、运行态表单共用规则。
  • 发布检查能定位失效规则。

验收标准:

  • 能定义“客户等级 → 客户状态”的关联字典级联。
  • 能定义“省份/组织 → 下级选项”的远程参数过滤。
  • 规则引用不存在字段时发布检查阻断。

Phase 2:fcDesigner 适配层

Task 6: form-create 到 Forge Schema 转换器

目标: 将 fcDesigner 输出的 form-create rule/options 转换为 Forge FormDesignerSchema

涉及文件:

  • 新增 forge-admin-ui/src/views/app-center/components/designer/form-first/formCreateToForge.js
  • 修改 forge-admin-ui/src/components/form-create/formCreateBridge.js
  • 修改 forge-admin-ui/src/components/lowcode-builder/page/FormCreateDesignerAdapter.vue

执行要点:

  • 解析 rule 的 field/title/type/props/validate/value/children
  • 生成稳定 component.id
  • 映射 typecomponentKey
  • 从 rule 提取字段绑定。
  • 将 form-create 校验规则转换为 Forge validation。
  • 将 form-create options 转换为 Forge layout。

验收标准:

  • input、textarea、inputNumber、select、radio、checkbox、datePicker、timePicker、switch、upload 可转换。
  • 嵌套 children 可转换。
  • 转换后不丢失字段引用和基础校验。

Task 7: Forge Schema 到 form-create 转换器

目标: 将 Forge FormDesignerSchema 反向生成 form-create rule/options,使 fcDesigner 可编辑。

涉及文件:

  • 新增 forge-admin-ui/src/views/app-center/components/designer/form-first/forgeToFormCreate.js
  • 修改 forge-admin-ui/src/components/lowcode-builder/page/FormCreateDesignerAdapter.vue

执行要点:

  • 根据组件类型生成 form-create type
  • 根据字段注册表补齐 field/title/name
  • 根据 Forge props 生成 form-create props。
  • 根据 validation 生成 form-create validate。
  • 根据 layout 生成 form-create options。
  • 保留 Forge 扩展属性到 rule _forge 字段,避免编辑后丢失业务信息。

验收标准:

  • Forge Schema 进入 fcDesigner 后可正常显示、编辑、保存。
  • 编辑后再次转换回 Forge Schema 不丢失 fieldBinding
  • fcDesigner 不显示 undefined 或空字段标题。

Task 8: 字段引用提取和脏引用修复

目标: 防止表单引用已删除字段或重复字段。

涉及文件:

  • forge-admin-ui/src/components/lowcode-builder/page/page-schema.js
  • forge-admin-ui/src/views/app-center/components/designer/form-first/formDesignerSchema.js
  • forge-admin-ui/src/views/app-center/components/designer/BusinessFormDesigner.vue
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectPublishService.java

执行要点:

  • 提取 form-create rule 中的所有字段引用。
  • 提取 Forge FormDesignerSchema 中的所有字段引用。
  • 删除重复字段引用。
  • 标记不存在字段引用。
  • 提供修复动作:移除组件、重新绑定字段、创建新字段。

验收标准:

  • 表单引用不存在字段时,保存可提示,发布必须阻断。
  • 重复绑定同一字段时提示用户确认是否允许复用。
  • 自动修复不会删除字段资产中的真实字段。

Task 9: fcDesigner 设计器适配组件重构

目标: 将现有低代码 FormCreateDesignerAdapter.vue 改造为业务对象表单设计器核心画布。

涉及文件:

  • forge-admin-ui/src/components/lowcode-builder/page/FormCreateDesignerAdapter.vue
  • 新增 forge-admin-ui/src/views/app-center/components/designer/BusinessFormCreateDesigner.vue
  • 修改 forge-admin-ui/src/views/app-center/components/designer/BusinessFormDesigner.vue

执行要点:

  • 保留 FcDesigner 作为画布。
  • 增加业务对象上下文:objectId、objectCode、suiteCode、fields。
  • 顶部操作改为保存、预览、按字段生成、清理失效字段。
  • 输出 Forge FormDesignerSchema,而不是只输出 formCreateRule。
  • 支持从已有字段注册表生成默认表单。

验收标准:

  • 对象设计器表单页能加载 fcDesigner
  • 保存后后端能收到 Forge FormDesignerSchema。
  • 重新进入页面可以还原上次设计结果。

Task 10: 设计器预览与保存事件标准化

目标: 统一表单设计器保存、预览、应用配置、重置等动作。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/BusinessFormCreateDesigner.vue
  • forge-admin-ui/src/components/form-create/FlowFormCreateRenderer.vue
  • forge-admin-ui/src/components/lowcode-builder/preview/LowcodePreviewPane.vue

执行要点:

  • save 保存 Forge Schema。
  • preview 展示设计态表单预览。
  • resetFromFields 根据字段注册表重建表单。
  • repairRefs 修复失效字段引用。
  • applyDesignerConfig 只做本地应用,不自动发布。

验收标准:

  • 用户点击预览可看到真实表单控件。
  • 用户点击保存后页面离开不再提示未保存。
  • 重置前必须二次确认。

Phase 3:Forge 业务组件

Task 11: 字典组件设计态和运行态适配

目标: 在 fcDesigner 中支持 Forge 字典选择,并映射到运行态 DictSelect

涉及文件:

  • forge-admin-ui/src/components/DictSelect.vue
  • forge-admin-ui/src/composables/useDict.js
  • forge-admin-ui/src/views/app-center/components/designer/form-first/forgeBusinessComponents.js
  • forge-admin-ui/src/components/ai-form/AiFormItem.vue

执行要点:

  • 设计态支持选择 dictType
  • 设计态展示字典占位项。
  • 运行态使用 DictSelectuseDict
  • 保留 parentDictCodelinkedDictTypelinkedDictValue

验收标准:

  • 设计器中可拖入“字典选择”。
  • 属性面板可选择字典类型。
  • 发布后运行态下拉显示真实字典项。

Task 12: 地区、组织、用户组件适配

目标: 支持 Forge 常用组织类组件在 fcDesigner 中设计和运行。

涉及文件:

  • forge-admin-ui/src/components/RegionTreeSelect.vue
  • forge-admin-ui/src/components/common/UserSelectPicker.vue
  • forge-admin-ui/src/components/ai-form/AiFormItem.vue
  • forge-admin-ui/src/views/app-center/components/designer/form-first/forgeBusinessComponents.js

执行要点:

  • 地区组件映射到 RegionTreeSelect
  • 用户组件映射到 UserSelectPicker
  • 部门/组织组件映射到现有组织树 optionSource。
  • 搜索态保留行政区划 ALL 查询语义。

验收标准:

  • 设计器可拖入地区、组织、用户组件。
  • 运行态表单和查询条件能正常选择。
  • 行政区划查询继续符合 AGENTS 附录 A 规则。

Task 13: 文件、图片上传组件适配

目标: 支持文件和图片上传组件设计态、运行态和鉴权展示。

涉及文件:

  • forge-admin-ui/src/components/file-upload/index.vue
  • forge-admin-ui/src/components/image-upload/index.vue
  • forge-admin-ui/src/components/common/AuthImage.vue
  • forge-admin-ui/src/components/ai-form/AiFormItem.vue
  • forge-admin-ui/src/views/app-center/components/designer/form-first/forgeBusinessComponents.js

执行要点:

  • 图片上传存储 fileId,不存 URL。
  • 运行态图片回显使用 AuthImage
  • 文件字段支持数量、大小、类型限制。
  • 表单设计态显示上传占位,不实际上传。

验收标准:

  • 图片字段发布后表单可上传 fileId。
  • 列表图片回显不直接使用 URL。
  • 文件字段配置不会暴露敏感下载地址。

Task 14: 引用对象选择组件适配

目标: 支持业务对象引用字段,例如联系人引用客户。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/BusinessRelationDesigner.vue
  • forge-admin-ui/src/components/ai-form/AiFormItem.vue
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeRuntimeConfigBuilder.java
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFieldSchemaService.java

执行要点:

  • 设计态可选择目标对象、值字段、显示字段。
  • 运行态通过远程 optionSource 加载对象选项。
  • 支持保存 ID 和回显名称。
  • 支持作为级联源字段或目标字段。

验收标准:

  • 可配置“联系人所属客户”引用字段。
  • 编辑表单能回显已保存客户名称。
  • 查询条件可按引用对象筛选。

Task 15: 子表/明细表组件适配

目标: 支持主子表/明细字段设计和运行。

涉及文件:

  • forge-admin-ui/src/components/lowcode-builder/page/FormCreateDesignerAdapter.vue
  • forge-admin-ui/src/views/app-center/components/designer/BusinessRelationDesigner.vue
  • forge-admin-ui/src/views/app-center/components/designer/form-first/forgeBusinessComponents.js
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeRuntimeConfigBuilder.java

执行要点:

  • 设计态用“明细表”组件表达子表。
  • 明细表绑定目标对象和关系。
  • 子表字段不误生成到主对象字段注册表。
  • 发布检查目标对象和关系配置。

验收标准:

  • CRM 客户详情可配置联系人/跟进记录明细区域。
  • 主表发布不会把子表字段同步进主表物理表。

执行状态: completed

  • forgeBusinessComponents 已提供“明细表”业务组件,字段绑定为 virtual,避免误生成主对象字段。
  • ChildTableEditor 新增行后立即提交到父表单,提交时可进入主子表 payload。
  • 子表复杂字段复用 AiFormItem 运行态组件,支持字典、组织、地区、引用对象、上传等真实控件。
  • LowcodeRuntimeConfigBuilder 在编辑区缺少子表 fieldRef 时兜底输出子表可编辑字段,避免 form-first 保存后子表配置为空。

Task 16: 组件属性面板业务化

目标: 让业务用户在属性面板里只看到高频业务配置,高级技术项默认折叠。

涉及文件:

  • forge-admin-ui/src/components/lowcode-builder/page/ComponentPropertyPanel.vue
  • forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue
  • forge-admin-ui/src/views/app-center/components/designer/BusinessFormCreateDesigner.vue

执行要点:

  • 普通属性:标题、提示、默认值、必填、只读、隐藏、宽度、对齐。
  • 控件属性:字典类型、多选、搜索、清空、日期格式。
  • 联动属性:级联源字段、匹配方式、清空策略。
  • 高级属性:字段编码、列名、数据类型、长度、小数位、脱敏、加密。

验收标准:

  • 普通模式默认不展示数据库列名、DDL、Schema。
  • 开发者模式才展示高级属性。
  • 属性改动能保存并恢复。

Phase 4:表单优先对象设计器

Task 17: 对象设计器默认入口切换为表单设计

目标: 业务用户进入对象设计器时默认看到表单画布。

涉及文件:

  • forge-admin-ui/src/views/app-center/object-designer.[objectCode].vue
  • forge-admin-ui/src/views/app-center/components/designer/BusinessObjectDesignerShell.vue
  • forge-admin-ui/src/router/index.js

执行要点:

  • 默认 panel 从 fields 改为 form
  • 左侧导航把“表单设计”放第一位。
  • 字段资产放到“字段资产”导航项。
  • URL query panel=fields 仍兼容。

验收标准:

  • 点击“设计对象”默认进入表单设计。
  • 老链接 panel=fields 仍能打开字段资产。
  • 顶部状态和发布按钮不丢失。

执行状态: completed

  • 应用中心、套件页、对象详情页和对象创建向导默认打开 panel=form
  • 对象设计器页面在没有 query panel 时默认进入表单页签,panel=fields 老链接仍保留字段资产入口。
  • 设计器壳层已调整为全屏浮层式工作台,表单画布拥有完整视口空间。

Task 18: 表单拖入组件自动创建字段

目标: 用户拖入字段组件后无需先去字段管理创建字段。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/BusinessFormCreateDesigner.vue
  • forge-admin-ui/src/views/app-center/components/designer/form-first/formDesignerSchema.js
  • forge-admin-ui/src/api/business-app.js
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFieldDesignService.java

执行要点:

  • 拖入组件生成临时字段绑定。
  • 用户填写标题后生成字段编码建议。
  • 保存时批量创建缺失字段。
  • 字段创建失败时定位到组件。

验收标准:

  • 拖入“单行文本”并输入“客户名称”后保存,会创建 customerName 字段。
  • 字段编码冲突时提示并给出可选编码。
  • 保存失败不会丢失画布草稿。

执行状态: completed

  • formCreateToForge 已将 fcDesigner 临时 field_... 转为稳定字段编码,冲突时自动追加数字后缀。
  • BusinessFormDesigner.saveLayout 保存表单前会根据 FormDesignerSchema 补齐缺失字段资产,并先保存字段注册表再保存布局。
  • 设计器草稿字段允许先保存未完成的字典/引用配置,后续发布检查再阻断必填业务配置。

Task 19: 字段资产面板重构

目标: 字段资产服务于查看和高级维护,不再是主工作台。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/BusinessFieldList.vue
  • forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue
  • forge-admin-ui/src/views/app-center/components/designer/BusinessFormDesigner.vue

执行要点:

  • 字段列表显示“已放入表单”“未放入表单”“系统字段”“已发布”状态。
  • 支持将未使用字段拖回表单。
  • 删除字段前展示引用位置。
  • 已发布字段默认停用或隐藏。

验收标准:

  • 未放入表单字段可一键添加到表单。
  • 字段被查询/列表/详情/级联引用时删除会阻断。
  • 字段状态变化同步到表单和视图。

执行状态: completed

  • 字段资产页已增加统计、搜索、状态筛选、来源筛选和“表单生成/已入表单/未入表单/查询/列表”标记。
  • 未入表单字段支持从字段资产页一键切回表单画布并追加组件。
  • 字段资产定位调整为查看与高级维护,不再作为对象设计默认主工作台。

Task 20: 普通属性和高级属性隔离

目标: 降低业务用户认知负担。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue
  • forge-admin-ui/src/views/app-center/components/designer/BusinessAdvancedConfig.vue
  • forge-admin-ui/src/stores 或现有权限/用户 store

执行要点:

  • 普通模式只展示业务字段属性。
  • 高级模式展示字段编码、列名、数据类型、Schema。
  • 高级模式需要权限控制。
  • 危险操作二次确认。

验收标准:

  • 普通用户看不到 DDL、表名、Schema、configKey。
  • 有高级权限用户可查看和维护技术项。
  • 字段编码修改会提示已发布风险。

执行状态: completed

  • 字段属性面板普通模式隐藏字段编码、列名、数据类型、字段长度等技术项。
  • 高级模式继续通过权限控制入口展示字段编码、列名、数据类型、查询方式、脱敏和加密配置。

Task 21: 表单设计保存和未保存变更提示

目标: 保证设计器编辑体验可靠。

涉及文件:

  • forge-admin-ui/src/views/app-center/object-designer.[objectCode].vue
  • forge-admin-ui/src/views/app-center/components/designer/BusinessFormCreateDesigner.vue
  • forge-admin-ui/src/api/business-app.js

执行要点:

  • 表单 schema 变化设置 dirty 状态。
  • 路由离开和关闭抽屉前提示。
  • 保存成功更新 baseline。
  • 保存失败保留用户编辑。

验收标准:

  • 未保存离开页面会提示。
  • 保存成功后不再提示。
  • 保存失败时画布内容不丢失。

执行状态: completed

  • 顶部状态增加“未保存”提示,面板 dirty 状态保留边框提示。
  • 切换设计面板时如存在未保存变更会二次确认,路由离开和浏览器关闭继续保留提示。
  • 表单保存失败不清理本地 FormDesignerSchema,用户画布内容继续保留。

Phase 5:视图投影

Task 22: 查询条件视图投影

目标: 从表单/字段派生查询条件,并允许用户覆盖。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/BusinessListDesigner.vue
  • forge-admin-ui/src/views/app-center/components/designer/form-first/viewSchema.js
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeRuntimeConfigBuilder.java

执行要点:

  • 默认把 searchable=true 字段生成查询条件。
  • 支持排序、折叠、默认值、对齐。
  • 支持级联规则注入查询条件组件。

验收标准:

  • 新增字段勾选“作为查询条件”后自动出现在查询设计。
  • 查询条件对齐设置发布后生效。
  • 删除字段后查询条件引用被提示修复。

执行状态: completed

  • viewSchema.js 已支持从 pageSchema 的 search zone 投影查询字段、查询方式、组件类型、默认值和对齐方式。
  • BusinessListDesigner 在查询配置变化时同步更新 draft.viewSchema,保存列表时同步持久化 ViewSchema。

Task 23: 数据列表视图投影

目标: 从字段派生列表列,并支持表格视图配置。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/BusinessListDesigner.vue
  • forge-admin-ui/src/components/ai-form/AiTable.vue
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeRuntimeConfigBuilder.java

执行要点:

  • 默认把 listVisible=true 字段生成列。
  • 支持列宽、最小宽、固定列、对齐、排序。
  • 字典字段使用 DictTag
  • 图片字段使用 AuthImage

验收标准:

  • 列表列配置发布后运行态生效。
  • 图片列不直接用 URL。
  • 字典列显示标签而不是裸值。

执行状态: completed

  • viewSchema.js 已支持从 table zone 投影列表列顺序、渲染方式、对齐、列宽、固定列和排序配置。
  • StructuredListPageDesigner 补齐列宽和固定列配置,运行态继续复用已有字典、组织、用户、地区、文件和图片渲染逻辑。

Task 24: 详情视图投影

目标: 从表单分组和字段生成详情视图。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/BusinessDetailDesigner.vue
  • forge-admin-ui/src/views/app-center/components/designer/form-first/viewSchema.js
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeRuntimeConfigBuilder.java

执行要点:

  • 默认复用表单分组生成详情分组。
  • 支持详情字段隐藏、只读、格式化。
  • 支持关联数据页签。

验收标准:

  • 客户详情能显示基础信息分组。
  • 详情字段顺序与设计一致。
  • 关联页签不影响主表字段发布。

执行状态: completed

  • BusinessDetailDesigner 保存详情时同步生成 ViewSchema.detail.sections
  • 详情主信息继续按表单字段顺序只读展示,关联页签从关系配置投影到 detail zone。

Task 25: 视图层对齐、宽度、排序覆盖

目标: 把对齐、宽度、排序明确放在视图层,而不是污染模型字段。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/BusinessListDesigner.vue
  • forge-admin-ui/src/views/app-center/components/designer/BusinessFormCreateDesigner.vue
  • forge-admin-ui/src/components/ai-form/AiFormItem.vue
  • forge-admin-ui/src/components/ai-form/AiTable.vue
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeRuntimeConfigBuilder.java

执行要点:

  • 表单字段支持内容对齐。
  • 查询条件支持内容对齐。
  • 列表列支持内容对齐、宽度、固定列。
  • LowcodeRuntimeConfigBuilder 输出 align/width/fixed/sortable

验收标准:

  • 表单、查询、列表可分别配置同一字段的不同对齐方式。
  • 发布后运行态分别生效。

执行状态: completed

  • 表单对齐继续来自 FormDesignerSchema / form-create _forge.layout.align
  • 查询和列表对齐、列表列宽、固定列、排序保存到 pageSchema fieldSettings 并投影到 ViewSchema。
  • LowcodeRuntimeConfigBuilder 已输出表格列 align/width/fixed/sorter,视图层配置优先于模型字段默认宽度。

Phase 6:级联联动

Task 26: 级联规则编辑模型

目标: 提供统一的级联规则配置入口。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/BusinessRelationDesigner.vue
  • forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue
  • forge-admin-ui/src/views/app-center/components/designer/form-first/linkageSchema.js

执行要点:

  • 字段属性中提供快捷级联配置。
  • “关系与级联”面板提供全量规则列表。
  • 支持 sourceField、targetField、matchMode、emptyStrategy、clearOnSourceChange。

验收标准:

  • 用户能配置字典 A 控制字典 B。
  • 用户能查看当前对象全部级联规则。
  • 删除字段时能看到关联级联规则。

执行状态: completed

  • linkageSchema.js 已支持从字段 basicProps.cascade 汇总规则、规范化 LinkageSchema、校验规则和将规则回写目标字段。
  • BusinessRelationDesigner 已扩展为“对象关系 / 级联规则”统一页签,支持新增、编辑、停用、删除级联规则。
  • 保存关系页时会同步保存 linkageSchema,并把规则回写到字段运行属性,避免级联配置散落且不可见。

Task 27: 字典父子和关联字典运行态过滤

目标: 支持用户提出的 sys_dict_data 三字段级联。

涉及文件:

  • forge-admin-ui/src/composables/useDict.js
  • forge-admin-ui/src/components/DictSelect.vue
  • forge-admin-ui/src/components/ai-form/AiFormItem.vue
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeRuntimeConfigBuilder.java

执行要点:

  • useDict 保留 parentDictCodelinkedDictTypelinkedDictValue
  • DictSelect 支持 parentDictCode 过滤。
  • DictSelect 支持 linkedDictType/linkedDictValue 过滤。
  • 上级变化时按规则清空下级。

验收标准:

  • 选择字典 A 的值后,字典 B 按 parent_dict_code 过滤。
  • 选择字典 A 的值后,字典 B 按 linked_dict_type/value 过滤。
  • 查询条件和编辑表单都能生效。

执行状态: completed

  • useDict 保留 parentDictCodelinkedDictTypelinkedDictValue 元数据。
  • DictSelectAiFormItem 已按 parentDictCodelinkedDict 两种模式过滤字典选项,并支持上级变化清空下级。
  • LinkageSchema 保存后会写入目标字段 basicProps.cascade,发布运行态继续复用现有字典组件过滤能力。

Task 28: 远程参数、组织和对象引用过滤

目标: 支持非字典级联,例如组织关联某类业务数据。

涉及文件:

  • forge-admin-ui/src/components/ai-form/AiFormItem.vue
  • forge-admin-ui/src/views/app-center/components/designer/form-first/linkageSchema.js
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeRuntimeConfigBuilder.java

执行要点:

  • remoteParam 将上级字段值作为 API 参数。
  • orgScope 将组织/部门/地区值作为过滤参数。
  • objectReference 支持业务对象引用级联。
  • 上级为空时支持 empty/all/disabled。

验收标准:

  • 选择组织后,下级远程选择只展示该组织相关数据。
  • 上级为空时下级按配置显示空、全部或禁用。

执行状态: completed

  • 级联规则支持 remoteParamorgScopeobjectReference 类型,并统一生成运行态 remoteParam cascade 配置。
  • AiFormItem 已在远程 optionSource 中注入上级字段参数。
  • emptyStrategy=disabled 时运行态目标控件会在上级为空时禁用。

Task 29: 级联发布检查和脏规则修复

目标: 防止发布后出现失效联动。

涉及文件:

  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectPublishService.java
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessPublishCheckVO.java
  • forge-admin-ui/src/views/app-center/components/designer/BusinessPublishChecklist.vue

执行要点:

  • 检查 sourceField 是否存在。
  • 检查 targetField 是否存在。
  • 检查字典类型是否存在。
  • 检查远程参数是否配置完整。
  • 提供修复入口。

验收标准:

  • 级联规则引用删除字段时发布阻断。
  • 缺少目标字典类型时发布阻断。
  • 警告和阻断项能跳转到对应配置面板。

执行状态: completed

  • BusinessObjectPublishService 新增 Linkage 发布检查,覆盖 LinkageSchema 和字段快捷级联配置。
  • 发布检查会阻断上级字段缺失、目标字段缺失、目标字典类型缺失、关联字典类型缺失、远程参数缺失、远程接口缺失和引用目标对象缺失。
  • 发布检查中的 LINKAGE 类问题会跳转到“关系与级联”面板修复。

Phase 7:发布与兼容

Task 30: 发布检查支持表单优先 Schema

目标: 发布检查覆盖表单 Schema、字段注册表、视图投影和级联规则。

涉及文件:

  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectPublishService.java
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/vo/businessapp/BusinessPublishCheckVO.java
  • forge-admin-ui/src/views/app-center/components/designer/BusinessPublishChecklist.vue

执行要点:

  • 字段检查。
  • 表单组件检查。
  • 视图引用检查。
  • 级联规则检查。
  • 数据表检查。
  • 运行配置生成检查。

验收标准:

  • 发布检查能显示通过、警告、阻断。
  • 阻断项都有修复入口。
  • 无业务字段、无表单组件、字段引用失效都能被拦截。

执行状态: completed

  • BusinessObjectPublishService 已将发布检查扩展到 FormDesignerSchema、ViewSchema 和 LinkageSchema。
  • 表单检查会阻断空表单、字段组件未绑定、表单组件引用不存在字段和组件 ID 重复。
  • 视图检查会阻断查询、列表、详情投影引用不存在字段;阻断项能跳转到表单、列表、详情或关系与级联面板。

Task 31: 发布编译链路接入 FormDesignerSchema

目标: 将表单优先 Schema 编译到现有运行态配置。

涉及文件:

  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectDesignerService.java
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectPublishService.java
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/lowcode/LowcodeRuntimeConfigBuilder.java

执行要点:

  • FormDesignerSchema 生成 editSchema。
  • ViewSchema 生成 searchSchema、columnsSchema、detailSchema。
  • LinkageSchema 注入 props/cascade/optionSource。
  • 字段注册表生成 LowcodeModelSchema。

验收标准:

  • 发布后 AiCrudPage 能正常新增、编辑、查询、列表展示。
  • 表单设计中的字段顺序和校验发布后生效。
  • 视图层配置发布后生效。

执行状态: completed

  • BusinessObjectDesignerService.saveDraft 已在保存草稿和发布前编译表单优先 Schema,输出统一的 LowcodeModelSchemaLowcodePageSchema
  • FormDesignerSchema 会同步字段 label、必填、只读、默认值、控件类型、表单顺序和 edit 区域字段设置。
  • ViewSchema 会同步查询、列表、详情区域的字段顺序、对齐、宽度、固定列、排序和分组设置。
  • LinkageSchema 会写回目标字段 basicProps.cascade,运行态组件可继续使用统一级联配置。
  • BusinessObjectPublishService.publishCheck 会基于编译后的页面和字段配置执行运行配置生成检查。

Task 32: 旧字段优先对象迁移

目标: 兼容已有业务对象,不要求用户重建表单。

涉及文件:

  • forge-admin-ui/src/views/app-center/components/designer/form-first/formDesignerSchema.js
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectDesignerService.java
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessLayoutDesignService.java

执行要点:

  • 有 formCreateRule 时转换为 FormDesignerSchema。
  • 有 LowcodePageSchema 时转换为 FormDesignerSchema。
  • 只有字段时生成默认表单。
  • 未使用字段进入字段资产。

验收标准:

  • 现有 CRM 客户对象进入新设计器能看到表单。
  • 旧对象未发布草稿不影响当前运行态。
  • 迁移后可保存、发布、回滚。

执行状态: completed

  • BusinessObjectDesignerService 在没有保存 FormDesignerSchema 时,会优先从旧 editformCreateRule 迁移出表单优先 Schema。
  • 没有 formCreateRule 但存在旧 LowcodePageSchema.edit.fieldRefs 时,会按旧表单字段顺序和 fieldSettings 生成可编辑表单。
  • 只有字段注册表的对象仍按字段生成默认表单,未进入表单的字段保留在字段资产中。
  • 迁移结果只作为进入设计器的兜底回显,用户保存后才写入 designer_options,不直接改动旧运行态草稿。

Task 33: 设计版本和回滚兼容

目标: 让设计版本能保存表单优先相关快照。

涉及文件:

  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/domain/entity/AiBusinessObjectDesignVersion.java
  • forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessObjectDesignVersionService.java
  • forge-admin-ui/src/views/app-center/components/designer/BusinessVersionPanel.vue

执行要点:

  • 版本快照包含 FormDesignerSchema、FieldRegistry、ViewSchema、LinkageSchema。
  • 回滚时恢复设计草稿,不直接覆盖运行态,除非用户重新发布。
  • 版本列表展示发布时间、发布人、状态、说明。

验收标准:

  • 发布生成设计版本。
  • 回滚后设计器画布恢复。
  • 重新发布后运行态更新。

执行状态: completed

  • 新增 ai_business_object_design_version.designer_options_snapshot JSON 快照列,用于保存 FormDesignerSchema/ViewSchema/LinkageSchema 等设计器扩展配置。
  • 设计版本 DTO/VO、实体和 Mapper 已补齐 designerOptionsSnapshot
  • 发布生成版本、回滚生成版本时都会写入当前 designer_options 快照。
  • 回滚设计版本时会恢复模型、页面、关系和设计器扩展快照;旧版本没有快照时会清空扩展配置并回到迁移/默认兜底逻辑。

Phase 8:应用中心体验收尾与验证归档

Task 34: 应用总览和应用列表布局收敛

目标: 解决 /app-center 应用总览和应用列表信息密度混乱的问题,让业务对象、应用入口、套件导航的层级更清楚。

涉及文件:

  • forge-admin-ui/src/views/app-center/index.vue
  • forge-admin-ui/src/views/app-center/shared-center.css
  • forge-admin-ui/src/views/app-center/components/AppCard.vue
  • forge-admin-ui/src/views/app-center/components/ObjectCard.vue
  • forge-admin-ui/src/views/app-center/components/AppFilterBar.vue

执行要点:

  • 总览页保留左侧套件导航,但减少重复统计和装饰性信息。
  • 主区域优先展示当前套件、对象数量、应用入口数量、发布状态和下一步动作。
  • 对象卡片和应用入口卡片统一高度、按钮位置、状态标签和空态。
  • 应用入口列表避免与业务对象列表视觉权重混在一起,使用 tabs 或清晰分区。
  • 移动端和窄屏下导航、过滤器、卡片列表不能互相挤压。

验收标准:

  • /app-center 首屏能清楚区分套件导航、业务对象、应用入口。
  • 业务对象卡片和应用入口卡片不出现按钮错位、标题换行遮挡、统计重复堆叠。
  • 1024px、1440px、移动端宽度下布局不乱。
  • Playwright 截图用于对比应用总览改造结果。

执行状态: completed

  • /app-center 改为左侧套件导航 + 主工作区结构,主工作区用指标条、筛选条和对象/入口 tabs 区分信息层级。
  • 业务对象卡片和应用入口卡片统一为固定操作区,按钮和更多操作收敛到卡片底部,标题、描述、标签均做截断和稳定高度处理。
  • 修复 Naive UI n-spin-content flex 导致卡片网格在桌面收缩成单列的问题,桌面恢复 3 列、1024px 恢复 2 列、移动端单列。
  • 顶部 top-menu / top-side-menu 在窄屏隐藏长标题、搜索入口和次要工具按钮,避免应用中心移动端横向溢出。
  • Playwright mock 数据截图验证通过:/private/tmp/forge_app_center_visual/app-center_desktop.png/private/tmp/forge_app_center_visual/app-center_tablet.png/private/tmp/forge_app_center_visual/app-center_mobile.png

Task 35: CRM 套件交付验收区域收敛

目标: 解决 /app-center/suite/CRM 交付验收区域信息堆叠和视觉拥挤的问题,让验收状态、阻断项和下一步动作更容易判断。

涉及文件:

  • forge-admin-ui/src/views/app-center/suite.[suiteCode].vue
  • forge-admin-ui/src/views/app-center/components/SuiteAcceptancePanel.vue
  • forge-admin-ui/src/views/app-center/shared-center.css

执行要点:

  • 套件详情页主栏优先展示业务对象和应用入口,交付验收保持侧栏摘要,不抢主工作区。
  • SuiteAcceptancePanel 区分完整模式和 compact 模式,CRM 套件侧栏默认使用 compact。
  • compact 模式只展示验收结论、关键计数、阻断项摘要和下一步主按钮。
  • 详细对象、引擎、渠道检查可折叠或进入完整验收详情,不在侧栏长列表堆叠。
  • 状态颜色、标签和按钮语义统一,避免多层卡片嵌套。

验收标准:

  • /app-center/suite/CRM 右侧交付验收区域不超过一屏主要高度。
  • 验收结论、阻断项、下一步动作在 3 秒内可识别。
  • 侧栏没有明显文字重叠、卡片嵌套、按钮挤压。
  • Playwright 截图用于对比 CRM 套件页改造结果。

执行状态: completed

  • /app-center/suite/CRM 保留主栏业务对象和场景入口,交付验收固定为侧栏摘要,不再挤占主工作区。
  • SuiteAcceptancePanel compact 模式强化结论卡、关键步骤、核心对象、引擎能力和渠道接入的视觉层级。
  • 使用容器查询优化 compact 面板:在窄侧栏保持单列摘要,在 1024px 单列页面时自动恢复多列网格,避免大屏单列拉伸。
  • 修复验收面板内 n-spin-content 宽度收缩问题,侧栏与平板宽容器均按实际容器宽度排布。
  • Playwright mock 数据截图验证通过:/private/tmp/forge_app_center_visual/app-center_suite_CRM_desktop.png/private/tmp/forge_app_center_visual/app-center_suite_CRM_tablet.png/private/tmp/forge_app_center_visual/app-center_suite_CRM_mobile.png

Task 36: 前端构建和 lint 验证

目标: 确保前端改造可构建。

命令:

source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build

验收标准:

  • 构建成功。
  • 若出现已有 UnoCSS icon 警告,需要记录为既有警告,不作为本变更失败。
  • 无 Vue 模板编译错误。

执行状态: completed

  • 针对本阶段触达文件的 ESLint 已通过。
  • 全量前端构建已通过:NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
  • 构建中仍存在既有 UnoCSS 图标加载、CSS // 注释、动态/静态 import chunk 和大 chunk 警告,未出现 Vue 模板编译错误。

Task 37: 后端编译和接口验证

目标: 确保后端 DTO、Service、发布链路编译通过。

命令:

cd forge && 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-admin-server -am compile -DskipTests

接口验证:

  • GET /ai/business/object/{objectId}/designer
  • PUT /ai/business/object/{objectId}/designer
  • PUT /ai/business/object/{objectId}/layout/form
  • GET /ai/business/object/{objectId}/publish/check
  • POST /ai/business/object/{objectId}/publish

验收标准:

  • Maven 编译成功。
  • 接口返回统一 RespInfo
  • 保存表单草稿不影响当前运行配置。

执行状态: completed

  • 后端编译已通过:mvn -pl forge-admin-server -am compile -DskipTests
  • 本地后端健康检查通过,CRM 客户对象读取型接口返回 HTTP 200:designerlayout/formfieldspublish-check
  • 当前本地后端连接共享数据库,未直接执行 PUT /designerPOST /publish,避免改写真实设计草稿或发布版本。

Task 38: Playwright 页面冒烟验证

目标: 验证对象设计器基础交互无运行时错误。

涉及页面:

  • /app-center
  • /app-center/suite/CRM
  • /app-center/object/:objectCode/designer

验证点:

  • 登录后能进入应用中心。
  • 点击 CRM 客户对象“设计对象”进入表单设计。
  • fcDesigner 画布正常渲染。
  • 拖入字段组件不报错。
  • 保存草稿不报错。
  • 控制台无新增 runtime error。

验收标准:

  • 至少保存 2 张截图:应用中心、客户对象表单设计器。
  • 截图中不出现明显重叠、遮挡、空白画布。

执行状态: completed

  • Playwright mock 数据冒烟已覆盖 /app-center/app-center/suite/CRM/app-center/object/CRM_CUSTOMER/designer?suiteCode=CRM&panel=form
  • 应用中心和 CRM 套件页在 1440px、1024px、390px 视口均无 body 横向溢出。
  • 表单设计器已修复 1024px 下 fcDesigner 中间画布被压缩导致字段竖排的问题;窄屏下由画布内部横向滚动承载完整设计器。
  • 截图路径:/private/tmp/forge_app_center_visual/app-center_desktop.png/private/tmp/forge_app_center_visual/app-center_suite_CRM_desktop.png/private/tmp/forge_app_center_visual/app-center_object_CRM_CUSTOMER_designer?suiteCode=CRM&panel=form_desktop.png、对应 tablet/mobile 截图同目录。

Task 39: CRM 客户对象端到端验收

目标: 以 CRM 客户对象验证完整业务闭环。

验收脚本:

  • 打开客户对象设计器。
  • 默认进入表单设计。
  • 拖入客户名称、客户等级、客户状态字段。
  • 配置客户等级控制客户状态级联。
  • 设置客户名称必填。
  • 设置列表客户等级列居中。
  • 保存草稿。
  • 执行发布检查。
  • 发布对象。
  • 打开运行应用。
  • 新增一条客户数据。
  • 查询列表确认字段展示和级联生效。

验收标准:

  • 全链路可完成。
  • 发布前阻断项为 0。
  • 运行态新增、查询、列表展示正常。

执行状态: pending

  • 尚未执行真实保存、发布和新增客户数据的端到端流程。
  • 原因:当前本地后端连接共享数据库,直接发布或新增数据会影响共享环境。
  • 下一步建议使用独立本地库或测试租户执行本任务,覆盖保存草稿、发布检查、发布对象、运行态新增与查询。

Task 40: Spec、任务、执行日志回填

目标: 让变更记录可追溯。

涉及文件:

  • code-copilot/changes/form-first-business-object-designer/spec.md
  • code-copilot/changes/form-first-business-object-designer/tasks.md
  • 新增 code-copilot/changes/form-first-business-object-designer/execution-log.md
  • code-copilot/memory/pitfalls.md
  • code-copilot/memory/decisions.md

执行要点:

  • 回填实际完成范围。
  • 标记未完成项和后续计划。
  • 记录 fcDesigner 适配踩坑。
  • 记录最终验证命令和结果。

验收标准:

  • tasks.md 状态与实际一致。
  • execution-log.md 记录关键命令、结果、截图路径。
  • 有价值的踩坑和决策进入记忆文件。

执行状态: completed

  • 已新增 execution-log.md,记录实现范围、验证命令、截图路径和剩余风险。
  • 已回填 Task 36-40 状态,其中真实 CRM 端到端验收继续保持 pending。
  • 已补充 fcDesigner 窄屏布局踩坑到 code-copilot/memory/pitfalls.md

Task 41: 设计器交互回归修复

目标: 修复表单优先对象设计器在真实使用中的交互回归。

问题清单:

  • 左侧菜单切换后 BusinessFormCreateDesigner 异步回写已销毁的 fcDesigner 实例,导致 setRule 空引用并卡住。
  • 列表设计底部/右侧汇总信息占用空间。
  • fcDesigner 内置预览弹层被对象设计器全屏层级遮挡。
  • 关系与级联面板把 linkageSchema prop 变更重新 emit 给父组件,触发递归更新。
  • 部分保存请求没传 relations 时,后端 DTO 默认空列表导致已有关系被误清空。

执行状态: completed

  • BusinessFormCreateDesigner 增加销毁态和加载序号保护,所有异步 hydrate 完成后都会重新确认设计器实例存在。
  • BusinessListDesigner 移除查询条件、表格列、工具栏、行操作汇总侧栏,列表设计区域改为单列工作区。
  • BusinessObjectDesignerShell 降低全屏层级,让 form-create / Element Plus 预览弹层可以正常浮在设计器之上。
  • BusinessRelationDesigner 拆分关系脏状态和级联同步,外部 schema 重置不再反向 emit,保存级联时不会携带未加载或未修改的空关系数组。
  • object-designer.[objectCode].vue 的通用草稿保存不再携带 relations,关系只由关系面板专门保存。
  • BusinessObjectDesignerDTOfieldsrelationsdesignerOptions 改为可空,后端可以区分“未传字段”和“明确传空数组”。
  • 验证通过:目标文件 ESLint、mvn -pl forge-admin-server -am compile -DskipTestsNODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build

Task 42: 动态运行态表单组件与布局回归修复

目标: 修复运行态动态页面中组织选择、用户选择回显以及编辑表单布局与设计态不一致的问题。

问题清单:

  • 运行态表单项只识别严格的 orgTreeSelectuserSelect 类型,历史别名或设计器中间类型会退化为普通输入框。
  • 用户选择后只回填单一 targetField,遇到 ownerUserIdNameownerUserNameownerName 等不同翻译字段时展示不稳定。
  • 组织树当前值缺少名称兜底选项,编辑详情中值能回填但显示名称可能丢失。
  • 表单设计保存后只写回 formCreateRule/formCreateOptions,运行态直接消费的 fieldSettings 没同步,导致顺序、span、labelWidth、align、label 不一致。
  • 后端运行态编辑字段 label 优先取模型字段,未优先使用设计器覆盖 label。

执行状态: completed

  • AiFormItem 增加组织/用户组件别名识别,组织树默认读取 /system/org/tree,并在选择或编辑回填时通过候选名称字段补齐展示文本。
  • AiFormItem 用户选择回填支持 labelValueFieldtargetField${field}Name*UserName*Name 等候选字段,选择和清空都会同步显示字段。
  • AiForm 必填校验把组织/用户别名按选择类组件处理。
  • BusinessFormDesigner 保存表单设计时同步编译 fieldSettingsfieldRefseditGridColslabelPlacementlabelWidth,并保留关系字段配置。
  • LowcodeRuntimeConfigBuilder 运行态编辑字段优先使用设计器 label/defaultValue,规范组织/用户历史别名,并为组织/用户字段补齐默认 labelValueField/targetField
  • 验证通过:目标文件 ESLint、mvn -pl forge-admin-server -am compile -DskipTestsNODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build

Task 43: 组织数据源、运行态样式和字段 DDL 同步修复

目标: 继续修复真实使用中暴露的组织列表不渲染、编辑页样式与设计器不一致、表单新增字段未同步数据库列的问题。

问题清单:

  • 组织树字段如果保存了空 optionSource,运行态会跳过默认 /system/org/tree 数据源。
  • 远程选项只读取 res.data,对 RespInfo、分页 records/list/rows、嵌套 data 等响应形态不够健壮。
  • 编辑表单运行态缺少设计器行距、列距和标签右对齐参数,且 2 列表单默认弹窗宽度偏窄。
  • 表单设计器拖入新字段后只保存字段注册表,未通过低代码受控 DDL 同步物理表缺失列。

执行状态: completed

  • AiFormItem 对空/无效 optionSource 增加回退逻辑,组织选择默认走 /system/org/tree,并增强远程响应解包和 tree option 字段兜底。
  • AiForm / AiCrudPage / 动态 CRUD 页面支持编辑表单 labelAligneditXGapeditYGap,运行态默认标签右对齐、行列间距 16。
  • FormDesignerSchema、form-create 双向转换、前后端编译链路保存 rowGap/columnGap,后端运行配置输出更接近设计器布局;2 列编辑表单默认弹窗宽度提升到 1040px
  • BusinessObjectDesignerDTO 新增 syncDdl/confirmSyncDdlBusinessObjectDesignerService.saveDesigner 在表单保存后使用 LowcodeDdlService 预览并执行缺失表结构同步,继续校验 ai:lowcode:deploy-ddl 权限。
  • BusinessFormDesigner 保存表单时请求同步 DDL,新增字段保存后会同步缺失数据库列。
  • 验证通过:目标文件 ESLint、mvn -pl forge-admin-server -am compile -DskipTestsNODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build

Task 44: 表单布局组件与保存入口收敛

目标: 修复 fcDesigner 布局组件保存/回显异常、运行态编辑表单未按设计布局渲染、表单设计页保存按钮过多的问题。

问题清单:

  • fcDesigner 的 fcRow/col/elCard/elTabs/elCollapse/elDivider 等布局节点会被转换成普通字段,重新进入设计器后布局退化。
  • 编辑页运行态只消费扁平 editSchema,卡片、标签页、折叠面板、栅格行列等设计布局无法还原。
  • 表单设计页同时存在顶部全局“保存”、表单面板“保存表单”、设计器工具栏“应用表单配置”,保存入口重复。
  • 表单优先编译后仍可能受旧 canvas 排序影响,导致字段顺序和设计器顺序不一致。

执行状态: completed

  • FormDesignerSchema 将布局/辅助组件归一为虚拟节点,form-create 双向转换保留原始类型、children、style/native/wrap 等元数据,不再生成伪字段。
  • BusinessFormDesigner 和后端编译链路生成 formLayout 树,并把 row/col 继承 span 编译到 fieldSettings;表单优先编译会清理旧 canvas
  • LowcodeRuntimeConfigBuilder 下发 options.editFormLayout,动态 CRUD 页面把布局树与字段 schema 合并。
  • AiForm 新增递归布局渲染,支持 row/col/card/tabs/collapse/divider,同时继续复用原有 AiFormItem 字段渲染和校验。
  • 移除表单面板“保存表单”和设计器工具栏“应用表单配置”,只保留对象设计器顶部全局“保存”。
  • 验证通过:目标文件 ESLint、mvn -pl forge-admin-server -am compile -DskipTestsNODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build

Task 45: 应用入口、设计器弹层和多列表单回归修复

目标: 修复应用入口挂载菜单后的重复 tab、对象设计器新开页面污染 tab、动态搜索区按钮错位,并补齐表单两列/三列配置到运行态适配。

问题清单:

  • /app-center/app/:appId 作为应用入口桥接页会先登记“应用入口”tab,再 replace 到实际动态页面,形成重复 tab。
  • 动态 CRUD 页面作为唯一 tab 时无法关闭,用户从菜单打开客户页后只能关闭桥接入口 tab。
  • 对象设计器从应用总览、套件页、对象详情页进入时走路由跳转,顶部会堆积多个设计器 tab。
  • AiForm 搜索操作区独立开 grid 后落到第一列,导致“搜索/重置/展开”按钮靠左。
  • 表单设计缺少显式的一列/两列/三列控制,三列表单运行态弹窗宽度也偏窄。

执行状态: completed

  • BusinessAppEntryBusinessObjectDesigner 路由增加 skipTab,tab guard 会跳过桥接/设计器路由并清理遗留桥接 tab。
  • 动态 CRUD tab 增加 forceClosable,顶部 tab 组件改为按 tab 计算关闭能力,客户动态页即使是唯一业务 tab 也可以关闭。
  • 应用总览、套件详情、对象详情的“设计对象”改为直接挂载 object-designer.[objectCode].vue 全屏弹层,不再通过路由新开 tab;设计器直接 URL 访问仍保持兼容。
  • AiForm 搜索操作区跨整行右对齐,折叠按钮判断改为基于可见字段。
  • BusinessFormDesigner 增加“表单列数”控制,保存到 FormDesignerSchema.layout.gridColumns,发布运行态继续映射到 editGridCols/formLayout;三列表单默认弹窗宽度提升到 1180px
  • 验证通过:目标文件 ESLint、mvn -pl forge-admin-server -am compile -DskipTestsNODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build

Task 46: fcDesigner 画布列数和布局组件中文化修复

目标: 修复表单设计器中“单列/两列/三列”只影响运行态、不影响 fcDesigner 画布的问题,并让布局组件拖入后显示中文业务化名称。

问题清单:

  • FormDesignerSchema.layout.gridColumns 只保存了业务列数,但 fcDesigner 画布实际按 form-create rule 的 col.span 渲染,导致画布一直看起来像单列。
  • 拖入 fcRow/col/elCard/elTabs/elCollapse/elDivider 等布局组件后,部分节点标题或回显名称保留英文/原始组件名。
  • col.props.span=12 属于 form-create 24 栅格,转换成 Forge schema 时不能直接当成业务列跨度,否则两列布局回显会被撑成整行。
  • 空栅格布局保存时,后端递归编译运行态字段会把 null inheritedSpan 误拆箱,导致 PUT /ai/business/object/{objectId}/designer 空指针。

执行状态: completed

  • BusinessFormDesigner 切换表单列数时,立即把当前 schema 组件重算为对应的 form-create col.span:单列 24、两列 12、三列 8。
  • BusinessFormCreateDesigner 重置字段和追加字段时保留当前列数,并向 fcDesigner 显式传入中文 locale。
  • FormDesignerSchema 增加布局组件中文默认名称和英文/原始名称归一化,保存、回显和拖入后的布局节点统一显示中文。
  • formCreateToForge 读回 fcDesigner 规则时也会按当前列数重算布局,避免 col.props.span 被误解释成业务列跨度。
  • BusinessObjectDesignerService 修复 collectRuntimeFormFieldsinheritedSpan 三元表达式拆箱问题,空布局容器不再触发 NPE。
  • 验证通过:目标文件 ESLint、mvn -pl forge-admin-server -am compile -DskipTestsNODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build

Task 47: 删除字典组件后残留字段校验修复

目标: 修复 fcDesigner 删除字典/引用组件后,保存仍提示“字典字段必须配置字典类型”或引用字段配置不完整的问题。

问题清单:

  • fcDesigner 删除画布组件只移除 FormDesignerSchema.components,不会自动删除字段资产注册表中的历史字段。
  • 表单保存时会把全部主表业务字段提交给后端,旧的 DICT/SELECT/RADIO/CHECKBOX/CASCADER/REFERENCE 字段如果已经不在当前画布或已改成普通输入,仍可能触发字段类型必填校验。
  • 仅靠前端归一化不够,旧页面缓存、其它保存入口或历史数据仍可能绕过前端处理。

执行状态: completed

  • BusinessFormDesigner 保存前按当前 FormDesignerSchema 建立字段到画布组件的映射;字段已移出画布且未配置字典/引用,或字段在画布上已切回普通组件时,自动降级为普通文本字段。
  • 前端降级时同步清理 dictTypereferenceObjectCodereferenceDisplayField,并把 componentType/queryType 调整为 input/like
  • BusinessObjectDesignerService.saveDesigner 在重建模型字段前增加后端兜底,对提交字段和当前表单 schema 做同样归一化,避免残留字段资产再次触发后端校验。
  • 验证通过:BusinessFormDesigner.vue ESLint、git diff --checkmvn -pl forge-admin-server -am compile -DskipTestsNODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build

Task 48: fcDesigner 栅格布局临时 ref 展示修复

目标: 修复栅格布局、栅格列等布局组件前显示 ref_Fs5x... 这类 fcDesigner 临时引用串的问题。

问题清单:

  • fcDesigner 会给布局 rule 生成 ref_... 临时 id/name/title
  • 布局组件不是业务字段,但 form-create 转 Forge schema 时可能把临时 ref 当成布局标题或组件 id 保存。
  • Forge schema 回写到 fcDesigner 时,非字段布局组件继续写入 name=component.id,导致画布上再次显示临时 ref。

执行状态: completed

  • FormDesignerSchema 增加 ref_... 临时引用识别,布局标题归一化时会剥离临时 ref,旧 schema 中保存的临时布局 id 也会被替换为稳定 cmp_<componentKey>_<index>
  • formCreateToForge 转换布局组件时跳过临时 ref_... 作为标题/id,字段编码生成也不再把 ref_... 当作有效字段名。
  • forgeToFormCreate 回写布局 rule 时不再给非字段组件写 name,避免 fcDesigner 把布局 id 当作展示前缀。
  • 验证通过:目标文件 ESLint、git diff --checkNODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build