feat(platform): align customer mileage service wording
This commit is contained in:
@@ -85,7 +85,7 @@ function sourceFusionRow(source: VehicleSourceStatus, realtime: RealtimeLocation
|
||||
hasLocation ? '定位数据' : '',
|
||||
source.hasHistory ? '轨迹回放' : '',
|
||||
source.hasRaw ? '历史数据' : '',
|
||||
hasMileage ? '统计口径' : ''
|
||||
hasMileage ? '里程口径' : ''
|
||||
].filter(Boolean);
|
||||
return {
|
||||
source,
|
||||
@@ -462,10 +462,10 @@ export function VehicleDetail({
|
||||
`最新上报:${lastSeen}`,
|
||||
`轨迹证据:${overview?.historyCount ?? detail.history.total ?? 0} 条`,
|
||||
`历史数据:${overview?.rawCount ?? detail.raw.total ?? 0} 条`,
|
||||
`统计查询:${overview?.mileageCount ?? detail.mileage.total ?? 0} 条`,
|
||||
`里程统计:${overview?.mileageCount ?? detail.mileage.total ?? 0} 条`,
|
||||
`告警事件:${qualityCount.toLocaleString()} 项`,
|
||||
`轨迹回放:${vehicleServiceURL(buildAppHash({ page: 'history', keyword: filters.keyword, protocol: filters.protocol, filters }))}`,
|
||||
`统计查询:${vehicleServiceURL(buildAppHash({ page: 'mileage', keyword: filters.keyword, protocol: filters.protocol, filters }))}`,
|
||||
`里程统计:${vehicleServiceURL(buildAppHash({ page: 'mileage', keyword: filters.keyword, protocol: filters.protocol, filters }))}`,
|
||||
`历史导出:${vehicleServiceURL(buildAppHash({ page: 'history-query', keyword: rawFilters.keyword, protocol: rawFilters.protocol, filters: rawFilters }))}`,
|
||||
`告警通知:${vehicleServiceURL(buildAppHash({ page: 'alert-events', keyword: filters.keyword, protocol: filters.protocol, filters }))}`
|
||||
];
|
||||
@@ -500,7 +500,7 @@ export function VehicleDetail({
|
||||
`实时:${vehicleServiceURL(vehicleServiceHash('realtime'))}`,
|
||||
`轨迹:${vehicleServiceURL(vehicleServiceHash('history'))}`,
|
||||
`历史数据:${vehicleServiceURL(vehicleServiceHash('history-query', { tab: 'raw', includeFields: 'true' }))}`,
|
||||
`统计查询:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
`里程统计:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
];
|
||||
copyText(lines.join('\n'), '诊断摘要');
|
||||
};
|
||||
@@ -532,7 +532,7 @@ export function VehicleDetail({
|
||||
`实时监控:${vehicleServiceURL(vehicleServiceHash('realtime'))}`,
|
||||
`轨迹回放:${vehicleServiceURL(vehicleServiceHash('history'))}`,
|
||||
`历史数据:${vehicleServiceURL(vehicleServiceHash('history-query', { tab: 'raw', includeFields: 'true' }))}`,
|
||||
`统计查询:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
`里程统计:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
];
|
||||
copyText(lines.join('\n'), '数据通道归并矩阵');
|
||||
};
|
||||
@@ -681,7 +681,7 @@ export function VehicleDetail({
|
||||
`实时监控:${vehicleServiceURL(vehicleServiceHash('realtime'))}`,
|
||||
`轨迹回放:${vehicleServiceURL(vehicleServiceHash('history'))}`,
|
||||
`历史数据:${vehicleServiceURL(vehicleServiceHash('history-query', { tab: 'raw', includeFields: 'true' }))}`,
|
||||
`统计查询:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
`里程统计:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
];
|
||||
copyText(lines.join('\n'), '统一车辆服务摘要');
|
||||
};
|
||||
@@ -708,7 +708,7 @@ export function VehicleDetail({
|
||||
`实时监控:${vehicleServiceURL(vehicleServiceHash('realtime'))}`,
|
||||
`轨迹回放:${vehicleServiceURL(vehicleServiceHash('history'))}`,
|
||||
`历史数据:${vehicleServiceURL(vehicleServiceHash('history-query', { tab: 'raw', includeFields: 'true' }))}`,
|
||||
`统计查询:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
`里程统计:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
];
|
||||
copyText(lines.join('\n'), '车辆服务档案');
|
||||
};
|
||||
@@ -736,7 +736,7 @@ export function VehicleDetail({
|
||||
`实时监控:${vehicleServiceURL(vehicleServiceHash('realtime'))}`,
|
||||
`轨迹回放:${vehicleServiceURL(vehicleServiceHash('history'))}`,
|
||||
`历史数据:${vehicleServiceURL(vehicleServiceHash('history-query', { tab: 'raw', includeFields: 'true' }))}`,
|
||||
`统计查询:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
`里程统计:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
];
|
||||
copyText(lines.join('\n'), '车辆服务摘要');
|
||||
};
|
||||
@@ -786,11 +786,11 @@ export function VehicleDetail({
|
||||
]
|
||||
},
|
||||
{
|
||||
title: '统计复核',
|
||||
title: '里程复核',
|
||||
value: `${formatCompactNumber(overview?.mileageCount ?? detail?.mileage?.total ?? 0)} 条统计`,
|
||||
meta: formatCompactNumber(evidenceMileageDelta, ' km 差异'),
|
||||
color: isFiniteNumber(evidenceMileageDelta) && Math.abs(evidenceMileageDelta) > 1 ? 'orange' as const : 'green' as const,
|
||||
detail: '核对统计口径,确认区间总值、每日里程与数据通道是否闭合。',
|
||||
detail: '核对里程口径,确认区间总值、每日里程与数据通道是否闭合。',
|
||||
disabled: !hasResolvedVIN,
|
||||
actions: [
|
||||
{ label: '查看统计', onClick: () => onOpenMileage(resolvedVIN, activeProtocol) }
|
||||
@@ -819,8 +819,8 @@ export function VehicleDetail({
|
||||
{
|
||||
title: '核对里程',
|
||||
value: `${formatCompactNumber(overview?.mileageCount ?? detail?.mileage?.total ?? 0)} 条`,
|
||||
detail: '进入统计查询,核对区间里程、日里程和统计闭合。',
|
||||
action: '统计查询',
|
||||
detail: '进入里程统计,核对区间里程、日里程和统计闭合。',
|
||||
action: '里程统计',
|
||||
color: (overview?.mileageCount ?? detail?.mileage?.total ?? 0) > 0 ? 'green' as const : 'grey' as const,
|
||||
disabled: !hasResolvedVIN,
|
||||
onClick: () => onOpenMileage(resolvedVIN, activeProtocol)
|
||||
@@ -878,10 +878,10 @@ export function VehicleDetail({
|
||||
onClick: () => onOpenQuality?.(qualityFiltersForCurrentVehicle())
|
||||
},
|
||||
{
|
||||
title: '复核统计口径',
|
||||
title: '复核里程口径',
|
||||
evidence: `${formatCompactNumber(overview?.mileageCount ?? detail?.mileage?.total ?? 0)} 条统计,证据里程差 ${formatCompactNumber(evidenceMileageDelta, ' km')}`,
|
||||
acceptance: '区间里程、每日里程和轨迹总里程可以互相解释。',
|
||||
action: '统计查询',
|
||||
action: '里程统计',
|
||||
disabled: !hasResolvedVIN,
|
||||
onClick: () => onOpenMileage(resolvedVIN, activeProtocol)
|
||||
}
|
||||
@@ -907,7 +907,7 @@ export function VehicleDetail({
|
||||
`轨迹回放:${vehicleServiceURL(vehicleServiceHash('history'))}`,
|
||||
`历史数据:${vehicleServiceURL(vehicleServiceHash('history-query', { tab: 'raw', includeFields: 'true' }))}`,
|
||||
`告警事件:${vehicleServiceURL(buildAppHash({ page: 'alert-events', keyword: resolvedVIN, protocol: activeProtocol }))}`,
|
||||
`统计查询:${vehicleServiceURL(vehicleServiceHash('mileage'))}`,
|
||||
`里程统计:${vehicleServiceURL(vehicleServiceHash('mileage'))}`,
|
||||
`车辆服务:${vehicleServiceURL(vehicleServiceHash('detail'))}`
|
||||
];
|
||||
copyText(lines.join('\n'), '单车处理清单');
|
||||
@@ -947,11 +947,11 @@ export function VehicleDetail({
|
||||
onSecondary: () => exportVehicleReport()
|
||||
},
|
||||
{
|
||||
title: '复核统计查询',
|
||||
title: '复核里程统计',
|
||||
value: `${formatCompactNumber(overview?.mileageCount ?? detail?.mileage?.total ?? 0)} 条统计`,
|
||||
detail: `证据里程差 ${formatCompactNumber(evidenceMileageDelta, ' km')},确认区间和日统计能闭合。`,
|
||||
color: isFiniteNumber(evidenceMileageDelta) && Math.abs(evidenceMileageDelta) > 1 ? 'orange' as const : 'green' as const,
|
||||
primaryAction: '统计查询',
|
||||
primaryAction: '里程统计',
|
||||
secondaryAction: '诊断摘要',
|
||||
disabled: !hasResolvedVIN,
|
||||
onPrimary: () => onOpenMileage(resolvedVIN, activeProtocol),
|
||||
@@ -1007,11 +1007,11 @@ export function VehicleDetail({
|
||||
onClick: () => onOpenQuality?.(qualityFiltersForCurrentVehicle())
|
||||
},
|
||||
{
|
||||
title: '统计查询',
|
||||
title: '里程统计',
|
||||
value: `${formatCompactNumber(overview?.mileageCount ?? detail?.mileage?.total ?? 0)} 条`,
|
||||
detail: `里程差 ${formatCompactNumber(evidenceMileageDelta, ' km')}`,
|
||||
color: isFiniteNumber(evidenceMileageDelta) && Math.abs(evidenceMileageDelta) > 1 ? 'orange' as const : 'green' as const,
|
||||
action: '统计复核',
|
||||
action: '里程复核',
|
||||
disabled: !hasResolvedVIN,
|
||||
onClick: () => onOpenMileage(resolvedVIN, activeProtocol)
|
||||
}
|
||||
@@ -1039,7 +1039,7 @@ export function VehicleDetail({
|
||||
title: '里程与能源',
|
||||
value: `${formatCompactNumber(latest?.totalMileageKm, ' km')}`,
|
||||
detail: `SOC ${formatCompactNumber(latest?.socPercent, '%')} / 速度 ${formatCompactNumber(latest?.speedKmh, ' km/h')}`,
|
||||
action: '统计查询',
|
||||
action: '里程统计',
|
||||
color: isFiniteNumber(latest?.totalMileageKm) ? 'green' as const : 'orange' as const,
|
||||
disabled: !hasResolvedVIN,
|
||||
onClick: () => onOpenMileage(resolvedVIN, activeProtocol)
|
||||
@@ -1101,10 +1101,10 @@ export function VehicleDetail({
|
||||
onClick: () => onOpenQuality?.(qualityFiltersForCurrentVehicle())
|
||||
},
|
||||
{
|
||||
title: '统计口径',
|
||||
title: '里程口径',
|
||||
value: `${formatCompactNumber(overview?.mileageCount ?? detail?.mileage?.total ?? 0)} 条`,
|
||||
detail: `证据里程差 ${formatCompactNumber(evidenceMileageDelta, ' km')}`,
|
||||
action: '统计查询',
|
||||
action: '里程统计',
|
||||
color: isFiniteNumber(evidenceMileageDelta) && Math.abs(evidenceMileageDelta) > 1 ? 'orange' as const : 'green' as const,
|
||||
disabled: !hasResolvedVIN,
|
||||
onClick: () => onOpenMileage(resolvedVIN, activeProtocol)
|
||||
@@ -1138,7 +1138,7 @@ export function VehicleDetail({
|
||||
{
|
||||
question: '这辆车跑了多少?',
|
||||
answer: `${formatCompactNumber(latest?.totalMileageKm, ' km')} / ${formatCompactNumber(overview?.mileageCount ?? detail?.mileage?.total ?? 0)} 条统计`,
|
||||
action: '统计查询',
|
||||
action: '里程统计',
|
||||
color: isFiniteNumber(latest?.totalMileageKm) ? 'green' as const : 'orange' as const,
|
||||
disabled: !hasResolvedVIN,
|
||||
onClick: () => onOpenMileage(resolvedVIN, activeProtocol)
|
||||
@@ -1170,21 +1170,21 @@ export function VehicleDetail({
|
||||
'【单车客户服务交付包】',
|
||||
`车辆:${vehicleName}`,
|
||||
`当前范围:${scopeText}`,
|
||||
`平台能力:实时监控 / 轨迹回放 / 历史数据查询 / 告警通知 / 统计查询`,
|
||||
`平台能力:实时监控 / 轨迹回放 / 历史数据查询 / 告警通知 / 里程统计`,
|
||||
`服务状态:${customerStatusTitle(serviceStatus?.title) || serviceConclusion.status}`,
|
||||
`服务说明:${serviceStatus?.detail ?? serviceConclusion.risk}`,
|
||||
`在线数据通道:${evidenceSourceCount > 0 ? `${evidenceOnlineSourceCount}/${evidenceSourceCount}` : '-'}`,
|
||||
`最新上报:${lastSeen}`,
|
||||
`轨迹证据:${overview?.historyCount ?? detail.history.total ?? 0} 条`,
|
||||
`历史数据:${overview?.rawCount ?? detail.raw.total ?? 0} 条`,
|
||||
`统计查询:${overview?.mileageCount ?? detail.mileage.total ?? 0} 条,证据差异 ${formatCompactNumber(evidenceMileageDelta, ' km')}`,
|
||||
`里程统计:${overview?.mileageCount ?? detail.mileage.total ?? 0} 条,证据差异 ${formatCompactNumber(evidenceMileageDelta, ' km')}`,
|
||||
`告警事件:${qualityCount.toLocaleString()} 项`,
|
||||
`车辆服务:${vehicleServiceURL(vehicleServiceHash('detail'))}`,
|
||||
`实时监控:${vehicleServiceURL(vehicleServiceHash('realtime'))}`,
|
||||
`轨迹回放:${vehicleServiceURL(vehicleServiceHash('history'))}`,
|
||||
`历史数据查询:${vehicleServiceURL(vehicleServiceHash('history-query', { tab: 'raw', includeFields: 'true' }))}`,
|
||||
`告警通知:${vehicleServiceURL(buildAppHash({ page: 'alert-events', keyword: resolvedVIN, protocol: activeProtocol }))}`,
|
||||
`统计查询:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
`里程统计:${vehicleServiceURL(vehicleServiceHash('mileage'))}`
|
||||
];
|
||||
copyText(lines.join('\n'), '客户服务交付包');
|
||||
};
|
||||
@@ -1243,7 +1243,7 @@ export function VehicleDetail({
|
||||
|
||||
return (
|
||||
<div className="vp-page">
|
||||
<PageHeader title="车辆服务" description="以车辆为主对象查看实时位置、轨迹回放、统计查询、告警通知和历史数据" />
|
||||
<PageHeader title="车辆服务" description="以车辆为主对象查看实时位置、轨迹回放、里程统计、告警通知和历史数据" />
|
||||
<Card bordered>
|
||||
<Form key={formKey} initValues={query} layout="horizontal" onSubmit={(values) => {
|
||||
const nextQuery = { keyword: String(values.keyword ?? ''), protocol: String(values.protocol ?? '') };
|
||||
@@ -1267,7 +1267,7 @@ export function VehicleDetail({
|
||||
<Button disabled={!hasResolvedVIN} onClick={() => onOpenRealtime(resolvedVIN, activeProtocol)}>查看实时</Button>
|
||||
<Button disabled={!hasResolvedVIN} onClick={() => onOpenHistory(resolvedVIN, activeProtocol)}>轨迹回放</Button>
|
||||
<Button disabled={!hasResolvedVIN} onClick={() => onOpenRaw(resolvedVIN, activeProtocol)}>历史数据</Button>
|
||||
<Button disabled={!hasResolvedVIN} onClick={() => onOpenMileage(resolvedVIN, activeProtocol)}>统计查询</Button>
|
||||
<Button disabled={!hasResolvedVIN} onClick={() => onOpenMileage(resolvedVIN, activeProtocol)}>里程统计</Button>
|
||||
</Space>
|
||||
</Form>
|
||||
</Card>
|
||||
@@ -1302,7 +1302,7 @@ export function VehicleDetail({
|
||||
{[archivePlate, displayVIN].filter((item) => item && item !== '-').join(' / ') || displayLookupKey}
|
||||
</Typography.Title>
|
||||
<Typography.Text type="secondary">
|
||||
客户打开一辆车时,先看当前位置、最后上报、速度、SOC、总里程和告警,再进入轨迹回放、统计查询、数据导出和告警闭环。
|
||||
客户打开一辆车时,先看当前位置、最后上报、速度、SOC、总里程和告警,再进入轨迹回放、里程统计、数据导出和告警闭环。
|
||||
</Typography.Text>
|
||||
<div className="vp-single-vehicle-action-bar" aria-label="客户单车操作台">
|
||||
<div className="vp-single-vehicle-action-head">
|
||||
@@ -1413,7 +1413,7 @@ export function VehicleDetail({
|
||||
<div className="vp-single-vehicle-time-window-actions">
|
||||
{[
|
||||
{ title: '轨迹回放', value: vehicleTimeWindowText, detail: '按同一时间窗回放位置、速度和里程断点。', action: '轨迹回放', color: 'blue' as const, onClick: openVehicleWindowHistory },
|
||||
{ title: '里程统计', value: vehicleTimeWindowText, detail: '核对区间里程、日统计和总里程差值。', action: '统计查询', color: 'green' as const, onClick: openVehicleWindowMileage },
|
||||
{ title: '里程统计', value: vehicleTimeWindowText, detail: '核对区间里程、日统计和总里程差值。', action: '里程统计', color: 'green' as const, onClick: openVehicleWindowMileage },
|
||||
{ title: '历史数据导出', value: vehicleTimeWindowText, detail: '导出 RAW 与解析字段证据,缩小复盘范围。', action: '历史导出', color: 'blue' as const, onClick: openVehicleWindowRaw },
|
||||
{ title: '告警通知', value: vehicleTimeWindowText, detail: '查看这辆车在同一范围内的风险事件。', action: '告警通知', color: qualityCount > 0 ? 'orange' as const : 'green' as const, onClick: openVehicleWindowAlerts }
|
||||
].map((item) => (
|
||||
@@ -1510,7 +1510,7 @@ export function VehicleDetail({
|
||||
<Button size="small" theme="solid" type="primary" disabled={!hasResolvedVIN} onClick={() => onOpenRealtime(resolvedVIN, activeProtocol)}>实时监控</Button>
|
||||
<Button size="small" theme="light" disabled={!hasResolvedVIN} onClick={() => onOpenHistory(resolvedVIN, activeProtocol)}>轨迹回放</Button>
|
||||
<Button size="small" theme="light" disabled={!hasResolvedVIN} onClick={() => onOpenRaw(resolvedVIN, activeProtocol)}>历史数据</Button>
|
||||
<Button size="small" theme="light" disabled={!hasResolvedVIN} onClick={() => onOpenMileage(resolvedVIN, activeProtocol)}>统计查询</Button>
|
||||
<Button size="small" theme="light" disabled={!hasResolvedVIN} onClick={() => onOpenMileage(resolvedVIN, activeProtocol)}>里程统计</Button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="vp-unified-service-grid">
|
||||
@@ -1591,14 +1591,14 @@ export function VehicleDetail({
|
||||
{[archivePlate, displayVIN].filter((item) => item && item !== '-').join(' / ') || displayLookupKey}
|
||||
</Typography.Title>
|
||||
<Typography.Text type="secondary">
|
||||
面向客户交付时,以车辆为主对象提供实时监控、轨迹回放、历史数据查询、告警通知和统计查询,协议来源只作为可追溯证据。
|
||||
面向客户交付时,以车辆为主对象提供实时监控、轨迹回放、历史数据查询、告警通知和里程统计,协议来源只作为可追溯证据。
|
||||
</Typography.Text>
|
||||
<div className="vp-customer-service-links">
|
||||
<Button size="small" theme="solid" type="primary" disabled={!hasResolvedVIN} onClick={() => onOpenRealtime(resolvedVIN, activeProtocol)}>实时监控</Button>
|
||||
<Button size="small" theme="light" disabled={!hasResolvedVIN} onClick={() => onOpenHistory(resolvedVIN, activeProtocol)}>轨迹回放</Button>
|
||||
<Button size="small" theme="light" disabled={!hasResolvedVIN} onClick={() => onOpenRaw(resolvedVIN, activeProtocol)}>历史数据查询</Button>
|
||||
<Button size="small" theme="light" disabled={!onOpenQuality || (!hasResolvedVIN && qualityCount <= 0)} onClick={() => onOpenQuality?.(qualityFiltersForCurrentVehicle())}>告警通知</Button>
|
||||
<Button size="small" theme="light" disabled={!hasResolvedVIN} onClick={() => onOpenMileage(resolvedVIN, activeProtocol)}>统计查询</Button>
|
||||
<Button size="small" theme="light" disabled={!hasResolvedVIN} onClick={() => onOpenMileage(resolvedVIN, activeProtocol)}>里程统计</Button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="vp-customer-service-grid">
|
||||
|
||||
Reference in New Issue
Block a user