Bladeren bron

no message

libushang 9 maanden geleden
bovenliggende
commit
148f1747a2
7 gewijzigde bestanden met toevoegingen van 274 en 21 verwijderingen
  1. 10 2
      common/YzyApi.py
  2. 16 0
      common/db/db_dict.py
  3. 2 2
      main.py
  4. 19 0
      models/event_base.py
  5. 1 0
      models/yjya_base.py
  6. 36 1
      routers/api/emergencyPlans/event.py
  7. 190 16
      routers/api/eventManagement/event.py

+ 10 - 2
common/YzyApi.py

@@ -82,8 +82,13 @@ def send_textcard_message(users, title: str, description: str, detail_url: str):
     access_token = get_cache_access_token()
     url = "{}/ebus/yzyapi/cgi-bin/message/send?access_token={}".format(YZY_HOST, access_token)
     
+    touser = ""
+    if isinstance(users, list) == True:
+        touser = "|".join(users)
+    else:
+        touser = str(users)
     data = {
-        "touser": "|".join(users),
+        "touser": touser,
         "msgtype" : "textcard",
         "agentid" : YZY_AGENTID,
         "textcard": {
@@ -112,16 +117,19 @@ def __post_url__(url, data):
         "x-tif-nonce": nonce,
         "x-tif-paasid": YZH_PASSID
     }
-    response = requests.post(url, data=data,headers=headers, timeout=15)
+    response = requests.post(url, data=data,headers=headers, timeout=5)
     print('yzy return:', response.text)
     
     if response.status_code == 200 :
         result = response.json()
+        return result
+        '''
         errcode = int(result['errcode'])
         if errcode == 0:
             return True
         else:
             raise YzyException(errcode=errcode, errmsg=result['errmsg'])
+        '''
         
 
 def ranstr(num):

+ 16 - 0
common/db/db_dict.py

@@ -0,0 +1,16 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+from sqlalchemy.orm import Session
+from sqlalchemy import text, exists, and_, or_, not_
+from sqlalchemy.sql import func
+from database import get_db
+from extensions import logger
+import random
+from models import *
+
+def get_dict_label(db: Session, dict_type: str, dict_value: str) -> str:
+    row = db.query(SysDictData).filter(and_(SysDictData.dict_type == dict_type, SysDictData.dict_value == dict_value)).first()
+    if row is None:
+        return ''
+    else:
+        return row.dict_label

+ 2 - 2
main.py

@@ -76,8 +76,8 @@ if __name__ == '__main__':
     # YzyApi.send_textcard_message(["c3o4t44nb2e1oipbs80paw"], "title", "事件进度", "https://www.baidu.com/")
     # YzyApi.send_textcard_message(["ivj823s4b56za2jcu293f7"], "title", "事件进度", "https://www.baidu.com/")
     # YzyApi.send_textcard_message(["ivj823s4b56za2jcu293f7"], "title", "事件进度", "https://www.baidu.com/")
-    YzyApi.send_textcard_message(["eb4kehgy6wj4qn0jhx1dk6"], "title", "事件进度", "https://www.baidu.com/")
-    YzyApi.send_text_message(["eb4kehgy6wj4qn0jhx1dk6"], "事件进度")
+    # YzyApi.send_textcard_message(["eb4kehgy6wj4qn0jhx1dk6"], "title", "预案名称: 茂名市自然灾害救助应急预案\n响应级别: Ⅰ级响应\n消息内容: 单位您好!《茂名市自然灾害救助应急预案》现已全面启动,特此通知您单位迅速响应,全力做好预案工作要点:负责救灾工作宣传报道协调工作。", "https://www.baidu.com/")
+    # YzyApi.send_text_message(["eb4kehgy6wj4qn0jhx1dk6"], "事件进度")
 
     import uvicorn
     sys = platform.system()

+ 19 - 0
models/event_base.py

@@ -82,5 +82,24 @@ class EventCheckin(Base):
     yzy_account = Column(String, default="", comment='粤政易账号')
     del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
 
+    class Config:
+        orm_mode = True
+
+class EventEmergencyNotify(Base):
+    __tablename__ = 'event_emergency_notify'
+
+    id = Column(Integer, autoincrement=True, primary_key=True)
+    event_id = Column(String, default="", comment='事件编号')
+    plan_id = Column(String, default="", comment='预案编号')
+    dept_id = Column(Integer, default=0, comment='部门ID')
+    dept_name = Column(String, default="", comment='部门名称')
+    user_id = Column(Integer, default=0, comment='用户ID')
+    user_name = Column(String, default="", comment='用户账号')
+    nick_name = Column(String, default="", comment='用户昵称')
+    yzy_user_id = Column(String, default="", comment='粤政易ID')
+    yzy_content = Column(String, default="", comment='消息内容')
+    sent_time = Column(DateTime, default=datetime.now, comment='签名时间')
+    sent_status = Column(Integer, default='0', comment='发送状态 0 待发送 1 发送成功 9 发送失败')
+
     class Config:
         orm_mode = True

+ 1 - 0
models/yjya_base.py

@@ -24,6 +24,7 @@ class EmergencyPlan(Base):
     create_dept = Column(BigInteger, default=None, comment='创建部门')
     create_by = Column(BigInteger, default=None, comment='创建者')
     del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    response_level = Column(String(2), comment='响应级别')
 
     class Config:
         orm_mode = True

+ 36 - 1
routers/api/emergencyPlans/event.py

@@ -29,13 +29,48 @@ async def unit_task(
 ):
     plan_id = body['plan_id']
 
+    row = db.query(EmergencyPlan).filter(EmergencyPlan.plan_number == plan_id).first()
+    if row is None:
+        return {
+            "code": 500,
+            "msg": "没有匹配的预案"
+        }
+    
+    plan_info = get_model_dict(row)
+
     rows = db.query(EmergencyUnit).filter(EmergencyUnit.plan_id == plan_id).order_by(EmergencyUnit.dept_order.asc()).all()
     data = [
         {
             "id": row.id,
             "dept_id": row.dept_id,
             "dept_name": row.dept_name,
-            "content": row.content
+            "content": "{},您好!《{}》现已全面启动,特此通知您单位迅速响应,全力做好预案工作要点:{}".format(row.dept_name, plan_info['plan_name'], row.content)
+        }
+        for row in rows
+    ]
+
+    # 返回结果
+    return {
+        "code": 200,
+        "msg": "查询成功",
+        "data": data
+    }
+
+
+# 列出可用预案
+@router.post('/avail_plan_list')
+async def unit_task(
+    request: Request, 
+    db: Session = Depends(get_db), 
+    body = Depends(remove_xss_json), 
+    user_id = Depends(valid_access_token)
+):
+    rows = db.query(EmergencyPlan).filter(EmergencyPlan.del_flag == "0").order_by(EmergencyPlan.plan_number.asc()).all()
+    data = [
+        {
+            "plan_id": row.plan_number,
+            "plan_name": row.plan_name,
+            "response_level": row.response_level
         }
         for row in rows
     ]

+ 190 - 16
routers/api/eventManagement/event.py

@@ -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)
+