Skip to content

[Bug] Revenue by Account 图表不显示数据——聚合字段和数据结构不匹配,数据提取不全 #835

@hotlong

Description

@hotlong

问题描述

CRM Demo Dashboard页面,"Revenue by Account" 图表未显示任何数据。

Revenue by Account 无数据截图

问题排查过程

1. Dashboard Widget 的定义

  • examples/crm/src/dashboards/crm.dashboard.ts
    • Revenue by Account widget 配置为:
      options: {
        xField: 'account',
        yField: 'total',
        data: {
          provider: 'object',
          object: 'opportunity',
          aggregate: { field: 'amount', function: 'sum', groupBy: 'account' }
        }
      }
  • 这里聚合字段 field: 'amount', 但 yField 被写成 total

2. DashboardRenderer 生成 object-chart 的逻辑

packages/plugin-dashboard/src/DashboardRenderer.tsx:

  • 生成 series: [{ dataKey: yField }],即 dataKey: 'total'
  • 但实际聚合后生成的字段是 amount,不是 total

3. ObjectChart 数据提取及聚合逻辑

packages/plugin-charts/src/ObjectChart.tsx:

  • 只判断了 results.records,没有同时兼容 results.dataresults.value(ObjectStack/ MSW mock 可能返回的格式)。导致数据无法拿到。
  • 其 client-side 聚合函数 aggregateRecords 输出: { [groupBy]: key, [field]: result },所以聚合结果是 { account: 'xxxx', amount: 123 }
  • 但 series 期待数据 key 为 total,导致即使拿到数据也不显示。

4. 跟踪 Console/Provider 发现 Dashboard/ReportView/ListView 等组件获取数据时都会用到同时兼容多种格式的结果提取。

归纳(需修复的点)

  1. 数据提取不全ObjectChart 组件的 fetch 结果只检查 records,没有兼容 data, value 字段。
  2. 配置字段不匹配:聚合输出字段名为 amount,但 dashboard 配置的 yField/series 却是 total,导致数据 key 不一致。
  3. (高优先级)DashboardRenderer 构造 object-chart widget 时,对 series 的默认构造和聚合字段应保证一致性。

建议修复方案

(1)修复 ObjectChart 的数据提取:

let data: any[] = [];
if (Array.isArray(results)) {
    data = results;
} else if (results && typeof results === 'object') {
    if (Array.isArray((results as any).records)) {
        data = (results as any).records;
    } else if (Array.isArray((results as any).data)) {
        data = (results as any).data;
    } else if (Array.isArray((results as any).value)) {
        data = (results as any).value;
    }
}

(2)保证聚合输出字段与 series dataKey 一致:

  • 选项 A:dashboard 的 yField 和 aggregate 的 field 保持一致(都用 amount 或 total,二选一)。
  • 选项 BaggregateRecords 支持输出定制 key(即允许 key 映射,比如 { amount } → { total }),或者 DashboardRenderer 自动适配。

(3)建议在所有数据组件中统一结果提取(见 ObjectMap 和 ObjectCalendar 的实践)。


相关文件

  • packages/plugin-charts/src/ObjectChart.tsx
  • packages/plugin-dashboard/src/DashboardRenderer.tsx
  • examples/crm/src/dashboards/crm.dashboard.ts

优先级和建议

  • 优先级:高。
  • 建议处理:修复完应补充单元测试,确保 provider: 'object' 类型 dashboard widget 都能正常渲染(建议参考 DashboardRenderer.widgetData.test.tsx 的相关用例)。
  • 开发完成后请运行所有 test,并同步 Roadmap 状态。

/cc @objectstack-ai/objectui-maintainers

Metadata

Metadata

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions