__init__.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985
  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. planId : str
  29. planName : str = None
  30. planType : int = None
  31. # planTypeDesc : str
  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. pagination_info = {
  177. }
  178. # 返回结果
  179. return {
  180. "code": 200,
  181. "msg": "成功获取预案列表",
  182. "data": emergency_plans_list,
  183. "total": total_items,
  184. "page": page,
  185. "pageSize": pageSize,
  186. "totalPages": (total_items + pageSize - 1) // pageSize
  187. }
  188. except Exception as e:
  189. # 处理异常
  190. raise HTTPException(status_code=500, detail=str(e))
  191. @router.get('/plan/{planId}')
  192. async def get_emergency_plan(
  193. planId: str ,
  194. db: Session = Depends(get_db)
  195. ):
  196. try:
  197. # 构建查询
  198. query = db.query(EmergencyPlan)
  199. query = query.filter(EmergencyPlan.del_flag != '2')
  200. # 应用查询条件
  201. if planId:
  202. query = query.filter(EmergencyPlan.plan_number == planId)
  203. # 执行查询
  204. emergency_plan = query.first()
  205. if not emergency_plan:
  206. detail = "预案不存在"
  207. raise HTTPException(status_code=404, detail="预案不存在")
  208. # 将查询结果转换为列表形式的字典
  209. emergency_plan_result = {
  210. "planUid": emergency_plan.plan_id,
  211. "planId": emergency_plan.plan_number,
  212. "planName": emergency_plan.plan_name,
  213. "planType": emergency_plan.plan_type,
  214. "organizingUnit": emergency_plan.organizing_unit,
  215. "document": emergency_plan.document_number,
  216. "publishDate": emergency_plan.publish_date.strftime('%Y-%m-%d'),
  217. "fileList": get_file_query_fun(from_scenario='emergencyPlans_plan',foreign_key=emergency_plan.plan_id,db=db)
  218. }
  219. # 返回结果
  220. return {
  221. "code": 200,
  222. "msg": "成功获取预案详情",
  223. "data": emergency_plan_result
  224. }
  225. except Exception as e:
  226. # 处理异常
  227. if str(e)=='':
  228. e = detail
  229. raise HTTPException(status_code=500, detail=str(e))
  230. @router.post('/plan/create')
  231. async def create_emergency_plan(
  232. form_data:PlanCreateForm,
  233. db: Session = Depends(get_db)
  234. ):
  235. try:
  236. # 提取请求数据
  237. plan_name = form_data.planName
  238. plan_type = form_data.planType
  239. # plan_type_desc = form_data.planTypeDesc
  240. publish_date = form_data.publishDate # 如果没有提供发布日期,则使用当前时间
  241. organizing_unit = form_data.organizingUnit # 使用用户位置作为编制单位
  242. document_number = form_data.document
  243. # 创建新的预案记录
  244. new_plan = EmergencyPlan(
  245. plan_id=new_guid(), # 假设使用 UUID 作为预案 UID
  246. plan_name=plan_name,
  247. plan_type=plan_type,
  248. # plan_type_desc=plan_type_desc,
  249. publish_date=publish_date,
  250. organizing_unit=organizing_unit,
  251. document_number=document_number
  252. )
  253. # 添加到数据库会话并提交
  254. db.add(new_plan)
  255. db.commit()
  256. db.refresh(new_plan) # 可选,如果需要刷新实例状态
  257. new_plan.plan_number= f'YJYA{str(new_plan.id).zfill(10)}'
  258. db.commit()
  259. for file in form_data.fileList:
  260. create_file_fun(file=file, from_scenario='emergencyPlans_plan', foreign_key=new_plan.plan_id, db=db)
  261. db.commit()
  262. # 返回创建成功的响应
  263. return {
  264. "code": 200,
  265. "msg": "预案创建成功",
  266. "data": None
  267. }
  268. except Exception as e:
  269. # 处理异常
  270. raise HTTPException(status_code=500, detail=str(e))
  271. @router.put('/plan/update')
  272. async def update_emergency_plan(
  273. form_data: PlanUpdateForm,
  274. db: Session = Depends(get_db)
  275. ):
  276. try:
  277. # 提取请求数据
  278. query = db.query(EmergencyPlan)
  279. query = query.filter(EmergencyPlan.plan_id == form_data.planId)
  280. query = query.filter(EmergencyPlan.del_flag != '2')
  281. plan = query.first()
  282. if not plan:
  283. detail = "预案不存在"
  284. raise HTTPException(status_code=404, detail="预案不存在")
  285. if form_data.planName:
  286. plan.plan_name = form_data.planName
  287. if form_data.planType:
  288. plan.plan_type = form_data.planType
  289. if form_data.publishDate:
  290. plan.publish_date = form_data.publishDate
  291. if form_data.organizingUnit:
  292. plan.organizing_unit = form_data.organizingUnit
  293. if form_data.document:
  294. plan.document_number = form_data.document
  295. if len(form_data.fileList)>0:
  296. delete_file_fun(from_scenario='emergencyPlans_plan',foreign_key=plan.plan_id,db=db)
  297. for file in form_data.fileList:
  298. create_file_fun(file=file,from_scenario='emergencyPlans_plan',foreign_key=plan.plan_id,db=db)
  299. # 更新到数据库会话并提交
  300. db.commit()
  301. db.refresh(plan) # 可选,如果需要刷新实例状态
  302. # 返回创建成功的响应
  303. return {
  304. "code": 200,
  305. "msg": "预案更新成功",
  306. "data": None
  307. }
  308. except Exception as e:
  309. # 处理异常
  310. if str(e)=='':
  311. e = detail
  312. raise HTTPException(status_code=500, detail=str(e))
  313. @router.delete('/plan/delete')
  314. async def delete_emergency_plans(
  315. planUids: list,
  316. db: Session = Depends(get_db)
  317. ):
  318. try:
  319. # 提取请求数据
  320. query = db.query(EmergencyPlan)
  321. query = query.filter(EmergencyPlan.del_flag != '2')
  322. query = query.filter(EmergencyPlan.plan_id.in_(planUids))
  323. plans = query.all()
  324. if not plans:
  325. detail = "预案不存在"
  326. raise HTTPException(status_code=404, detail="预案不存在")
  327. for plan in plans:
  328. plan.del_flag = '2'
  329. # 更新到数据库会话并提交
  330. db.commit()
  331. # 返回创建成功的响应
  332. return {
  333. "code": 200,
  334. "msg": "预案删除成功",
  335. "data": None
  336. }
  337. except Exception as e:
  338. # 处理异常
  339. if str(e) == '':
  340. e = detail
  341. raise HTTPException(status_code=500, detail=str(e))
  342. @router.delete('/plan/delete/{planUid}')
  343. async def delete_emergency_plan(
  344. planUid: str,
  345. db: Session = Depends(get_db)
  346. ):
  347. try:
  348. # 提取请求数据
  349. query = db.query(EmergencyPlan)
  350. query = query.filter(EmergencyPlan.del_flag != '2')
  351. query = query.filter(EmergencyPlan.plan_id == planUid)
  352. plan = query.first()
  353. if not plan:
  354. detail = "预案不存在"
  355. raise HTTPException(status_code=404, detail="预案不存在")
  356. plan.del_flag = '2'
  357. # 更新到数据库会话并提交
  358. db.commit()
  359. db.refresh(plan) # 可选,如果需要刷新实例状态
  360. # 返回创建成功的响应
  361. return {
  362. "code": 200,
  363. "msg": "预案删除成功",
  364. "data": None
  365. }
  366. except Exception as e:
  367. # 处理异常
  368. if str(e) == '':
  369. e = detail
  370. raise HTTPException(status_code=500, detail=str(e))
  371. @router.get('/drill/list')
  372. async def get_emergency_drill_list(
  373. planNum: str = Query(None, description='预案编号'),
  374. page: int = Query(1, gt=0, description='页码'),
  375. pageSize: int = Query(5, gt=0, description='每页条目数量'),
  376. db: Session = Depends(get_db)
  377. ):
  378. try:
  379. # 构建查询
  380. query = db.query(EmergencyDrill)
  381. query = query.filter(EmergencyDrill.del_flag != '2')
  382. # 应用查询条件
  383. if planNum:
  384. query = query.filter(EmergencyDrill.plan_number == planNum)
  385. else:
  386. detail = "planNum不存在"
  387. raise HTTPException(status_code=404, detail="planNum不存在")
  388. # 计算总条目数
  389. total_items = query.count()
  390. # 执行分页查询
  391. emergency_drill = query.offset((page - 1) * pageSize).limit(pageSize).all() #
  392. print(emergency_drill)
  393. # 将查询结果转换为列表形式的字典
  394. emergency_drill_list = []
  395. for drill in emergency_drill:
  396. emergency_drill = {
  397. "drillId": drill.drill_id,
  398. "drillName": drill.drill_name,
  399. "drillUnit": drill.organizing_unit,
  400. "year": "%s年" % drill.planned_annual,
  401. "drillTime": drill.planned_time.strftime('%Y-%m-%d %H:%M:%S'),
  402. "drillAddress": drill.drill_location,
  403. "drillProject": get_file_query_fun(from_scenario='emergencyPlans_drill_project', foreign_key=drill.drill_id,db=db),
  404. "drillVideo": get_file_query_fun(from_scenario='emergencyPlans_drill_video', foreign_key=drill.drill_id,db=db),
  405. "drillPicture": get_file_query_fun(from_scenario='emergencyPlans_drill_pic', foreign_key=drill.drill_id,db=db)
  406. }
  407. emergency_drill_list.append(emergency_drill)
  408. # 返回结果
  409. return {
  410. "code": 200,
  411. "msg": "成功",
  412. "data": emergency_drill_list,
  413. "total": total_items,
  414. "page": page,
  415. "pageSize": pageSize,
  416. "totalPages": (total_items + pageSize - 1) // pageSize
  417. }
  418. except Exception as e:
  419. # 处理异常
  420. if str(e) == '':
  421. e = detail
  422. raise HTTPException(status_code=500, detail=str(e))
  423. @router.get('/drill/{drillId}')
  424. async def get_emergency_drill(
  425. drillId: str = Query(None, description='演练编号'),
  426. db: Session = Depends(get_db)
  427. ):
  428. try:
  429. # 构建查询
  430. query = db.query(EmergencyDrill)
  431. query = query.filter(EmergencyDrill.del_flag != '2')
  432. # 应用查询条件
  433. if drillId:
  434. query = query.filter(EmergencyDrill.drill_id == drillId)
  435. else:
  436. detail = "drillId不存在"
  437. raise HTTPException(status_code=404, detail="drillId不存在")
  438. # 执行查询
  439. drill = query.first()
  440. # 将查询结果转换为字典形式
  441. emergency_drill = {
  442. "drillId": drill.drill_id,
  443. "drillName": drill.drill_name,
  444. "drillUnit": drill.organizing_unit,
  445. "year": "%s年" % drill.planned_annual,
  446. "drillTime": drill.planned_time.strftime('%Y-%m-%d %H:%M:%S'),
  447. "drillAddress": drill.drill_location,
  448. "drillProject": get_file_query_fun(from_scenario='emergencyPlans_drill_project',foreign_key=drill.drill_id,db=db),
  449. "drillVideo": get_file_query_fun(from_scenario='emergencyPlans_drill_video', foreign_key=drill.drill_id,db=db),
  450. "drillPicture": get_file_query_fun(from_scenario='emergencyPlans_drill_pic', foreign_key=drill.drill_id,db=db)
  451. }
  452. # 返回结果
  453. return {
  454. "code": 200,
  455. "msg": "成功",
  456. "data": emergency_drill
  457. }
  458. except Exception as e:
  459. # 处理异常
  460. if str(e) == '':
  461. e = detail
  462. raise HTTPException(status_code=500, detail=str(e))
  463. @router.post('/drill/create')
  464. async def create_emergency_drill(
  465. form_data:DrillCreateForm,
  466. db: Session = Depends(get_db)
  467. ):
  468. try:
  469. # 提取请求数据
  470. plan_number = form_data.planId
  471. drill_name = form_data.drillName
  472. organizing_unit = form_data.drillUnit
  473. planned_annual = form_data.year
  474. planned_time = form_data.drillTime
  475. drill_location = form_data.drillAddress
  476. drill_lon = form_data.lon
  477. drill_lat = form_data.lat
  478. # 创建新的预案记录
  479. new_drill = EmergencyDrill(
  480. drill_id=new_guid(), # 假设使用 UUID 作为预案 UID
  481. plan_number = plan_number,
  482. drill_name=drill_name,
  483. organizing_unit = organizing_unit,
  484. planned_annual = planned_annual,
  485. planned_time = planned_time,
  486. drill_location = drill_location,
  487. drill_lon = drill_lon,
  488. drill_lat = drill_lat
  489. )
  490. # 添加到数据库会话并提交
  491. db.add(new_drill)
  492. db.commit()
  493. db.refresh(new_drill) # 可选,如果需要刷新实例状态
  494. for file in form_data.drillProject:
  495. create_file_fun(file=file, from_scenario='emergencyPlans_drill_project', foreign_key=new_drill.drill_id, db=db)
  496. for file in form_data.drillVideo:
  497. create_file_fun(file=file, from_scenario='emergencyPlans_drill_video', foreign_key=new_drill.drill_id, db=db)
  498. for file in form_data.drillPicture:
  499. create_file_fun(file=file, from_scenario='emergencyPlans_drill_pic', foreign_key=new_drill.drill_id, db=db)
  500. db.commit()
  501. # 返回创建成功的响应
  502. return {
  503. "code": 200,
  504. "msg": "演练创建成功",
  505. "data": None
  506. }
  507. except Exception as e:
  508. # 处理异常
  509. raise HTTPException(status_code=500, detail=str(e))
  510. @router.put('/drill/update')
  511. async def update_emergency_drill(
  512. form_data:DrillUpdateForm,
  513. db: Session = Depends(get_db)
  514. ):
  515. try:
  516. query = db.query(EmergencyDrill)
  517. query = query.filter(EmergencyDrill.drill_id == form_data.drillId)
  518. query = query.filter(EmergencyDrill.del_flag != '2')
  519. drill = query.first()
  520. # 判断预案编号是否存在,存在即更新
  521. if form_data.planId:
  522. drill.plan_number=form_data.planId
  523. # 判断演练名称是否存在,存在即更新
  524. if form_data.drillName:
  525. drill.drill_name=form_data.drillName
  526. # 判断演练单位是否存在,存在即更新
  527. if form_data.drillUnit:
  528. drill.organizing_unit=form_data.drillUnit
  529. # 判断演练年份是否存在,存在即更新
  530. if form_data.year:
  531. drill.planned_annual=form_data.year
  532. # 判断演练日期是否存在,存在即更新
  533. if form_data.drillTime:
  534. drill.planned_time=form_data.drillTime
  535. # 判断演练地址是否存在,存在即更新
  536. if form_data.drillAddress:
  537. drill.drill_location=form_data.drillAddress
  538. # 判断经度是否存在,存在即更新
  539. if form_data.lon:
  540. drill.drill_lon=form_data.lon
  541. # 判断纬度是否存在,存在即更新
  542. if form_data.lat:
  543. drill.drill_lat=form_data.lat
  544. # 判断演练方案是否存在,存在即更新
  545. if len(form_data.drillProject)>0:
  546. delete_file_fun(from_scenario='emergencyPlans_drill_project',foreign_key=drill.plan_id,db=db)
  547. for file in form_data.fileList:
  548. create_file_fun(file=file,from_scenario='emergencyPlans_drill_project',foreign_key=drill.drill_id,db=db)
  549. # 判断演练视频是否存在,存在即更新
  550. if len(form_data.drillVideo) > 0:
  551. delete_file_fun(from_scenario='emergencyPlans_drill_video', foreign_key=drill.plan_id, db=db)
  552. for file in form_data.fileList:
  553. create_file_fun(file=file, from_scenario='emergencyPlans_drill_video', foreign_key=drill.drill_id,db=db)
  554. # 判断演练图片是否存在,存在即更新
  555. if len(form_data.drillPicture) > 0:
  556. delete_file_fun(from_scenario='emergencyPlans_drill_pic', foreign_key=drill.plan_id, db=db)
  557. for file in form_data.fileList:
  558. create_file_fun(file=file, from_scenario='emergencyPlans_drill_pic', foreign_key=drill.drill_id,db=db)
  559. # 提交所有更新
  560. db.commit()
  561. # 返回更新成功的响应
  562. return {
  563. "code": 200,
  564. "msg": "演练更新成功",
  565. "data": None
  566. }
  567. except Exception as e:
  568. # 处理异常
  569. raise HTTPException(status_code=500, detail=str(e))
  570. @router.delete('/drill/delete')
  571. async def delete_emergency_drill(
  572. drillUids: list,
  573. db: Session = Depends(get_db)
  574. ):
  575. try:
  576. # 提取请求数据
  577. query = db.query(EmergencyDrill)
  578. query = query.filter(EmergencyDrill.del_flag != '2')
  579. query = query.filter(EmergencyDrill.drill_id.in_(drillUids))
  580. drills = query.all()
  581. if not drills:
  582. detail = "演练不存在"
  583. raise HTTPException(status_code=404, detail="演练不存在")
  584. for drill in drills:
  585. drill.del_flag = '2'
  586. # 更新到数据库会话并提交
  587. db.commit()
  588. # 返回创建成功的响应
  589. return {
  590. "code": 200,
  591. "msg": "演练删除成功",
  592. "data": None
  593. }
  594. except Exception as e:
  595. # 处理异常
  596. if str(e) == '':
  597. e = detail
  598. raise HTTPException(status_code=500, detail=str(e))
  599. @router.delete('/drill/delete/{drillUid}')
  600. async def delete_emergency_drill(
  601. drillUid: str,
  602. db: Session = Depends(get_db)
  603. ):
  604. try:
  605. # 提取请求数据
  606. query = db.query(EmergencyDrill)
  607. query = query.filter(EmergencyDrill.del_flag != '2')
  608. query = query.filter(EmergencyDrill.drill_id == drillUid)
  609. drill = query.first()
  610. if not drill:
  611. detail = "演练不存在"
  612. raise HTTPException(status_code=404, detail="演练不存在")
  613. drill.del_flag = '2'
  614. # 更新到数据库会话并提交
  615. db.commit()
  616. db.refresh(drill) # 可选,如果需要刷新实例状态
  617. # 返回创建成功的响应
  618. return {
  619. "code": 200,
  620. "msg": "演练删除成功",
  621. "data": None
  622. }
  623. except Exception as e:
  624. # 处理异常
  625. if str(e) == '':
  626. e = detail
  627. raise HTTPException(status_code=500, detail=str(e))
  628. @router.get('/training/list')
  629. async def get_emergency_training_list(
  630. planNum: str = Query(None, description='预案编号'),
  631. page: int = Query(1, gt=0, description='页码'),
  632. pageSize: int = Query(5, gt=0, description='每页条目数量'),
  633. db: Session = Depends(get_db)
  634. ):
  635. try:
  636. # 构建查询
  637. query = db.query(EmergencyTrainingSession)
  638. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  639. # 应用查询条件
  640. if planNum:
  641. query = query.filter(EmergencyTrainingSession.plan_number == planNum)
  642. else:
  643. detail = "planNum不存在"
  644. raise HTTPException(status_code=404, detail="planNum不存在")
  645. # 计算总条目数
  646. total_items = query.count()
  647. # 执行分页查询
  648. emergency_training = query.offset((page - 1) * pageSize).limit(pageSize).all() #
  649. # print(emergency_drill)
  650. # 将查询结果转换为列表形式的字典
  651. emergency_training_list = [
  652. {
  653. "trainingId": training.training_id,
  654. "theme": training.training_theme,
  655. "unitName": training.training_unit,
  656. "peopleNum": "%s人"%training.participant_count,
  657. "trainingWay":training.training_method,
  658. "startTime":training.start_time.strftime('%Y-%m-%d %H:%M:%S'),
  659. "endTime": training.end_time.strftime('%Y-%m-%d %H:%M:%S'),
  660. "address": training.training_location,
  661. "Content":training.training_content
  662. }
  663. for training in emergency_training
  664. ]
  665. # 返回结果
  666. return {
  667. "code": 200,
  668. "msg": "成功",
  669. "data": emergency_training_list,
  670. "total": total_items,
  671. "page": page,
  672. "pageSize": pageSize,
  673. "totalPages": (total_items + pageSize - 1) // pageSize
  674. }
  675. except Exception as e:
  676. # 处理异常
  677. if str(e) == '':
  678. e = detail
  679. raise HTTPException(status_code=500, detail=str(e))
  680. @router.get('/training/{trainingId}')
  681. async def get_emergency_training(
  682. trainingId: str = Query(None, description='培训编号'),
  683. db: Session = Depends(get_db)
  684. ):
  685. try:
  686. # 构建查询
  687. query = db.query(EmergencyTrainingSession)
  688. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  689. # 应用查询条件
  690. if trainingId:
  691. query = query.filter(EmergencyTrainingSession.training_id == trainingId)
  692. else:
  693. detail = "trainingId不存在"
  694. raise HTTPException(status_code=404, detail="trainingId不存在")
  695. # 执行查询
  696. training = query.first() #
  697. # 将查询结果转换为列表形式的字典
  698. emergency_training = {
  699. "trainingId": training.training_id,
  700. "theme": training.training_theme,
  701. "unitName": training.training_unit,
  702. "peopleNum": "%s人"%training.participant_count,
  703. "trainingWay":training.training_method,
  704. "startTime":training.start_time.strftime('%Y-%m-%d %H:%M:%S'),
  705. "endTime": training.end_time.strftime('%Y-%m-%d %H:%M:%S'),
  706. "address": training.training_location,
  707. "Content":training.training_content
  708. }
  709. # 返回结果
  710. return {
  711. "code": 200,
  712. "msg": "成功",
  713. "data": emergency_training
  714. }
  715. except Exception as e:
  716. # 处理异常
  717. if str(e) == '':
  718. e = detail
  719. raise HTTPException(status_code=500, detail=str(e))
  720. @router.post('/training/create')
  721. async def create_emergency_training(
  722. form_data:TrainingCreateForm,
  723. db: Session = Depends(get_db)
  724. ):
  725. try:
  726. # 创建新的预案记录
  727. new_training = EmergencyTrainingSession(
  728. training_id=new_guid(), # 假设使用 UUID 作为预案 UID
  729. training_theme=form_data.theme,
  730. training_unit=form_data.unitName,
  731. training_method=form_data.trainingWay,
  732. participant_count=form_data.peopleNum,
  733. start_time=form_data.startTime,
  734. end_time=form_data.endTime,
  735. training_content=form_data.Content,
  736. training_location=form_data.address,
  737. training_lon=form_data.lon,
  738. training_lat=form_data.lat,
  739. plan_number = form_data.planId
  740. )
  741. # 添加到数据库会话并提交
  742. db.add(new_training)
  743. db.commit()
  744. db.refresh(new_training) # 可选,如果需要刷新实例状态
  745. # 返回创建成功的响应
  746. return {
  747. "code": 200,
  748. "msg": "培训创建成功",
  749. "data": None
  750. }
  751. except Exception as e:
  752. # 处理异常
  753. raise HTTPException(status_code=500, detail=str(e))
  754. @router.put('/training/update')
  755. async def update_emergency_training(
  756. form_data:TrainingUpdateForm,
  757. db: Session = Depends(get_db)
  758. ):
  759. try:
  760. query = db.query(EmergencyTrainingSession)
  761. query = query.filter(EmergencyTrainingSession.training_id == form_data.trainingId)
  762. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  763. training = query.first()
  764. # 判断预案编号是否存在,存在即更新
  765. if form_data.planId:
  766. training.plan_number = form_data.planId
  767. # 判断预案编号是否存在,存在即更新
  768. if form_data.theme:
  769. training.training_theme = form_data.theme
  770. # 判断预案编号是否存在,存在即更新
  771. if form_data.unitName:
  772. training.training_unit = form_data.unitName
  773. # 判断预案编号是否存在,存在即更新
  774. if form_data.trainingWay:
  775. training.training_method = form_data.trainingWay
  776. # 判断预案编号是否存在,存在即更新
  777. if form_data.peopleNum:
  778. training.participant_count = form_data.peopleNum
  779. # 判断预案编号是否存在,存在即更新
  780. if form_data.startTime:
  781. training.start_time = form_data.startTime
  782. # 判断预案编号是否存在,存在即更新
  783. if form_data.endTime:
  784. training.end_time = form_data.endTime
  785. # 判断预案编号是否存在,存在即更新
  786. if form_data.Content:
  787. training.training_content = form_data.Content
  788. # 判断预案编号是否存在,存在即更新
  789. if form_data.address:
  790. training.training_location = form_data.address
  791. # 判断预案编号是否存在,存在即更新
  792. if form_data.lon:
  793. training.training_lon = form_data.lon
  794. # 判断预案编号是否存在,存在即更新
  795. if form_data.lat:
  796. training.training_lat = form_data.lat
  797. # 提交
  798. db.commit()
  799. # 返回创建成功的响应
  800. return {
  801. "code": 200,
  802. "msg": "培训更新成功",
  803. "data": None
  804. }
  805. except Exception as e:
  806. # 处理异常
  807. raise HTTPException(status_code=500, detail=str(e))
  808. @router.delete('/training/delete')
  809. async def delete_emergency_training(
  810. trainingUids: str,
  811. db: Session = Depends(get_db)
  812. ):
  813. try:
  814. # 提取请求数据
  815. query = db.query(EmergencyTrainingSession)
  816. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  817. query = query.filter(EmergencyTrainingSession.training_id.in_(trainingUids))
  818. trainings = query.all()
  819. if not trainings:
  820. detail = "培训不存在"
  821. raise HTTPException(status_code=404, detail="培训不存在")
  822. for training in trainings:
  823. training.del_flag = '2'
  824. # 更新到数据库会话并提交
  825. db.commit()
  826. # 返回创建成功的响应
  827. return {
  828. "code": 200,
  829. "msg": "培训删除成功",
  830. "data": None
  831. }
  832. except Exception as e:
  833. # 处理异常
  834. if str(e) == '':
  835. e = detail
  836. raise HTTPException(status_code=500, detail=str(e))
  837. @router.delete('/training/delete/{trainingUid}')
  838. async def delete_emergency_training(
  839. trainingUid: str,
  840. db: Session = Depends(get_db)
  841. ):
  842. try:
  843. # 提取请求数据
  844. query = db.query(EmergencyTrainingSession)
  845. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  846. query = query.filter(EmergencyTrainingSession.training_id == trainingUid)
  847. training = query.first()
  848. if not training:
  849. detail = "培训不存在"
  850. raise HTTPException(status_code=404, detail="培训不存在")
  851. training.del_flag = '2'
  852. # 更新到数据库会话并提交
  853. db.commit()
  854. db.refresh(training) # 可选,如果需要刷新实例状态
  855. # 返回创建成功的响应
  856. return {
  857. "code": 200,
  858. "msg": "培训删除成功",
  859. "data": None
  860. }
  861. except Exception as e:
  862. # 处理异常
  863. if str(e) == '':
  864. e = detail
  865. raise HTTPException(status_code=500, detail=str(e))