|
@@ -13,7 +13,7 @@ from Ansjer.config import DEVICE_TYPE
|
|
|
import datetime
|
|
|
import requests
|
|
|
|
|
|
-from Model.models import Order_Model, CountryModel, Device_Info, DeviceTypeModel
|
|
|
+from Model.models import Order_Model, CountryModel, Device_Info, DeviceTypeModel, UidSetModel, UnicomCombo
|
|
|
from Service.CommonService import CommonService
|
|
|
|
|
|
|
|
@@ -62,7 +62,6 @@ class ServiceDataView(View):
|
|
|
@request_dict endTime:结束时间
|
|
|
@request_dict timeUnit:时间单位
|
|
|
@request_dict storeMealType:套餐类型
|
|
|
- @request_dict lang:套餐语言
|
|
|
@param response:响应对象
|
|
|
@return:
|
|
|
"""
|
|
@@ -70,10 +69,10 @@ class ServiceDataView(View):
|
|
|
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:
|
|
|
+ store_meal_type = int(store_meal_type)
|
|
|
order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
|
|
|
addTime__range=(start_time, end_time)).filter(
|
|
|
~Q(price='0.00') & ~Q(price='0'))
|
|
@@ -87,13 +86,12 @@ class ServiceDataView(View):
|
|
|
order_list = []
|
|
|
for item in time_list:
|
|
|
order_temp_qs = order_qs.filter(addTime__range=item)
|
|
|
- if order_temp_qs.exists():
|
|
|
- order_dict = {
|
|
|
- 'count': order_temp_qs.count(),
|
|
|
- 'startTime': item[0],
|
|
|
- 'endTime': item[1]
|
|
|
- }
|
|
|
- order_list.append(order_dict)
|
|
|
+ order_dict = {
|
|
|
+ 'count': order_temp_qs.count(),
|
|
|
+ 'startTime': item[0],
|
|
|
+ 'endTime': item[1]
|
|
|
+ }
|
|
|
+ order_list.append(order_dict)
|
|
|
|
|
|
# 区域订单统计
|
|
|
region_list = []
|
|
@@ -122,18 +120,18 @@ class ServiceDataView(View):
|
|
|
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 k, v in uid_type_dict.items():
|
|
|
type_name = DEVICE_TYPE.get(k, '未知类型')
|
|
|
type_name = type_name if type_name != 'UNKOWN' else '未知类型'
|
|
|
- type_rate = round(len(v) / device_count * 100, 2)
|
|
|
+ device_count = order_qs.filter(UID__in=v).count()
|
|
|
+ type_rate = round(device_count / count * 100, 2)
|
|
|
temp_total = order_qs.filter(UID__in=v).aggregate(total=Sum('price'))['total']
|
|
|
total_rate = round(temp_total / total * 100, 2)
|
|
|
device_temp_qs = {
|
|
|
'typeName': type_name,
|
|
|
- 'count': len(v),
|
|
|
+ 'count': device_count,
|
|
|
'typeRate': type_rate,
|
|
|
'totalMoney': temp_total,
|
|
|
'totalRate': total_rate
|
|
@@ -142,14 +140,38 @@ class ServiceDataView(View):
|
|
|
|
|
|
# 套餐订单统计
|
|
|
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')
|
|
|
+ if store_meal_type == 0:
|
|
|
+ store_meal_qs = order_qs.values('rank').annotate(count=Count('rank')).order_by('-count')
|
|
|
+ elif store_meal_type == 1:
|
|
|
+ store_meal_qs = order_qs.values('ai_rank').annotate(count=Count('ai_rank')).order_by('-count')
|
|
|
+ else:
|
|
|
+ store_meal_qs = order_qs.values('unify_combo_id').annotate(count=Count('unify_combo_id')).order_by(
|
|
|
+ '-count')
|
|
|
for item in store_meal_qs:
|
|
|
+ if store_meal_type == 0:
|
|
|
+ store_meal_id = item['rank']
|
|
|
+ store_meal_content_qs = store_meal_qs.filter(rank=store_meal_id, rank__lang__lang='cn').values(
|
|
|
+ 'rank__lang__content')
|
|
|
+ store_meal_name = store_meal_content_qs[0][
|
|
|
+ 'rank__lang__content'] if store_meal_content_qs.exists() else '未知套餐'
|
|
|
+ elif store_meal_type == 1:
|
|
|
+ store_meal_id = item['ai_rank']
|
|
|
+ store_meal_content_qs = store_meal_qs.filter(ai_rank=store_meal_id,
|
|
|
+ ai_rank__lang__lang='cn').values(
|
|
|
+ 'ai_rank__lang__content')
|
|
|
+ store_meal_name = store_meal_content_qs[0][
|
|
|
+ 'ai_rank__lang__content'] if store_meal_content_qs.exists() else '未知套餐'
|
|
|
+ else:
|
|
|
+ store_meal_id = item['unify_combo_id']
|
|
|
+ store_meal_content_qs = UnicomCombo.objects.filter(id=store_meal_id).values(
|
|
|
+ 'combo_name')
|
|
|
+ store_meal_name = store_meal_content_qs[0][
|
|
|
+ 'combo_name'] if store_meal_content_qs.exists() else '未知套餐'
|
|
|
rate = round(item['count'] / count * 100, 2)
|
|
|
store_meal_dict = {
|
|
|
- 'storeMealId': item['rank'],
|
|
|
+ 'storeMealId': store_meal_id,
|
|
|
'count': item['count'],
|
|
|
- 'storeMealName': item['rank__lang__content'],
|
|
|
+ 'storeMealName': store_meal_name,
|
|
|
'rate': rate
|
|
|
}
|
|
|
store_meal_list.append(store_meal_dict)
|
|
@@ -182,25 +204,34 @@ class ServiceDataView(View):
|
|
|
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:
|
|
|
+ store_meal_type = int(store_meal_type)
|
|
|
order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
|
|
|
addTime__range=(start_time, end_time)).filter(
|
|
|
Q(price='0.00') | Q(price='0'))
|
|
|
count = order_qs.count()
|
|
|
+ uidset_qs = UidSetModel.objects.filter(addTime__range=(start_time, end_time))
|
|
|
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)
|
|
|
-
|
|
|
+ # 转化率
|
|
|
+ if store_meal_type == 0:
|
|
|
+ uidset_count = uidset_qs.filter(is_vod=1).count()
|
|
|
+ elif store_meal_type == 1:
|
|
|
+ uidset_count = uidset_qs.filter(is_ai=1).count()
|
|
|
+ else:
|
|
|
+ uidset_count = uidset_qs.filter(mobile_4g=1).count()
|
|
|
+ device_count = order_qs.values('UID').distinct().order_by('UID').count()
|
|
|
+ inversion_rate = round(device_count / uidset_count * 100, 2)
|
|
|
# 订单数量统计
|
|
|
order_list = []
|
|
|
for item in time_list:
|
|
|
order_temp_qs = order_qs.filter(addTime__range=item)
|
|
|
- if order_temp_qs.exists():
|
|
|
- order_dict = {
|
|
|
- 'count': order_temp_qs.count(),
|
|
|
- 'startTime': item[0],
|
|
|
- 'endTime': item[1]
|
|
|
- }
|
|
|
- order_list.append(order_dict)
|
|
|
+ order_dict = {
|
|
|
+ 'count': order_temp_qs.count(),
|
|
|
+ 'startTime': item[0],
|
|
|
+ 'endTime': item[1]
|
|
|
+ }
|
|
|
+ order_list.append(order_dict)
|
|
|
|
|
|
# 区域订单统计
|
|
|
region_list = []
|
|
@@ -220,19 +251,22 @@ class ServiceDataView(View):
|
|
|
# 设备类型订单统计
|
|
|
device_type_list = []
|
|
|
device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
|
|
|
- uid_list = []
|
|
|
+ uid_dict = {}
|
|
|
for item in device_type_qs:
|
|
|
- uid_list.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_name = DEVICE_TYPE.get(item['Type'], '未知类型')
|
|
|
+ device_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
|
|
|
+ device_type = device_qs[0]['Type'] if device_qs.exists() else 0
|
|
|
+ if device_type not in uid_dict:
|
|
|
+ uid_dict[device_type] = []
|
|
|
+ uid_dict[device_type].append(item['UID'])
|
|
|
+
|
|
|
+ for k, v in uid_dict.items():
|
|
|
+ type_name = DEVICE_TYPE.get(k, '未知类型')
|
|
|
type_name = type_name if type_name != 'UNKOWN' else '未知类型'
|
|
|
- type_rate = round(item['count'] / device_count * 100, 2)
|
|
|
+ device_count = order_qs.filter(UID__in=v).count()
|
|
|
+ type_rate = round(device_count / count * 100, 2)
|
|
|
device_temp_qs = {
|
|
|
'typeName': type_name,
|
|
|
- 'count': item['count'],
|
|
|
+ 'count': device_count,
|
|
|
'typeRate': type_rate,
|
|
|
}
|
|
|
device_type_list.append(device_temp_qs)
|
|
@@ -241,6 +275,7 @@ class ServiceDataView(View):
|
|
|
'orders': order_list,
|
|
|
'regions': region_list,
|
|
|
'deviceType': device_type_list,
|
|
|
+ 'inversionRate': inversion_rate
|
|
|
}
|
|
|
return response.json(0, res)
|
|
|
except Exception as e:
|
|
@@ -273,7 +308,8 @@ class ServiceDataView(View):
|
|
|
uid_list.append(item.UID)
|
|
|
order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
|
|
|
addTime__range=(start_time, end_time)).filter(~Q(price='0.00'),
|
|
|
- ~Q(UID__in=uid_list))
|
|
|
+ ~Q(UID__in=uid_list),
|
|
|
+ ~Q(price='0'))
|
|
|
count = order_qs.count()
|
|
|
start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
|
end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
@@ -283,13 +319,12 @@ class ServiceDataView(View):
|
|
|
order_list = []
|
|
|
for item in time_list:
|
|
|
order_temp_qs = order_qs.filter(addTime__range=item)
|
|
|
- if order_temp_qs.exists():
|
|
|
- order_dict = {
|
|
|
- 'count': order_temp_qs.count(),
|
|
|
- 'startTime': item[0],
|
|
|
- 'endTime': item[1]
|
|
|
- }
|
|
|
- order_list.append(order_dict)
|
|
|
+ order_dict = {
|
|
|
+ 'count': order_temp_qs.count(),
|
|
|
+ 'startTime': item[0],
|
|
|
+ 'endTime': item[1]
|
|
|
+ }
|
|
|
+ order_list.append(order_dict)
|
|
|
|
|
|
# 区域订单统计
|
|
|
region_list = []
|
|
@@ -309,19 +344,21 @@ class ServiceDataView(View):
|
|
|
# 设备类型订单统计
|
|
|
device_type_list = []
|
|
|
device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
|
|
|
- uid_list = []
|
|
|
+ uid_dict = {}
|
|
|
for item in device_type_qs:
|
|
|
- uid_list.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_name = DEVICE_TYPE.get(item['Type'], '未知类型')
|
|
|
+ device_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
|
|
|
+ device_type = device_qs[0]['Type'] if device_qs.exists() else 0
|
|
|
+ if device_type not in uid_dict:
|
|
|
+ uid_dict[device_type] = []
|
|
|
+ uid_dict[device_type].append(item['UID'])
|
|
|
+ for k, v in uid_dict.items():
|
|
|
+ type_name = DEVICE_TYPE.get(k, '未知类型')
|
|
|
type_name = type_name if type_name != 'UNKOWN' else '未知类型'
|
|
|
- type_rate = round(item['count'] / device_count * 100, 2)
|
|
|
+ device_count = order_qs.filter(UID__in=v).count()
|
|
|
+ type_rate = round(device_count / count * 100, 2)
|
|
|
device_temp_qs = {
|
|
|
'typeName': type_name,
|
|
|
- 'count': item['count'],
|
|
|
+ 'count': device_count,
|
|
|
'typeRate': type_rate,
|
|
|
}
|
|
|
device_type_list.append(device_temp_qs)
|
|
@@ -362,11 +399,10 @@ class ServiceDataView(View):
|
|
|
uid_list.append(item.UID)
|
|
|
order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
|
|
|
addTime__range=(start_time, end_time)).filter(
|
|
|
- ~Q(price='0.00') & ~Q(price='0'))
|
|
|
+ ~Q(price='0.00'), ~Q(price='0'), Q(UID__in=uid_list))
|
|
|
total = order_qs.count()
|
|
|
|
|
|
# 订单复购率
|
|
|
- order_qs = order_qs.filter(Q(UID__in=uid_list))
|
|
|
count = order_qs.count()
|
|
|
repeat_rate = round(count / total * 100, 2)
|
|
|
|
|
@@ -377,13 +413,12 @@ class ServiceDataView(View):
|
|
|
order_list = []
|
|
|
for item in time_list:
|
|
|
order_temp_qs = order_qs.filter(addTime__range=item)
|
|
|
- if order_temp_qs.exists():
|
|
|
- order_dict = {
|
|
|
- 'count': order_temp_qs.count(),
|
|
|
- 'startTime': item[0],
|
|
|
- 'endTime': item[1]
|
|
|
- }
|
|
|
- order_list.append(order_dict)
|
|
|
+ order_dict = {
|
|
|
+ 'count': order_temp_qs.count(),
|
|
|
+ 'startTime': item[0],
|
|
|
+ 'endTime': item[1]
|
|
|
+ }
|
|
|
+ order_list.append(order_dict)
|
|
|
|
|
|
# 区域订单统计
|
|
|
region_list = []
|
|
@@ -403,19 +438,21 @@ class ServiceDataView(View):
|
|
|
# 设备类型订单统计
|
|
|
device_type_list = []
|
|
|
device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
|
|
|
- uid_list = []
|
|
|
+ uid_dict = {}
|
|
|
for item in device_type_qs:
|
|
|
- uid_list.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_name = DEVICE_TYPE.get(item['Type'], '未知类型')
|
|
|
+ device_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
|
|
|
+ device_type = device_qs[0]['Type'] if device_qs.exists() else 0
|
|
|
+ if device_type not in uid_dict:
|
|
|
+ uid_dict[device_type] = []
|
|
|
+ uid_dict[device_type].append(item['UID'])
|
|
|
+ for k, v in uid_dict.items():
|
|
|
+ type_name = DEVICE_TYPE.get(k, '未知类型')
|
|
|
type_name = type_name if type_name != 'UNKOWN' else '未知类型'
|
|
|
- type_rate = round(item['count'] / device_count * 100, 2)
|
|
|
+ device_count = order_qs.filter(UID__in=v).count()
|
|
|
+ type_rate = round(device_count / count * 100, 2)
|
|
|
device_temp_qs = {
|
|
|
'typeName': type_name,
|
|
|
- 'count': item['count'],
|
|
|
+ 'count': device_count,
|
|
|
'typeRate': type_rate,
|
|
|
}
|
|
|
device_type_list.append(device_temp_qs)
|