diff --git a/vehicle-data-platform/apps/web/src/pages/Dashboard.tsx b/vehicle-data-platform/apps/web/src/pages/Dashboard.tsx index f451074b..bce693ec 100644 --- a/vehicle-data-platform/apps/web/src/pages/Dashboard.tsx +++ b/vehicle-data-platform/apps/web/src/pages/Dashboard.tsx @@ -2399,6 +2399,48 @@ export function Dashboard({ onClick: openTimeMonitorAlerts } ]; + const customerVehicleServiceHubItems = [ + { + label: '实时地图', + value: `${formatCount(serviceSummary?.onlineVehicles ?? summary?.onlineVehicles)} 在线`, + detail: '先确认车辆在哪里、是否在线、坐标是否可信。', + action: '看车在哪', + color: 'green' as const, + onClick: () => onOpenMap({ online: 'online' }) + }, + { + label: '轨迹回放', + value: `${formatCount(summary?.activeToday)} 活跃`, + detail: '按车辆和时间窗回放路线、停驶、速度和里程断点。', + action: '回放路线', + color: 'blue' as const, + onClick: openTimeMonitorHistory + }, + { + label: '里程统计', + value: dayRangeText(timeMonitorScopeValue.dateFrom, timeMonitorScopeValue.dateTo), + detail: '核对区间里程、每日里程和客户 BI 统计口径。', + action: '核对里程', + color: 'blue' as const, + onClick: openTimeMonitorMileage + }, + { + label: '数据导出', + value: `${formatCount(summary?.frameToday)} 今日数据`, + detail: '导出位置、原始记录、解析字段和告警说明。', + action: '交付证据', + color: 'blue' as const, + onClick: openTimeMonitorRaw + }, + { + label: '告警通知', + value: `${formatCount(summary?.issueVehicles)} 告警`, + detail: highPriorityIssue ? `${qualityIssueLabel(highPriorityIssue.issueType)} / ${priorityIssueVehicleLabel(highPriorityIssue)}` : '没有高优先级异常时可直接说明无异常。', + action: '闭环通知', + color: (summary?.issueVehicles ?? 0) > 0 ? 'orange' as const : 'green' as const, + onClick: () => onOpenQuality(highPriorityIssue?.issueType ? { issueType: highPriorityIssue.issueType } : {}) + } + ]; const operationsEvidenceItems = [ { label: '链路健康', @@ -2533,6 +2575,37 @@ export function Dashboard({ +
+
+ + 客户车辆服务中枢 + {amapConfigured ? '地图可用' : '坐标预览'} + 0 ? 'orange' : 'green'}>{formatCount(summary?.issueVehicles)} 告警 + + + 客户只关心车怎么服务:在哪里、是否在线、这段时间怎么跑、里程是否可信、异常是否已通知、数据能否交付。 + + + 运维接入、队列、存储、协议解析降级为证据层,默认不打断客户主流程。 + +
+
+ {customerVehicleServiceHubItems.map((item) => ( + + ))} +
+
{