__init__.py 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends,Query, HTTPException, status
  4. from common.security import valid_access_token
  5. from fastapi.responses import JSONResponse
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy import and_, or_
  8. from pydantic import BaseModel
  9. from datetime import datetime
  10. from database import get_db
  11. from typing import List
  12. from models import *
  13. from utils import *
  14. import json
  15. import traceback
  16. router = APIRouter()
  17. class File(BaseModel):
  18. status :str
  19. name : str
  20. url : str
  21. class PlanCreateForm(BaseModel):
  22. planName : str
  23. planType : int
  24. # planTypeDesc : str
  25. publishDate: str
  26. organizingUnit : str
  27. document : str
  28. fileList : List[File]
  29. class PlanUpdateForm(BaseModel):
  30. planUid : str
  31. planName : str = None
  32. planType : int = None
  33. publishDate: str = None
  34. organizingUnit : str = None
  35. document : str = None
  36. fileList : List[File] = []
  37. class DrillCreateForm(BaseModel):
  38. planId : str
  39. drillName : str
  40. drillUnit : str
  41. year : int
  42. drillTime: str
  43. drillAddress : str
  44. lon : float
  45. lat : float
  46. drillProject : List[File]
  47. drillVideo : List[File]
  48. drillPicture : List[File]
  49. class DrillUpdateForm(BaseModel):
  50. drillId : str
  51. planId : str = None
  52. drillName : str = None
  53. drillUnit : str = None
  54. year : int = None
  55. drillTime: str = None
  56. drillAddress : str = None
  57. lon : float = None
  58. lat : float = None
  59. drillProject : List[File] = []
  60. drillVideo : List[File] = []
  61. drillPicture : List[File] = []
  62. class TrainingCreateForm(BaseModel):
  63. planId:str
  64. theme : str
  65. unitName : str
  66. trainingWay : str
  67. peopleNum: int
  68. startTime : str
  69. endTime : str
  70. Content :str
  71. address : str
  72. lon : float
  73. lat : float
  74. class TrainingUpdateForm(BaseModel):
  75. trainingId : str
  76. planId:str = None
  77. theme : str = None
  78. unitName : str = None
  79. trainingWay : str = None
  80. peopleNum: int = None
  81. startTime : str = None
  82. endTime : str = None
  83. Content :str = None
  84. address : str = None
  85. lon : float = None
  86. lat : float = None
  87. def get_file_query_fun(from_scenario,foreign_key,db: Session):
  88. file_query = db.query(EmergencyFile)
  89. file_query = file_query.filter(EmergencyFile.del_flag != '2')
  90. file_query = file_query.filter(EmergencyFile.from_scenario == from_scenario)
  91. file_query = file_query.filter(EmergencyFile.foreign_key == foreign_key)
  92. files = file_query.all()
  93. result = [{
  94. "uid": file.file_id,
  95. "status": file.status,
  96. "name": file.file_name_desc,
  97. "url": file.file_name #"/api/file/download/%s" %
  98. } for file in files]
  99. return result
  100. def delete_file_fun(from_scenario,foreign_key,db: Session):
  101. file_query = db.query(EmergencyFile)
  102. file_query = file_query.filter(EmergencyFile.del_flag != '2')
  103. file_query = file_query.filter(EmergencyFile.from_scenario == from_scenario)
  104. file_query = file_query.filter(EmergencyFile.foreign_key == foreign_key)
  105. files = file_query.all()
  106. for file in files:
  107. file.del_flag='2'
  108. # db.commit()
  109. def create_file_fun(file,from_scenario,foreign_key,db: Session):
  110. file_name = file.url
  111. file_name_desc = file.name
  112. status = file.status
  113. new_file = EmergencyFile(
  114. file_id=new_guid(),
  115. foreign_key=foreign_key,
  116. from_scenario=from_scenario,
  117. file_name=file_name,
  118. file_name_desc=file_name_desc,
  119. status=status
  120. )
  121. db.add(new_file)
  122. # db.commit()
  123. # db.refresh(new_file)
  124. @router.get('/plan/list')
  125. async def get_emergency_plan_list(
  126. planType: str = Query(None, description='预案类型'),
  127. # publishDate: datetime = Query(None, description='发布日期'),
  128. beginTime :str = Query(None, description='发布日期起始'),
  129. endTime :str = Query(None, description='发布日期结束'),
  130. # planName: str = Query(None, description='预案名称'),
  131. keywords : str = Query(None, description='预案名称/编制单位'),
  132. page: int = Query(1, gt=0, description='页码'),
  133. pageSize: int = Query(5, gt=0, description='每页条目数量'),
  134. db: Session = Depends(get_db),
  135. user_id = Depends(valid_access_token)
  136. ):
  137. try:
  138. # 构建查询
  139. query = db.query(EmergencyPlan)
  140. query = query.filter(EmergencyPlan.del_flag != '2')
  141. # 应用查询条件
  142. if planType:
  143. query = query.filter(EmergencyPlan.plan_type == planType)
  144. # if publishDate:
  145. # query = query.filter(EmergencyPlan.publish_date == publishDate)
  146. if beginTime:
  147. query = query.filter(EmergencyPlan.publish_date >= beginTime)
  148. if endTime:
  149. query = query.filter(EmergencyPlan.publish_date <= endTime)
  150. if keywords:
  151. query = query.filter(
  152. or_(
  153. EmergencyPlan.plan_name.like(f'%{keywords}%'),
  154. EmergencyPlan.organizing_unit.like(f'%{keywords}%')
  155. )
  156. )
  157. # query = query.filter(EmergencyPlan.plan_name.like(f'%{planName}%'))
  158. # 计算总条目数
  159. total_items = query.count()
  160. # 排序
  161. query = query.order_by(EmergencyPlan.create_time.desc())
  162. # 执行分页查询
  163. emergency_plans = query.offset((page - 1) * pageSize).limit(pageSize).all()
  164. # 将查询结果转换为列表形式的字典
  165. emergency_plans_list = [
  166. {
  167. "planUid": plan.plan_id,
  168. "planId": plan.plan_number,
  169. "planName": plan.plan_name,
  170. "planType": plan.plan_type,
  171. "organizingUnit": plan.organizing_unit,
  172. "document": plan.document_number,
  173. "publishDate": plan.publish_date.strftime('%Y-%m-%d')
  174. }
  175. for plan in emergency_plans
  176. ]
  177. # 返回结果
  178. return {
  179. "code": 200,
  180. "msg": "成功获取预案列表",
  181. "data": emergency_plans_list,
  182. "total": total_items,
  183. "page": page,
  184. "pageSize": pageSize,
  185. "totalPages": (total_items + pageSize - 1) // pageSize
  186. }
  187. except Exception as e:
  188. # 处理异常
  189. raise HTTPException(status_code=500, detail=str(e))
  190. @router.get('/plan/{planId}')
  191. async def get_emergency_plan(
  192. planId: str ,
  193. db: Session = Depends(get_db),
  194. user_id = Depends(valid_access_token)
  195. ):
  196. try:
  197. # 构建查询
  198. query = db.query(EmergencyPlan)
  199. query = query.filter(EmergencyPlan.del_flag != '2')
  200. # 应用查询条件
  201. if planId:
  202. query = query.filter(EmergencyPlan.plan_number == planId)
  203. # 执行查询
  204. emergency_plan = query.first()
  205. if not emergency_plan:
  206. detail = "预案不存在"
  207. raise HTTPException(status_code=404, detail="预案不存在")
  208. # 将查询结果转换为列表形式的字典
  209. emergency_plan_result = {
  210. "planUid": emergency_plan.plan_id,
  211. "planId": emergency_plan.plan_number,
  212. "planName": emergency_plan.plan_name,
  213. "planType": emergency_plan.plan_type,
  214. "organizingUnit": emergency_plan.organizing_unit,
  215. "document": emergency_plan.document_number,
  216. "publishDate": emergency_plan.publish_date.strftime('%Y-%m-%d'),
  217. "fileList": get_file_query_fun(from_scenario='emergencyPlans_plan',foreign_key=emergency_plan.plan_id,db=db)
  218. }
  219. # 返回结果
  220. return {
  221. "code": 200,
  222. "msg": "成功获取预案详情",
  223. "data": emergency_plan_result
  224. }
  225. except Exception as e:
  226. # 处理异常
  227. if str(e)=='':
  228. e = detail
  229. raise HTTPException(status_code=500, detail=str(e))
  230. @router.post('/plan/create')
  231. async def create_emergency_plan(
  232. form_data:PlanCreateForm,
  233. db: Session = Depends(get_db),
  234. body = Depends(remove_xss_json),
  235. user_id = Depends(valid_access_token)
  236. ):
  237. try:
  238. # 提取请求数据
  239. plan_name = form_data.planName
  240. plan_type = form_data.planType
  241. # plan_type_desc = form_data.planTypeDesc
  242. publish_date = form_data.publishDate # 如果没有提供发布日期,则使用当前时间
  243. organizing_unit = form_data.organizingUnit # 使用用户位置作为编制单位
  244. document_number = form_data.document
  245. # 创建新的预案记录
  246. new_plan = EmergencyPlan(
  247. plan_id=new_guid(), # 假设使用 UUID 作为预案 UID
  248. plan_name=plan_name,
  249. plan_type=plan_type,
  250. # plan_type_desc=plan_type_desc,
  251. publish_date=publish_date,
  252. organizing_unit=organizing_unit,
  253. document_number=document_number,
  254. create_by = user_id
  255. )
  256. # 添加到数据库会话并提交
  257. db.add(new_plan)
  258. db.commit()
  259. db.refresh(new_plan) # 可选,如果需要刷新实例状态
  260. new_plan.plan_number= f'YJYA{str(new_plan.id).zfill(10)}'
  261. db.commit()
  262. for file in form_data.fileList:
  263. create_file_fun(file=file, from_scenario='emergencyPlans_plan', foreign_key=new_plan.plan_id, db=db)
  264. db.commit()
  265. # 返回创建成功的响应
  266. return {
  267. "code": 200,
  268. "msg": "预案创建成功",
  269. "data": None
  270. }
  271. except Exception as e:
  272. # 处理异常
  273. raise HTTPException(status_code=500, detail=str(e))
  274. @router.put('/plan/update')
  275. async def update_emergency_plan(
  276. form_data: PlanUpdateForm,
  277. db: Session = Depends(get_db),
  278. body = Depends(remove_xss_json),
  279. user_id = Depends(valid_access_token)
  280. ):
  281. try:
  282. # 提取请求数据
  283. query = db.query(EmergencyPlan)
  284. query = query.filter(EmergencyPlan.plan_id == form_data.planUid)
  285. query = query.filter(EmergencyPlan.del_flag != '2')
  286. plan = query.first()
  287. if not plan:
  288. detail = "预案不存在"
  289. raise HTTPException(status_code=404, detail="预案不存在")
  290. if form_data.planName:
  291. plan.plan_name = form_data.planName
  292. if form_data.planType:
  293. plan.plan_type = form_data.planType
  294. if form_data.publishDate:
  295. plan.publish_date = form_data.publishDate
  296. if form_data.organizingUnit:
  297. plan.organizing_unit = form_data.organizingUnit
  298. if form_data.document:
  299. plan.document_number = form_data.document
  300. if len(form_data.fileList)>0:
  301. delete_file_fun(from_scenario='emergencyPlans_plan',foreign_key=plan.plan_id,db=db)
  302. for file in form_data.fileList:
  303. create_file_fun(file=file,from_scenario='emergencyPlans_plan',foreign_key=plan.plan_id,db=db)
  304. if user_id:
  305. plan.create_by = user_id
  306. # 更新到数据库会话并提交
  307. db.commit()
  308. db.refresh(plan) # 可选,如果需要刷新实例状态
  309. # 返回创建成功的响应
  310. return {
  311. "code": 200,
  312. "msg": "预案更新成功",
  313. "data": None
  314. }
  315. except Exception as e:
  316. # 处理异常
  317. if str(e)=='':
  318. e = detail
  319. raise HTTPException(status_code=500, detail=str(e))
  320. @router.delete('/plan/delete')
  321. async def delete_emergency_plans(
  322. planUids: list,
  323. db: Session = Depends(get_db),
  324. body = Depends(remove_xss_json),
  325. user_id = Depends(valid_access_token)
  326. ):
  327. try:
  328. # 提取请求数据
  329. query = db.query(EmergencyPlan)
  330. query = query.filter(EmergencyPlan.del_flag != '2')
  331. query = query.filter(EmergencyPlan.plan_id.in_(planUids))
  332. plans = query.all()
  333. if not plans:
  334. detail = "预案不存在"
  335. raise HTTPException(status_code=404, detail="预案不存在")
  336. for plan in plans:
  337. plan.del_flag = '2'
  338. plan.create_by=user_id
  339. # 更新到数据库会话并提交
  340. db.commit()
  341. # 返回创建成功的响应
  342. return {
  343. "code": 200,
  344. "msg": "预案删除成功",
  345. "data": None
  346. }
  347. except Exception as e:
  348. # 处理异常
  349. if str(e) == '':
  350. e = detail
  351. raise HTTPException(status_code=500, detail=str(e))
  352. @router.delete('/plan/delete/{planUid}')
  353. async def delete_emergency_plan(
  354. planUid: str,
  355. db: Session = Depends(get_db),
  356. body = Depends(remove_xss_json),
  357. user_id = Depends(valid_access_token)
  358. ):
  359. try:
  360. # 提取请求数据
  361. query = db.query(EmergencyPlan)
  362. query = query.filter(EmergencyPlan.del_flag != '2')
  363. query = query.filter(EmergencyPlan.plan_id == planUid)
  364. plan = query.first()
  365. if not plan:
  366. detail = "预案不存在"
  367. raise HTTPException(status_code=404, detail="预案不存在")
  368. plan.del_flag = '2'
  369. plan.create_by = user_id
  370. # 更新到数据库会话并提交
  371. db.commit()
  372. db.refresh(plan) # 可选,如果需要刷新实例状态
  373. # 返回创建成功的响应
  374. return {
  375. "code": 200,
  376. "msg": "预案删除成功",
  377. "data": None
  378. }
  379. except Exception as e:
  380. # 处理异常
  381. if str(e) == '':
  382. e = detail
  383. raise HTTPException(status_code=500, detail=str(e))
  384. @router.get('/drill/list')
  385. async def get_emergency_drill_list(
  386. planNum: str = Query(None, description='预案编号'),
  387. page: int = Query(1, gt=0, description='页码'),
  388. pageSize: int = Query(5, gt=0, description='每页条目数量'),
  389. db: Session = Depends(get_db),
  390. user_id = Depends(valid_access_token)
  391. ):
  392. try:
  393. # 构建查询
  394. query = db.query(EmergencyDrill)
  395. query = query.filter(EmergencyDrill.del_flag != '2')
  396. # 应用查询条件
  397. if planNum:
  398. query = query.filter(EmergencyDrill.plan_number == planNum)
  399. else:
  400. detail = "planNum不存在"
  401. raise HTTPException(status_code=404, detail="planNum不存在")
  402. # 计算总条目数
  403. total_items = query.count()
  404. query = query.order_by(EmergencyDrill.create_time.desc())
  405. # 执行分页查询
  406. emergency_drill = query.offset((page - 1) * pageSize).limit(pageSize).all() #
  407. print(emergency_drill)
  408. # 将查询结果转换为列表形式的字典
  409. emergency_drill_list = []
  410. for drill in emergency_drill:
  411. emergency_drill = {
  412. "drillId": drill.drill_id,
  413. "drillName": drill.drill_name,
  414. "drillUnit": drill.organizing_unit,
  415. "year": drill.planned_annual,
  416. "drillTime": drill.planned_time.strftime('%Y-%m-%d %H:%M:%S'),
  417. "drillAddress": drill.drill_location,
  418. "drillProject": get_file_query_fun(from_scenario='emergencyPlans_drill_project', foreign_key=drill.drill_id,db=db),
  419. "drillVideo": get_file_query_fun(from_scenario='emergencyPlans_drill_video', foreign_key=drill.drill_id,db=db),
  420. "drillPicture": get_file_query_fun(from_scenario='emergencyPlans_drill_pic', foreign_key=drill.drill_id,db=db)
  421. }
  422. emergency_drill_list.append(emergency_drill)
  423. # 返回结果
  424. return {
  425. "code": 200,
  426. "msg": "成功",
  427. "data": emergency_drill_list,
  428. "total": total_items,
  429. "page": page,
  430. "pageSize": pageSize,
  431. "totalPages": (total_items + pageSize - 1) // pageSize
  432. }
  433. except Exception as e:
  434. # 处理异常
  435. if str(e) == '':
  436. e = detail
  437. raise HTTPException(status_code=500, detail=str(e))
  438. @router.get('/drill/{drillId}')
  439. async def get_emergency_drill(
  440. drillId: str = Query(None, description='演练编号'),
  441. db: Session = Depends(get_db),
  442. body = Depends(remove_xss_json),
  443. user_id = Depends(valid_access_token)
  444. ):
  445. try:
  446. # 构建查询
  447. query = db.query(EmergencyDrill)
  448. query = query.filter(EmergencyDrill.del_flag != '2')
  449. # 应用查询条件
  450. if drillId:
  451. query = query.filter(EmergencyDrill.drill_id == drillId)
  452. else:
  453. detail = "drillId不存在"
  454. raise HTTPException(status_code=404, detail="drillId不存在")
  455. # 执行查询
  456. drill = query.first()
  457. # 将查询结果转换为字典形式
  458. emergency_drill = {
  459. "drillId": drill.drill_id,
  460. "drillName": drill.drill_name,
  461. "drillUnit": drill.organizing_unit,
  462. "year": drill.planned_annual,
  463. "drillTime": drill.planned_time.strftime('%Y-%m-%d %H:%M:%S'),
  464. "drillAddress": drill.drill_location,
  465. "drillProject": get_file_query_fun(from_scenario='emergencyPlans_drill_project',foreign_key=drill.drill_id,db=db),
  466. "drillVideo": get_file_query_fun(from_scenario='emergencyPlans_drill_video', foreign_key=drill.drill_id,db=db),
  467. "drillPicture": get_file_query_fun(from_scenario='emergencyPlans_drill_pic', foreign_key=drill.drill_id,db=db)
  468. }
  469. # 返回结果
  470. return {
  471. "code": 200,
  472. "msg": "成功",
  473. "data": emergency_drill
  474. }
  475. except Exception as e:
  476. # 处理异常
  477. if str(e) == '':
  478. e = detail
  479. raise HTTPException(status_code=500, detail=str(e))
  480. @router.post('/drill/create')
  481. async def create_emergency_drill(
  482. form_data:DrillCreateForm,
  483. db: Session = Depends(get_db),
  484. body = Depends(remove_xss_json),
  485. user_id = Depends(valid_access_token)
  486. ):
  487. try:
  488. # 提取请求数据
  489. plan_number = form_data.planId
  490. drill_name = form_data.drillName
  491. organizing_unit = form_data.drillUnit
  492. planned_annual = form_data.year
  493. planned_time = form_data.drillTime
  494. drill_location = form_data.drillAddress
  495. drill_lon = form_data.lon
  496. drill_lat = form_data.lat
  497. # 创建新的预案记录
  498. new_drill = EmergencyDrill(
  499. drill_id=new_guid(), # 假设使用 UUID 作为预案 UID
  500. plan_number = plan_number,
  501. drill_name=drill_name,
  502. organizing_unit = organizing_unit,
  503. planned_annual = planned_annual,
  504. planned_time = planned_time,
  505. drill_location = drill_location,
  506. drill_lon = drill_lon,
  507. drill_lat = drill_lat,
  508. create_by = user_id
  509. )
  510. # 添加到数据库会话并提交
  511. db.add(new_drill)
  512. db.commit()
  513. db.refresh(new_drill) # 可选,如果需要刷新实例状态
  514. for file in form_data.drillProject:
  515. create_file_fun(file=file, from_scenario='emergencyPlans_drill_project', foreign_key=new_drill.drill_id, db=db)
  516. for file in form_data.drillVideo:
  517. create_file_fun(file=file, from_scenario='emergencyPlans_drill_video', foreign_key=new_drill.drill_id, db=db)
  518. for file in form_data.drillPicture:
  519. create_file_fun(file=file, from_scenario='emergencyPlans_drill_pic', foreign_key=new_drill.drill_id, db=db)
  520. db.commit()
  521. # 返回创建成功的响应
  522. return {
  523. "code": 200,
  524. "msg": "演练创建成功",
  525. "data": None
  526. }
  527. except Exception as e:
  528. # 处理异常
  529. raise HTTPException(status_code=500, detail=str(e))
  530. @router.put('/drill/update')
  531. async def update_emergency_drill(
  532. form_data:DrillUpdateForm,
  533. db: Session = Depends(get_db),
  534. body = Depends(remove_xss_json),
  535. user_id = Depends(valid_access_token)
  536. ):
  537. try:
  538. query = db.query(EmergencyDrill)
  539. query = query.filter(EmergencyDrill.drill_id == form_data.drillId)
  540. query = query.filter(EmergencyDrill.del_flag != '2')
  541. drill = query.first()
  542. # 判断预案编号是否存在,存在即更新
  543. if form_data.planId:
  544. drill.plan_number=form_data.planId
  545. # 判断演练名称是否存在,存在即更新
  546. if form_data.drillName:
  547. drill.drill_name=form_data.drillName
  548. # 判断演练单位是否存在,存在即更新
  549. if form_data.drillUnit:
  550. drill.organizing_unit=form_data.drillUnit
  551. # 判断演练年份是否存在,存在即更新
  552. if form_data.year:
  553. drill.planned_annual=form_data.year
  554. # 判断演练日期是否存在,存在即更新
  555. if form_data.drillTime:
  556. drill.planned_time=form_data.drillTime
  557. # 判断演练地址是否存在,存在即更新
  558. if form_data.drillAddress:
  559. drill.drill_location=form_data.drillAddress
  560. # 判断经度是否存在,存在即更新
  561. if form_data.lon:
  562. drill.drill_lon=form_data.lon
  563. # 判断纬度是否存在,存在即更新
  564. if form_data.lat:
  565. drill.drill_lat=form_data.lat
  566. # 判断演练方案是否存在,存在即更新
  567. if len(form_data.drillProject)>0:
  568. delete_file_fun(from_scenario='emergencyPlans_drill_project',foreign_key=drill.drill_id,db=db)
  569. for file in form_data.drillProject:
  570. create_file_fun(file=file,from_scenario='emergencyPlans_drill_project',foreign_key=drill.drill_id,db=db)
  571. # 判断演练视频是否存在,存在即更新
  572. if len(form_data.drillVideo) > 0:
  573. delete_file_fun(from_scenario='emergencyPlans_drill_video', foreign_key=drill.drill_id, db=db)
  574. for file in form_data.drillVideo:
  575. create_file_fun(file=file, from_scenario='emergencyPlans_drill_video', foreign_key=drill.drill_id,db=db)
  576. # 判断演练图片是否存在,存在即更新
  577. if len(form_data.drillPicture) > 0:
  578. delete_file_fun(from_scenario='emergencyPlans_drill_pic', foreign_key=drill.drill_id, db=db)
  579. for file in form_data.drillPicture:
  580. create_file_fun(file=file, from_scenario='emergencyPlans_drill_pic', foreign_key=drill.drill_id,db=db)
  581. if user_id:
  582. drill.create_by = user_id
  583. # 提交所有更新
  584. db.commit()
  585. # 返回更新成功的响应
  586. return {
  587. "code": 200,
  588. "msg": "演练更新成功",
  589. "data": None
  590. }
  591. except Exception as e:
  592. # 处理异常
  593. raise HTTPException(status_code=500, detail=str(e))
  594. @router.delete('/drill/delete')
  595. async def delete_emergency_drill(
  596. drillUids: list,
  597. db: Session = Depends(get_db),
  598. body = Depends(remove_xss_json),
  599. user_id = Depends(valid_access_token)
  600. ):
  601. try:
  602. # 提取请求数据
  603. query = db.query(EmergencyDrill)
  604. query = query.filter(EmergencyDrill.del_flag != '2')
  605. query = query.filter(EmergencyDrill.drill_id.in_(drillUids))
  606. drills = query.all()
  607. if not drills:
  608. detail = "演练不存在"
  609. raise HTTPException(status_code=404, detail="演练不存在")
  610. for drill in drills:
  611. drill.del_flag = '2'
  612. drill.create_by=user_id
  613. # 更新到数据库会话并提交
  614. db.commit()
  615. # 返回创建成功的响应
  616. return {
  617. "code": 200,
  618. "msg": "演练删除成功",
  619. "data": None
  620. }
  621. except Exception as e:
  622. # 处理异常
  623. if str(e) == '':
  624. e = detail
  625. raise HTTPException(status_code=500, detail=str(e))
  626. @router.delete('/drill/delete/{drillUid}')
  627. async def delete_emergency_drill(
  628. drillUid: str,
  629. db: Session = Depends(get_db),
  630. user_id = Depends(valid_access_token)
  631. ):
  632. try:
  633. # 提取请求数据
  634. query = db.query(EmergencyDrill)
  635. query = query.filter(EmergencyDrill.del_flag != '2')
  636. query = query.filter(EmergencyDrill.drill_id == drillUid)
  637. drill = query.first()
  638. if not drill:
  639. detail = "演练不存在"
  640. raise HTTPException(status_code=404, detail="演练不存在")
  641. drill.del_flag = '2'
  642. drill.create_by = user_id
  643. # 更新到数据库会话并提交
  644. db.commit()
  645. db.refresh(drill) # 可选,如果需要刷新实例状态
  646. # 返回创建成功的响应
  647. return {
  648. "code": 200,
  649. "msg": "演练删除成功",
  650. "data": None
  651. }
  652. except Exception as e:
  653. # 处理异常
  654. if str(e) == '':
  655. e = detail
  656. raise HTTPException(status_code=500, detail=str(e))
  657. @router.get('/training/list')
  658. async def get_emergency_training_list(
  659. planNum: str = Query(None, description='预案编号'),
  660. page: int = Query(1, gt=0, description='页码'),
  661. pageSize: int = Query(5, gt=0, description='每页条目数量'),
  662. db: Session = Depends(get_db),
  663. user_id = Depends(valid_access_token)
  664. ):
  665. try:
  666. # 构建查询
  667. query = db.query(EmergencyTrainingSession)
  668. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  669. # 应用查询条件
  670. if planNum:
  671. query = query.filter(EmergencyTrainingSession.plan_number == planNum)
  672. else:
  673. detail = "planNum不存在"
  674. raise HTTPException(status_code=404, detail="planNum不存在")
  675. # 计算总条目数
  676. total_items = query.count()
  677. query = query.order_by(EmergencyTrainingSession.start_time.desc())
  678. # 执行分页查询
  679. emergency_training = query.offset((page - 1) * pageSize).limit(pageSize).all() #
  680. # print(emergency_drill)
  681. # 将查询结果转换为列表形式的字典
  682. emergency_training_list = [
  683. {
  684. "trainingId": training.training_id,
  685. "theme": training.training_theme,
  686. "unitName": training.training_unit,
  687. "peopleNum": training.participant_count,
  688. "trainingWay":training.training_method,
  689. "startTime":training.start_time.strftime('%Y-%m-%d %H:%M:%S'),
  690. "endTime": training.end_time.strftime('%Y-%m-%d %H:%M:%S'),
  691. "address": training.training_location,
  692. "Content":training.training_content
  693. }
  694. for training in emergency_training
  695. ]
  696. # 返回结果
  697. return {
  698. "code": 200,
  699. "msg": "成功",
  700. "data": emergency_training_list,
  701. "total": total_items,
  702. "page": page,
  703. "pageSize": pageSize,
  704. "totalPages": (total_items + pageSize - 1) // pageSize
  705. }
  706. except Exception as e:
  707. # 处理异常
  708. if str(e) == '':
  709. e = detail
  710. raise HTTPException(status_code=500, detail=str(e))
  711. @router.get('/training/{trainingId}')
  712. async def get_emergency_training(
  713. trainingId: str = Query(None, description='培训编号'),
  714. db: Session = Depends(get_db),
  715. user_id = Depends(valid_access_token)
  716. ):
  717. try:
  718. # 构建查询
  719. query = db.query(EmergencyTrainingSession)
  720. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  721. # 应用查询条件
  722. if trainingId:
  723. query = query.filter(EmergencyTrainingSession.training_id == trainingId)
  724. else:
  725. detail = "trainingId不存在"
  726. raise HTTPException(status_code=404, detail="trainingId不存在")
  727. # 执行查询
  728. training = query.first() #
  729. # 将查询结果转换为列表形式的字典
  730. emergency_training = {
  731. "trainingId": training.training_id,
  732. "theme": training.training_theme,
  733. "unitName": training.training_unit,
  734. "peopleNum": training.participant_count,
  735. "trainingWay":training.training_method,
  736. "startTime":training.start_time.strftime('%Y-%m-%d %H:%M:%S'),
  737. "endTime": training.end_time.strftime('%Y-%m-%d %H:%M:%S'),
  738. "address": training.training_location,
  739. "Content":training.training_content
  740. }
  741. # 返回结果
  742. return {
  743. "code": 200,
  744. "msg": "成功",
  745. "data": emergency_training
  746. }
  747. except Exception as e:
  748. # 处理异常
  749. if str(e) == '':
  750. e = detail
  751. raise HTTPException(status_code=500, detail=str(e))
  752. @router.post('/training/create')
  753. async def create_emergency_training(
  754. form_data:TrainingCreateForm,
  755. db: Session = Depends(get_db),
  756. user_id = Depends(valid_access_token)
  757. ):
  758. try:
  759. # 创建新的预案记录
  760. new_training = EmergencyTrainingSession(
  761. training_id=new_guid(), # 假设使用 UUID 作为预案 UID
  762. training_theme=form_data.theme,
  763. training_unit=form_data.unitName,
  764. training_method=form_data.trainingWay,
  765. participant_count=form_data.peopleNum,
  766. start_time=form_data.startTime,
  767. end_time=form_data.endTime,
  768. training_content=form_data.Content,
  769. training_location=form_data.address,
  770. training_lon=form_data.lon,
  771. training_lat=form_data.lat,
  772. plan_number = form_data.planId
  773. )
  774. # 添加到数据库会话并提交
  775. db.add(new_training)
  776. db.commit()
  777. db.refresh(new_training) # 可选,如果需要刷新实例状态
  778. # 返回创建成功的响应
  779. return {
  780. "code": 200,
  781. "msg": "培训创建成功",
  782. "data": None
  783. }
  784. except Exception as e:
  785. # 处理异常
  786. raise HTTPException(status_code=500, detail=str(e))
  787. @router.put('/training/update')
  788. async def update_emergency_training(
  789. form_data:TrainingUpdateForm,
  790. db: Session = Depends(get_db),
  791. user_id = Depends(valid_access_token)
  792. ):
  793. try:
  794. query = db.query(EmergencyTrainingSession)
  795. query = query.filter(EmergencyTrainingSession.training_id == form_data.trainingId)
  796. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  797. training = query.first()
  798. # 判断预案编号是否存在,存在即更新
  799. if form_data.planId:
  800. training.plan_number = form_data.planId
  801. # 判断预案编号是否存在,存在即更新
  802. if form_data.theme:
  803. training.training_theme = form_data.theme
  804. # 判断预案编号是否存在,存在即更新
  805. if form_data.unitName:
  806. training.training_unit = form_data.unitName
  807. # 判断预案编号是否存在,存在即更新
  808. if form_data.trainingWay:
  809. training.training_method = form_data.trainingWay
  810. # 判断预案编号是否存在,存在即更新
  811. if form_data.peopleNum:
  812. training.participant_count = form_data.peopleNum
  813. # 判断预案编号是否存在,存在即更新
  814. if form_data.startTime:
  815. training.start_time = form_data.startTime
  816. # 判断预案编号是否存在,存在即更新
  817. if form_data.endTime:
  818. training.end_time = form_data.endTime
  819. # 判断预案编号是否存在,存在即更新
  820. if form_data.Content:
  821. training.training_content = form_data.Content
  822. # 判断预案编号是否存在,存在即更新
  823. if form_data.address:
  824. training.training_location = form_data.address
  825. # 判断预案编号是否存在,存在即更新
  826. if form_data.lon:
  827. training.training_lon = form_data.lon
  828. # 判断预案编号是否存在,存在即更新
  829. if form_data.lat:
  830. training.training_lat = form_data.lat
  831. if user_id:
  832. training.create_by = user_id
  833. # 提交
  834. db.commit()
  835. # 返回创建成功的响应
  836. return {
  837. "code": 200,
  838. "msg": "培训更新成功",
  839. "data": None
  840. }
  841. except Exception as e:
  842. # 处理异常
  843. raise HTTPException(status_code=500, detail=str(e))
  844. @router.delete('/training/delete')
  845. async def delete_emergency_training(
  846. trainingUids: list,
  847. db: Session = Depends(get_db),
  848. user_id = Depends(valid_access_token)
  849. ):
  850. try:
  851. # 提取请求数据
  852. query = db.query(EmergencyTrainingSession)
  853. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  854. query = query.filter(EmergencyTrainingSession.training_id.in_(trainingUids))
  855. trainings = query.all()
  856. if not trainings:
  857. detail = "培训不存在"
  858. raise HTTPException(status_code=404, detail="培训不存在")
  859. for training in trainings:
  860. training.del_flag = '2'
  861. training.create_by = user_id
  862. # 更新到数据库会话并提交
  863. db.commit()
  864. # 返回创建成功的响应
  865. return {
  866. "code": 200,
  867. "msg": "培训删除成功",
  868. "data": None
  869. }
  870. except Exception as e:
  871. # 处理异常
  872. if str(e) == '':
  873. e = detail
  874. raise HTTPException(status_code=500, detail=str(e))
  875. @router.delete('/training/delete/{trainingUid}')
  876. async def delete_emergency_training(
  877. trainingUid: str,
  878. db: Session = Depends(get_db),
  879. user_id = Depends(valid_access_token)
  880. ):
  881. try:
  882. # 提取请求数据
  883. query = db.query(EmergencyTrainingSession)
  884. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  885. query = query.filter(EmergencyTrainingSession.training_id == trainingUid)
  886. training = query.first()
  887. if not training:
  888. detail = "培训不存在"
  889. raise HTTPException(status_code=404, detail="培训不存在")
  890. training.del_flag = '2'
  891. training.create_by = user_id
  892. # 更新到数据库会话并提交
  893. db.commit()
  894. db.refresh(training) # 可选,如果需要刷新实例状态
  895. # 返回创建成功的响应
  896. return {
  897. "code": 200,
  898. "msg": "培训删除成功",
  899. "data": None
  900. }
  901. except Exception as e:
  902. # 处理异常
  903. if str(e) == '':
  904. e = detail
  905. raise HTTPException(status_code=500, detail=str(e))
  906. @router.get('/response/list')
  907. async def get_emergency_response_list(
  908. planNum:str,
  909. page: int = Query(1, gt=0, description='页码'),
  910. pageSize: int = Query(5, gt=0, description='每页条目数量'),
  911. db: Session = Depends(get_db),
  912. user_id = Depends(valid_access_token)
  913. ):
  914. try:
  915. # 查询所有响应事件
  916. query = db.query(EmergencyResponse)
  917. query = query.filter(EmergencyResponse.del_flag!='2')
  918. query = query.filter(EmergencyResponse.plan_id==planNum)
  919. # 计算总条目数
  920. total_items = query.count()
  921. # 排序
  922. query = query.order_by(EmergencyResponse.response_start_time.desc())
  923. # 执行分页查询
  924. responses = query.offset((page - 1) * pageSize).limit(pageSize).all()
  925. # 将查询结果转换为列表形式的字典
  926. response_list = [
  927. {
  928. "responseId": response.response_id,
  929. "eventName": response.event_name,
  930. "eventType": response.event_type,
  931. "responseUnit": response.response_unit,
  932. "eventAddress": response.event_address,
  933. "responseLevel": response.response_level,
  934. "responseStartTime": response.response_start_time.strftime('%Y-%m-%d %H:%M:%S') if response.response_start_time else '',
  935. "responseEndTime": response.response_end_time.strftime('%Y-%m-%d %H:%M:%S') if response.response_end_time else '',
  936. }
  937. for response in responses
  938. ]
  939. # 返回结果
  940. return {
  941. "code": 200,
  942. "msg": "成功获取响应列表",
  943. "data": response_list,
  944. "total": total_items,
  945. "page": page,
  946. "pageSize": pageSize,
  947. "totalPages": (total_items + pageSize - 1) // pageSize
  948. }
  949. except Exception as e:
  950. # 处理异常
  951. traceback.print_exc()
  952. raise HTTPException(status_code=500, detail=str(e))