feat(platform): align realtime copy with vehicle monitoring
This commit is contained in:
@@ -397,7 +397,7 @@ function realtimeDutyHandoffText({
|
|||||||
})
|
})
|
||||||
.slice(0, 8);
|
.slice(0, 8);
|
||||||
const lines = [
|
const lines = [
|
||||||
'【实时运营交接包】',
|
'【车辆监控交付包】',
|
||||||
`当前筛选:${realtimeFilterSummary(filters).join(';') || '全部实时车辆'}`,
|
`当前筛选:${realtimeFilterSummary(filters).join(';') || '全部实时车辆'}`,
|
||||||
`页面车辆:${rows.length.toLocaleString()} / 总计 ${total.toLocaleString()};版本:${runtimeRelease || '未标记'}`,
|
`页面车辆:${rows.length.toLocaleString()} / 总计 ${total.toLocaleString()};版本:${runtimeRelease || '未标记'}`,
|
||||||
`在线:${onlineCount.toLocaleString()};离线:${(rows.length - onlineCount).toLocaleString()};定位有效:${locatedCount.toLocaleString()};需要关注:${degradedCount.toLocaleString()};超时:${staleCount.toLocaleString()};数据通道:${sourceTypeCount.toLocaleString()}`,
|
`在线:${onlineCount.toLocaleString()};离线:${(rows.length - onlineCount).toLocaleString()};定位有效:${locatedCount.toLocaleString()};需要关注:${degradedCount.toLocaleString()};超时:${staleCount.toLocaleString()};数据通道:${sourceTypeCount.toLocaleString()}`,
|
||||||
@@ -455,7 +455,7 @@ function realtimeImpactReportText({
|
|||||||
const offlineCount = Math.max(0, rows.length - onlineCount);
|
const offlineCount = Math.max(0, rows.length - onlineCount);
|
||||||
const impactLevel = degradedCount > 0 || staleCount > 0 || offlineCount > 0 ? '需要处置' : '实时稳定';
|
const impactLevel = degradedCount > 0 || staleCount > 0 || offlineCount > 0 ? '需要处置' : '实时稳定';
|
||||||
return [
|
return [
|
||||||
'【实时运营影响】',
|
'【车辆监控影响】',
|
||||||
`当前筛选:${realtimeFilterSummary(filters).join(';') || '全部实时车辆'}`,
|
`当前筛选:${realtimeFilterSummary(filters).join(';') || '全部实时车辆'}`,
|
||||||
`运行版本:${runtimeRelease || '未标记'}`,
|
`运行版本:${runtimeRelease || '未标记'}`,
|
||||||
`影响等级:${impactLevel}`,
|
`影响等级:${impactLevel}`,
|
||||||
@@ -1004,7 +1004,7 @@ export function Realtime({
|
|||||||
sourceTypeCount: primaryProtocols.size,
|
sourceTypeCount: primaryProtocols.size,
|
||||||
amapConfigured,
|
amapConfigured,
|
||||||
runtimeRelease: runtime?.platformRelease
|
runtimeRelease: runtime?.platformRelease
|
||||||
}), '实时运营交接包');
|
}), '车辆监控交付包');
|
||||||
const realtimeImpactLevel = degradedCount > 0 || staleCount > 0 || rows.length - onlineCount > 0 ? '需要处置' : '实时稳定';
|
const realtimeImpactLevel = degradedCount > 0 || staleCount > 0 || rows.length - onlineCount > 0 ? '需要处置' : '实时稳定';
|
||||||
const realtimeImpactColor = realtimeImpactLevel === '实时稳定' ? 'green' as const : degradedCount > 0 || staleCount > 0 ? 'orange' as const : 'blue' as const;
|
const realtimeImpactColor = realtimeImpactLevel === '实时稳定' ? 'green' as const : degradedCount > 0 || staleCount > 0 ? 'orange' as const : 'blue' as const;
|
||||||
const realtimeImpactItems = [
|
const realtimeImpactItems = [
|
||||||
@@ -1050,7 +1050,7 @@ export function Realtime({
|
|||||||
pageCoverageRate,
|
pageCoverageRate,
|
||||||
amapConfigured,
|
amapConfigured,
|
||||||
runtimeRelease: runtime?.platformRelease
|
runtimeRelease: runtime?.platformRelease
|
||||||
}), '实时运营影响');
|
}), '车辆监控影响');
|
||||||
const selectRealtimeRow = (row: VehicleRealtimeRow) => {
|
const selectRealtimeRow = (row: VehicleRealtimeRow) => {
|
||||||
const index = rows.indexOf(row);
|
const index = rows.indexOf(row);
|
||||||
if (index < 0) return;
|
if (index < 0) return;
|
||||||
@@ -1582,7 +1582,7 @@ export function Realtime({
|
|||||||
];
|
];
|
||||||
const mapViewModeItems = [
|
const mapViewModeItems = [
|
||||||
{
|
{
|
||||||
label: '运营总览',
|
label: '车辆总览',
|
||||||
value: `${rows.length.toLocaleString()} 辆`,
|
value: `${rows.length.toLocaleString()} 辆`,
|
||||||
detail: `在线 ${onlineCount.toLocaleString()},有效定位 ${locatedCount.toLocaleString()},先确认客户能看到的车辆范围。`,
|
detail: `在线 ${onlineCount.toLocaleString()},有效定位 ${locatedCount.toLocaleString()},先确认客户能看到的车辆范围。`,
|
||||||
action: '当前页',
|
action: '当前页',
|
||||||
@@ -2057,7 +2057,7 @@ export function Realtime({
|
|||||||
level: '交付',
|
level: '交付',
|
||||||
title: '导出当前实时清单',
|
title: '导出当前实时清单',
|
||||||
value: `${rows.length.toLocaleString()} 辆当前页`,
|
value: `${rows.length.toLocaleString()} 辆当前页`,
|
||||||
detail: '客户问询或运营交接时,先导出当前筛选的车辆在线、位置、速度和里程。',
|
detail: '客户问询或交付复盘时,先导出当前筛选的车辆在线、位置、速度和里程。',
|
||||||
action: '导出 CSV',
|
action: '导出 CSV',
|
||||||
color: rows.length > 0 ? 'blue' as const : 'grey' as const,
|
color: rows.length > 0 ? 'blue' as const : 'grey' as const,
|
||||||
disabled: rows.length === 0,
|
disabled: rows.length === 0,
|
||||||
@@ -2592,7 +2592,7 @@ export function Realtime({
|
|||||||
</Tag>
|
</Tag>
|
||||||
<Tag color={selectedMapRow ? 'blue' : 'grey'}>{selectedVehicleLabel}</Tag>
|
<Tag color={selectedMapRow ? 'blue' : 'grey'}>{selectedVehicleLabel}</Tag>
|
||||||
</Space>
|
</Space>
|
||||||
<Typography.Text strong>按客户现场使用场景切换地图重点:运营总览、异常优先、轨迹复盘或交付导出。</Typography.Text>
|
<Typography.Text strong>按客户现场使用场景切换地图重点:车辆总览、异常优先、轨迹复盘或交付导出。</Typography.Text>
|
||||||
<Typography.Text type="secondary">
|
<Typography.Text type="secondary">
|
||||||
视图模式只改变工作重点,底层仍围绕同一批车辆、同一个时间上下文和同一套服务动作。
|
视图模式只改变工作重点,底层仍围绕同一批车辆、同一个时间上下文和同一套服务动作。
|
||||||
</Typography.Text>
|
</Typography.Text>
|
||||||
@@ -3072,7 +3072,7 @@ export function Realtime({
|
|||||||
按客户影响排序:先处理不能看车、定位无效、数据通道不完整和更新超时的车辆。
|
按客户影响排序:先处理不能看车、定位无效、数据通道不完整和更新超时的车辆。
|
||||||
</Typography.Title>
|
</Typography.Title>
|
||||||
<Typography.Text type="secondary">
|
<Typography.Text type="secondary">
|
||||||
这不是运维协议清单,而是实时运营的处置队列;每辆车都能直接进入告警、轨迹和车辆档案。
|
这不是运维协议清单,而是车辆监控的处置队列;每辆车都能直接进入告警、轨迹和车辆档案。
|
||||||
</Typography.Text>
|
</Typography.Text>
|
||||||
</div>
|
</div>
|
||||||
<div className="vp-realtime-priority-grid">
|
<div className="vp-realtime-priority-grid">
|
||||||
@@ -3165,7 +3165,7 @@ export function Realtime({
|
|||||||
className="vp-realtime-next-action"
|
className="vp-realtime-next-action"
|
||||||
disabled={item.disabled}
|
disabled={item.disabled}
|
||||||
onClick={item.onClick}
|
onClick={item.onClick}
|
||||||
aria-label={`实时运营建议 ${item.title} ${item.action}`}
|
aria-label={`车辆监控建议 ${item.title} ${item.action}`}
|
||||||
>
|
>
|
||||||
<Tag color={item.color}>{item.level}</Tag>
|
<Tag color={item.color}>{item.level}</Tag>
|
||||||
<strong>{item.title}</strong>
|
<strong>{item.title}</strong>
|
||||||
@@ -3392,7 +3392,7 @@ export function Realtime({
|
|||||||
<Tag color="green">{onlineCount.toLocaleString()} 辆在线</Tag>
|
<Tag color="green">{onlineCount.toLocaleString()} 辆在线</Tag>
|
||||||
<Button size="small" theme="light" icon={<IconCopy />} aria-label="复制实时摘要" onClick={copyRealtimeSummary}>复制实时摘要</Button>
|
<Button size="small" theme="light" icon={<IconCopy />} aria-label="复制实时摘要" onClick={copyRealtimeSummary}>复制实时摘要</Button>
|
||||||
<Button size="small" theme="light" icon={<IconCopy />} aria-label="复制实时异常处置清单" onClick={copyRealtimeIssueChecklist}>复制异常处置清单</Button>
|
<Button size="small" theme="light" icon={<IconCopy />} aria-label="复制实时异常处置清单" onClick={copyRealtimeIssueChecklist}>复制异常处置清单</Button>
|
||||||
<Button size="small" theme="light" icon={<IconCopy />} aria-label="复制实时运营交接包" onClick={copyRealtimeDutyHandoff}>复制运营交接包</Button>
|
<Button size="small" theme="light" icon={<IconCopy />} aria-label="复制车辆监控交付包" onClick={copyRealtimeDutyHandoff}>复制交付包</Button>
|
||||||
</Space>
|
</Space>
|
||||||
</div>
|
</div>
|
||||||
<VehicleMap
|
<VehicleMap
|
||||||
@@ -3552,7 +3552,7 @@ export function Realtime({
|
|||||||
</div>
|
</div>
|
||||||
<Card
|
<Card
|
||||||
bordered
|
bordered
|
||||||
title={<Space><span>实时运营影响</span><Button size="small" icon={<IconCopy />} onClick={copyRealtimeImpact}>复制影响报告</Button></Space>}
|
title={<Space><span>车辆监控影响</span><Button size="small" icon={<IconCopy />} onClick={copyRealtimeImpact}>复制影响报告</Button></Space>}
|
||||||
style={{ marginBottom: 16 }}
|
style={{ marginBottom: 16 }}
|
||||||
>
|
>
|
||||||
<div className="vp-realtime-impact-board">
|
<div className="vp-realtime-impact-board">
|
||||||
|
|||||||
@@ -11218,9 +11218,9 @@ test('frames realtime page as one vehicle service with source evidence', async (
|
|||||||
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.getByRole('button', { name: '实时运营建议 导出当前实时清单 导出 CSV' })).toBeInTheDocument();
|
expect(screen.getByRole('button', { name: '车辆监控建议 导出当前实时清单 导出 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();
|
||||||
expect(screen.getByRole('button', { name: '实时监控路径 异常优先 关注车辆' })).toBeInTheDocument();
|
expect(screen.getByRole('button', { name: '实时监控路径 异常优先 关注车辆' })).toBeInTheDocument();
|
||||||
@@ -11241,7 +11241,7 @@ test('frames realtime page as one vehicle service with source evidence', async (
|
|||||||
expect(screen.getByText('GB32960 在线')).toBeInTheDocument();
|
expect(screen.getByText('GB32960 在线')).toBeInTheDocument();
|
||||||
expect(screen.getByText('JT808 在线')).toBeInTheDocument();
|
expect(screen.getByText('JT808 在线')).toBeInTheDocument();
|
||||||
expect(screen.getByText('YUTONG_MQTT 未接入')).toBeInTheDocument();
|
expect(screen.getByText('YUTONG_MQTT 未接入')).toBeInTheDocument();
|
||||||
expect(screen.getByText('实时运营影响')).toBeInTheDocument();
|
expect(screen.getByText('车辆监控影响')).toBeInTheDocument();
|
||||||
expect(screen.getByRole('button', { name: /复制影响报告/ })).toBeInTheDocument();
|
expect(screen.getByRole('button', { name: /复制影响报告/ })).toBeInTheDocument();
|
||||||
expect(screen.getAllByText('需要处置').length).toBeGreaterThan(0);
|
expect(screen.getAllByText('需要处置').length).toBeGreaterThan(0);
|
||||||
expect(screen.getByText('车辆范围')).toBeInTheDocument();
|
expect(screen.getByText('车辆范围')).toBeInTheDocument();
|
||||||
@@ -11251,7 +11251,7 @@ test('frames realtime page as one vehicle service with source evidence', async (
|
|||||||
expect(screen.getByText('地图能力')).toBeInTheDocument();
|
expect(screen.getByText('地图能力')).toBeInTheDocument();
|
||||||
expect(screen.getByText('当前页 1 辆,在线 1 辆,定位有效 1 辆,降级 0 辆,超时 1 辆。')).toBeInTheDocument();
|
expect(screen.getByText('当前页 1 辆,在线 1 辆,定位有效 1 辆,降级 0 辆,超时 1 辆。')).toBeInTheDocument();
|
||||||
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('影响等级:需要处置'));
|
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('影响等级:需要处置'));
|
||||||
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('车辆范围:当前页 1 / 总计 1,覆盖率 100%'));
|
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('车辆范围:当前页 1 / 总计 1,覆盖率 100%'));
|
||||||
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('在线状态:1 在线 / 0 离线'));
|
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('在线状态:1 在线 / 0 离线'));
|
||||||
@@ -11778,8 +11778,8 @@ test('copies realtime operations summary from realtime page', async () => {
|
|||||||
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('实时监控:http://localhost:3000/#/realtime?keyword=VIN-RT-SUMMARY-003&protocol=JT808'));
|
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('实时监控:http://localhost:3000/#/realtime?keyword=VIN-RT-SUMMARY-003&protocol=JT808'));
|
||||||
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('轨迹回放:http://localhost:3000/#/history?keyword=VIN-RT-SUMMARY-003&protocol=JT808'));
|
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('轨迹回放:http://localhost:3000/#/history?keyword=VIN-RT-SUMMARY-003&protocol=JT808'));
|
||||||
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('告警事件:http://localhost:3000/#/alert-events?keyword=VIN-RT-SUMMARY-003&protocol=JT808'));
|
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('告警事件:http://localhost:3000/#/alert-events?keyword=VIN-RT-SUMMARY-003&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('页面车辆:3 / 总计 3;版本:'));
|
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('页面车辆:3 / 总计 3;版本:'));
|
||||||
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('在线:2;离线:1;定位有效:2;需要关注:2;超时:'));
|
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('在线:2;离线:1;定位有效:2;需要关注:2;超时:'));
|
||||||
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('车辆覆盖:GB32960:在线 1/1,实时 1/1;JT808:在线 1/2,实时 2/2;YUTONG_MQTT:在线 0/1,实时 1/1'));
|
expect(writeText).toHaveBeenCalledWith(expect.stringContaining('车辆覆盖:GB32960:在线 1/1,实时 1/1;JT808:在线 1/2,实时 2/2;YUTONG_MQTT:在线 0/1,实时 1/1'));
|
||||||
|
|||||||
Reference in New Issue
Block a user