123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- from fastapi import APIRouter, Request, Depends,Query,HTTPException,status
- from fastapi.responses import StreamingResponse
- from database import get_db
- from sqlalchemy.orm import Session
- from sqlalchemy import case,or_
- from sqlalchemy import inspect
- from sqlalchemy import text
- from utils import *
- from utils.ry_system_util import *
- from utils.video_util import *
- from common.security import valid_access_token
- from common.db import db_czrz
- from common.auth_user import *
- from fastapi.responses import JSONResponse
- import traceback
- from datetime import datetime
- router = APIRouter()
- @router.get('/video_from')
- async def get_dict_data_by_type(
- db: Session = Depends(get_db),
- body = Depends(remove_xss_json),
- user_id = Depends(valid_access_token)
- ):
- # 视频来源
- try:
- # 根据 dict_type 查询字典数据
- query = db.query(TPVideoRegion)
- # 添加查询条件
- # if dictType:
- query = query.filter(TPVideoRegion.parentIndexCode=='root00000000')
- query = query.filter(TPVideoRegion.status == '0')
- query = query.order_by(TPVideoRegion.sort)
- dict_data = query.all()
- # 转换为字典
- dict_data_list = [
- {
- "dictCode": d.indexCode,
- "dictSort": d.sort,
- "dictLabel": d.name,
- "dictValue": d.indexCode,
- "dictType": 'video',
- "cssClass": '',
- "listClass": 'default',
- "isDefault": 'N',
- "remark": '',
- "createTime": d.createTime.strftime('%Y-%m-%d %H:%M:%S') if d.createTime else ''
- }
- for d in dict_data
- ]
- # 构建返回结果
- result = {
- "rows": dict_data_list,
- "code": 200,
- "msg": "查询成功"
- }
- return result
- except Exception as e:
- # 处理异常
- raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
- @router.get('/get_video_list_new')
- async def get_video_url_by_id(
- area_code: str = Query(None, description='区划编码'),
- video_from: str = Query(None, description='视频来源'),
- video_tag: str = Query(None, description='视频标签'),
- video_name: str = Query(None, description='视频名称'),
- 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='每页条目数量')
- ):
- # 大屏左下角视频及更多视频
- try:
- area_code_dict = {"440902":"茂南区","440904":"电白区","440981":"高州市","440982":"化州市","440983":"信宜市","440900":"直辖市"}
- query = db.query(TPVideoInfo)
- if area_code:
- query = query.filter(TPVideoInfo.gbIndexCode.like(f'%{area_code}%'))
- if video_from:
- query = query.filter(TPVideoInfo.regionPath.like(f'%{video_from}%'))
- if video_name:
- query = query.filter(TPVideoInfo.name.like(f'%{video_name}%'))
- if video_tag:
- tag_info = get_dict_data_info(db, 'video_type', video_tag)
- if tag_info:
- if tag_info.dict_label != '全量视频':
- videoli = [info.video_code for info in tag_get_video_tag_list(db, video_tag)]
- query = query.filter(TPVideoInfo.gbIndexCode.in_(videoli))
- videoIds = user_id_get_user_videoIds(db, user_id)
- video_list = [i.video_code_int for i in videoIds]
- if video_list:
- video_priority_case = case(
- [
- (TPVideoInfo.gbIndexCode == i, 0)
- for i in video_list
- ],
- else_=1
- ).label('user_priority')
- query = query.add_columns(video_priority_case).order_by('user_priority')
- if longitude is not None and latitude is not None:
- point = func.ST_GeomFromText(f'POINT({latitude} {longitude})', 4326)
- query = query.add_columns(
- func.ST_Distance_Sphere(TPVideoInfo.location, point).label('distance')
- ).order_by('distance')
- total_items = query.count()
- videos = query.offset(pageSize * (page - 1)).limit(pageSize).all()
- data = []
- for row in videos:
- row = row[0]
- # print(type(row),row[0])
- tag_list =get_video_tag_list(db,row.gbIndexCode)
- tag = []
- tag_lable = []
- for info in tag_list:
- tag_info = get_dict_data_info(db, 'video_type', info.dict_value)
- if tag_info:
- if tag_info.dict_label not in tag_lable and tag_info.dict_label!='全量视频':
- tag.append({"id": info.id,
- "video_code": row.gbIndexCode,
- "dict_type": info.dict_type,
- "dict_value": info.dict_value,
- "dict_label": tag_info.dict_label,
- "dict_code": tag_info.dict_code})
- tag_lable.append(tag_info.dict_label)
- video_area_code=row.gbIndexCode[:6]
- video_area = ''
- if video_area_code in area_code_dict:
- video_area=area_code_dict[video_area_code]
- data.append({
- "name":row.name,
- "isUserVideos":row.gbIndexCode in video_list,
- "video_code": row.gbIndexCode,
- "isTag" : len(tag_list)>0,
- "tag" : tag,
- "tagLabels" : "、".join(tag_lable),
- "status":row.status,
- "statusName":row.statusName,
- "regionPath":row.regionPath,
- "installPlace":row.installPlace,
- "cameraTypeName":row.cameraTypeName,
- "cameraType":row.cameraType,
- "video_area":video_area
- })
- return {
- "code": 200,
- "msg": "操作成功",
- "data": data,
- "total": total_items,
- "page": page,
- "pageSize": pageSize,
- "totalPages": (total_items + pageSize - 1) // pageSize
- }
- except Exception as e:
- # 处理异常
- traceback.print_exc()
- raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
- @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()
- 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),
- longitude:str = Query(None),
- latitude:str = 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
- # print(1,datetime.now)
- # sql = f"""SELECT * from mid_waterlogged_roads """
- # waterlogged_data = db.execute(sql).all()
- # resutl = []
- # print(2,datetime.now)
- # tj = []
- # for location_1 in waterlogged_data:
- if longitude is None or latitude is None:
- tj ="1=1"
- px = "1"
- else:
- location = f"POINT({longitude} {latitude})"
- tj = f"ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),ST_GeomFromText(CONCAT('{location}'))) <= '{radius}'"
- px = f"ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),ST_GeomFromText(CONCAT('{location}'))) "
- # tj = ' or '.join(tj)
- sql = text(f"""SELECT indexcode,`name`,longitude,latitude,status FROM (
- SELECT gbIndexCode as indexcode,`name`,longitude,latitude ,status
- FROM tp_video_info where longitude is not null and latitude is not null and ({tj}) and `unitIndexCode`='eab0ed85ff9e4369a0e52680301c3160'
- order by {px}
- ) T limit {pageSize*(page-1)}, {pageSize}""")
- 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,"status":info.status} for info in resutl[(page - 1) * pageSize:(page - 1) * pageSize+pageSize]]},
- "page": page,
- "pageSize": pageSize,
- "total":total_items,
- "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)}")
- @router.get('/get_video_list')
- async def get_video_forest_fire_list(
- video_type:str = Query(None),
- area:str = Query(None),
- name:str = Query(None),
- db: Session = Depends(get_db),
- page: int = Query(1, gt=0, description='页码'),
- pageSize: int = Query(0, gt=0, description='每页条目数量'),
- body=Depends(remove_xss_json),
- user_id=Depends(valid_access_token)):
- try:
- sql = '''SELECT T1.`name`,IF(T1.`status`='在线',1,0) as `status`,T1.`video_code_int`as `video_code`,IFNULL(IFNULL(T3.longitude,T2.longitude),0) as longitude,IFNULL(IFNULL(T3.latitude,T2.latitude),0) as latitude,CASE
- WHEN IFNULL(T3.area,T1.area) like '%高州%' THEN
- '440981'
- WHEN IFNULL(T3.area,T1.area) like '%信宜%' THEN
- '440983'
- WHEN IFNULL(T3.area,T1.area) like '%化州%' THEN
- '440982'
- WHEN IFNULL(T3.area,T1.area) like '%茂南%' THEN
- '440902'
- WHEN IFNULL(T3.area,T1.area) like '%电白%' THEN
- '440904'
- ELSE
- '440900'
- END
- as area FROM tp_video_log T1 LEFT JOIN (SELECT indexcode,longitude,latitude FROM `tp_video_base`where latitude>0) T2 on T1.video_code_int=T2.indexcode LEFT JOIN tp_video_log_transportation_area_info T3 on T1.video_code_int=T3.video_code where 1=1 and T2.longitude>0 '''
- if video_type:
- sql += f''' and T1.video_code_int in (select video_code from Tp_Video_Tag where del_flag ='0' and dict_value='{video_type}')'''
- if name:
- sql += f''' and T1.name like '%{name}%' '''
- # 计算总条目数
- totalsql = f'select count(*) as ct from ({sql})t where longitude > 0'
- total_items = db.execute(totalsql).first().ct
- # 排序
- if pageSize!=0:
- sql = f'''select * from ({sql} limit {pageSize*(page-1)}, {pageSize})t where longitude > 0 '''
- video_list = db.execute(sql).all()
- totalPages= (total_items + pageSize - 1) // pageSize
- else:
- pageSize = total_items
- totalPages = 1
- video_list = db.execute(f"""select * from ({sql})t where longitude > 0 """).all()
- result = []
- for video_info in video_list:
- longitude = video_info.longitude
- latitude = video_info.latitude
- area = video_info.area
- result.append({"area":area,
- "status":video_info.status,
- "name":video_info.name,
- "video_code":video_info.video_code,
- # "video_type_label":video_type_label,
- "longitude":longitude,
- "latitude":latitude})
- return {
- "code": 200,
- "msg": "成功",
- "data": result,
- 'total':total_items,
- "page": page,
- "pageSize": pageSize,
- "totalPages": totalPages
- }
- except Exception as e:
- traceback.print_exc()
- raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
- @router.get('/get_video_transportation_list')
- async def get_video_forest_fire_list(
- video_type:str = Query(None),
- area:str = Query(None),
- name:str = Query(None),
- db: Session = Depends(get_db),
- page: int = Query(1, gt=0, description='页码'),
- pageSize: int = Query(10, gt=0, description='每页条目数量'),
- body=Depends(remove_xss_json),
- user_id=Depends(valid_access_token)):
- try:
- video_type_list = ['sjyld','sgdfd','jtdd','dzzhyhd']
- # video_code_list = [item[0] for item in db.query(TpVideoTag.id).filter(TpVideoTag.dict_value == '4').all()]
- video_list = db.query(TPVideoInfo).filter(TPVideoInfo.regionPath.like('@root00000000@44000000002160847111@%'))
- if video_type:
- if video_type in video_type_list:
- lis = [i.video_code for i in db.query(TpVideoTag.video_code).filter(TpVideoTag.dict_value==video_type , TpVideoTag.del_flag =='0').all()]
- video_list = video_list.filter(TPVideoInfo.gbIndexCode.in_(lis))
- if area:
- if area=='直辖市':
- lis = [i.video_code for i in db.query(TpVideoLogTransportationAreaInfo.video_code).all()]
- video_list = video_list.filter(TPVideoInfo.gbIndexCode.in_(lis))
- else:
- lis = [i.video_code for i in db.query(TpVideoLogTransportationAreaInfo.video_code).filter(TpVideoLogTransportationAreaInfo.area == area).all()]
- video_list = video_list.filter(TPVideoInfo.gbIndexCode.in_(lis))
- if name:
- video_list = video_list.filter(TPVideoInfo.name.like(f'%{name}%'))
- # 计算总条目数
- total_items = video_list.count()
- # 排序
- video_list = video_list.order_by(TPVideoInfo.gbIndexCode)
- # 执行分页查询
- # print(video_list.offset((page - 1) * pageSize).limit(pageSize))
- video_list = video_list.offset((page - 1) * pageSize).limit(pageSize).all()
- result = []
- # print(total_items,len(video_list),(page - 1) * pageSize,pageSize)
- for video_info in video_list:
- video_code = video_info.gbIndexCode
- video_type_label='其他'
- longitude = 0
- latitude = 0
- area = '直辖市'
- video_type_li = db.query(TpVideoTag).filter(TpVideoTag.video_code == video_code,
- TpVideoTag.del_flag == '0',TpVideoTag.dict_value.in_(video_type_list)).first()
- if video_type_li:
- query = db.query(SysDictData)
- query = query.filter(SysDictData.del_flag != '2')
- query = query.filter(SysDictData.dict_type == 'video_type_8')
- query = query.filter(SysDictData.dict_value == video_type_li.dict_value).first()
- if query:
- video_type_label = query.dict_label
- video_base_info = db.query(TpVideoLogTransportationAreaInfo).filter(TpVideoLogTransportationAreaInfo.video_code==video_code).first()
- if video_base_info:
- longitude = video_base_info.longitude
- latitude = video_base_info.latitude
- area = video_base_info.area
- result.append({"area":area,"status":video_info.status,"name":video_info.name,"video_code":video_code,"video_type_label":video_type_label,"longitude":longitude,"latitude":latitude})
- return {
- "code": 200,
- "msg": "成功",
- "data": result,
- 'total':total_items,
- "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)}")
- @router.get('/get_point_info_transportation_video')
- @router.post('/get_point_info_transportation_video')
- async def get_video_forest_fire_list(
- db: Session = Depends(get_db),
- page: int = Query(1, gt=0, description='页码'),
- pageSize: int = Query(10, gt=0, description='每页条目数量'),
- body=Depends(remove_xss_json),
- user_id=Depends(valid_access_token)):
- try:
- video_type_list = ['sjyld','sgdfd','jtdd','dzzhyhd']
- # video_code_list = [item[0] for item in db.query(TpVideoTag.id).filter(TpVideoTag.dict_value == '4').all()]
- video_list = db.query(TPVideoInfo).filter(TPVideoInfo.regionPath.like('@root00000000@44000000002160847111@%'))
- if 'query' in body:
- if 'id' in body['query']:
- video_list = video_list.filter(TPVideoInfo.gbIndexCode==body['query']['id'])
- # 计算总条目数
- total_items = video_list.count()
- # 排序
- video_list = video_list.order_by(TPVideoInfo.gbIndexCode)
- # 执行分页查询
- # print(video_list.offset((page - 1) * pageSize).limit(pageSize))
- video_list = video_list.offset((page - 1) * pageSize).limit(pageSize).all()
- result = []
- # print(total_items,len(video_list),(page - 1) * pageSize,pageSize)
- for video_info in video_list:
- video_code = video_info.gbIndexCode
- video_type_label='其他'
- longitude = 0
- latitude = 0
- area = '直辖市'
- video_type_li = db.query(TpVideoTag).filter(TpVideoTag.video_code == video_code,
- TpVideoTag.del_flag == '0',TpVideoTag.dict_value.in_(video_type_list)).first()
- if video_type_li:
- query = db.query(SysDictData)
- query = query.filter(SysDictData.del_flag != '2')
- query = query.filter(SysDictData.dict_type == 'video_type')
- query = query.filter(SysDictData.dict_value == video_type_li.dict_value).first()
- if query:
- video_type_label = query.dict_label
- video_base_info = db.query(TpVideoLogTransportationAreaInfo).filter(TpVideoLogTransportationAreaInfo.video_code==video_code).first()
- if video_base_info:
- longitude = video_base_info.longitude
- latitude = video_base_info.latitude
- area = video_base_info.area
- result.append({"area":area,"status":video_info.status,"name":video_info.name,"video_code":video_info.gbIndexCode,"video_type_label":video_type_label,"longitude":longitude,"latitude":latitude})
- return {
- "code": 0,
- "msg": "success",
- "rows": result,
- 'total':total_items,
- "currentPage": page,
- "pageSize": pageSize,
- "pages": (total_items + pageSize - 1) // pageSize
- }
- except Exception as e:
- traceback.print_exc()
- raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
- @router.get('/transportation/type')
- async def get_dict_data_by_type(
- db: Session = Depends(get_db),
- body = Depends(remove_xss_json),
- user_id = Depends(valid_access_token)
- ):
- try:
- # 根据 dict_type 查询字典数据
- video_type_list = ['sjyld','sgdfd','jtdd','dzzhyhd']
- query = db.query(SysDictData)
- query = query.filter(SysDictData.dict_type=='video_type_8')
- query = query.filter(SysDictData.dict_value.in_(video_type_list))
- query = query.filter(SysDictData.del_flag != '2')
- query = query.order_by(SysDictData.dict_sort)
- # dict_data = db.query(SysDictData).filter_by(dict_type==dict_type and del_flag != '2').all()
- dict_data = query.all()
- # 将模型转换为字典
- dict_data_list = [
- {
- "dictCode": d.dict_code,
- "dictSort": d.dict_sort,
- "dictLabel": d.dict_label,
- "dictValue": d.dict_value,
- "dictType": d.dict_type,
- "cssClass": d.css_class,
- "listClass": d.list_class,
- "isDefault": d.is_default,
- "remark": d.remark,
- "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else ''
- }
- for d in dict_data
- ]
- # 构建返回结果
- result = {
- "code": 200,
- "msg": "操作成功",
- "data": dict_data_list
- }
- return result
- except Exception as e:
- # 处理异常
- traceback.print_exc()
- raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
- def id_get_region_info(db, indexCode):
- query = db.query(TPVideoRegion)
- query = query.filter(TPVideoRegion.indexCode == indexCode)
- return query.all()
- def parent_id_get_region_info(db, parent_id):
- query = db.query(TPVideoRegion)
- query = query.filter(TPVideoRegion.parentIndexCode == parent_id)
- query = query.order_by(TPVideoRegion.sort.asc())
- return query.all()
- def parent_id_get_video_info(db, unitIndexCode,status):
- query = db.query(TPVideoInfo)
- query = query.filter(TPVideoInfo.unitIndexCode == unitIndexCode)
- query = query.order_by(TPVideoInfo.gbIndexCode.asc())
- if status:
- query = query.filter(TPVideoInfo.status == status)
- return query.all()
- def region_path_get_video_info(db, regionPath,status):
- query = db.query(TPVideoInfo)
- query = query.filter(TPVideoInfo.regionPath.like(f"%{regionPath}%"))
- query = query.order_by(TPVideoInfo.gbIndexCode.asc())
- if status:
- query = query.filter(TPVideoInfo.status == status)
- return query.all()
- @router.get('/get_video_forest_fire_index_code')
- async def get_dict_data_by_type(
- db: Session = Depends(get_db)
- ):
- try:
- # 根据 dict_type 查询字典数据
- # dict_data = db.query(SysDictData).filter_by(dict_type=dictType).all()
- d = parent_id_get_region_info(db, '4409000000216202502')
- dict_data_list = [{
- "dictCode": data.indexCode,
- "dictSort": data.sort,
- "dictLabel": data.name,
- "dictValue": data.indexCode,
- "dictType": '',
- "cssClass": '',
- "listClass": ''
- }for data in d]
- # 构建返回结果
- result = {
- "data": dict_data_list,
- "code": 200,
- "msg": "查询成功"
- }
- return result
- except Exception as e:
- traceback.print_exc()
- raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
- @router.get('/get_video_forest_fire_export')
- async def get_video_forest_fire_list(
- request: Request,
- indexCode:str = Query('4409000000216202502'),
- status:str = Query(None),
- db: Session = Depends(get_db),
- user_id: AuthUser = Depends(find_auth_user),
- body=Depends(remove_xss_json)):
- try:
- data = region_path_get_video_info(db, indexCode, status)
- data = [{
- "摄像头索引码": info.cameraIndexCode,
- "国标索引码": info.gbIndexCode,
- "摄像头名称": info.name,
- "经度": info.longitude,
- "纬度": info.latitude,
- "海拔": info.altitude,
- "像素": info.pixel,
- "摄像头类型代码": info.cameraType,
- "摄像头类型名称": info.cameraTypeName,
- "安装位置": info.installPlace,
- "所属组织编号": info.unitIndexCode,
- "机构路径": info.regionPath,
- "更新时间": info.updateTime,
- "创建时间": info.createTime,
- "状态码": info.status,
- "状态名称": info.statusName
- } for info in data]
- import pandas as pd
- from io import BytesIO
- # 将查询结果转换为 DataFrame
- df = pd.DataFrame(data)
- # 将 DataFrame 导出为 Excel 文件
- output = BytesIO()
- with pd.ExcelWriter(output, engine='openpyxl') as writer:
- df.to_excel(writer, index=False)
- # 设置响应头
- output.seek(0)
- from urllib.parse import quote
- encoded_filename = f'森防视频{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
- encoded_filename = quote(encoded_filename, encoding='utf-8')
- headers = {
- 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
- 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
- }
- db_czrz.log(db, user_id, "全域地图", f"全域地图导出森防视频数据成功", request.client.host)
- # 返回文件流
- return StreamingResponse(output, headers=headers)
- except Exception as e:
- traceback.print_exc()
- return JSONResponse(status_code=500, content={"code": 500, "msg": f"Internal server error: {str(e)}"})
- @router.get('/get_video_forest_fire_list')
- async def get_video_forest_fire_list(
- indexCode:str = Query('4409000000216202502'),
- status:str = Query(None),
- db: Session = Depends(get_db),
- body=Depends(remove_xss_json),
- user_id=Depends(valid_access_token)):
- try:
- """
- 根据层级路径构建带有 label 和 children 的树形结构。
- :param paths: 包含层级路径的列表
- :return: 树形结构的字典
- """
- "20ba3e565de64df9b29ff70a8056939a"
- def build_video_tree(regions, parent_region,online,total,status):
- video_tree = []
- for region_info in regions:
- region = {
- "label": region_info.name,
- "isLeaf": False,
- "status": region_info.status,
- "children":[]
- }
- # print(dept_info.dept_id)
- videos = parent_id_get_video_info(db, region_info.indexCode,status)
- if len(videos) > 0:
- for video_info in videos:
- region["children"].append({"label":video_info.name,"status":video_info.status,"video_code":video_info.gbIndexCode,"isLeaf":True})
- if video_info.status==1:
- online+=1
- total += 1
- children = parent_id_get_region_info(db, region_info.indexCode)
- if len(children) > 0:
- children_regions, online, total = build_video_tree(children, region, online, total,status)
- region["children"] = children_regions+region["children"]
- video_tree.append(region)
- return video_tree,online,total
- result,online,total = build_video_tree(id_get_region_info(db, indexCode), None,0,0,status)
- return {
- "code": 200,
- "msg": "成功",
- "data": result,
- 'online':online,
- 'total':total
- }
- #
- # video_code_list = [item[0] for item in db.query(TpVideoTag.video_code).filter(TpVideoTag.dict_value == 'slfh').all()]
- # # print(video_code_list)
- # video_list = db.query(TpVideoLog).filter(TpVideoLog.video_code.in_(video_code_list)).all()
- # root = {"label": "Root", "children": [],"online":0,"total":0} # 创建根节点
- #
- # for video_info in video_list:
- # levels = video_info.area.split('/')
- # current_node = root
- # current_node['total']+=1
- # if video_info.status == '在线':
- # current_node['online']+=1
- # for level in levels:
- # # 查找当前层级是否已存在
- # existing_node = next((node for node in current_node["children"] if node["label"] == level), None)
- # if not existing_node:
- # # 如果不存在,创建新节点
- # new_node = {"label": level, "children": [],"online":0,"total":0}
- # current_node["children"].append(new_node)
- # existing_node = new_node
- #
- # # 移动到子节点
- # current_node = existing_node
- # current_node['total']+=1
- # if video_info.status == '在线':
- # current_node['online']+=1
- #
- # current_node['children'].append({"label":video_info.name,"status":video_info.status,"video_code":video_info.video_code,"isLeaf":True})
- #
- # return {
- # "code": 200,
- # "msg": "成功",
- # "data": root['children'],
- # 'online':root['online'],
- # 'total':root['total']
- # }
- except Exception as e:
- traceback.print_exc()
- raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
- @router.get('/get_video_tag_info')
- async def get_video_tag_info(
- video_code:str = Query(None),
- db: Session = Depends(get_db),
- body=Depends(remove_xss_json),
- user_id=Depends(valid_access_token)
- ):
- try:
- tag = []
- tag_lable = []
- for info in get_video_tag_list(db,video_code):
- tag_info = get_dict_data_info(db,'video_type',info.dict_value)
- if tag_info:
- if tag_info.dict_label not in tag_lable:
- tag.append({"id":info.id,
- "video_code":video_code,
- "dict_type":info.dict_type,
- "dict_value":info.dict_value,
- "dict_label":tag_info.dict_label,
- "dict_code":tag_info.dict_code})
- tag_lable.append(tag_info.dict_label)
- return {
- "code": 200,
- "msg": "成功",
- "data": tag
- }
- except Exception as e:
- traceback.print_exc()
- raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
- @router.post("/add_video_tag")
- async def add_video_tag(
- user_id=Depends(valid_access_token),
- body = Depends(remove_xss_json),
- db: Session = Depends(get_db)
- ):
- try:
- tag_info = get_dict_data_info(db, body['dict_type'], body['dict_value'])
- if tag_info is None:
- return JSONResponse(status_code=404,content={"code":404,"msg":"标签不存在"})
- new_video_tag = TpVideoTag(
- id = new_guid(),
- video_code=body['video_code'],
- dict_value=body['dict_value'],
- dict_type=body['dict_type'],
- create_dept = user_id
- )
- db.add(new_video_tag)
- db.commit()
- return {"code": 200, "msg": "新增成功", "data": None}
- except Exception as e:
- traceback.print_exc()
- raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
- @router.post("/add_video_tag_label")
- async def add_video_tag(
- user_id=Depends(valid_access_token),
- body = Depends(remove_xss_json),
- db: Session = Depends(get_db)
- ):
- try:
- dict_label = body['dict_label']
- dict_info = dict_label_get_dict_data_info(db,body['dict_type'],dict_label)
- if dict_info is None:
- dict_info = SysDictData(
- dict_label=dict_label,
- dict_value = new_guid(),
- dict_type=body['dict_type'],
- list_class = 'default',
- create_by = user_id
- )
- db.add(dict_info)
- new_video_tag = TpVideoTag(
- id = new_guid(),
- video_code=body['video_code'],
- dict_value=dict_info.dict_value,
- dict_type=body['dict_type'],
- create_dept = user_id
- )
- db.add(new_video_tag)
- db.commit()
- return {"code": 200, "msg": "新增成功", "data": None}
- except Exception as e:
- traceback.print_exc()
- raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
- @router.delete("/delete_video_tag/{video_tag_id}")
- async def delete_video_tag(
- video_tag_id: str,
- db: Session = Depends(get_db)
- ):
- try:
- # 检查图案是否存在
- query = db.query(TpVideoTag)
- query = query.filter(TpVideoTag.id == video_tag_id)
- query = query.filter(TpVideoTag.del_flag != '2')
- video_tag = query.first()
- if not video_tag:
- return JSONResponse(status_code=404,content={"code":404,"msg":"标签不存在"})
- # 执行删除操作
- video_tag.del_flag='2'
- db.commit()
- return {"code": 200, "msg": "删除成功"}
- except Exception as e:
- traceback.print_exc()
- raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
- @router.get('/get_recently_video_tag_info')
- async def get_video_tag_info(
- # video_code:str = Query(None),
- db: Session = Depends(get_db),
- body=Depends(remove_xss_json),
- page: int = Query(1, gt=0, description='页码'),
- pageSize: int = Query(3, gt=0, description='每页条目数量'),
- user_id=Depends(valid_access_token)
- ):
- try:
- query = db.query(SysDictData)
- query = query.filter(SysDictData.del_flag != '2')
- query = query.filter(SysDictData.dict_type == 'video_type')
- total_items = query.count()
- # 排序
- query = query.order_by(SysDictData.create_time.desc())
- # 执行分页查询
- dicts = query.offset((page - 1) * pageSize).limit(pageSize).all()
- tag = []
- for info in dicts:
- tag.append({
- "dict_type":info.dict_type,
- "dict_value":info.dict_value,
- "dict_label":info.dict_label,
- "dict_code":info.dict_code})
- return {
- "code": 200,
- "msg": "成功",
- "data": tag,
- "total": total_items,
- "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)}")
- @router.get('/get_lx_hy_video_tag_info')
- async def get_lx_hy_video_tag_info(
- dict_value:str = Query(None),
- type:str= Query(None),
- db: Session = Depends(get_db),
- body=Depends(remove_xss_json),
- page: int = Query(1, gt=0, description='页码'),
- pageSize: int = Query(3, gt=0, description='每页条目数量'),
- user_id=Depends(valid_access_token)
- ):
- try:
- if dict_value is None or dict_value =='':
- query = db.query(SysDictData)
- query = query.filter(SysDictData.del_flag != '2')
- query = query.filter(SysDictData.dict_type == 'video_type')
- if type=='lx':
- query_1 = db.query(SysDictData)
- query_1 = query_1.filter(SysDictData.del_flag != '2')
- query_1 = query_1.filter(SysDictData.dict_type == 'video_tag_type')
- elif type == 'hy':
- query_1 = db.query(SysDictData)
- query_1 = query_1.filter(SysDictData.del_flag != '2')
- query_1 = query_1.filter(SysDictData.dict_type == 'video_tag_industry')
- else:
- return {
- "code": 200,
- "msg": "成功",
- "data": []
- }
- # for i in query_1.all():
- query = query.filter(or_(SysDictData.remark.like(f'%{i.dict_value};%') for i in query_1.all()))
- total_items = query.count()
- # 排序
- query = query.order_by(SysDictData.create_time.desc())
- # 执行分页查询
- dicts = query.offset((page - 1) * pageSize).limit(pageSize).all()
- tag = []
- for info in dicts:
- tag.append({
- "dict_type": info.dict_type,
- "dict_value": info.dict_value,
- "dict_label": info.dict_label,
- "dict_code": info.dict_code})
- return {
- "code": 200,
- "msg": "成功",
- "data": tag,
- "total": total_items,
- "page": page,
- "pageSize": pageSize,
- "totalPages": (total_items + pageSize - 1) // pageSize
- }
- query = db.query(SysDictData)
- query = query.filter(SysDictData.del_flag != '2')
- query = query.filter(SysDictData.dict_type == 'video_type')
- query = query.filter(SysDictData.remark.like( f'%{dict_value};%'))
- total_items = query.count()
- # 排序
- query = query.order_by(SysDictData.create_time.desc())
- # 执行分页查询
- dicts = query.offset((page - 1) * pageSize).limit(pageSize).all()
- tag = []
- for info in dicts:
- tag.append({
- "dict_type":info.dict_type,
- "dict_value":info.dict_value,
- "dict_label":info.dict_label,
- "dict_code":info.dict_code})
- return {
- "code": 200,
- "msg": "成功",
- "data": tag,
- "total": total_items,
- "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)}")
|