From 8b38b1411de266648ed5c81a95b9d5602a100438 Mon Sep 17 00:00:00 2001 From: lingniu Date: Sun, 5 Jul 2026 03:17:20 +0800 Subject: [PATCH] feat(platform): remove default history vehicle --- vehicle-data-platform/apps/web/src/App.tsx | 11 +++-- .../apps/web/src/pages/History.tsx | 40 +++++++++++++++++-- .../apps/web/src/test/App.test.tsx | 2 + 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/vehicle-data-platform/apps/web/src/App.tsx b/vehicle-data-platform/apps/web/src/App.tsx index ea756a71..5a8c4651 100644 --- a/vehicle-data-platform/apps/web/src/App.tsx +++ b/vehicle-data-platform/apps/web/src/App.tsx @@ -16,7 +16,7 @@ import { Vehicles } from './pages/Vehicles'; export default function App() { const initialRoute = parseAppHash(window.location.hash); - const initialVehicleKey = initialRoute.keyword || 'LB9A32A24R0LS1426'; + const initialVehicleKey = initialRoute.keyword || ''; const [activePage, setActivePage] = useState(initialRoute.page ?? 'dashboard'); const [activeVin, setActiveVin] = useState(initialVehicleKey); const [analysisVin, setAnalysisVin] = useState(initialVehicleKey); @@ -351,7 +351,8 @@ export default function App() { const openHistoryWithFilters = (filters: Record = {}) => { const nextFilters = normalizeHistoryFilterValues(filters); - const nextVin = nextFilters.keyword?.trim() || analysisVin; + const hasKeywordInput = Object.prototype.hasOwnProperty.call(nextFilters, 'keyword'); + const nextVin = nextFilters.keyword?.trim() || (hasKeywordInput ? '' : analysisVin); const nextProtocol = nextFilters.protocol?.trim() ?? activeProtocol; const nextTab = nextFilters.tab === 'raw' || nextFilters.tab === 'fields' ? nextFilters.tab : 'location'; const nextPage = nextTab === 'raw' || nextTab === 'fields' ? 'history-query' : 'history'; @@ -385,11 +386,9 @@ export default function App() { const openRawWithFilters = (filters: Record = {}) => { const nextFilters = normalizeHistoryFilterValues(filters); - const nextVin = nextFilters.keyword?.trim() || analysisVin; + const hasKeywordInput = Object.prototype.hasOwnProperty.call(nextFilters, 'keyword'); + const nextVin = nextFilters.keyword?.trim() || (hasKeywordInput ? '' : analysisVin); const nextProtocol = nextFilters.protocol?.trim() ?? activeProtocol; - if (!nextVin) { - return; - } setAnalysisVin(nextVin); setActiveProtocol(nextProtocol); setHistoryTab('raw'); diff --git a/vehicle-data-platform/apps/web/src/pages/History.tsx b/vehicle-data-platform/apps/web/src/pages/History.tsx index 30d740d7..96c4c999 100644 --- a/vehicle-data-platform/apps/web/src/pages/History.tsx +++ b/vehicle-data-platform/apps/web/src/pages/History.tsx @@ -32,7 +32,6 @@ type RawFieldRow = { }; const defaultFilters: HistoryFilters = { - keyword: 'LB9A32A24R0LS1426', includeFields: false }; @@ -55,6 +54,24 @@ function nextDate(value: string) { return date.toISOString().slice(0, 10); } +function todayDateString() { + const date = new Date(); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +} + +function previousDateString(value: string) { + const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value.trim()); + if (!match) return value; + const date = new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3]) - 1); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +} + function splitFields(value?: string) { return (value ?? '') .split(/[\n,]/) @@ -168,10 +185,24 @@ function analyzeTrajectoryAnomalies(rows: HistoryLocationRow[]): TrajectoryAnoma } function mergeInitialFilters(initialVin: string, initialProtocol?: string, initialFilters: Record = {}): HistoryFilters { - const hasExplicitFilters = Object.keys(initialFilters).length > 0; + const hasExplicitScope = Boolean( + initialVin?.trim() || + initialProtocol?.trim() || + initialFilters.keyword?.trim() || + initialFilters.protocol?.trim() || + initialFilters.dateFrom?.trim() || + initialFilters.dateTo?.trim() || + initialFilters.fields?.trim() + ); + const today = todayDateString(); + const defaultDateRange = hasExplicitScope ? {} : { + dateFrom: previousDateString(today), + dateTo: today + }; return { ...defaultFilters, - keyword: initialVin || (hasExplicitFilters ? '' : defaultFilters.keyword), + ...defaultDateRange, + keyword: initialVin || '', protocol: initialProtocol, ...initialFilters, includeFields: isIncludeFieldsEnabled(initialFilters.includeFields) @@ -1075,6 +1106,9 @@ export function History({ 面向车辆服务的历史数据检索入口。先按车辆和时间缩小范围,再导出位置、原始记录或字段明细,用于客户问询、BI 核对和问题追溯。 + + 默认查询最近一天,不预置任何车辆;输入 VIN、车牌或手机号后进入单车证据交付。 + 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 73e374ea..2c891550 100644 --- a/vehicle-data-platform/apps/web/src/test/App.test.tsx +++ b/vehicle-data-platform/apps/web/src/test/App.test.tsx @@ -204,6 +204,8 @@ test('exposes AMap operations shortcuts when map key is configured', async () => expect(window.location.hash.startsWith('#/history-query')).toBe(true); expect(new URLSearchParams(window.location.hash.split('?')[1] ?? '').get('tab')).toBe('raw'); expect(await screen.findByRole('heading', { name: '数据导出' })).toBeInTheDocument(); + expect(screen.getByText('默认查询最近一天,不预置任何车辆;输入 VIN、车牌或手机号后进入单车证据交付。')).toBeInTheDocument(); + expect(screen.queryByDisplayValue('LB9A32A24R0LS1426')).not.toBeInTheDocument(); fireEvent.click(screen.getByRole('button', { name: '顶部里程统计' })); expect(window.location.hash.startsWith('#/mileage')).toBe(true); fireEvent.click(await screen.findByRole('button', { name: '顶部告警事件正常' }));