Bladeren bron

250821-1代码。

baoyubo 6 dagen geleden
bovenliggende
commit
ab4a3a1259
1 gewijzigde bestanden met toevoegingen van 84 en 32 verwijderingen
  1. 84 32
      routers/api/rainfall/windspeed.py

+ 84 - 32
routers/api/rainfall/windspeed.py

@@ -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,