xuguoyang 9 月之前
父節點
當前提交
e44ac00cbe
共有 3 個文件被更改,包括 240 次插入0 次删除
  1. 0 0
      routers/api/riskMonitor/__init__.py
  2. 100 0
      routers/api/riskMonitor/rain_condition.py
  3. 140 0
      utils/risk/__init__.py

+ 0 - 0
routers/api/riskMonitor/__init__.py


+ 100 - 0
routers/api/riskMonitor/rain_condition.py

@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from fastapi import APIRouter, Request, Depends, Query, HTTPException, status
+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 utils import *
+from utils.risk import *
+import json
+import traceback
+
+router = APIRouter()
+
+
+
+
+
+
+@router.post('/get_township_rain')
+async def mine(request: Request,body = Depends(remove_xss_json),db: Session = Depends(get_db)):
+    try:
+        body = await request.json()
+        rn = body.get('rn')
+        result = get_rain_township(db,rn)
+        print(result)
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data":
+                result
+        }
+    except Exception as e:
+        db.rollback()
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+@router.post('/get_township_rain_text')
+async def mine(request: Request,body = Depends(remove_xss_json),db: Session = Depends(get_db)):
+    try:
+        body = await request.json()
+        rn = body.get('rn')
+        one_hour = get_rain_township(db,1)
+        three_hour = get_rain_township(db,3)
+        max_rain = get_max_rain_township(db)
+        # print(one_hour)
+        # print(three_hour)
+        one_hour_rain = 6
+        one_hour_more_50 = 0
+        three_hour_more_50 = 0
+        max_time = get_max_time(db)
+        result = ''
+        raining_township = 0
+        for i in range(len(one_hour)):
+            if one_hour[i]["value"] == 0:
+                one_hour_rain-=1
+            elif one_hour[i]["value"] != 0:
+                raining_township+=1
+            elif one_hour[i]['name'] in ['暴雨(50-100)','大暴雨(100-200)','特大暴雨(>200)']:
+                one_hour_more_50+=one_hour[i]["value"]
+            elif three_hour[i]['name'] in ['大暴雨(100-200)','特大暴雨(>200)']:
+                three_hour_more_50+=one_hour[i]["value"]
+
+        max_rain_township = max_rain[0]["township"]
+        max_rain_value = max_rain[0]["rn"]
+        # print(one_hour_rain)
+        # print(one_hour_more_50)
+        # print(three_hour_more_50)
+        # print(max_rain_township)
+        # print(max_rain_value)
+        if one_hour_rain==0:
+            result = '''{}至当前,当前无地区下雨 。
+                        当前1小时降雨量大于50毫米的镇街 {}个;
+                        当前3小时降雨量大于100毫米的镇街 {}个;
+                    '''.format(max_time,one_hour_more_50,three_hour_more_50)
+
+        else:
+            result = '''{}至当前,全市有 {}个镇街发生降雨, 最大降雨出现在 {},累计雨量为{}毫米 。
+            当前1小时降雨量大于50毫米的镇街 {}个;
+            当前3小时降雨量大于100毫米的镇街 {}个;
+        '''.format(max_time,one_hour_rain,max_rain_township,max_rain_value,one_hour_more_50,three_hour_more_50)
+
+        print(result)
+
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data":
+                result
+        }
+    except Exception as e:
+        db.rollback()
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")

+ 140 - 0
utils/risk/__init__.py

