msg_center.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends, HTTPException, Query
  4. from sqlalchemy.exc import IntegrityError
  5. from fastapi.responses import HTMLResponse, FileResponse
  6. from fastapi.responses import JSONResponse
  7. from database import get_db
  8. from sqlalchemy import text, exists, and_, or_, not_
  9. from sqlalchemy.orm import Session
  10. from models import *
  11. import json
  12. import os
  13. from sqlalchemy import create_engine, select
  14. from typing import Optional
  15. from utils.StripTagsHTMLParser import *
  16. from common.db import db_event_management, db_user, db_area, db_msg_center, db_yzy
  17. from common.security import valid_access_token
  18. import traceback
  19. from utils import *
  20. from datetime import datetime, timedelta
  21. from common import YzyApi
  22. from common.db import db_dict
  23. from urllib.parse import quote
  24. import base64
  25. from io import BytesIO
  26. from PIL import Image
  27. from config import settings
  28. from utils.riskManagement_uitl import get_task_title_by_type, get_rescue_resources_task_title_by_type
  29. router = APIRouter()
  30. # 消息中心
  31. @router.post("/unread_msg_count")
  32. async def msg_count(
  33. request: Request,
  34. body = Depends(remove_xss_json),
  35. db: Session = Depends(get_db),
  36. user_id = Depends(valid_access_token)):
  37. try:
  38. msg_types = get_req_param(body, "msg_types")
  39. msg_type_list = msg_types.split(",")
  40. data = db_msg_center.get_unread_msg_count(db, user_id, msg_type_list)
  41. return {
  42. "code": 200,
  43. "msg": "反馈成功",
  44. "data": data
  45. }
  46. except Exception as e:
  47. # 处理异常
  48. traceback.print_exc()
  49. raise HTTPException(status_code=500, detail=str(e))
  50. @router.post("/send_yzy_msg")
  51. async def send_yzy_msg(request: Request,
  52. body = Depends(remove_xss_json),
  53. db: Session = Depends(get_db),
  54. user_id = Depends(valid_access_token)):
  55. msg_type = body['msg_type']
  56. detail_url = body['detail_url']
  57. description = body['description']
  58. foreign_key = '0'
  59. if 'foreign_key' in body:
  60. foreign_key = body['foreign_key']
  61. from_scenario = ''
  62. if 'from_scenario' in body:
  63. from_scenario = body['from_scenario']
  64. user_list = []
  65. tousers = body['tousers']
  66. for to_user_id in tousers:
  67. user_info = db_user.get_user_info(db, to_user_id)
  68. yzy_account = user_info.yzy_account
  69. yzy_userid = db_yzy.get_userid_by_account(db, yzy_account)
  70. if yzy_userid not in user_list:
  71. data = {
  72. "yzy_userid": yzy_userid,
  73. "mobile": yzy_account,
  74. "content": description,
  75. "recorded_by": user_id,
  76. "detail_url": settings.YZY_WEB_ROOT + detail_url,
  77. "foreign_key": foreign_key,
  78. "from_scenario": from_scenario,
  79. "title": msg_type
  80. }
  81. YzyApi.add_to_msg_queue(db, data)
  82. db_msg_center.add_msg(db, msg_type, foreign_key, to_user_id)
  83. user_list.append(yzy_userid)
  84. return {
  85. "code": 200,
  86. "msg": "消息暂存成功"
  87. }
  88. @router.get('/list')
  89. async def get_center_list(
  90. search_keyword: str = Query('', description='信息内容'),
  91. info_type: str = Query('', description='类型'),
  92. page: int = Query(1, gt=0, description='页码'),
  93. begin_time_s: str = Query(None, description='开始时间'),
  94. end_time_s: str = Query(None, description='结束时间'),
  95. info_order: str = Query("desc", description='时间排序'),
  96. page_size: int = Query(10, gt=0, description='pageSize'),
  97. db: Session = Depends(get_db),
  98. user_id = Depends(valid_access_token)
  99. ):
  100. try:
  101. # 应用查询条件
  102. where = and_(MsgCenter.del_flag == '0', MsgCenter.recv_userid == user_id)
  103. if search_keyword != '':
  104. where = and_(where, MsgCenter.content.like('%{}%'.format(search_keyword)))
  105. if info_type != '':
  106. where = and_(where, MsgCenter.msg_type == info_type)
  107. if begin_time_s != None:
  108. begin_time = datetime.strptime(begin_time_s, "%Y-%m-%d")
  109. where = and_(where, MsgCenter.recv_time >= begin_time)
  110. if end_time_s != None:
  111. end_time = datetime.strptime(end_time_s, "%Y-%m-%d") + timedelta(days=1)
  112. where = and_(where, MsgCenter.recv_time < end_time)
  113. print(where)
  114. # 计算总条目数
  115. q = db.query(func.count(MsgCenter.id))
  116. q = q.filter(where)
  117. total = q.scalar()
  118. # 执行分页查询
  119. q = db.query(MsgCenter)
  120. q = q.filter(where)
  121. if info_order == 'desc':
  122. q = q.order_by(MsgCenter.recv_time.desc())
  123. if info_order == 'asc':
  124. q = q.order_by(MsgCenter.recv_time.asc())
  125. rows = q.offset((page - 1) * page_size).limit(page_size).all()
  126. data = []
  127. for row in rows:
  128. foreign_key = row.foreign_key
  129. from_scenario = row.from_scenario
  130. detail = {}
  131. if row.msg_type == '任务消息':
  132. try:
  133. task_info = db.query(TaskRegistration).filter(TaskRegistration.task_id == foreign_key).first()
  134. event_code = task_info.event_code
  135. event_info = db.query(EventBase).filter(EventBase.event_code == event_code).first()
  136. detail = {
  137. "event_title": event_info.event_title,
  138. "creation_time": get_datetime_str(task_info.creation_time),
  139. "task_description": task_info.task_description,
  140. "detail_url": "/infoDetails?id="+str(row.id)
  141. }
  142. except:
  143. traceback.print_exc()
  144. elif row.msg_type == '预案通知':
  145. try:
  146. notify_info = db.query(EventEmergencyNotify).filter(EventEmergencyNotify.id == foreign_key).first()
  147. event_id = notify_info.event_id
  148. plan_id = notify_info.plan_id
  149. sent_time = notify_info.sent_time
  150. plan_info = db.query(EmergencyPlan).filter(EmergencyPlan.plan_number == plan_id).first()
  151. plan_name = plan_info.plan_name
  152. event_info = db.query(EventBase).filter(EventBase.event_code == event_id).first()
  153. response_level = db_dict.get_dict_label(db, "response_level", event_info.response_level)
  154. detail = {
  155. "title": row.title,
  156. "organizing_unit": plan_info.organizing_unit, # 发布单位
  157. "plan_name": plan_name, # 预案名称
  158. "response_level": response_level, # 相应级别
  159. "sent_time": get_datetime_str(sent_time), # 发送时间
  160. "yzy_content": notify_info.yzy_content, # 消息内容
  161. "detail_url": "/infoDetails?id="+str(row.id)
  162. }
  163. except:
  164. traceback.print_exc()
  165. elif row.msg_type == '在线点名':
  166. try:
  167. call_info = db.query(OnlineRollCallDetail).filter(OnlineRollCallDetail.id == foreign_key).first()
  168. detail = {
  169. "call_title": row.content,
  170. "create_time": get_datetime_str(call_info.create_time), # 发送时间
  171. "detail_url": "/infoDetails?id="+str(row.id)
  172. }
  173. except:
  174. traceback.print_exc()
  175. elif row.msg_type == '事件接报':
  176. try:
  177. event_info = db.query(EventBase).filter(EventBase.event_code == foreign_key).first()
  178. detail = {
  179. "event_title": row.title,
  180. "address": event_info.address,
  181. "event_level": db_dict.get_dict_label(db, "mm_event_level", event_info.event_level),
  182. "event_time": get_datetime_str(event_info.event_time), # 事发时间
  183. "detail_url": "/infoDetails?id="+str(row.id)
  184. }
  185. except:
  186. traceback.print_exc()
  187. elif row.msg_type == '隐患巡查':
  188. try:
  189. # task_info = db.query(RiskManagementInspectionTask).filter(RiskManagementInspectionTask.task_number == foreign_key).first()
  190. # task_title = get_task_title_by_type(task_info.inspection_business)
  191. detail = {
  192. "detail_url": "/infoDetails?id="+str(row.id)
  193. }
  194. except:
  195. traceback.print_exc()
  196. elif row.msg_type == '风险排查':
  197. try:
  198. # task_info = db.query(RiskManagementRiskTask).filter(RiskManagementRiskTask.task_number == foreign_key).first()
  199. # task_title = db_dict.get_dict_label(db, 'risk_type', task_info.risk_type)
  200. detail = {
  201. "detail_url": "/infoDetails?id="+str(row.id)
  202. }
  203. except:
  204. traceback.print_exc()
  205. elif row.msg_type == '数据采集':
  206. try:
  207. # task_info = db.query(RiskManagementRescueResourcesTask).filter(RiskManagementRescueResourcesTask.task_number == foreign_key).first()
  208. # task_title = get_rescue_resources_task_title_by_type(task_info.type)
  209. detail = {
  210. "detail_url": "/infoDetails?id="+str(row.id)
  211. }
  212. except:
  213. traceback.print_exc()
  214. elif row.msg_type == '值班消息':
  215. try:
  216. detail = {
  217. "detail_url": "/infoDetails?id="+str(row.id)
  218. }
  219. except:
  220. traceback.print_exc()
  221. elif row.msg_type == '审批消息':
  222. try:
  223. detail = {
  224. "detail_url": "/infoDetails?id="+str(row.id)
  225. }
  226. except:
  227. traceback.print_exc()
  228. elif row.msg_type == '系统消息':
  229. try:
  230. detail = {
  231. "detail_url": "/infoDetails?id="+str(row.id)
  232. }
  233. except:
  234. traceback.print_exc()
  235. # 信息发布
  236. elif row.msg_type in ['预警信息', '灾情信息', '灾情信息', '指挥救援', '公众防范']:
  237. try:
  238. info = db.query(InfoPublishBase).filter(InfoPublishBase.id == foreign_key).first()
  239. detail = {
  240. "detail_url": "/infoDetails?id="+str(info.id)
  241. }
  242. except:
  243. traceback.print_exc()
  244. data.append({
  245. "id": row.id,
  246. "msg_type": row.msg_type,
  247. "title": row.title,
  248. "content": row.content,
  249. "recv_time": get_datetime_str(row.recv_time),
  250. "detail": detail
  251. })
  252. # 返回结果
  253. return {
  254. "code": 200,
  255. "msg": "查询成功",
  256. "data": data,
  257. "total": total
  258. }
  259. except Exception as e:
  260. # 处理异常
  261. traceback.print_exc()
  262. raise HTTPException(status_code=500, detail=str(e))