2.5 KiB
2.5 KiB
S26 Dashboard 聚合 Runbook
范围
S26 在 API 中新增 Dashboard 聚合接口:
GET /api/v2/dashboard/summaryGET /api/v2/dashboard/trends?hours=24&bucketMinutes=60
两个接口均要求 dashboard.view 权限。S26 未连接服务器、未重启服务、未执行数据库迁移,也未修改 Redis/OpenSIPS 配置。
数据来源
当前实现基于已有 V2 Schema:
raw_cdrs:今日通话数、接通数、失败数、接通率、通话时长、失败响应码、趋势通话量。rated_cdrs+raw_cdrs.started_at:客户费用、供应商成本、毛利和趋势金额。customers、customer_gateways、vendor_gateways:启用实体数量。recordings+quality_reviews:待质检录音数。raw_cdrs.vendor_gateway_id:今日失败落地网关 Top 10。
实时在线通话和注册数在 S26 返回 0 且标记 source: "not_configured"。这部分应在后续接入 Redis/OpenSIPS 指标后替换,避免返回伪实时数据。
查询窗口
- Summary 的“今日”按
Asia/Shanghai自然日计算,数据库时间仍按 UTC ISO 语义传入。 - Trends 默认最近 24 小时,支持
hours=1..168。 bucketMinutes仅允许5、15、60。- 所有 CDR 查询都带
started_at时间窗口,避免首页扫描全量 CDR。
后续预聚合演进
设计文档要求 24 小时趋势最终使用 5 分钟或 1 小时预聚合。当前 S26 没有新增指标表,是为了避免把本任务扩大为数据库迁移和 worker 部署。
后续可新增 worker-metrics 或复用 CDR Worker 增量写入统计表,例如:
dashboard_call_buckets(bucket_start, bucket_minutes, total_calls, answered_calls, failed_calls, duration_sec, customer_fee, vendor_cost, gross_profit)
dashboard_failure_codes(bucket_start, bucket_minutes, sip_code, count)
dashboard_gateway_health(vendor_gateway_id, status, reason, updated_at)
切换时保持 API 响应结构不变,只替换 DashboardRepository 的数据来源。
验证
本地验收命令:
corepack pnpm@10.33.0 exec vitest run apps/api/src/modules/dashboard/dashboard.service.spec.ts
corepack pnpm@10.33.0 typecheck
corepack pnpm@10.33.0 lint
corepack pnpm@10.33.0 build
回滚
代码级回滚:
- 从
apps/api/src/modules/app.module.ts移除DashboardModule。 - 删除
apps/api/src/modules/dashboard/。 - 删除本 Runbook。
- 重新执行
corepack pnpm@10.33.0 build。
S26 未执行数据库迁移、服务器写操作或真实数据写入,因此没有远端数据回滚点。