2026-05-05 19:49:12 +08:00
|
|
|
"""
|
|
|
|
|
降雨数据Repository - 数据访问层
|
|
|
|
|
"""
|
|
|
|
|
from typing import List, Dict, Any
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
from app.core.database import db_manager
|
|
|
|
|
from app.utils.logger import setup_logging
|
|
|
|
|
|
|
|
|
|
logger = setup_logging()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RainfallRepository:
|
|
|
|
|
"""降雨数据仓储类"""
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def query_stations_rainfall(
|
2026-05-06 13:07:58 +08:00
|
|
|
query_time: datetime,
|
|
|
|
|
duration: int = 12
|
2026-05-05 19:49:12 +08:00
|
|
|
) -> List[Dict[str, Any]]:
|
|
|
|
|
"""
|
2026-05-06 13:07:58 +08:00
|
|
|
查询指定时间的站点降雨数据(自动查询前12小时或24小时)
|
2026-05-05 19:49:12 +08:00
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
query_time: 查询时间
|
2026-05-06 13:07:58 +08:00
|
|
|
duration: 持续时间(12或24小时)
|
2026-05-05 19:49:12 +08:00
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
站点降雨数据列表
|
|
|
|
|
"""
|
2026-05-06 13:07:58 +08:00
|
|
|
sql = f"""
|
2026-05-05 19:49:12 +08:00
|
|
|
SELECT
|
2026-05-06 13:07:58 +08:00
|
|
|
lon,
|
|
|
|
|
lat,
|
|
|
|
|
SUM(rainfall_1h::numeric) AS rainfall
|
|
|
|
|
FROM xian_meteorology
|
|
|
|
|
WHERE datetime BETWEEN (
|
|
|
|
|
to_char(timestamp :query_time - interval '{duration} hours', 'YYYYMMDDHH24MISS')
|
2026-05-05 19:49:12 +08:00
|
|
|
)::bigint AND (
|
|
|
|
|
to_char(timestamp :query_time, 'YYYYMMDDHH24MISS')
|
|
|
|
|
)::bigint
|
2026-05-06 13:07:58 +08:00
|
|
|
GROUP BY lon, lat
|
2026-05-05 19:49:12 +08:00
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
params = {
|
|
|
|
|
"query_time": query_time
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
result = db_manager.execute_raw_sql(sql, params)
|
2026-05-06 13:07:58 +08:00
|
|
|
logger.info(f"查询到 {len(result)} 个站点数据({duration}小时)")
|
2026-05-05 19:49:12 +08:00
|
|
|
return result
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f"查询站点降雨数据失败: {e}")
|
|
|
|
|
raise
|