84 lines
2.4 KiB
Python
84 lines
2.4 KiB
Python
|
|
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))
|