BusinessDataController.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : UserDataController.py
  4. @Time : 2022/8/16 10:44
  5. @Author : peng
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import requests
  10. from django.db.models import Q, Count, Sum
  11. from django.views.generic.base import View
  12. from Model.models import VodHlsModel, VideoPlaybackTimeModel, Device_Info
  13. from Service.CommonService import CommonService
  14. # 业务数据
  15. class BusinessDataView(View):
  16. def get(self, request, *args, **kwargs):
  17. request.encoding = 'utf-8'
  18. operation = kwargs.get('operation')
  19. return self.validation(request.GET, request, operation)
  20. def post(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation')
  23. return self.validation(request.POST, request, operation)
  24. def validation(self, request_dict, request, operation):
  25. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  26. if token_code != 0:
  27. return response.json(token_code)
  28. if operation == 'vodData': # 查询设备云存储数据
  29. return self.query_device_vod_business(request_dict, response)
  30. elif operation == 'global/vodData': # 查询全球设备云存储数据
  31. return self.query_global_device_vod_business(request, request_dict, response)
  32. elif operation == 'test': # 查询全球设备云存储数据
  33. return self.test(request_dict, response)
  34. else:
  35. return response.json(414)
  36. @classmethod
  37. def query_device_vod_business(cls, request_dict, response):
  38. """
  39. 查询设备云存储数据
  40. @param request_dict:请求参数
  41. @request_dict startTime:开始时间
  42. @request_dict endTime:结束时间
  43. @param response:响应对象
  44. @return:
  45. """
  46. start_time = request_dict.get('startTime', None)
  47. end_time = request_dict.get('endTime', None)
  48. if not all([start_time, end_time]):
  49. return response.json(444, {'error param': 'startTime or endTime'})
  50. try:
  51. vod_hls_qs = VodHlsModel.objects.filter(time__range=(start_time, end_time))
  52. video_play_qs = VideoPlaybackTimeModel.objects.filter(startTime__range=(start_time, end_time))
  53. upload_duration_qs = vod_hls_qs.values('uid').annotate(uploadFrequency=Count('uid')).order_by(
  54. 'uploadFrequency')
  55. device_count = len(upload_duration_qs) # 上传设备数量
  56. uid_list = []
  57. for item in upload_duration_qs:
  58. item['uploadDuration'] = vod_hls_qs.filter(uid=item['uid']).aggregate(total=Sum('sec'))['total']
  59. item['playFrequency'] = video_play_qs.filter(uid=item['uid'], playMode='cloud').count()
  60. uid_list.append(item['uid'])
  61. video_play_qs = video_play_qs.filter(~Q(uid__in=uid_list))
  62. play_duration_qs = video_play_qs.values('uid').annotate(playFrequency=Count('uid')).order_by(
  63. 'playFrequency')
  64. for item in play_duration_qs:
  65. item['uploadFrequency'] = 0
  66. item['uploadDuration'] = 0
  67. res = {
  68. 'deviceCount': device_count,
  69. 'vodData': list(upload_duration_qs) + list(play_duration_qs)
  70. }
  71. return response.json(0, res)
  72. except Exception as e:
  73. return response.json(500, repr(e))
  74. @classmethod
  75. def query_global_device_vod_business(cls, request, request_dict, response):
  76. """
  77. 查询全球设备云存储数据
  78. @param request:请求
  79. @param request_dict:请求参数
  80. @param response:响应对象
  81. @return:
  82. """
  83. ap_url = 'https://www.zositechc.cn/dataManagement/businessData/vodData'
  84. as_url = 'https://www.zositecha.com/dataManagement/businessData/vodData'
  85. na_url = 'https://www.dvema.com/dataManagement/businessData/vodData'
  86. eu_url = 'https://www.zositeche.com/dataManagement/businessData/vodData'
  87. local_url = 'http://127.0.0.1:8000/dataManagement/businessData/vodData'
  88. url_list = [local_url]
  89. try:
  90. headers = {
  91. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  92. }
  93. device_count = 0
  94. vod_list = []
  95. for url in url_list:
  96. res = requests.get(url=url, params=request_dict, headers=headers)
  97. result = res.json()
  98. device_count += int(result['result']['deviceCount'])
  99. vod_list += result['result']['vodData']
  100. res = {
  101. 'deviceCount': device_count,
  102. 'vodData': vod_list
  103. }
  104. return response.json(0, res)
  105. except Exception as e:
  106. return response.json(500, repr(e))
  107. @classmethod
  108. def test(cls, request_dict, response):
  109. """
  110. 查询全球设备云存储数据
  111. @param request_dict:请求参数
  112. @param response:响应对象
  113. @return:
  114. """
  115. try:
  116. a = Device_Info.objects.all().values('Type').annotate(count=Count('Type')).order_by('-count')
  117. b = Device_Info.objects.all().values('Type').annotate(count=Count('Type', distinct=True)).order_by('-count')
  118. for item in a:
  119. c = Device_Info.objects.filter(Type=item['Type']).values('UID').annotate(
  120. count=Count('UID', distinct=True)).order_by('-count').count()
  121. return response.json(0)
  122. except Exception as e:
  123. return response.json(500, repr(e))