event.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  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_
  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_user, db_area, db_emergency_plan
  15. from common.security import valid_access_token
  16. import traceback
  17. from utils import *
  18. from datetime import datetime, timedelta
  19. router = APIRouter()
  20. @router.post('/create')
  21. async def create_event(
  22. request: Request,
  23. db: Session = Depends(get_db),
  24. body = Depends(remove_xss_json),
  25. user_id = Depends(valid_access_token)):
  26. try:
  27. # 验证必需的字段
  28. required_fields = ['event_title', 'event_type', 'event_level', 'event_status', 'event_time', 'report_time',
  29. 'deaths', 'injuries', "missing", "event_source", "longitude", "latitude", "event_description", "address"]
  30. missing_fields = [field for field in required_fields if field not in body]
  31. if missing_fields:
  32. raise HTTPException(status_code=401, detail=f"Missing required fields: {', '.join(missing_fields)}")
  33. eventId = db_event_management.get_next_event_id(db)
  34. # 未上报时清空伤亡人数
  35. if body['casualties'] == '0':
  36. body['deaths'] = None
  37. body['injuries'] = None
  38. body['missing'] = None
  39. region_code = db_area.get_region_code_by_gps(db, body['longitude'], body['latitude'])
  40. event_base = EventBase(
  41. **body,
  42. event_code = eventId,
  43. recorded_by = user_id,
  44. region_code = region_code
  45. )
  46. db.add(event_base)
  47. db.commit()
  48. db.refresh(event_base)
  49. # 事件跟踪表
  50. event_tracking = EventTracking()
  51. event_tracking.event_id = event_base.id
  52. event_tracking.event_status = event_base.event_status
  53. event_tracking.event_level = event_base.event_level
  54. event_tracking.tracking_time = datetime.now()
  55. event_tracking.recorded_by = user_id
  56. event_tracking.del_flag = "0"
  57. db.add(event_tracking)
  58. db.commit()
  59. return {
  60. "code": 200,
  61. "msg": "新建事件成功",
  62. "data": eventId
  63. }
  64. except Exception as e:
  65. db.rollback()
  66. traceback.print_exc()
  67. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  68. @router.get('/list')
  69. async def get_event_list(
  70. event_type: str = Query('', description='事件类型的字典键值'),
  71. event_level: str = Query('', description='事件等级的字典键值'),
  72. event_status: str = Query('', description='事件状态的字典键值'),
  73. event_time: str = Query('', description='事发时间'),
  74. region_code: str = Query('', description='行政区划代码'),
  75. keyword: str = Query('', description='根据事件标题或描述中的关键字进行模糊搜索'),
  76. sort_by: str = Query('', description='排序字段'),
  77. sort_order: str = Query("asc", description='排序方式'),
  78. page: int = Query(1, gt=0, description='页码'),
  79. page_size: int = Query(10, gt=0, description='pageSize'),
  80. db: Session = Depends(get_db)
  81. ):
  82. try:
  83. # 应用查询条件
  84. where = and_(EventBase.del_flag == '0')
  85. if event_type != '':
  86. where = and_(where, EventBase.event_type == event_type)
  87. if event_level != '':
  88. where = and_(where, EventBase.event_level == event_level)
  89. if event_status != '':
  90. where = and_(where, EventBase.event_status == event_status)
  91. if event_time != '':
  92. event_time = datetime.strptime(event_time, "%Y-%m-%d")
  93. event_time = event_time + timedelta(days=1)
  94. where = and_(where, EventBase.event_time.between(event_time, event_time + timedelta(days=1)))
  95. if region_code != '':
  96. where = and_(where, EventBase.region_code.like('{}%'.format(region_code)))
  97. if keyword != '':
  98. where = and_(where, or_(EventBase.event_title.like('%{}%'.format(keyword)), EventBase.address.like('%{}%'.format(keyword))))
  99. print(where)
  100. # 计算总条目数
  101. q = db.query(func.count(EventBase.id))
  102. q = q.filter(where)
  103. total = q.scalar()
  104. # 执行分页查询
  105. q = db.query(EventBase)
  106. q = q.filter(where)
  107. rows = q.order_by(EventBase.id.desc()).offset((page - 1) * page_size).limit(page_size).all()
  108. data = [
  109. {
  110. "event_id": row.event_code,
  111. "event_title": row.event_title,
  112. "event_type": row.event_type,
  113. "event_level": row.event_level,
  114. "event_status": row.event_status,
  115. "latitude": row.latitude,
  116. "longitude": row.longitude,
  117. "address": row.address,
  118. "event_time": get_datetime_str(row.event_time)
  119. }
  120. for row in rows
  121. ]
  122. # 返回结果
  123. return {
  124. "code": 200,
  125. "msg": "查询成功",
  126. "data": data,
  127. "total": total
  128. }
  129. except Exception as e:
  130. # 处理异常
  131. traceback.print_exc()
  132. raise HTTPException(status_code=500, detail=str(e))
  133. @router.get('/edit')
  134. async def get_edit_event(
  135. request: Request,
  136. event_id: str = Query(None, description='事件编号'),
  137. db: Session = Depends(get_db)):
  138. row = db.query(EventBase).filter(EventBase.event_code == event_id).first()
  139. data = get_model_dict(row)
  140. data['eventId'] = data['event_code']
  141. data['event_time'] = get_datetime_str(data['event_time'])
  142. data['report_time'] = get_datetime_str(data['report_time'])
  143. return {
  144. "code": 200,
  145. "msg": "查询成功",
  146. "data": data
  147. }
  148. @router.post('/edit')
  149. async def post_edit_event(
  150. request: Request,
  151. body = Depends(remove_xss_json),
  152. db: Session = Depends(get_db),
  153. user_id = Depends(valid_access_token)):
  154. eventId = body['eventId']
  155. del body['eventId']
  156. body['recorded_by'] = user_id
  157. # 未上报时清空伤亡人数
  158. if body['casualties'] == '0':
  159. body['deaths'] = None
  160. body['injuries'] = None
  161. body['missing'] = None
  162. db.query(EventBase).filter(EventBase.event_code == eventId).update(body)
  163. db.commit()
  164. return {
  165. "code": 200,
  166. "msg": "保存事件成功"
  167. }
  168. @router.post("/uploadEventCasualties")
  169. async def uploadEventCasualties(
  170. request: Request,
  171. body = Depends(remove_xss_json),
  172. db: Session = Depends(get_db)
  173. ):
  174. eventId = body['eventId']
  175. del body['eventId']
  176. body['casualties'] = '1'
  177. db.query(EventBase).filter(EventBase.event_code == eventId).update(body)
  178. db.commit()
  179. return {
  180. "code": 200,
  181. "msg": "上报伤亡情况成功"
  182. }
  183. @router.get('/detail')
  184. async def get_event_detail(
  185. request: Request,
  186. event_id: str = Query(None, description='事件编号'),
  187. db: Session = Depends(get_db)):
  188. print('event_id:',event_id)
  189. try:
  190. # 构建查询
  191. query = db.query(EventBase)
  192. query = query.filter(EventBase.event_code == event_id)
  193. # 执行查询
  194. row = query.first()
  195. if row is not None:
  196. return {
  197. "code": 200,
  198. "msg": "查询成功",
  199. "data": {
  200. "id": row.id,
  201. "event_id": row.event_code,
  202. "event_title": row.event_title,
  203. "event_type": row.event_type,
  204. "event_level": row.event_level,
  205. "event_status": row.event_status,
  206. "event_source": row.event_source,
  207. "event_time": get_datetime_str(row.event_time),
  208. "report_time": get_datetime_str(row.report_time),
  209. "casualties": row.casualties,
  210. "deaths": row.deaths,
  211. "injuries": row.injuries,
  212. "missing": row.missing,
  213. "reported_by": db_user.get_nick_name_by_id(db, row.recorded_by),
  214. "contact": row.contact,
  215. "event_description": row.event_description,
  216. "latitude": row.latitude,
  217. "longitude": row.longitude,
  218. "address": row.address,
  219. "plan_name": db_emergency_plan.get_plan_name_by_id(db, row.plan_id),
  220. "del_flag": row.del_flag,
  221. "summary_file": db_event_management.get_summary_file_list(db, row.id),
  222. # 事件跟踪
  223. "event_status_tracks": db_event_management.get_event_status_track(db, row.id),
  224. # 事件等级
  225. "event_level_tracks": db_event_management.get_event_level_track(db, row.id)
  226. }
  227. }
  228. else:
  229. return {
  230. "code": 500,
  231. "msg": "查询失败"
  232. }
  233. except Exception as e:
  234. # 处理异常
  235. traceback.print_exc()
  236. raise HTTPException(status_code=500, detail=str(e))
  237. @router.post('/start')
  238. async def start_event(
  239. request: Request,
  240. db: Session = Depends(get_db),
  241. body = Depends(remove_xss_json),
  242. user_id = Depends(valid_access_token)):
  243. try:
  244. event_base = db.query(EventBase).filter(EventBase.event_code == body['eventId']).first()
  245. if event_base is not None:
  246. event_base.event_status = "1" # 开始指挥
  247. event_base.event_level= body['event_level']
  248. event_tracking = EventTracking()
  249. event_tracking.event_id = event_base.id
  250. event_tracking.event_status = event_base.event_status
  251. event_tracking.event_level = body['event_level']
  252. event_tracking.tracking_time = datetime.now()
  253. event_tracking.recorded_by = user_id
  254. event_tracking.del_flag = "0"
  255. db.add(event_tracking)
  256. db.commit()
  257. return {
  258. "code": 200,
  259. "msg": "开始指挥成功"
  260. }
  261. except Exception as e:
  262. # 处理异常
  263. db.rollback()
  264. traceback.print_exc()
  265. raise HTTPException(status_code=500, detail=str(e))
  266. @router.post('/close')
  267. async def close_event(
  268. request: Request,
  269. db: Session = Depends(get_db),
  270. body = Depends(remove_xss_json),
  271. user_id = Depends(valid_access_token)):
  272. try:
  273. # 验证必需的字段
  274. required_fields = ['eventId', 'deaths', 'injuries', 'missing', 'fileNames']
  275. missing_fields = [field for field in required_fields if field not in body]
  276. print('missing_fields', missing_fields)
  277. if missing_fields:
  278. raise HTTPException(status_code=401, detail=f"Missing required fields: {', '.join(missing_fields)}")
  279. eventId = body['eventId']
  280. # 标记关闭状态
  281. event_base = db.query(EventBase).filter(EventBase.event_code == eventId).first()
  282. event_base.event_status = "3"
  283. db.commit()
  284. event_tracking = EventTracking()
  285. event_tracking.event_id = event_base.id
  286. event_tracking.event_status = event_base.event_status
  287. event_tracking.event_level = event_base.event_level
  288. event_tracking.tracking_time = datetime.now()
  289. event_tracking.recorded_by = user_id
  290. event_tracking.del_flag = "0"
  291. db.add(event_tracking)
  292. db.commit()
  293. return {
  294. "code": 200,
  295. "msg": '关闭事件成功'
  296. }
  297. except Exception as e:
  298. # 处理异常
  299. traceback.print_exc()
  300. raise HTTPException(status_code=500, detail=str(e))
  301. @router.post('/stop')
  302. async def stop_event(
  303. request: Request,
  304. db: Session = Depends(get_db),
  305. body = Depends(remove_xss_json)):
  306. try:
  307. eventId = body['eventId']
  308. db.query(EventBase).filter(EventBase.event_code == eventId).update({"event_status": "2"})
  309. db.commit()
  310. return {
  311. "code": 200,
  312. "msg": '结束指挥成功'
  313. }
  314. except Exception as e:
  315. traceback.print_exc()
  316. # 处理异常
  317. raise HTTPException(status_code=500, detail=str(e))
  318. @router.post('/delete')
  319. async def delete_event(
  320. request: Request,
  321. db: Session = Depends(get_db),
  322. body = Depends(remove_xss_json)):
  323. try:
  324. eventId = body['eventId']
  325. db.query(EventBase).filter(EventBase.event_code == eventId).update({"del_flag": "2"})
  326. db.commit()
  327. return {
  328. "code": 200,
  329. "msg": '删除事件成功'
  330. }
  331. except Exception as e:
  332. traceback.print_exc()
  333. # 处理异常
  334. raise HTTPException(status_code=500, detail=str(e))
  335. @router.get("/download_file", response_class=FileResponse, summary="下载总结报告")
  336. async def download_file(
  337. request: Request,
  338. file_id: int,
  339. event_id: int,
  340. db: Session = Depends(get_db)
  341. ):
  342. row = db.query(EventFile).filter(and_(EventFile.del_flag == '0', EventFile.id == file_id, EventFile.event_id == event_id)).first()
  343. if row is not None:
  344. return FileResponse(row.file_path)