diff --git a/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.test.tsx b/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.test.tsx index 693b99f6..aec51ad9 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.test.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.test.tsx @@ -300,7 +300,13 @@ test('fuzzy searches a vehicle and renders all source diagnosis evidence', async fireEvent.click(candidateButton); expect(await screen.findByText('当前推荐 G7')).toBeInTheDocument(); expect(screen.getByText('1 个来源')).toBeInTheDocument(); + expect(screen.getByRole('group', { name: '车辆来源诊断概览' })).toHaveClass('v2-source-summary-region'); + expect(document.querySelector('.v2-source-summary-region > .v2-source-summary.semi-card-group')).toBeInTheDocument(); expect(document.querySelectorAll('.v2-source-summary-card.semi-card')).toHaveLength(4); + expect(document.querySelector('.v2-source-summary-card.is-vehicle')).toHaveTextContent('粤A00001'); + expect(document.querySelector('.v2-source-summary-card.is-recommended')).toHaveTextContent('G7'); + expect(document.querySelector('.v2-source-summary-card.is-source-health')).toHaveClass('is-warning'); + expect(document.querySelector('.v2-source-summary-card.is-policy')).toHaveTextContent('v1'); expect(document.querySelectorAll('.v2-source-summary-card')[1]?.querySelector('.semi-tag')).toHaveTextContent('JT808'); expect(screen.getByText('推荐说明').closest('.semi-card')).toHaveClass('v2-source-recommendation'); expect(screen.getByText('最近策略审计').closest('.semi-card')).toHaveClass('v2-source-audit'); @@ -378,6 +384,9 @@ test('allows provider maintenance but keeps canonical source policy read only', expect(document.querySelector('.v2-source-table')).not.toBeInTheDocument(); expect(document.querySelector('.v2-source-mobile-card.semi-card')).toBeInTheDocument(); expect(document.querySelector('.v2-source-mobile-descriptions.semi-descriptions')).toBeInTheDocument(); + expect(screen.getByRole('group', { name: '车辆来源诊断概览' })).toHaveClass('v2-source-summary-region'); + expect(document.querySelector('.v2-source-summary-region > .v2-source-summary.semi-card-group')).toBeInTheDocument(); + expect(document.querySelectorAll('.v2-source-summary-card.semi-card')).toHaveLength(4); expect(screen.getByText('优先级 100')).toBeInTheDocument(); expect(screen.queryByLabelText('JT808 优先级')).not.toBeInTheDocument(); fireEvent.click(screen.getByRole('button', { name: '维护提供方' })); diff --git a/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.tsx b/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.tsx index d59b3581..46e648d4 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/OperationsPage.tsx @@ -306,12 +306,14 @@ function SourceDiagnosticWorkspace() { {!selected ? : null} {selected && diagnostic.isPending ?
正在读取来源证据只查询当前车辆,不会扫描整车队。
: null} {data ? <> -
- 车辆{data.evidence.plate || selected?.plate || '未绑定车牌'}{data.evidence.vin} - 当前推荐{data.evidence.recommendedLocationLabel || '暂无推荐'}{data.evidence.recommendedLocationProtocol || '—'} - 来源状态{data.evidence.locationSources.filter((item) => item.online).length} / {data.evidence.locationSources.length} 在线{data.evidence.locationConflict ? `位置冲突 ${number(data.evidence.conflictDistanceM)}m` : '未发现实时位置冲突'} - 策略版本v{data.policy.version}{data.policy.updatedAt ? <>{data.policy.updatedBy} · : '尚无人工调整'} -
+
+ + 车辆{data.evidence.plate || selected?.plate || '未绑定车牌'}{data.evidence.vin} + 当前推荐{data.evidence.recommendedLocationLabel || '暂无推荐'}{data.evidence.recommendedLocationProtocol || '—'} + 来源状态{data.evidence.locationSources.filter((item) => item.online).length} / {data.evidence.locationSources.length} 在线{data.evidence.locationConflict ? `位置冲突 ${number(data.evidence.conflictDistanceM)}m` : '未发现实时位置冲突'} + 策略版本v{data.policy.version}{data.policy.updatedAt ? <>{data.policy.updatedBy} · : '尚无人工调整'} + +
推荐说明{data.refreshHint}

{data.recommendationReason}

{!editable ?
只读权限当前账号可查看诊断证据;只有管理员可以调整启停和优先级。
: null} {mobileLayout diff --git a/vehicle-data-platform/apps/web/src/v2/productionEntry.test.ts b/vehicle-data-platform/apps/web/src/v2/productionEntry.test.ts index e2730e92..0fc6a2fd 100644 --- a/vehicle-data-platform/apps/web/src/v2/productionEntry.test.ts +++ b/vehicle-data-platform/apps/web/src/v2/productionEntry.test.ts @@ -287,7 +287,9 @@ describe('V2 production entry', () => { expect(corePageSources.OperationsPage).not.toContain('
生产数据模式
'); expect(corePageSources.OperationsPage).toContain(' .semi-card-body { + min-height: 74px; + padding: 9px 10px; + } + + .v2-source-summary-card small, + .v2-source-summary-card > .semi-card-body > span:not(.semi-tag) { + font-size: 9px; + } + + .v2-source-summary-card strong { + margin-block: 5px 4px; + font-size: 14px; + } + + .v2-source-summary-card .semi-tag { + min-height: 19px; + padding-inline: 7px; + font-size: 9px; + } + + .v2-source-summary-card.is-ok, + .v2-source-summary-card.is-warning { + box-shadow: inset 0 3px #22a878, 0 5px 16px rgba(31, 53, 80, .045); + } + + .v2-source-summary-card.is-warning { + box-shadow: inset 0 3px #e8a12b, 0 5px 16px rgba(31, 53, 80, .045); + } + + .v2-source-recommendation.semi-card { + margin: 8px 10px; + border-left-width: 3px; + } + + .v2-source-recommendation > .semi-card-body { + padding: 9px 10px; + } + + .v2-source-recommendation header { + align-items: center; + flex-direction: row; + gap: 8px; + } + + .v2-source-recommendation header span { + width: auto; + min-width: 0; + font-size: 9px; + line-height: 1.35; + } + + .v2-source-recommendation p { + margin-top: 6px; + font-size: 10px; + line-height: 1.5; + } +} + /* * Semi UI mileage workspace convergence. * Keep a single query/summary surface, one table scroll owner and the same