feat(energy): connect to real DB (lingniu_prod)
Replace front-end mock data with live API backed by: - tab_energy_hydrogen_bill (66.5K rows) joined with tab_hydrogen_site (internal stations) and tab_outside_hydrogen_site (external stations, joined via inner_site_id) - tab_energy_electricity_bill (4.4K rows, all 龙王路充电站) New server routes (src/server/routes/energy/): - GET /api/energy/hydrogen/overview → KPI + Top5 站点 + 区域占比 - GET /api/energy/hydrogen/daily?range=&customer= → 日级 + 站点级下钻 - GET /api/energy/electric/overview → KPI + 本月柱图 (fallback to last available month if current month has no data) - GET /api/energy/electric/monthly?customer= → 6 个月分组日级表 Business rules encoded server-side: - 客户类型: customer_id IS NULL = 羚牛承担, NOT NULL = 外部 - 时区: DATETIME 列字面值是 UTC,分组前 +8h 转成 CST - 数据清理: hydrogen_time >= 2024-01-01 (排除 1900 年脏数据) - 站点名 fallback: short_name → name → fixed_station_name → station_name → '未知站点' - 区域归一化: SUBSTRING_INDEX(city, '-', -1) 取最后一段,去掉 '省'/'市' 让 '四川省-成都市' 和 '成都市' 合并为 '成都' Component changes: - All 4 components (HydrogenOverview, HydrogenDaily, ElectricOverview, ElectricDaily) now use useEffect + fetch with loading/error states - HydrogenDaily filtering moved to server (range + customer params) → drops client-side TODAY constant + isInPick switch - ElectricOverview chart title is dynamic: shows 'YYYY-MM 每日充电' when fallback kicks in (current month has no data) - mock.ts deleted Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,7 @@ import dotenv from 'dotenv';
|
||||
import vehiclesRouter from './routes/vehicles.js';
|
||||
import mileageRouter from './routes/mileage/index.js';
|
||||
import schedulingRouter from './routes/scheduling/index.js';
|
||||
import energyRouter from './routes/energy/index.js';
|
||||
import { ensureSchedulingTables } from './routes/scheduling/db-schema.js';
|
||||
import authRouter from './auth/login.js';
|
||||
import { authMiddleware } from './auth/middleware.js';
|
||||
@@ -25,6 +26,7 @@ app.use('/api/*', authMiddleware);
|
||||
app.route('/api/vehicles', vehiclesRouter);
|
||||
app.route('/api/mileage', mileageRouter);
|
||||
app.route('/api/scheduling', schedulingRouter);
|
||||
app.route('/api/energy', energyRouter);
|
||||
|
||||
app.get('/api/health', (c) => c.json({ status: 'ok', time: new Date().toISOString() }));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user