videoinfo.py 35 KB

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