diff --git a/vehicle-data-platform/apps/web/src/pages/History.tsx b/vehicle-data-platform/apps/web/src/pages/History.tsx
index 444e8bc7..be2e0cae 100644
--- a/vehicle-data-platform/apps/web/src/pages/History.tsx
+++ b/vehicle-data-platform/apps/web/src/pages/History.tsx
@@ -442,7 +442,7 @@ function scheduledHistoryReportPlanText({
`车辆范围:${vehicle || '全部车辆'}`,
`数据通道:${protocol || '全部数据通道'}`,
`时间范围:${filters.dateFrom?.trim() || '-'} 至 ${filters.dateTo?.trim() || '-'}`,
- '推荐频率:日报用于运营复盘,周报用于客户对账,临时导出用于问题解释。',
+ '推荐频率:日报用于客户复盘,周报用于客户对账,临时导出用于问题解释。',
'交付内容:轨迹报告 / 位置历史 CSV / 明细证据 CSV / 字段裁剪 CSV / 统计查询链接 / 质量提示。',
`当前数据量:位置 ${locationCount.toLocaleString()} 条,有效定位 ${validPointCount.toLocaleString()},明细证据 ${rawCount.toLocaleString()} 帧,字段裁剪 ${fieldCount.toLocaleString()} 个。`,
`质量提示:断点 ${anomalySummary.gapCount.toLocaleString()} / 里程回退 ${anomalySummary.mileageRollbackCount.toLocaleString()} / 超速 ${anomalySummary.overspeedCount.toLocaleString()}`,
@@ -486,7 +486,7 @@ function savedHistoryReportViewText({
'【保存报表视图】',
`视图范围:${vehicle || '全部车辆'} / ${protocol || '全部数据通道'} / ${filters.dateFrom?.trim() || '-'} 至 ${filters.dateTo?.trim() || '-'}`,
`字段模板:${fieldTemplate}`,
- '交付节奏:日报用于运营复盘,周报用于客户对账,临时导出用于问题解释。',
+ '交付节奏:日报用于客户复盘,周报用于客户对账,临时导出用于问题解释。',
`当前证据:位置 ${locationCount.toLocaleString()} 条,有效定位 ${validPointCount.toLocaleString()},明细 ${rawCount.toLocaleString()} 帧,字段 ${fieldCount.toLocaleString()} 个。`,
`质量提示:断点 ${anomalySummary.gapCount.toLocaleString()} / 里程回退 ${anomalySummary.mileageRollbackCount.toLocaleString()} / 超速 ${anomalySummary.overspeedCount.toLocaleString()}`,
`复用链接:${appURL(buildAppHash({ page: 'history-query', keyword: vehicle, protocol, filters: evidenceFilters }))}`
@@ -540,7 +540,7 @@ function trajectoryReviewPackageText({
? '建议核对明细证据、字段裁剪、当日统计查询,并确认平台是否存在断链或补发。'
: '当前页未发现明显断点、里程回退或速度异常,可作为轨迹复盘依据使用。';
return [
- '【轨迹复盘交接包】',
+ '【客户轨迹复盘包】',
`车辆:${vehicle || '全部车辆'}`,
`数据通道:${protocol || '全部数据通道'}`,
`查询范围:${filters.dateFrom?.trim() || '-'} 至 ${filters.dateTo?.trim() || '-'}`,
@@ -601,7 +601,7 @@ function trajectoryImpactPackageText({
const anomalyTotal = anomalySummary.gapCount + anomalySummary.mileageRollbackCount + anomalySummary.overspeedCount;
const operationState = anomalyTotal > 0 || (coverageRate ?? 100) < 80 ? '需要复核' : '可用于业务回放';
return [
- '【轨迹运营影响】',
+ '【客户轨迹影响】',
`车辆:${vehicle || '全部车辆'}`,
`数据通道:${protocol || '全部数据通道'}`,
`查询范围:${filters.dateFrom?.trim() || '-'} 至 ${filters.dateTo?.trim() || '-'}`,
@@ -1365,9 +1365,9 @@ export function History({
];
const customerReportCadenceItems = [
{
- title: '每日运营复盘',
+ title: '每日客户复盘',
value: `${locations.total.toLocaleString()} 位置`,
- detail: '每天交付位置历史、轨迹覆盖、里程统计和质量提示,便于运营早会复盘。',
+ detail: '每天交付位置历史、轨迹覆盖、里程统计和质量提示,便于客户日报复盘。',
action: '日报导出',
color: locations.total > 0 ? 'green' as const : 'orange' as const,
disabled: locations.items.length === 0,
@@ -1403,9 +1403,9 @@ export function History({
];
const customerExportTemplateLibraryItems = [
{
- title: '日报运营包',
- value: '运营早会',
- detail: '每天交付车辆位置覆盖、轨迹断点、字段证据和质量提示,适合早会复盘。',
+ title: '日报复盘包',
+ value: '客户日报',
+ detail: '每天交付车辆位置覆盖、轨迹断点、字段证据和质量提示,适合客户日报复盘。',
action: '导出日报',
color: locations.total > 0 ? 'green' as const : 'orange' as const,
disabled: locations.items.length === 0,
@@ -1442,7 +1442,7 @@ export function History({
const customerReportPurposeItems = [
{
title: '日报复盘',
- value: '运营早会',
+ value: '客户日报',
detail: '每天快速交付车辆位置、轨迹覆盖、区间里程和质量提示。',
action: '生成日报',
color: locations.total > 0 ? 'green' as const : 'orange' as const,
@@ -1499,7 +1499,7 @@ export function History({
{
title: '交付节奏',
value: '日报/周报',
- detail: '日报用于运营复盘,周报用于客户对账,临时导出用于问题解释。',
+ detail: '日报用于客户复盘,周报用于客户对账,临时导出用于问题解释。',
action: '复制计划',
color: 'blue' as const,
disabled: false,
@@ -1508,7 +1508,7 @@ export function History({
{
title: '快速分享',
value: '可复制',
- detail: '复制当前视图链接和字段模板,交给客户或内部运营复用。',
+ detail: '复制当前视图链接和字段模板,交给客户或内部服务团队复用。',
action: '复制链接',
color: 'blue' as const,
disabled: false,
@@ -1683,7 +1683,7 @@ export function History({
currentAddress: currentPlaybackAddress,
anomalySummary: trajectoryAnomalies
}),
- '轨迹复盘交接包'
+ '客户轨迹复盘包'
);
};
const copyTrajectoryImpactPackage = () => {
@@ -1702,7 +1702,7 @@ export function History({
anomalySummary: trajectoryAnomalies,
amapConfigured
}),
- '轨迹运营影响'
+ '客户轨迹影响'
);
};
const copyTrajectoryDecision = () => {
@@ -2735,7 +2735,7 @@ export function History({
参考 Fleetio、Samsara、Geotab 的报表能力,把导出从一次性下载升级为可复用的交付节奏。
- 日报用于运营复盘,周报用于客户对账,临时导出用于问题解释,字段模板用于稳定复用。
+ 日报用于客户复盘,周报用于客户对账,临时导出用于问题解释,字段模板用于稳定复用。
@@ -2765,7 +2765,7 @@ export function History({
{fieldEvidenceCount.toLocaleString()} 字段
- 把一次性 CSV 下载变成客户可复用的报表模板:日报看运营、周报做对账、临时解释处理质疑、字段模板保持口径稳定。
+ 把一次性 CSV 下载变成客户可复用的报表模板:日报看车辆、周报做对账、临时解释处理质疑、字段模板保持口径稳定。
每个模板都绑定同一辆车、同一时间窗和同一套证据口径,客户后续拿到的是稳定报表,而不是临时拼出来的查询结果。
@@ -3302,7 +3302,7 @@ export function History({
))}
-
+
@@ -3313,10 +3313,10 @@ export function History({
{currentVehicleKeyword || '全部车辆'}
- 轨迹、历史查询导出、明细证据和统计查询按同一车辆范围联动,用于调度复盘、客户问询和断链定位。
+ 轨迹、历史查询导出、明细证据和统计查询按同一车辆范围联动,用于客户复盘、客户问询和断链说明。
- } onClick={copyTrajectoryImpactPackage}>复制轨迹影响
+ } onClick={copyTrajectoryImpactPackage}>复制客户影响
diff --git a/vehicle-data-platform/apps/web/src/test/App.test.tsx b/vehicle-data-platform/apps/web/src/test/App.test.tsx
index cd9c3ec2..d6f91161 100644
--- a/vehicle-data-platform/apps/web/src/test/App.test.tsx
+++ b/vehicle-data-platform/apps/web/src/test/App.test.tsx
@@ -6887,9 +6887,9 @@ test('copies trajectory playback summary from history page', async () => {
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('统计查询:http://localhost:3000/#/mileage?keyword=VIN-HISTORY-SUMMARY&protocol=JT808&dateFrom=2026-07-03&dateTo=2026-07-04'));
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('车辆服务:http://localhost:3000/#/detail?keyword=VIN-HISTORY-SUMMARY&protocol=JT808'));
- fireEvent.click(screen.getByRole('button', { name: /复制轨迹影响/ }));
+ fireEvent.click(screen.getByRole('button', { name: /复制客户影响/ }));
- expect(writeText).toHaveBeenCalledWith(expect.stringContaining('【轨迹运营影响】'));
+ expect(writeText).toHaveBeenCalledWith(expect.stringContaining('【客户轨迹影响】'));
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('车辆:VIN-HISTORY-SUMMARY'));
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('数据通道:JT808'));
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('业务状态:需要复核'));
@@ -6903,7 +6903,7 @@ test('copies trajectory playback summary from history page', async () => {
fireEvent.click(screen.getByRole('button', { name: /复制轨迹复盘包/ }));
- expect(writeText).toHaveBeenCalledWith(expect.stringContaining('【轨迹复盘交接包】'));
+ expect(writeText).toHaveBeenCalledWith(expect.stringContaining('【客户轨迹复盘包】'));
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('车辆:VIN-HISTORY-SUMMARY'));
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('轨迹规模:位置 2 / 有效定位 2 / 明细证据 1 / 字段裁剪 2'));
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('轨迹质量:定位覆盖率 100% / 回放跨度 60 分钟 / 采样间隔 60 分钟/点'));
@@ -8272,17 +8272,17 @@ test('shows parsed field history as a flattened evidence table', async () => {
expect(screen.getByText('参考 Fleetio、Samsara、Geotab 的报表能力,把导出从一次性下载升级为可复用的交付节奏。')).toBeInTheDocument();
expect(screen.getByText('客户报表用途导航')).toBeInTheDocument();
expect(screen.getByText('先选择客户要解决的问题,再决定导出位置、字段、统计或说明。')).toBeInTheDocument();
- expect(screen.getByRole('button', { name: '客户报表用途导航 日报复盘 运营早会 生成日报' })).toBeInTheDocument();
+ expect(screen.getByRole('button', { name: '客户报表用途导航 日报复盘 客户日报 生成日报' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: '客户报表用途导航 周报对账 客户对账 生成周报' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: '客户报表用途导航 临时解释 质量说明 复制说明' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: '客户报表用途导航 字段模板 稳定字段 字段配置' })).toBeInTheDocument();
- expect(screen.getByRole('button', { name: '客户报表交付节奏 每日运营复盘 日报导出' })).toBeInTheDocument();
+ expect(screen.getByRole('button', { name: '客户报表交付节奏 每日客户复盘 日报导出' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: '客户报表交付节奏 每周客户对账 周报计划' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: '客户报表交付节奏 临时问题解释 复制说明' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: '客户报表交付节奏 字段模板复用 字段配置' })).toBeInTheDocument();
expect(screen.getByText('客户导出包模板库')).toBeInTheDocument();
- expect(screen.getByText('把一次性 CSV 下载变成客户可复用的报表模板:日报看运营、周报做对账、临时解释处理质疑、字段模板保持口径稳定。')).toBeInTheDocument();
- expect(screen.getByRole('button', { name: '客户导出包模板库 日报运营包 运营早会 导出日报' })).toBeInTheDocument();
+ expect(screen.getByText('把一次性 CSV 下载变成客户可复用的报表模板:日报看车辆、周报做对账、临时解释处理质疑、字段模板保持口径稳定。')).toBeInTheDocument();
+ expect(screen.getByRole('button', { name: '客户导出包模板库 日报复盘包 客户日报 导出日报' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: '客户导出包模板库 周报对账包 客户对账 复制周报计划' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: '客户导出包模板库 问题解释包 客户问询 复制说明' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: '客户导出包模板库 字段稳定包 数据对接 字段配置' })).toBeInTheDocument();
@@ -8315,7 +8315,7 @@ test('shows parsed field history as a flattened evidence table', async () => {
await waitFor(() => {
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('【历史数据周期交付计划】'));
});
- expect(writeText).toHaveBeenCalledWith(expect.stringContaining('推荐频率:日报用于运营复盘,周报用于客户对账,临时导出用于问题解释。'));
+ expect(writeText).toHaveBeenCalledWith(expect.stringContaining('推荐频率:日报用于客户复盘,周报用于客户对账,临时导出用于问题解释。'));
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('交付内容:轨迹报告 / 位置历史 CSV / 明细证据 CSV / 字段裁剪 CSV / 统计查询链接 / 质量提示。'));
fireEvent.click(screen.getByRole('button', { name: '保存报表视图 当前筛选 VIN-FIELDS-001 保存视图' }));
await waitFor(() => {
@@ -8488,7 +8488,7 @@ test('shows trajectory playback workspace from history locations', async () => {
expect(screen.getByText('位置导出')).toBeInTheDocument();
expect(screen.getAllByText('历史明细').length).toBeGreaterThan(0);
expect(screen.getAllByText('字段裁剪').length).toBeGreaterThanOrEqual(1);
- expect(screen.getByText('轨迹运营影响')).toBeInTheDocument();
+ expect(screen.getByText('客户轨迹影响')).toBeInTheDocument();
expect(screen.getByText('轨迹范围')).toBeInTheDocument();
expect(screen.getAllByText('定位覆盖').length).toBeGreaterThan(0);
expect(screen.getByText('异常影响')).toBeInTheDocument();