| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- # -*- encoding: utf-8 -*-
- """
- @File : UserDataController.py
- @Time : 2022/8/16 10:44
- @Author : peng
- @Email : zhangdongming@asj6.wecom.work
- @Software: PyCharm
- """
- import requests
- from django.db.models import Sum, Count
- from django.views.generic.base import View
- from Model.models import VodHlsSummary, UID_Bucket
- from Service.CommonService import CommonService
- # 业务数据
- class BusinessDataView(View):
- def get(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- return self.validation(request.GET, request, operation)
- def post(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- return self.validation(request.POST, request, operation)
- def validation(self, request_dict, request, operation):
- token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
- if token_code != 0:
- return response.json(token_code)
- if operation == 'vodData': # 查询设备云存储数据
- return self.query_device_vod_business(request_dict, response)
- elif operation == 'global/vodData': # 查询全球设备云存储数据
- return self.query_global_device_vod_business(request, request_dict, response)
- elif operation == 'uploadDurationStatistics':
- return self.query_upload_duration_statistics(request, request_dict, response)
- else:
- return response.json(414)
- @classmethod
- def query_device_vod_business(cls, request_dict, response):
- """
- 查询设备云存储数据
- @param request_dict:请求参数
- @request_dict startTime:开始时间
- @request_dict endTime:结束时间
- @param response:响应对象
- @return:
- """
- start_time = request_dict.get('startTime', None)
- end_time = request_dict.get('endTime', None)
- if not all([start_time, end_time]):
- return response.json(444, {'error param': 'startTime or endTime'})
- try:
- vod_hls_summary_qs = VodHlsSummary.objects.filter(time__gte=start_time, time__lt=end_time).values()
- vod_hls_result = []
- for item in vod_hls_summary_qs:
- vod_hls_result.append({
- 'uid': item['uid'],
- 'uploadDuration': item['upload_duration'],
- 'uploadFrequency': item['upload_frequency'],
- 'playFrequency': item['play_frequency'],
- 'playDuration': item['play_duration']
- })
- upload_device_count = len(vod_hls_result) # 上传设备数量
- res = {
- 'uploadDeviceCount': upload_device_count,
- 'vodData': vod_hls_result
- }
- return response.json(0, res)
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- @classmethod
- def query_global_device_vod_business(cls, request, request_dict, response):
- """
- 查询全球设备云存储数据
- @param request:请求
- @param request_dict:请求参数
- @param response:响应对象
- @return:
- """
- page_no = request_dict.get('pageNo', None)
- page_size = request_dict.get('pageSize', None)
- if not all([page_size, page_no]):
- return response.json(444, {'error param': 'pageNo or pageSize'})
- page_no = int(page_no)
- page_size = int(page_size)
- url_list = CommonService.get_domain_name()
- try:
- headers = {
- 'Authorization': request.META.get('HTTP_AUTHORIZATION')
- }
- upload_device_count = 0
- vod_list = []
- for url in url_list:
- url = url + request.path.replace('global/', '')
- res = requests.get(url=url, params=request_dict, headers=headers)
- result = res.json()
- if result['result_code'] == 0:
- upload_device_count += int(result['result']['uploadDeviceCount'])
- vod_list += result['result']['vodData']
- else:
- return response.json(result['result_code'], result['result'])
- res = {
- 'uploadDeviceCount': upload_device_count,
- 'vodData': vod_list[(page_no - 1) * page_size:page_no * page_size]
- }
- return response.json(0, res)
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- @classmethod
- def query_upload_duration_statistics(cls, request, request_dict, response):
- """查询上传秒数数据统计"""
- start_time = request_dict.get('startTime')
- end_time = request_dict.get('endTime')
- if not all([start_time, end_time]):
- return response.json(444, {'error param': 'startTime or endTime'})
- try:
- #上传总秒数
- upload_sum = VodHlsSummary.objects.filter(
- created_time__gte=start_time,
- updated_time__lt=end_time,
- upload_duration__lt=2592000
- ).aggregate(
- total_duration=Sum('upload_duration')
- )
- total_duration = upload_sum['total_duration'] or 0
- #设备总数
- device_sum = UID_Bucket.objects.filter(
- status=1,
- endTime__gt=end_time
- ).aggregate(
- total_device=Count('id')
- )
- total_device = device_sum['total_device'] or 0
- if total_device == 0:
- monthly_average_data = 0.0
- day_average_data = 0.0
- else:
- monthly_average_data = total_duration / total_device / 3600 #月均
- day_average_data = monthly_average_data / 30 #日均
- return response.json(0, {
- 'total_upload_duration': total_duration,
- 'total_device_count': total_device,
- 'monthly_average_data': round(monthly_average_data, 2), # 保留2位小数
- 'day_average_data': round(day_average_data, 2)
- })
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|