From 67f3ec7306dae671044fa54c2017e9b5f57873d6 Mon Sep 17 00:00:00 2001 From: kkfluous Date: Thu, 23 Jul 2026 12:27:23 +0800 Subject: [PATCH] perf(mileage): filter single-vehicle range queries --- src/server/routes/mileage/oneos-api.ts | 15 ++++++++++++--- src/server/routes/mileage/vehicle-recent.ts | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/server/routes/mileage/oneos-api.ts b/src/server/routes/mileage/oneos-api.ts index 8158ebd..c607899 100644 --- a/src/server/routes/mileage/oneos-api.ts +++ b/src/server/routes/mileage/oneos-api.ts @@ -171,7 +171,11 @@ async function requestDate(date: string): Promise { throw lastError instanceof Error ? lastError : new Error('OneOS mileage API request failed'); } -async function requestRange(startDate: string, endDate: string): Promise> { +async function requestRange( + startDate: string, + endDate: string, + plateNumbers: string[], +): Promise> { const { baseUrl, apiKey, timeoutMs } = apiConfig(); const allRows: unknown[] = []; const seenCursors = new Set(); @@ -188,6 +192,7 @@ async function requestRange(startDate: string, endDate: string): Promise 0) body.plateNumbers = plateNumbers; if (cursor) body.cursor = cursor; const response = await fetch(`${baseUrl}${RANGE_ENDPOINT}`, { method: 'POST', @@ -278,9 +283,13 @@ export async function fetchOneOsDailyMileage( export async function fetchOneOsMileageDates( dates: string[], + plateNumbers?: string[], ): Promise> { const result = new Map(); const uniqueDates = Array.from(new Set(dates)).sort(); + const selectedPlates = Array.from(new Set( + (plateNumbers || []).map(plate => plate.trim()).filter(Boolean), + )).sort(); if (uniqueDates.length === 0) return result; for (const date of uniqueDates) { if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) throw new Error(`Invalid mileage date: ${date}`); @@ -303,10 +312,10 @@ export async function fetchOneOsMileageDates( await Promise.all(groups.map(async group => { const startDate = group[0]; const endDate = group[group.length - 1]; - const key = `${startDate}:${endDate}`; + const key = `${startDate}:${endDate}:${selectedPlates.length > 0 ? selectedPlates.join('\u0000') : '*'}`; let pending = rangeInflight.get(key); if (!pending) { - pending = requestRange(startDate, endDate).finally(() => rangeInflight.delete(key)); + pending = requestRange(startDate, endDate, selectedPlates).finally(() => rangeInflight.delete(key)); rangeInflight.set(key, pending); } const rowsByDate = await pending; diff --git a/src/server/routes/mileage/vehicle-recent.ts b/src/server/routes/mileage/vehicle-recent.ts index 22f72a5..9f8a8f4 100644 --- a/src/server/routes/mileage/vehicle-recent.ts +++ b/src/server/routes/mileage/vehicle-recent.ts @@ -58,7 +58,7 @@ app.get('/:plate/recent', async (c) => { dates.push(fmt(dateCursor)); dateCursor.setDate(dateCursor.getDate() + 1); } - const rowsByDate = await fetchOneOsMileageDates(dates); + const rowsByDate = await fetchOneOsMileageDates(dates, [plate]); // 补全:从 start 到 end 每天一条 const result: { date: string; dailyKm: number; isDataSynced: boolean }[] = [];