__init__.py 34 KB

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