BusinessDataController.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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, VodHlsSummary
  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. else:
  33. return response.json(414)
  34. @classmethod
  35. def query_device_vod_business(cls, request_dict, response):
  36. """
  37. 查询设备云存储数据
  38. @param request_dict:请求参数
  39. @request_dict startTime:开始时间
  40. @request_dict endTime:结束时间
  41. @param response:响应对象
  42. @return:
  43. """
  44. start_time = request_dict.get('startTime', None)
  45. end_time = request_dict.get('endTime', None)
  46. if not all([start_time, end_time]):
  47. return response.json(444, {'error param': 'startTime or endTime'})
  48. try:
  49. vod_hls_summary_qs = VodHlsSummary.objects.filter(time__range=(start_time, end_time)).values()
  50. vod_hls_qs = VodHlsModel.objects.filter(time__range=(start_time, end_time))
  51. video_play_qs = VideoPlaybackTimeModel.objects.filter(startTime__range=(start_time, end_time),
  52. playMode='could')
  53. upload_duration_qs = vod_hls_qs.values('uid').annotate(uploadFrequency=Count('uid')).order_by(
  54. 'uploadFrequency')
  55. upload_device_count = len(upload_duration_qs) + len(vod_hls_summary_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. upload_duration_list = list(upload_duration_qs)
  60. for each in vod_hls_summary_qs:
  61. flag = 0
  62. for item in upload_duration_list:
  63. if each['uid'] == item['uid']:
  64. item['uploadDuration'] += each['sec']
  65. item['uploadFrequency'] += each['upload_frequency']
  66. flag = 1
  67. if flag == 0:
  68. upload_duration_list.append({
  69. 'uid': each['uid'],
  70. 'uploadDuration': each['sec'],
  71. 'uploadFrequency': each['upload_frequency']
  72. })
  73. for item in upload_duration_list:
  74. item['playDuration'] = video_play_qs.filter(uid=item['uid']).aggregate(total=Sum('duration'))['total']
  75. item['playDuration'] = item['playDuration'] if item['playDuration'] else 0
  76. item['playFrequency'] = video_play_qs.filter(uid=item['uid'], playMode='cloud').count()
  77. uid_list.append(item['uid'])
  78. video_play_qs = video_play_qs.filter(~Q(uid__in=uid_list))
  79. play_duration_qs = video_play_qs.values('uid').annotate(playFrequency=Count('uid')).order_by(
  80. 'playFrequency')
  81. play_device_count = play_duration_qs.count()
  82. for item in play_duration_qs:
  83. item['uploadFrequency'] = 0
  84. item['uploadDuration'] = 0
  85. item['playDuration'] = video_play_qs.filter(uid=item['uid']).aggregate(total=Sum('duration'))['total']
  86. item['playDuration'] = item['playDuration'] if item['playDuration'] else 0
  87. res = {
  88. 'uploadDeviceCount': upload_device_count,
  89. 'playDeviceCount': play_device_count,
  90. 'vodData': upload_duration_list + list(play_duration_qs)
  91. }
  92. return response.json(0, res)
  93. except Exception as e:
  94. return response.json(500, repr(e))
  95. @classmethod
  96. def query_global_device_vod_business(cls, request, request_dict, response):
  97. """
  98. 查询全球设备云存储数据
  99. @param request:请求
  100. @param request_dict:请求参数
  101. @param response:响应对象
  102. @return:
  103. """
  104. url_list = CommonService.get_domain_name()
  105. try:
  106. headers = {
  107. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  108. }
  109. upload_device_count = 0
  110. play_device_count = 0
  111. vod_list = []
  112. for url in url_list:
  113. url = url + request.path.replace('global/', '')
  114. res = requests.get(url=url, params=request_dict, headers=headers)
  115. result = res.json()
  116. if result['result_code'] == 0:
  117. upload_device_count += int(result['result']['uploadDeviceCount'])
  118. play_device_count += int(result['result']['playDeviceCount'])
  119. vod_list += result['result']['vodData']
  120. else:
  121. return response.json(result['result_code'], result['result'])
  122. res = {
  123. 'uploadDeviceCount': upload_device_count,
  124. 'playDeviceCount': play_device_count,
  125. 'vodData': vod_list
  126. }
  127. return response.json(0, res)
  128. except Exception as e:
  129. return response.json(500, repr(e))