videoinfo.py 40 KB

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