__init__.py 34 KB

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