videoinfo.py 42 KB

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