videoinfo.py 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends,Query,HTTPException,status
  4. from fastapi.responses import StreamingResponse
  5. from database import get_db
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy import case,or_
  8. from sqlalchemy import inspect
  9. from sqlalchemy import text
  10. from utils import *
  11. from utils.ry_system_util import *
  12. from utils.video_util import *
  13. from common.security import valid_access_token
  14. from common.db import db_czrz
  15. from common.auth_user import *
  16. from fastapi.responses import JSONResponse
  17. import traceback
  18. from datetime import datetime
  19. router = APIRouter()
  20. @router.get('/video_from')
  21. async def get_dict_data_by_type(
  22. db: Session = Depends(get_db),
  23. body = Depends(remove_xss_json),
  24. user_id = Depends(valid_access_token)
  25. ):
  26. # 视频来源
  27. try:
  28. # 根据 dict_type 查询字典数据
  29. query = db.query(TPVideoRegion)
  30. # 添加查询条件
  31. # if dictType:
  32. query = query.filter(TPVideoRegion.parentIndexCode=='root00000000')
  33. query = query.filter(TPVideoRegion.status == '0')
  34. query = query.order_by(TPVideoRegion.sort)
  35. dict_data = query.all()
  36. # 转换为字典
  37. dict_data_list = [
  38. {
  39. "dictCode": d.indexCode,
  40. "dictSort": d.sort,
  41. "dictLabel": d.name,
  42. "dictValue": d.indexCode,
  43. "dictType": 'video',
  44. "cssClass": '',
  45. "listClass": 'default',
  46. "isDefault": 'N',
  47. "remark": '',
  48. "createTime": d.createTime.strftime('%Y-%m-%d %H:%M:%S') if d.createTime else ''
  49. }
  50. for d in dict_data
  51. ]
  52. # 构建返回结果
  53. result = {
  54. "rows": dict_data_list,
  55. "code": 200,
  56. "msg": "查询成功"
  57. }
  58. return result
  59. except Exception as e:
  60. # 处理异常
  61. raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
  62. @router.get('/get_video_list_new')
  63. async def get_video_url_by_id(
  64. area_code: str = Query(None, description='区划编码'),
  65. video_from: str = Query(None, description='视频来源'),
  66. video_tag: str = Query(None, description='视频标签'),
  67. video_name: str = Query(None, description='视频名称'),
  68. longitude: float = Query(None, description='经度'),
  69. latitude: float = Query(None, description='纬度'),
  70. db: Session = Depends(get_db),
  71. body=Depends(remove_xss_json),
  72. user_id=Depends(valid_access_token),
  73. page: int = Query(1, gt=0, description='页码'),
  74. pageSize: int = Query(10, gt=0, description='每页条目数量')
  75. ):
  76. # 大屏左下角视频及更多视频
  77. try:
  78. area_code_dict = {"440902":"茂南区","440904":"电白区","440981":"高州市","440982":"化州市","440983":"信宜市","440900":"直辖市"}
  79. query = db.query(TPVideoInfo)
  80. if area_code:
  81. query = query.filter(TPVideoInfo.gbIndexCode.like(f'%{area_code}%'))
  82. if video_from:
  83. query = query.filter(TPVideoInfo.regionPath.like(f'%{video_from}%'))
  84. if video_name:
  85. query = query.filter(TPVideoInfo.name.like(f'%{video_name}%'))
  86. if video_tag:
  87. tag_info = get_dict_data_info(db, 'video_type', video_tag)
  88. if tag_info:
  89. if tag_info.dict_label != '全量视频':
  90. videoli = [info.video_code for info in tag_get_video_tag_list(db, video_tag)]
  91. query = query.filter(TPVideoInfo.gbIndexCode.in_(videoli))
  92. videoIds = user_id_get_user_videoIds(db, user_id)
  93. video_list = [i.video_code_int for i in videoIds]
  94. if video_list:
  95. video_priority_case = case(
  96. [
  97. (TPVideoInfo.gbIndexCode == i, 0)
  98. for i in video_list
  99. ],
  100. else_=1
  101. ).label('user_priority')
  102. query = query.add_columns(video_priority_case).order_by('user_priority')
  103. if longitude is not None and latitude is not None:
  104. point = func.ST_GeomFromText(f'POINT({latitude} {longitude})', 4326)
  105. query = query.add_columns(
  106. func.ST_Distance_Sphere(TPVideoInfo.location, point).label('distance')
  107. ).order_by('distance')
  108. total_items = query.count()
  109. videos = query.offset(pageSize * (page - 1)).limit(pageSize).all()
  110. data = []
  111. for row in videos:
  112. if (longitude is not None and latitude is not None) or video_list:
  113. row = row[0]
  114. # print(type(row),row)
  115. tag_list =get_video_tag_list(db,row.gbIndexCode)
  116. tag = []
  117. tag_lable = []
  118. for info in tag_list:
  119. tag_info = get_dict_data_info(db, 'video_type', info.dict_value)
  120. if tag_info:
  121. if tag_info.dict_label not in tag_lable and tag_info.dict_label!='全量视频':
  122. tag.append({"id": info.id,
  123. "video_code": row.gbIndexCode,
  124. "dict_type": info.dict_type,
  125. "dict_value": info.dict_value,
  126. "dict_label": tag_info.dict_label,
  127. "dict_code": tag_info.dict_code})
  128. tag_lable.append(tag_info.dict_label)
  129. video_area_code=row.gbIndexCode[:6]
  130. video_area = ''
  131. if video_area_code in area_code_dict:
  132. video_area=area_code_dict[video_area_code]
  133. data.append({
  134. "name":row.name,
  135. "isUserVideos":row.gbIndexCode in video_list,
  136. "video_code": row.gbIndexCode,
  137. "isTag" : len(tag_list)>0,
  138. "tag" : tag,
  139. "tagLabels" : "、".join(tag_lable),
  140. "status":row.status,
  141. "statusName":row.statusName,
  142. "regionPath":row.regionPath,
  143. "installPlace":row.installPlace,
  144. "cameraTypeName":row.cameraTypeName,
  145. "cameraType":row.cameraType,
  146. "video_area":video_area
  147. })
  148. return {
  149. "code": 200,
  150. "msg": "操作成功",
  151. "data": data,
  152. "total": total_items,
  153. "page": page,
  154. "pageSize": pageSize,
  155. "totalPages": (total_items + pageSize - 1) // pageSize
  156. }
  157. except Exception as e:
  158. # 处理异常
  159. traceback.print_exc()
  160. raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))
  161. @router.get('/get_video_list_by_user')
  162. async def get_video_url_by_id(
  163. longitude:float = Query(None, description='经度'),
  164. latitude:float = Query(None, description='纬度'),
  165. db: Session = Depends(get_db),
  166. body=Depends(remove_xss_json),
  167. user_id=Depends(valid_access_token),
  168. page: int = Query(1, gt=0, description='页码'),
  169. pageSize: int = Query(10, gt=0, description='每页条目数量')
  170. ):
  171. # 用户视频排序
  172. if longitude is not None and latitude is not None:
  173. location = f"""ST_Distance_Sphere(
  174. ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),
  175. ST_PointFromText('POINT({longitude} {latitude})'))"""
  176. orddis = 'distance'
  177. else:
  178. location = 0
  179. orddis = ''
  180. videoIds = user_id_get_user_videoIds(db, user_id)
  181. video_list = [i.video_code_int for i in videoIds]
  182. if len(video_list)==0:
  183. video = ''
  184. else:
  185. video = ""
  186. for i in video_list:
  187. video += f"WHEN '{i}' THEN 0 \n"
  188. video = f"""CASE video_code_int
  189. {video}
  190. ELSE 1
  191. END """
  192. if orddis != '' and video !='':
  193. video += ','
  194. sql = f"""SELECT T1.indexcode,T2.`name`,T1.longitude,T1.latitude,
  195. {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
  196. FROM tp_video_base T1 RIGHT JOIN tp_video_log T2 on T1.indexcode=T2.video_code_int -- where T1.longitude is not NULL
  197. ORDER BY {video} {orddis} """
  198. totalsql = f'select count(*) from ({sql})t'
  199. print(video_list)
  200. total_items = db.execute(totalsql).first()[0]
  201. lim = f"limit {pageSize*(page-1)}, {pageSize};"
  202. videos = db.execute(sql+lim).all()
  203. video_list1 = []
  204. for video in videos:
  205. videoInfo = {
  206. "name": video.name,
  207. "invideoIds": video.video_code_int in video_list,
  208. "area": video.area,
  209. "ip": video.ip,
  210. "status": video.status,
  211. "status_lifetime": video.status_lifetime,
  212. "record_status": video.record_status,
  213. "inspection_datetime": video.inspection_datetime,
  214. "video_code_int": video.video_code_int,
  215. "video_code": video.video_code,
  216. "longitude":video.longitude,
  217. "latitude":video.latitude
  218. }
  219. video_list1.append(videoInfo)
  220. return {
  221. "code": 200,
  222. "msg": "操作成功",
  223. "rows": video_list1,
  224. "total": total_items,
  225. "page": page,
  226. "pageSize": pageSize,
  227. "totalPages": (total_items + pageSize - 1) // pageSize
  228. }
  229. @router.get('/get_waterlogged_all_video_info')
  230. async def get_waterlogged_all_video_info(
  231. radius:int = Query(None),
  232. longitude:str = Query(None),
  233. latitude:str = Query(None),
  234. db: Session = Depends(get_db),
  235. body=Depends(remove_xss_json),
  236. page: int = Query(1, gt=0, description='页码'),
  237. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  238. user_id=Depends(valid_access_token)):
  239. # 雨窝点视频
  240. try:
  241. if radius is None:
  242. radius=500
  243. # print(1,datetime.now)
  244. # sql = f"""SELECT * from mid_waterlogged_roads """
  245. # waterlogged_data = db.execute(sql).all()
  246. # resutl = []
  247. # print(2,datetime.now)
  248. # tj = []
  249. # for location_1 in waterlogged_data:
  250. if longitude is None or latitude is None:
  251. tj ="1=1"
  252. px = "1"
  253. else:
  254. location = f"POINT({longitude} {latitude})"
  255. tj = f"ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),ST_GeomFromText(CONCAT('{location}'))) <= '{radius}'"
  256. px = f"ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),ST_GeomFromText(CONCAT('{location}'))) "
  257. # tj = ' or '.join(tj)
  258. sql = text(f"""SELECT indexcode,`name`,longitude,latitude,status FROM (
  259. SELECT gbIndexCode as indexcode,`name`,longitude,latitude ,status
  260. FROM tp_video_info where longitude is not null and latitude is not null and ({tj}) and `unitIndexCode`='eab0ed85ff9e4369a0e52680301c3160'
  261. order by {px}
  262. ) T limit {pageSize*(page-1)}, {pageSize}""")
  263. resutl=db.execute(sql).all()
  264. total_items = len(resutl)
  265. return {
  266. "code": 200,
  267. "msg": "成功",
  268. "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]]},
  269. "page": page,
  270. "pageSize": pageSize,
  271. "total":total_items,
  272. "totalPages": (total_items + pageSize - 1) // pageSize
  273. }
  274. except Exception as e:
  275. traceback.print_exc()
  276. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  277. @router.get('/get_video_list')
  278. async def get_video_forest_fire_list(
  279. video_type:str = Query(None),
  280. area:str = Query(None),
  281. name:str = Query(None),
  282. db: Session = Depends(get_db),
  283. page: int = Query(1, gt=0, description='页码'),
  284. pageSize: int = Query(0, gt=0, description='每页条目数量'),
  285. body=Depends(remove_xss_json),
  286. user_id=Depends(valid_access_token)):
  287. try:
  288. 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
  289. WHEN IFNULL(T3.area,T1.area) like '%高州%' THEN
  290. '440981'
  291. WHEN IFNULL(T3.area,T1.area) like '%信宜%' THEN
  292. '440983'
  293. WHEN IFNULL(T3.area,T1.area) like '%化州%' THEN
  294. '440982'
  295. WHEN IFNULL(T3.area,T1.area) like '%茂南%' THEN
  296. '440902'
  297. WHEN IFNULL(T3.area,T1.area) like '%电白%' THEN
  298. '440904'
  299. ELSE
  300. '440900'
  301. END
  302. 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 '''
  303. if video_type:
  304. sql += f''' and T1.video_code_int in (select video_code from Tp_Video_Tag where del_flag ='0' and dict_value='{video_type}')'''
  305. if name:
  306. sql += f''' and T1.name like '%{name}%' '''
  307. # 计算总条目数
  308. totalsql = f'select count(*) as ct from ({sql})t where longitude > 0'
  309. total_items = db.execute(totalsql).first().ct
  310. # 排序
  311. if pageSize!=0:
  312. sql = f'''select * from ({sql} limit {pageSize*(page-1)}, {pageSize})t where longitude > 0 '''
  313. video_list = db.execute(sql).all()
  314. totalPages= (total_items + pageSize - 1) // pageSize
  315. else:
  316. pageSize = total_items
  317. totalPages = 1
  318. video_list = db.execute(f"""select * from ({sql})t where longitude > 0 """).all()
  319. result = []
  320. for video_info in video_list:
  321. longitude = video_info.longitude
  322. latitude = video_info.latitude
  323. area = video_info.area
  324. result.append({"area":area,
  325. "status":video_info.status,
  326. "name":video_info.name,
  327. "video_code":video_info.video_code,
  328. # "video_type_label":video_type_label,
  329. "longitude":longitude,
  330. "latitude":latitude})
  331. return {
  332. "code": 200,
  333. "msg": "成功",
  334. "data": result,
  335. 'total':total_items,
  336. "page": page,
  337. "pageSize": pageSize,
  338. "totalPages": totalPages
  339. }
  340. except Exception as e:
  341. traceback.print_exc()
  342. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  343. @router.get('/get_video_transportation_list')
  344. async def get_video_forest_fire_list(
  345. video_type:str = Query(None),
  346. area:str = Query(None),
  347. name:str = Query(None),
  348. db: Session = Depends(get_db),
  349. page: int = Query(1, gt=0, description='页码'),
  350. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  351. body=Depends(remove_xss_json),
  352. user_id=Depends(valid_access_token)):
  353. try:
  354. video_type_list = ['sjyld','sgdfd','jtdd','dzzhyhd']
  355. # video_code_list = [item[0] for item in db.query(TpVideoTag.id).filter(TpVideoTag.dict_value == '4').all()]
  356. video_list = db.query(TPVideoInfo).filter(TPVideoInfo.regionPath.like('@root00000000@44000000002160847111@%'))
  357. if video_type:
  358. if video_type in video_type_list:
  359. lis = [i.video_code for i in db.query(TpVideoTag.video_code).filter(TpVideoTag.dict_value==video_type , TpVideoTag.del_flag =='0').all()]
  360. video_list = video_list.filter(TPVideoInfo.gbIndexCode.in_(lis))
  361. if area:
  362. if area=='直辖市':
  363. lis = [i.video_code for i in db.query(TpVideoLogTransportationAreaInfo.video_code).all()]
  364. video_list = video_list.filter(TPVideoInfo.gbIndexCode.in_(lis))
  365. else:
  366. lis = [i.video_code for i in db.query(TpVideoLogTransportationAreaInfo.video_code).filter(TpVideoLogTransportationAreaInfo.area == area).all()]
  367. video_list = video_list.filter(TPVideoInfo.gbIndexCode.in_(lis))
  368. if name:
  369. video_list = video_list.filter(TPVideoInfo.name.like(f'%{name}%'))
  370. # 计算总条目数
  371. total_items = video_list.count()
  372. # 排序
  373. video_list = video_list.order_by(TPVideoInfo.gbIndexCode)
  374. # 执行分页查询
  375. # print(video_list.offset((page - 1) * pageSize).limit(pageSize))
  376. video_list = video_list.offset((page - 1) * pageSize).limit(pageSize).all()
  377. result = []
  378. # print(total_items,len(video_list),(page - 1) * pageSize,pageSize)
  379. for video_info in video_list:
  380. video_code = video_info.gbIndexCode
  381. video_type_label='其他'
  382. longitude = 0
  383. latitude = 0
  384. area = '直辖市'
  385. video_type_li = db.query(TpVideoTag).filter(TpVideoTag.video_code == video_code,
  386. TpVideoTag.del_flag == '0',TpVideoTag.dict_value.in_(video_type_list)).first()
  387. if video_type_li:
  388. query = db.query(SysDictData)
  389. query = query.filter(SysDictData.del_flag != '2')
  390. query = query.filter(SysDictData.dict_type == 'video_type_8')
  391. query = query.filter(SysDictData.dict_value == video_type_li.dict_value).first()
  392. if query:
  393. video_type_label = query.dict_label
  394. video_base_info = db.query(TpVideoLogTransportationAreaInfo).filter(TpVideoLogTransportationAreaInfo.video_code==video_code).first()
  395. if video_base_info:
  396. longitude = video_base_info.longitude
  397. latitude = video_base_info.latitude
  398. area = video_base_info.area
  399. 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})
  400. return {
  401. "code": 200,
  402. "msg": "成功",
  403. "data": result,
  404. 'total':total_items,
  405. "page": page,
  406. "pageSize": pageSize,
  407. "totalPages": (total_items + pageSize - 1) // pageSize
  408. }
  409. except Exception as e:
  410. traceback.print_exc()
  411. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  412. @router.get('/get_point_info_transportation_video')
  413. @router.post('/get_point_info_transportation_video')
  414. async def get_video_forest_fire_list(
  415. db: Session = Depends(get_db),
  416. page: int = Query(1, gt=0, description='页码'),
  417. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  418. body=Depends(remove_xss_json),
  419. user_id=Depends(valid_access_token)):
  420. try:
  421. video_type_list = ['sjyld','sgdfd','jtdd','dzzhyhd']
  422. # video_code_list = [item[0] for item in db.query(TpVideoTag.id).filter(TpVideoTag.dict_value == '4').all()]
  423. video_list = db.query(TPVideoInfo).filter(TPVideoInfo.regionPath.like('@root00000000@44000000002160847111@%'))
  424. if 'query' in body:
  425. if 'id' in body['query']:
  426. video_list = video_list.filter(TPVideoInfo.gbIndexCode==body['query']['id'])
  427. # 计算总条目数
  428. total_items = video_list.count()
  429. # 排序
  430. video_list = video_list.order_by(TPVideoInfo.gbIndexCode)
  431. # 执行分页查询
  432. # print(video_list.offset((page - 1) * pageSize).limit(pageSize))
  433. video_list = video_list.offset((page - 1) * pageSize).limit(pageSize).all()
  434. result = []
  435. # print(total_items,len(video_list),(page - 1) * pageSize,pageSize)
  436. for video_info in video_list:
  437. video_code = video_info.gbIndexCode
  438. video_type_label='其他'
  439. longitude = 0
  440. latitude = 0
  441. area = '直辖市'
  442. video_type_li = db.query(TpVideoTag).filter(TpVideoTag.video_code == video_code,
  443. TpVideoTag.del_flag == '0',TpVideoTag.dict_value.in_(video_type_list)).first()
  444. if video_type_li:
  445. query = db.query(SysDictData)
  446. query = query.filter(SysDictData.del_flag != '2')
  447. query = query.filter(SysDictData.dict_type == 'video_type')
  448. query = query.filter(SysDictData.dict_value == video_type_li.dict_value).first()
  449. if query:
  450. video_type_label = query.dict_label
  451. video_base_info = db.query(TpVideoLogTransportationAreaInfo).filter(TpVideoLogTransportationAreaInfo.video_code==video_code).first()
  452. if video_base_info:
  453. longitude = video_base_info.longitude
  454. latitude = video_base_info.latitude
  455. area = video_base_info.area
  456. 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})
  457. return {
  458. "code": 0,
  459. "msg": "success",
  460. "rows": result,
  461. 'total':total_items,
  462. "currentPage": page,
  463. "pageSize": pageSize,
  464. "pages": (total_items + pageSize - 1) // pageSize
  465. }
  466. except Exception as e:
  467. traceback.print_exc()
  468. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  469. @router.get('/transportation/type')
  470. async def get_dict_data_by_type(
  471. db: Session = Depends(get_db),
  472. body = Depends(remove_xss_json),
  473. user_id = Depends(valid_access_token)
  474. ):
  475. try:
  476. # 根据 dict_type 查询字典数据
  477. video_type_list = ['sjyld','sgdfd','jtdd','dzzhyhd']
  478. query = db.query(SysDictData)
  479. query = query.filter(SysDictData.dict_type=='video_type_8')
  480. query = query.filter(SysDictData.dict_value.in_(video_type_list))
  481. query = query.filter(SysDictData.del_flag != '2')
  482. query = query.order_by(SysDictData.dict_sort)
  483. # dict_data = db.query(SysDictData).filter_by(dict_type==dict_type and del_flag != '2').all()
  484. dict_data = query.all()
  485. # 将模型转换为字典
  486. dict_data_list = [
  487. {
  488. "dictCode": d.dict_code,
  489. "dictSort": d.dict_sort,
  490. "dictLabel": d.dict_label,
  491. "dictValue": d.dict_value,
  492. "dictType": d.dict_type,
  493. "cssClass": d.css_class,
  494. "listClass": d.list_class,
  495. "isDefault": d.is_default,
  496. "remark": d.remark,
  497. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else ''
  498. }
  499. for d in dict_data
  500. ]
  501. # 构建返回结果
  502. result = {
  503. "code": 200,
  504. "msg": "操作成功",
  505. "data": dict_data_list
  506. }
  507. return result
  508. except Exception as e:
  509. # 处理异常
  510. traceback.print_exc()
  511. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  512. def id_get_region_info(db, indexCode):
  513. query = db.query(TPVideoRegion)
  514. query = query.filter(TPVideoRegion.indexCode == indexCode)
  515. return query.all()
  516. def parent_id_get_region_info(db, parent_id):
  517. query = db.query(TPVideoRegion)
  518. query = query.filter(TPVideoRegion.parentIndexCode == parent_id)
  519. query = query.order_by(TPVideoRegion.sort.asc())
  520. return query.all()
  521. def parent_id_get_video_info(db, unitIndexCode,status):
  522. query = db.query(TPVideoInfo)
  523. query = query.filter(TPVideoInfo.unitIndexCode == unitIndexCode)
  524. query = query.order_by(TPVideoInfo.gbIndexCode.asc())
  525. if status:
  526. query = query.filter(TPVideoInfo.status == status)
  527. return query.all()
  528. def region_path_get_video_info(db, regionPath,status):
  529. query = db.query(TPVideoInfo)
  530. query = query.filter(TPVideoInfo.regionPath.like(f"%{regionPath}%"))
  531. query = query.order_by(TPVideoInfo.gbIndexCode.asc())
  532. if status:
  533. query = query.filter(TPVideoInfo.status == status)
  534. return query.all()
  535. @router.get('/get_video_forest_fire_index_code')
  536. async def get_dict_data_by_type(
  537. db: Session = Depends(get_db)
  538. ):
  539. try:
  540. # 根据 dict_type 查询字典数据
  541. # dict_data = db.query(SysDictData).filter_by(dict_type=dictType).all()
  542. d = parent_id_get_region_info(db, '4409000000216202502')
  543. dict_data_list = [{
  544. "dictCode": data.indexCode,
  545. "dictSort": data.sort,
  546. "dictLabel": data.name,
  547. "dictValue": data.indexCode,
  548. "dictType": '',
  549. "cssClass": '',
  550. "listClass": ''
  551. }for data in d]
  552. # 构建返回结果
  553. result = {
  554. "data": dict_data_list,
  555. "code": 200,
  556. "msg": "查询成功"
  557. }
  558. return result
  559. except Exception as e:
  560. traceback.print_exc()
  561. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  562. @router.get('/get_video_forest_fire_export')
  563. async def get_video_forest_fire_list(
  564. request: Request,
  565. indexCode:str = Query('4409000000216202502'),
  566. status:str = Query(None),
  567. db: Session = Depends(get_db),
  568. user_id: AuthUser = Depends(find_auth_user),
  569. body=Depends(remove_xss_json)):
  570. try:
  571. data = region_path_get_video_info(db, indexCode, status)
  572. data = [{
  573. "摄像头索引码": info.cameraIndexCode,
  574. "国标索引码": info.gbIndexCode,
  575. "摄像头名称": info.name,
  576. "经度": info.longitude,
  577. "纬度": info.latitude,
  578. "海拔": info.altitude,
  579. "像素": info.pixel,
  580. "摄像头类型代码": info.cameraType,
  581. "摄像头类型名称": info.cameraTypeName,
  582. "安装位置": info.installPlace,
  583. "所属组织编号": info.unitIndexCode,
  584. "机构路径": info.regionPath,
  585. "更新时间": info.updateTime,
  586. "创建时间": info.createTime,
  587. "状态码": info.status,
  588. "状态名称": info.statusName
  589. } for info in data]
  590. import pandas as pd
  591. from io import BytesIO
  592. # 将查询结果转换为 DataFrame
  593. df = pd.DataFrame(data)
  594. # 将 DataFrame 导出为 Excel 文件
  595. output = BytesIO()
  596. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  597. df.to_excel(writer, index=False)
  598. # 设置响应头
  599. output.seek(0)
  600. from urllib.parse import quote
  601. encoded_filename = f'森防视频{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
  602. encoded_filename = quote(encoded_filename, encoding='utf-8')
  603. headers = {
  604. 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
  605. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  606. }
  607. db_czrz.log(db, user_id, "全域地图", f"全域地图导出森防视频数据成功", request.client.host)
  608. # 返回文件流
  609. return StreamingResponse(output, headers=headers)
  610. except Exception as e:
  611. traceback.print_exc()
  612. return JSONResponse(status_code=500, content={"code": 500, "msg": f"Internal server error: {str(e)}"})
  613. @router.get('/get_video_forest_fire_list')
  614. async def get_video_forest_fire_list(
  615. indexCode:str = Query('4409000000216202502'),
  616. status:str = Query(None),
  617. db: Session = Depends(get_db),
  618. body=Depends(remove_xss_json),
  619. user_id=Depends(valid_access_token)):
  620. try:
  621. """
  622. 根据层级路径构建带有 label 和 children 的树形结构。
  623. :param paths: 包含层级路径的列表
  624. :return: 树形结构的字典
  625. """
  626. "20ba3e565de64df9b29ff70a8056939a"
  627. def build_video_tree(regions, parent_region,online,total,status):
  628. video_tree = []
  629. for region_info in regions:
  630. region = {
  631. "label": region_info.name,
  632. "isLeaf": False,
  633. "status": region_info.status,
  634. "children":[]
  635. }
  636. # print(dept_info.dept_id)
  637. videos = parent_id_get_video_info(db, region_info.indexCode,status)
  638. if len(videos) > 0:
  639. for video_info in videos:
  640. region["children"].append({"label":video_info.name,"status":video_info.status,"video_code":video_info.gbIndexCode,"isLeaf":True})
  641. if video_info.status==1:
  642. online+=1
  643. total += 1
  644. children = parent_id_get_region_info(db, region_info.indexCode)
  645. if len(children) > 0:
  646. children_regions, online, total = build_video_tree(children, region, online, total,status)
  647. region["children"] = children_regions+region["children"]
  648. video_tree.append(region)
  649. return video_tree,online,total
  650. result,online,total = build_video_tree(id_get_region_info(db, indexCode), None,0,0,status)
  651. return {
  652. "code": 200,
  653. "msg": "成功",
  654. "data": result,
  655. 'online':online,
  656. 'total':total
  657. }
  658. #
  659. # video_code_list = [item[0] for item in db.query(TpVideoTag.video_code).filter(TpVideoTag.dict_value == 'slfh').all()]
  660. # # print(video_code_list)
  661. # video_list = db.query(TpVideoLog).filter(TpVideoLog.video_code.in_(video_code_list)).all()
  662. # root = {"label": "Root", "children": [],"online":0,"total":0} # 创建根节点
  663. #
  664. # for video_info in video_list:
  665. # levels = video_info.area.split('/')
  666. # current_node = root
  667. # current_node['total']+=1
  668. # if video_info.status == '在线':
  669. # current_node['online']+=1
  670. # for level in levels:
  671. # # 查找当前层级是否已存在
  672. # existing_node = next((node for node in current_node["children"] if node["label"] == level), None)
  673. # if not existing_node:
  674. # # 如果不存在,创建新节点
  675. # new_node = {"label": level, "children": [],"online":0,"total":0}
  676. # current_node["children"].append(new_node)
  677. # existing_node = new_node
  678. #
  679. # # 移动到子节点
  680. # current_node = existing_node
  681. # current_node['total']+=1
  682. # if video_info.status == '在线':
  683. # current_node['online']+=1
  684. #
  685. # current_node['children'].append({"label":video_info.name,"status":video_info.status,"video_code":video_info.video_code,"isLeaf":True})
  686. #
  687. # return {
  688. # "code": 200,
  689. # "msg": "成功",
  690. # "data": root['children'],
  691. # 'online':root['online'],
  692. # 'total':root['total']
  693. # }
  694. except Exception as e:
  695. traceback.print_exc()
  696. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  697. @router.get('/get_video_tag_info')
  698. async def get_video_tag_info(
  699. video_code:str = Query(None),
  700. db: Session = Depends(get_db),
  701. body=Depends(remove_xss_json),
  702. user_id=Depends(valid_access_token)
  703. ):
  704. try:
  705. tag = []
  706. tag_lable = []
  707. for info in get_video_tag_list(db,video_code):
  708. tag_info = get_dict_data_info(db,'video_type',info.dict_value)
  709. if tag_info:
  710. if tag_info.dict_label not in tag_lable:
  711. tag.append({"id":info.id,
  712. "video_code":video_code,
  713. "dict_type":info.dict_type,
  714. "dict_value":info.dict_value,
  715. "dict_label":tag_info.dict_label,
  716. "dict_code":tag_info.dict_code})
  717. tag_lable.append(tag_info.dict_label)
  718. return {
  719. "code": 200,
  720. "msg": "成功",
  721. "data": tag
  722. }
  723. except Exception as e:
  724. traceback.print_exc()
  725. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  726. @router.post("/add_video_tag")
  727. async def add_video_tag(
  728. user_id=Depends(valid_access_token),
  729. body = Depends(remove_xss_json),
  730. db: Session = Depends(get_db)
  731. ):
  732. try:
  733. tag_info = get_dict_data_info(db, body['dict_type'], body['dict_value'])
  734. if tag_info is None:
  735. return JSONResponse(status_code=404,content={"code":404,"msg":"标签不存在"})
  736. new_video_tag = TpVideoTag(
  737. id = new_guid(),
  738. video_code=body['video_code'],
  739. dict_value=body['dict_value'],
  740. dict_type=body['dict_type'],
  741. create_dept = user_id
  742. )
  743. db.add(new_video_tag)
  744. db.commit()
  745. return {"code": 200, "msg": "新增成功", "data": None}
  746. except Exception as e:
  747. traceback.print_exc()
  748. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  749. @router.post("/add_video_tag_label")
  750. async def add_video_tag(
  751. user_id=Depends(valid_access_token),
  752. body = Depends(remove_xss_json),
  753. db: Session = Depends(get_db)
  754. ):
  755. try:
  756. dict_label = body['dict_label']
  757. dict_info = dict_label_get_dict_data_info(db,body['dict_type'],dict_label)
  758. if dict_info is None:
  759. dict_info = SysDictData(
  760. dict_label=dict_label,
  761. dict_value = new_guid(),
  762. dict_type=body['dict_type'],
  763. list_class = 'default',
  764. create_by = user_id
  765. )
  766. db.add(dict_info)
  767. new_video_tag = TpVideoTag(
  768. id = new_guid(),
  769. video_code=body['video_code'],
  770. dict_value=dict_info.dict_value,
  771. dict_type=body['dict_type'],
  772. create_dept = user_id
  773. )
  774. db.add(new_video_tag)
  775. db.commit()
  776. return {"code": 200, "msg": "新增成功", "data": None}
  777. except Exception as e:
  778. traceback.print_exc()
  779. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  780. @router.delete("/delete_video_tag/{video_tag_id}")
  781. async def delete_video_tag(
  782. video_tag_id: str,
  783. db: Session = Depends(get_db)
  784. ):
  785. try:
  786. # 检查图案是否存在
  787. query = db.query(TpVideoTag)
  788. query = query.filter(TpVideoTag.id == video_tag_id)
  789. query = query.filter(TpVideoTag.del_flag != '2')
  790. video_tag = query.first()
  791. if not video_tag:
  792. return JSONResponse(status_code=404,content={"code":404,"msg":"标签不存在"})
  793. # 执行删除操作
  794. video_tag.del_flag='2'
  795. db.commit()
  796. return {"code": 200, "msg": "删除成功"}
  797. except Exception as e:
  798. traceback.print_exc()
  799. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  800. @router.get('/get_recently_video_tag_info')
  801. async def get_video_tag_info(
  802. # video_code:str = Query(None),
  803. db: Session = Depends(get_db),
  804. body=Depends(remove_xss_json),
  805. page: int = Query(1, gt=0, description='页码'),
  806. pageSize: int = Query(3, gt=0, description='每页条目数量'),
  807. user_id=Depends(valid_access_token)
  808. ):
  809. try:
  810. query = db.query(SysDictData)
  811. query = query.filter(SysDictData.del_flag != '2')
  812. query = query.filter(SysDictData.dict_type == 'video_type')
  813. total_items = query.count()
  814. # 排序
  815. query = query.order_by(SysDictData.create_time.desc())
  816. # 执行分页查询
  817. dicts = query.offset((page - 1) * pageSize).limit(pageSize).all()
  818. tag = []
  819. for info in dicts:
  820. tag.append({
  821. "dict_type":info.dict_type,
  822. "dict_value":info.dict_value,
  823. "dict_label":info.dict_label,
  824. "dict_code":info.dict_code})
  825. return {
  826. "code": 200,
  827. "msg": "成功",
  828. "data": tag,
  829. "total": total_items,
  830. "page": page,
  831. "pageSize": pageSize,
  832. "totalPages": (total_items + pageSize - 1) // pageSize
  833. }
  834. except Exception as e:
  835. traceback.print_exc()
  836. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  837. @router.get('/get_lx_hy_video_tag_info')
  838. async def get_lx_hy_video_tag_info(
  839. dict_value:str = Query(None),
  840. type:str= Query(None),
  841. db: Session = Depends(get_db),
  842. body=Depends(remove_xss_json),
  843. page: int = Query(1, gt=0, description='页码'),
  844. pageSize: int = Query(3, gt=0, description='每页条目数量'),
  845. user_id=Depends(valid_access_token)
  846. ):
  847. try:
  848. if dict_value is None or dict_value =='':
  849. query = db.query(SysDictData)
  850. query = query.filter(SysDictData.del_flag != '2')
  851. query = query.filter(SysDictData.dict_type == 'video_type')
  852. if type=='lx':
  853. query_1 = db.query(SysDictData)
  854. query_1 = query_1.filter(SysDictData.del_flag != '2')
  855. query_1 = query_1.filter(SysDictData.dict_type == 'video_tag_type')
  856. elif type == 'hy':
  857. query_1 = db.query(SysDictData)
  858. query_1 = query_1.filter(SysDictData.del_flag != '2')
  859. query_1 = query_1.filter(SysDictData.dict_type == 'video_tag_industry')
  860. else:
  861. return {
  862. "code": 200,
  863. "msg": "成功",
  864. "data": []
  865. }
  866. # for i in query_1.all():
  867. query = query.filter(or_(SysDictData.remark.like(f'%{i.dict_value};%') for i in query_1.all()))
  868. total_items = query.count()
  869. # 排序
  870. query = query.order_by(SysDictData.create_time.desc())
  871. # 执行分页查询
  872. dicts = query.offset((page - 1) * pageSize).limit(pageSize).all()
  873. tag = []
  874. for info in dicts:
  875. tag.append({
  876. "dict_type": info.dict_type,
  877. "dict_value": info.dict_value,
  878. "dict_label": info.dict_label,
  879. "dict_code": info.dict_code})
  880. return {
  881. "code": 200,
  882. "msg": "成功",
  883. "data": tag,
  884. "total": total_items,
  885. "page": page,
  886. "pageSize": pageSize,
  887. "totalPages": (total_items + pageSize - 1) // pageSize
  888. }
  889. query = db.query(SysDictData)
  890. query = query.filter(SysDictData.del_flag != '2')
  891. query = query.filter(SysDictData.dict_type == 'video_type')
  892. query = query.filter(SysDictData.remark.like( f'%{dict_value};%'))
  893. total_items = query.count()
  894. # 排序
  895. query = query.order_by(SysDictData.create_time.desc())
  896. # 执行分页查询
  897. dicts = query.offset((page - 1) * pageSize).limit(pageSize).all()
  898. tag = []
  899. for info in dicts:
  900. tag.append({
  901. "dict_type":info.dict_type,
  902. "dict_value":info.dict_value,
  903. "dict_label":info.dict_label,
  904. "dict_code":info.dict_code})
  905. return {
  906. "code": 200,
  907. "msg": "成功",
  908. "data": tag,
  909. "total": total_items,
  910. "page": page,
  911. "pageSize": pageSize,
  912. "totalPages": (total_items + pageSize - 1) // pageSize
  913. }
  914. except Exception as e:
  915. traceback.print_exc()
  916. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")