@@ -4095,7 +4095,7 @@ export function Dashboard({
-
+
@@ -4261,7 +4261,7 @@ export function Dashboard({
{[
{ title: '今天车辆轨迹', detail: '查看当天活跃车辆的轨迹、速度和里程断点。', action: '查今天', onClick: openTimeMonitorHistory },
{ title: '历史时间窗', detail: '按任意起止时间查询位置历史、原始记录和字段明细。', action: '自定义查询', onClick: openTimeMonitorRaw },
- { title: '统计查询', detail: '按车辆和时间范围核对区间里程、日统计和异常点。', action: '统计查询', onClick: openTimeMonitorMileage },
+ { title: '里程统计', detail: '按车辆和时间范围核对区间里程、日统计和异常点。', action: '里程统计', onClick: openTimeMonitorMileage },
{ title: '告警复盘', detail: '按车辆或事件回放告警发生前后的轨迹和数据证据。', action: '告警事件', onClick: openTimeMonitorAlerts }
].map((item) => (
diff --git a/vehicle-data-platform/apps/web/src/pages/History.tsx b/vehicle-data-platform/apps/web/src/pages/History.tsx
index b80c1e42..e1b07a8f 100644
--- a/vehicle-data-platform/apps/web/src/pages/History.tsx
+++ b/vehicle-data-platform/apps/web/src/pages/History.tsx
@@ -361,7 +361,7 @@ function historyEvidencePackageText({
`历史位置:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'location' } }))}`,
`明细证据:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'raw', includeFields: 'true' } }))}`,
`字段裁剪:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'fields', includeFields: 'true', ...(filters.fields?.trim() ? { fields: filters.fields.trim() } : {}) } }))}`,
- `统计查询:${appURL(buildAppHash({ page: 'mileage', keyword: vehicle, protocol, filters: evidenceFilters }))}`,
+ `里程统计:${appURL(buildAppHash({ page: 'mileage', keyword: vehicle, protocol, filters: evidenceFilters }))}`,
`车辆服务:${appURL(buildAppHash({ page: 'detail', keyword: vehicle, protocol }))}`
].join('\n');
}
@@ -398,7 +398,7 @@ function deliveryPackageText({
return [
'【客户查询导出包】',
`交付状态:${deliveryState}`,
- '交付物:轨迹报告 / 位置历史 / 统计查询 / 明细证据 / 字段裁剪 / 质量提示',
+ '交付物:轨迹报告 / 位置历史 / 里程统计 / 明细证据 / 字段裁剪 / 质量提示',
`车辆范围:${vehicle || '全部车辆'}`,
`数据通道:${protocol || '全部数据通道'}`,
`时间范围:${filters.dateFrom?.trim() || '-'} 至 ${filters.dateTo?.trim() || '-'}`,
@@ -411,7 +411,7 @@ function deliveryPackageText({
`明细证据:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'raw', includeFields: 'true' } }))}`,
`字段裁剪:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'fields', includeFields: 'true', ...(filters.fields?.trim() ? { fields: filters.fields.trim() } : {}) } }))}`,
`轨迹回放:${appURL(buildAppHash({ page: 'history', keyword: vehicle, protocol, filters: evidenceFilters }))}`,
- `统计查询:${appURL(buildAppHash({ page: 'mileage', keyword: vehicle, protocol, filters: evidenceFilters }))}`,
+ `里程统计:${appURL(buildAppHash({ page: 'mileage', keyword: vehicle, protocol, filters: evidenceFilters }))}`,
`车辆服务:${appURL(buildAppHash({ page: 'detail', keyword: vehicle, protocol }))}`
].join('\n');
}
@@ -420,7 +420,7 @@ function deliveryCoverRecommendation(fieldCount: number, validPointCount: number
if (fieldCount > 0 && validPointCount === 0) return '优先导出字段证据,并补查轨迹位置。';
if (validPointCount > 0) return '优先交付轨迹报告和位置历史,再附带字段证据。';
if (rawCount > 0) return '先交付明细证据,并补充客户需要的字段裁剪。';
- if (locationCount > 0) return '先交付位置历史,并补充统计查询说明。';
+ if (locationCount > 0) return '先交付位置历史,并补充里程统计说明。';
return '先锁定车辆和时间窗,再查询位置或明细证据。';
}
@@ -459,7 +459,7 @@ function deliveryCoverText({
'【客户数据交付封面包】',
`交付主题:${vehicle} / ${protocol} / ${rangeFrom} 至 ${rangeTo}`,
`交付结论:${deliveryState}`,
- '交付物:轨迹报告 / 位置历史 CSV / 明细证据 CSV / 字段裁剪 CSV / 统计查询链接 / 质量提示',
+ '交付物:轨迹报告 / 位置历史 CSV / 明细证据 CSV / 字段裁剪 CSV / 里程统计链接 / 质量提示',
`当前证据:位置 ${locationCount.toLocaleString()} 条 / 有效坐标 ${validPointCount.toLocaleString()} 点 / 明细 ${rawCount.toLocaleString()} 帧 / 字段 ${fieldCount.toLocaleString()} 个`,
`质量提示:断点 ${anomalySummary.gapCount.toLocaleString()} / 里程回退 ${anomalySummary.mileageRollbackCount.toLocaleString()} / 超速 ${anomalySummary.overspeedCount.toLocaleString()}`,
`建议动作:${deliveryCoverRecommendation(fieldCount, validPointCount, rawCount, locationCount)}`,
@@ -467,7 +467,7 @@ function deliveryCoverText({
`位置历史:${appURL(buildAppHash({ page: 'history-query', keyword, protocol: protocolFilter, filters: { ...evidenceFilters, tab: 'location' } }))}`,
`明细证据:${appURL(buildAppHash({ page: 'history-query', keyword, protocol: protocolFilter, filters: { ...evidenceFilters, tab: 'raw', includeFields: 'true' } }))}`,
`字段裁剪:${appURL(buildAppHash({ page: 'history-query', keyword, protocol: protocolFilter, filters: { ...evidenceFilters, tab: 'fields', includeFields: 'true', ...(filters.fields?.trim() ? { fields: filters.fields.trim() } : {}) } }))}`,
- `统计查询:${appURL(buildAppHash({ page: 'mileage', keyword, protocol: protocolFilter, filters: evidenceFilters }))}`
+ `里程统计:${appURL(buildAppHash({ page: 'mileage', keyword, protocol: protocolFilter, filters: evidenceFilters }))}`
].join('\n');
}
@@ -498,7 +498,7 @@ function scheduledHistoryReportPlanText({
`数据通道:${protocol || '全部数据通道'}`,
`时间范围:${filters.dateFrom?.trim() || '-'} 至 ${filters.dateTo?.trim() || '-'}`,
'推荐频率:日报用于客户复盘,周报用于客户对账,临时导出用于问题解释。',
- '交付内容:轨迹报告 / 位置历史 CSV / 明细证据 CSV / 字段裁剪 CSV / 统计查询链接 / 质量提示。',
+ '交付内容:轨迹报告 / 位置历史 CSV / 明细证据 CSV / 字段裁剪 CSV / 里程统计链接 / 质量提示。',
`当前数据量:位置 ${locationCount.toLocaleString()} 条,有效定位 ${validPointCount.toLocaleString()},明细证据 ${rawCount.toLocaleString()} 帧,字段裁剪 ${fieldCount.toLocaleString()} 个。`,
`质量提示:断点 ${anomalySummary.gapCount.toLocaleString()} / 里程回退 ${anomalySummary.mileageRollbackCount.toLocaleString()} / 超速 ${anomalySummary.overspeedCount.toLocaleString()}`,
'交付前检查:先锁定车辆和时间窗,再确认字段裁剪、分页覆盖和异常说明。',
@@ -506,7 +506,7 @@ function scheduledHistoryReportPlanText({
`位置历史:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'location' } }))}`,
`明细证据:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'raw', includeFields: 'true' } }))}`,
`字段裁剪:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'fields', includeFields: 'true', ...(filters.fields?.trim() ? { fields: filters.fields.trim() } : {}) } }))}`,
- `统计查询:${appURL(buildAppHash({ page: 'mileage', keyword: vehicle, protocol, filters: evidenceFilters }))}`
+ `里程统计:${appURL(buildAppHash({ page: 'mileage', keyword: vehicle, protocol, filters: evidenceFilters }))}`
].join('\n');
}
@@ -592,7 +592,7 @@ function trajectoryReviewPackageText({
...(filters.dateTo?.trim() ? { dateTo: filters.dateTo.trim() } : {})
};
const anomalyAction = anomalySummary.gapCount > 0 || anomalySummary.mileageRollbackCount > 0 || anomalySummary.overspeedCount > 0
- ? '建议核对明细证据、字段裁剪、当日统计查询,并确认平台是否存在断链或补发。'
+ ? '建议核对明细证据、字段裁剪、当日里程统计,并确认平台是否存在断链或补发。'
: '当前页未发现明显断点、里程回退或速度异常,可作为轨迹复盘依据使用。';
return [
'【客户轨迹复盘包】',
@@ -615,7 +615,7 @@ function trajectoryReviewPackageText({
`历史位置:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'location' } }))}`,
`明细证据:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'raw', includeFields: 'true' } }))}`,
`字段裁剪:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'fields', includeFields: 'true', ...(filters.fields?.trim() ? { fields: filters.fields.trim() } : {}) } }))}`,
- `统计查询:${appURL(buildAppHash({ page: 'mileage', keyword: vehicle, protocol, filters: evidenceFilters }))}`,
+ `里程统计:${appURL(buildAppHash({ page: 'mileage', keyword: vehicle, protocol, filters: evidenceFilters }))}`,
`车辆服务:${appURL(buildAppHash({ page: 'detail', keyword: vehicle, protocol }))}`
].join('\n');
}
@@ -737,12 +737,12 @@ function trajectoryCustomerDecisionText({
'1. 先看轨迹覆盖:确认是否有足够有效坐标。',
'2. 再看时间断点:断点会影响定位连续性和客户解释。',
'3. 再看里程速度:区间里程、速度和轨迹方向需要能互相解释。',
- '4. 最后回到依据:异常点必须打开明细证据、字段裁剪和统计查询复核。',
+ '4. 最后回到依据:异常点必须打开明细证据、字段裁剪和里程统计复核。',
`轨迹回放:${appURL(buildAppHash({ page: 'history', keyword: vehicle, protocol, filters: evidenceFilters }))}`,
`历史查询导出:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'location' } }))}`,
`明细证据:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'raw', includeFields: 'true' } }))}`,
`字段裁剪:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: { ...evidenceFilters, tab: 'fields', includeFields: 'true', ...(filters.fields?.trim() ? { fields: filters.fields.trim() } : {}) } }))}`,
- `统计查询:${appURL(buildAppHash({ page: 'mileage', keyword: vehicle, protocol, filters: evidenceFilters }))}`,
+ `里程统计:${appURL(buildAppHash({ page: 'mileage', keyword: vehicle, protocol, filters: evidenceFilters }))}`,
`车辆服务:${appURL(buildAppHash({ page: 'detail', keyword: vehicle, protocol }))}`
].join('\n');
}
@@ -1027,9 +1027,9 @@ export function History({
{
label: '里程速度',
value: formatNumber(mileageDelta, ' km'),
- detail: `最高速度 ${formatNumber(maxSpeed, ' km/h')},用于和统计查询互相解释。`,
+ detail: `最高速度 ${formatNumber(maxSpeed, ' km/h')},用于和里程统计互相解释。`,
color: isFiniteNumber(mileageDelta) ? 'blue' as const : 'grey' as const,
- action: '统计查询',
+ action: '里程统计',
disabled: !onOpenMileage,
onClick: () => onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) })
},
@@ -1063,11 +1063,11 @@ export function History({
onClick: () => openQueryTab('location')
},
{
- title: '统计查询',
+ title: '里程统计',
value: formatNumber(mileageDelta, ' km'),
- detail: '进入统计查询核对区间里程和日统计闭合。',
+ detail: '进入里程统计核对区间里程和日统计闭合。',
color: isFiniteNumber(mileageDelta) ? 'green' as const : 'grey' as const,
- action: '统计查询',
+ action: '里程统计',
disabled: !onOpenMileage,
onClick: () => onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) })
},
@@ -1112,8 +1112,8 @@ export function History({
{
title: '统计核对',
value: formatNumber(mileageDelta, ' km'),
- detail: '把同一时间窗带到统计查询,核对区间里程和日报闭合。',
- action: '统计查询',
+ detail: '把同一时间窗带到里程统计,核对区间里程和日报闭合。',
+ action: '里程统计',
color: isFiniteNumber(mileageDelta) ? 'green' as const : 'grey' as const,
disabled: !onOpenMileage,
onClick: () => onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) })
@@ -1271,7 +1271,7 @@ export function History({
title: '里程对账',
value: formatNumber(mileageDelta, ' km'),
detail: '跳到同一车辆和时间窗的里程统计,核对区间差值和日报闭合。',
- action: '统计查询',
+ action: '里程统计',
color: isFiniteNumber(mileageDelta) ? 'green' as const : 'grey' as const,
disabled: !onOpenMileage,
onClick: () => onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) })
@@ -1310,7 +1310,7 @@ export function History({
value: formatNumber(mileageDelta, ' km'),
detail: '带着车辆和时间窗进入统计页,核对区间里程。',
color: isFiniteNumber(mileageDelta) ? 'green' as const : 'grey' as const,
- action: '统计查询',
+ action: '里程统计',
disabled: !onOpenMileage,
onClick: () => onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) })
},
@@ -1469,7 +1469,7 @@ export function History({
{
title: '周报对账包',
value: '客户对账',
- detail: '按固定车辆范围沉淀周报计划,交付轨迹、统计查询链接和异常说明。',
+ detail: '按固定车辆范围沉淀周报计划,交付轨迹、里程统计链接和异常说明。',
action: '复制周报计划',
color: 'blue' as const,
disabled: false,
@@ -1584,7 +1584,7 @@ export function History({
question: '这段时间跑了多少公里?',
answer: formatNumber(mileageDelta, ' km'),
evidence: `最高速度 ${formatNumber(maxSpeed, ' km/h')}`,
- action: '统计查询',
+ action: '里程统计',
color: isFiniteNumber(mileageDelta) ? 'green' as const : 'grey' as const,
disabled: !onOpenMileage,
onClick: () => onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) })
@@ -1728,7 +1728,7 @@ export function History({
`明细证据:${appURL(buildAppHash({ page: 'history-query', keyword: currentVehicleKeyword, protocol: currentProtocol, filters: { ...evidenceFilters, tab: 'raw', includeFields: 'true' } }))}`,
`字段裁剪:${appURL(buildAppHash({ page: 'history-query', keyword: currentVehicleKeyword, protocol: currentProtocol, filters: fieldFilters }))}`,
`轨迹回放:${appURL(buildAppHash({ page: 'history', keyword: currentVehicleKeyword, protocol: currentProtocol, filters: evidenceFilters }))}`,
- `统计查询:${appURL(buildAppHash({ page: 'mileage', keyword: currentVehicleKeyword, protocol: currentProtocol, filters: evidenceFilters }))}`
+ `里程统计:${appURL(buildAppHash({ page: 'mileage', keyword: currentVehicleKeyword, protocol: currentProtocol, filters: evidenceFilters }))}`
];
copyText(lines.join('\n'), '客户导出向导包');
};
@@ -1994,7 +1994,7 @@ export function History({
title: '里程核对',
value: formatNumber(mileageDelta, ' km'),
detail: '把同一车辆和时间窗带到统计页,核对区间差值与日报闭合。',
- action: '统计查询',
+ action: '里程统计',
color: isFiniteNumber(mileageDelta) ? 'green' as const : 'grey' as const,
disabled: !onOpenMileage || !currentVehicleKeyword,
onClick: () => onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) })
@@ -2060,7 +2060,7 @@ export function History({
title: '核对里程',
value: formatNumber(mileageDelta, ' km'),
detail: '跳到同一车辆和时间窗的里程统计,检查区间差值。',
- action: '统计查询',
+ action: '里程统计',
color: isFiniteNumber(mileageDelta) ? 'green' as const : 'grey' as const,
disabled: !onOpenMileage || !currentVehicleKeyword,
onClick: () => onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) })
@@ -2308,7 +2308,7 @@ export function History({
},
{
label: '统计核对',
- action: '统计查询',
+ action: '里程统计',
detail: `区间里程 ${formatNumber(mileageDelta, ' km')}`,
color: isFiniteNumber(mileageDelta) ? 'blue' as const : 'grey' as const,
disabled: !onOpenMileage || !currentVehicleKeyword,
@@ -2827,7 +2827,7 @@ export function History({
先锁定车辆和时间窗,再选择交付物并导出
- 面向客户的数据导出以车辆服务为中心:同一个筛选范围可以交付轨迹报告、位置历史、明细证据、字段裁剪、CSV 文件和统计查询。
+ 面向客户的数据导出以车辆服务为中心:同一个筛选范围可以交付轨迹报告、位置历史、明细证据、字段裁剪、CSV 文件和里程统计。
openQueryTab('location')}>查询位置
@@ -3203,7 +3203,7 @@ export function History({
{[
{ title: '轨迹复盘', value: validLocations.length > 0 ? '可播放' : '待查询', detail: '回放路线、速度和里程断点。', action: '播放轨迹', color: validLocations.length > 0 ? 'green' as const : 'orange' as const, disabled: validLocations.length === 0, onClick: () => openQueryTab('location') },
{ title: '明细证据', value: `${(rawFrames.total ?? 0).toLocaleString()} 帧`, detail: '查看轨迹背后的接入证据。', action: '查看证据', color: (rawFrames.total ?? 0) > 0 ? 'blue' as const : 'grey' as const, disabled: false, onClick: () => openQueryTab('raw') },
- { title: '统计查询', value: formatNumber(mileageDelta, ' km'), detail: '进入同一时间窗的统计查询。', action: '统计复核', color: isFiniteNumber(mileageDelta) ? 'green' as const : 'grey' as const, disabled: !onOpenMileage, onClick: () => onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) }) },
+ { title: '里程统计', value: formatNumber(mileageDelta, ' km'), detail: '进入同一时间窗的里程统计。', action: '里程复核', color: isFiniteNumber(mileageDelta) ? 'green' as const : 'grey' as const, disabled: !onOpenMileage, onClick: () => onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) }) },
{ title: '客户导出', value: deliveryState, detail: '复制交付说明或导出 CSV 证据。', action: '复制交付', color: deliveryStateColor, disabled: false, onClick: copyDeliveryPackage }
].map((item) => (
@@ -3228,7 +3228,7 @@ export function History({
{deliveryState}
{amapConfigured ? '高德地图可用' : '坐标预览'}
-
先判断轨迹能否复盘,再进入证据、字段和统计查询
+
先判断轨迹能否复盘,再进入证据、字段和里程统计
客户问某辆车某段时间发生了什么时,先看定位覆盖、时间断点、里程速度和明细证据,避免把内部排查过程当成客户主流程。
@@ -3236,7 +3236,7 @@ export function History({
} onClick={copyTrajectoryDecision}>复制决策说明
openQueryTab('location')}>播放轨迹
openQueryTab('raw')}>明细证据
-
onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) })}>统计查询
+
onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) })}>里程统计
@@ -3347,7 +3347,7 @@ export function History({
车辆服务
onOpenMileage?.({ keyword: currentVehicleKeyword, protocol: currentProtocol, ...(filters.dateFrom ? { dateFrom: filters.dateFrom } : {}), ...(filters.dateTo ? { dateTo: filters.dateTo } : {}) })}>
- 统计查询
+ 里程统计
@@ -3562,12 +3562,12 @@ export function History({