libushang пре 8 месеци
родитељ
комит
b00ce43d6f
7 измењених фајлова са 97 додато и 5 уклоњено
  1. 19 1
      common/YzyApi.py
  2. 22 0
      jobs/__init__.py
  3. 20 0
      jobs/yzy_job.py
  4. 27 1
      main.py
  5. BIN
      models.zip
  6. 3 0
      models/base.py
  7. 6 3
      routers/api/eventManagement/event.py

+ 19 - 1
common/YzyApi.py

@@ -4,10 +4,11 @@ import random
 import string
 import hashlib
 import time
-import base64
 import json
 from utils.redis_util import *
 import requests
+from urllib.parse import quote
+import base64
 from exceptions import YzyException
 
 # 应用名称:茂名市智慧应急平台
@@ -183,3 +184,20 @@ def calcRequestSign(timestamp, token, nonce, uid, uinfo, ext):
         sign_data.encode("utf8")
         ).hexdigest().upper()
 
+
+def format_redirect_url(redirect_url: str) -> str:
+    yzy_callback_url = quote("http://19.155.220.206/yjxp/#/yzy-callback")
+
+    state_json = {
+        "redirect_url": redirect_url
+    }
+    state_str = json.dumps(state_json)
+    print(state_str)
+    state = base64.b64encode(state_str.encode('utf-8')).decode('utf-8')
+    detail_url = "https://open.weixin.qq.com/connect/Oauth2/authorize?appid={}&redirect_uri={}&response_type=code&scope=snsapi_base&agentid={}&state={}#wechat_redirect".format(
+        YZY_CORPID,
+        yzy_callback_url, 
+        YZY_AGENTID,
+        state)
+    return detail_url
+    

+ 22 - 0
jobs/__init__.py

@@ -0,0 +1,22 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from apscheduler.schedulers.base import BaseScheduler
+from apscheduler.triggers.cron import CronTrigger
+from datetime import datetime, timedelta
+from utils import *
+from models import *
+from .yzy_job import proc as yzy_proc
+
+def register_jobs(scheduler: BaseScheduler):
+    scheduler.add_job(yzy_proc, next_run_time=(datetime.now() + timedelta(seconds=3)))
+    scheduler.add_job(yzy_proc, CronTrigger.from_crontab('0 */1 * * *'))
+
+    # scheduler.add_job(wdyy_proc, next_run_time=(datetime.now() + timedelta(seconds=3)))
+    # scheduler.add_job(wdyy_proc, CronTrigger.from_crontab('0 * * * *'))
+
+    # scheduler.add_job(wdgh_proc, next_run_time=(datetime.now() + timedelta(seconds=13)))
+    # scheduler.add_job(wdyy_proc, CronTrigger.from_crontab('0 * * * *'))
+
+def tick():
+    print(datetime.now())

+ 20 - 0
jobs/yzy_job.py

@@ -0,0 +1,20 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+from datetime import datetime
+from sqlalchemy.orm import Session
+from utils import *
+from models import *
+from exceptions import *
+from database import get_db_local
+from extensions import logger
+from common import YzyApi
+
+def proc():
+    logger.info(datetime.now())
+
+    redirect_url = "http://19.155.220.206/yjxp/#/leader/index" # 业务页面
+    detail_url = YzyApi.format_redirect_url(redirect_url)
+    
+    yzy_user_id = "eb4kehgy6wj4qn0jhx1dk6"  # 暂时写死梦梅的账号
+    description = "预案名称: 茂名市自然灾害救助应急预案\n响应级别: Ⅰ级响应\n消息内容: 单位您好!《茂名市自然灾害救助应急预案》现已全面启动,特此通知您单位迅速响应,全力做好预案工作要点:负责救灾工作宣传报道协调工作。"
+    YzyApi.send_textcard_message(yzy_user_id, "预案响应消息", description, detail_url)

+ 27 - 1
main.py

@@ -11,6 +11,11 @@ from exceptions import *
 from pymysql.err import OperationalError
 import os
 import platform
+from config import settings
+from extensions import logger
+from jobs import register_jobs
+from apscheduler.schedulers.asyncio import AsyncIOScheduler
+from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
 
 app = FastAPI()
 # app.include_router(home.router)
