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