diff --git a/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.test.tsx b/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.test.tsx index 1e930dd4..501efd50 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.test.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.test.tsx @@ -46,6 +46,9 @@ test('renders only the desktop matrix with dates as columns and a period total', expect(screen.getAllByText('7/13').length).toBeGreaterThan(0); expect(screen.getAllByText('7/14').length).toBeGreaterThan(0); expect(screen.getAllByText('粤A12345').length).toBeGreaterThan(0); + expect(screen.getByRole('heading', { name: '里程范围', level: 5 })).toBeInTheDocument(); + expect(screen.getByText('车牌、自然日与里程数据源策略')).toBeInTheDocument(); + expect(screen.getByText('1 辆 · 2 天').closest('.semi-tag')).toBeInTheDocument(); expect(screen.queryByText('当日起始里程')).not.toBeInTheDocument(); expect(screen.queryByText('数据来源')).not.toBeInTheDocument(); expect(screen.queryByRole('img', { name: '每日行驶里程趋势图' })).not.toBeInTheDocument(); diff --git a/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.tsx b/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.tsx index 4cad7f93..dfd271be 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/StatisticsPage.tsx @@ -9,10 +9,10 @@ import { createMileageExportStream, type MileageExportStream } from '../domain/m import { formatZhNumber } from '../domain/formatters'; import { InlineError, PanelEmpty, PanelLoading } from '../shared/AsyncState'; import { MonitorReturnBar } from '../shared/MonitorReturnBar'; -import { MobileFilterToggle } from '../shared/MobileFilterToggle'; import { TablePagination } from '../shared/TablePagination'; import { VehicleCandidateList } from '../shared/VehicleCandidateList'; import { mergeVehicleCandidates } from '../shared/vehicleCandidates'; +import { WorkspaceFilterPanel } from '../shared/WorkspaceFilterPanel'; import { WorkspacePanelHeader } from '../shared/WorkspacePanelHeader'; import { QUERY_MEMORY, retainPreviousPageWithinScope } from '../queryPolicy'; import { monitorReturnFromParams, preserveMonitorReturn } from '../routing/monitorContext'; @@ -486,8 +486,17 @@ export default function StatisticsPage() { return
- - setFiltersCollapsed((value) => !value)} /> + setFiltersCollapsed((value) => !value)} + >
setDraft((current) => ({ ...current, vehicles }))} /> @@ -498,13 +507,13 @@ export default function StatisticsPage() { {validationError || criteriaError ?

{validationError || criteriaError}

: null} -
+ {statistics.isError || mileage.isError || fleetVehicles.isError ? { statistics.refetch(); mileage.refetch(); if (!hasVehicles) fleetVehicles.refetch(); }} /> : null} {hasVehicles ? `${totalVehicles} 辆` : `${displayVehicles.length} / ${totalVehicles} 辆`}{dates.length} 个自然日} actionsClassName="v2-mileage-result-actions" actions={<>} /> diff --git a/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.tsx b/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.tsx index 5ad359d6..93135ff5 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/TrackPage.tsx @@ -234,7 +234,7 @@ const TrackRail = memo(function TrackRail({ draft, track, loading, activeStopInd className="v2-track-result-header" title={track ? track.plate || track.vin : '轨迹明细'} description={track ? track.vin : '停留、事件与行程证据'} - meta={track ? `${number(track.summary.distanceKm)} km` : undefined} + meta={{track ? `${number(track.summary.distanceKm)} km` : '等待查询'}} />
diff --git a/vehicle-data-platform/apps/web/src/v2/pages/VehiclePage.tsx b/vehicle-data-platform/apps/web/src/v2/pages/VehiclePage.tsx index 6cc8259f..9cc329d3 100644 --- a/vehicle-data-platform/apps/web/src/v2/pages/VehiclePage.tsx +++ b/vehicle-data-platform/apps/web/src/v2/pages/VehiclePage.tsx @@ -146,7 +146,7 @@ function VehicleSearch() { {candidates.data ? `当前显示 ${formatZhNumber(quickVehicles.length)} 辆` : '授权范围'}} /> {candidates.isFetching && !candidates.data ?
正在读取授权车辆…
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 2ee46d22..ff2a0d8d 100644 --- a/vehicle-data-platform/apps/web/src/v2/productionEntry.test.ts +++ b/vehicle-data-platform/apps/web/src/v2/productionEntry.test.ts @@ -310,7 +310,7 @@ describe('V2 production entry', () => { expect(corePageSources.TrackPage).not.toContain(' { ); + expect(screen.getByRole('heading', { name: '事件筛选', level: 5 })).toBeInTheDocument(); expect(screen.getByText('按关键词与状态收窄范围')).toBeInTheDocument(); expect(screen.getByText('2 项已启用')).toBeInTheDocument(); expect(screen.getByRole('button', { name: '修改事件筛选:已启用 2 项' })).toHaveAttribute('aria-expanded', 'false'); diff --git a/vehicle-data-platform/apps/web/src/v2/shared/WorkspaceFilterPanel.tsx b/vehicle-data-platform/apps/web/src/v2/shared/WorkspaceFilterPanel.tsx index df8a81bb..2b1f86df 100644 --- a/vehicle-data-platform/apps/web/src/v2/shared/WorkspaceFilterPanel.tsx +++ b/vehicle-data-platform/apps/web/src/v2/shared/WorkspaceFilterPanel.tsx @@ -3,7 +3,7 @@ import { Card, Tag, Typography } from '@douyinfe/semi-ui'; import type { ComponentProps, ReactNode } from 'react'; import { MobileFilterToggle } from './MobileFilterToggle'; -const { Text } = Typography; +const { Text, Title } = Typography; type WorkspaceFilterPanelProps = { title?: string; @@ -48,7 +48,7 @@ export function WorkspaceFilterPanel({
- {title} + {title} {description} {status} diff --git a/vehicle-data-platform/apps/web/src/v2/styles/workspace.css b/vehicle-data-platform/apps/web/src/v2/styles/workspace.css index 6790cf71..4572a14c 100644 --- a/vehicle-data-platform/apps/web/src/v2/styles/workspace.css +++ b/vehicle-data-platform/apps/web/src/v2/styles/workspace.css @@ -435,6 +435,30 @@ white-space: nowrap; } +.v2-workspace-panel-meta > .semi-tag, +.v2-workspace-result-meta > .semi-tag { + min-height: 24px; + margin: 0; + border-radius: 999px; + padding-inline: 8px; + font-size: 10px; + font-variant-numeric: tabular-nums; + font-weight: 650; +} + +.v2-workspace-result-meta { + display: inline-flex; + min-width: 0; + align-items: center; + gap: 7px; +} + +.v2-workspace-result-meta > span { + color: #748398; + font-size: 10px; + font-variant-numeric: tabular-nums; +} + .v2-workspace-panel-actions > .semi-button { min-height: 34px; border-radius: 8px; @@ -521,6 +545,10 @@ padding: 7px 10px 6px; } .v2-workspace-panel-header.is-inverted > .v2-workspace-panel-copy > h5.semi-typography { font-size: 13px; } + + .v2-workspace-result-meta > span { + display: none; + } } /* @@ -3721,9 +3749,11 @@ .v2-workspace-filter-copy > .semi-typography:first-child { flex: 0 0 auto; + margin: 0; color: #30445d; font-size: 12px; font-weight: 700; + line-height: 1.3; } .v2-workspace-filter-copy > .semi-typography:last-child { @@ -3744,6 +3774,51 @@ font-weight: 650; } +.v2-mileage-query-panel.v2-workspace-filter-panel.semi-card { + border-radius: 12px; +} + +.v2-mileage-query-panel .v2-workspace-filter-heading { + min-height: 42px; +} + +@media (min-width: 681px) and (max-width: 1050px) { + .v2-mileage-query-panel .v2-mileage-filter { + min-height: 0; + grid-template-columns: minmax(200px, 1.35fr) repeat(2, minmax(112px, .72fr)) auto; + grid-template-areas: + "vehicle start end submit" + "source ranges ranges ranges"; + align-items: end; + } + + .v2-mileage-query-panel .v2-mileage-vehicle-field { + grid-area: vehicle; + } + + .v2-mileage-query-panel .v2-mileage-filter > label:nth-of-type(2) { + grid-area: start; + } + + .v2-mileage-query-panel .v2-mileage-filter > label:nth-of-type(3) { + grid-area: end; + } + + .v2-mileage-query-panel .v2-mileage-filter > .v2-primary-button { + grid-area: submit; + width: auto; + margin-top: 0; + } + + .v2-mileage-query-panel .v2-mileage-source-strategy { + grid-area: source; + } + + .v2-mileage-query-panel .v2-mileage-ranges { + grid-area: ranges; + } +} + .v2-table-pagination.semi-page { min-width: 0; color: #607086; @@ -3802,6 +3877,10 @@ border-radius: 11px; } + .v2-mileage-query-panel.v2-workspace-filter-panel.semi-card { + border-radius: 11px; + } + .v2-table-pagination-controls { justify-content: space-between; }