问题描述
在CRM Demo Dashboard页面,"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.data 和 results.value(ObjectStack/ MSW mock 可能返回的格式)。导致数据无法拿到。
- 其 client-side 聚合函数
aggregateRecords 输出: { [groupBy]: key, [field]: result },所以聚合结果是 { account: 'xxxx', amount: 123 }。
- 但 series 期待数据 key 为
total,导致即使拿到数据也不显示。
4. 跟踪 Console/Provider 发现 Dashboard/ReportView/ListView 等组件获取数据时都会用到同时兼容多种格式的结果提取。
归纳(需修复的点)
- 数据提取不全:
ObjectChart 组件的 fetch 结果只检查 records,没有兼容 data, value 字段。
- 配置字段不匹配:聚合输出字段名为
amount,但 dashboard 配置的 yField/series 却是 total,导致数据 key 不一致。
- (高优先级)
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,二选一)。
- 选项 B:
aggregateRecords 支持输出定制 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
问题描述
在CRM Demo Dashboard页面,"Revenue by Account" 图表未显示任何数据。
问题排查过程
1. Dashboard Widget 的定义
examples/crm/src/dashboards/crm.dashboard.ts:Revenue by Accountwidget 配置为:field: 'amount', 但 yField 被写成total。2. DashboardRenderer 生成 object-chart 的逻辑
packages/plugin-dashboard/src/DashboardRenderer.tsx:
[{ dataKey: yField }],即dataKey: 'total'。amount,不是total。3.
ObjectChart数据提取及聚合逻辑packages/plugin-charts/src/ObjectChart.tsx:
results.records,没有同时兼容results.data和results.value(ObjectStack/ MSW mock 可能返回的格式)。导致数据无法拿到。aggregateRecords输出:{ [groupBy]: key, [field]: result },所以聚合结果是{ account: 'xxxx', amount: 123 }。total,导致即使拿到数据也不显示。4. 跟踪 Console/Provider 发现 Dashboard/ReportView/ListView 等组件获取数据时都会用到同时兼容多种格式的结果提取。
归纳(需修复的点)
ObjectChart组件的 fetch 结果只检查 records,没有兼容data,value字段。amount,但 dashboard 配置的 yField/series 却是total,导致数据 key 不一致。DashboardRenderer构造object-chartwidget 时,对 series 的默认构造和聚合字段应保证一致性。建议修复方案
(1)修复 ObjectChart 的数据提取:
(2)保证聚合输出字段与 series dataKey 一致:
yField和 aggregate 的field保持一致(都用 amount 或 total,二选一)。aggregateRecords支持输出定制 key(即允许 key 映射,比如{ amount } → { total }),或者DashboardRenderer自动适配。(3)建议在所有数据组件中统一结果提取(见 ObjectMap 和 ObjectCalendar 的实践)。
相关文件
packages/plugin-charts/src/ObjectChart.tsxpackages/plugin-dashboard/src/DashboardRenderer.tsxexamples/crm/src/dashboards/crm.dashboard.ts优先级和建议
provider: 'object'类型 dashboard widget 都能正常渲染(建议参考DashboardRenderer.widgetData.test.tsx的相关用例)。/cc @objectstack-ai/objectui-maintainers