dzzh.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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'] = '暴雨预警'
  67. data['weather_warninglevel'] = '3'
  68. if history_time:
  69. real_code = get_real_code(db, data['longitude'], data['latitude'])
  70. rainfall = get_rainfall(real_code, history_time, db)
  71. data['rainfall'] = rainfall
  72. if future_time:
  73. data['rainfall'] = 0
  74. result_list.append(data)
  75. return {
  76. "code": 200,
  77. "msg": "操作成功",
  78. "data": result_list,
  79. "total": total,
  80. "page": page,
  81. "pageSize": pageSize,
  82. "totalPages": (total + pageSize - 1) // pageSize
  83. }
  84. except Exception as e:
  85. traceback.print_exc()
  86. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  87. @router.get("/info")
  88. async def get_info(
  89. id: str= Query(None),
  90. db: Session = Depends(get_db)
  91. ):
  92. try:
  93. # 构造基础查询
  94. base_sql = "SELECT * FROM sharedb.midmap_dzzh"
  95. # 添加 WHERE 条件
  96. conditions = []
  97. params = {}
  98. if id:
  99. conditions.append("id = :id")
  100. params['id'] = id
  101. else:
  102. return {
  103. "code": 200,
  104. "msg": "操作成功",
  105. "data": None
  106. }
  107. if conditions:
  108. base_sql += " WHERE " + " AND ".join(conditions)
  109. # 构造查询对象
  110. paginated_query = text(base_sql)#.bindparams(**params)#.limit(pageSize).offset(offset)
  111. # 执行分页查询并获取结果
  112. result = db.execute(paginated_query,params).fetchone()
  113. data = dict(result)
  114. return {
  115. "code": 200,
  116. "msg": "操作成功",
  117. "data": data
  118. }
  119. except Exception as e:
  120. traceback.print_exc()
  121. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")