peng пре 3 година
родитељ
комит
0296253bcc

+ 98 - 40
AdminController/dataSystemManagement/ServiceDataController.py

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

+ 12 - 10
AdminController/dataSystemManagement/UserDataController.py

@@ -52,6 +52,7 @@ class UserDataView(View):
         @param request_dict:请求参数
         @request_dict startTime:开始时间
         @request_dict endTime:结束时间
+        @request_dict timeUnit:时间单位
         @param response:响应对象
         @return:
         """
@@ -68,13 +69,13 @@ class UserDataView(View):
             user_list = []
             count = user_qs.count()
             for item in time_list:
-                user_date_qs = user_qs.filter(data_joined__range=item)
-                s_time = CommonService.str_to_timestamp(item[0].strftime('%Y-%m-%d %H:%M:%S'))
-                e_time = CommonService.str_to_timestamp(item[1].strftime('%Y-%m-%d %H:%M:%S'))
+                s_time = datetime.datetime.fromtimestamp(int(item[0]))
+                e_time = datetime.datetime.fromtimestamp(int(item[1]))
+                user_date_qs = user_qs.filter(last_login__range=(s_time, e_time))
                 user_dict = {
                     'count': user_date_qs.count(),
-                    'startTime': s_time,
-                    'endTime': e_time
+                    'startTime': item[0],
+                    'endTime': item[1]
                 }
                 user_list.append(user_dict)
             user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(
@@ -106,6 +107,7 @@ class UserDataView(View):
         @param request_dict:请求参数
         @request_dict startTime:开始时间
         @request_dict endTime:结束时间
+        @request_dict timeUnit:时间单位
         @param response:响应对象
         @return:
         """
@@ -122,13 +124,13 @@ class UserDataView(View):
             user_list = []
             count = user_qs.count()
             for item in time_list:
-                user_date_qs = user_qs.filter(last_login__range=item)
-                s_time = CommonService.str_to_timestamp(item[0].strftime('%Y-%m-%d %H:%M:%S'))
-                e_time = CommonService.str_to_timestamp(item[1].strftime('%Y-%m-%d %H:%M:%S'))
+                s_time = datetime.datetime.fromtimestamp(int(item[0]))
+                e_time = datetime.datetime.fromtimestamp(int(item[1]))
+                user_date_qs = user_qs.filter(last_login__range=(s_time, e_time))
                 user_dict = {
                     'count': user_date_qs.count(),
-                    'startTime': s_time,
-                    'endTime': e_time
+                    'startTime': item[0],
+                    'endTime': item[1]
                 }
                 user_list.append(user_dict)
             user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(

+ 11 - 5
Service/CommonService.py

@@ -667,7 +667,7 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
         按时间单位切割时间段
         @param start_time: 开始时间
         @param end_time: 结束时间
-        @param time_util: 时间单位
+        @param time_unit: 时间单位
         @return: time_list 切割后的时间列表
         """
 
@@ -686,12 +686,18 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
             else:
                 break
             if temp_time < end_time:
-                time_list.append((start_time, temp_time))
+                time_tuple = (CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S')),
+                              CommonService.str_to_timestamp(temp_time.strftime('%Y-%m-%d %H:%M:%S')))
+                time_list.append(time_tuple)
                 start_time = temp_time
             else:
-                if (start_time, temp_time) not in time_list:
-                    time_list.append((start_time, end_time))
+                time_tuple = (CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S')),
+                              CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S')))
+                if time_tuple not in time_list:
+                    time_list.append(time_tuple)
                 break
         if not time_list:
-            time_list = [(start_time, end_time)]
+            time_tuple = (CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S')),
+                          CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S')))
+            time_list = [time_tuple]
         return time_list