#!/usr/bin/env python3 # -*- coding: utf-8 -*- from fastapi import APIRouter, Request, Depends,Query,HTTPException from database import get_db from sqlalchemy.orm import Session from sqlalchemy import case from sqlalchemy import text from utils import * from utils.ry_system_util import * from common.security import valid_access_token import traceback router = APIRouter() @router.get('/get_video_list_by_user') async def get_video_url_by_id( longitude:float = Query(None, description='经度'), latitude:float = Query(None, description='纬度'), db: Session = Depends(get_db), body=Depends(remove_xss_json), user_id=Depends(valid_access_token), page: int = Query(1, gt=0, description='页码'), pageSize: int = Query(10, gt=0, description='每页条目数量') ): if longitude is not None and latitude is not None: location = f"""ST_Distance_Sphere( ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')), ST_PointFromText('POINT({longitude} {latitude})'))""" orddis = 'distance' else: location = 0 orddis = '' videoIds = user_id_get_user_videoIds(db, user_id) video_list = [i.video_code_int for i in videoIds] if len(video_list)==0: video = '' else: video = "" for i in video_list: video += f"WHEN '{i}' THEN 0 \n" video = f"""CASE video_code_int {video} ELSE 1 END """ if orddis != '' and video !='': video += ',' sql = f"""SELECT T1.indexcode,T2.`name`,T1.longitude,T1.latitude, {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 FROM tp_video_base T1 RIGHT JOIN tp_video_log T2 on T1.indexcode=T2.video_code_int where T1.longitude is not NULL ORDER BY {video} {orddis} """ totalsql = f'select count(*) from ({sql})t' print(video_list) total_items = db.execute(totalsql).first()[0] lim = f"limit {pageSize*(page-1)}, {pageSize};" videos = db.execute(sql+lim).all() # query = db.query(TpVideoLog) # total_items = query.count() # # query = query.order_by( # case( # [(TpVideoLog.video_code_int == video_code_int, 0) for video_code_int in video_list], # else_=1 # ) # ) # videos = query.offset((page - 1) * pageSize).limit(pageSize).all() video_list1 = [] for video in videos: videoInfo = { "name": video.name, "invideoIds": video.video_code_int in video_list, "area": video.area, "ip": video.ip, "status": video.status, "status_lifetime": video.status_lifetime, "record_status": video.record_status, "inspection_datetime": video.inspection_datetime, "video_code_int": video.video_code_int, "video_code": video.video_code, "longitude":video.longitude, "latitude":video.latitude } video_list1.append(videoInfo) return { "code": 200, "msg": "操作成功", "rows": video_list1, "total": total_items, "page": page, "pageSize": pageSize, "totalPages": (total_items + pageSize - 1) // pageSize } @router.get('/get_waterlogged_all_video_info') async def get_waterlogged_all_video_info( radius:int = Query(None), db: Session = Depends(get_db), body=Depends(remove_xss_json), page: int = Query(1, gt=0, description='页码'), pageSize: int = Query(10, gt=0, description='每页条目数量'), user_id=Depends(valid_access_token)): try: if radius is None: radius=500 sql = f"""SELECT * from mid_waterlogged_roads """ waterlogged_data = db.execute(sql).all() resutl = [] for location_1 in waterlogged_data: location = f"POINT({location_1.lng} {location_1.lat})" sql = text(f"""SELECT indexcode,`name`,longitude,latitude,distance FROM ( SELECT indexcode,`name`,longitude,latitude, ST_Distance_Sphere( ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')), ST_PointFromText('{location}') ) AS distance 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' ORDER BY distance ASC ) T""") resutl+=db.execute(sql).all() total_items = len(resutl) return { "code": 200, "msg": "成功", "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]]}, "page": page, "pageSize": pageSize, "totalPages": (total_items + pageSize - 1) // pageSize } except Exception as e: traceback.print_exc() raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")