The "每 5 分钟更新" copy was inherited from the BI dashboard mock and
no longer matches reality — server cache is 60s TTL.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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>
- mock: derive ELECTRIC_KPI month/today from APR_DAYS so card and table
totals always agree (previously ¥8,437 vs ¥9,151 mismatch)
- overview: Top5 bar chart now shows rank badges (1-5) and inline value
labels at bar ends — readable without hover
- overview: donut "年合计 362.43T" moves into the chart center
(previously below as a separate line, defeating the donut hole)
- daily: rows with |chainPct| ≥ 30% get a tinted background
(green for spikes, red for drops) for at-a-glance abnormal-day spotting
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>