__init__.py 20 KB

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