2 Commits

Author SHA1 Message Date
kkfluous
becacecc67 chore: release v1.1.11
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2026-07-23 12:29:29 +08:00
kkfluous
67f3ec7306 perf(mileage): filter single-vehicle range queries 2026-07-23 12:27:23 +08:00
4 changed files with 16 additions and 7 deletions

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "ln-bi",
"version": "1.1.10",
"version": "1.1.11",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ln-bi",
"version": "1.1.10",
"version": "1.1.11",
"dependencies": {
"@amap/amap-jsapi-loader": "^1.0.1",
"@hono/node-server": "^1.13.0",

View File

@@ -1,7 +1,7 @@
{
"name": "ln-bi",
"private": true,
"version": "1.1.10",
"version": "1.1.11",
"type": "module",
"scripts": {
"dev": "concurrently -n server,client -c blue,green \"npm run dev:server\" \"npm run dev:client\"",

View File

@@ -171,7 +171,11 @@ async function requestDate(date: string): Promise<OneOsDailyMileage[]> {
throw lastError instanceof Error ? lastError : new Error('OneOS mileage API request failed');
}
async function requestRange(startDate: string, endDate: string): Promise<Map<string, OneOsDailyMileage[]>> {
async function requestRange(
startDate: string,
endDate: string,
plateNumbers: string[],
): Promise<Map<string, OneOsDailyMileage[]>> {
const { baseUrl, apiKey, timeoutMs } = apiConfig();
const allRows: unknown[] = [];
const seenCursors = new Set<string>();
@@ -188,6 +192,7 @@ async function requestRange(startDate: string, endDate: string): Promise<Map<str
endDate,
pageSize: RANGE_PAGE_SIZE,
};
if (plateNumbers.length > 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<Map<string, OneOsDailyMileage[]>> {
const result = new Map<string, OneOsDailyMileage[]>();
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;

View File

@@ -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 }[] = [];