__init__.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends,Query, HTTPException, status
  4. from pydantic import BaseModel
  5. from typing import List
  6. from fastapi.responses import JSONResponse
  7. from database import get_db
  8. from sqlalchemy.orm import Session
  9. from datetime import datetime
  10. from models import *
  11. from utils import *
  12. import json
  13. router = APIRouter()
  14. class File(BaseModel):
  15. fileName:str
  16. fileNameDesc:str
  17. filePath : str = 'null'
  18. class PlanCreateForm(BaseModel):
  19. planName : str
  20. planType : int
  21. # planTypeDesc : str
  22. publishDate: str
  23. organizingUnit : str
  24. document : str
  25. fileList : List[File] = []
  26. class DrillCreateForm(BaseModel):
  27. planNumber : str
  28. drillName : str
  29. organizingUnit : str
  30. plannedAnnual : int
  31. plannedTime: str
  32. drillLocation : str
  33. drillLon : float
  34. drillLat : float
  35. drillProject : List[File] = []
  36. drillVideo : List[File] = []
  37. drillPicture : List[File] = []
  38. @router.get('/plan/list')
  39. async def get_emergency_plan_list(
  40. planType: str = Query(None, description='预案类型'),
  41. publishDate: datetime = Query(None, description='发布日期'),
  42. planName: str = Query(None, description='预案名称'),
  43. page: int = Query(1, gt=0, description='页码'),
  44. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  45. db: Session = Depends(get_db)
  46. ):
  47. try:
  48. # 构建查询
  49. query = db.query(EmergencyPlan)
  50. query = query.filter(EmergencyPlan.del_flag != '2')
  51. # 应用查询条件
  52. if planType:
  53. query = query.filter(EmergencyPlan.plan_type == planType)
  54. if publishDate:
  55. query = query.filter(EmergencyPlan.publish_date == publishDate)
  56. if planName:
  57. query = query.filter(EmergencyPlan.plan_name.like(f'%{planName}%'))
  58. # 计算总条目数
  59. total_items = query.count()
  60. # 执行分页查询
  61. emergency_plans = query.offset((page - 1) * pageSize).limit(pageSize).all()
  62. # 将查询结果转换为列表形式的字典
  63. emergency_plans_list = [
  64. {
  65. "planUid": plan.plan_id,
  66. "planId": plan.plan_number,
  67. "planName": plan.plan_name,
  68. "planType": plan.plan_type,
  69. "organUnit": plan.organizing_unit,
  70. "document": plan.document_number,
  71. "publishDate": plan.publish_date.strftime('%Y-%m-%d')
  72. }
  73. for plan in emergency_plans
  74. ]
  75. # 构建分页信息
  76. pagination_info = {
  77. }
  78. # 返回结果
  79. return {
  80. "code": 200,
  81. "msg": "成功获取预案列表",
  82. "data": emergency_plans_list,
  83. "total": total_items,
  84. "page": page,
  85. "pageSize": pageSize,
  86. "totalPages": (total_items + pageSize - 1) // pageSize
  87. }
  88. except Exception as e:
  89. # 处理异常
  90. raise HTTPException(status_code=500, detail=str(e))
  91. @router.get('/plan/{planNum}')
  92. async def get_emergency_plan(
  93. planNum: str ,
  94. db: Session = Depends(get_db)
  95. ):
  96. try:
  97. # 构建查询
  98. query = db.query(EmergencyPlan)
  99. query = query.filter(EmergencyPlan.del_flag != '2')
  100. # 应用查询条件
  101. if planNum:
  102. query = query.filter(EmergencyPlan.plan_number == planNum)
  103. # 执行查询
  104. emergency_plan = query.first()
  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 == 'emergencyPlans_plan')
  108. file_query = file_query.filter(EmergencyFile.foreign_key == emergency_plan.plan_id)
  109. files = file_query.all()
  110. # 将查询结果转换为列表形式的字典
  111. emergency_plans ={
  112. "planUid": emergency_plan.plan_id,
  113. "planId": emergency_plan.plan_number,
  114. "planName": emergency_plan.plan_name,
  115. "planType": emergency_plan.plan_type,
  116. "organUnit": emergency_plan.organizing_unit,
  117. "document": emergency_plan.document_number,
  118. "publish_date": emergency_plan.publish_date.strftime('%Y-%m-%d'),
  119. "fileList":[{
  120. "fileName":file.file_name,
  121. "fileNameDesc":file.file_name_desc,
  122. "fileUrl":"/api/file/download/%s"%file.file_name
  123. } for file in files ]
  124. }
  125. # 返回结果
  126. return {
  127. "code": 200,
  128. "msg": "成功获取预案详情",
  129. "data": emergency_plans
  130. }
  131. except Exception as e:
  132. # 处理异常
  133. raise HTTPException(status_code=500, detail=str(e))
  134. @router.post('/plan/create')
  135. async def create_emergency_plan(
  136. form_data:PlanCreateForm,
  137. db: Session = Depends(get_db)
  138. ):
  139. try:
  140. # 提取请求数据
  141. plan_name = form_data.planName
  142. plan_type = form_data.planType
  143. # plan_type_desc = form_data.planTypeDesc
  144. publish_date = form_data.publishDate # 如果没有提供发布日期,则使用当前时间
  145. organizing_unit = form_data.organizingUnit # 使用用户位置作为编制单位
  146. document_number = form_data.document
  147. # 创建新的预案记录
  148. new_plan = EmergencyPlan(
  149. plan_id=new_guid(), # 假设使用 UUID 作为预案 UID
  150. plan_name=plan_name,
  151. plan_type=plan_type,
  152. # plan_type_desc=plan_type_desc,
  153. publish_date=publish_date,
  154. organizing_unit=organizing_unit,
  155. document_number=document_number
  156. )
  157. # 添加到数据库会话并提交
  158. db.add(new_plan)
  159. db.commit()
  160. db.refresh(new_plan) # 可选,如果需要刷新实例状态
  161. new_plan.plan_number= f'YJYA{str(new_plan.id).zfill(10)}'
  162. db.commit()
  163. for file in form_data.fileList:
  164. file_name = file.fileName
  165. file_name_desc = file.fileNameDesc
  166. file_path = file.filePath
  167. new_file = EmergencyFile(
  168. file_id = new_guid(),
  169. foreign_key = new_plan.plan_id,
  170. from_scenario = 'emergencyPlans_plan',
  171. file_name=file_name,
  172. file_name_desc = file_name_desc,
  173. file_path = file_path
  174. )
  175. db.add(new_file)
  176. db.commit()
  177. db.refresh(new_file)
  178. # 返回创建成功的响应
  179. return {
  180. "code": 200,
  181. "msg": "预案创建成功",
  182. "data": None
  183. }
  184. except Exception as e:
  185. # 处理异常
  186. raise HTTPException(status_code=500, detail=str(e))
  187. # @router.put('/plan/update')
  188. # async def update_emergency_plan(
  189. # plan_data: dict,
  190. # db: Session = Depends(get_db)
  191. # ):
  192. # try:
  193. # # 提取请求数据
  194. # query = db.query(EmergencyPlan)
  195. # query = query.filter(EmergencyPlan.plan_id == plan_data.get('plan_id'))
  196. # query = query.filter(EmergencyPlan.del_flag != '2')
  197. # plan = query.first()
  198. # if not plan:
  199. # detail = "预案不存在"
  200. # raise HTTPException(status_code=404, detail="预案不存在")
  201. #
  202. # plan.plan_name = plan_data.get('plan_name')
  203. # plan.plan_type = plan_data.get('plan_type')
  204. # plan.plan_type_desc = plan_data.get('plan_type_desc')
  205. # plan.publish_date = plan_data.get('publish_date') # 如果没有提供发布日期,则使用当前时间
  206. # plan.organizing_unit = plan_data.get('organizing_unit') # 使用用户位置作为编制单位
  207. # plan.document_number = plan_data.get('document_number')
  208. #
  209. #
  210. # # 更新到数据库会话并提交
  211. # db.commit()
  212. # db.refresh(new_plan) # 可选,如果需要刷新实例状态
  213. #
  214. # # 返回创建成功的响应
  215. # return {
  216. # "code": 200,
  217. # "msg": "预案更新成功",
  218. # "data": None
  219. # }
  220. # except Exception as e:
  221. # # 处理异常
  222. # if str(e)=='':
  223. # e = detail
  224. # raise HTTPException(status_code=500, detail=str(e))
  225. #
  226. #
  227. # @router.delete('/plan/delete')
  228. # async def delete_emergency_plan(
  229. # plan_data: dict,
  230. # db: Session = Depends(get_db)
  231. # ):
  232. # try:
  233. # # 提取请求数据
  234. # query = db.query(EmergencyPlan)
  235. # query = query.filter(EmergencyPlan.plan_id == plan_data.get('plan_id'))
  236. # query = query.filter(EmergencyPlan.del_flag != '2')
  237. # plan = query.first()
  238. # if not plan:
  239. # detail = "预案不存在"
  240. # raise HTTPException(status_code=404, detail="预案不存在")
  241. #
  242. # plan.del_flag = '2'
  243. #
  244. # # 更新到数据库会话并提交
  245. # db.commit()
  246. # db.refresh(new_plan) # 可选,如果需要刷新实例状态
  247. #
  248. # # 返回创建成功的响应
  249. # return {
  250. # "code": 200,
  251. # "msg": "预案删除成功",
  252. # "data": None
  253. # }
  254. # except Exception as e:
  255. # # 处理异常
  256. # if str(e) == '':
  257. # e = detail
  258. # raise HTTPException(status_code=500, detail=str(e))
  259. @router.get('/drill/list')
  260. async def get_emergency_drill_list(
  261. planNum: str = Query(None, description='预案编号'),
  262. page: int = Query(1, gt=0, description='页码'),
  263. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  264. db: Session = Depends(get_db)
  265. ):
  266. try:
  267. # 构建查询
  268. query = db.query(EmergencyDrill)
  269. query = query.filter(EmergencyDrill.del_flag != '2')
  270. # 应用查询条件
  271. if planNum:
  272. query = query.filter(EmergencyDrill.plan_number == planNum)
  273. else:
  274. return 'planNum不存在'
  275. # 计算总条目数
  276. total_items = query.count()
  277. # 执行分页查询
  278. emergency_drill = query.offset((page - 1) * pageSize).limit(pageSize).all() #
  279. print(emergency_drill)
  280. # 将查询结果转换为列表形式的字典
  281. emergency_drill_list = []
  282. for drill in emergency_drill:
  283. project_query = db.query(EmergencyFile)
  284. project_query = project_query.filter(EmergencyFile.del_flag != '2')
  285. project_query = project_query.filter(EmergencyFile.from_scenario == 'emergencyPlans_plan')
  286. project_query = project_query.filter(EmergencyFile.foreign_key == emergency_plan.plan_id)
  287. projects = project_query.all()
  288. video_query = db.query(EmergencyFile)
  289. video_query = video_query.filter(EmergencyFile.del_flag != '2')
  290. video_query = video_query.filter(EmergencyFile.from_scenario == 'emergencyPlans_plan')
  291. video_query = video_query.filter(EmergencyFile.foreign_key == emergency_plan.plan_id)
  292. videos = video_query.all()
  293. picture_query = db.query(EmergencyFile)
  294. picture_query = picture_query.filter(EmergencyFile.del_flag != '2')
  295. picture_query = picture_query.filter(EmergencyFile.from_scenario == 'emergencyPlans_plan')
  296. picture_query = picture_query.filter(EmergencyFile.foreign_key == emergency_plan.plan_id)
  297. pictures = picture_query.all()
  298. {
  299. "drillId": drill.drill_id,
  300. "drillName": drill.drill_name,
  301. "drillUnit": drill.organizing_unit,
  302. "year": "%s年"%drill.planned_annual,
  303. "drillTime": drill.planned_time.strftime('%Y-%m-%d %H:%M:%S'),
  304. "drillAddress": drill.drill_location,
  305. "drillProject":[{
  306. "fileName":file.file_name,
  307. "fileNameDesc":file.file_name_desc,
  308. "fileUrl":"/api/file/download/%s"%file.file_name
  309. } for file in projects ],
  310. "drillVideo":[{
  311. "fileName":file.file_name,
  312. "fileNameDesc":file.file_name_desc,
  313. "fileUrl":"/api/file/download/%s"%file.file_name
  314. } for file in videos ],
  315. "drillPicture":[{
  316. "fileName":file.file_name,
  317. "fileNameDesc":file.file_name_desc,
  318. "fileUrl":"/api/file/download/%s"%file.file_name
  319. } for file in pictures ]
  320. }
  321. # 返回结果
  322. return {
  323. "code": 200,
  324. "msg": "成功",
  325. "data": emergency_drill_list,
  326. "total": total_items,
  327. "page": page,
  328. "pageSize": pageSize,
  329. "totalPages": (total_items + pageSize - 1) // pageSize
  330. }
  331. except Exception as e:
  332. # 处理异常
  333. raise HTTPException(status_code=500, detail=str(e))
  334. @router.post('/drill/create')
  335. async def create_emergency_drill(
  336. form_data:DrillCreateForm,
  337. db: Session = Depends(get_db)
  338. ):
  339. try:
  340. # 提取请求数据
  341. plan_number = form_data.planNumber
  342. drill_name = form_data.drillName
  343. organizing_unit = form_data.organizingUnit
  344. planned_annual = form_data.plannedAnnual
  345. planned_time = form_data.plannedTime
  346. drill_location = form_data.drillLocation
  347. drill_lon = form_data.drillLon
  348. drill_lat = form_data.drillLat
  349. # 创建新的预案记录
  350. new_drill = EmergencyDrill(
  351. drill_id=new_guid(), # 假设使用 UUID 作为预案 UID
  352. plan_number = plan_number,
  353. drill_name=drill_name,
  354. organizing_unit = organizing_unit,
  355. planned_annual = planned_annual,
  356. planned_time = planned_time,
  357. drill_location = drill_location,
  358. drill_lon = drill_lon,
  359. drill_lat = drill_lat
  360. )
  361. # 添加到数据库会话并提交
  362. db.add(new_drill)
  363. db.commit()
  364. db.refresh(new_drill) # 可选,如果需要刷新实例状态
  365. for file in form_data.drillProject:
  366. file_name = file.fileName
  367. file_name_desc = file.fileNameDesc
  368. file_path = file.filePath
  369. new_file = EmergencyFile(
  370. file_id = new_guid(),
  371. foreign_key = new_drill.drill_id,
  372. from_scenario = 'emergencyPlans_drill_project',
  373. file_name=file_name,
  374. file_name_desc = file_name_desc,
  375. file_path = file_path
  376. )
  377. db.add(new_file)
  378. db.commit()
  379. db.refresh(new_file)
  380. for file in form_data.drillVideo:
  381. file_name = file.fileName
  382. file_name_desc = file.fileNameDesc
  383. file_path = file.filePath
  384. new_file = EmergencyFile(
  385. file_id = new_guid(),
  386. foreign_key = new_drill.drill_id,
  387. from_scenario = 'emergencyPlans_drill_video',
  388. file_name=file_name,
  389. file_name_desc = file_name_desc,
  390. file_path = file_path
  391. )
  392. db.add(new_file)
  393. db.commit()
  394. db.refresh(new_file)
  395. for file in form_data.drillPicture:
  396. file_name = file.fileName
  397. file_name_desc = file.fileNameDesc
  398. file_path = file.filePath
  399. new_file = EmergencyFile(
  400. file_id = new_guid(),
  401. foreign_key = new_drill.drill_id,
  402. from_scenario = 'emergencyPlans_drill_pic',
  403. file_name=file_name,
  404. file_name_desc = file_name_desc,
  405. file_path = file_path
  406. )
  407. db.add(new_file)
  408. db.commit()
  409. db.refresh(new_file)
  410. # 返回创建成功的响应
  411. return {
  412. "code": 200,
  413. "msg": "演练创建成功",
  414. "data": None
  415. }
  416. except Exception as e:
  417. # 处理异常
  418. raise HTTPException(status_code=500, detail=str(e))
  419. @router.get('/training/list')
  420. async def get_emergency_training_list(
  421. planNum: str = Query(None, description='预案编号'),
  422. page: int = Query(1, gt=0, description='页码'),
  423. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  424. db: Session = Depends(get_db)
  425. ):
  426. try:
  427. # 构建查询
  428. query = db.query(EmergencyTrainingSession)
  429. query = query.filter(EmergencyTrainingSession.del_flag != '2')
  430. # 应用查询条件
  431. if planNum:
  432. query = query.filter(EmergencyTrainingSession.plan_number == planNum)
  433. else:
  434. return 'planNum不存在'
  435. # 计算总条目数
  436. total_items = query.count()
  437. # 执行分页查询
  438. emergency_training = query.offset((page - 1) * pageSize).limit(pageSize).all() #
  439. # print(emergency_drill)
  440. # 将查询结果转换为列表形式的字典
  441. emergency_training_list = [
  442. {
  443. "textId": training.training_id,
  444. "theme": training.training_theme,
  445. "unitName": training.training_unit,
  446. "peopleNum": "%s人"%training.participant_count,
  447. "trainingWay":training.training_method,
  448. "startTime":training.start_time.strftime('%Y-%m-%d %H:%M:%S'),
  449. "endTime": training.end_time.strftime('%Y-%m-%d %H:%M:%S'),
  450. "address": training.training_location,
  451. "Content":training.training_content
  452. }
  453. for training in emergency_training
  454. ]
  455. # 返回结果
  456. return {
  457. "code": 200,
  458. "msg": "成功",
  459. "data": emergency_training_list,
  460. "total": total_items,
  461. "page": page,
  462. "pageSize": pageSize,
  463. "totalPages": (total_items + pageSize - 1) // pageSize
  464. }
  465. except Exception as e:
  466. # 处理异常
  467. raise HTTPException(status_code=500, detail=str(e))
  468. class TrainingCreateForm(BaseModel):
  469. trainingTheme : str
  470. trainingUnit : str
  471. trainingMethod : str
  472. participantCount: int
  473. startTime : str
  474. endTime : str
  475. trainingContent :str
  476. drillLocation : str
  477. drillLon : float
  478. drillLat : float
  479. @router.post('/training/create')
  480. async def create_emergency_training(
  481. form_data:TrainingCreateForm,
  482. db: Session = Depends(get_db)
  483. ):
  484. try:
  485. # 创建新的预案记录
  486. new_training = EmergencyTrainingSession(
  487. training_id=new_guid(), # 假设使用 UUID 作为预案 UID
  488. training_theme=form_data.trainingTheme,
  489. training_unit=form_data.trainingUnit,
  490. training_method=form_data.trainingMethod,
  491. participant_count=form_data.participantCount,
  492. start_time=form_data.startTime,
  493. end_time=form_data.endTime,
  494. training_content=form_data.trainingContent,
  495. drill_location=form_data.drillLocation,
  496. drill_lon=form_data.drillLon,
  497. drill_lat=form_data.drillLat
  498. )
  499. # 添加到数据库会话并提交
  500. db.add(new_training)
  501. db.commit()
  502. db.refresh(new_plan) # 可选,如果需要刷新实例状态
  503. # 返回创建成功的响应
  504. return {
  505. "code": 200,
  506. "msg": "培训创建成功",
  507. "data": None
  508. }
  509. except Exception as e:
  510. # 处理异常
  511. raise HTTPException(status_code=500, detail=str(e))