@@ -0,0 +1,140 @@
+from common.BigDataCenterAPI import *
+from models import *
+from sqlalchemy import  text
+
+import json
+
+
+
+
+
+def get_rain_township(db,rn):
+    resutl = []
+    sql = text(f"""
+        SELECT T1.`name`,IFNULL(T2.num,0)as num FROM (SELECT '特大暴雨(>200)' as `name` union all
+SELECT '大暴雨(100-200)' as `name` union all
+SELECT '暴雨(50-100)' as `name` union all
+SELECT '大雨(25-50)' as `name` union all
+SELECT '中雨(10-25)' as `name` union all
+SELECT '小雨(<10)' as `name` )T1 left join (
+ SELECT IFNULL(CASE 
+	WHEN rainfall>0 and rainfall<10 THEN
+		'小雨(<10)'
+	WHEN rainfall>=10 and rainfall<25 THEN
+		'中雨(10-25)'
+	WHEN rainfall>=25 and rainfall<50 THEN
+		'大雨(25-50)'
+	WHEN rainfall>=50 and rainfall<100 THEN
+		'暴雨(50-100)'
+	WHEN rainfall>=100 and rainfall<200 THEN
+		'大暴雨(100-200)'
+	WHEN rainfall>=200 THEN
+		'特大暴雨(>200)'
+	ELSE
+		'0'
+END,'0') as `name` ,COUNT(1) as `num` FROM (
+SELECT 
+    `latest_data`.`township` AS `township`,
+    SUM(`latest_data`.`rainfall`) AS `rainfall`
+FROM (
+    SELECT 
+        a.`code`,
+        MAX(a.`area_name`) AS `area_name`,
+        MAX(a.`update_time`) AS `update_time`,
+        MAX(a.`address`) AS `address`,
+        b.`township`,
+        a.`create_time`,
+        AVG(a.`rainfall`) AS `rainfall`,
+        ROW_NUMBER() OVER (PARTITION BY a.`code` ORDER BY a.`create_time` DESC) AS `rn`
+    FROM 
+        `govdata_rain_data_info` a
+    LEFT JOIN 
+        `govdata_real_time_address` b ON a.`code` = b.`code`
+    WHERE 
+        a.`address` LIKE '%茂名%'
+    GROUP BY 
+        a.`code`, b.`township`, a.`create_time`
+) `latest_data`
+WHERE 
+    `latest_data`.`rn` = {rn}
+GROUP BY 
+    `latest_data`.`township`
+ORDER BY 
+    `rainfall` DESC
+)A GROUP BY IFNULL(CASE 
+	WHEN rainfall>0 and rainfall<10 THEN
+		'小雨(<10)'
+	WHEN rainfall>=10 and rainfall<25 THEN
+		'中雨(10-25)'
+	WHEN rainfall>=25 and rainfall<50 THEN
+		'大雨(25-50)'
+	WHEN rainfall>=50 and rainfall<100 THEN
+		'暴雨(50-100)'
+	WHEN rainfall>=100 and rainfall<200 THEN
+		'大暴雨(100-200)'
+	WHEN rainfall>=200 THEN
+		'特大暴雨(>200)'
+	ELSE
+		'0'
+END,'0'))T2 on T1.`name`=T2.`name`;
+""")
+
+    sqlresult = db.execute(sql)
+    for i in sqlresult:
+        print(i)
+        resutl.append({
+            'name':i[0],
+            'value':i[1]
+        })
+    return resutl
+
+def get_max_time(db):
+    resutl = []
+    sql = text(f"""
+        SELECT MAX(CREATE_TIME) FROM govdata_rain_data_info;
+""")
+
+    sqlresult = db.execute(sql).first()[0]
+    formatted_dt = sqlresult.strftime('%Y-%m-%d %H:%M')
+
+    return formatted_dt
+
+def get_max_rain_township(db):
+    resutl = []
+    sql = text(f"""
+        SELECT area_name,township,rn
+FROM (
+    SELECT 
+        a.`code`,
+        MAX(a.`area_name`) AS `area_name`,
+        MAX(a.`update_time`) AS `update_time`,
+        MAX(a.`address`) AS `address`,
+        b.`township`,
+        a.`create_time`,
+        AVG(a.`rainfall`) AS `rainfall`,
+        ROW_NUMBER() OVER (PARTITION BY a.`code` ORDER BY a.`create_time` DESC) AS `rn`
+    FROM 
+        `govdata_rain_data_info` a
+    LEFT JOIN 
+        `govdata_real_time_address` b ON a.`code` = b.`code`
+    WHERE 
+        a.`address` LIKE '%茂名%'
+    GROUP BY 
+        a.`code`, b.`township`, a.`create_time`
+) AS latest_data
+WHERE 
+    latest_data.`rn` = 1
+ORDER BY 
+    latest_data.`rainfall` DESC
+LIMIT 1;
+""")
+
+    sqlresult = db.execute(sql)
+    for i in sqlresult:
+        print(i)
+        resutl.append({
+            'area_name':i[0],
+            'township':i[1],
+            'rn':i[2]
+        })
+    return resutl