Skip to content

[17.0-rc2验收] 商机详情页「Products」侧栏直接显示行项目原始记录 ID —— crm_opportunity_line_item / crm_quote_line_item 未声明 nameField #733

Description

@yinlianghui

现象

商机详情页(opportunity_detail page)右侧 record:reference_rail 的 Products 卡片,列表项直接渲染行项目的原始记录 ID:

Products                    3   View All
0ir2KtfW9CrJeEhs
AlnwKKByYgjqJSB0
murd79YEmt8re75Q

对业务用户完全不可读。同卡片的 Quotes / Open Tasks 条目正常显示名称。

复现

  1. pnpm exec objectstack dev … --seed-admin,admin 登录 console
  2. 打开任意带行项目的商机,如 seeded「Initech Phase 1」:/_console/apps/app.objectstack.hotcrm/crm_opportunity/record/<id>
  3. 右侧 Products 卡片 → 三行全是 ID(截图见验收记录 20-crm_opportunity-detail.png)

API 对账:GET /api/v1/data/crm_opportunity_line_item?filters=[["crm_opportunity","=","<id>"]] 返回的行 display_title: null、无 name 字段 —— 行项目对象没有任何可显示名。

期望 vs 实际

  • 期望:侧栏列表显示可读的行项目标识(如产品名或 description)
  • 实际:原始记录 ID

落点分析

两层原因:

  1. HotCRM 元数据(主因):src/objects/opportunity_line_item.object.ts 与 quote_line_item.object.ts 都未声明 nameField(编译后 meta nameField: null),record:reference_rail(src/pages/opportunity_detail.page.ts:236 附近的 entries 配置)拿不到显示名只能回落到 id。Related 标签页里的 related_list(声明了 columns: ['crm_product', …])不受影响,渲染正常 —— 佐证问题出在"没有 nameField 的对象在无列配置的荟萃卡片里如何取显示名"。
  2. 平台侧(次要):console 的 reference_rail 在对象无 nameField 时直接回落原始 id,体验上可以有更好的兜底(如第一个 text 字段);此处不单独立平台单,修 HotCRM 侧 nameField 即可消除现象。

环境

hotcrm@0899b4f + @objectstack 17.0.0-rc.2

Activity

  1. added
    bugSomething isn't working
    metadataDeclarative metadata — schema, security posture, UI surfaces
    on Aug 5, 2026
  2. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    CollaboratorAuthor

    补一条渲染侧的测量(来自 #959 / PR #967 顺带核对参考栏 entries 时),对本条的修法选择有影响:参考栏的预览行不走 nameField。

    对本仓实际装的 @objectstack/console@17.0.0-rc.3 产物(node_modules/@objectstack/console/dist/assets/plugins-views-*.js)测量,rail 每行显示名的取值是一条写死的回退链:

    entry.displayField 命中 → row.name || row.title || row.subject || row.label || row.email || row.username || row.code || row.slug || row.provider_id || row.user_agent || row.ip_address || row.id || 破折号
    

    链上没有任何一步查对象声明的 nameField。crm_opportunity_line_item 的字段是 crm_opportunity / crm_product / description / quantity / list_price / unit_price / discount / total_price / line_number(src/objects/opportunity_line_item.object.ts:63-119),链上八个键一个都不占,于是落到 row.id —— 与本条观察到的现象一致。

    由此,只在对象上补 nameField 未必能让参考栏这一处变好:还得让查询把那个字段取回来、并且渲染侧愿意读它。两条更直接的路子是(a)在 src/pages/opportunity_detail.page.ts:241-246 那个 entry 上声明 displayField(rail 的 entry 支持这个键,但要注意指到 lookup 上拿到的可能仍是 id),或(b)upstream 让回退链认 nameField。其他消费方(关联列表、查找选择器、全局搜索)大概率仍按 nameField 走,本条声明 nameField 的价值不受影响 —— 这里只是说明参考栏这一处不会被它自动修好。

    未做浏览器验证:以上是对页面元数据与实际安装的 console 产物的静态测量。

    Refs #959 #972


    Generated by Claude Code

  3. added and removed on Sep 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingmetadataDeclarative metadata — schema, security posture, UI surfacespriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions