__init__.py 34 KB

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