baoyubo пре 1 недеља
родитељ
комит
5354487409
2 измењених фајлова са 119 додато и 1 уклоњено
  1. 3 1
      routers/api/rainfall/__init__.py
  2. 116 0
      routers/api/rainfall/windspeed.py

+ 3 - 1
routers/api/rainfall/__init__.py

@@ -23,11 +23,13 @@ from datetime import datetime,timedelta
 from .rain_pits import router as rain_pits_router
 from .dzzh import router as dzzh_router
 from .chemical_company import router as chemical_company_router
+from .windspeed import router as windspeed_router
 
 router = APIRouter()
 router.include_router(rain_pits_router, prefix="/rain_pits")
 router.include_router(dzzh_router, prefix="/dzzh")
 router.include_router(chemical_company_router, prefix="/chemical_company")
+router.include_router(windspeed_router, prefix="/windspeed")
 
 @router.get("/info/{code}")
 async def get_pattern_info(
@@ -114,7 +116,7 @@ async def get_inspection_task_list(
     user_id = Depends(valid_access_token)
 ):
     try:
-        sql=f"""SELECT ROW_NUMBER() OVER ( ORDER BY T2.rainfall {sort}) AS `序号`,T1.area as `区县`,T1.township as `镇街`,T1.address as `站点地`,T1.area_name as `站点名称`,T2.rainfall as `雨量`,T1.`code` as `站点编号`  FROM sharedb.govdata_real_time_address T1 LEFT JOIN (select `latest_data`.`code` AS `code`,sum(`latest_data`.`rainfall`) AS `rainfall` from (select `govdata_rain_data_info`.`code` AS `code`,`govdata_rain_data_info`.`area_name` AS `area_name`,`govdata_rain_data_info`.`address` AS `address`,`govdata_rain_data_info`.`create_time` AS `create_time`,`govdata_rain_data_info`.`rainfall` AS `rainfall`,`govdata_rain_data_info`.`update_time` AS `update_time`,row_number() OVER (PARTITION BY `govdata_rain_data_info`.`code` ORDER BY `govdata_rain_data_info`.`create_time` desc )  AS `rn` from sharedb.`govdata_rain_data_info`) `latest_data` where ((`latest_data`.`rn` <= '{timeOption}') and `latest_data`.`code` in (select `govdata_real_time_address`.`code` from sharedb.`govdata_real_time_address`)) group by `latest_data`.`code` order by `rainfall` desc) T2 on T1.code=T2.code where CASE 
+        sql=f"""SELECT ROW_NUMBER() OVER ( ORDER BY T2.rainfall {sort}) AS `序号`,T1.area as `区县`,T1.township as `镇街`,T1.address as `站点地`,T1.area_name as `站点名称`,T2.rainfall as `雨量`,T1.`code` as `站点编号`  FROM sharedb.govdata_real_time_address T1 LEFT JOIN (select `latest_data`.`code` AS `code`,sum(`latest_data`.`rainfall`) AS `rainfall` from (select `govdata_rain_data_info`.`code` AS `code`,`govdata_rain_data_info`.`area_name` AS `area_name`,`govdata_rain_data_info`.`address` AS `address`,`govdata_rain_data_info`.`create_time` AS `create_time`,`govdata_rain_data_info`.`rainfall` AS `rainfall`,`govdata_rain_data_info`.`update_time` AS `update_time`,row_number() OVER (PARTITION BY `govdata_rain_data_info`.`code` ORDER BY `govdata_rain_data_info`.`create_time` desc )  AS `rn` from sharedb.`govdata_rain_data_info`) `latest_data` where ((`latest_data`.`rn` <= '{timeOption}') and `latest_data`.`code` in (select `govdata_real_time_address`.`code` from sharedb.`govdata_real_time_address`)) group by `latest_data`.`code` order by `rainfall` desc) T2 on T1.code=T2.code where CASE 
 	WHEN '{area}'<>'' THEN
 		T1.area='{area}'
 	ELSE

+ 116 - 0
routers/api/rainfall/windspeed.py

@@ -0,0 +1,116 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from fastapi import APIRouter, Request, Depends, Query, HTTPException, status
+from fastapi.responses import JSONResponse,StreamingResponse
+from common.db import db_czrz
+from common.security import valid_access_token
+from sqlalchemy.orm import Session
+from sqlalchemy.sql import func
+from common.auth_user import *
+from sqlalchemy import  text
+from pydantic import BaseModel
+from common.BigDataCenterAPI import *
+from database import get_db
+from typing import List
+from models import *
+from utils import *
+from utils.spatial import *
+import json
+import traceback
+from datetime import datetime,timedelta
+
+router = APIRouter()
+@router.get('/get_windspeed_range/export')
+async def get_inspection_task_list(
+        request: Request,
+        sort: str = Query('desc'),
+        timeOption: str = Query('24'),
+        area: str = Query(''),
+        township: str = Query(''),
+        db: Session = Depends(get_db),
+        auth_user: AuthUser = Depends(find_auth_user),
+    user_id = Depends(valid_access_token)
+):
+    try:
+        sql=f"""SELECT row_number() OVER (PARTITION BY cn ORDER BY `T1`.`create_time` {sort} ) as `序号`,T2.area as `区县`,T2.township as `镇街`,T2.address as `站点地址`,T1.windspeed as `风速`,T1.windlevel as `风速等级`,T2.longitude as `站点经度`,T2.latitude as `站点纬度`,T1.`code` as `站点编号`,T1.create_time as `测速时间` FROM (SELECT *,row_number() OVER (PARTITION BY `govdata_wind_speed_data_info`.`code` ORDER BY `govdata_wind_speed_data_info`.`windspeed` {sort} )as cn FROM sharedb.`govdata_wind_speed_data_info`
+where create_time>= NOW() - INTERVAL {timeOption} HOUR and IF('{area}'='',1=1,area_name='{area}') )T1 LEFT JOIN sharedb.govdata_wind_stand_address T2 on T1.`code`=T2.`code` and IF('{township}'='',1=1,T2.township='{township}') ORDER BY `T1`.`create_time` {sort}"""
+        da = db.execute(sql).fetchall()
+        outlist = [dict(row) for row in da]
+        # 返回结果
+        import pandas as pd
+        from io import BytesIO
+        # 将查询结果转换为 DataFrame
+        df = pd.DataFrame(outlist)
+
+        # 将 DataFrame 导出为 Excel 文件
+        output = BytesIO()
+        with pd.ExcelWriter(output, engine='openpyxl') as writer:
+            df.to_excel(writer, index=False)
+
+        # 设置响应头
+        output.seek(0)
+        from urllib.parse import quote
+        encoded_filename = f'风速监测导出{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
+        encoded_filename = quote(encoded_filename, encoding='utf-8')
+        headers = {
+            'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
+            'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
+        }
+
+        db_czrz.log(db, auth_user, "大风监测", f"风速导出数据成功", request.client.host)
+
+        # 返回文件流
+        return StreamingResponse(output, headers=headers)
+    except Exception as e:
+        # 处理异常
+        traceback.print_exc()
+        return JSONResponse(status_code=500, content={"code": 500, "msg": f"Internal server error: {str(e)}"})
+
+@router.post('/windspeed_warrning')
+async def mine(request: Request,
+        timeOption: str = Query('24'),body = Depends(remove_xss_json),db: Session = Depends(get_db)):
+    try:
+        body = await request.json()
+        rn = body.get('rn')
+        if rn is None:
+            rn=1
+        rain_data = get_rain_township(db,rn)
+        raining_township = sum([i['value'] for i in rain_data])
+        rain_dict = {i['name']:i['value'] for i in rain_data}
+        max_rain = get_max_rain_township(db,rn)
+        max_time = get_rain_max_time(db)
+        max_rain_township = max_rain[0]["township"]
+        max_rain_name = max_rain[0]["name"]
+        max_rain_value = max_rain[0]["rainfall"]
+
+        if raining_township==0:
+            result = f'''截至{max_time},近{rn}小时内,当前无地区下雨 。'''
+        else:
+            result = f'''截至{max_time},近{rn}小时内,全市有 {raining_township}个站点发生降雨, 最大降雨出现在 {max_rain_township} {max_rain_name} 站点,累计雨量为{max_rain_value}毫米 。\n
+            其中,'''
+            if rain_dict['小雨(0.1-10)']>0:
+                result+=f"降雨量在0.1-10毫米之间的站点有 {rain_dict['小雨(0.1-10)']} 个;"
+            if rain_dict['中雨(10-25)']>0:
+                result+=f"降雨量在10-25毫米之间的站点有 {rain_dict['中雨(10-25)']} 个;"
+            if rain_dict['大雨(25-50)']>0:
+                result+=f"降雨量在25-50毫米之间的站点有 {rain_dict['大雨(25-50)']} 个;"
+            if rain_dict['暴雨(50-100)']>0:
+                result+=f"降雨量在50-100毫米之间的站点有 {rain_dict['暴雨(50-100)']} 个;"
+            if rain_dict['大暴雨(100-250)']>0:
+                result+=f"降雨量在100-250毫米之间的站点有 {rain_dict['大暴雨(100-250)']} 个;"
+            if rain_dict['特大暴雨(>250)']>0:
+                result+=f"降雨量大于250毫米的站点有 {rain_dict['特大暴雨(>250)']} 个;"
+            result= result[:-1]+"。"
+        #print(result)
+
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data":
+                {"result":result}
+        }
+    except Exception as e:
+        db.rollback()
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")