Jelajahi Sumber

优化订单查询逻辑
增加免费订单转化率

peng 3 tahun lalu
induk
melakukan
7c8f18d136
1 mengubah file dengan 106 tambahan dan 69 penghapusan
  1. 106 69
      AdminController/dataSystemManagement/ServiceDataController.py

+ 106 - 69
AdminController/dataSystemManagement/ServiceDataController.py

@@ -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)