__init__.py 16 KB

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