ems-core v1.0.0: Standard EMS platform core
Shared backend + frontend for multi-customer EMS deployments. - 12 enterprise modules: quota, cost, charging, maintenance, analysis, etc. - 120+ API endpoints, 37 database tables - Customer config mechanism (CUSTOMER env var + YAML config) - Collectors: Modbus TCP, MQTT, HTTP API, Sungrow iSolarCloud - Frontend: React 19 + Ant Design + ECharts + Three.js - Infrastructure: Redis cache, rate limiting, aggregation engine Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
83
backend/app/api/v1/weather.py
Normal file
83
backend/app/api/v1/weather.py
Normal file
@@ -0,0 +1,83 @@
|
||||
from datetime import datetime
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from pydantic import BaseModel
|
||||
from app.core.database import get_db
|
||||
from app.core.deps import get_current_user
|
||||
from app.models.user import User
|
||||
from app.services.weather_service import (
|
||||
get_current_weather, get_forecast, get_weather_history,
|
||||
get_weather_impact, get_weather_config, update_weather_config,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/weather", tags=["气象数据"])
|
||||
|
||||
|
||||
class WeatherConfigUpdate(BaseModel):
|
||||
api_provider: str | None = None
|
||||
api_key: str | None = None
|
||||
location_lat: float | None = None
|
||||
location_lon: float | None = None
|
||||
fetch_interval_minutes: int | None = None
|
||||
is_enabled: bool | None = None
|
||||
|
||||
|
||||
@router.get("/current")
|
||||
async def current_weather(
|
||||
db: AsyncSession = Depends(get_db),
|
||||
user: User = Depends(get_current_user),
|
||||
):
|
||||
"""获取当前天气"""
|
||||
return await get_current_weather(db)
|
||||
|
||||
|
||||
@router.get("/forecast")
|
||||
async def weather_forecast(
|
||||
hours: int = Query(default=72, ge=1, le=168),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
user: User = Depends(get_current_user),
|
||||
):
|
||||
"""获取72h天气预报"""
|
||||
return await get_forecast(db, hours)
|
||||
|
||||
|
||||
@router.get("/history")
|
||||
async def weather_history(
|
||||
start_date: str = Query(..., description="开始日期 e.g. 2026-03-01"),
|
||||
end_date: str = Query(..., description="结束日期 e.g. 2026-04-01"),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
user: User = Depends(get_current_user),
|
||||
):
|
||||
"""获取历史天气数据"""
|
||||
start = datetime.fromisoformat(start_date)
|
||||
end = datetime.fromisoformat(end_date)
|
||||
return await get_weather_history(db, start, end)
|
||||
|
||||
|
||||
@router.get("/impact")
|
||||
async def weather_impact(
|
||||
days: int = Query(default=30, ge=1, le=365),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
user: User = Depends(get_current_user),
|
||||
):
|
||||
"""天气对能源的影响分析"""
|
||||
return await get_weather_impact(db, days)
|
||||
|
||||
|
||||
@router.get("/config")
|
||||
async def get_config(
|
||||
db: AsyncSession = Depends(get_db),
|
||||
user: User = Depends(get_current_user),
|
||||
):
|
||||
"""获取气象API配置"""
|
||||
return await get_weather_config(db)
|
||||
|
||||
|
||||
@router.put("/config")
|
||||
async def set_config(
|
||||
data: WeatherConfigUpdate,
|
||||
db: AsyncSession = Depends(get_db),
|
||||
user: User = Depends(get_current_user),
|
||||
):
|
||||
"""更新气象API配置"""
|
||||
return await update_weather_config(db, data.model_dump(exclude_none=True))
|
||||
Reference in New Issue
Block a user