__init__.py 35 KB

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