# -*- 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 Q, Count, Sum from django.views.generic.base import View from Model.models import VodHlsModel, VideoPlaybackTimeModel 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) 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_qs = VodHlsModel.objects.filter(time__range=(start_time, end_time)) video_play_qs = VideoPlaybackTimeModel.objects.filter(startTime__range=(start_time, end_time), playMode='could') upload_duration_qs = vod_hls_qs.values('uid').annotate(uploadFrequency=Count('uid')).order_by( 'uploadFrequency') upload_device_count = len(upload_duration_qs) # 上传设备数量 uid_list = [] for item in upload_duration_qs: item['uploadDuration'] = vod_hls_qs.filter(uid=item['uid']).aggregate(total=Sum('sec'))['total'] item['playDuration'] = video_play_qs.filter(uid=item['uid']).aggregate(total=Sum('duration'))['total'] item['playDuration'] = item['playDuration'] if item['playDuration'] else 0 item['playFrequency'] = video_play_qs.filter(uid=item['uid'], playMode='cloud').count() uid_list.append(item['uid']) video_play_qs = video_play_qs.filter(~Q(uid__in=uid_list)) play_duration_qs = video_play_qs.values('uid').annotate(playFrequency=Count('uid')).order_by( 'playFrequency') play_device_count = play_duration_qs.count() for item in play_duration_qs: item['uploadFrequency'] = 0 item['uploadDuration'] = 0 item['playDuration'] = video_play_qs.filter(uid=item['uid']).aggregate(total=Sum('duration'))['total'] item['playDuration'] = item['playDuration'] if item['playDuration'] else 0 res = { 'uploadDeviceCount': upload_device_count, 'playDeviceCount': play_device_count, 'vodData': list(upload_duration_qs) + list(play_duration_qs) } return response.json(0, res) except Exception as e: return response.json(500, repr(e)) @classmethod def query_global_device_vod_business(cls, request, request_dict, response): """ 查询全球设备云存储数据 @param request:请求 @param request_dict:请求参数 @param response:响应对象 @return: """ url_list = CommonService.get_domain_name() try: headers = { 'Authorization': request.META.get('HTTP_AUTHORIZATION') } upload_device_count = 0 play_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']) play_device_count += int(result['result']['playDeviceCount']) vod_list += result['result']['vodData'] else: return response.json(result['result_code'], result['result']) res = { 'uploadDeviceCount': upload_device_count, 'playDeviceCount': play_device_count, 'vodData': vod_list } return response.json(0, res) except Exception as e: return response.json(500, repr(e))