__init__.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984
  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. pagination_info = {
  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. ):
  195. try:
  196. # 构建查询
  197. query = db.query(EmergencyPlan)
  198. query = query.filter(EmergencyPlan.del_flag != '2')
  199. # 应用查询条件
  200. if planId:
  201. query = query.filter(EmergencyPlan.plan_number == planId)
  202. # 执行查询
  203. emergency_plan = query.first()
  204. if not emergency_plan:
  205. detail = "预案不存在"
  206. raise HTTPException(status_code=404, detail="预案不存在")
  207. # 将查询结果转换为列表形式的字典
  208. emergency_plan_result = {
  209. "planUid": emergency_plan.plan_id,
  210. "planId": emergency_plan.plan_number,
  211. "planName": emergency_plan.plan_name,
  212. "planType": emergency_plan.plan_type,
  213. "organizingUnit": emergency_plan.organizing_unit,
  214. "document": emergency_plan.document_number,
  215. "publishDate": emergency_plan.publish_date.strftime('%Y-%m-%d'),
  216. "fileList": get_file_query_fun(from_scenario='emergencyPlans_plan',foreign_key=emergency_plan.plan_id,db=db)
  217. }
  218. # 返回结果
  219. return {
  220. "code": 200,
  221. "msg": "成功获取预案详情",
  222. "data": emergency_plan_result
  223. }
  224. except Exception as e:
  225. # 处理异常
  226. if str(e)=='':
  227. e = detail
  228. raise HTTPException(status_code=500, detail=str(e))
  229. @router.post('/plan/create')
  230. async def create_emergency_plan(
  231. form_data:PlanCreateForm,
  232. db: Session = Depends(get_db)
  233. ):
  234. try:
  235. # 提取请求数据
  236. plan_name = form_data.planName
  237. plan_type = form_data.planType
  238. # plan_type_desc = form_data.planTypeDesc
  239. publish_date = form_data.publishDate # 如果没有提供发布日期,则使用当前时间
  240. organizing_unit = form_data.organizingUnit # 使用用户位置作为编制单位
  241. document_number = form_data.document
  242. # 创建新的预案记录
  243. new_plan = EmergencyPlan(
  244. plan_id=new_guid(), # 假设使用 UUID 作为预案 UID
  245. plan_name=plan_name,
  246. plan_type=plan_type,
  247. # plan_type_desc=plan_type_desc,
  248. publish_date=publish_date,
  249. organizing_unit=organizing_unit,
  250. document_number=document_number
  251. )
  252. # 添加到数据库会话并提交
  253. db.add(new_plan)
  254. db.commit()
  255. db.refresh(new_plan) # 可选,如果需要刷新实例状态
  256. new_plan.plan_number= f'YJYA{str(new_plan.id).zfill(10)}'
  257. db.commit()
  258. for file in form_data.fileList:
  259. create_file_fun(file=file, from_scenario='emergencyPlans_plan', foreign_key=new_plan.plan_id, db=db)
  260. db.commit()
  261. # 返回创建成功的响应
  262. return {
  263. "code": 200,
  264. "msg": "预案创建成功",
  265. "data": None
  266. }
  267. except Exception as e:
  268. # 处理异常
  269. raise HTTPException(status_code=500, detail=str(e))
  270. @router.put('/plan/update')
  271. async def update_emergency_plan(
  272. form_data: PlanUpdateForm,
  273. db: Session = Depends(get_db)
  274. ):
  275. try:
  276. # 提取请求数据
  277. query = db.query(EmergencyPlan)
  278. query = query.filter(EmergencyPlan.plan_id == form_data.planUid)
  279. query = query.filter(EmergencyPlan.del_flag != '2')
  280. plan = query.first()
  281. if not plan:
  282. detail = "预案不存在"
  283. raise HTTPException(status_code=404, detail="预案不存在")
  284. if form_data.planName:
  285. plan.plan_name = form_data.planName
  286. if form_data.planType:
  287. plan.plan_type = form_data.planType
  288. if form_data.publishDate:
  289. plan.publish_date = form_data.publishDate
  290. if form_data.organizingUnit:
  291. plan.organizing_unit = form_data.organizingUnit
  292. if form_data.document:
  293. plan.document_number = form_data.document
  294. if len(form_data.fileList)>0:
  295. delete_file_fun(from_scenario='emergencyPlans_plan',foreign_key=plan.plan_id,db=db)
  296. for file in form_data.fileList:
  297. create_file_fun(file=file,from_scenario='emergencyPlans_plan',foreign_key=plan.plan_id,db=db)
  298. # 更新到数据库会话并提交
  299. db.commit()
  300. db.refresh(plan) # 可选,如果需要刷新实例状态
  301. # 返回创建成功的响应
  302. return {
  303. "code": 200,
  304. "msg": "预案更新成功",
  305. "data": None
  306. }
  307. except Exception as e:
  308. # 处理异常
  309. if str(e)=='':
  310. e = detail
  311. raise HTTPException(status_code=500, detail=str(e))
  312. @router.delete('/plan/delete')
  313. async def delete_emergency_plans(
  314. planUids: list,
  315. db: Session = Depends(get_db)
  316. ):
  317. try:
  318. # 提取请求数据
  319. query = db.query(EmergencyPlan)
  320. query = query.filter(EmergencyPlan.del_flag != '2')
  321. query = query.filter(EmergencyPlan.plan_id.in_(planUids))
  322. plans = query.all()
  323. if not plans:
  324. detail = "预案不存在"
  325. raise HTTPException(status_code=404, detail="预案不存在")
  326. for plan in plans:
  327. plan.del_flag = '2'
  328. # 更新到数据库会话并提交
  329. db.commit()
  330. # 返回创建成功的响应
  331. return {
  332. "code": 200,
  333. "msg": "预案删除成功",
  334. "data": None
  335. }
  336. except Exception as e:
  337. # 处理异常
  338. if str(e) == '':
  339. e = detail
  340. raise HTTPException(status_code=500, detail=str(e))
  341. @router.delete('/plan/delete/{planUid}')
  342. async def delete_emergency_plan(
  343. planUid: str,
  344. db: Session = Depends(get_db)
  345. ):
  346. try:
  347. # 提取请求数据
  348. query = db.query(EmergencyPlan)
  349. query = query.filter(EmergencyPlan.del_flag != '2')
  350. query = query.filter(EmergencyPlan.plan_id == planUid)
  351. plan = query.first()
  352. if not plan:
  353. detail = "预案不存在"
  354. raise HTTPException(status_code=404, detail="预案不存在")
  355. plan.del_flag = '2'
  356. # 更新到数据库会话并提交
  357. db.commit()
  358. db.refresh(plan) # 可选,如果需要刷新实例状态
  359. # 返回创建成功的响应
  360. return {
  361. "code": 200,
  362. "msg": "预案删除成功",
  363. "data": None
  364. }
  365. except Exception as e:
  366. # 处理异常
  367. if str(e) == '':
  368. e = detail
  369. raise HTTPException(status_code=500, detail=str(e))
  370. @router.get('/drill/list')
  371. async def get_emergency_drill_list(
  372. planNum: str = Query(None, description='预案编号'),
  373. page: int = Query(1, gt=0, description='页码'),
  374. pageSize: int = Query(5, gt=0, description='每页条目数量'),
  375. db: Session = Depends(get_db)
  376. ):
  377. try:
  378. # 构建查询
  379. query = db.query(EmergencyDrill)
  380. query = query.filter(EmergencyDrill.del_flag != '2')
  381. # 应用查询条件
  382. if planNum:
  383. query = query.filter(EmergencyDrill.plan_number == planNum)
  384. else:
  385. detail = "planNum不存在"
  386. raise HTTPException(status_code=404, detail="planNum不存在")
  387. # 计算总条目数
  388. total_items = query.count()
  389. # 执行分页查询
  390. emergency_drill = query.offset((page - 1) * pageSize).limit(pageSize).all() #
  391. print(emergency_drill)
  392. # 将查询结果转换为列表形式的字典
  393. emergency_drill_list = []
  394. for drill in emergency_drill:
  395. emergency_drill = {
  396. "drillId": drill.drill_id,
  397. "drillName": drill.drill_name,
  398. "drillUnit": drill.organizing_unit,
  399. "year": "%s年" % drill.planned_annual,
  400. "drillTime": drill.planned_time.strftime('%Y-%m-%d %H:%M:%S'),
  401. "drillAddress": drill.drill_location,
  402. "drillProject": get_file_query_fun(from_scenario='emergencyPlans_drill_project', foreign_key=drill.drill_id,db=db),
  403. "drillVideo": get_file_query_fun(from_scenario='emergencyPlans_drill_video', foreign_key=drill.drill_id,db=db),
  404. "drillPicture": get_file_query_fun(from_scenario='emergencyPlans_drill_pic', foreign_key=drill.drill_id,db=db)
  405. }
  406. emergency_drill_list.append(emergency_drill)
  407. # 返回结果
  408. return {
  409. "code": 200,
  410. "msg": "成功",
  411. "data": emergency_drill_list,
  412. "total": total_items,
  413. "page": page,
  414. "pageSize": pageSize,
  415. "totalPages": (total_items + pageSize - 1) // pageSize
  416. }
  417. except Exception as e:
  418. # 处理异常
  419. if str(e) == '':
  420. e = detail
  421. raise HTTPException(status_code=500, detail=str(e))
  422. @router.get('/drill/{drillId}')
  423. async def get_emergency_drill(
  424. drillId: str = Query(None, description='演练编号'),
  425. db: Session = Depends(get_db)
  426. ):
  427. try:
  428. # 构建查询
  429. query = db.query(EmergencyDrill)
  430. query = query.filter(EmergencyDrill.del_flag != '2')
  431. # 应用查询条件
  432. if drillId:
  433. query = query.filter(EmergencyDrill.drill_id == drillId)
  434. else:
  435. detail = "drillId不存在"
  436. raise HTTPException(status_code=404, detail="drillId不存在")
  437. # 执行查询
  438. drill = query.first()
  439. # 将查询结果转换为字典形式
  440. emergency_drill = {
  441. "drillId": drill.drill_id,
  442. "drillName": drill.drill_name,
  443. "drillUnit": drill.organizing_unit,
  444. "year": "%s年" % drill.planned_annual,
  445. "drillTime": drill.planned_time.strftime('%Y-%m-%d %H:%M:%S'),
  446. "drillAddress": drill.drill_location,
  447. "drillProject": get_file_query_fun(from_scenario='emergencyPlans_drill_project',foreign_key=drill.drill_id,db=db),
  448. "drillVideo": get_file_query_fun(from_scenario='emergencyPlans_drill_video', foreign_key=drill.drill_id,db=db),
  449. "drillPicture": get_file_query_fun(from_scenario='emergencyPlans_drill_pic', foreign_key=drill.drill_id,db=db)
  450. }
  451. # 返回结果
  452. return {
  453. "code": 200,
  454. "msg": "成功",
  455. "data": emergency_drill
  456. }
  457. except Exception as e:
  458. # 处理异常
  459. if str(e) == '':
  460. e = detail
  461. raise HTTPException(status_code=500, detail=str(e))
  462. @router.post('/drill/create')
  463. async def create_emergency_drill(
  464. form_data:DrillCreateForm,
  465. db: Session = Depends(get_db)
  466. ):
  467. try:
  468. # 提取请求数据
  469. plan_number = form_data.planId
  470. drill_name = form_data.drillName
  471. organizing_unit = form_data.drillUnit
  472. planned_annual = form_data.year
  473. planned_time = form_data.drillTime
  474. drill_location = form_data.drillAddress
  475. drill_lon = form_data.lon
  476. drill_lat = form_data.lat
  477. # 创建新的预案记录
  478. new_drill = EmergencyDrill(
  479. drill_id=new_guid(), # 假设使用 UUID 作为预案 UID
  480. plan_number = plan_number,
  481. drill_name=drill_name,
  482. organizing_unit = organizing_unit,
  483. planned_annual = planned_annual,
  484. planned_time = planned_time,
  485. drill_location = drill_location,
  486. drill_lon = drill_lon,
  487. drill_lat = drill_lat
  488. )
  489. # 添加到数据库会话并提交
  490. db.add(new_drill)
  491. db.commit()
  492. db.refresh(new_drill) # 可选,如果需要刷新实例状态
  493. for file in form_data.drillProject:
  494. create_file_fun(file=file, from_scenario='emergencyPlans_drill_project', foreign_key=new_drill.drill_id, db=db)
  495. for file in form_data.drillVideo:
  496. create_file_fun(file=file, from_scenario='emergencyPlans_drill_video', foreign_key=new_drill.drill_id, db=db)
  497. for file in form_data.drillPicture:
  498. create_file_fun(file=file, from_scenario='emergencyPlans_drill_pic', foreign_key=new_drill.drill_id, db=db)
  499. db.commit()
  500. # 返回创建成功的响应
  501. return {
  502. "code": 200,
  503. "msg": "演练创建成功",
  504. "data": None
  505. }
  506. except Exception as e:
  507. # 处理异常
  508. raise HTTPException(status_code=500, detail=str(e))
  509. @router.put('/drill/update')
  510. async def update_emergency_drill(
  511. form_data:DrillUpdateForm,
  512. db: Session = Depends(get_db)
  513. ):
  514. try:
  515. query = db.query(EmergencyDrill)
  516. query = query.filter(EmergencyDrill.drill_id == form_data.drillId)
  517. query = query.filter(EmergencyDrill.del_flag != '2')
  518. drill = query.first()
  519. # 判断预案编号是否存在,存在即更新
  520. if form_data.planId:
  521. drill.plan_number=form_data.planId
  522. # 判断演练名称是否存在,存在即更新
  523. if form_data.drillName:
  524. drill.drill_name=form_data.drillName
  525. # 判断演练单位是否存在,存在即更新
  526. if form_data.drillUnit:
  527. drill.organizing_unit=form_data.drillUnit
  528. # 判断演练年份是否存在,存在即更新
  529. if form_data.year:
  530. drill.planned_annual=form_data.year
  531. # 判断演练日期是否存在,存在即更新
  532. if form_data.drillTime:
  533. drill.planned_time=form_data.drillTime
  534. # 判断演练地址是否存在,存在即更新
  535. if form_data.drillAddress:
  536. drill.drill_location=form_data.drillAddress
  537. # 判断经度是否存在,存在即更新
  538. if form_data.lon:
  539. drill.drill_lon=form_data.lon
  540. # 判断纬度是否存在,存在即更新
  541. if form_data.lat:
  542. drill.drill_lat=form_data.lat
  543. # 判断演练方案是否存在,存在即更新
  544. if len(form_data.drillProject)>0:
  545. delete_file_fun(from_scenario='emergencyPlans_drill_project',foreign_key=drill.drill_id,db=db)
  546. for file in form_data.drillProject:
  547. create_file_fun(file=file,from_scenario='emergencyPlans_drill_project',foreign_key=drill.drill_id,db=db)
  548. # 判断演练视频是否存在,存在即更新
  549. if len(form_data.drillVideo) > 0:
  550. delete_file_fun(from_scenario='emergencyPlans_drill_video', foreign_key=drill.drill_id, db=db)
  551. for file in form_data.drillVideo:
  552. create_file_fun(file=file, from_scenario='emergencyPlans_drill_video', foreign_key=drill.drill_id,db=db)
  553. # 判断演练图片是否存在,存在即更新
  554. if len(form_data.drillPicture) > 0:
  555. delete_file_fun(from_scenario='emergencyPlans_drill_pic', foreign_key=drill.drill_id, db=db)
  556. for file in form_data.drillPicture:
  557. create_file_fun(file=file, from_scenario='emergencyPlans_drill_pic', foreign_key=drill.drill_id,db=db)
  558. # 提交所有更新
  559. db.commit()
  560. # 返回更新成功的响应
  561. return {
  562. "code": 200,
  563. "msg": "演练更新成功",
  564. "data": None
  565. }
  566. except Exception as e:
  567. # 处理异常
  568. raise HTTPException(status_code=500, detail=str(e))
  569. @router.delete('/drill/delete')
  570. async def delete_emergency_drill(
  571. drillUids: list,
  572. db: Session = Depends(get_db)
  573. ):
  574. try:
  575. # 提取请求数据
  576. query = db.query(EmergencyDrill)
  577. query = query.filter(EmergencyDrill.del_flag != '2')
  578. query = query.filter(EmergencyDrill.drill_id.in_(drillUids))
  579. drills = query.all()
  580. if not drills:
  581. detail = "演练不存在"
  582. raise HTTPException(status_code=404, detail="演练不存在")
  583. for drill in drills:
  584. drill.del_flag = '2'
  585. # 更新到数据库会话并提交
  586. db.commit()
  587. # 返回创建成功的响应
  588. return {
  589. "code": 200,
  590. "msg": "演练删除成功",
  591. "data": None
  592. }
  593. except Exception as e:
  594. # 处理异常
  595. if str(e) == '':
  596. e = detail
  597. raise HTTPException(status_code=500, detail=str(e))
  598. @router.delete('/drill/delete/{drillUid}')
  599. async def delete_emergency_drill(
  600. drillUid: str,
  601. db: Session = Depends(get_db)
  602. ):
  603. try:
  604. # 提取请求数据
  605. query = db.query(EmergencyDrill)
  606. query = query.filter(EmergencyDrill.del_flag != '2')
  607. query = query.filter(EmergencyDrill.drill_id == drillUid)
  608. drill = query.first()
  609. if not drill:
  610. detail = "演练不存在"
  611. raise HTTPException(status_code=404, detail="演练不存在")
  612. drill.del_flag = '2'
  613. # 更新到数据库会话并提交
  614. db.commit()
  615. db.refresh(drill) # 可选,如果需要刷新实例状态
  616. # 返回创建成功的响应
  617. return {
  618. "code": 200,
  619. "msg": "演练删除成功",
  620. "data": None
  621. }
  622. except Exception as e:
  623. # 处理异常
  624. if str(e) == '':
  625. e = detail
  626. raise HTTPException(status_code=500, detail=str(e))
  627. @router.get('/training/list')
  628. async def get_emergency_training_list(
  629. planNum: str = Query(None, description='预案编号'),
  630. page: int = Query(1, gt=0, description='页码'),
  631. pageSize: int = Query(5, gt=0, description='每页条目数量'),
  632. db: Session = Depends(get_db)
  633. ):
  634. try:
  635. # 构建查询
  636. query = db.query(EmergencyTrainingSession)
  637. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  638. # 应用查询条件
  639. if planNum:
  640. query = query.filter(EmergencyTrainingSession.plan_number == planNum)
  641. else:
  642. detail = "planNum不存在"
  643. raise HTTPException(status_code=404, detail="planNum不存在")
  644. # 计算总条目数
  645. total_items = query.count()
  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": "%s人"%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": "%s人"%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))