__init__.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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,StreamingResponse
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy import and_, or_,text,literal
  8. from common.db import db_czrz
  9. from sqlalchemy.sql import func
  10. from sqlalchemy.future import select
  11. from common.auth_user import *
  12. from pydantic import BaseModel
  13. from database import get_db,get_db_share
  14. from typing import List
  15. from models import *
  16. from utils import *
  17. from utils.ry_system_util import *
  18. from utils.video_util import *
  19. from collections import defaultdict
  20. import traceback
  21. from concurrent.futures import ThreadPoolExecutor, as_completed
  22. from multiprocessing import Pool, cpu_count
  23. import json
  24. import time
  25. import math
  26. router = APIRouter()
  27. @router.put("/update/{id}")
  28. async def update_info(
  29. id :str ,
  30. user_id=Depends(valid_access_token),
  31. body=Depends(remove_xss_json),
  32. db: Session = Depends(get_db_share)
  33. ):
  34. try:
  35. query = db.query(EmergencyExpertInfo)
  36. query = query.filter(EmergencyExpertInfo.id == id)
  37. update_info = query.first()
  38. if not update_info:
  39. return JSONResponse(status_code=404, content={'msg':'信息不存在','code':404})
  40. if 'name' in body:
  41. update_info.name = body['name']
  42. if 'county' in body:
  43. update_info.county = body['county']
  44. if 'expert_type' in body:
  45. update_info.expert_type = body['expert_type']
  46. if 'honorary_title' in body:
  47. update_info.honorary_title = body['honorary_title']
  48. if 'unit' in body:
  49. update_info.unit = body['unit']
  50. if 'position' in body:
  51. update_info.position = body['position']
  52. if 'professional_title' in body:
  53. update_info.professional_title = body['professional_title']
  54. if 'specialty' in body:
  55. update_info.specialty = body['specialty']
  56. if 'rescue_experience' in body:
  57. update_info.rescue_experience = body['rescue_experience']
  58. if 'birth_date' in body:
  59. update_info.birth_date = body['birth_date']
  60. if 'work_start_date' in body:
  61. update_info.work_start_date = body['work_start_date']
  62. if 'certificate_issue_date' in body:
  63. update_info.certificate_issue_date = body['certificate_issue_date']
  64. if 'professional_group' in body:
  65. update_info.professional_group = body['professional_group']
  66. if 'professional_field' in body:
  67. update_info.professional_field = body['professional_field']
  68. if 'work_phone' in body:
  69. update_info.work_phone = body['work_phone']
  70. if 'home_phone' in body:
  71. update_info.home_phone = body['home_phone']
  72. if 'mobile_phone' in body:
  73. update_info.mobile_phone = body['mobile_phone']
  74. if 'email' in body:
  75. update_info.email = body['email']
  76. if 'contact_address' in body:
  77. update_info.contact_address = body['contact_address']
  78. if 'longitude' in body:
  79. update_info.longitude = body['longitude']
  80. if 'latitude' in body:
  81. update_info.latitude = body['latitude']
  82. db.commit()
  83. return {"code": 200, "msg": "更新成功"}
  84. except Exception as e:
  85. traceback.print_exc()
  86. return JSONResponse(status_code=500, content={'msg': f"Internal server error: {str(e)}", 'code': 500})
  87. @router.get("/info/{id}")
  88. async def get_info(
  89. id: str,
  90. db: Session = Depends(get_db_share)
  91. ):
  92. try:
  93. query = db.query(EmergencyExpertInfo)
  94. query = query.filter(EmergencyExpertInfo.id == id)
  95. info = query.first()
  96. # pattern = db.query(TpPatternList).filter(TpPatternList.id == pattern_id).first()
  97. if not info:
  98. return JSONResponse(status_code=404, content={'msg':'信息不存在','code':404})
  99. return {"code": 200, "msg": "获取成功", "data": {'id':info.id,
  100. 'name':info.name,
  101. 'county':info.county,
  102. 'expert_type':info.expert_type,
  103. 'honorary_title':info.honorary_title,
  104. 'unit' :info.unit,
  105. 'position' :info.position,
  106. 'professional_title' :info.professional_title,
  107. 'specialty' :info.specialty,
  108. 'rescue_experience' :info.rescue_experience,
  109. 'birth_date' :info.birth_date,
  110. 'work_start_date' :info.work_start_date,
  111. 'certificate_issue_date' :info.certificate_issue_date,
  112. 'professional_group' :info.professional_group,
  113. 'professional_field' :info.professional_field,
  114. 'work_phone' :info.work_phone,
  115. 'home_phone' :info.home_phone,
  116. 'mobile_phone' :info.mobile_phone,
  117. 'email' :info.email,
  118. 'contact_address' :info.contact_address,
  119. 'longitude' :info.longitude,
  120. 'latitude' :info.latitude}}
  121. except Exception as e:
  122. traceback.print_exc()
  123. return JSONResponse(status_code=500, content={'msg': f"Internal server error: {str(e)}", 'code': 500})
  124. @router.get("/list")
  125. async def get_list_info(
  126. keyword : str = Query(None),
  127. county : str = Query(None),
  128. professional_group : str = Query(None),
  129. page: int = Query(1, gt=0, description='页码'),
  130. pageSize: int = Query(5, gt=0, description='每页条目数量'),
  131. db: Session = Depends(get_db_share)
  132. ):
  133. try:
  134. query = db.query(EmergencyExpertInfo)
  135. if keyword:
  136. query = query.filter(or_(EmergencyExpertInfo.name.like(f'%{keyword}%'),
  137. EmergencyExpertInfo.unit.like(f'%{keyword}%'),
  138. EmergencyExpertInfo.professional_title.like(f'%{keyword}%'),
  139. EmergencyExpertInfo.professional_group.like(f'%{keyword}%'),
  140. EmergencyExpertInfo.professional_field.like(f'%{keyword}%')))
  141. print(query)
  142. if county:
  143. query = query.filter(EmergencyExpertInfo.county==county)
  144. if professional_group:
  145. query = query.filter(EmergencyExpertInfo.professional_group==professional_group)
  146. total_items = query.count()
  147. query = query.offset((page - 1) * pageSize).limit(pageSize)
  148. data = query.all()
  149. return {"code": 200, "msg": "获取成功",
  150. "data": [{'id':info.id,
  151. 'name':info.name,
  152. 'county':info.county,
  153. 'expert_type':info.expert_type,
  154. 'honorary_title':info.honorary_title,
  155. 'unit' :info.unit,
  156. 'position' :info.position,
  157. 'professional_title' :info.professional_title,
  158. 'specialty' :info.specialty,
  159. 'rescue_experience' :info.rescue_experience,
  160. 'birth_date' :info.birth_date,
  161. 'work_start_date' :info.work_start_date,
  162. 'certificate_issue_date' :info.certificate_issue_date,
  163. 'professional_group' :info.professional_group,
  164. 'professional_field' :info.professional_field,
  165. 'work_phone' :info.work_phone,
  166. 'home_phone' :info.home_phone,
  167. 'mobile_phone' :info.mobile_phone,
  168. 'email' :info.email,
  169. 'contact_address' :info.contact_address,
  170. 'longitude' :info.longitude,
  171. 'latitude' :info.latitude} for info in data],
  172. "total": total_items,
  173. "page": page,
  174. "pageSize": pageSize,
  175. "totalPages": (total_items + pageSize - 1) // pageSize}
  176. except Exception as e:
  177. traceback.print_exc()
  178. return JSONResponse(status_code=500, content={'msg': f"Internal server error: {str(e)}", 'code': 500})
  179. @router.get("/export")
  180. async def get_list_info(
  181. request: Request,
  182. keyword: str = Query(None),
  183. auth_user: AuthUser = Depends(find_auth_user),
  184. db: Session = Depends(get_db_share),
  185. mmdb:Session = Depends(get_db)
  186. ):
  187. try:
  188. query = db.query(EmergencyExpertInfo)
  189. if keyword:
  190. query = query.filter(or_(EmergencyExpertInfo.name.like(f'%{keyword}%'),
  191. EmergencyExpertInfo.unit.like(f'%{keyword}%'),
  192. EmergencyExpertInfo.professional_title.like(f'%{keyword}%'),
  193. EmergencyExpertInfo.professional_group.like(f'%{keyword}%'),
  194. EmergencyExpertInfo.professional_field.like(f'%{keyword}%')))
  195. data = query.all()
  196. data = [{'序号':info.id,
  197. '姓名':info.name,
  198. '所属区县':info.county,
  199. '专家类型':info.expert_type,
  200. '荣誉称号':info.honorary_title,
  201. '单位' :info.unit,
  202. '职位' :info.position,
  203. '职称' :info.professional_title,
  204. '擅长事故类型' :info.specialty,
  205. '救援经历' :info.rescue_experience,
  206. '出生日期' :info.birth_date,
  207. '工作时间' :info.work_start_date,
  208. '发证日期' :info.certificate_issue_date,
  209. '专业分组' :info.professional_group,
  210. '专业领域' :info.professional_field,
  211. '工作电话' :info.work_phone,
  212. '住宅电话' :info.home_phone,
  213. '移动电话' :info.mobile_phone,
  214. '电子邮箱' :info.email,
  215. '联系地址' :info.contact_address,
  216. '经度' :info.longitude,
  217. '纬度' :info.latitude} for info in data]
  218. # 返回结果
  219. import pandas as pd
  220. from io import BytesIO
  221. # 将查询结果转换为 DataFrame
  222. df = pd.DataFrame(data)
  223. # 将 DataFrame 导出为 Excel 文件
  224. output = BytesIO()
  225. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  226. df.to_excel(writer, index=False)
  227. # 设置响应头
  228. output.seek(0)
  229. from urllib.parse import quote
  230. encoded_filename = f'应急专家管理导出{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
  231. encoded_filename = quote(encoded_filename, encoding='utf-8')
  232. headers = {
  233. 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
  234. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  235. }
  236. db_czrz.log(mmdb, auth_user, "应急专家管理", f"应急专家管理导出数据成功", request.client.host)
  237. # 返回文件流
  238. return StreamingResponse(output, headers=headers)
  239. except Exception as e:
  240. traceback.print_exc()
  241. return JSONResponse(status_code=500, content={'msg': f"Internal server error: {str(e)}", 'code': 500})