msg_center.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  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": 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. continue
  213. elif row.msg_type == '事件接报':
  214. try:
  215. event_info = db.query(EventBase).filter(EventBase.event_code == foreign_key).first()
  216. detail = {
  217. "event_title": row.title,
  218. "address": event_info.address,
  219. "event_level": db_dict.get_dict_label(db, "mm_event_level", event_info.event_level),
  220. "event_time": get_datetime_str(event_info.event_time), # 事发时间
  221. "detail_url": "/event/detail?event_id="+foreign_key+"&nocontrol=1"
  222. }
  223. except:
  224. traceback.print_exc()
  225. elif row.msg_type == '隐患巡查':
  226. try:
  227. # task_info = db.query(RiskManagementInspectionTask).filter(RiskManagementInspectionTask.task_number == foreign_key).first()
  228. # task_title = get_task_title_by_type(task_info.inspection_business)
  229. detail = {
  230. "detail_url": "/inspectionWork?id="+foreign_key
  231. }
  232. except:
  233. traceback.print_exc()
  234. elif row.msg_type == '风险排查':
  235. try:
  236. # task_info = db.query(RiskManagementRiskTask).filter(RiskManagementRiskTask.task_number == foreign_key).first()
  237. # task_title = db_dict.get_dict_label(db, 'risk_type', task_info.risk_type)
  238. detail = {
  239. "detail_url": "/worker/riskManagement?id="+foreign_key
  240. }
  241. except:
  242. traceback.print_exc()
  243. elif row.msg_type == '数据采集':
  244. try:
  245. # task_info = db.query(RiskManagementRescueResourcesTask).filter(RiskManagementRescueResourcesTask.task_number == foreign_key).first()
  246. # task_title = get_rescue_resources_task_title_by_type(task_info.type)
  247. detail = {
  248. "detail_url": "/worker/rescueManagement?id="+foreign_key
  249. }
  250. except:
  251. traceback.print_exc()
  252. elif row.msg_type == '值班消息':
  253. try:
  254. detail = {
  255. "detail_url": "/worker/duty?id="+foreign_key
  256. }
  257. except:
  258. traceback.print_exc()
  259. elif row.msg_type == '审批消息':
  260. try:
  261. detail = {
  262. "detail_url": "/infoDetails?id="+str(row.id)
  263. }
  264. except:
  265. traceback.print_exc()
  266. elif row.msg_type == '系统消息':
  267. try:
  268. detail = {
  269. "detail_url": ""
  270. }
  271. except:
  272. traceback.print_exc()
  273. # 信息发布
  274. elif row.msg_type in ['预警信息', '灾情信息', '灾情信息', '指挥救援', '公众防范']:
  275. try:
  276. info = db.query(InfoPublishBase).filter(InfoPublishBase.id == foreign_key).first()
  277. detail = {
  278. "detail_url": "/infoDetails?id="+str(info.id)
  279. }
  280. except:
  281. traceback.print_exc()
  282. data.append({
  283. "id": row.id,
  284. "msg_type": row.msg_type,
  285. "title": row.title,
  286. "content": row.content,
  287. "recv_time": get_datetime_str(row.recv_time),
  288. "detail": detail
  289. })
  290. # 返回结果
  291. return {
  292. "code": 200,
  293. "msg": "查询成功",
  294. "data": data,
  295. "total": total
  296. }
  297. except Exception as e:
  298. # 处理异常
  299. traceback.print_exc()
  300. raise HTTPException(status_code=500, detail=str(e))
  301. @router.get('/unread_system_notice')
  302. async def unread_system_notice(
  303. db: Session = Depends(get_db),
  304. page: int = Query(1, gt=0, description='页码'),
  305. page_size: int = Query(10, gt=0, description='pageSize'),
  306. user_id = Depends(valid_access_token)
  307. ):
  308. try:
  309. # 应用查询条件
  310. where = and_(MsgCenter.del_flag == '0', MsgCenter.msg_type == '系统消息', MsgCenter.recv_status == 0, MsgCenter.recv_userid == user_id)
  311. # 计算总条目数
  312. q = db.query(func.count(MsgCenter.id))
  313. q = q.filter(where)
  314. total = q.scalar()
  315. # 执行分页查询
  316. q = db.query(MsgCenter)
  317. q = q.filter(where)
  318. # 执行分页查询
  319. q = db.query(MsgCenter)
  320. q = q.filter(where)
  321. q = q.order_by(MsgCenter.recv_time.asc())
  322. rows = q.offset((page - 1) * page_size).limit(page_size).all()
  323. data = []
  324. for row in rows:
  325. data.append({
  326. "id": row.id,
  327. "msg_type": row.msg_type,
  328. "title": row.title,
  329. "content": row.content,
  330. "recv_time": get_datetime_str(row.recv_time)
  331. })
  332. # 返回结果
  333. return {
  334. "code": 200,
  335. "msg": "查询成功",
  336. "data": data,
  337. "total": total
  338. }
  339. except Exception as e:
  340. # 处理异常
  341. traceback.print_exc()
  342. raise HTTPException(status_code=500, detail=str(e))
  343. @router.post('/readall_system_notice')
  344. async def readall_system_notice(
  345. db: Session = Depends(get_db),
  346. user_id = Depends(valid_access_token)
  347. ):
  348. where = and_(MsgCenter.del_flag == '0', MsgCenter.msg_type == '系统消息', MsgCenter.recv_status == 0, MsgCenter.recv_userid == user_id)
  349. db.query(MsgCenter).filter(where).update({"recv_status": 1, "update_time": datetime.now()})
  350. db.commit()
  351. return {
  352. "code": 200,
  353. "msg": "保存成功"
  354. }
  355. @router.post('/read_system_notice_by_id')
  356. async def read_system_notice_by_id(
  357. body = Depends(remove_xss_json),
  358. db: Session = Depends(get_db),
  359. user_id = Depends(valid_access_token)
  360. ):
  361. where = and_(MsgCenter.del_flag == '0', MsgCenter.msg_type == '系统消息', MsgCenter.id == body['id'], MsgCenter.recv_userid == user_id)
  362. db.query(MsgCenter).filter(where).update({"recv_status": 1, "update_time": datetime.now()})
  363. db.commit()
  364. return {
  365. "code": 200,
  366. "msg": "保存成功"
  367. }