videoinfo.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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 utils.video_util import *
  11. from common.security import valid_access_token
  12. from fastapi.responses import JSONResponse
  13. import traceback
  14. router = APIRouter()
  15. @router.get('/get_video_list_by_user')
  16. async def get_video_url_by_id(
  17. longitude:float = Query(None, description='经度'),
  18. latitude:float = Query(None, description='纬度'),
  19. db: Session = Depends(get_db),
  20. body=Depends(remove_xss_json),
  21. user_id=Depends(valid_access_token),
  22. page: int = Query(1, gt=0, description='页码'),
  23. pageSize: int = Query(10, gt=0, description='每页条目数量')
  24. ):
  25. if longitude is not None and latitude is not None:
  26. location = f"""ST_Distance_Sphere(
  27. ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),
  28. ST_PointFromText('POINT({longitude} {latitude})'))"""
  29. orddis = 'distance'
  30. else:
  31. location = 0
  32. orddis = ''
  33. videoIds = user_id_get_user_videoIds(db, user_id)
  34. video_list = [i.video_code_int for i in videoIds]
  35. if len(video_list)==0:
  36. video = ''
  37. else:
  38. video = ""
  39. for i in video_list:
  40. video += f"WHEN '{i}' THEN 0 \n"
  41. video = f"""CASE video_code_int
  42. {video}
  43. ELSE 1
  44. END """
  45. if orddis != '' and video !='':
  46. video += ','
  47. sql = f"""SELECT T1.indexcode,T2.`name`,T1.longitude,T1.latitude,
  48. {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
  49. FROM tp_video_base T1 RIGHT JOIN tp_video_log T2 on T1.indexcode=T2.video_code_int where T1.longitude is not NULL
  50. ORDER BY {video} {orddis} """
  51. totalsql = f'select count(*) from ({sql})t'
  52. print(video_list)
  53. total_items = db.execute(totalsql).first()[0]
  54. lim = f"limit {pageSize*(page-1)}, {pageSize};"
  55. videos = db.execute(sql+lim).all()
  56. # query = db.query(TpVideoLog)
  57. # total_items = query.count()
  58. #
  59. # query = query.order_by(
  60. # case(
  61. # [(TpVideoLog.video_code_int == video_code_int, 0) for video_code_int in video_list],
  62. # else_=1
  63. # )
  64. # )
  65. # videos = query.offset((page - 1) * pageSize).limit(pageSize).all()
  66. video_list1 = []
  67. for video in videos:
  68. videoInfo = {
  69. "name": video.name,
  70. "invideoIds": video.video_code_int in video_list,
  71. "area": video.area,
  72. "ip": video.ip,
  73. "status": video.status,
  74. "status_lifetime": video.status_lifetime,
  75. "record_status": video.record_status,
  76. "inspection_datetime": video.inspection_datetime,
  77. "video_code_int": video.video_code_int,
  78. "video_code": video.video_code,
  79. "longitude":video.longitude,
  80. "latitude":video.latitude
  81. }
  82. video_list1.append(videoInfo)
  83. return {
  84. "code": 200,
  85. "msg": "操作成功",
  86. "rows": video_list1,
  87. "total": total_items,
  88. "page": page,
  89. "pageSize": pageSize,
  90. "totalPages": (total_items + pageSize - 1) // pageSize
  91. }
  92. @router.get('/get_waterlogged_all_video_info')
  93. async def get_waterlogged_all_video_info(
  94. radius:int = Query(None),
  95. db: Session = Depends(get_db),
  96. body=Depends(remove_xss_json),
  97. page: int = Query(1, gt=0, description='页码'),
  98. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  99. user_id=Depends(valid_access_token)):
  100. try:
  101. if radius is None:
  102. radius=500
  103. sql = f"""SELECT * from mid_waterlogged_roads """
  104. waterlogged_data = db.execute(sql).all()
  105. resutl = []
  106. for location_1 in waterlogged_data:
  107. location = f"POINT({location_1.lng} {location_1.lat})"
  108. sql = text(f"""SELECT indexcode,`name`,longitude,latitude,distance FROM (
  109. SELECT indexcode,`name`,longitude,latitude,
  110. ST_Distance_Sphere(
  111. ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),
  112. ST_PointFromText('{location}')
  113. ) AS distance
  114. 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'
  115. ORDER BY distance ASC ) T""")
  116. resutl+=db.execute(sql).all()
  117. total_items = len(resutl)
  118. return {
  119. "code": 200,
  120. "msg": "成功",
  121. "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]]},
  122. "page": page,
  123. "pageSize": pageSize,
  124. "totalPages": (total_items + pageSize - 1) // pageSize
  125. }
  126. except Exception as e:
  127. traceback.print_exc()
  128. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  129. @router.get('/get_video_tag_info')
  130. async def get_video_tag_info(
  131. video_code:str = Query(None),
  132. db: Session = Depends(get_db),
  133. body=Depends(remove_xss_json),
  134. # page: int = Query(1, gt=0, description='页码'),
  135. # pageSize: int = Query(10, gt=0, description='每页条目数量'),
  136. user_id=Depends(valid_access_token)
  137. ):
  138. try:
  139. tag = []
  140. tag_lable = []
  141. for info in get_video_tag_list(db,video_code):
  142. tag_info = get_dict_data_info(db,info.dict_type,info.dict_value)
  143. if tag_info.dict_label not in tag_lable:
  144. tag.append({"id":info.id,
  145. "video_code":video_code,
  146. "dict_type":info.dict_type,
  147. "dict_value":info.dict_value,
  148. "dict_label":tag_info.dict_label,
  149. "dict_code":tag_info.dict_code})
  150. tag_lable.append(tag_info.dict_label)
  151. return {
  152. "code": 200,
  153. "msg": "成功",
  154. "data": tag
  155. }
  156. except Exception as e:
  157. traceback.print_exc()
  158. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  159. @router.post("/add_video_tag")
  160. async def add_video_tag(
  161. user_id=Depends(valid_access_token),
  162. body = Depends(remove_xss_json),
  163. db: Session = Depends(get_db)
  164. ):
  165. try:
  166. tag_info = get_dict_data_info(db, body['dict_type'], body['dict_value'])
  167. if tag_info is None:
  168. return JSONResponse(status_code=404,content={"code":404,"msg":"标签不存在"})
  169. new_video_tag = TpVideoTag(
  170. id = new_guid(),
  171. video_code=body['video_code'],
  172. dict_value=body['dict_value'],
  173. dict_type=body['dict_type'],
  174. create_dept = user_id
  175. )
  176. db.add(new_video_tag)
  177. db.commit()
  178. return {"code": 200, "msg": "新增成功", "data": None}
  179. except Exception as e:
  180. traceback.print_exc()
  181. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  182. @router.post("/add_video_tag_label")
  183. async def add_video_tag(
  184. user_id=Depends(valid_access_token),
  185. body = Depends(remove_xss_json),
  186. db: Session = Depends(get_db)
  187. ):
  188. try:
  189. dict_label = body['dict_label']
  190. dict_info = dict_label_get_dict_data_info(db,body['dict_type'],dict_label)
  191. if dict_info is None:
  192. dict_info = SysDictData(
  193. dict_label=dict_label,
  194. dict_value = new_guid(),
  195. dict_type=body['dict_type'],
  196. create_by = user_id
  197. )
  198. db.add(dict_info)
  199. new_video_tag = TpVideoTag(
  200. id = new_guid(),
  201. video_code=body['video_code'],
  202. dict_value=dict_info.dict_value,
  203. dict_type=body['dict_type'],
  204. create_dept = user_id
  205. )
  206. db.add(new_video_tag)
  207. db.commit()
  208. return {"code": 200, "msg": "新增成功", "data": None}
  209. except Exception as e:
  210. traceback.print_exc()
  211. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  212. @router.delete("/delete_video_tag/{video_tag_id}")
  213. async def delete_video_tag(
  214. video_tag_id: str,
  215. db: Session = Depends(get_db)
  216. ):
  217. try:
  218. # 检查图案是否存在
  219. query = db.query(TpVideoTag)
  220. query = query.filter(TpVideoTag.id == video_tag_id)
  221. query = query.filter(TpVideoTag.del_flag != '2')
  222. video_tag = query.first()
  223. if not video_tag:
  224. return JSONResponse(status_code=404,content={"code":404,"msg":"标签不存在"})
  225. # 执行删除操作
  226. video_tag.del_flag='2'
  227. db.commit()
  228. return {"code": 200, "msg": "删除成功"}
  229. except Exception as e:
  230. traceback.print_exc()
  231. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  232. @router.get('/get_recently_video_tag_info')
  233. async def get_video_tag_info(
  234. # video_code:str = Query(None),
  235. db: Session = Depends(get_db),
  236. body=Depends(remove_xss_json),
  237. page: int = Query(1, gt=0, description='页码'),
  238. pageSize: int = Query(3, gt=0, description='每页条目数量'),
  239. user_id=Depends(valid_access_token)
  240. ):
  241. try:
  242. query = db.query(SysDictData)
  243. query = query.filter(SysDictData.del_flag != '2')
  244. query = query.filter(SysDictData.dict_type == 'video_type')
  245. total_items = query.count()
  246. # 排序
  247. query = query.order_by(SysDictData.create_time.desc())
  248. # 执行分页查询
  249. dicts = query.offset((page - 1) * pageSize).limit(pageSize).all()
  250. tag = []
  251. for info in dicts:
  252. tag.append({
  253. "dict_type":info.dict_type,
  254. "dict_value":info.dict_value,
  255. "dict_label":info.dict_label,
  256. "dict_code":info.dict_code})
  257. return {
  258. "code": 200,
  259. "msg": "成功",
  260. "data": tag,
  261. "total": total_items,
  262. "page": page,
  263. "pageSize": pageSize,
  264. "totalPages": (total_items + pageSize - 1) // pageSize
  265. }
  266. except Exception as e:
  267. traceback.print_exc()
  268. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  269. @router.get('/get_lx_hy_video_tag_info')
  270. async def get_lx_hy_video_tag_info(
  271. dict_value:str = Query(None),
  272. db: Session = Depends(get_db),
  273. body=Depends(remove_xss_json),
  274. page: int = Query(1, gt=0, description='页码'),
  275. pageSize: int = Query(3, gt=0, description='每页条目数量'),
  276. user_id=Depends(valid_access_token)
  277. ):
  278. try:
  279. if dict_value is None:
  280. return {
  281. "code": 200,
  282. "msg": "成功",
  283. "data": []
  284. }
  285. query = db.query(SysDictData)
  286. query = query.filter(SysDictData.del_flag != '2')
  287. query = query.filter(SysDictData.dict_type == 'video_type')
  288. query = query.filter(SysDictData.remark.like( f'%{dict_value};%'))
  289. total_items = query.count()
  290. # 排序
  291. query = query.order_by(SysDictData.create_time.desc())
  292. # 执行分页查询
  293. dicts = query.offset((page - 1) * pageSize).limit(pageSize).all()
  294. tag = []
  295. for info in dicts:
  296. tag.append({
  297. "dict_type":info.dict_type,
  298. "dict_value":info.dict_value,
  299. "dict_label":info.dict_label,
  300. "dict_code":info.dict_code})
  301. return {
  302. "code": 200,
  303. "msg": "成功",
  304. "data": tag,
  305. "total": total_items,
  306. "page": page,
  307. "pageSize": pageSize,
  308. "totalPages": (total_items + pageSize - 1) // pageSize
  309. }
  310. except Exception as e:
  311. traceback.print_exc()
  312. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")