feat(platform): focus vehicle service customer copy
This commit is contained in:
@@ -3896,7 +3896,7 @@ export function Dashboard({
|
||||
<Tag color="blue">车辆服务优先</Tag>
|
||||
</div>
|
||||
<Typography.Text type="secondary" className="vp-customer-problem-principle">
|
||||
客户首先关心的是车辆、位置、时间、里程、告警和导出;GB32960、JT808、MQTT 只放在证据层。
|
||||
客户首先关心的是车辆、位置、时间、里程、告警和导出;接入来源只放在证据层。
|
||||
</Typography.Text>
|
||||
<div className="vp-customer-problem-grid">
|
||||
{customerProblemDesk.map((item) => (
|
||||
|
||||
@@ -2541,7 +2541,7 @@ export function History({
|
||||
同一辆车和同一时间窗,串起实时轨迹、里程核对、历史导出、字段裁剪和告警复盘。
|
||||
</Typography.Title>
|
||||
<Typography.Text type="secondary">
|
||||
GB32960、JT808、MQTT 只是证据来源;客户页面只回答车辆在哪里、跑了多少、能否导出、异常谁处理。
|
||||
接入来源只是证据来源;客户页面只回答车辆在哪里、跑了多少、能否导出、异常谁处理。
|
||||
</Typography.Text>
|
||||
</div>
|
||||
<div className="vp-history-evidence-chain-grid">
|
||||
|
||||
@@ -2351,7 +2351,7 @@ export function Mileage({
|
||||
</Space>
|
||||
<Typography.Title heading={5} style={{ margin: 0 }}>从车辆服务视角安排下一步</Typography.Title>
|
||||
<Typography.Text type="secondary">
|
||||
里程页不再让客户先理解 GB32960、JT808、MQTT 的差异,而是直接给出交付、轨迹回放、历史查询、导出和在线影响的下一步动作。
|
||||
里程页不再让客户先理解不同接入协议的差异,而是直接给出交付、轨迹回放、历史查询、导出和在线影响的下一步动作。
|
||||
</Typography.Text>
|
||||
</div>
|
||||
<div className="vp-mileage-next-grid">
|
||||
@@ -2405,7 +2405,7 @@ export function Mileage({
|
||||
title: '通道一致性',
|
||||
value: sourceConsistencyText,
|
||||
color: summary.sourceCount > 1 ? 'green' as const : 'orange' as const,
|
||||
detail: 'GB32960、JT808、Yutong MQTT 只作为同一车辆服务的数据通道。'
|
||||
detail: '不同接入来源只作为同一车辆服务的数据通道,用来支撑统计可信度。'
|
||||
}
|
||||
].map((item) => (
|
||||
<div key={item.title} className="vp-monitor-metric">
|
||||
|
||||
@@ -42,7 +42,7 @@ const alertRuleTemplates = [
|
||||
issueType: 'NO_SOURCE',
|
||||
level: 'P0',
|
||||
owner: '平台接入',
|
||||
trigger: '绑定车辆连续无 GB32960、JT808、MQTT 来源证据',
|
||||
trigger: '绑定车辆连续无多接入来源证据',
|
||||
notify: '立即通知接入运维,30 分钟未恢复升级给业务责任人',
|
||||
sla: '30 分钟确认'
|
||||
},
|
||||
|
||||
@@ -1506,7 +1506,7 @@ export function Vehicles({
|
||||
</Space>
|
||||
<strong>{filters.keyword?.trim() || `${(summary?.totalVehicles ?? pagination.total).toLocaleString()} 辆车`}</strong>
|
||||
<span>
|
||||
把车辆地图、实时监控、轨迹回放、里程统计、告警通知和历史导出放在同一份服务包里,客户不用理解 GB32960、808 或 MQTT 的差异。
|
||||
把车辆地图、实时监控、轨迹回放、里程统计、告警通知和历史导出放在同一份服务包里,客户不用理解不同接入来源的差异。
|
||||
</span>
|
||||
<Space wrap>
|
||||
<Button size="small" theme="solid" type="primary" icon={<IconCopy />} onClick={copyCustomerServicePackage}>复制交付包</Button>
|
||||
|
||||
@@ -2044,7 +2044,7 @@ test('dashboard exposes vehicle data center capability matrix', async () => {
|
||||
expect(screen.getByRole('button', { name: '客户任务导航 处理告警 告警事件' })).toBeInTheDocument();
|
||||
expect(screen.getByText('客户问题处理台')).toBeInTheDocument();
|
||||
expect(screen.getByText('先回答客户问题,再下钻到车辆、轨迹、统计和证据。')).toBeInTheDocument();
|
||||
expect(screen.getByText('客户首先关心的是车辆、位置、时间、里程、告警和导出;GB32960、JT808、MQTT 只放在证据层。')).toBeInTheDocument();
|
||||
expect(screen.getByText('客户首先关心的是车辆、位置、时间、里程、告警和导出;接入来源只放在证据层。')).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: '客户问题处理台 现在车辆在哪里 打开实时地图' })).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: '客户问题处理台 这段时间跑了多少 查里程统计' })).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: '客户问题处理台 轨迹能不能回放 打开轨迹回放' })).toBeInTheDocument();
|
||||
@@ -3392,7 +3392,7 @@ test('shows vehicle service result summary on vehicle list filters', async () =>
|
||||
expect(screen.getByText('客户车辆服务交付包')).toBeInTheDocument();
|
||||
expect(screen.getByText('客户交付')).toBeInTheDocument();
|
||||
expect(screen.getByText('车辆池包')).toBeInTheDocument();
|
||||
expect(screen.getByText('把车辆地图、实时监控、轨迹回放、里程统计、告警通知和历史导出放在同一份服务包里,客户不用理解 GB32960、808 或 MQTT 的差异。')).toBeInTheDocument();
|
||||
expect(screen.getByText('把车辆地图、实时监控、轨迹回放、里程统计、告警通知和历史导出放在同一份服务包里,客户不用理解不同接入来源的差异。')).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: '客户车辆服务交付 车辆地图 打开地图' })).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: '客户车辆服务交付 轨迹回放 回放轨迹' })).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: '客户车辆服务交付 里程统计 里程统计' })).toBeInTheDocument();
|
||||
@@ -4950,6 +4950,7 @@ test('renders quality issues as vehicle-service governance labels', async () =>
|
||||
expect(screen.getAllByText('暂无数据来源').length).toBeGreaterThanOrEqual(1);
|
||||
expect(screen.getAllByText('车辆服务').length).toBeGreaterThanOrEqual(1);
|
||||
expect(screen.getAllByText('确认平台转发').length).toBeGreaterThan(0);
|
||||
expect(screen.getByText('绑定车辆连续无多接入来源证据')).toBeInTheDocument();
|
||||
expect(screen.getByText('车辆已绑定但没有任何来源证据,先确认平台转发、端口和订阅。')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
@@ -6904,6 +6905,7 @@ test('copies trajectory playback summary from history page', async () => {
|
||||
expect(screen.getByRole('button', { name: '客户复盘导航 导出证据 复制交付' })).toBeInTheDocument();
|
||||
expect(screen.getByText('客户时间窗证据链')).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();
|
||||
@@ -10067,7 +10069,8 @@ test('shows vehicle-first statistics domains for one vehicle service', async ()
|
||||
expect(screen.getByRole('button', { name: '里程交付 在线影响 在线态势' })).toBeInTheDocument();
|
||||
expect(screen.getByText('里程报告建议')).toBeInTheDocument();
|
||||
expect(screen.getByText('从车辆服务视角安排下一步')).toBeInTheDocument();
|
||||
expect(screen.getByText('里程页不再让客户先理解 GB32960、JT808、MQTT 的差异,而是直接给出交付、轨迹回放、历史查询、导出和在线影响的下一步动作。')).toBeInTheDocument();
|
||||
expect(screen.getByText('里程页不再让客户先理解不同接入协议的差异,而是直接给出交付、轨迹回放、历史查询、导出和在线影响的下一步动作。')).toBeInTheDocument();
|
||||
expect(screen.queryByText(/GB32960、JT808|Yutong MQTT/)).not.toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: '里程报告建议 先完成发布复核 发布审计' })).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: '里程报告建议 优先复核异常日 轨迹回放' })).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: '里程报告建议 拉齐全量明细 导出明细' })).toBeInTheDocument();
|
||||
|
||||
Reference in New Issue
Block a user