|
@@ -16,6 +16,9 @@ from common.security import valid_access_token
|
|
|
import traceback
|
|
|
from utils import *
|
|
|
from datetime import datetime, timedelta
|
|
|
+from common import YzyApi
|
|
|
+from common.db import db_dict
|
|
|
+from urllib.parse import quote
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
@@ -491,6 +494,42 @@ async def list_registered(
|
|
|
"msg": "登记事发地点成功"
|
|
|
}
|
|
|
|
|
|
+# 匹配预案
|
|
|
+@router.post("/march_emergency_plan")
|
|
|
+async def martch_emergency_plan(
|
|
|
+ request: Request,
|
|
|
+ body = Depends(remove_xss_json),
|
|
|
+ db: Session = Depends(get_db)
|
|
|
+):
|
|
|
+ eventId = body['eventId']
|
|
|
+
|
|
|
+ plan_id = ""
|
|
|
+ response_level = ""
|
|
|
+
|
|
|
+ '''
|
|
|
+ 匹配过程待定
|
|
|
+ '''
|
|
|
+ row = db.query(EmergencyPlan).filter(EmergencyPlan.id == 16).filter(EmergencyPlan.del_flag == "0").first()
|
|
|
+ if row is None:
|
|
|
+ return {
|
|
|
+ "code": 500,
|
|
|
+ "msg": "无法匹配"
|
|
|
+ }
|
|
|
+
|
|
|
+ plan_id = row.plan_number
|
|
|
+ response_level = row.response_level
|
|
|
+
|
|
|
+ return {
|
|
|
+ "code": 200,
|
|
|
+ "msg": "匹配预案成功",
|
|
|
+ "data": {
|
|
|
+ "eventId": eventId,
|
|
|
+ "plan_id": plan_id,
|
|
|
+ "response_level": response_level
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
# 启动预案
|
|
|
@router.post("/lauch_emergency_plan")
|
|
|
async def lauch_emergency_plan(
|
|
@@ -499,6 +538,7 @@ async def lauch_emergency_plan(
|
|
|
db: Session = Depends(get_db)
|
|
|
):
|
|
|
eventId = body['eventId']
|
|
|
+ plan_id = body['plan_id']
|
|
|
response_level = body['response_level']
|
|
|
event_row = db.query(EventBase).filter(EventBase.event_code == eventId).first()
|
|
|
if event_row is None:
|
|
@@ -507,35 +547,169 @@ async def lauch_emergency_plan(
|
|
|
"msg": "事件编号不存在"
|
|
|
}
|
|
|
|
|
|
- event_type = event_row.event_type
|
|
|
+ plan_row = db.query(EmergencyPlan).filter(EmergencyPlan.plan_number == plan_id).first()
|
|
|
+ if plan_row is None:
|
|
|
+ return {
|
|
|
+ "code": 500,
|
|
|
+ "msg": "预案不存在"
|
|
|
+ }
|
|
|
|
|
|
- # 事件类型和预案类型匹配
|
|
|
- if event_type == "1":
|
|
|
- pass
|
|
|
- else:
|
|
|
- pass
|
|
|
+ # 绑定预案ID和响应等级
|
|
|
+ event_row.plan_id = plan_row.plan_number
|
|
|
+ event_row.response_level = response_level
|
|
|
+ db.commit()
|
|
|
+
|
|
|
+ return {
|
|
|
+ "code": 200,
|
|
|
+ "msg": "启动预案成功"
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
- plan_type = "1"
|
|
|
+# 预案任务下发
|
|
|
+@router.post("/send_emergency_plan_task_by_yzy")
|
|
|
+async def send_emergency_plan_task_by_yzy(
|
|
|
+ request: Request,
|
|
|
+ body = Depends(remove_xss_json),
|
|
|
+ db: Session = Depends(get_db)
|
|
|
+):
|
|
|
+ eventId = body['eventId']
|
|
|
+
|
|
|
+ event_row = db.query(EventBase).filter(EventBase.event_code == eventId).first()
|
|
|
+ if event_row is None:
|
|
|
+ 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'])
|
|
|
|
|
|
- if plan_type == '':
|
|
|
+ if plan_id is None or plan_id == '':
|
|
|
+ return {
|
|
|
+ "code": 500,
|
|
|
+ "msg": "未关联预案"
|
|
|
+ }
|
|
|
+
|
|
|
+ row = db.query(EmergencyPlan).filter(EmergencyPlan.plan_number == plan_id).first()
|
|
|
+ if row is None:
|
|
|
return {
|
|
|
"code": 500,
|
|
|
"msg": "没有匹配的预案"
|
|
|
}
|
|
|
|
|
|
- plan_row = db.query(EmergencyPlan).filter(EmergencyPlan.plan_type == plan_type).first()
|
|
|
- if plan_row is None:
|
|
|
+ plan_info = get_model_dict(row)
|
|
|
+ plan_name = plan_info['plan_name']
|
|
|
+
|
|
|
+ rows = db.query(EmergencyUnit).filter(EmergencyUnit.plan_id == plan_id).order_by(EmergencyUnit.dept_order.asc()).all()
|
|
|
+ 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
|
|
|
+
|
|
|
+ # 通过通讯录匹配相关负责人
|
|
|
+ user_row = db.query(SysUser).filter(SysUser.user_id == 1).first()
|
|
|
+ user_id = user_row.user_id
|
|
|
+ user_name = user_row.user_name
|
|
|
+ nick_name = user_row.nick_name
|
|
|
+ yzy_user_id = "eb4kehgy6wj4qn0jhx1dk6" # 暂时写死梦梅的账号
|
|
|
+ yzy_content = "{},您好!《{}》现已全面启动,特此通知您单位迅速响应,全力做好预案工作要点:{}".format(row.dept_name, plan_info['plan_name'], row.content)
|
|
|
+
|
|
|
+ event_emergency_notify = EventEmergencyNotify(
|
|
|
+ event_id = eventId,
|
|
|
+ plan_id = plan_id,
|
|
|
+ dept_id = dept_id,
|
|
|
+ dept_name = dept_name,
|
|
|
+ user_id = user_id,
|
|
|
+ user_name = user_name,
|
|
|
+ nick_name = nick_name,
|
|
|
+ yzy_user_id = yzy_user_id,
|
|
|
+ yzy_content = yzy_content,
|
|
|
+ sent_time = datetime.now(),
|
|
|
+ sent_status = 0
|
|
|
+ )
|
|
|
+
|
|
|
+ db.add(event_emergency_notify)
|
|
|
+ db.commit()
|
|
|
+ db.refresh(event_emergency_notify)
|
|
|
+
|
|
|
+ description = "预案名称: " + plan_name + "\n响应级别:" + response_level + "\n消息内容: "+yzy_content
|
|
|
+
|
|
|
+ redirect_uri = quote("http://19.155.220.206/yjxp/index.html")
|
|
|
+ detail_url = "https://open.weixin.qq.com/connect/Oauth2/authorize?appid=wld341060039&redirect_uri={}&response_type=code&scope=snsapi_base&agentid=1004302&state=xxxxxx#wechat_redirect".format(redirect_uri)
|
|
|
+
|
|
|
+ try:
|
|
|
+ resp = YzyApi.send_textcard_message([yzy_user_id], "title", 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
|
|
|
+
|
|
|
+ return {
|
|
|
+ "code": 200,
|
|
|
+ "msg": "预案任务下发成功"
|
|
|
+ }
|
|
|
+
|
|
|
+# 获取预案通知
|
|
|
+@router.post("/emergency_plan_task_list")
|
|
|
+async def emergency_plan_task_list(
|
|
|
+ request: Request,
|
|
|
+ body = Depends(remove_xss_json),
|
|
|
+ db: Session = Depends(get_db)
|
|
|
+):
|
|
|
+ eventId = body['eventId']
|
|
|
+
|
|
|
+ event_row = db.query(EventBase).filter(EventBase.event_code == eventId).first()
|
|
|
+ if event_row is None:
|
|
|
return {
|
|
|
"code": 500,
|
|
|
- "msg": "预案不存在"
|
|
|
+ "msg": "事件编号不存在"
|
|
|
}
|
|
|
|
|
|
- # 绑定预案ID和响应等级
|
|
|
- event_row.plan_id = plan_row.id
|
|
|
- event_row.response_level = response_level
|
|
|
- db.commit()
|
|
|
+ event_info = get_model_dict(event_row)
|
|
|
+ plan_id = event_info['plan_id']
|
|
|
+ if plan_id is None or plan_id == '':
|
|
|
+ return {
|
|
|
+ "code": 500,
|
|
|
+ "msg": "未关联预案"
|
|
|
+ }
|
|
|
|
|
|
+ where = and_(and_(EventEmergencyNotify.plan_id == plan_id, EventEmergencyNotify.event_id == eventId))
|
|
|
+ rows = db.query(EventEmergencyNotify).filter(where).order_by(EventEmergencyNotify.id.asc()).all()
|
|
|
+ data = [
|
|
|
+ {
|
|
|
+ "dept_name": row.dept_name,
|
|
|
+ "sent_time": get_datetime_str(row.sent_time),
|
|
|
+ "sent_status": row.sent_status,
|
|
|
+ "sent_status_text": get_sent_status_text(row.sent_status),
|
|
|
+ "yzy_content": row.yzy_content,
|
|
|
+ "nick_name": row.nick_name
|
|
|
+ }
|
|
|
+ for row in rows
|
|
|
+ ]
|
|
|
+
|
|
|
+ # 返回结果
|
|
|
return {
|
|
|
"code": 200,
|
|
|
- "msg": "启动预案成功"
|
|
|
+ "msg": "查询成功",
|
|
|
+ "data": data
|
|
|
}
|
|
|
+
|
|
|
+def get_sent_status_text(sent_status) -> str:
|
|
|
+ if sent_status == 0:
|
|
|
+ return '暂未发送'
|
|
|
+ elif sent_status == 1:
|
|
|
+ return '发送成功'
|
|
|
+ elif sent_status == 0:
|
|
|
+ return '发送失败'
|
|
|
+ else:
|
|
|
+ return str(sent_status)
|
|
|
+
|