msg_center.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  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. title = body['title']
  57. detail_url = body['detail_url']
  58. description = body['description']
  59. foreign_key = '0'
  60. if 'foreign_key' in body:
  61. foreign_key = body['foreign_key']
  62. from_scenario = ''
  63. if 'from_scenario' in body:
  64. from_scenario = body['from_scenario']
  65. user_list = []
  66. tousers = body['tousers']
  67. for to_user_id in tousers:
  68. user_info = db_user.get_user_info(db, to_user_id)
  69. yzy_account = user_info.yzy_account
  70. yzy_userid = db_yzy.get_userid_by_account(db, yzy_account)
  71. if yzy_userid not in user_list:
  72. data = {
  73. "yzy_userid": yzy_userid,
  74. "mobile": yzy_account,
  75. "content": description,
  76. "recorded_by": user_id,
  77. "detail_url": settings.YZY_WEB_ROOT + detail_url,
  78. "foreign_key": foreign_key,
  79. "from_scenario": from_scenario,
  80. "title": title
  81. }
  82. YzyApi.add_to_msg_queue(db, data)
  83. db_msg_center.add_msg(db, msg_type, foreign_key, to_user_id)
  84. db_msg_center.add_message(db, msg_type, to_user_id, title, description, foreign_key, from_scenario)
  85. user_list.append(yzy_userid)
  86. return {
  87. "code": 200,
  88. "msg": "消息暂存成功"
  89. }
  90. @router.get('/list')
  91. async def get_center_list(
  92. search_keyword: str = Query('', description='信息内容'),
  93. info_type: str = Query('', description='类型'),
  94. page: int = Query(1, gt=0, description='页码'),
  95. begin_time_s: str = Query(None, description='开始时间'),
  96. end_time_s: str = Query(None, description='结束时间'),
  97. info_order: str = Query("desc", description='时间排序'),
  98. page_size: int = Query(10, gt=0, description='pageSize'),
  99. db: Session = Depends(get_db),
  100. user_id = Depends(valid_access_token)
  101. ):
  102. try:
  103. # 应用查询条件
  104. where = and_(MsgCenter.del_flag == '0', MsgCenter.recv_userid == user_id)
  105. if search_keyword != '':
  106. where = and_(where, MsgCenter.content.like('%{}%'.format(search_keyword)))
  107. if info_type != '':
  108. where = and_(where, MsgCenter.msg_type == info_type)
  109. if begin_time_s != None:
  110. begin_time = datetime.strptime(begin_time_s, "%Y-%m-%d")
  111. where = and_(where, MsgCenter.recv_time >= begin_time)
  112. if end_time_s != None:
  113. end_time = datetime.strptime(end_time_s, "%Y-%m-%d") + timedelta(days=1)
  114. where = and_(where, MsgCenter.recv_time < end_time)
  115. print(where)
  116. # 计算总条目数
  117. q = db.query(func.count(MsgCenter.id))
  118. q = q.filter(where)
  119. total = q.scalar()
  120. # 执行分页查询
  121. q = db.query(MsgCenter)
  122. q = q.filter(where)
  123. if info_order == 'desc':
  124. q = q.order_by(MsgCenter.recv_time.desc())
  125. if info_order == 'asc':
  126. q = q.order_by(MsgCenter.recv_time.asc())
  127. rows = q.offset((page - 1) * page_size).limit(page_size).all()
  128. data = []
  129. for row in rows:
  130. foreign_key = row.foreign_key
  131. from_scenario = row.from_scenario
  132. detail = {}
  133. if row.msg_type == '任务消息':
  134. try:
  135. task_info = db.query(TaskRegistration).filter(TaskRegistration.task_id == foreign_key).first()
  136. event_code = task_info.event_code
  137. event_title = db_event_management.get_event_title(db, event_code)
  138. detail = {
  139. "event_title": event_title,
  140. "creation_time": get_datetime_str(task_info.creation_time),
  141. "task_description": task_info.task_description,
  142. "detail_url": "/taskRegistration?id="+foreign_key
  143. }
  144. except:
  145. traceback.print_exc()
  146. elif row.msg_type == '预案通知':
  147. try:
  148. notify_info = db.query(EventEmergencyNotify).filter(EventEmergencyNotify.id == foreign_key).first()
  149. event_id = notify_info.event_id
  150. plan_id = notify_info.plan_id
  151. sent_time = notify_info.sent_time
  152. plan_info = db.query(EmergencyPlan).filter(EmergencyPlan.plan_number == plan_id).first()
  153. plan_name = plan_info.plan_name
  154. event_info = db.query(EventBase).filter(EventBase.event_code == event_id).first()
  155. response_level = db_dict.get_dict_label(db, "response_level", event_info.response_level)
  156. detail = {
  157. "title": row.title,
  158. "event_id": row.event_id,
  159. "organizing_unit": plan_info.organizing_unit, # 发布单位
  160. "plan_name": plan_name, # 预案名称
  161. "response_level": response_level, # 相应级别
  162. "sent_time": get_datetime_str(sent_time), # 发送时间
  163. "yzy_content": notify_info.yzy_content, # 消息内容
  164. "detail_url": "/event/emergencyNotify?id="+foreign_key
  165. }
  166. except:
  167. traceback.print_exc()
  168. elif row.msg_type == '在线点名':
  169. try:
  170. call_info = db.query(OnlineRollCallDetail).filter(OnlineRollCallDetail.id == foreign_key).first()
  171. detail = {
  172. "call_title": row.content,
  173. "create_time": get_datetime_str(call_info.create_time), # 发送时间
  174. "detail_url": "/worker/rollCallRecord2?id="+foreign_key
  175. }
  176. except:
  177. traceback.print_exc()
  178. elif row.msg_type == '事件接报':
  179. try:
  180. event_info = db.query(EventBase).filter(EventBase.event_code == foreign_key).first()
  181. detail = {
  182. "event_title": row.title,
  183. "address": event_info.address,
  184. "event_level": db_dict.get_dict_label(db, "mm_event_level", event_info.event_level),
  185. "event_time": get_datetime_str(event_info.event_time), # 事发时间
  186. "detail_url": "/event/detail?event_id="+foreign_key+"&nocontrol=1"
  187. }
  188. except:
  189. traceback.print_exc()
  190. elif row.msg_type == '隐患巡查':
  191. try:
  192. # task_info = db.query(RiskManagementInspectionTask).filter(RiskManagementInspectionTask.task_number == foreign_key).first()
  193. # task_title = get_task_title_by_type(task_info.inspection_business)
  194. detail = {
  195. "detail_url": "/inspectionWork?id="+foreign_key
  196. }
  197. except:
  198. traceback.print_exc()
  199. elif row.msg_type == '风险排查':
  200. try:
  201. # task_info = db.query(RiskManagementRiskTask).filter(RiskManagementRiskTask.task_number == foreign_key).first()
  202. # task_title = db_dict.get_dict_label(db, 'risk_type', task_info.risk_type)
  203. detail = {
  204. "detail_url": "/worker/riskManagement?id="+foreign_key
  205. }
  206. except:
  207. traceback.print_exc()
  208. elif row.msg_type == '数据采集':
  209. try:
  210. # task_info = db.query(RiskManagementRescueResourcesTask).filter(RiskManagementRescueResourcesTask.task_number == foreign_key).first()
  211. # task_title = get_rescue_resources_task_title_by_type(task_info.type)
  212. detail = {
  213. "detail_url": "/worker/rescueManagement?id="+foreign_key
  214. }
  215. except:
  216. traceback.print_exc()
  217. elif row.msg_type == '值班消息':
  218. try:
  219. detail = {
  220. "detail_url": "/worker/duty?id="+foreign_key
  221. }
  222. except:
  223. traceback.print_exc()
  224. elif row.msg_type == '审批消息':
  225. try:
  226. detail = {
  227. "detail_url": "/infoDetails?id="+str(row.id)
  228. }
  229. except:
  230. traceback.print_exc()
  231. elif row.msg_type == '系统消息':
  232. try:
  233. detail = {
  234. "detail_url": ""
  235. }
  236. except:
  237. traceback.print_exc()
  238. # 信息发布
  239. elif row.msg_type in ['预警信息', '灾情信息', '灾情信息', '指挥救援', '公众防范']:
  240. try:
  241. info = db.query(InfoPublishBase).filter(InfoPublishBase.id == foreign_key).first()
  242. detail = {
  243. "detail_url": "/infoDetails?id="+str(info.id)
  244. }
  245. except:
  246. traceback.print_exc()
  247. data.append({
  248. "id": row.id,
  249. "msg_type": row.msg_type,
  250. "title": row.title,
  251. "content": row.content,
  252. "recv_time": get_datetime_str(row.recv_time),
  253. "detail": detail
  254. })
  255. # 返回结果
  256. return {
  257. "code": 200,
  258. "msg": "查询成功",
  259. "data": data,
  260. "total": total
  261. }
  262. except Exception as e:
  263. # 处理异常
  264. traceback.print_exc()
  265. raise HTTPException(status_code=500, detail=str(e))
  266. @router.get('/unread_system_notice')
  267. async def unread_system_notice(
  268. db: Session = Depends(get_db),
  269. page: int = Query(1, gt=0, description='页码'),
  270. page_size: int = Query(10, gt=0, description='pageSize'),
  271. user_id = Depends(valid_access_token)
  272. ):
  273. try:
  274. # 应用查询条件
  275. where = and_(MsgCenter.del_flag == '0', MsgCenter.msg_type == '系统消息', MsgCenter.recv_status == 0, MsgCenter.recv_userid == user_id)
  276. # 计算总条目数
  277. q = db.query(func.count(MsgCenter.id))
  278. q = q.filter(where)
  279. total = q.scalar()
  280. # 执行分页查询
  281. q = db.query(MsgCenter)
  282. q = q.filter(where)
  283. # 执行分页查询
  284. q = db.query(MsgCenter)
  285. q = q.filter(where)
  286. q = q.order_by(MsgCenter.recv_time.asc())
  287. rows = q.offset((page - 1) * page_size).limit(page_size).all()
  288. data = []
  289. for row in rows:
  290. data.append({
  291. "id": row.id,
  292. "msg_type": row.msg_type,
  293. "title": row.title,
  294. "content": row.content,
  295. "recv_time": get_datetime_str(row.recv_time)
  296. })
  297. # 返回结果
  298. return {
  299. "code": 200,
  300. "msg": "查询成功",
  301. "data": data,
  302. "total": total
  303. }
  304. except Exception as e:
  305. # 处理异常
  306. traceback.print_exc()
  307. raise HTTPException(status_code=500, detail=str(e))
  308. @router.post('/readall_system_notice')
  309. async def readall_system_notice(
  310. db: Session = Depends(get_db),
  311. user_id = Depends(valid_access_token)
  312. ):
  313. where = and_(MsgCenter.del_flag == '0', MsgCenter.msg_type == '系统消息', MsgCenter.recv_status == 0, MsgCenter.recv_userid == user_id)
  314. db.query(MsgCenter).filter(where).update({"recv_status": 1, "update_time": datetime.now()})
  315. db.commit()
  316. return {
  317. "code": 200,
  318. "msg": "保存成功"
  319. }