videoinfo.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends,Query,HTTPException
  4. from database import get_db
  5. from sqlalchemy.orm import Session
  6. from sqlalchemy import case,or_
  7. from sqlalchemy import text
  8. from utils import *
  9. from utils.ry_system_util import *
  10. from utils.video_util import *
  11. from common.security import valid_access_token
  12. from fastapi.responses import JSONResponse
  13. import traceback
  14. from datetime import datetime
  15. router = APIRouter()
  16. @router.get('/get_video_list_by_user')
  17. async def get_video_url_by_id(
  18. longitude:float = Query(None, description='经度'),
  19. latitude:float = Query(None, description='纬度'),
  20. db: Session = Depends(get_db),
  21. body=Depends(remove_xss_json),
  22. user_id=Depends(valid_access_token),
  23. page: int = Query(1, gt=0, description='页码'),
  24. pageSize: int = Query(10, gt=0, description='每页条目数量')
  25. ):
  26. if longitude is not None and latitude is not None:
  27. location = f"""ST_Distance_Sphere(
  28. ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),
  29. ST_PointFromText('POINT({longitude} {latitude})'))"""
  30. orddis = 'distance'
  31. else:
  32. location = 0
  33. orddis = ''
  34. videoIds = user_id_get_user_videoIds(db, user_id)
  35. video_list = [i.video_code_int for i in videoIds]
  36. if len(video_list)==0:
  37. video = ''
  38. else:
  39. video = ""
  40. for i in video_list:
  41. video += f"WHEN '{i}' THEN 0 \n"
  42. video = f"""CASE video_code_int
  43. {video}
  44. ELSE 1
  45. END """
  46. if orddis != '' and video !='':
  47. video += ','
  48. sql = f"""SELECT T1.indexcode,T2.`name`,T1.longitude,T1.latitude,
  49. {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
  50. FROM tp_video_base T1 RIGHT JOIN tp_video_log T2 on T1.indexcode=T2.video_code_int -- where T1.longitude is not NULL
  51. ORDER BY {video} {orddis} """
  52. totalsql = f'select count(*) from ({sql})t'
  53. print(video_list)
  54. total_items = db.execute(totalsql).first()[0]
  55. lim = f"limit {pageSize*(page-1)}, {pageSize};"
  56. videos = db.execute(sql+lim).all()
  57. # query = db.query(TpVideoLog)
  58. # total_items = query.count()
  59. #
  60. # query = query.order_by(
  61. # case(
  62. # [(TpVideoLog.video_code_int == video_code_int, 0) for video_code_int in video_list],
  63. # else_=1
  64. # )
  65. # )
  66. # videos = query.offset((page - 1) * pageSize).limit(pageSize).all()
  67. video_list1 = []
  68. for video in videos:
  69. videoInfo = {
  70. "name": video.name,
  71. "invideoIds": video.video_code_int in video_list,
  72. "area": video.area,
  73. "ip": video.ip,
  74. "status": video.status,
  75. "status_lifetime": video.status_lifetime,
  76. "record_status": video.record_status,
  77. "inspection_datetime": video.inspection_datetime,
  78. "video_code_int": video.video_code_int,
  79. "video_code": video.video_code,
  80. "longitude":video.longitude,
  81. "latitude":video.latitude
  82. }
  83. video_list1.append(videoInfo)
  84. return {
  85. "code": 200,
  86. "msg": "操作成功",
  87. "rows": video_list1,
  88. "total": total_items,
  89. "page": page,
  90. "pageSize": pageSize,
  91. "totalPages": (total_items + pageSize - 1) // pageSize
  92. }
  93. @router.get('/get_waterlogged_all_video_info')
  94. async def get_waterlogged_all_video_info(
  95. radius:int = Query(None),
  96. db: Session = Depends(get_db),
  97. body=Depends(remove_xss_json),
  98. page: int = Query(1, gt=0, description='页码'),
  99. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  100. user_id=Depends(valid_access_token)):
  101. try:
  102. if radius is None:
  103. radius=500
  104. print(1,datetime.now)
  105. sql = f"""SELECT * from mid_waterlogged_roads """
  106. waterlogged_data = db.execute(sql).all()
  107. resutl = []
  108. print(2,datetime.now)
  109. tj = []
  110. for location_1 in waterlogged_data:
  111. location = f"POINT({location_1.lng} {location_1.lat})"
  112. tj.append(f"ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),ST_GeomFromText(CONCAT('{location}'))) <= '{radius}'")
  113. tj = ' or '.join(tj)
  114. sql = text(f"""SELECT indexcode,`name`,longitude,latitude FROM (
  115. SELECT indexcode,`name`,longitude,latitude
  116. FROM tp_video_base where longitude is not null and latitude is not null and ({tj}) and `status`='ON'
  117. ) T limit {pageSize*(page-1)}, {pageSize}""")
  118. # ,
  119. # ST_Distance_Sphere(
  120. # ST_GeomFromText(CONCAT('POINT(', longitude, ' ', latitude, ')')),
  121. # ST_PointFromText('{location}')
  122. # )
  123. # AS
  124. # distance ,"distance":info.distance ORDER BY distance ASC
  125. resutl=db.execute(sql).all()
  126. print(3, datetime.now)
  127. total_items = len(resutl)
  128. print(4,datetime.now)
  129. return {
  130. "code": 200,
  131. "msg": "成功",
  132. "data": {"list":[{"indexcode":info.indexcode,"name":info.name,"longitude":info.longitude,"latitude":info.latitude} for info in resutl[(page - 1) * pageSize:(page - 1) * pageSize+pageSize]]},
  133. "page": page,
  134. "pageSize": pageSize,
  135. "totalPages": (total_items + pageSize - 1) // pageSize
  136. }
  137. except Exception as e:
  138. traceback.print_exc()
  139. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  140. @router.get('/get_video_list')
  141. async def get_video_forest_fire_list(
  142. video_type:str = Query(None),
  143. area:str = Query(None),
  144. name:str = Query(None),
  145. db: Session = Depends(get_db),
  146. page: int = Query(1, gt=0, description='页码'),
  147. pageSize: int = Query(0, gt=0, description='每页条目数量'),
  148. body=Depends(remove_xss_json),
  149. user_id=Depends(valid_access_token)):
  150. try:
  151. # video_type_list = ['sjyld','sgdfd','jtdd','dzzhyhd']
  152. # video_code_list = [item[0] for item in db.query(TpVideoTag.id).filter(TpVideoTag.dict_value == '4').all()]
  153. # sql = '''SELECT * 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 where 1=1 '''
  154. sql = '''SELECT T1.`name`,T1.`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
  155. WHEN IFNULL(T3.area,T1.area) like '%高州%' THEN
  156. '高州市'
  157. WHEN IFNULL(T3.area,T1.area) like '%信宜%' THEN
  158. '信宜市'
  159. WHEN IFNULL(T3.area,T1.area) like '%化州%' THEN
  160. '化州市'
  161. WHEN IFNULL(T3.area,T1.area) like '%茂南%' THEN
  162. '茂南区'
  163. WHEN IFNULL(T3.area,T1.area) like '%电白%' THEN
  164. '电白区'
  165. ELSE
  166. '直辖市'
  167. END
  168. 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 '''
  169. # video_list = db.query(TpVideoLog,TpVideoBase.longitude,TpVideoBase.latitude).join(
  170. # TpVideoBase,
  171. # TpVideoBase.indexcode == TpVideoLog.video_code,isouter=True
  172. # ).filter(TpVideoBase.longitude >0)
  173. if video_type:
  174. # if video_type in video_type_list:
  175. sql += f''' and T1.video_code_int in (select video_code from Tp_Video_Tag where del_flag ='0' and dict_value='{video_type}')'''
  176. # lis = [i.video_code for i in db.query(TpVideoTag.video_code).filter(TpVideoTag.dict_value==video_type , TpVideoTag.del_flag =='0').all()]
  177. # video_list = video_list.filter(TpVideoLog.video_code.in_(lis))
  178. # if area:
  179. # if area=='直辖市':
  180. # lis = [i.video_code for i in db.query(TpVideoLogTransportationAreaInfo.video_code).all()]
  181. # video_list = video_list.filter(TpVideoLog.video_code.in_(lis))
  182. # else:
  183. # lis = [i.video_code for i in db.query(TpVideoLogTransportationAreaInfo.video_code).filter(TpVideoLogTransportationAreaInfo.area == area).all()]
  184. # video_list = video_list.filter(TpVideoLog.video_code.in_(lis))
  185. if name:
  186. sql += f''' and T1.name like '%{name}%' '''
  187. # video_list = video_list.filter(TpVideoLog.name.like(f'%{name}%'))
  188. # 计算总条目数
  189. # print(sql)
  190. totalsql = f'select count(*) as ct from ({sql})t where longitude > 0'
  191. # print(totalsql)
  192. # total_items = video_list.count()
  193. total_items = db.execute(totalsql).first().ct
  194. # 排序
  195. # video_list = video_list.order_by(TpVideoLog.video_code)
  196. # 执行分页查询
  197. # print(video_list.offset((page - 1) * pageSize).limit(pageSize))
  198. if pageSize!=0:
  199. # video_list = video_list.offset((page - 1) * pageSize).limit(pageSize).all()
  200. sql = f'''select * from ({sql} limit {pageSize*(page-1)}, {pageSize})t where longitude > 0 '''
  201. video_list = db.execute(sql).all()
  202. totalPages= (total_items + pageSize - 1) // pageSize
  203. else:
  204. pageSize = total_items
  205. totalPages = 1
  206. video_list = db.execute(f"""select * from ({sql})t where longitude > 0 """).all()
  207. result = []
  208. # print(total_items,len(video_list),(page - 1) * pageSize,pageSize)
  209. for video_info in video_list:
  210. # video_code = video_info.video_code
  211. # # video_type_label='其他'
  212. # longitude = None
  213. # latitude = None
  214. # area = '直辖市'
  215. # video_type_li = db.query(TpVideoTag).filter(TpVideoTag.video_code == video_code,
  216. # TpVideoTag.del_flag == '0').first()
  217. # if video_type_li:
  218. # query = db.query(SysDictData)
  219. # query = query.filter(SysDictData.del_flag != '2')
  220. # query = query.filter(SysDictData.dict_type == 'video_type')
  221. # query = query.filter(SysDictData.dict_value == video_type_li.dict_value).first()
  222. # if query:
  223. # video_type_label = query.dict_label
  224. # if '茂名市交通运输局' in video_info.area:
  225. # video_base_info = db.query(TpVideoLogTransportationAreaInfo).filter(TpVideoLogTransportationAreaInfo.video_code==video_code).first()
  226. # if video_base_info:
  227. # longitude = video_base_info.longitude
  228. # latitude = video_base_info.latitude
  229. # area = video_base_info.area
  230. # else:
  231. # video_base_info = db.query(TpVideoBase.longitude,TpVideoBase.latitude).filter(
  232. # TpVideoBase.indexcode == video_code).first()
  233. # if video_base_info:
  234. # # longitude = video_base_info.longitude
  235. # # latitude = video_base_info.latitude
  236. # longitude,latitude = video_base_info
  237. longitude = video_info.longitude
  238. latitude = video_info.latitude
  239. area = video_info.area
  240. # if '茂南' in area:
  241. # area = '茂南区'
  242. # elif '电白' in area:
  243. # area = '电白区'
  244. # elif '高州' in area:
  245. # area = '高州区'
  246. # elif '信宜' in area:
  247. # area = '信宜区'
  248. # elif '化州' in area:
  249. # area = '化州区'
  250. # else:
  251. # area = '直辖市'
  252. # if longitude:
  253. result.append({"area":area,
  254. "status":video_info.status,
  255. "name":video_info.name,
  256. "video_code":video_info.video_code,
  257. # "video_type_label":video_type_label,
  258. "longitude":longitude,
  259. "latitude":latitude})
  260. return {
  261. "code": 200,
  262. "msg": "成功",
  263. "data": result,
  264. 'total':total_items,
  265. "page": page,
  266. "pageSize": pageSize,
  267. "totalPages": totalPages
  268. }
  269. except Exception as e:
  270. traceback.print_exc()
  271. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  272. @router.get('/get_video_transportation_list')
  273. async def get_video_forest_fire_list(
  274. video_type:str = Query(None),
  275. area:str = Query(None),
  276. name:str = Query(None),
  277. db: Session = Depends(get_db),
  278. page: int = Query(1, gt=0, description='页码'),
  279. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  280. body=Depends(remove_xss_json),
  281. user_id=Depends(valid_access_token)):
  282. try:
  283. video_type_list = ['sjyld','sgdfd','jtdd','dzzhyhd']
  284. # video_code_list = [item[0] for item in db.query(TpVideoTag.id).filter(TpVideoTag.dict_value == '4').all()]
  285. video_list = db.query(TpVideoLog).filter(TpVideoLog.area=='茂名市视频数据共享管理平台/茂名市交通运输局')
  286. if video_type:
  287. if video_type in video_type_list:
  288. lis = [i.video_code for i in db.query(TpVideoTag.video_code).filter(TpVideoTag.dict_value==video_type , TpVideoTag.del_flag =='0').all()]
  289. video_list = video_list.filter(TpVideoLog.video_code.in_(lis))
  290. if area:
  291. if area=='直辖市':
  292. lis = [i.video_code for i in db.query(TpVideoLogTransportationAreaInfo.video_code).all()]
  293. video_list = video_list.filter(TpVideoLog.video_code.in_(lis))
  294. else:
  295. lis = [i.video_code for i in db.query(TpVideoLogTransportationAreaInfo.video_code).filter(TpVideoLogTransportationAreaInfo.area == area).all()]
  296. video_list = video_list.filter(TpVideoLog.video_code.in_(lis))
  297. if name:
  298. video_list = video_list.filter(TpVideoLog.name.like(f'%{name}%'))
  299. # 计算总条目数
  300. total_items = video_list.count()
  301. # 排序
  302. video_list = video_list.order_by(TpVideoLog.video_code)
  303. # 执行分页查询
  304. # print(video_list.offset((page - 1) * pageSize).limit(pageSize))
  305. video_list = video_list.offset((page - 1) * pageSize).limit(pageSize).all()
  306. result = []
  307. # print(total_items,len(video_list),(page - 1) * pageSize,pageSize)
  308. for video_info in video_list:
  309. video_code = video_info.video_code
  310. video_type_label='其他'
  311. longitude = 0
  312. latitude = 0
  313. area = '直辖市'
  314. video_type_li = db.query(TpVideoTag).filter(TpVideoTag.video_code == video_code,
  315. TpVideoTag.del_flag == '0',TpVideoTag.dict_value.in_(video_type_list)).first()
  316. if video_type_li:
  317. query = db.query(SysDictData)
  318. query = query.filter(SysDictData.del_flag != '2')
  319. query = query.filter(SysDictData.dict_type == 'video_type')
  320. query = query.filter(SysDictData.dict_value == video_type_li.dict_value).first()
  321. if query:
  322. video_type_label = query.dict_label
  323. video_base_info = db.query(TpVideoLogTransportationAreaInfo).filter(TpVideoLogTransportationAreaInfo.video_code==video_code).first()
  324. if video_base_info:
  325. longitude = video_base_info.longitude
  326. latitude = video_base_info.latitude
  327. area = video_base_info.area
  328. result.append({"area":area,"status":video_info.status,"name":video_info.name,"video_code":video_info.video_code_int,"video_type_label":video_type_label,"longitude":longitude,"latitude":latitude})
  329. return {
  330. "code": 200,
  331. "msg": "成功",
  332. "data": result,
  333. 'total':total_items,
  334. "page": page,
  335. "pageSize": pageSize,
  336. "totalPages": (total_items + pageSize - 1) // pageSize
  337. }
  338. except Exception as e:
  339. traceback.print_exc()
  340. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  341. @router.get('/get_point_info_transportation_video')
  342. @router.post('/get_point_info_transportation_video')
  343. async def get_video_forest_fire_list(
  344. db: Session = Depends(get_db),
  345. page: int = Query(1, gt=0, description='页码'),
  346. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  347. body=Depends(remove_xss_json),
  348. user_id=Depends(valid_access_token)):
  349. try:
  350. video_type_list = ['sjyld','sgdfd','jtdd','dzzhyhd']
  351. # video_code_list = [item[0] for item in db.query(TpVideoTag.id).filter(TpVideoTag.dict_value == '4').all()]
  352. video_list = db.query(TpVideoLog).filter(TpVideoLog.area=='茂名市视频数据共享管理平台/茂名市交通运输局')
  353. if 'query' in body:
  354. if 'id' in body['query']:
  355. video_list = video_list.filter(TpVideoLog.video_code==body['query']['id'])
  356. # 计算总条目数
  357. total_items = video_list.count()
  358. # 排序
  359. video_list = video_list.order_by(TpVideoLog.video_code)
  360. # 执行分页查询
  361. # print(video_list.offset((page - 1) * pageSize).limit(pageSize))
  362. video_list = video_list.offset((page - 1) * pageSize).limit(pageSize).all()
  363. result = []
  364. # print(total_items,len(video_list),(page - 1) * pageSize,pageSize)
  365. for video_info in video_list:
  366. video_code = video_info.video_code
  367. video_type_label='其他'
  368. longitude = 0
  369. latitude = 0
  370. area = '直辖市'
  371. video_type_li = db.query(TpVideoTag).filter(TpVideoTag.video_code == video_code,
  372. TpVideoTag.del_flag == '0',TpVideoTag.dict_value.in_(video_type_list)).first()
  373. if video_type_li:
  374. query = db.query(SysDictData)
  375. query = query.filter(SysDictData.del_flag != '2')
  376. query = query.filter(SysDictData.dict_type == 'video_type')
  377. query = query.filter(SysDictData.dict_value == video_type_li.dict_value).first()
  378. if query:
  379. video_type_label = query.dict_label
  380. video_base_info = db.query(TpVideoLogTransportationAreaInfo).filter(TpVideoLogTransportationAreaInfo.video_code==video_code).first()
  381. if video_base_info:
  382. longitude = video_base_info.longitude
  383. latitude = video_base_info.latitude
  384. area = video_base_info.area
  385. result.append({"area":area,"status":video_info.status,"name":video_info.name,"video_code":video_info.video_code_int,"video_type_label":video_type_label,"longitude":longitude,"latitude":latitude})
  386. return {
  387. "code": 0,
  388. "msg": "success",
  389. "rows": result,
  390. 'total':total_items,
  391. "currentPage": page,
  392. "pageSize": pageSize,
  393. "pages": (total_items + pageSize - 1) // pageSize
  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('/transportation/type')
  399. async def get_dict_data_by_type(
  400. db: Session = Depends(get_db),
  401. body = Depends(remove_xss_json),
  402. user_id = Depends(valid_access_token)
  403. ):
  404. try:
  405. # 根据 dict_type 查询字典数据
  406. video_type_list = ['sjyld','sgdfd','jtdd','dzzhyhd']
  407. query = db.query(SysDictData)
  408. query = query.filter(SysDictData.dict_type=='video_type')
  409. query = query.filter(SysDictData.dict_value.in_(video_type_list))
  410. query = query.filter(SysDictData.del_flag != '2')
  411. query = query.order_by(SysDictData.dict_sort)
  412. # dict_data = db.query(SysDictData).filter_by(dict_type==dict_type and del_flag != '2').all()
  413. dict_data = query.all()
  414. # 将模型转换为字典
  415. dict_data_list = [
  416. {
  417. "dictCode": d.dict_code,
  418. "dictSort": d.dict_sort,
  419. "dictLabel": d.dict_label,
  420. "dictValue": d.dict_value,
  421. "dictType": d.dict_type,
  422. "cssClass": d.css_class,
  423. "listClass": d.list_class,
  424. "isDefault": d.is_default,
  425. "remark": d.remark,
  426. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else ''
  427. }
  428. for d in dict_data
  429. ]
  430. # 构建返回结果
  431. result = {
  432. "code": 200,
  433. "msg": "操作成功",
  434. "data": dict_data_list
  435. }
  436. return result
  437. except Exception as e:
  438. # 处理异常
  439. traceback.print_exc()
  440. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  441. @router.get('/get_video_forest_fire_list')
  442. async def get_video_forest_fire_list(
  443. radius:int = Query(None),
  444. db: Session = Depends(get_db),
  445. body=Depends(remove_xss_json),
  446. user_id=Depends(valid_access_token)):
  447. try:
  448. """
  449. 根据层级路径构建带有 label 和 children 的树形结构。
  450. :param paths: 包含层级路径的列表
  451. :return: 树形结构的字典
  452. """
  453. video_code_list = [item[0] for item in db.query(TpVideoTag.id).filter(TpVideoTag.dict_value == '4').all()]
  454. video_list = db.query(TpVideoLog).filter(TpVideoLog.video_code.in_(video_code_list)).all()
  455. root = {"label": "Root", "children": [],"online":0,"total":0} # 创建根节点
  456. for video_info in video_list:
  457. levels = video_info.area.split('/')
  458. current_node = root
  459. current_node['total']+=1
  460. if video_info.status == '在线':
  461. current_node['online']+=1
  462. for level in levels:
  463. # 查找当前层级是否已存在
  464. existing_node = next((node for node in current_node["children"] if node["label"] == level), None)
  465. if not existing_node:
  466. # 如果不存在,创建新节点
  467. new_node = {"label": level, "children": [],"online":0,"total":0}
  468. current_node["children"].append(new_node)
  469. existing_node = new_node
  470. # 移动到子节点
  471. current_node = existing_node
  472. current_node['total']+=1
  473. if video_info.status == '在线':
  474. current_node['online']+=1
  475. current_node['children'].append({"label":video_info.name,"status":video_info.status,"video_code":video_info.video_code,"isLeaf":True})
  476. return {
  477. "code": 200,
  478. "msg": "成功",
  479. "data": root['children'],
  480. 'online':root['online'],
  481. 'total':root['total']
  482. }
  483. except Exception as e:
  484. traceback.print_exc()
  485. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  486. @router.get('/get_video_tag_info')
  487. async def get_video_tag_info(
  488. video_code:str = Query(None),
  489. db: Session = Depends(get_db),
  490. body=Depends(remove_xss_json),
  491. # page: int = Query(1, gt=0, description='页码'),
  492. # pageSize: int = Query(10, gt=0, description='每页条目数量'),
  493. user_id=Depends(valid_access_token)
  494. ):
  495. try:
  496. tag = []
  497. tag_lable = []
  498. for info in get_video_tag_list(db,video_code):
  499. tag_info = get_dict_data_info(db,info.dict_type,info.dict_value)
  500. if tag_info:
  501. if tag_info.dict_label not in tag_lable:
  502. tag.append({"id":info.id,
  503. "video_code":video_code,
  504. "dict_type":info.dict_type,
  505. "dict_value":info.dict_value,
  506. "dict_label":tag_info.dict_label,
  507. "dict_code":tag_info.dict_code})
  508. tag_lable.append(tag_info.dict_label)
  509. return {
  510. "code": 200,
  511. "msg": "成功",
  512. "data": tag
  513. }
  514. except Exception as e:
  515. traceback.print_exc()
  516. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  517. @router.post("/add_video_tag")
  518. async def add_video_tag(
  519. user_id=Depends(valid_access_token),
  520. body = Depends(remove_xss_json),
  521. db: Session = Depends(get_db)
  522. ):
  523. try:
  524. tag_info = get_dict_data_info(db, body['dict_type'], body['dict_value'])
  525. if tag_info is None:
  526. return JSONResponse(status_code=404,content={"code":404,"msg":"标签不存在"})
  527. new_video_tag = TpVideoTag(
  528. id = new_guid(),
  529. video_code=body['video_code'],
  530. dict_value=body['dict_value'],
  531. dict_type=body['dict_type'],
  532. create_dept = user_id
  533. )
  534. db.add(new_video_tag)
  535. db.commit()
  536. return {"code": 200, "msg": "新增成功", "data": None}
  537. except Exception as e:
  538. traceback.print_exc()
  539. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  540. @router.post("/add_video_tag_label")
  541. async def add_video_tag(
  542. user_id=Depends(valid_access_token),
  543. body = Depends(remove_xss_json),
  544. db: Session = Depends(get_db)
  545. ):
  546. try:
  547. dict_label = body['dict_label']
  548. dict_info = dict_label_get_dict_data_info(db,body['dict_type'],dict_label)
  549. if dict_info is None:
  550. dict_info = SysDictData(
  551. dict_label=dict_label,
  552. dict_value = new_guid(),
  553. dict_type=body['dict_type'],
  554. list_class = 'default',
  555. create_by = user_id
  556. )
  557. db.add(dict_info)
  558. new_video_tag = TpVideoTag(
  559. id = new_guid(),
  560. video_code=body['video_code'],
  561. dict_value=dict_info.dict_value,
  562. dict_type=body['dict_type'],
  563. create_dept = user_id
  564. )
  565. db.add(new_video_tag)
  566. db.commit()
  567. return {"code": 200, "msg": "新增成功", "data": None}
  568. except Exception as e:
  569. traceback.print_exc()
  570. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  571. @router.delete("/delete_video_tag/{video_tag_id}")
  572. async def delete_video_tag(
  573. video_tag_id: str,
  574. db: Session = Depends(get_db)
  575. ):
  576. try:
  577. # 检查图案是否存在
  578. query = db.query(TpVideoTag)
  579. query = query.filter(TpVideoTag.id == video_tag_id)
  580. query = query.filter(TpVideoTag.del_flag != '2')
  581. video_tag = query.first()
  582. if not video_tag:
  583. return JSONResponse(status_code=404,content={"code":404,"msg":"标签不存在"})
  584. # 执行删除操作
  585. video_tag.del_flag='2'
  586. db.commit()
  587. return {"code": 200, "msg": "删除成功"}
  588. except Exception as e:
  589. traceback.print_exc()
  590. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  591. @router.get('/get_recently_video_tag_info')
  592. async def get_video_tag_info(
  593. # video_code:str = Query(None),
  594. db: Session = Depends(get_db),
  595. body=Depends(remove_xss_json),
  596. page: int = Query(1, gt=0, description='页码'),
  597. pageSize: int = Query(3, gt=0, description='每页条目数量'),
  598. user_id=Depends(valid_access_token)
  599. ):
  600. try:
  601. query = db.query(SysDictData)
  602. query = query.filter(SysDictData.del_flag != '2')
  603. query = query.filter(SysDictData.dict_type == 'video_type')
  604. total_items = query.count()
  605. # 排序
  606. query = query.order_by(SysDictData.create_time.desc())
  607. # 执行分页查询
  608. dicts = query.offset((page - 1) * pageSize).limit(pageSize).all()
  609. tag = []
  610. for info in dicts:
  611. tag.append({
  612. "dict_type":info.dict_type,
  613. "dict_value":info.dict_value,
  614. "dict_label":info.dict_label,
  615. "dict_code":info.dict_code})
  616. return {
  617. "code": 200,
  618. "msg": "成功",
  619. "data": tag,
  620. "total": total_items,
  621. "page": page,
  622. "pageSize": pageSize,
  623. "totalPages": (total_items + pageSize - 1) // pageSize
  624. }
  625. except Exception as e:
  626. traceback.print_exc()
  627. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  628. @router.get('/get_lx_hy_video_tag_info')
  629. async def get_lx_hy_video_tag_info(
  630. dict_value:str = Query(None),
  631. type:str= Query(None),
  632. db: Session = Depends(get_db),
  633. body=Depends(remove_xss_json),
  634. page: int = Query(1, gt=0, description='页码'),
  635. pageSize: int = Query(3, gt=0, description='每页条目数量'),
  636. user_id=Depends(valid_access_token)
  637. ):
  638. try:
  639. if dict_value is None or dict_value =='':
  640. query = db.query(SysDictData)
  641. query = query.filter(SysDictData.del_flag != '2')
  642. query = query.filter(SysDictData.dict_type == 'video_type')
  643. if type=='lx':
  644. query_1 = db.query(SysDictData)
  645. query_1 = query_1.filter(SysDictData.del_flag != '2')
  646. query_1 = query_1.filter(SysDictData.dict_type == 'video_tag_type')
  647. elif type == 'hy':
  648. query_1 = db.query(SysDictData)
  649. query_1 = query_1.filter(SysDictData.del_flag != '2')
  650. query_1 = query_1.filter(SysDictData.dict_type == 'video_tag_industry')
  651. else:
  652. return {
  653. "code": 200,
  654. "msg": "成功",
  655. "data": []
  656. }
  657. # for i in query_1.all():
  658. query = query.filter(or_(SysDictData.remark.like(f'%{i.dict_value};%') for i in query_1.all()))
  659. total_items = query.count()
  660. # 排序
  661. query = query.order_by(SysDictData.create_time.desc())
  662. # 执行分页查询
  663. dicts = query.offset((page - 1) * pageSize).limit(pageSize).all()
  664. tag = []
  665. for info in dicts:
  666. tag.append({
  667. "dict_type": info.dict_type,
  668. "dict_value": info.dict_value,
  669. "dict_label": info.dict_label,
  670. "dict_code": info.dict_code})
  671. return {
  672. "code": 200,
  673. "msg": "成功",
  674. "data": tag,
  675. "total": total_items,
  676. "page": page,
  677. "pageSize": pageSize,
  678. "totalPages": (total_items + pageSize - 1) // pageSize
  679. }
  680. query = db.query(SysDictData)
  681. query = query.filter(SysDictData.del_flag != '2')
  682. query = query.filter(SysDictData.dict_type == 'video_type')
  683. query = query.filter(SysDictData.remark.like( f'%{dict_value};%'))
  684. total_items = query.count()
  685. # 排序
  686. query = query.order_by(SysDictData.create_time.desc())
  687. # 执行分页查询
  688. dicts = query.offset((page - 1) * pageSize).limit(pageSize).all()
  689. tag = []
  690. for info in dicts:
  691. tag.append({
  692. "dict_type":info.dict_type,
  693. "dict_value":info.dict_value,
  694. "dict_label":info.dict_label,
  695. "dict_code":info.dict_code})
  696. return {
  697. "code": 200,
  698. "msg": "成功",
  699. "data": tag,
  700. "total": total_items,
  701. "page": page,
  702. "pageSize": pageSize,
  703. "totalPages": (total_items + pageSize - 1) // pageSize
  704. }
  705. except Exception as e:
  706. traceback.print_exc()
  707. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")