msg_center.py 15 KB

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