videoinfo.py 40 KB

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