This commit is contained in:
@@ -12,3 +12,7 @@ DB_PORT=3306
|
|||||||
DB_USER=
|
DB_USER=
|
||||||
DB_PASSWORD=
|
DB_PASSWORD=
|
||||||
DB_NAME=
|
DB_NAME=
|
||||||
|
# Local development uses the public OneOS endpoint; the ECS private IP is not reachable locally.
|
||||||
|
ONEOS_MILEAGE_API_BASE_URL=https://open.d.lnoneos.com
|
||||||
|
ONEOS_MILEAGE_API_KEY=
|
||||||
|
ONEOS_MILEAGE_API_TIMEOUT_MS=20000
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ export interface RangeMileageResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function fetchTargetRows(): Promise<TargetRow[]> {
|
async function fetchTargetRows(): Promise<TargetRow[]> {
|
||||||
return loadMonitoringTargetRows(pool).then(([rows]) => rows as TargetRow[]);
|
return loadMonitoringTargetRows(pool).then(rows => rows as unknown as TargetRow[]);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function refreshMonitoringCache(): Promise<void> {
|
export async function refreshMonitoringCache(): Promise<void> {
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import test from 'node:test';
|
||||||
|
import pool from '../../db/mysql.js';
|
||||||
|
import monitoring from './monitoring.js';
|
||||||
|
import { clearOneOsMileageCache } from './oneos-api.js';
|
||||||
|
|
||||||
|
test('single-day monitoring merges all target rows and handles an empty target table', async (t) => {
|
||||||
|
const previousUrl = process.env.ONEOS_MILEAGE_API_BASE_URL;
|
||||||
|
const previousKey = process.env.ONEOS_MILEAGE_API_KEY;
|
||||||
|
process.env.ONEOS_MILEAGE_API_BASE_URL = 'https://oneos.test';
|
||||||
|
process.env.ONEOS_MILEAGE_API_KEY = 'test-key';
|
||||||
|
t.after(() => {
|
||||||
|
if (previousUrl === undefined) delete process.env.ONEOS_MILEAGE_API_BASE_URL;
|
||||||
|
else process.env.ONEOS_MILEAGE_API_BASE_URL = previousUrl;
|
||||||
|
if (previousKey === undefined) delete process.env.ONEOS_MILEAGE_API_KEY;
|
||||||
|
else process.env.ONEOS_MILEAGE_API_KEY = previousKey;
|
||||||
|
clearOneOsMileageCache();
|
||||||
|
});
|
||||||
|
let targets = [
|
||||||
|
{ id: 1, target_name: '目标A', plate_number: '粤A10001' },
|
||||||
|
{ id: 2, target_name: '目标B', plate_number: '粤A10001' },
|
||||||
|
];
|
||||||
|
t.mock.method(pool, 'query', async (sql: string) => {
|
||||||
|
if (sql.includes('tab_mileage_assessment_target')) return [targets, []];
|
||||||
|
assert.ok(sql.includes('FROM vehicle_info vi'));
|
||||||
|
return [[{ plate: '粤A10001', vin: 'test-vin' }], []];
|
||||||
|
});
|
||||||
|
t.mock.method(globalThis, 'fetch', async (_url: unknown, init: RequestInit) => {
|
||||||
|
const { date } = JSON.parse(String(init.body));
|
||||||
|
return Response.json({ code: 'SUCCESS', data: [{
|
||||||
|
plateNumber: '粤A10001', date, status: 'NORMAL',
|
||||||
|
dailyMileageKm: 12, totalMileageKm: 100, sourceProtocol: 'GB32960',
|
||||||
|
}] });
|
||||||
|
});
|
||||||
|
for (const expectedTargets of [['目标A', '目标B'], []]) {
|
||||||
|
clearOneOsMileageCache();
|
||||||
|
const response = await monitoring.request('/?startDate=2026-09-16&endDate=2026-09-16&sourcePriority=instrument');
|
||||||
|
assert.equal(response.status, 200);
|
||||||
|
const payload = await response.json();
|
||||||
|
assert.equal(payload.total, 1);
|
||||||
|
assert.equal(payload.vehicles[0].dailyKm, 12);
|
||||||
|
assert.deepEqual(payload.vehicles[0].targetNames, expectedTargets);
|
||||||
|
targets = [];
|
||||||
|
}
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user