From 890050ed55b285d083493182de45b2aadc4e4b9e Mon Sep 17 00:00:00 2001 From: kkfluous Date: Thu, 2 Apr 2026 13:33:05 +0800 Subject: [PATCH] refactor: create trend route handler --- src/server/routes/mileage/trend.ts | 48 ++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/server/routes/mileage/trend.ts diff --git a/src/server/routes/mileage/trend.ts b/src/server/routes/mileage/trend.ts new file mode 100644 index 0000000..dde16ab --- /dev/null +++ b/src/server/routes/mileage/trend.ts @@ -0,0 +1,48 @@ +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;