diff --git a/vehicle-data-platform/apps/web/src/pages/Realtime.tsx b/vehicle-data-platform/apps/web/src/pages/Realtime.tsx
index c82fefa5..ea496560 100644
--- a/vehicle-data-platform/apps/web/src/pages/Realtime.tsx
+++ b/vehicle-data-platform/apps/web/src/pages/Realtime.tsx
@@ -160,7 +160,7 @@ export function Realtime({
title: '操作',
width: 110,
render: (_: unknown, row: VehicleRealtimeRow) => (
-
+
)
}
]}
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 a4672d4e..06f8042a 100644
--- a/vehicle-data-platform/apps/web/src/test/App.test.tsx
+++ b/vehicle-data-platform/apps/web/src/test/App.test.tsx
@@ -2413,6 +2413,84 @@ test('opens vehicle service from realtime vehicles with primary source evidence'
expect(fetchMock).toHaveBeenCalledWith(expect.stringContaining('/api/vehicle-service/overview?keyword=VIN-MQTT-001&protocol=YUTONG_MQTT'), undefined);
});
+test('opens vehicle service from realtime vehicles with current source filter', async () => {
+ window.history.replaceState(null, '', '/#/realtime?keyword=VIN-RT-FILTER&protocol=JT808');
+ const fetchMock = vi.spyOn(globalThis, 'fetch').mockImplementation(async (input) => {
+ const path = String(input);
+ if (path.includes('/api/realtime/vehicles')) {
+ return {
+ ok: true,
+ json: async () => ({
+ data: {
+ items: [{
+ vin: 'VIN-RT-FILTER',
+ plate: '粤ART808',
+ phone: '',
+ oem: 'G7s',
+ protocols: ['GB32960', 'JT808'],
+ sourceCount: 2,
+ onlineSourceCount: 2,
+ online: true,
+ primaryProtocol: 'GB32960',
+ longitude: 113.2,
+ latitude: 23.1,
+ speedKmh: 30,
+ socPercent: 78,
+ totalMileageKm: 119925,
+ lastSeen: '2026-07-03 20:12:10'
+ }],
+ total: 1,
+ limit: 50,
+ offset: 0
+ },
+ traceId: 'trace-test',
+ timestamp: 1783094400000
+ })
+ } as Response;
+ }
+ if (path.includes('/api/vehicle-service/overview')) {
+ return {
+ ok: true,
+ json: async () => ({
+ data: {
+ vin: 'VIN-RT-FILTER',
+ plate: '粤ART808',
+ sourceCount: 2,
+ onlineSourceCount: 2,
+ coverageStatus: 'online',
+ primaryProtocol: 'GB32960',
+ lastSeen: '2026-07-03 20:12:10',
+ historyCount: 0,
+ rawCount: 0,
+ mileageCount: 0,
+ qualityIssueCount: 0
+ },
+ traceId: 'trace-test',
+ timestamp: 1783094400000
+ })
+ } as Response;
+ }
+ return {
+ ok: true,
+ json: async () => ({
+ data: { items: [], total: 0, limit: 10, offset: 0 },
+ traceId: 'trace-test',
+ timestamp: 1783094400000
+ })
+ } as Response;
+ });
+
+ render();
+
+ expect(await screen.findByText('VIN-RT-FILTER')).toBeInTheDocument();
+ fireEvent.click(screen.getByRole('button', { name: '车辆服务' }));
+
+ await waitFor(() => {
+ expect(window.location.hash).toBe('#/detail?keyword=VIN-RT-FILTER&protocol=JT808');
+ });
+ expect(fetchMock).toHaveBeenCalledWith(expect.stringContaining('/api/vehicle-service/overview?keyword=VIN-RT-FILTER&protocol=JT808'), undefined);
+});
+
test('shows canonical service status in realtime vehicles', async () => {
window.history.replaceState(null, '', '/#/realtime');
vi.spyOn(globalThis, 'fetch').mockImplementation(async (input) => {