@@ -30,6 +35,27 @@ app.add_middleware(CORSMiddleware,allow_origins=['*'],allow_credentials=False,al
 
 app.mount('/static', StaticFiles(directory='static'), name='static')
 
+@app.on_event('startup')
+def app_startup():
+    logger.info('---------------------------------------')
+    logger.info('--------------'+ settings.ENVIRONMENT +'---------------')
+    logger.info('---------------------------------------')
+    logger.info("server started.")
+
+    sys = platform.system()
+    if sys == "Windows":
+        from warnings import filterwarnings
+        from pytz_deprecation_shim import PytzUsageWarning
+        filterwarnings('ignore', category=PytzUsageWarning)
+
+    executors = {
+        'default': ThreadPoolExecutor(20),
+        'processpool': ProcessPoolExecutor(5)
+    }
+    scheduler = AsyncIOScheduler(timezone='Asia/Shanghai', executors=executors)
+    register_jobs(scheduler)
+    scheduler.start()
+
 # @app.exception_handler(RequestValidationError)
 # async def validation_exception_handler(request, exc):
 #     return JSONResponse(status_code=200, content={ "errcode": 100060, "errmsg": "参数错误" }, )
@@ -76,7 +102,7 @@ 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", "预案名称: 茂名市自然灾害救助应急预案\n响应级别: Ⅰ级响应\n消息内容: 单位您好!《茂名市自然灾害救助应急预案》现已全面启动,特此通知您单位迅速响应,全力做好预案工作要点:负责救灾工作宣传报道协调工作。", "https://www.baidu.com/")
+    # YzyApi.send_textcard_message(["eb4kehgy6wj4qn0jhx1dk6"], "预案响应消息", "预案名称: 茂名市自然灾害救助应急预案\n响应级别: Ⅰ级响应\n消息内容: 单位您好!《茂名市自然灾害救助应急预案》现已全面启动,特此通知您单位迅速响应,全力做好预案工作要点:负责救灾工作宣传报道协调工作。", "https://www.baidu.com/")
     # YzyApi.send_text_message(["eb4kehgy6wj4qn0jhx1dk6"], "事件进度")
 
     import uvicorn


+ 3 - 0
models/base.py

@@ -79,8 +79,10 @@ class OprIdxStat(Base):
     index_value = Column(String(100),comment='指标度量值')
     index_unit = Column(String(100), comment='指标单位')
     etl_time = Column(DateTime,comment='etl加工时间戳')
+    
     class Config:
         orm_mode = True
+
 class OprIdx(Base):
     """
     指标表
@@ -93,6 +95,7 @@ class OprIdx(Base):
     index_sql = Column(Text,comment='指标统计sql')
     index_corn = Column(String(100), comment='执行指标corn表达式')
     create_time = Column(DateTime,comment='创建时间')
+    
     class Config:
         orm_mode = True
 

+ 6 - 3
routers/api/eventManagement/event.py

@@ -640,18 +640,21 @@ async def send_emergency_plan_task_by_yzy(
 
         description = "预案名称: " + plan_name + "\n响应级别:" + response_level + "\n消息内容: "+yzy_content
 
+        '''
         yzy_callback_url = quote("http://19.155.220.206/yjxp/#/yzy-callback")
-        
-        
         state_json = {
             "redirect_url": "http://19.155.220.206/yjxp/#/leader/index" # 业务页面
         }
         state_str = json.dumps(state_json)
         state = base64.b64encode(state_str).decode('utf-8')
         detail_url = "https://open.weixin.qq.com/connect/Oauth2/authorize?appid=wld341060039&redirect_uri={}&response_type=code&scope=snsapi_base&agentid=1004302&state={}#wechat_redirect".format(yzy_callback_url, state)
+        '''
         
+        redirect_url = "http://19.155.220.206/yjxp/#/leader/index" # 业务页面
+        detail_url = YzyApi.format_redirect_url(redirect_url)
+
         try:
-            resp = YzyApi.send_textcard_message([yzy_user_id], "title", description, detail_url)
+            resp = YzyApi.send_textcard_message([yzy_user_id], "预案响应消息", description, detail_url)
             if resp['errcode'] == 0:
                 event_emergency_notify.sent_status = 1 # 发送成功
             else: