feat: sync vehicle monitoring and accumulated platform updates

Add monitoring metrics, numeric sorting, report-time display, vehicle number labels, and map layout fixes. Include accumulated mileage, hydrogen, OneOS authentication, open platform, ingestion, deployment, and UI updates.

Exclude temporary files, generated reports, and credentials. Validate frontend 632 tests and production build, API packages, vehicle-map tests, and release installer tests. Gateway suite has one pre-existing date-sensitive identity throttling test failure reproduced on the parent commit.
This commit is contained in:
lingniu
2026-10-26 18:05:59 +08:00
parent 8b32ae2988
commit d6b957dfc8
290 changed files with 28238 additions and 1647 deletions
@@ -129,14 +129,15 @@ test('removes old access rows immediately when the vehicle filter scope changes'
expect(screen.getByLabelText('接入管理操作')).toHaveClass('v2-workspace-command-bar', 'v2-access-command-bar', 'has-identity');
expect(screen.getByLabelText('接入管理操作').querySelector('.v2-workspace-command-icon.semi-avatar')).toBeInTheDocument();
expect(view.container.querySelector('.v2-access-discovery-shell')).toBeInTheDocument();
for (const className of ['v2-access-filter-card-v3', 'v2-access-table-v3']) {
expect(screen.getByRole('region', { name: '接入筛选' })).toHaveClass('governance-query-bar');
for (const className of ['v2-access-table-v3']) {
expect(view.container.querySelector(`.${className}.semi-card`)).toBeInTheDocument();
}
expect(screen.getByRole('navigation', { name: '接入差异筛选' })).toHaveClass('v2-access-status-tabs');
const accessMetrics = screen.getByRole('list', { name: '接入差异概览' });
expect(accessMetrics.closest('.v2-access-metric-rail')).toHaveClass('semi-card', 'is-queue');
expect(within(accessMetrics).getAllByRole('listitem')).toHaveLength(2);
expect(within(accessMetrics).getByRole('button', { name: '筛选需关注,共 0 辆' })).toHaveClass('v2-workspace-metric-action');
expect(accessMetrics.closest('.v2-access-metric-rail')).toHaveClass('governance-status-strip');
expect(within(accessMetrics).getAllByRole('listitem')).toHaveLength(6);
expect(within(accessMetrics).getByRole('button', { name: '筛选需关注,共 0 辆' })).toHaveAttribute('aria-pressed', 'false');
expect(within(accessMetrics).getByRole('button', { name: '筛选全部车辆,共 2 辆' })).toHaveAttribute('aria-pressed', 'true');
const protocolCoverage = screen.getByLabelText('真实协议来源概览');
expect(protocolCoverage).toHaveTextContent('真实来源覆盖');
@@ -144,11 +145,12 @@ test('removes old access rows immediately when the vehicle filter scope changes'
expect(protocolCoverage).toHaveTextContent('808');
expect(protocolCoverage).toHaveTextContent('宇通');
expect(screen.getByRole('heading', { name: '接入差异清单', level: 5 })).toBeInTheDocument();
expect(screen.getByText('当前范围:全部主车辆 · 缺席协议仅表示当前未发现')).toBeInTheDocument();
expect(screen.getByText('当前范围:全部主车辆')).toBeInTheDocument();
const differenceHeader = screen.getByRole('columnheader', { name: '差异结论' });
expect(differenceHeader).toHaveClass('semi-table-cell-fixed-left', 'v2-access-difference-column');
expect(screen.queryByRole('columnheader', { name: '真实来源' })).not.toBeInTheDocument();
expect(screen.getByText('已接来源状态正常')).toBeInTheDocument();
expect(screen.queryByText('已接来源状态正常')).not.toBeInTheDocument();
expect(screen.getByText('1 个来源')).toBeInTheDocument();
const filterActions = view.container.querySelector<HTMLElement>('.v2-access-filter-actions');
expect(filterActions).toBeInTheDocument();
expect(within(filterActions!).getByRole('button', { name: '查询' })).toBeInTheDocument();
@@ -306,8 +308,8 @@ test('renders mobile access vehicles as selectable Semi cards', async () => {
expect(filterTrigger).toHaveAttribute('aria-expanded', 'false');
fireEvent.click(filterTrigger);
const filterDialog = await screen.findByRole('dialog', { name: '接入车辆筛选' });
expect(document.querySelector('.v2-access-mobile-filter-sidesheet')).toHaveClass('semi-sidesheet-bottom');
expect(document.querySelector('.v2-access-mobile-filter-sidesheet .semi-sidesheet-inner')).toHaveStyle({ height: 'min(76dvh, 640px)' });
expect(document.querySelector('.v2-access-mobile-filter-sidesheet')).toHaveClass('business-sheet-bottom');
expect(document.querySelector('.v2-access-mobile-filter-sidesheet')).toHaveStyle({ height: 'min(76dvh, 640px)' });
expect(within(filterDialog).getByRole('textbox', { name: '车辆' })).toBeInTheDocument();
expect(within(filterDialog).getByRole('combobox', { name: '接入状态' })).toBeInTheDocument();
expect(within(filterDialog).getByRole('combobox', { name: '真实协议' })).toBeInTheDocument();
@@ -321,7 +323,7 @@ test('renders mobile access vehicles as selectable Semi cards', async () => {
fireEvent.click(within(filterDialog).getByRole('button', { name: '应用并查询' }));
await waitFor(() => expect(mocks.accessVehicles).toHaveBeenLastCalledWith(expect.objectContaining({ connectionState: 'attention' }), expect.anything()));
expect(screen.getByRole('button', { name: /修改接入筛选:已启用 1 项/ })).toHaveAttribute('aria-expanded', 'false');
expect(screen.getByRole('dialog', { name: '接入车辆筛选' })).toHaveClass('semi-sidesheet-animation-content_hide_bottom');
expect(screen.queryByRole('dialog', { name: '接入车辆筛选' })).not.toBeInTheDocument();
action = await screen.findByRole('button', { name: '查看 粤A00001 接入详情' });
const toolsButton = screen.getByRole('button', { name: '打开接入管理工具' });
expect(toolsButton).toHaveTextContent('工具');
@@ -365,9 +367,9 @@ test('renders mobile access vehicles as selectable Semi cards', async () => {
expect(within(dialog).getByRole('button', { name: '收起 JT808 完整证据' })).toHaveAttribute('aria-expanded', 'true');
expect(mocks.accessVehicles).toHaveBeenCalledTimes(vehicleRequestsBeforeEvidenceToggle);
expect(mocks.accessSummary).toHaveBeenCalledTimes(summaryRequestsBeforeEvidenceToggle);
expect(document.querySelector('.v2-access-detail-sidesheet')).toHaveClass('semi-sidesheet-bottom', 'v2-workspace-detail-sidesheet');
expect(document.querySelector('.v2-access-detail-sidesheet .semi-sidesheet-inner')).toHaveStyle({ height: 'min(84dvh, 740px)' });
expect(document.querySelector('.v2-access-detail-sidesheet .v2-workspace-config-title > .semi-tag')).toHaveTextContent('部分来源异常');
expect(document.querySelector('.v2-access-detail-sidesheet')).toHaveClass('business-sheet-bottom', 'v2-workspace-detail-sidesheet');
expect(document.querySelector('.v2-access-detail-sidesheet')).toHaveStyle({ height: 'min(84dvh, 740px)' });
expect(document.querySelector('.v2-access-detail-sidesheet .business-dialog-heading > [data-slot="badge"]')).toHaveTextContent('部分来源异常');
fireEvent.click(within(dialog).getByRole('button', { name: '关闭车辆接入详情' }));
expect(action).toHaveAttribute('aria-pressed', 'false');
expect(action).toHaveAttribute('aria-expanded', 'false');
@@ -376,8 +378,8 @@ test('renders mobile access vehicles as selectable Semi cards', async () => {
const governanceButton = screen.getByRole('button', { name: /接入治理/ });
fireEvent.click(governanceButton);
const governanceDialog = await screen.findByRole('dialog', { name: '接入治理配置' });
expect(document.querySelector('.v2-access-governance-sidesheet')).toHaveClass('semi-sidesheet-bottom', 'v2-workspace-config-sidesheet');
expect(document.querySelector('.v2-access-governance-sidesheet .semi-sidesheet-inner')).toHaveStyle({ height: 'min(88dvh, 780px)' });
expect(document.querySelector('.v2-access-governance-sidesheet')).toHaveClass('business-sheet-bottom', 'v2-workspace-config-sidesheet');
expect(document.querySelector('.v2-access-governance-sidesheet')).toHaveStyle({ height: 'min(88dvh, 780px)' });
expect(within(governanceDialog).getByText('接入治理工作台')).toBeInTheDocument();
expect(within(governanceDialog).getByRole('list', { name: '接入治理配置摘要' })).toBeInTheDocument();
fireEvent.click(within(governanceDialog).getByRole('button', { name: '关闭接入治理配置' }));