# -*- encoding: utf-8 -*- """ @File : UserDataController.py @Time : 2022/8/16 10:44 @Author : peng @Email : zhangdongming@asj6.wecom.work @Software: PyCharm """ import time import oss2 from django.db import connection from django.db import transaction from django.db.models import Q, Count, Sum from django.views.generic.base import View import datetime from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY from Controller.DeviceConfirmRegion import Device_Region from Model.models import Order_Model, CountryModel, Device_Info, DeviceTypeModel from Object.ResponseObject import ResponseObject from Object.TokenObject import TokenObject from Service.CommonService import CommonService # 服务数据 class ServiceDataView(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 == 'payOrder': # 查询付费订单数据 return self.query_pay_order(request_dict, response) else: return response.json(414) @classmethod def query_pay_order(cls, request_dict, response): """ 查询付费订单数据 @param request_dict:请求参数 @request_dict startTime:开始时间 @request_dict endTime:结束时间 @request_dict timeUnit:时间单位 @request_dict storeMealType:套餐类型 @request_dict lang:套餐语言 @param response:响应对象 @return: """ start_time = request_dict.get('startTime', None) end_time = request_dict.get('endTime', None) time_unit = request_dict.get('timeUnit', None) store_meal_type = request_dict.get('storeMealType', None) lang = request_dict.get('lang', 'cn') if not all([start_time, end_time, time_unit, store_meal_type]): return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'}) try: order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1, addTime__range=(start_time, end_time)).filter(~Q(price='0.00')) count = order_qs.count() total = order_qs.aggregate(total=Sum('price'))['total'] start_time = datetime.datetime.fromtimestamp(int(start_time)) end_time = datetime.datetime.fromtimestamp(int(end_time)) time_list = CommonService.cutting_time(start_time, end_time, time_unit) # 订单数量统计 order_list = [] for item in time_list: order_temp_qs = order_qs.filter(addTime__range=item) order_dict = { 'orderId': order_temp_qs[0].orderID, 'count': order_temp_qs.count(), 'startTime': item[0], 'endTime': item[1] } order_list.append(order_dict) # 区域订单统计 region_list = [] region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count') for item in region_qs: country_id = item['userID__region_country'] country_qs = CountryModel.objects.filter(id=country_id).values('country_name') country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域' rate = round(item['count'] / count * 100, 2) region_dict = { 'countryName': country_name, 'count': item['count'], 'rate': rate } region_list.append(region_dict) # 设备类型订单统计 device_type_list = [] device_type_qs = order_qs.values('UID').annotate() uid_list = [] uid_type_dict = {} for item in device_type_qs: uid_list.append(item['UID']) device_temp_qs = Device_Info.objects.filter(UID=item['UID']).values('Type') if device_temp_qs.exists(): if device_temp_qs[0]['Type'] not in uid_type_dict: uid_type_dict[device_temp_qs[0]['Type']] = [] uid_type_dict[device_temp_qs[0]['Type']].append(item['UID']) device_count = len(set(uid_list)) device_qs = Device_Info.objects.filter(UID__in=uid_list).values('Type').annotate( count=Count('Type', distinct=True)).order_by('-count') for item in device_qs: type_qs = DeviceTypeModel.objects.filter(id=item['Type']) type_name = type_qs[0]['name'] if type_qs.exists() else '未知类型' type_rate = round(item['count'] / device_count * 100, 2) temp_total = order_qs.filter(UID__in=uid_type_dict[item['Type']]).aggregate(total=Sum('price'))['total'] total_rate = round(temp_total / total * 100, 2) device_temp_qs = { 'typeName': type_name, 'count': item['count'], 'typeRate': type_rate, 'totalRate': total_rate } device_type_list.append(device_temp_qs) # 套餐订单统计 store_meal_list = [] store_meal_qs = order_qs.values('rank').annotate(count=Count('rank')).order_by('-count').filter( rank__lang__lang=lang).values('rank', 'count', 'rank__lang__content') for item in store_meal_qs: rate = round(item['count'] / count * 100, 2) store_meal_dict = { 'storeMealId': item['rank'], 'count': item['count'], 'storeMealName': item['rank__lang__content'], 'rate': rate } store_meal_list.append(store_meal_dict) res = { 'orders': order_list, 'regions': region_list, 'deviceType': device_type_list, 'storeMeal': store_meal_list, } return response.json(0, res) except Exception as e: return response.json(500, repr(e))