videoinfo.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends,Query,HTTPException
  4. from database import get_db
  5. from sqlalchemy.orm import Session
  6. from sqlalchemy import case
  7. from sqlalchemy import text
  8. from utils import *
  9. from utils.ry_system_util import *
  10. from common.security import valid_access_token
  11. import traceback
  12. router = APIRouter()
  13. @router.get('/get_video_list_by_user')
  14. async def get_video_url_by_id(
  15. longitude:float = Query(None, description='经度'),
  16. latitude:float = Query(None, description='纬度'),
  17. db: Session = Depends(get_db),
  18. body=Depends(remove_xss_json),
  19. user_id=Depends(valid_access_token),
  20. page: int = Query(1, gt=0, description='页码'),
  21. pageSize: int = Query(10, gt=0, description='每页条目数量')
  22. ):
  23. if longitude is not None and latitude is not None:
  24. location = f"""ST_Distance_Sphere(
  25. ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),
  26. ST_PointFromText('POINT({longitude} {latitude})'))"""
  27. orddis = 'distance'
  28. else:
  29. location = 0
  30. orddis = ''
  31. videoIds = user_id_get_user_videoIds(db, user_id)
  32. video_list = [i.video_code_int for i in videoIds]
  33. if len(video_list)==0:
  34. video = ''
  35. else:
  36. video = ""
  37. for i in video_list:
  38. video += f"WHEN '{i}' THEN 0 \n"
  39. video = f"""CASE video_code_int
  40. {video}
  41. ELSE 1
  42. END """
  43. if orddis != '' and video !='':
  44. video += ','
  45. sql = f"""SELECT T1.indexcode,T2.`name`,T1.longitude,T1.latitude,
  46. {location} AS distance,T2.area,T2.ip,T2.`status`,T2.status_lifetime,T2.record_status,T2.inspection_datetime,T2.video_code_int,T2.video_code
  47. FROM tp_video_base T1 RIGHT JOIN tp_video_log T2 on T1.indexcode=T2.video_code_int where T1.longitude is not NULL
  48. ORDER BY {video} {orddis} """
  49. totalsql = f'select count(*) from ({sql})t'
  50. print(video_list)
  51. total_items = db.execute(totalsql).first()[0]
  52. lim = f"limit {pageSize*(page-1)}, {pageSize};"
  53. videos = db.execute(sql+lim).all()
  54. # query = db.query(TpVideoLog)
  55. # total_items = query.count()
  56. #
  57. # query = query.order_by(
  58. # case(
  59. # [(TpVideoLog.video_code_int == video_code_int, 0) for video_code_int in video_list],
  60. # else_=1
  61. # )
  62. # )
  63. # videos = query.offset((page - 1) * pageSize).limit(pageSize).all()
  64. video_list1 = []
  65. for video in videos:
  66. videoInfo = {
  67. "name": video.name,
  68. "invideoIds": video.video_code_int in video_list,
  69. "area": video.area,
  70. "ip": video.ip,
  71. "status": video.status,
  72. "status_lifetime": video.status_lifetime,
  73. "record_status": video.record_status,
  74. "inspection_datetime": video.inspection_datetime,
  75. "video_code_int": video.video_code_int,
  76. "video_code": video.video_code,
  77. "longitude":video.longitude,
  78. "latitude":video.latitude
  79. }
  80. video_list1.append(videoInfo)
  81. return {
  82. "code": 200,
  83. "msg": "操作成功",
  84. "rows": video_list1,
  85. "total": total_items,
  86. "page": page,
  87. "pageSize": pageSize,
  88. "totalPages": (total_items + pageSize - 1) // pageSize
  89. }
  90. @router.get('/get_waterlogged_all_video_info')
  91. async def get_waterlogged_all_video_info(
  92. radius:int = Query(None),
  93. db: Session = Depends(get_db),
  94. body=Depends(remove_xss_json),
  95. page: int = Query(1, gt=0, description='页码'),
  96. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  97. user_id=Depends(valid_access_token)):
  98. try:
  99. if radius is None:
  100. radius=500
  101. sql = f"""SELECT * from mid_waterlogged_roads """
  102. waterlogged_data = db.execute(sql).all()
  103. resutl = []
  104. for location_1 in waterlogged_data:
  105. location = f"POINT({location_1.lng} {location_1.lat})"
  106. sql = text(f"""SELECT indexcode,`name`,longitude,latitude,distance FROM (
  107. SELECT indexcode,`name`,longitude,latitude,
  108. ST_Distance_Sphere(
  109. ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),
  110. ST_PointFromText('{location}')
  111. ) AS distance
  112. FROM tp_video_base where longitude is not null and latitude is not null and ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),ST_GeomFromText(CONCAT('{location}'))) <= '{radius}' and `status`='ON'
  113. ORDER BY distance ASC ) T""")
  114. resutl+=db.execute(sql).all()
  115. total_items = len(resutl)
  116. return {
  117. "code": 200,
  118. "msg": "成功",
  119. "data": {"list":[{"indexcode":info.indexcode,"name":info.name,"longitude":info.longitude,"latitude":info.latitude,"distance":info.distance} for info in resutl[(page - 1) * pageSize:(page - 1) * pageSize+pageSize]]},
  120. "page": page,
  121. "pageSize": pageSize,
  122. "totalPages": (total_items + pageSize - 1) // pageSize
  123. }
  124. except Exception as e:
  125. traceback.print_exc()
  126. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")