videoinfo.py 43 KB

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