call.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends, Query, HTTPException
  4. from database import get_db
  5. from sqlalchemy import text, exists, and_, or_, not_
  6. from sqlalchemy.orm import Session
  7. from models import *
  8. import json
  9. import os
  10. from sqlalchemy import create_engine, select
  11. from typing import Optional
  12. from utils.StripTagsHTMLParser import *
  13. from common.db import db_event_management, db_user, db_area, db_emergency_plan
  14. from common.security import valid_access_token
  15. import traceback
  16. from utils import *
  17. from datetime import datetime, timedelta
  18. from common import YzyApi
  19. from common.db import db_dict
  20. from urllib.parse import quote
  21. import base64
  22. from config import settings
  23. router = APIRouter()
  24. @router.post("/create")
  25. async def create_all(
  26. db: Session = Depends(get_db),
  27. body = Depends(remove_xss_json),
  28. user_id = Depends(valid_access_token)
  29. ):
  30. try:
  31. dept_id = 0
  32. dept_name = ''
  33. user_row = db.query(SysUser).filter(SysUser.user_id == user_id).first()
  34. user_name = user_row.user_name
  35. nick_name = user_row.nick_name
  36. dept_id = user_row.dept_id
  37. dept_row = db.query(SysDept).filter(SysDept.dept_id == dept_id).first()
  38. dept_name = dept_row.dept_name
  39. new_call = OnlineRollCallBase(
  40. call_type = body['call_type'],
  41. recorded_by = user_id,
  42. create_time = datetime.now,
  43. del_flag = '0',
  44. call_status = 1,
  45. user_count = body['user_count'],
  46. ack_count = 0,
  47. unack_count = 0,
  48. remark = body['remark'],
  49. update_time = datetime.now()
  50. )
  51. db.add(new_call)
  52. db.commit()
  53. db.refresh(new_call)
  54. new_call_id = new_call.id
  55. for u in body['users']:
  56. call_user_id = u['user_id']
  57. call_dept_id = 0
  58. call_nick_name = ''
  59. call_dept_name = ''
  60. user_row = db.query(SysUser).filter(SysUser.user_id == call_user_id).first()
  61. if user_row is not None:
  62. call_nick_name = user_row.nick_name
  63. call_dept_row = db.query(SysDept).filter(SysDept.dept_id == user_row.dept_id).first()
  64. call_dept_id = call_dept_row.dept_id
  65. call_dept_name = call_dept_row.dept_name
  66. # 关联值班班获取值班人员信息
  67. onduty_user = "-1"
  68. onduty_leader = "-1"
  69. video_url = "..."
  70. call_url = "..."
  71. new_detail = OnlineRollCallDetail(
  72. pid = new_call_id,
  73. user_id = call_user_id,
  74. dept_id = call_dept_id,
  75. nick_name = call_nick_name,
  76. dept_name = call_dept_name,
  77. onduty_user = onduty_user,
  78. onduty_leader = onduty_leader,
  79. video_url = video_url,
  80. call_url = call_url,
  81. ack_status = 0,
  82. act_time = None,
  83. create_time = datetime.now(),
  84. del_flag = '0',
  85. ack_type = 0
  86. )
  87. db.add(new_detail)
  88. db.commit()
  89. else:
  90. raise Exception("用户不存在")
  91. return {
  92. "code": 200,
  93. "msg": "点名创建成功",
  94. "data": new_call_id
  95. }
  96. except Exception as e:
  97. traceback.print_exc()
  98. # 处理异常
  99. raise HTTPException(status_code=500, detail=str(e))
  100. # 结束应答
  101. @router.post("/end")
  102. async def end_call(
  103. db: Session = Depends(get_db),
  104. body = Depends(remove_xss_json),
  105. user_id = Depends(valid_access_token)
  106. ):
  107. call_id = body['call_id']
  108. row = db.query(OnlineRollCallBase).filter(and_(OnlineRollCallBase.id == call_id, OnlineRollCallBase.del_flag == '0')).first()
  109. if row is None:
  110. return {
  111. "code": 500,
  112. "msg": "点名记录不存在"
  113. }
  114. if row.call_status != 1:
  115. return {
  116. "code": 500,
  117. "msg": "点名记录状态已结束"
  118. }
  119. row.end_time = datetime.now()
  120. row.call_status = 2 # 结束
  121. row.update_time = datetime.now()
  122. db.commit()
  123. return {
  124. "code": 200,
  125. "msg": "点名结束成功"
  126. }
  127. # 标记用户已应答
  128. @router.post("/ack")
  129. async def ack_all(
  130. db: Session = Depends(get_db),
  131. body = Depends(remove_xss_json),
  132. user_id = Depends(valid_access_token)
  133. ):
  134. call_id = body['call_id']
  135. ack_type = body['ack_type']
  136. base_row = db.query(OnlineRollCallBase).filter(OnlineRollCallBase.id == call_id).first()
  137. if base_row is None:
  138. return {
  139. "code": 500,
  140. "msg": "点名记录不存在"
  141. }
  142. detail_row = db.query(OnlineRollCallDetail).filter(and_(OnlineRollCallDetail.pid == call_id, OnlineRollCallDetail.user_id == user_id)).first()
  143. if detail_row is None:
  144. return {
  145. "code": 500,
  146. "msg": "点名记录不存在!"
  147. }
  148. detail_row.ack_type = ack_type
  149. detail_row.act_time = datetime.now()
  150. db.commit()
  151. # 统计应答数
  152. ack_count = db.query(OnlineRollCallDetail).filter(and_(OnlineRollCallDetail.pid == call_id, OnlineRollCallDetail.ack_status == 1)).count()
  153. # 统计未应答数
  154. unack_count = db.query(OnlineRollCallDetail).filter(and_(OnlineRollCallDetail.pid == call_id, OnlineRollCallDetail.ack_status == 2)).count()
  155. db.query(OnlineRollCallBase).filter(OnlineRollCallBase.id == call_id).update({
  156. "ack_count": ack_count, "unack_count": unack_count, "update_time": datetime.now()
  157. })
  158. db.commit()
  159. return {
  160. "code": 200,
  161. "msg": "应答成功"
  162. }
  163. # 查询是否有我的待应答记录(提醒)
  164. @router.post("/mycall")
  165. async def query_mycall(
  166. db: Session = Depends(get_db),
  167. user_id = Depends(valid_access_token)
  168. ):
  169. rows = db.query(OnlineRollCallDetail).filter(and_(OnlineRollCallDetail.user_id == user_id, OnlineRollCallDetail.ack_status == 0)).all()
  170. data = []
  171. for row in rows:
  172. call_id = row.pid
  173. base_row = db.query(OnlineRollCallBase).filter(and_(OnlineRollCallBase.id == call_id, OnlineRollCallBase.del_flag == '0')).first()
  174. data.append({
  175. "call_id": call_id,
  176. "create_time": get_datetime_str(base_row.create_time)
  177. })
  178. return {
  179. "code": 200,
  180. "msg": "查询成功",
  181. "data": data,
  182. "total": len(data)
  183. }
  184. #应答详情
  185. @router.get('/detail')
  186. async def get_event_detail(
  187. request: Request,
  188. call_id: str = Query(None, description='点名ID'),
  189. db: Session = Depends(get_db)):
  190. try:
  191. base_row = db.query(OnlineRollCallBase).filter(OnlineRollCallBase.id == call_id).first()
  192. if base_row is None:
  193. return {
  194. "code": 500,
  195. "msg": "点名记录不存在"
  196. }
  197. data = get_model_dict(base_row)
  198. data['create_time'] = get_datetime_str(data['create_time'])
  199. data['update_time'] = get_datetime_str(data['update_time'])
  200. detail_rows = db.query(OnlineRollCallDetail).filter(OnlineRollCallDetail.pid == call_id).all()
  201. users = []
  202. for row in detail_rows:
  203. detail_info = get_model_dict(row)
  204. detail_info['create_time'] = get_datetime_str(detail_info['create_time'])
  205. detail_info['act_time'] = get_datetime_str(detail_info['act_time'])
  206. users.append(detail_info)
  207. data['users'] = users
  208. return {
  209. "code": 200,
  210. "msg": "查询成功",
  211. "data": data
  212. }
  213. except Exception as e:
  214. # 处理异常
  215. traceback.print_exc()
  216. raise HTTPException(status_code=500, detail=str(e))