fix: BigScreen data display, carbon, energy history (v1.6.2)

BigScreen fixes:
- Fix NaN in 今日用电 (normalize energy_today structure)
- Fix 总设备=0 (compute from online+offline)
- Fix energy flow zeros (map total_load→total_power)
- Fix 今日发电=0 (extract from nested energy_today)

Backend fixes (synced from ems-core):
- Carbon overview fallback from energy_data × emission_factors
- Energy history: datetime parsing (was 500)
- Dashboard generation: station-level dedup (93K→14.8K kWh)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Du Wenbo
2026-04-11 09:56:23 +08:00
parent cbdf8f21c5
commit bd51997de1
8 changed files with 145 additions and 43 deletions

View File

@@ -32,13 +32,27 @@ async def query_history(
user: User = Depends(get_current_user),
):
"""历史数据查询"""
# Parse time strings to datetime for proper PostgreSQL timestamp comparison
start_dt = None
end_dt = None
if start_time:
try:
start_dt = datetime.fromisoformat(start_time)
except ValueError:
start_dt = datetime.strptime(start_time, "%Y-%m-%d")
if end_time:
try:
end_dt = datetime.fromisoformat(end_time)
except ValueError:
end_dt = datetime.strptime(end_time, "%Y-%m-%d").replace(hour=23, minute=59, second=59)
query = select(EnergyData).where(EnergyData.data_type == data_type)
if device_id:
query = query.where(EnergyData.device_id == device_id)
if start_time:
query = query.where(EnergyData.timestamp >= start_time)
if end_time:
query = query.where(EnergyData.timestamp <= end_time)
if start_dt:
query = query.where(EnergyData.timestamp >= start_dt)
if end_dt:
query = query.where(EnergyData.timestamp <= end_dt)
if granularity == "raw":
query = query.order_by(EnergyData.timestamp.desc()).offset((page - 1) * page_size).limit(page_size)
@@ -74,10 +88,10 @@ async def query_history(
).where(EnergyData.data_type == data_type)
if device_id:
agg_query = agg_query.where(EnergyData.device_id == device_id)
if start_time:
agg_query = agg_query.where(EnergyData.timestamp >= start_time)
if end_time:
agg_query = agg_query.where(EnergyData.timestamp <= end_time)
if start_dt:
agg_query = agg_query.where(EnergyData.timestamp >= start_dt)
if end_dt:
agg_query = agg_query.where(EnergyData.timestamp <= end_dt)
agg_query = agg_query.group_by(text('time_bucket')).order_by(text('time_bucket'))
result = await db.execute(agg_query)
return [{"time": str(r[0]), "avg": round(r[1], 2), "max": round(r[2], 2), "min": round(r[3], 2)}