__init__.py 34 KB

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