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 lingniu_prod.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([]); } // 单车日里程负值视为脏数据(里程表回滚 / 换 GPS 设备),不纳入统计 let sql = ` SELECT DATE_FORMAT(stat_date, '%m-%d') as date, SUM(IF(daily_km < 0, 0, 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;