videoinfo.py 36 KB

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