49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
import { Hono } from 'hono';
|
|
import pool from '../../db.js';
|
|
import mileagePool from '../../mileage-db.js';
|
|
|
|
const app = new Hono();
|
|
|
|
app.get('/', async (c) => {
|
|
const targetId = c.req.query('targetId');
|
|
const days = Number(c.req.query('days')) || 7;
|
|
|
|
try {
|
|
let plates: string[] = [];
|
|
if (targetId) {
|
|
const [vehicleRows] = await pool.execute(
|
|
'SELECT plate_number FROM tab_mileage_assessment_vehicle WHERE target_id = ? AND is_deleted = 0',
|
|
[targetId]
|
|
) as [{ plate_number: string }[], unknown];
|
|
plates = vehicleRows.map(r => r.plate_number);
|
|
if (plates.length === 0) return c.json([]);
|
|
}
|
|
|
|
let sql = `
|
|
SELECT DATE_FORMAT(stat_date, '%m-%d') as date, SUM(daily_km) as mileage
|
|
FROM v_vehicle_daily_stats
|
|
WHERE stat_date >= DATE_SUB(CURDATE(), INTERVAL ? DAY) AND stat_date < CURDATE()
|
|
`;
|
|
const params: (string | number)[] = [days];
|
|
|
|
if (plates.length > 0) {
|
|
sql += ` AND plate IN (${plates.map(() => '?').join(',')})`;
|
|
params.push(...plates);
|
|
}
|
|
|
|
sql += ' GROUP BY stat_date ORDER BY stat_date';
|
|
|
|
const [rows] = await mileagePool.execute(sql, params) as [any[], unknown];
|
|
|
|
return c.json(rows.map((r: any) => ({
|
|
date: r.date,
|
|
mileage: Math.round(Number(r.mileage) || 0),
|
|
})));
|
|
} catch (e: unknown) {
|
|
console.error('trend error:', e);
|
|
return c.json([], 500);
|
|
}
|
|
});
|
|
|
|
export default app;
|