|
@@ -12,7 +12,8 @@ from django.views.generic.base import View
|
|
import datetime
|
|
import datetime
|
|
import requests
|
|
import requests
|
|
|
|
|
|
-from Model.models import Order_Model, CountryModel, Device_Info, DeviceTypeModel, UidSetModel, UnicomCombo
|
|
|
|
|
|
+from Model.models import Order_Model, CountryModel, Device_Info, DeviceTypeModel, UidSetModel, UnicomCombo, \
|
|
|
|
+ OrdersSummary, DeviceInfoSummary
|
|
from Service.CommonService import CommonService
|
|
from Service.CommonService import CommonService
|
|
|
|
|
|
|
|
|
|
@@ -72,11 +73,13 @@ class ServiceDataView(View):
|
|
return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
|
|
return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
|
|
try:
|
|
try:
|
|
store_meal_type = int(store_meal_type)
|
|
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()
|
|
|
|
- total = order_qs.aggregate(total=Sum('price'))['total']
|
|
|
|
|
|
+ order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=0,
|
|
|
|
+ service_type=store_meal_type).values('count', 'country', 'total',
|
|
|
|
+ 'device_type', 'store_meal')
|
|
|
|
+ all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
|
|
|
|
+ Q(query_type=0) | Q(query_type=1)).aggregate(total=Sum('total'), count=Sum('count'))
|
|
|
|
+ all_order_count = all_order_qs['count']
|
|
|
|
+ all_order_total = all_order_qs['total']
|
|
start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
time_list = CommonService.cutting_time(start_time, end_time, time_unit)
|
|
time_list = CommonService.cutting_time(start_time, end_time, time_unit)
|
|
@@ -84,124 +87,86 @@ class ServiceDataView(View):
|
|
# 订单数量统计
|
|
# 订单数量统计
|
|
order_list = []
|
|
order_list = []
|
|
for item in time_list:
|
|
for item in time_list:
|
|
- order_temp_qs = order_qs.filter(addTime__range=item)
|
|
|
|
|
|
+ order_temp_qs = order_qs.filter(time__gte=item[0], time__lt=item[1])
|
|
|
|
+ temp_count = order_temp_qs.aggregate(count=Sum('count'))['count']
|
|
|
|
+ temp_count = temp_count if temp_count else 0
|
|
order_dict = {
|
|
order_dict = {
|
|
- 'count': order_temp_qs.count(),
|
|
|
|
|
|
+ 'count': temp_count,
|
|
'startTime': item[0],
|
|
'startTime': item[0],
|
|
'endTime': item[1]
|
|
'endTime': item[1]
|
|
}
|
|
}
|
|
order_list.append(order_dict)
|
|
order_list.append(order_dict)
|
|
|
|
|
|
|
|
+ device_type_dict = {}
|
|
|
|
+ country_dict = {}
|
|
|
|
+ store_meal_dict = {}
|
|
|
|
+ for each in order_qs:
|
|
|
|
+ device_type_temp_dict = eval(each['device_type'])
|
|
|
|
+ country_temp_dict = eval(each['country'])
|
|
|
|
+ store_meal_temp_dict = eval(each['store_meal'])
|
|
|
|
+ for k, v in device_type_temp_dict.items():
|
|
|
|
+ if k in device_type_dict:
|
|
|
|
+ device_type_dict[k]['数量'] += v['数量']
|
|
|
|
+ device_type_dict[k]['销售额'] = str(round(float(device_type_dict[k]['销售额']) + float(v['销售额']), 2))
|
|
|
|
+ else:
|
|
|
|
+ device_type_dict[k] = v
|
|
|
|
+ for k, v in country_temp_dict.items():
|
|
|
|
+ if k in country_dict:
|
|
|
|
+ country_dict[k] += v
|
|
|
|
+ else:
|
|
|
|
+ country_dict[k] = v
|
|
|
|
+ for k, v in store_meal_temp_dict.items():
|
|
|
|
+ if k in store_meal_dict:
|
|
|
|
+ store_meal_dict[k]['数量'] += v['数量']
|
|
|
|
+ store_meal_dict[k]['销售额'] = str(
|
|
|
|
+ round(float(store_meal_dict[k]['销售额']) + float(v['销售额']), 2))
|
|
|
|
+ else:
|
|
|
|
+ store_meal_dict[k] = v
|
|
# 设备类型订单统计
|
|
# 设备类型订单统计
|
|
device_type_list = []
|
|
device_type_list = []
|
|
- device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
|
|
|
|
- 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'])
|
|
|
|
- for k, v in uid_type_dict.items():
|
|
|
|
- type_qs = DeviceTypeModel.objects.filter(type=k).values('name')
|
|
|
|
- type_name = type_qs[0]['name'] if type_qs.exists() else '未知类型'
|
|
|
|
- device_count = order_qs.filter(UID__in=v).count()
|
|
|
|
- if count:
|
|
|
|
- type_rate = round(device_count / count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- type_rate = 0
|
|
|
|
- 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': device_count,
|
|
|
|
|
|
+ for k, v in device_type_dict.items():
|
|
|
|
+ type_rate = round(v['数量'] / all_order_count * 100, 2) if all_order_count else 0
|
|
|
|
+ total_rate = round(float(v['销售额']) / all_order_total * 100, 2) if all_order_total else 0
|
|
|
|
+ device_temp_dict = {
|
|
|
|
+ 'typeName': k,
|
|
|
|
+ 'count': v['数量'],
|
|
'typeRate': type_rate,
|
|
'typeRate': type_rate,
|
|
- 'totalMoney': temp_total,
|
|
|
|
|
|
+ 'totalMoney': v['销售额'],
|
|
'totalRate': total_rate
|
|
'totalRate': total_rate
|
|
}
|
|
}
|
|
- device_type_list.append(device_temp_qs)
|
|
|
|
|
|
+ device_type_list.append(device_temp_dict)
|
|
|
|
|
|
# 区域订单统计
|
|
# 区域订单统计
|
|
region_list = []
|
|
region_list = []
|
|
- region_dict = {}
|
|
|
|
- for item in uid_list:
|
|
|
|
- uidset_qs = UidSetModel.objects.filter(uid=item).values('tb_country')
|
|
|
|
- if uidset_qs.exists():
|
|
|
|
- country_qs = CountryModel.objects.filter(id=uidset_qs[0]['tb_country']).values('country_name')
|
|
|
|
- country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
|
|
|
|
- else:
|
|
|
|
- country_name = '未知区域'
|
|
|
|
- if country_name not in region_dict:
|
|
|
|
- region_dict[country_name] = []
|
|
|
|
- region_dict[country_name].append(item)
|
|
|
|
- for k, v in region_dict.items():
|
|
|
|
- region_order_count = order_qs.filter(UID__in=v).count()
|
|
|
|
- if count:
|
|
|
|
- rate = round(region_order_count / count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- rate = 0
|
|
|
|
|
|
+ for k, v in country_dict.items():
|
|
|
|
+ rate = round(v / all_order_count * 100, 2) if all_order_count else 0
|
|
region_temp_dict = {
|
|
region_temp_dict = {
|
|
'countryName': k,
|
|
'countryName': k,
|
|
- 'count': region_order_count,
|
|
|
|
|
|
+ 'count': v,
|
|
'rate': rate
|
|
'rate': rate
|
|
}
|
|
}
|
|
region_list.append(region_temp_dict)
|
|
region_list.append(region_temp_dict)
|
|
|
|
|
|
# 套餐订单统计
|
|
# 套餐订单统计
|
|
store_meal_list = []
|
|
store_meal_list = []
|
|
- 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 '未知套餐'
|
|
|
|
- store_meal_total = order_qs.filter(rank=store_meal_id).aggregate(total=Sum('price'))['total']
|
|
|
|
- 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 '未知套餐'
|
|
|
|
- store_meal_total = order_qs.filter(ai_rank=store_meal_id).aggregate(total=Sum('price'))[
|
|
|
|
- 'total']
|
|
|
|
- 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 '未知套餐'
|
|
|
|
- store_meal_total = order_qs.filter(unify_combo_id=store_meal_id).aggregate(total=Sum('price'))[
|
|
|
|
- 'total']
|
|
|
|
- total_rate = round(store_meal_total / total * 100, 2)
|
|
|
|
- if count:
|
|
|
|
- rate = round(item['count'] / count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- rate = 0
|
|
|
|
- store_meal_dict = {
|
|
|
|
- 'storeMealId': store_meal_id,
|
|
|
|
- 'count': item['count'],
|
|
|
|
- 'storeMealName': store_meal_name,
|
|
|
|
- 'storeMealTotal': store_meal_total,
|
|
|
|
|
|
+ for k, v in store_meal_dict.items():
|
|
|
|
+ total_rate = round(float(v['销售额']) / all_order_total * 100, 2) if all_order_total else 0
|
|
|
|
+ count_rate = round(v['数量'] / all_order_count * 100, 2) if all_order_count else 0
|
|
|
|
+ store_temp_dict = {
|
|
|
|
+ 'count': v['数量'],
|
|
|
|
+ 'storeMealName': k,
|
|
|
|
+ 'storeMealTotal': v['销售额'],
|
|
'totalRate': total_rate,
|
|
'totalRate': total_rate,
|
|
- 'rate': rate
|
|
|
|
|
|
+ 'rate': count_rate
|
|
}
|
|
}
|
|
- store_meal_list.append(store_meal_dict)
|
|
|
|
|
|
+ store_meal_list.append(store_temp_dict)
|
|
res = {
|
|
res = {
|
|
'orders': order_list,
|
|
'orders': order_list,
|
|
'regions': region_list,
|
|
'regions': region_list,
|
|
'deviceType': device_type_list,
|
|
'deviceType': device_type_list,
|
|
'storeMeal': store_meal_list,
|
|
'storeMeal': store_meal_list,
|
|
|
|
+ 'allOrderCount': all_order_count,
|
|
|
|
+ 'allOrderTotal': all_order_total
|
|
}
|
|
}
|
|
return response.json(0, res)
|
|
return response.json(0, res)
|
|
except Exception as e:
|
|
except Exception as e:
|
|
@@ -227,87 +192,79 @@ class ServiceDataView(View):
|
|
return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
|
|
return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
|
|
try:
|
|
try:
|
|
store_meal_type = int(store_meal_type)
|
|
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))
|
|
|
|
|
|
+ order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=1,
|
|
|
|
+ service_type=store_meal_type).values('count', 'country',
|
|
|
|
+ 'device_type')
|
|
|
|
+ free_order_count = order_qs.aggregate(count=Sum('count'))['count']
|
|
|
|
+ free_order_count = free_order_count if free_order_count else 0 # 免费订单数量
|
|
|
|
+ all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
|
|
|
|
+ Q(query_type=0) | Q(query_type=1)).aggregate(count=Sum('count'))
|
|
|
|
+ all_order_count = all_order_qs['count'] # 所有订单数量
|
|
|
|
+ device_qs = DeviceInfoSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=0).values(
|
|
|
|
+ 'vod_service', 'ai_service', 'unicom_service')
|
|
|
|
+ new_device_count = 0 # 销售设备数量
|
|
start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
time_list = CommonService.cutting_time(start_time, end_time, time_unit)
|
|
time_list = CommonService.cutting_time(start_time, end_time, time_unit)
|
|
# 转化率
|
|
# 转化率
|
|
- if store_meal_type == 0:
|
|
|
|
- uidset_count = uidset_qs.filter(~Q(cloud_vod=2)).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()
|
|
|
|
- order_device_count = order_qs.values('UID').distinct().order_by('UID').count()
|
|
|
|
- if uidset_count:
|
|
|
|
- inversion_rate = round(order_device_count / uidset_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- inversion_rate = 0
|
|
|
|
|
|
+ for item in device_qs:
|
|
|
|
+ if store_meal_type == 0:
|
|
|
|
+ service = eval(item['vod_service'])
|
|
|
|
+ elif store_meal_type == 1:
|
|
|
|
+ service = eval(item['ai_service'])
|
|
|
|
+ else:
|
|
|
|
+ service = eval(item['unicom_service'])
|
|
|
|
+ for each in service.values():
|
|
|
|
+ new_device_count += each
|
|
|
|
+ inversion_rate = round(free_order_count / new_device_count * 100, 2) if new_device_count else 0
|
|
# 订单数量统计
|
|
# 订单数量统计
|
|
order_list = []
|
|
order_list = []
|
|
|
|
+
|
|
for item in time_list:
|
|
for item in time_list:
|
|
- order_temp_qs = order_qs.filter(addTime__range=item)
|
|
|
|
|
|
+ order_temp_qs = order_qs.filter(time__gte=item[0], time__lt=item[1])
|
|
|
|
+ temp_count = order_temp_qs.aggregate(count=Sum('count'))['count']
|
|
|
|
+ temp_count = temp_count if temp_count else 0
|
|
order_dict = {
|
|
order_dict = {
|
|
- 'count': order_temp_qs.count(),
|
|
|
|
|
|
+ 'count': temp_count,
|
|
'startTime': item[0],
|
|
'startTime': item[0],
|
|
'endTime': item[1]
|
|
'endTime': item[1]
|
|
}
|
|
}
|
|
order_list.append(order_dict)
|
|
order_list.append(order_dict)
|
|
|
|
|
|
|
|
+ device_type_dict = {}
|
|
|
|
+ country_dict = {}
|
|
|
|
+ for each in order_qs:
|
|
|
|
+ device_type_temp_dict = eval(each['device_type'])
|
|
|
|
+ for k, v in device_type_temp_dict.items():
|
|
|
|
+ if k in device_type_dict:
|
|
|
|
+ device_type_dict[k] += v
|
|
|
|
+ else:
|
|
|
|
+ device_type_dict[k] = v
|
|
|
|
+ country_temp_dict = eval(each['country'])
|
|
|
|
+ for k, v in country_temp_dict.items():
|
|
|
|
+ if k in country_dict:
|
|
|
|
+ country_dict[k] += v
|
|
|
|
+ else:
|
|
|
|
+ country_dict[k] = v
|
|
|
|
+
|
|
# 设备类型订单统计
|
|
# 设备类型订单统计
|
|
device_type_list = []
|
|
device_type_list = []
|
|
- device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
|
|
|
|
- uid_dict = {}
|
|
|
|
- uid_list = []
|
|
|
|
- for item in device_type_qs:
|
|
|
|
- uid_list.append(item['UID'])
|
|
|
|
- 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_qs = DeviceTypeModel.objects.filter(type=k).values('name')
|
|
|
|
- type_name = type_qs[0]['name'] if type_qs.exists() else '未知类型'
|
|
|
|
- device_count = order_qs.filter(UID__in=v).count()
|
|
|
|
- if count:
|
|
|
|
- type_rate = round(device_count / count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- type_rate = 0
|
|
|
|
|
|
+ for k, v in device_type_dict.items():
|
|
|
|
+ type_rate = round(v / all_order_count * 100, 2) if all_order_count else 0
|
|
device_temp_qs = {
|
|
device_temp_qs = {
|
|
- 'typeName': type_name,
|
|
|
|
- 'count': device_count,
|
|
|
|
|
|
+ 'typeName': k,
|
|
|
|
+ 'count': v,
|
|
'typeRate': type_rate,
|
|
'typeRate': type_rate,
|
|
}
|
|
}
|
|
device_type_list.append(device_temp_qs)
|
|
device_type_list.append(device_temp_qs)
|
|
|
|
|
|
# 区域订单统计
|
|
# 区域订单统计
|
|
region_list = []
|
|
region_list = []
|
|
- region_dict = {}
|
|
|
|
- for item in uid_list:
|
|
|
|
- uidset_qs = UidSetModel.objects.filter(uid=item).values('tb_country')
|
|
|
|
- if uidset_qs.exists():
|
|
|
|
- country_qs = CountryModel.objects.filter(id=uidset_qs[0]['tb_country']).values('country_name')
|
|
|
|
- country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
|
|
|
|
- else:
|
|
|
|
- country_name = '未知区域'
|
|
|
|
- if country_name not in region_dict:
|
|
|
|
- region_dict[country_name] = []
|
|
|
|
- region_dict[country_name].append(item)
|
|
|
|
- for k, v in region_dict.items():
|
|
|
|
- region_order_count = order_qs.filter(UID__in=v).count()
|
|
|
|
- if count:
|
|
|
|
- rate = round(region_order_count / count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- rate = 0
|
|
|
|
|
|
+ for k, v in country_dict.items():
|
|
|
|
+ rate = round(v / all_order_count * 100, 2) if all_order_count else 0
|
|
region_temp_dict = {
|
|
region_temp_dict = {
|
|
'countryName': k,
|
|
'countryName': k,
|
|
- 'count': region_order_count,
|
|
|
|
|
|
+ 'count': v,
|
|
'rate': rate
|
|
'rate': rate
|
|
}
|
|
}
|
|
region_list.append(region_temp_dict)
|
|
region_list.append(region_temp_dict)
|
|
@@ -317,8 +274,8 @@ class ServiceDataView(View):
|
|
'regions': region_list,
|
|
'regions': region_list,
|
|
'deviceType': device_type_list,
|
|
'deviceType': device_type_list,
|
|
'inversionRate': inversion_rate,
|
|
'inversionRate': inversion_rate,
|
|
- 'newDeviceCount': uidset_count,
|
|
|
|
- 'orderDeviceCount': order_device_count
|
|
|
|
|
|
+ 'newDeviceCount': new_device_count,
|
|
|
|
+ 'allOrderCount': all_order_count
|
|
}
|
|
}
|
|
return response.json(0, res)
|
|
return response.json(0, res)
|
|
except Exception as e:
|
|
except Exception as e:
|
|
@@ -343,17 +300,12 @@ class ServiceDataView(View):
|
|
if not all([start_time, end_time, time_unit, store_meal_type]):
|
|
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'})
|
|
return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
|
|
try:
|
|
try:
|
|
- order_gte_start_time_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
|
|
|
|
- addTime__lte=start_time).filter(
|
|
|
|
- ~Q(price='0.00') & ~Q(price='0'))
|
|
|
|
- uid_list = []
|
|
|
|
- for item in order_gte_start_time_qs:
|
|
|
|
- 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(price='0'))
|
|
|
|
- count = order_qs.count()
|
|
|
|
|
|
+ order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=2,
|
|
|
|
+ service_type=store_meal_type).values('count', 'country',
|
|
|
|
+ 'device_type')
|
|
|
|
+ all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
|
|
|
|
+ Q(query_type=0) | Q(query_type=1)).aggregate(count=Sum('count'))
|
|
|
|
+ all_order_count = all_order_qs['count'] # 所有订单数量
|
|
start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
time_list = CommonService.cutting_time(start_time, end_time, time_unit)
|
|
time_list = CommonService.cutting_time(start_time, end_time, time_unit)
|
|
@@ -361,63 +313,50 @@ class ServiceDataView(View):
|
|
# 订单数量统计
|
|
# 订单数量统计
|
|
order_list = []
|
|
order_list = []
|
|
for item in time_list:
|
|
for item in time_list:
|
|
- order_temp_qs = order_qs.filter(addTime__range=item)
|
|
|
|
|
|
+ order_temp_qs = order_qs.filter(time__gte=item[0], time__lt=item[1])
|
|
|
|
+ temp_count = order_temp_qs.aggregate(count=Sum('count'))['count']
|
|
|
|
+ temp_count = temp_count if temp_count else 0
|
|
order_dict = {
|
|
order_dict = {
|
|
- 'count': order_temp_qs.count(),
|
|
|
|
|
|
+ 'count': temp_count,
|
|
'startTime': item[0],
|
|
'startTime': item[0],
|
|
'endTime': item[1]
|
|
'endTime': item[1]
|
|
}
|
|
}
|
|
order_list.append(order_dict)
|
|
order_list.append(order_dict)
|
|
|
|
|
|
|
|
+ country_dict = {}
|
|
|
|
+ device_type_dict = {}
|
|
|
|
+ for each in order_qs:
|
|
|
|
+ country_temp_dict = eval(each['country'])
|
|
|
|
+ device_type_temp_dict = eval(each['device_type'])
|
|
|
|
+ for k, v in country_temp_dict.items():
|
|
|
|
+ if k in country_dict:
|
|
|
|
+ country_dict[k] += v
|
|
|
|
+ else:
|
|
|
|
+ country_dict[k] = v
|
|
|
|
+ for k, v in device_type_temp_dict.items():
|
|
|
|
+ if k in device_type_dict:
|
|
|
|
+ device_type_dict[k] += v
|
|
|
|
+ else:
|
|
|
|
+ device_type_dict[k] = v
|
|
|
|
+
|
|
# 设备类型订单统计
|
|
# 设备类型订单统计
|
|
device_type_list = []
|
|
device_type_list = []
|
|
- device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
|
|
|
|
- uid_dict = {}
|
|
|
|
- uid_list = []
|
|
|
|
- for item in device_type_qs:
|
|
|
|
- uid_list.append(item['UID'])
|
|
|
|
- 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_qs = DeviceTypeModel.objects.filter(type=k).values('name')
|
|
|
|
- type_name = type_qs[0]['name'] if type_qs.exists() else '未知类型'
|
|
|
|
- device_count = order_qs.filter(UID__in=v).count()
|
|
|
|
- if count:
|
|
|
|
- type_rate = round(device_count / count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- type_rate = 0
|
|
|
|
|
|
+ for k, v in device_type_dict.items():
|
|
|
|
+ type_rate = round(v / all_order_count * 100, 2) if all_order_count else 0
|
|
device_temp_qs = {
|
|
device_temp_qs = {
|
|
- 'typeName': type_name,
|
|
|
|
- 'count': device_count,
|
|
|
|
|
|
+ 'typeName': k,
|
|
|
|
+ 'count': v,
|
|
'typeRate': type_rate,
|
|
'typeRate': type_rate,
|
|
}
|
|
}
|
|
device_type_list.append(device_temp_qs)
|
|
device_type_list.append(device_temp_qs)
|
|
|
|
|
|
# 区域订单统计
|
|
# 区域订单统计
|
|
region_list = []
|
|
region_list = []
|
|
- region_dict = {}
|
|
|
|
- for item in uid_list:
|
|
|
|
- uidset_qs = UidSetModel.objects.filter(uid=item).values('tb_country')
|
|
|
|
- if uidset_qs.exists():
|
|
|
|
- country_qs = CountryModel.objects.filter(id=uidset_qs[0]['tb_country']).values('country_name')
|
|
|
|
- country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
|
|
|
|
- else:
|
|
|
|
- country_name = '未知区域'
|
|
|
|
- if country_name not in region_dict:
|
|
|
|
- region_dict[country_name] = []
|
|
|
|
- region_dict[country_name].append(item)
|
|
|
|
- for k, v in region_dict.items():
|
|
|
|
- region_order_count = order_qs.filter(UID__in=v).count()
|
|
|
|
- if count:
|
|
|
|
- rate = round(region_order_count / count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- rate = 0
|
|
|
|
|
|
+ for k, v in country_dict.items():
|
|
|
|
+ rate = round(v / all_order_count * 100, 2) if all_order_count else 0
|
|
region_temp_dict = {
|
|
region_temp_dict = {
|
|
'countryName': k,
|
|
'countryName': k,
|
|
- 'count': region_order_count,
|
|
|
|
|
|
+ 'count': v,
|
|
'rate': rate
|
|
'rate': rate
|
|
}
|
|
}
|
|
region_list.append(region_temp_dict)
|
|
region_list.append(region_temp_dict)
|
|
@@ -426,8 +365,8 @@ class ServiceDataView(View):
|
|
'orders': order_list,
|
|
'orders': order_list,
|
|
'regions': region_list,
|
|
'regions': region_list,
|
|
'deviceType': device_type_list,
|
|
'deviceType': device_type_list,
|
|
|
|
+ 'allOrderCount': all_order_count
|
|
}
|
|
}
|
|
-
|
|
|
|
return response.json(0, res)
|
|
return response.json(0, res)
|
|
except Exception as e:
|
|
except Exception as e:
|
|
return response.json(500, repr(e))
|
|
return response.json(500, repr(e))
|
|
@@ -451,90 +390,66 @@ class ServiceDataView(View):
|
|
if not all([start_time, end_time, time_unit, store_meal_type]):
|
|
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'})
|
|
return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
|
|
try:
|
|
try:
|
|
- order_gte_start_time_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
|
|
|
|
- addTime__lte=start_time).filter(
|
|
|
|
- ~Q(price='0.00') & ~Q(price='0'))
|
|
|
|
- uid_list = []
|
|
|
|
- for item in order_gte_start_time_qs:
|
|
|
|
- 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(UID__in=uid_list))
|
|
|
|
- total = order_gte_start_time_qs.count()
|
|
|
|
|
|
+ order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=3,
|
|
|
|
+ service_type=store_meal_type).values('count', 'country',
|
|
|
|
+ 'device_type')
|
|
|
|
+ repeat_pay_order_count = order_qs.aggregate(count=Sum('count'))['count']
|
|
|
|
+ repeat_pay_order_count = repeat_pay_order_count if repeat_pay_order_count else 0
|
|
|
|
+ all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
|
|
|
|
+ Q(query_type=0) | Q(query_type=1)).aggregate(count=Sum('count'))
|
|
|
|
+ all_order_count = all_order_qs['count'] # 所有订单数量
|
|
|
|
|
|
# 订单复购率
|
|
# 订单复购率
|
|
- count = order_qs.count()
|
|
|
|
- if total:
|
|
|
|
- repeat_rate = round(count / total * 100, 2)
|
|
|
|
- else:
|
|
|
|
- repeat_rate = 0
|
|
|
|
-
|
|
|
|
|
|
+ repeat_rate = round(repeat_pay_order_count / all_order_count * 100, 2) if all_order_count else 0
|
|
start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
start_time = datetime.datetime.fromtimestamp(int(start_time))
|
|
end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
end_time = datetime.datetime.fromtimestamp(int(end_time))
|
|
time_list = CommonService.cutting_time(start_time, end_time, time_unit)
|
|
time_list = CommonService.cutting_time(start_time, end_time, time_unit)
|
|
# 订单数量统计
|
|
# 订单数量统计
|
|
order_list = []
|
|
order_list = []
|
|
for item in time_list:
|
|
for item in time_list:
|
|
- order_temp_qs = order_qs.filter(addTime__range=item)
|
|
|
|
|
|
+ order_temp_qs = order_qs.filter(time__gte=item[0], time__lt=item[1])
|
|
|
|
+ temp_count = order_temp_qs.aggregate(count=Sum('count'))['count']
|
|
|
|
+ temp_count = temp_count if temp_count else 0
|
|
order_dict = {
|
|
order_dict = {
|
|
- 'count': order_temp_qs.count(),
|
|
|
|
|
|
+ 'count': temp_count,
|
|
'startTime': item[0],
|
|
'startTime': item[0],
|
|
'endTime': item[1]
|
|
'endTime': item[1]
|
|
}
|
|
}
|
|
order_list.append(order_dict)
|
|
order_list.append(order_dict)
|
|
|
|
+ device_type_dict = {}
|
|
|
|
+ country_dict = {}
|
|
|
|
+ for each in order_qs:
|
|
|
|
+ country_temp_dict = eval(each['country'])
|
|
|
|
+ device_type_temp_dict = eval(each['device_type'])
|
|
|
|
+ for k, v in country_temp_dict.items():
|
|
|
|
+ if k in country_dict:
|
|
|
|
+ country_dict[k] += v
|
|
|
|
+ else:
|
|
|
|
+ country_dict[k] = v
|
|
|
|
+ for k, v in device_type_temp_dict.items():
|
|
|
|
+ if k in device_type_dict:
|
|
|
|
+ device_type_dict[k] += v
|
|
|
|
+ else:
|
|
|
|
+ device_type_dict[k] = v
|
|
|
|
|
|
# 设备类型订单统计
|
|
# 设备类型订单统计
|
|
device_type_list = []
|
|
device_type_list = []
|
|
- device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
|
|
|
|
- uid_dict = {}
|
|
|
|
- uid_list = []
|
|
|
|
- for item in device_type_qs:
|
|
|
|
- uid_list.append(item['UID'])
|
|
|
|
- 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_qs = DeviceTypeModel.objects.filter(type=k).values('name')
|
|
|
|
- type_name = type_qs[0]['name'] if type_qs.exists() else '未知类型'
|
|
|
|
- device_count = order_qs.filter(UID__in=v).count()
|
|
|
|
- if count:
|
|
|
|
- if count:
|
|
|
|
- type_rate = round(device_count / count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- type_rate = 0
|
|
|
|
- else:
|
|
|
|
- type_rate = 0
|
|
|
|
|
|
+ for k, v in device_type_dict.items():
|
|
|
|
+ type_rate = round(v / all_order_count * 100, 2) if all_order_count else 0
|
|
device_temp_qs = {
|
|
device_temp_qs = {
|
|
- 'typeName': type_name,
|
|
|
|
- 'count': device_count,
|
|
|
|
|
|
+ 'typeName': k,
|
|
|
|
+ 'count': v,
|
|
'typeRate': type_rate,
|
|
'typeRate': type_rate,
|
|
}
|
|
}
|
|
device_type_list.append(device_temp_qs)
|
|
device_type_list.append(device_temp_qs)
|
|
|
|
|
|
# 区域订单统计
|
|
# 区域订单统计
|
|
region_list = []
|
|
region_list = []
|
|
- region_dict = {}
|
|
|
|
- for item in uid_list:
|
|
|
|
- uidset_qs = UidSetModel.objects.filter(uid=item).values('tb_country')
|
|
|
|
- if uidset_qs.exists():
|
|
|
|
- country_qs = CountryModel.objects.filter(id=uidset_qs[0]['tb_country']).values('country_name')
|
|
|
|
- country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
|
|
|
|
- else:
|
|
|
|
- country_name = '未知区域'
|
|
|
|
- if country_name not in region_dict:
|
|
|
|
- region_dict[country_name] = []
|
|
|
|
- region_dict[country_name].append(item)
|
|
|
|
- for k, v in region_dict.items():
|
|
|
|
- region_order_count = order_qs.filter(UID__in=v).count()
|
|
|
|
- if count:
|
|
|
|
- rate = round(region_order_count / count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- rate = 0
|
|
|
|
|
|
+ for k, v in country_dict.items():
|
|
|
|
+ rate = round(v / all_order_count * 100, 2) if all_order_count else 0
|
|
region_temp_dict = {
|
|
region_temp_dict = {
|
|
'countryName': k,
|
|
'countryName': k,
|
|
- 'count': region_order_count,
|
|
|
|
|
|
+ 'count': v,
|
|
'rate': rate
|
|
'rate': rate
|
|
}
|
|
}
|
|
region_list.append(region_temp_dict)
|
|
region_list.append(region_temp_dict)
|
|
@@ -543,8 +458,8 @@ class ServiceDataView(View):
|
|
'regions': region_list,
|
|
'regions': region_list,
|
|
'deviceType': device_type_list,
|
|
'deviceType': device_type_list,
|
|
'repeatRate': repeat_rate,
|
|
'repeatRate': repeat_rate,
|
|
- 'repeatCount': count,
|
|
|
|
- 'orderCount': total
|
|
|
|
|
|
+ 'repeatOrderCount': repeat_pay_order_count,
|
|
|
|
+ 'allOrderCount': all_order_count
|
|
}
|
|
}
|
|
return response.json(0, res)
|
|
return response.json(0, res)
|
|
except Exception as e:
|
|
except Exception as e:
|
|
@@ -566,12 +481,10 @@ class ServiceDataView(View):
|
|
}
|
|
}
|
|
order_list = []
|
|
order_list = []
|
|
region_list = []
|
|
region_list = []
|
|
- region_count = 0
|
|
|
|
device_type_list = []
|
|
device_type_list = []
|
|
- device_type_count = 0
|
|
|
|
- total = 0
|
|
|
|
|
|
+ all_order_count = 0
|
|
|
|
+ all_order_total = 0
|
|
store_meal_list = []
|
|
store_meal_list = []
|
|
- store_meal_count = 0
|
|
|
|
for url in url_list:
|
|
for url in url_list:
|
|
url = url + request.path.replace('global/', '')
|
|
url = url + request.path.replace('global/', '')
|
|
res = requests.get(url=url, params=request_dict, headers=headers)
|
|
res = requests.get(url=url, params=request_dict, headers=headers)
|
|
@@ -593,18 +506,11 @@ class ServiceDataView(View):
|
|
for each in region_list:
|
|
for each in region_list:
|
|
if each['countryName'] == item['countryName']:
|
|
if each['countryName'] == item['countryName']:
|
|
each['count'] += int(item['count'])
|
|
each['count'] += int(item['count'])
|
|
- region_count += int(item['count'])
|
|
|
|
flag = 1
|
|
flag = 1
|
|
break
|
|
break
|
|
if flag == 0:
|
|
if flag == 0:
|
|
region_list.append(item)
|
|
region_list.append(item)
|
|
- region_count += int(item['count'])
|
|
|
|
- for item in region_list:
|
|
|
|
- if region_count:
|
|
|
|
- rate = round(item['count'] / region_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- rate = 0
|
|
|
|
- item['rate'] = rate
|
|
|
|
|
|
+
|
|
# 处理设备类型
|
|
# 处理设备类型
|
|
for item in result['result']['deviceType']:
|
|
for item in result['result']['deviceType']:
|
|
flag = 0
|
|
flag = 0
|
|
@@ -612,45 +518,35 @@ class ServiceDataView(View):
|
|
if each['typeName'] == item['typeName']:
|
|
if each['typeName'] == item['typeName']:
|
|
each['count'] += int(item['count'])
|
|
each['count'] += int(item['count'])
|
|
item['totalMoney'] += item['totalMoney']
|
|
item['totalMoney'] += item['totalMoney']
|
|
- device_type_count += int(item['count'])
|
|
|
|
- total += item['totalMoney']
|
|
|
|
flag = 1
|
|
flag = 1
|
|
break
|
|
break
|
|
if flag == 0:
|
|
if flag == 0:
|
|
device_type_list.append(item)
|
|
device_type_list.append(item)
|
|
- device_type_count += int(item['count'])
|
|
|
|
- total += item['totalMoney']
|
|
|
|
- for item in device_type_list:
|
|
|
|
- if device_type_count:
|
|
|
|
- type_rate = round(item['count'] / device_type_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- type_rate = 0
|
|
|
|
- total_rate = round(item['totalMoney'] / total * 100, 2)
|
|
|
|
- item['typeRate'] = type_rate
|
|
|
|
- item['totalRate'] = total_rate
|
|
|
|
|
|
+
|
|
# 处理套餐
|
|
# 处理套餐
|
|
for item in result['result']['storeMeal']:
|
|
for item in result['result']['storeMeal']:
|
|
flag = 0
|
|
flag = 0
|
|
for each in store_meal_list:
|
|
for each in store_meal_list:
|
|
- if each['storeMealId'] == item['storeMealId']:
|
|
|
|
|
|
+ if each['storeMealName'] == item['storeMealName']:
|
|
each['count'] += int(item['count'])
|
|
each['count'] += int(item['count'])
|
|
each['storeMealTotal'] += item['storeMealTotal']
|
|
each['storeMealTotal'] += item['storeMealTotal']
|
|
- store_meal_count += int(item['count'])
|
|
|
|
flag = 1
|
|
flag = 1
|
|
break
|
|
break
|
|
if flag == 0:
|
|
if flag == 0:
|
|
store_meal_list.append(item)
|
|
store_meal_list.append(item)
|
|
- store_meal_count += int(item['count'])
|
|
|
|
- for item in store_meal_list:
|
|
|
|
- total_rate = round(item['storeMealTotal'] / total * 100, 2)
|
|
|
|
- if store_meal_count:
|
|
|
|
- rate = round(item['count'] / store_meal_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- rate = 0
|
|
|
|
- item['rate'] = rate
|
|
|
|
- item['totalRate'] = total_rate
|
|
|
|
|
|
+
|
|
|
|
+ all_order_total += result['result']['allOrderTotal']
|
|
|
|
+ all_order_count += result['result']['allOrderCount']
|
|
else:
|
|
else:
|
|
return response.json(result['result_code'], result['result'])
|
|
return response.json(result['result_code'], result['result'])
|
|
|
|
+ for item in region_list:
|
|
|
|
+ item['rate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
|
|
|
|
+ for item in device_type_list:
|
|
|
|
+ item['typeRate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
|
|
|
|
+ item['totalRate'] = round(item['totalMoney'] / all_order_total * 100, 2) if all_order_total else 0
|
|
|
|
+ for item in store_meal_list:
|
|
|
|
+ item['totalRate'] = round(item['storeMealTotal'] / all_order_total * 100, 2) if all_order_total else 0
|
|
|
|
+ item['rate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
|
|
res = {
|
|
res = {
|
|
'orders': order_list,
|
|
'orders': order_list,
|
|
'regions': CommonService.list_sort(region_list),
|
|
'regions': CommonService.list_sort(region_list),
|
|
@@ -677,11 +573,10 @@ class ServiceDataView(View):
|
|
}
|
|
}
|
|
order_list = []
|
|
order_list = []
|
|
region_list = []
|
|
region_list = []
|
|
- region_count = 0
|
|
|
|
|
|
+ free_order_count = 0
|
|
device_type_list = []
|
|
device_type_list = []
|
|
- device_type_count = 0
|
|
|
|
new_device_count = 0
|
|
new_device_count = 0
|
|
- order_device_count = 0
|
|
|
|
|
|
+ all_order_count = 0
|
|
for url in url_list:
|
|
for url in url_list:
|
|
url = url + request.path.replace('global/', '')
|
|
url = url + request.path.replace('global/', '')
|
|
res = requests.get(url=url, params=request_dict, headers=headers)
|
|
res = requests.get(url=url, params=request_dict, headers=headers)
|
|
@@ -703,51 +598,40 @@ class ServiceDataView(View):
|
|
for each in region_list:
|
|
for each in region_list:
|
|
if each['countryName'] == item['countryName']:
|
|
if each['countryName'] == item['countryName']:
|
|
each['count'] += int(item['count'])
|
|
each['count'] += int(item['count'])
|
|
- region_count += int(item['count'])
|
|
|
|
|
|
+ free_order_count += int(item['count'])
|
|
flag = 1
|
|
flag = 1
|
|
break
|
|
break
|
|
if flag == 0:
|
|
if flag == 0:
|
|
region_list.append(item)
|
|
region_list.append(item)
|
|
- region_count += int(item['count'])
|
|
|
|
- for item in region_list:
|
|
|
|
- if region_count:
|
|
|
|
- rate = round(item['count'] / region_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- rate = 0
|
|
|
|
- item['rate'] = rate
|
|
|
|
|
|
+ free_order_count += int(item['count'])
|
|
|
|
+
|
|
# 处理设备类型
|
|
# 处理设备类型
|
|
for item in result['result']['deviceType']:
|
|
for item in result['result']['deviceType']:
|
|
flag = 0
|
|
flag = 0
|
|
for each in device_type_list:
|
|
for each in device_type_list:
|
|
if each['typeName'] == item['typeName']:
|
|
if each['typeName'] == item['typeName']:
|
|
each['count'] += int(item['count'])
|
|
each['count'] += int(item['count'])
|
|
- device_type_count += int(item['count'])
|
|
|
|
flag = 1
|
|
flag = 1
|
|
break
|
|
break
|
|
if flag == 0:
|
|
if flag == 0:
|
|
device_type_list.append(item)
|
|
device_type_list.append(item)
|
|
- device_type_count += int(item['count'])
|
|
|
|
- for item in device_type_list:
|
|
|
|
- if device_type_count:
|
|
|
|
- type_rate = round(item['count'] / device_type_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- type_rate = 0
|
|
|
|
- item['typeRate'] = type_rate
|
|
|
|
|
|
+
|
|
# 处理转化率
|
|
# 处理转化率
|
|
new_device_count += int(result['result']['newDeviceCount'])
|
|
new_device_count += int(result['result']['newDeviceCount'])
|
|
- order_device_count += int(result['result']['orderDeviceCount'])
|
|
|
|
|
|
+ all_order_count += int(result['result']['allOrderCount'])
|
|
else:
|
|
else:
|
|
return response.json(result['result_code'], result['result'])
|
|
return response.json(result['result_code'], result['result'])
|
|
- if new_device_count:
|
|
|
|
- inversion_rate = round(order_device_count / new_device_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- inversion_rate = 0
|
|
|
|
|
|
+ inversion_rate = round(free_order_count / new_device_count * 100, 2) if new_device_count else 0
|
|
|
|
+ for item in region_list:
|
|
|
|
+ item['rate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
|
|
|
|
+ for item in device_type_list:
|
|
|
|
+ item['typeRate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
|
|
res = {
|
|
res = {
|
|
'orders': order_list,
|
|
'orders': order_list,
|
|
'regions': CommonService.list_sort(region_list),
|
|
'regions': CommonService.list_sort(region_list),
|
|
'deviceType': CommonService.list_sort(device_type_list),
|
|
'deviceType': CommonService.list_sort(device_type_list),
|
|
'newDeviceCount': new_device_count,
|
|
'newDeviceCount': new_device_count,
|
|
- 'orderDeviceCount': order_device_count,
|
|
|
|
|
|
+ 'allOrderCount': all_order_count,
|
|
'inversionRate': inversion_rate
|
|
'inversionRate': inversion_rate
|
|
}
|
|
}
|
|
return response.json(0, res)
|
|
return response.json(0, res)
|
|
@@ -770,9 +654,8 @@ class ServiceDataView(View):
|
|
}
|
|
}
|
|
order_list = []
|
|
order_list = []
|
|
region_list = []
|
|
region_list = []
|
|
- region_count = 0
|
|
|
|
device_type_list = []
|
|
device_type_list = []
|
|
- device_type_count = 0
|
|
|
|
|
|
+ all_order_count = 0
|
|
for url in url_list:
|
|
for url in url_list:
|
|
url = url + request.path.replace('global/', '')
|
|
url = url + request.path.replace('global/', '')
|
|
res = requests.get(url=url, params=request_dict, headers=headers)
|
|
res = requests.get(url=url, params=request_dict, headers=headers)
|
|
@@ -794,38 +677,28 @@ class ServiceDataView(View):
|
|
for each in region_list:
|
|
for each in region_list:
|
|
if each['countryName'] == item['countryName']:
|
|
if each['countryName'] == item['countryName']:
|
|
each['count'] += int(item['count'])
|
|
each['count'] += int(item['count'])
|
|
- region_count += int(item['count'])
|
|
|
|
flag = 1
|
|
flag = 1
|
|
break
|
|
break
|
|
if flag == 0:
|
|
if flag == 0:
|
|
region_list.append(item)
|
|
region_list.append(item)
|
|
- region_count += int(item['count'])
|
|
|
|
- for item in region_list:
|
|
|
|
- if region_count:
|
|
|
|
- rate = round(item['count'] / region_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- rate = 0
|
|
|
|
- item['rate'] = rate
|
|
|
|
|
|
+
|
|
# 处理设备类型
|
|
# 处理设备类型
|
|
for item in result['result']['deviceType']:
|
|
for item in result['result']['deviceType']:
|
|
flag = 0
|
|
flag = 0
|
|
for each in device_type_list:
|
|
for each in device_type_list:
|
|
if each['typeName'] == item['typeName']:
|
|
if each['typeName'] == item['typeName']:
|
|
each['count'] += int(item['count'])
|
|
each['count'] += int(item['count'])
|
|
- device_type_count += int(item['count'])
|
|
|
|
flag = 1
|
|
flag = 1
|
|
break
|
|
break
|
|
if flag == 0:
|
|
if flag == 0:
|
|
device_type_list.append(item)
|
|
device_type_list.append(item)
|
|
- device_type_count += int(item['count'])
|
|
|
|
- for item in device_type_list:
|
|
|
|
- if device_type_count:
|
|
|
|
- type_rate = round(item['count'] / device_type_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- type_rate = 0
|
|
|
|
- item['typeRate'] = type_rate
|
|
|
|
|
|
+ all_order_count += result['result']['allOrderCount']
|
|
else:
|
|
else:
|
|
return response.json(result['result_code'], result['result'])
|
|
return response.json(result['result_code'], result['result'])
|
|
|
|
+ for item in region_list:
|
|
|
|
+ item['rate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
|
|
|
|
+ for item in device_type_list:
|
|
|
|
+ item['typeRate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
|
|
res = {
|
|
res = {
|
|
'orders': order_list,
|
|
'orders': order_list,
|
|
'regions': CommonService.list_sort(region_list),
|
|
'regions': CommonService.list_sort(region_list),
|
|
@@ -851,11 +724,9 @@ class ServiceDataView(View):
|
|
}
|
|
}
|
|
order_list = []
|
|
order_list = []
|
|
region_list = []
|
|
region_list = []
|
|
- region_count = 0
|
|
|
|
|
|
+ repeat_order_count = 0
|
|
device_type_list = []
|
|
device_type_list = []
|
|
- device_type_count = 0
|
|
|
|
- repeat_count = 0
|
|
|
|
- order_count = 0
|
|
|
|
|
|
+ all_order_count = 0
|
|
for url in url_list:
|
|
for url in url_list:
|
|
url = url + request.path.replace('global/', '')
|
|
url = url + request.path.replace('global/', '')
|
|
res = requests.get(url=url, params=request_dict, headers=headers)
|
|
res = requests.get(url=url, params=request_dict, headers=headers)
|
|
@@ -877,52 +748,39 @@ class ServiceDataView(View):
|
|
for each in region_list:
|
|
for each in region_list:
|
|
if each['countryName'] == item['countryName']:
|
|
if each['countryName'] == item['countryName']:
|
|
each['count'] += int(item['count'])
|
|
each['count'] += int(item['count'])
|
|
- region_count += int(item['count'])
|
|
|
|
flag = 1
|
|
flag = 1
|
|
break
|
|
break
|
|
if flag == 0:
|
|
if flag == 0:
|
|
region_list.append(item)
|
|
region_list.append(item)
|
|
- region_count += int(item['count'])
|
|
|
|
- for item in region_list:
|
|
|
|
- if region_count:
|
|
|
|
- rate = round(item['count'] / region_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- rate = 0
|
|
|
|
- item['rate'] = rate
|
|
|
|
|
|
+
|
|
# 处理设备类型
|
|
# 处理设备类型
|
|
for item in result['result']['deviceType']:
|
|
for item in result['result']['deviceType']:
|
|
flag = 0
|
|
flag = 0
|
|
for each in device_type_list:
|
|
for each in device_type_list:
|
|
if each['typeName'] == item['typeName']:
|
|
if each['typeName'] == item['typeName']:
|
|
each['count'] += int(item['count'])
|
|
each['count'] += int(item['count'])
|
|
- device_type_count += int(item['count'])
|
|
|
|
flag = 1
|
|
flag = 1
|
|
break
|
|
break
|
|
if flag == 0:
|
|
if flag == 0:
|
|
device_type_list.append(item)
|
|
device_type_list.append(item)
|
|
- device_type_count += int(item['count'])
|
|
|
|
- for item in device_type_list:
|
|
|
|
- if device_type_count:
|
|
|
|
- type_rate = round(item['count'] / device_type_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- type_rate = 0
|
|
|
|
- item['typeRate'] = type_rate
|
|
|
|
|
|
+
|
|
# 处理订单复购率
|
|
# 处理订单复购率
|
|
- repeat_count += result['result']['repeatCount']
|
|
|
|
- order_count += result['result']['orderCount']
|
|
|
|
|
|
+ repeat_order_count += result['result']['repeatOrderCount']
|
|
|
|
+ all_order_count += result['result']['allOrderCount']
|
|
else:
|
|
else:
|
|
return response.json(result['result_code'], result['result'])
|
|
return response.json(result['result_code'], result['result'])
|
|
- if order_count:
|
|
|
|
- repeat_rate = round(repeat_count / order_count * 100, 2)
|
|
|
|
- else:
|
|
|
|
- repeat_rate = 0
|
|
|
|
|
|
+ repeat_rate = round(repeat_order_count / all_order_count * 100, 2) if all_order_count else 0
|
|
|
|
+ for item in device_type_list:
|
|
|
|
+ item['typeRate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
|
|
|
|
+ for item in region_list:
|
|
|
|
+ item['rate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
|
|
res = {
|
|
res = {
|
|
'orders': order_list,
|
|
'orders': order_list,
|
|
'regions': CommonService.list_sort(region_list),
|
|
'regions': CommonService.list_sort(region_list),
|
|
'deviceType': CommonService.list_sort(device_type_list),
|
|
'deviceType': CommonService.list_sort(device_type_list),
|
|
'repeatRate': repeat_rate,
|
|
'repeatRate': repeat_rate,
|
|
- 'repeatCount': repeat_count,
|
|
|
|
- 'orderCount': order_count
|
|
|
|
|
|
+ 'repeatOrderCount': repeat_order_count,
|
|
|
|
+ 'allOrderCount': all_order_count
|
|
}
|
|
}
|
|
return response.json(0, res)
|
|
return response.json(0, res)
|
|
except Exception as e:
|
|
except Exception as e:
|