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