dzzh.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends, Query, HTTPException, status
  4. from common.security import valid_access_token
  5. from sqlalchemy.orm import Session
  6. from sqlalchemy.sql import func
  7. from common.auth_user import *
  8. from sqlalchemy import text
  9. from pydantic import BaseModel
  10. from common.BigDataCenterAPI import *
  11. from database import get_db
  12. from typing import List
  13. from models import *
  14. from utils import *
  15. from utils.spatial import *
  16. from utils.rainfall_util import *
  17. import json
  18. import traceback
  19. from jobs.rainfall_conditions_job import get_stcd_data
  20. from datetime import datetime,timedelta
  21. router = APIRouter()
  22. @router.get("/list")
  23. async def get_list(
  24. area_name: str= Query(None),
  25. history_time:int = Query(None),
  26. future_time:int = Query(None),
  27. db: Session = Depends(get_db),
  28. page: int = Query(1, gt=0, description='页码'),
  29. pageSize: int = Query(10, gt=0, description='每页条目数量')
  30. ):
  31. try:
  32. # 计算 OFFSET 值
  33. offset = (page - 1) * pageSize
  34. # 构造基础查询
  35. base_query = text("SELECT * FROM sharedb.midmap_dzzh")
  36. if area_name:
  37. base_query = base_query.bindparams(area_name=area_name).where(text("area = :area_name"))
  38. # 构造分页查询
  39. paginated_query = f"{base_query} LIMIT :limit OFFSET :offset"
  40. paginated_query = text(paginated_query).bindparams(limit=pageSize, offset=offset)
  41. # 构造统计总数据量的查询
  42. count_query = select(func.count()).select_from(text("sharedb.midmap_dzzh"))
  43. if area_name:
  44. count_query = count_query.where(text("area = :area_name")).bindparams(area_name=area_name)
  45. # 执行统计查询并获取总数据量
  46. total = db.execute(count_query).scalar()
  47. # 执行分页查询并获取结果
  48. result = db.execute(paginated_query).fetchall()
  49. # 将结果转换为rain_pits.py字典列表
  50. result_list = []
  51. for row in result:
  52. data = dict(row)
  53. if history_time:
  54. real_code = get_real_code(db, data['longitude'], data['latitude'])
  55. rainfall = get_rainfall(real_code, history_time, db)
  56. data['rainfall'] = rainfall
  57. if future_time:
  58. data['rainfall'] = 0
  59. result_list.append(data)
  60. return {
  61. "code": 200,
  62. "msg": "操作成功",
  63. "data": result_list,
  64. "total": total,
  65. "page": page,
  66. "pageSize": pageSize,
  67. "totalPages": (total + pageSize - 1) // pageSize
  68. }
  69. except Exception as e:
  70. traceback.print_exc()
  71. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")