|
@@ -12,15 +12,13 @@ import time
|
|
|
import oss2
|
|
|
from django.db import connection
|
|
|
from django.db import transaction
|
|
|
-from django.db.models import Q, Count
|
|
|
+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 Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, \
|
|
|
- iotdeviceInfoModel, UIDModel, Device_User, UserFamily, FamilyMember, FamilyMemberPermission, \
|
|
|
- FamilyRoomDevice, FamilyRoom, FamilyMemberJoin, GatewaySubDevice, CountryModel
|
|
|
+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
|
|
@@ -40,58 +38,118 @@ class ServiceDataView(View):
|
|
|
return self.validation(request.POST, request, operation)
|
|
|
|
|
|
def validation(self, request_dict, request, operation):
|
|
|
-
|
|
|
- token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
|
|
|
- lang = request_dict.get('lang', None)
|
|
|
- if lang:
|
|
|
- response = ResponseObject(lang)
|
|
|
- else:
|
|
|
- response = ResponseObject(token.lang) if token.lang else ResponseObject()
|
|
|
-
|
|
|
- if token.code != 0:
|
|
|
- return response.json(token.code)
|
|
|
- user_id = token.userID
|
|
|
-
|
|
|
- if operation == 'increase': # 查询新增用户数据
|
|
|
- return self.user_increase(request_dict, response)
|
|
|
+ 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 user_increase(cls, request_dict, response):
|
|
|
+ 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)
|
|
|
- if not all([start_time, end_time]):
|
|
|
- return response.json(444, {'error param': 'startTime or endTime'})
|
|
|
- start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
|
- end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
|
+ 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:
|
|
|
- user_qs = Device_User.objects.filter(data_joined__range=(start_time, end_time))
|
|
|
+ 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 = {
|
|
|
- 'total': user_qs.count(),
|
|
|
- 'region': []
|
|
|
+ 'orders': order_list,
|
|
|
+ 'regions': region_list,
|
|
|
+ 'deviceType': device_type_list,
|
|
|
+ 'storeMeal': store_meal_list,
|
|
|
}
|
|
|
- if user_qs.exists():
|
|
|
- user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by('-count')
|
|
|
- region = []
|
|
|
- for item in user_country_qs:
|
|
|
- country_id = item['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 '未知区域'
|
|
|
- country_dict = {
|
|
|
- 'countryName': country_name,
|
|
|
- 'count': item['count']
|
|
|
- }
|
|
|
- region.append(country_dict)
|
|
|
- res['region'] = region
|
|
|
return response.json(0, res)
|
|
|
except Exception as e:
|
|
|
return response.json(500, repr(e))
|