Compare commits
2 Commits
3f29bed5fa
...
becacecc67
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
becacecc67 | ||
|
|
67f3ec7306 |
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "ln-bi",
|
"name": "ln-bi",
|
||||||
"version": "1.1.10",
|
"version": "1.1.11",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "ln-bi",
|
"name": "ln-bi",
|
||||||
"version": "1.1.10",
|
"version": "1.1.11",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@amap/amap-jsapi-loader": "^1.0.1",
|
"@amap/amap-jsapi-loader": "^1.0.1",
|
||||||
"@hono/node-server": "^1.13.0",
|
"@hono/node-server": "^1.13.0",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ln-bi",
|
"name": "ln-bi",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.1.10",
|
"version": "1.1.11",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "concurrently -n server,client -c blue,green \"npm run dev:server\" \"npm run dev:client\"",
|
"dev": "concurrently -n server,client -c blue,green \"npm run dev:server\" \"npm run dev:client\"",
|
||||||
|
|||||||
@@ -171,7 +171,11 @@ async function requestDate(date: string): Promise<OneOsDailyMileage[]> {
|
|||||||
throw lastError instanceof Error ? lastError : new Error('OneOS mileage API request failed');
|
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 { baseUrl, apiKey, timeoutMs } = apiConfig();
|
||||||
const allRows: unknown[] = [];
|
const allRows: unknown[] = [];
|
||||||
const seenCursors = new Set<string>();
|
const seenCursors = new Set<string>();
|
||||||
@@ -188,6 +192,7 @@ async function requestRange(startDate: string, endDate: string): Promise<Map<str
|
|||||||
endDate,
|
endDate,
|
||||||
pageSize: RANGE_PAGE_SIZE,
|
pageSize: RANGE_PAGE_SIZE,
|
||||||
};
|
};
|
||||||
|
if (plateNumbers.length > 0) body.plateNumbers = plateNumbers;
|
||||||
if (cursor) body.cursor = cursor;
|
if (cursor) body.cursor = cursor;
|
||||||
const response = await fetch(`${baseUrl}${RANGE_ENDPOINT}`, {
|
const response = await fetch(`${baseUrl}${RANGE_ENDPOINT}`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@@ -278,9 +283,13 @@ export async function fetchOneOsDailyMileage(
|
|||||||
|
|
||||||
export async function fetchOneOsMileageDates(
|
export async function fetchOneOsMileageDates(
|
||||||
dates: string[],
|
dates: string[],
|
||||||
|
plateNumbers?: string[],
|
||||||
): Promise<Map<string, OneOsDailyMileage[]>> {
|
): Promise<Map<string, OneOsDailyMileage[]>> {
|
||||||
const result = new Map<string, OneOsDailyMileage[]>();
|
const result = new Map<string, OneOsDailyMileage[]>();
|
||||||
const uniqueDates = Array.from(new Set(dates)).sort();
|
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;
|
if (uniqueDates.length === 0) return result;
|
||||||
for (const date of uniqueDates) {
|
for (const date of uniqueDates) {
|
||||||
if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) throw new Error(`Invalid mileage date: ${date}`);
|
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 => {
|
await Promise.all(groups.map(async group => {
|
||||||
const startDate = group[0];
|
const startDate = group[0];
|
||||||
const endDate = group[group.length - 1];
|
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);
|
let pending = rangeInflight.get(key);
|
||||||
if (!pending) {
|
if (!pending) {
|
||||||
pending = requestRange(startDate, endDate).finally(() => rangeInflight.delete(key));
|
pending = requestRange(startDate, endDate, selectedPlates).finally(() => rangeInflight.delete(key));
|
||||||
rangeInflight.set(key, pending);
|
rangeInflight.set(key, pending);
|
||||||
}
|
}
|
||||||
const rowsByDate = await pending;
|
const rowsByDate = await pending;
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ app.get('/:plate/recent', async (c) => {
|
|||||||
dates.push(fmt(dateCursor));
|
dates.push(fmt(dateCursor));
|
||||||
dateCursor.setDate(dateCursor.getDate() + 1);
|
dateCursor.setDate(dateCursor.getDate() + 1);
|
||||||
}
|
}
|
||||||
const rowsByDate = await fetchOneOsMileageDates(dates);
|
const rowsByDate = await fetchOneOsMileageDates(dates, [plate]);
|
||||||
|
|
||||||
// 补全:从 start 到 end 每天一条
|
// 补全:从 start 到 end 每天一条
|
||||||
const result: { date: string; dailyKm: number; isDataSynced: boolean }[] = [];
|
const result: { date: string; dailyKm: number; isDataSynced: boolean }[] = [];
|
||||||
|
|||||||
Reference in New Issue
Block a user