__init__.py 18 KB

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