|
@@ -1,4 +1,4 @@
|
|
|
-from fastapi import APIRouter, Request, Depends, HTTPException, Query
|
|
|
+from fastapi import APIRouter, Request, Depends, HTTPException, Query, BackgroundTasks
|
|
|
from sqlalchemy.exc import IntegrityError
|
|
|
from fastapi.responses import HTMLResponse, FileResponse
|
|
|
from fastapi.responses import JSONResponse
|
|
@@ -21,6 +21,7 @@ from common.db import db_dict
|
|
|
from urllib.parse import quote
|
|
|
import base64
|
|
|
from config import settings
|
|
|
+from extensions import logger
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
@@ -253,15 +254,23 @@ async def get_event_detail(
|
|
|
"latitude": row.latitude,
|
|
|
"longitude": row.longitude,
|
|
|
"address": row.address,
|
|
|
+
|
|
|
+ # 关联预案
|
|
|
"plan_id": row.plan_id,
|
|
|
"plan_name": db_emergency_plan.get_plan_name_by_id(db, row.plan_id),
|
|
|
+ "plan_files": db_emergency_plan.get_plan_file_list(db, row.plan_id),
|
|
|
+
|
|
|
"del_flag": row.del_flag,
|
|
|
+
|
|
|
+ # 总结报告
|
|
|
"summary_file": db_event_management.get_summary_file_list(db, row.id),
|
|
|
|
|
|
# 事件跟踪
|
|
|
"event_status_tracks": db_event_management.get_event_status_track(db, row.id),
|
|
|
# 事件等级
|
|
|
- "event_level_tracks": db_event_management.get_event_level_track(db, row.id)
|
|
|
+ "event_level_tracks": db_event_management.get_event_level_track(db, row.id),
|
|
|
+ # 预案通知下发
|
|
|
+ "emergency_notify_count": db_event_management.get_emergency_notify_count(db, row.event_code)
|
|
|
}
|
|
|
}
|
|
|
else:
|
|
@@ -353,6 +362,24 @@ async def close_event(
|
|
|
db.add(event_tracking)
|
|
|
db.commit()
|
|
|
|
|
|
+ if 'fileName' in body:
|
|
|
+ event_files = [
|
|
|
+ EventFile(
|
|
|
+ event_id=event_base.id,
|
|
|
+ file_name=fileName["name"], # 使用 fileName["name"] 作为文件名
|
|
|
+ file_path=f'/data/upload/mergefile/{fileName["url"]}',
|
|
|
+ storage_file_name=fileName["url"],
|
|
|
+ foreign_key=event_base.event_code,
|
|
|
+ from_scenario="event_summary_file",
|
|
|
+ update_time=datetime.now(),
|
|
|
+ create_time=datetime.now(),
|
|
|
+ del_flag='0'
|
|
|
+ )
|
|
|
+ for fileName in body['fileNames'] # body['fileNames'] 现在是一个包含对象的数组,每个对象都有 'name' 和 'url' 属性
|
|
|
+ ]
|
|
|
+ db.add_all(event_files)
|
|
|
+ db.commit()
|
|
|
+
|
|
|
return {
|
|
|
"code": 200,
|
|
|
"msg": '关闭事件成功'
|
|
@@ -472,6 +499,36 @@ async def list_registered(
|
|
|
"data": data
|
|
|
}
|
|
|
|
|
|
+# 列出有个不分页的查询 不是临时事件、未结束、未关闭的事件列表接口
|
|
|
+@router.post("/list_active")
|
|
|
+async def list_active(
|
|
|
+ request: Request,
|
|
|
+ db: Session = Depends(get_db)
|
|
|
+):
|
|
|
+ where = and_(EventBase.del_flag == '0', EventBase.event_title != '', EventBase.event_status.in_(['0', '1']))
|
|
|
+ rows = db.query(EventBase).filter(where).order_by(EventBase.event_time.desc()).all()
|
|
|
+ data = [
|
|
|
+ {
|
|
|
+ "event_id": row.event_code,
|
|
|
+ "event_title": row.event_title,
|
|
|
+ "event_type": row.event_type,
|
|
|
+ "event_level": row.event_level,
|
|
|
+ "event_status": row.event_status,
|
|
|
+ "latitude": row.latitude,
|
|
|
+ "longitude": row.longitude,
|
|
|
+ "address": row.address,
|
|
|
+ "event_time": get_datetime_str(row.event_time)
|
|
|
+ }
|
|
|
+ for row in rows
|
|
|
+ ]
|
|
|
+
|
|
|
+ # 返回结果
|
|
|
+ return {
|
|
|
+ "code": 200,
|
|
|
+ "msg": "查询成功",
|
|
|
+ "data": data
|
|
|
+ }
|
|
|
+
|
|
|
# 将临时事件绑定成正式事件
|
|
|
@router.post("/update_event_id")
|
|
|
async def update_event_id(
|
|
@@ -574,8 +631,24 @@ async def martch_emergency_plan(
|
|
|
}
|
|
|
|
|
|
event_type = row.event_type
|
|
|
- plan_id = ""
|
|
|
- response_level = ""
|
|
|
+ plan_id = row.plan_id
|
|
|
+ response_level = row.response_level
|
|
|
+
|
|
|
+ # 如果已事件已匹配预案,直接返回
|
|
|
+ if plan_id != '' and response_level != '':
|
|
|
+ row = db.query(EmergencyPlan).filter(EmergencyPlan.plan_number == plan_id).filter(EmergencyPlan.del_flag == "0").first()
|
|
|
+ if row is not None:
|
|
|
+ plan_name = row.plan_name
|
|
|
+ return {
|
|
|
+ "code": 200,
|
|
|
+ "msg": "匹配预案成功",
|
|
|
+ "data": {
|
|
|
+ "eventId": eventId,
|
|
|
+ "plan_id": plan_id,
|
|
|
+ "plan_name": plan_name,
|
|
|
+ "response_level": response_level
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
'''
|
|
|
匹配到事件类型
|
|
@@ -621,6 +694,12 @@ async def lauch_emergency_plan(
|
|
|
"msg": "事件编号不存在"
|
|
|
}
|
|
|
|
|
|
+ if event_row.plan_id != '' and event_row.response_level != '':
|
|
|
+ return {
|
|
|
+ "code": 500,
|
|
|
+ "msg": "预案已启动"
|
|
|
+ }
|
|
|
+
|
|
|
plan_row = db.query(EmergencyPlan).filter(EmergencyPlan.plan_number == plan_id).first()
|
|
|
if plan_row is None:
|
|
|
return {
|
|
@@ -645,10 +724,11 @@ async def lauch_emergency_plan(
|
|
|
@router.post("/send_emergency_plan_task_by_yzy")
|
|
|
async def send_emergency_plan_task_by_yzy(
|
|
|
request: Request,
|
|
|
+ background_tasks: BackgroundTasks,
|
|
|
body = Depends(remove_xss_json),
|
|
|
db: Session = Depends(get_db)
|
|
|
):
|
|
|
- time.sleep(3)
|
|
|
+ time.sleep(1.0)
|
|
|
|
|
|
eventId = body['eventId']
|
|
|
|
|
@@ -659,6 +739,13 @@ async def send_emergency_plan_task_by_yzy(
|
|
|
"msg": "事件编号不存在"
|
|
|
}
|
|
|
|
|
|
+ c1 = db.query(EventEmergencyNotify).filter(EventEmergencyNotify.event_id == eventId).count()
|
|
|
+ if c1 > 0:
|
|
|
+ return {
|
|
|
+ "code": 500,
|
|
|
+ "msg": "预案任务已下发"
|
|
|
+ }
|
|
|
+
|
|
|
event_info = get_model_dict(event_row)
|
|
|
plan_id = event_info['plan_id']
|
|
|
response_level = db_dict.get_dict_label(db, "response_level", event_info['response_level'])
|
|
@@ -679,12 +766,19 @@ async def send_emergency_plan_task_by_yzy(
|
|
|
plan_info = get_model_dict(row)
|
|
|
plan_name = plan_info['plan_name']
|
|
|
|
|
|
+ send_queue = []
|
|
|
rows = db.query(EmergencyUnit).filter(EmergencyUnit.plan_id == plan_id).order_by(EmergencyUnit.dept_order.asc()).all()
|
|
|
- for row in rows:
|
|
|
+ if len(rows) == 0:
|
|
|
+ return {
|
|
|
+ "code": 500,
|
|
|
+ "msg": "该预案没有相关通知人员"
|
|
|
+ }
|
|
|
|
|
|
+ for row in rows:
|
|
|
dept_id = row.dept_id
|
|
|
dept_name = row.dept_name
|
|
|
|
|
|
+ # 已下发的过滤掉,避免重发
|
|
|
row_exists = db.query(EventEmergencyNotify).filter(and_(EventEmergencyNotify.plan_id == plan_id, EventEmergencyNotify.event_id == eventId, EventEmergencyNotify.dept_id == dept_id)).first()
|
|
|
if row_exists is not None:
|
|
|
continue
|
|
@@ -697,7 +791,11 @@ async def send_emergency_plan_task_by_yzy(
|
|
|
nick_name = contact_row.contact_name
|
|
|
|
|
|
yzy_user_row = db.query(YzyOrgUserEntity).filter(YzyOrgUserEntity.telephonenumber == yzy_account).first()
|
|
|
- yzy_user_id = yzy_user_row.userid
|
|
|
+ if yzy_user_row is None:
|
|
|
+ logger.info("粤政易人员ID不存在", yzy_account)
|
|
|
+ yzy_user_id = ""
|
|
|
+ else:
|
|
|
+ yzy_user_id = yzy_user_row.userid
|
|
|
|
|
|
|
|
|
# 通过通讯录匹配相关负责人
|
|
@@ -742,21 +840,37 @@ async def send_emergency_plan_task_by_yzy(
|
|
|
redirect_url = "{}/#/leader/index".format(settings.YJXP_WEB_ROOT_PATH) # 业务页面
|
|
|
detail_url = YzyApi.format_redirect_url(redirect_url)
|
|
|
|
|
|
- try:
|
|
|
- resp = YzyApi.send_textcard_message([yzy_user_id], "预案响应消息", description, detail_url)
|
|
|
- if resp['errcode'] == 0:
|
|
|
- event_emergency_notify.sent_status = 1 # 发送成功
|
|
|
- else:
|
|
|
- event_emergency_notify.sent_status = 9 # 发送失败
|
|
|
- db.commit()
|
|
|
-
|
|
|
- except Exception:
|
|
|
- pass
|
|
|
+ send_queue.append({
|
|
|
+ id: event_emergency_notify.id,
|
|
|
+ yzy_user_id: yzy_user_id,
|
|
|
+ description: description,
|
|
|
+ detail_url: detail_url
|
|
|
+ })
|
|
|
+
|
|
|
+ background_tasks.add_task(async_send_yzy_msg, db, send_queue)
|
|
|
|
|
|
return {
|
|
|
"code": 200,
|
|
|
"msg": "预案任务下发成功"
|
|
|
}
|
|
|
+
|
|
|
+def async_send_yzy_msg(db: Session, queue: dict):
|
|
|
+ for i in queue:
|
|
|
+ event_emergency_notify = db.query(EventEmergencyNotify).filter(EventEmergencyNotify.id == i['id']).first()
|
|
|
+ if event_emergency_notify is not None and event_emergency_notify.sent_status == 0:
|
|
|
+ yzy_user_id = i['yzy_user_id']
|
|
|
+ description = i['description']
|
|
|
+ detail_url = i['detail_url']
|
|
|
+ try:
|
|
|
+ resp = YzyApi.send_textcard_message([yzy_user_id], "预案响应消息", description, detail_url)
|
|
|
+ if resp['errcode'] == 0:
|
|
|
+ event_emergency_notify.sent_status = 1 # 发送成功
|
|
|
+ else:
|
|
|
+ event_emergency_notify.sent_status = 9 # 发送失败
|
|
|
+ db.commit()
|
|
|
+
|
|
|
+ except Exception:
|
|
|
+ pass
|
|
|
|
|
|
# 获取预案通知
|
|
|
@router.post("/emergency_plan_task_list")
|
|
@@ -831,6 +945,24 @@ async def upload_casualties(
|
|
|
db.query(EventBase).filter(EventBase.event_code == eventId).update(body)
|
|
|
db.commit()
|
|
|
|
|
|
+ if 'fileNames' in body:
|
|
|
+ event_files = [
|
|
|
+ EventFile(
|
|
|
+ event_id=event_base.id,
|
|
|
+ file_name=fileName["name"], # 使用 fileName["name"] 作为文件名
|
|
|
+ file_path=f'/data/upload/mergefile/{fileName["url"]}',
|
|
|
+ storage_file_name=fileName["url"],
|
|
|
+ foreign_key=event_base.event_code,
|
|
|
+ from_scenario="event_summary_file",
|
|
|
+ update_time=datetime.now(),
|
|
|
+ create_time=datetime.now(),
|
|
|
+ del_flag='0'
|
|
|
+ )
|
|
|
+ for fileName in body['fileNames'] # body['fileNames'] 现在是一个包含对象的数组,每个对象都有 'name' 和 'url' 属性
|
|
|
+ ]
|
|
|
+ db.add_all(event_files)
|
|
|
+ db.commit()
|
|
|
+
|
|
|
return {
|
|
|
"code": 200,
|
|
|
"msg": "保存事件伤亡情况成功"
|