|
@@ -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)}")
|