App-center_关系与级联配置重构_1e744c2a.md 6.5 KB

App-center 关系与级联配置问题诊断及重构方案

诊断结论

1. 当前架构:两条割裂的配置链路

  • 对象级关系配置:在 BusinessRelationDesigner.vue 中维护 CHILD_LIST / DETAIL / REFERENCE / MANY_TO_MANY 四种关系,承载主子表内嵌编辑、子表选择器、详情页签等能力。
  • 字段级引用配置:在字段资产面板 BusinessFieldPropertyPanel.vue 和表单设计器属性面板 ForgePropertyPanel.vue 中维护 objectReference / recordSelector 两种组件。
  • 问题:同一个“关联到其它业务对象”的语义被拆成两个地方,用户不知道采购单上的“供应商”应该在表单字段里配,还是在对象关系里配。

2. objectReference 组件实际上无法使用(核心 bug)

  • 组件类型存在,但 BusinessFieldPropertyPanel.vueForgePropertyPanel.vue没有提供 UI 来输入 referenceObjectCodereferenceDisplayField
  • 运行时 AiFormItem.vueresolveOptionSource 只认 field.optionSource,不会根据 referenceObjectCode 自动生成下拉选项 API。
  • 结论:即使用户把字段组件选成“引用对象”,也选不到目标对象,运行时也不会加载选项,所以采购单选择供应商/仓库实现不了。

3. recordSelector 字段配置体验差

  • BusinessFieldPropertyPanel.vue 中使用纯文本输入框填写 objectCodevalueFieldlabelFielddisplayFields 等(lines 151-235)。
  • 没有对象选择器、字段选择器、映射可视化,用户需要手写编码。
  • 与关系面板的“子表选择器”数据结构不同但能力重复。

4. 主子表关系配置门槛高

  • BusinessRelationDesigner.vue 中源字段/目标字段标签会随关系类型变化(lines 80-99),但缺少向导。
  • 用户需要手动选择 sourceFieldCode(主表字段)和 targetFieldCode(子表外键字段),容易配反。
  • saveMode(replace / merge)语义未在界面充分说明,行级合并保存难以正确配置。

5. “级联”一词多处混用

  • 字段面板的 cascade 用于字典父子过滤 / 远程参数过滤(lines 246-285)。
  • 关系面板的 linkage 用于字段间联动规则(lines 362-500)。
  • 两者在界面上都容易被理解为“级联”,造成混淆。

推荐的用户配置模型

作为业务用户,期望的配置路径是:

  1. 字段级引用(供应商 / 仓库 / 物料选择):在表单设计器里直接配:

    • objectReference(下拉引用):选择目标对象、值字段、显示字段、过滤参数。
    • recordSelector(弹窗选择器):选择目标对象、展示列、搜索字段、字段映射。
    • 配置直接绑定在表单字段上,所见即所得。
  2. 对象级主子表(采购单 + 采购明细):在对象设计的关系与级联面板中配置:

    • 选择关系类型“包含明细”。
    • 向导式选择子对象及其外键字段。
    • 配置子表保存模式、子表选择器(从物料/报价明细中批量选入明细行)。
    • 这里保留为对象级配置,因为它影响页面布局、保存策略、详情页签。
  3. 联动过滤(按仓库过滤物料等)

    • 简单场景:在表单字段的“选项过滤”中配置远程参数过滤。
    • 复杂场景:在关系面板的“字段联动规则”中配置字段间联动。
    • 建议界面命名上把“级联”拆分为“选项过滤”和“字段联动规则”。

改造任务

Task 1: 修复 objectReference 运行时与配置 UI

  • 在表单设计器属性面板中增加 referenceObjectCodereferenceDisplayField 的可视化选择器(对象下拉 + 字段下拉)。
  • AiFormItem.vue 或运行时 schema 构建层,根据 referenceObjectCode + referenceDisplayField 自动生成 optionSource
  • 后端 BusinessObjectDesignerService.java 发布时同步生成选项源元数据,避免运行时二次推断。

Task 2: 重构 recordSelector 字段配置

  • BusinessFieldPropertyPanel.vue 中 recordSelector 的文本输入改为对象/字段选择器。
  • 统一字段级 recordSelector 与关系级子表选择器的数据结构,尽量复用 record-selector-utils.js
  • 支持从当前套件或全部已发布对象中选择候选对象。

Task 3: 优化主子表关系配置向导

  • BusinessRelationDesigner.vue 中新增“新增关系向导”。
  • 根据选择的关系类型自动推荐 sourceFieldCode / targetFieldCode
  • CHILD_LIST / DETAIL 增加外键字段说明和 saveMode 提示。
  • 保存时校验目标对象已发布、字段存在。

Task 4: 统一命名与交互

  • 关系面板中“级联规则”改名为“字段联动规则”。
  • 字段面板中“级联过滤”改名为“选项过滤”或保留“级联”但补充说明。
  • 发布检查 BusinessPublishChecklist.vue 增加引用字段配置完整性校验。

Task 5: 端到端验证

  • procurement-warehouse-acceptance.md 场景验证:
    • 采购单新增页选择供应商、仓库。
    • 采购明细子表通过子表选择器批量选择物料。
    • 保存时子表行级合并正确。
    • 详情页签正确展示采购明细。