event_xp.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. from fastapi import APIRouter, Request, Depends, HTTPException, Query
  2. from sqlalchemy.exc import IntegrityError
  3. from fastapi.responses import HTMLResponse, FileResponse
  4. from fastapi.responses import JSONResponse
  5. from database import get_db
  6. from sqlalchemy import text, exists, and_, or_, not_, extract, func
  7. from sqlalchemy.orm import Session
  8. from models import *
  9. import json
  10. import random
  11. from sqlalchemy import create_engine, select
  12. from typing import Optional
  13. from utils.StripTagsHTMLParser import *
  14. from common.db import db_event_management, db_dept, db_user, db_area, db_emergency_plan, db_dict, db_task
  15. from common.security import valid_access_token
  16. import traceback
  17. from utils import *
  18. from datetime import datetime, timedelta
  19. from dateutil.relativedelta import relativedelta
  20. import os
  21. router = APIRouter()
  22. # 上报伤亡情况
  23. @router.post("/creat_event_briefing")
  24. async def creat_event_briefing(
  25. request: Request,
  26. body = Depends(remove_xss_json),
  27. db: Session = Depends(get_db),
  28. user_id = Depends(valid_access_token)
  29. ):
  30. fileList = []
  31. if 'fileList' in body:
  32. fileList = body['fileList']
  33. del body['fileList']
  34. longitude = ''
  35. latitude = ''
  36. if 'lnglat' in body:
  37. longitude = body['lnglat'][0]
  38. latitude = body['lnglat'][1]
  39. del body['lnglat']
  40. new_briefing = EventBriefing(**body, del_flag='0', recorded_by=user_id, create_time=datetime.now(), longitude=longitude, latitude=latitude)
  41. db.add(new_briefing)
  42. db.commit()
  43. db.refresh(new_briefing)
  44. if len(fileList) > 0:
  45. event_files = [
  46. EventFile(
  47. event_id=new_briefing.id,
  48. file_name=fileName["name"], # 使用 fileName["name"] 作为文件名
  49. file_path=f'/data/upload/mergefile/uploads/{fileName["url"]}',
  50. file_size=os.path.getsize(f'/data/upload/mergefile/uploads/{fileName["url"]}'),
  51. storage_file_name=fileName["url"],
  52. foreign_key=new_briefing.event_id,
  53. from_scenario="event_briefing",
  54. update_time=datetime.now(),
  55. create_time=datetime.now(),
  56. del_flag='0'
  57. )
  58. for fileName in fileList # body['fileList'] 现在是一个包含对象的数组,每个对象都有 'name' 和 'url' 属性
  59. ]
  60. db.add_all(event_files)
  61. db.commit()
  62. return {
  63. "code": 200,
  64. "msg": "保存事件简报成功"
  65. }
  66. @router.get('/event_briefing/list')
  67. async def get_event_list(
  68. event_id: str,
  69. page: int = Query(1, gt=0, description='页码'),
  70. page_size: int = Query(10, gt=0, description='pageSize'),
  71. db: Session = Depends(get_db)
  72. ):
  73. try:
  74. # 应用查询条件
  75. where = and_(EventBriefing.del_flag == '0', EventBriefing.event_id == event_id)
  76. # 计算总条目数
  77. q = db.query(func.count(EventBriefing.id))
  78. q = q.filter(where)
  79. total = q.scalar()
  80. # 执行分页查询
  81. q = db.query(EventBriefing)
  82. q = q.filter(where)
  83. rows = q.order_by(EventBriefing.id.desc()).offset((page - 1) * page_size).limit(page_size).all()
  84. data = [
  85. {
  86. "event_id": row.event_id,
  87. "address": row.address,
  88. "longitude": row.longitude,
  89. "latitude": row.latitude,
  90. "report_dept": row.report_dept,
  91. "briefing_content": row.briefing_content,
  92. "create_time": get_datetime_str(row.create_time),
  93. "files": db_event_management.get_briefing_file_list(db, row.id)
  94. }
  95. for row in rows
  96. ]
  97. # 返回结果
  98. return {
  99. "code": 200,
  100. "msg": "查询成功",
  101. "data": data,
  102. "total": total
  103. }
  104. except Exception as e:
  105. # 处理异常
  106. traceback.print_exc()
  107. raise HTTPException(status_code=500, detail=str(e))
  108. # 上报事件指挥人员
  109. @router.post("/create_leader_user")
  110. async def create_leader_user(
  111. request: Request,
  112. body = Depends(remove_xss_json),
  113. db: Session = Depends(get_db),
  114. user_id = Depends(valid_access_token)
  115. ):
  116. '''
  117. event_id = body['event_id']
  118. if 'users' not in body:
  119. return {
  120. "code": 500,
  121. "msg": "请上报事件指挥人员"
  122. }
  123. for n in body['users']:
  124. unit_id = n['unit_id']
  125. unit_name = db_dept.get_dept_name_by_id(db, unit_id)
  126. new_user = EventLeaderUser(
  127. unit_id = unit_id,
  128. unit_name = unit_name,
  129. event_id = event_id,
  130. user_type = n['user_type'],
  131. user_name = n['user_name'],
  132. mobile = n['mobile'],
  133. create_time = datetime.now(),
  134. recorded_by = user_id,
  135. del_flag = '0'
  136. )
  137. db.add(new_user)
  138. db.commit()
  139. '''
  140. notify_id = body['id']
  141. notify_info = db.query(EventEmergencyNotify).filter(EventEmergencyNotify.id == notify_id).first()
  142. dept_id = notify_info.dept_id
  143. dept_name = notify_info.dept_name
  144. event_id = notify_info.event_id
  145. data1 = body['data1']
  146. if data1 is not None and len(data1) > 0:
  147. db.query(EventLeaderUser).filter(and_(EventLeaderUser.user_type == '赶赴现场人员', EventLeaderUser.del_flag == '0').update({"del_flag": "1"}))
  148. db.commit()
  149. for n in data1:
  150. new_user = EventLeaderUser(
  151. unit_id = dept_id,
  152. unit_name = dept_name,
  153. event_id = event_id,
  154. user_type = '赶赴现场人员',
  155. user_name = n['name'],
  156. mobile = n['phone'],
  157. create_time = datetime.now(),
  158. recorded_by = user_id,
  159. del_flag = '0'
  160. )
  161. db.add(new_user)
  162. db.commit()
  163. data2 = body['data2']
  164. if data2 is not None and len(data2) > 0:
  165. db.query(EventLeaderUser).filter(and_(EventLeaderUser.user_type == '指挥部值守人员', EventLeaderUser.del_flag == '0').update({"del_flag": "1"}))
  166. db.commit()
  167. for n in data2:
  168. new_user = EventLeaderUser(
  169. unit_id = dept_id,
  170. unit_name = dept_name,
  171. event_id = event_id,
  172. user_type = '指挥部值守人员',
  173. user_name = n['name'],
  174. mobile = n['phone'],
  175. create_time = datetime.now(),
  176. recorded_by = user_id,
  177. del_flag = '0'
  178. )
  179. db.add(new_user)
  180. db.commit()
  181. return {
  182. "code": 200,
  183. "msg": "上报事件指挥人员成功"
  184. }
  185. @router.get('/emergency_notify/detail')
  186. async def get_info_detail(
  187. request: Request,
  188. id: str = Query(None, description='信息编号'),
  189. db: Session = Depends(get_db),
  190. user_id = Depends(valid_access_token)):
  191. try:
  192. # 构建查询
  193. notify_info = db.query(EventEmergencyNotify).filter(EventEmergencyNotify.id == id).first()
  194. if notify_info is not None:
  195. event_id = notify_info.event_id
  196. plan_id = notify_info.plan_id
  197. sent_time = notify_info.sent_time
  198. plan_info = db.query(EmergencyPlan).filter(EmergencyPlan.plan_number == plan_id).first()
  199. plan_name = plan_info.plan_name
  200. event_info = db.query(EventBase).filter(EventBase.event_code == event_id).first()
  201. event_title = db_event_management.get_event_title(db, event_id)
  202. response_level = db_dict.get_dict_label(db, "response_level", event_info.response_level)
  203. data = {
  204. "id": notify_info.id,
  205. "title": f"{plan_name}{response_level}通知",
  206. "response_level": response_level,
  207. "sent_time": sent_time.strftime("%Y-%m-%d %H:%M"),
  208. "event_title": event_title,
  209. "content": notify_info.yzy_content
  210. }
  211. return {
  212. "code": 200,
  213. "msg": "查询成功",
  214. "data": data
  215. }
  216. else:
  217. return {
  218. "code": 500,
  219. "msg": "查询失败"
  220. }
  221. except Exception as e:
  222. # 处理异常
  223. traceback.print_exc()
  224. raise HTTPException(status_code=500, detail=str(e))
  225. @router.get('/task_registration/detail')
  226. async def get_info_detail(
  227. request: Request,
  228. task_id: str = Query(None, description='任务编号'),
  229. db: Session = Depends(get_db),
  230. user_id = Depends(valid_access_token)):
  231. try:
  232. # 构建查询
  233. task_info = db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id).first()
  234. if task_info is not None:
  235. event_id = task_info.event_code
  236. event_title = db_event_management.get_event_title(db, event_id)
  237. data = {
  238. "id": task_info.id,
  239. "task_id": task_info.task_id,
  240. "title": f"{event_title}任务",
  241. "event_title": event_title,
  242. "unit_name": task_info.unit_name,
  243. "executor": task_info.executor,
  244. "creation_time": task_info.creation_time.strftime("%Y-%m-%d %H:%M"),
  245. "expire_time": task_info.expire_time.strftime("%Y-%m-%d"),
  246. "task_description": task_info.task_description,
  247. "task_type": db_task.get_task_type_text(task_info.task_type),
  248. "processing_status": task_info.processing_status
  249. }
  250. return {
  251. "code": 200,
  252. "msg": "查询成功",
  253. "data": data
  254. }
  255. else:
  256. return {
  257. "code": 500,
  258. "msg": "查询失败"
  259. }
  260. except Exception as e:
  261. # 处理异常
  262. traceback.print_exc()
  263. raise HTTPException(status_code=500, detail=str(e))
  264. @router.get('/completed_trend')
  265. async def get_completed_trend(
  266. request: Request,
  267. db: Session = Depends(get_db),
  268. user_id = Depends(valid_access_token)):
  269. current_date = datetime.now()
  270. xAxis = []
  271. series = [[], [], [], []]
  272. for n in range(-5, 1):
  273. last_date = current_date + relativedelta(months=n)
  274. last_year = last_date.year
  275. last_month = last_date.month
  276. last_date_str = datetime.strftime(last_date, "%Y-%m")
  277. xAxis.append(last_date_str)
  278. i = 0
  279. for event_type in ['0', '1', '2', '3']:
  280. c1 = db.query(func.count(EventBase.id)).filter(and_(
  281. EventBase.del_flag == '0',
  282. EventBase.event_type == event_type,
  283. extract('year', EventBase.event_time) == last_year,
  284. extract('month', EventBase.event_time) == last_month
  285. )).scalar()
  286. if c1 is None:
  287. c1 = 0
  288. series[i].append(c1)
  289. i = i + 1
  290. data = {
  291. "xAxis": xAxis,
  292. "series": series
  293. }
  294. return {
  295. "code": 200,
  296. "msg": "查询成功",
  297. "data": data
  298. }