videoinfo.py 14 KB

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