dzzh.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. keyword: str= Query(None),
  26. history_time:int = Query(None),
  27. future_time:int = Query(None),
  28. db: Session = Depends(get_db),
  29. page: int = Query(1, gt=0, description='页码'),
  30. pageSize: int = Query(10, gt=0, description='每页条目数量')
  31. ):
  32. try:
  33. # 计算 OFFSET 值
  34. offset = (page - 1) * pageSize
  35. # 构造基础查询
  36. base_sql = "SELECT * FROM sharedb.midmap_dzzh"
  37. count_sql = "SELECT COUNT(*) FROM sharedb.midmap_dzzh"
  38. # 添加 WHERE 条件
  39. conditions = []
  40. params = {}
  41. if area_name:
  42. conditions.append("area = :area_name")
  43. params['area_name'] = area_name
  44. if keyword:
  45. conditions.append("`address` LIKE :keyword")
  46. params['keyword'] = f"%{keyword}%"
  47. if conditions:
  48. base_sql += " WHERE " + " AND ".join(conditions)
  49. count_sql += " WHERE " + " AND ".join(conditions)
  50. # 构造查询对象
  51. count_query = text(count_sql)#.bindparams(**params)
  52. # 添加 LIMIT 和 OFFSET
  53. # paginated_sql = base_sql
  54. paginated_sql = f"{base_sql} LIMIT :limit OFFSET :offset"
  55. params['limit'] = pageSize
  56. params['offset'] = offset
  57. paginated_query = text(paginated_sql)#.bindparams(**params)#.limit(pageSize).offset(offset)
  58. # 执行统计查询并获取总数据量
  59. total = db.execute(count_query,params).scalar()
  60. # 执行分页查询并获取结果
  61. result = db.execute(paginated_query,params).fetchall()
  62. # 将结果转换为rain_pits.py字典列表
  63. result_list = []
  64. for row in result:
  65. data = dict(row)
  66. data['weather_warning_type'],data['weather_warninglevel'] = get_weather_warning(data['area'], db)
  67. # data['weather_warning_type'] = '暴雨预警'
  68. # data['weather_warninglevel'] = '3'
  69. if history_time:
  70. real_code = get_real_code(db, data['longitude'], data['latitude'])
  71. rainfall = get_rainfall(real_code, history_time, db)
  72. data['rainfall'] = rainfall
  73. if future_time:
  74. data['rainfall'] = 0
  75. result_list.append(data)
  76. return {
  77. "code": 200,
  78. "msg": "操作成功",
  79. "data": result_list,
  80. "total": total,
  81. "page": page,
  82. "pageSize": pageSize,
  83. "totalPages": (total + pageSize - 1) // pageSize
  84. }
  85. except Exception as e:
  86. traceback.print_exc()
  87. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  88. @router.get("/info")
  89. async def get_info(
  90. id: str= Query(None),
  91. db: Session = Depends(get_db)
  92. ):
  93. try:
  94. # 构造基础查询
  95. base_sql = "SELECT * FROM sharedb.midmap_dzzh"
  96. # 添加 WHERE 条件
  97. conditions = []
  98. params = {}
  99. if id:
  100. conditions.append("id = :id")
  101. params['id'] = id
  102. else:
  103. return {
  104. "code": 200,
  105. "msg": "操作成功",
  106. "data": None
  107. }
  108. if conditions:
  109. base_sql += " WHERE " + " AND ".join(conditions)
  110. # 构造查询对象
  111. paginated_query = text(base_sql)#.bindparams(**params)#.limit(pageSize).offset(offset)
  112. # 执行分页查询并获取结果
  113. result = db.execute(paginated_query,params).fetchone()
  114. data = dict(result)
  115. return {
  116. "code": 200,
  117. "msg": "操作成功",
  118. "data": data
  119. }
  120. except Exception as e:
  121. traceback.print_exc()
  122. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")