videoinfo.py 41 KB

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