修复整段缺报车辆的累计里程展示
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
shishengliang
2026-11-03 10:07:40 +08:00
parent 12324006db
commit 5486d71161
3 changed files with 19 additions and 7 deletions
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "ln-bi", "name": "ln-bi",
"version": "1.1.23", "version": "1.1.24",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ln-bi", "name": "ln-bi",
"version": "1.1.23", "version": "1.1.24",
"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 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "ln-bi", "name": "ln-bi",
"private": true, "private": true,
"version": "1.1.23", "version": "1.1.24",
"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\"",
+16 -4
View File
@@ -21,12 +21,24 @@ async function loadSource(start: string, end: string, protocols: OneOsProtocol[]
plates ? Promise.resolve([]) : fetchOneOsDailyMileage(previousMileageDate(start), undefined, protocols, refresh), plates ? Promise.resolve([]) : fetchOneOsDailyMileage(previousMileageDate(start), undefined, protocols, refresh),
]); ]);
// Plate-scoped summary requests are used only for filtered trends. // Plate-scoped summary requests are used only for filtered trends.
if (plates || start === end) return { summary, yesterdayRows }; if (plates) return { summary, yesterdayRows };
const missing = summary.vehicles.filter(v => v.endDateTotalMileageKm === null && v.validDays + v.anomalyDays > 0); const missing = summary.vehicles.filter(v => v.endDateTotalMileageKm === null);
if (!missing.length) return { summary, yesterdayRows }; if (!missing.length) return { summary, yesterdayRows };
const dates = mileageDatesBetween(start, previousMileageDate(end));
const history = await fetchOneOsMileageDates(dates, missing.map(v => v.plateNumber), protocols);
const priorOdometers = new Map<string, { date: string; km: number }>(); const priorOdometers = new Map<string, { date: string; km: number }>();
const endRows = await fetchOneOsDailyMileage(end, missing.map(v => v.plateNumber), protocols, refresh);
const observationDate = new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Shanghai' });
for (const row of endRows) {
if (row.status !== 'NORMAL' || row.dataQuality !== 'CARRIED_FORWARD' || row.totalMileageKm == null || !row.dataTime) continue;
// OneOS observation timestamps include the Shanghai offset, even for older carried readings.
const time = Date.parse(row.dataTime);
if (!Number.isFinite(time)) continue;
const date = observationDate.format(time);
if (date <= end) priorOdometers.set(row.plateNumber.toUpperCase(), { date, km: row.totalMileageKm });
}
const unresolved = missing.filter(v => !priorOdometers.has(v.plateNumber) && v.validDays + v.anomalyDays > 0);
if (start === end || !unresolved.length) return { summary, yesterdayRows, priorOdometers };
const dates = mileageDatesBetween(start, previousMileageDate(end));
const history = await fetchOneOsMileageDates(dates, unresolved.map(v => v.plateNumber), protocols);
for (const date of dates.reverse()) { for (const date of dates.reverse()) {
for (const row of history.get(date) || []) { for (const row of history.get(date) || []) {
const plate = row.plateNumber.toUpperCase(); const plate = row.plateNumber.toUpperCase();