BusinessDataController.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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 Sum, Count
  11. from django.views.generic.base import View
  12. from Model.models import VodHlsSummary, UID_Bucket
  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 == 'uploadDurationStatistics':
  33. return self.query_upload_duration_statistics(request, 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_summary_qs = VodHlsSummary.objects.filter(time__gte=start_time, time__lt=end_time).values()
  52. vod_hls_result = []
  53. for item in vod_hls_summary_qs:
  54. vod_hls_result.append({
  55. 'uid': item['uid'],
  56. 'uploadDuration': item['upload_duration'],
  57. 'uploadFrequency': item['upload_frequency'],
  58. 'playFrequency': item['play_frequency'],
  59. 'playDuration': item['play_duration']
  60. })
  61. upload_device_count = len(vod_hls_result) # 上传设备数量
  62. res = {
  63. 'uploadDeviceCount': upload_device_count,
  64. 'vodData': vod_hls_result
  65. }
  66. return response.json(0, res)
  67. except Exception as e:
  68. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  69. @classmethod
  70. def query_global_device_vod_business(cls, request, request_dict, response):
  71. """
  72. 查询全球设备云存储数据
  73. @param request:请求
  74. @param request_dict:请求参数
  75. @param response:响应对象
  76. @return:
  77. """
  78. page_no = request_dict.get('pageNo', None)
  79. page_size = request_dict.get('pageSize', None)
  80. if not all([page_size, page_no]):
  81. return response.json(444, {'error param': 'pageNo or pageSize'})
  82. page_no = int(page_no)
  83. page_size = int(page_size)
  84. url_list = CommonService.get_domain_name()
  85. try:
  86. headers = {
  87. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  88. }
  89. upload_device_count = 0
  90. vod_list = []
  91. for url in url_list:
  92. url = url + request.path.replace('global/', '')
  93. res = requests.get(url=url, params=request_dict, headers=headers)
  94. result = res.json()
  95. if result['result_code'] == 0:
  96. upload_device_count += int(result['result']['uploadDeviceCount'])
  97. vod_list += result['result']['vodData']
  98. else:
  99. return response.json(result['result_code'], result['result'])
  100. res = {
  101. 'uploadDeviceCount': upload_device_count,
  102. 'vodData': vod_list[(page_no - 1) * page_size:page_no * page_size]
  103. }
  104. return response.json(0, res)
  105. except Exception as e:
  106. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  107. @classmethod
  108. def query_upload_duration_statistics(cls, request, request_dict, response):
  109. """查询上传秒数数据统计"""
  110. start_time = request_dict.get('startTime')
  111. end_time = request_dict.get('endTime')
  112. if not all([start_time, end_time]):
  113. return response.json(444, {'error param': 'startTime or endTime'})
  114. try:
  115. #上传总秒数
  116. upload_sum = VodHlsSummary.objects.filter(
  117. created_time__gte=start_time,
  118. updated_time__lt=end_time,
  119. upload_duration__lt=2592000
  120. ).aggregate(
  121. total_duration=Sum('upload_duration')
  122. )
  123. total_duration = upload_sum['total_duration'] or 0
  124. #设备总数
  125. device_sum = UID_Bucket.objects.filter(
  126. status=1,
  127. endTime__gt=end_time
  128. ).aggregate(
  129. total_device=Count('id')
  130. )
  131. total_device = device_sum['total_device'] or 0
  132. if total_device == 0:
  133. monthly_average_data = 0.0
  134. day_average_data = 0.0
  135. else:
  136. monthly_average_data = total_duration / total_device / 3600 #月均
  137. day_average_data = monthly_average_data / 30 #日均
  138. return response.json(0, {
  139. 'total_upload_duration': total_duration,
  140. 'total_device_count': total_device,
  141. 'monthly_average_data': round(monthly_average_data, 2), # 保留2位小数
  142. 'day_average_data': round(day_average_data, 2)
  143. })
  144. except Exception as e:
  145. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))