|
@@ -67,42 +67,94 @@ where create_time>= NOW() - INTERVAL {timeOption} HOUR and IF('{area}'='',1=1,ar
|
|
|
traceback.print_exc()
|
|
|
return JSONResponse(status_code=500, content={"code": 500, "msg": f"Internal server error: {str(e)}"})
|
|
|
|
|
|
-@router.post('/windspeed_warrning')
|
|
|
+def get_windspeed_data(db,timeOption):
|
|
|
+ sql = f"""WITH ranked AS (
|
|
|
+ SELECT
|
|
|
+ A.windlevel,
|
|
|
+ A.windspeed,
|
|
|
+ B.`address`,
|
|
|
+ ROW_NUMBER() OVER (PARTITION BY A.windlevel ORDER BY A.windspeed DESC) AS rn
|
|
|
+ FROM sharedb.govdata_wind_speed_data_info A JOIN sharedb.govdata_wind_stand_address B on A.`code`=B.`code` where A.create_time >= NOW() - INTERVAL {timeOption} HOUR
|
|
|
+),
|
|
|
+max_per_level AS (
|
|
|
+ SELECT windlevel, windspeed AS maxspeed, address AS maxspeed_standaddress
|
|
|
+ FROM ranked
|
|
|
+ WHERE rn = 1
|
|
|
+),
|
|
|
+summary AS (
|
|
|
+ SELECT
|
|
|
+ windlevel,
|
|
|
+ COUNT(*) AS cnt,
|
|
|
+ ROUND(COUNT(*) * 100 / SUM(COUNT(*)) OVER (), 2) AS ratio
|
|
|
+ FROM sharedb.govdata_wind_speed_data_info
|
|
|
+ GROUP BY windlevel
|
|
|
+)
|
|
|
+SELECT
|
|
|
+ s.windlevel,
|
|
|
+ s.cnt,
|
|
|
+ s.ratio,
|
|
|
+ CASE
|
|
|
+ WHEN s.ratio < 10 THEN '个别'
|
|
|
+ WHEN s.ratio < 40 THEN '部分'
|
|
|
+ WHEN s.ratio < 90 THEN '大范围'
|
|
|
+ ELSE '全市'
|
|
|
+ END AS fugaifanwei,
|
|
|
+ m.maxspeed,
|
|
|
+ m.maxspeed_standaddress
|
|
|
+FROM summary s
|
|
|
+JOIN max_per_level m ON s.windlevel = m.windlevel
|
|
|
+ORDER BY s.windlevel DESC;"""
|
|
|
+ result = []
|
|
|
+ sqlresult = db.execute(sql)
|
|
|
+ for i in sqlresult:
|
|
|
+ print(i)
|
|
|
+ result.append({
|
|
|
+ 'windlevel': i[0],
|
|
|
+ 'cnt': i[1],
|
|
|
+ 'ratio': i[2],
|
|
|
+ 'fugaifanwei': i[3],
|
|
|
+ 'maxspeed': i[4],
|
|
|
+ 'maxspeed_standaddress': i[5]
|
|
|
+ })
|
|
|
+ return result
|
|
|
+
|
|
|
+@router.get('/windspeed_warrning')
|
|
|
async def mine(request: Request,
|
|
|
- timeOption: str = Query('24'),body = Depends(remove_xss_json),db: Session = Depends(get_db)):
|
|
|
+ timeOption: int = 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"]
|
|
|
+ # timeOption = 24
|
|
|
+ # start_time = "8月19日20时"
|
|
|
+ # end_time = "8月20日20时"
|
|
|
+ end_dt = datetime.now() # 当前时间
|
|
|
+ start_dt = end_dt - timedelta(hours=timeOption)
|
|
|
+
|
|
|
+ fmt = "%-m月%-d日%-H时" # Windows 用 %#m %#d %#H
|
|
|
+ start_time = start_dt.strftime(fmt)
|
|
|
+ end_time = end_dt.strftime(fmt)
|
|
|
+ windspeed_data = get_windspeed_data(db, timeOption)
|
|
|
+ if windspeed_data:
|
|
|
+ result = f"局气象监测,{start_time}至{end_time},"
|
|
|
+ fugaifanwei = windspeed_data[0]['fugaifanwei']
|
|
|
+ max_speed_level = windspeed_data[0]['windlevel']
|
|
|
+ address=windspeed_data[0]['maxspeed_standaddress']
|
|
|
+ max_speed =windspeed_data[0]['maxspeed']
|
|
|
+ result += f'{fugaifanwei}站点出现{max_speed_level}级短时大风。'
|
|
|
+ if len(windspeed_data)>1:
|
|
|
+ fugaifanwei2 =windspeed_data[1]['fugaifanwei']
|
|
|
+ max_speed_level2 = windspeed_data[1]['windlevel']
|
|
|
+ if fugaifanwei!=fugaifanwei2:
|
|
|
+ result = result[:-1] + f",{fugaifanwei2}站点出现{max_speed_level2}级短时大风。"
|
|
|
+ result += f'其中,{address}录得最大阵风{max_speed}米/秒({max_speed_level}级)。'
|
|
|
+ for info in windspeed_data:
|
|
|
+ stand_count = info['cnt']
|
|
|
+ stand_pres = info['ratio']
|
|
|
+ speed_level = info['windlevel']
|
|
|
+ result += f'有{stand_count}个监测站(占总数的{stand_pres}%)录得{speed_level}级以上阵风;'
|
|
|
+ result = result[:-1] + "。"
|
|
|
|
|
|
- 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)
|
|
|
+ result = f"{start_time}至{end_time},暂无风速数据。"
|
|
|
+
|
|
|
|
|
|
return {
|
|
|
"code": 200,
|