__init__.py 35 KB

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