Browse Source

数据系统用户数据模块

peng 3 năm trước cách đây
mục cha
commit
1680814e48

+ 97 - 0
AdminController/dataSystemManagement/BusinessDataController.py

@@ -0,0 +1,97 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : UserDataController.py
+@Time    : 2022/8/16 10:44
+@Author  : peng
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+
+import time
+
+import oss2
+from django.db import connection
+from django.db import transaction
+from django.db.models import Q, Count
+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 Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+
+
+# 业务数据
+class BusinessDataView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        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)
+        else:
+            return response.json(414)
+
+    @classmethod
+    def user_increase(cls, request_dict, response):
+        """
+        查询用户增长数据
+        @param request_dict:请求参数
+        @request_dict startTime:开始时间
+        @request_dict endTime:结束时间
+        @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))
+        try:
+            user_qs = Device_User.objects.filter(data_joined__range=(start_time, end_time))
+            res = {
+                'total': user_qs.count(),
+                'region': []
+            }
+            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))

+ 97 - 0
AdminController/dataSystemManagement/DeviceDataController.py

@@ -0,0 +1,97 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : UserDataController.py
+@Time    : 2022/8/16 10:44
+@Author  : peng
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+
+import time
+
+import oss2
+from django.db import connection
+from django.db import transaction
+from django.db.models import Q, Count
+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 Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+
+
+# 设备数据
+class DeviceDataView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        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.device_increase(request_dict, response)
+        else:
+            return response.json(414)
+
+    @classmethod
+    def device_increase(cls, request_dict, response):
+        """
+        查询用户增长数据
+        @param request_dict:请求参数
+        @request_dict startTime:开始时间
+        @request_dict endTime:结束时间
+        @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))
+        try:
+            user_qs = Device_User.objects.filter(data_joined__range=(start_time, end_time))
+            res = {
+                'total': user_qs.count(),
+                'region': []
+            }
+            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))

+ 97 - 0
AdminController/dataSystemManagement/ServiceDataController.py

@@ -0,0 +1,97 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : UserDataController.py
+@Time    : 2022/8/16 10:44
+@Author  : peng
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+
+import time
+
+import oss2
+from django.db import connection
+from django.db import transaction
+from django.db.models import Q, Count
+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 Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+
+
+# 服务数据
+class ServiceDataView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        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)
+        else:
+            return response.json(414)
+
+    @classmethod
+    def user_increase(cls, request_dict, response):
+        """
+        查询用户增长数据
+        @param request_dict:请求参数
+        @request_dict startTime:开始时间
+        @request_dict endTime:结束时间
+        @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))
+        try:
+            user_qs = Device_User.objects.filter(data_joined__range=(start_time, end_time))
+            res = {
+                'total': user_qs.count(),
+                'region': []
+            }
+            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))

+ 179 - 0
AdminController/dataSystemManagement/UserDataController.py

@@ -0,0 +1,179 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : UserDataController.py
+@Time    : 2022/8/16 10:44
+@Author  : peng
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+
+from django.db.models import Q, Count
+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_User, CountryModel
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+
+
+# 用户数据
+class UserDataView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        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 == 'increase':  # 查询用户新增数据
+            return self.user_increase(request_dict, response)
+        elif operation == 'active':  # 查询用户活跃数据
+            return self.user_active(request_dict, response)
+        elif operation == 'region':  # 查询用户地区分布
+            return self.user_region(response)
+        else:
+            return response.json(414)
+
+    @classmethod
+    def user_increase(cls, request_dict, response):
+        """
+        查询用户增长数据
+        @param request_dict:请求参数
+        @request_dict startTime:开始时间
+        @request_dict endTime:结束时间
+        @param response:响应对象
+        @return:
+        """
+        start_time = request_dict.get('startTime', None)
+        end_time = request_dict.get('endTime', None)
+        time_unit = request_dict.get('timeUnit', None)
+        if not all([start_time, end_time, time_unit]):
+            return response.json(444, {'error param': 'startTime or endTime or timeUnit'})
+        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)
+        try:
+            user_qs = Device_User.objects.filter(data_joined__range=(start_time, end_time))
+            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'))
+                user_dict = {
+                    'count': user_date_qs.count(),
+                    'startTime': s_time,
+                    'endTime': e_time
+                }
+                user_list.append(user_dict)
+            user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(
+                '-count')
+            region_list = []
+            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 '未知区域'
+                rate = round(item['count'] / count * 100, 2)
+                country_dict = {
+                    'countryName': country_name,
+                    'count': item['count'],
+                    'rate': rate
+                }
+                region_list.append(country_dict)
+            res = {
+                'user': user_list,
+                'region': region_list
+            }
+            return response.json(0, res)
+        except Exception as e:
+            return response.json(500, repr(e))
+
+    @classmethod
+    def user_active(cls, request_dict, response):
+        """
+        查询用户活跃数据
+        @param request_dict:请求参数
+        @request_dict startTime:开始时间
+        @request_dict endTime:结束时间
+        @param response:响应对象
+        @return:
+        """
+        start_time = request_dict.get('startTime', None)
+        end_time = request_dict.get('endTime', None)
+        time_unit = request_dict.get('timeUnit', None)
+        if not all([start_time, end_time, time_unit]):
+            return response.json(444, {'error param': 'startTime or endTime or timeUnit'})
+        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)
+        try:
+            user_qs = Device_User.objects.filter(last_login__range=(start_time, end_time))
+            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'))
+                user_dict = {
+                    'count': user_date_qs.count(),
+                    'startTime': s_time,
+                    'endTime': e_time
+                }
+                user_list.append(user_dict)
+            user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(
+                '-count')
+            region_list = []
+            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 '未知区域'
+                rate = round(item['count'] / count * 100, 2)
+                country_dict = {
+                    'countryName': country_name,
+                    'count': item['count'],
+                    'rate': rate
+                }
+                region_list.append(country_dict)
+            res = {
+                'user': user_list,
+                'region': region_list
+            }
+            return response.json(0, res)
+        except Exception as e:
+            return response.json(500, repr(e))
+
+    @classmethod
+    def user_region(cls, response):
+        """
+        查询用户地区分布
+        @param response:响应对象
+        @return:
+        """
+        res = {
+            'countries': [],
+        }
+        try:
+            user_qs = Device_User.objects.all()
+            count = user_qs.count()
+            user_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by('-count')
+            for item in user_qs:
+                country_id = item['region_country']
+                country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
+                item['country_name'] = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
+                item['rate'] = round(item['count'] / count * 100, 2)
+            res['countries'] = list(user_qs)
+
+            return response.json(0, res)
+        except Exception as e:
+            return response.json(500, repr(e))

+ 19 - 0
Ansjer/server_urls/datasystem_url.py

@@ -0,0 +1,19 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : datasysytem_url.py
+@Time    : 2022/8/16 10:38
+@Author  : peng
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+from django.urls import re_path
+
+from AdminController.dataSystemManagement import UserDataController, DeviceDataController, ServiceDataController, \
+    BusinessDataController
+
+urlpatterns = [
+    re_path(r'^userData/(?P<operation>.*)$', UserDataController.UserDataView.as_view()),
+    re_path(r'^deviceData/(?P<operation>.*)$', DeviceDataController.DeviceDataView.as_view()),
+    re_path(r'^serviceData/(?P<operation>.*)$', ServiceDataController.ServiceDataView.as_view()),
+    re_path(r'^businessData/(?P<operation>.*)$', BusinessDataController.BusinessDataView.as_view()),
+]

+ 2 - 0
Ansjer/urls.py

@@ -400,6 +400,8 @@ urlpatterns = [
     re_path(r'surveys/(?P<operation>.*)', SurveysManageController.SurveysView.as_view()),
     # 序列号管理
     re_path(r'serial/(?P<operation>.*)', SerialManageController.SerialView.as_view()),
+    # 数据系统模块
+    re_path(r'^dataManagement/', include("Ansjer.server_urls.datasystem_url")),
     # 后台界面接口 -----------------------------------------------------
 
     # 定时删除任务接口

+ 36 - 0
Service/CommonService.py

@@ -6,6 +6,7 @@ import time
 from base64 import encodebytes
 from pathlib import Path
 from random import Random
+from dateutil.relativedelta import relativedelta
 
 import OpenSSL.crypto as ct
 import ipdb
@@ -659,3 +660,38 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
             return token_obj.code, token_obj.userID, response
         except Exception as e:
             print(e)
+
+    @staticmethod
+    def cutting_time(start_time, end_time, time_unit):
+        """
+        按时间单位切割时间段
+        @param start_time: 开始时间
+        @param end_time: 结束时间
+        @param time_util: 时间单位
+        @return: time_list 切割后的时间列表
+        """
+
+        time_list = []
+        while True:
+            if time_unit == 'day':
+                temp_time = start_time + relativedelta(days=1)
+            elif time_unit == 'week':
+                temp_time = start_time + relativedelta(days=7)
+            elif time_unit == 'month':
+                temp_time = start_time + relativedelta(months=1)
+            elif time_unit == 'quarter':
+                temp_time = start_time + relativedelta(months=3)
+            elif time_unit == 'year':
+                temp_time = start_time + relativedelta(years=1)
+            else:
+                break
+            if temp_time < end_time:
+                time_list.append((start_time, temp_time))
+                start_time = temp_time
+            else:
+                if (start_time, temp_time) not in time_list:
+                    time_list.append((start_time, end_time))
+                break
+        if not time_list:
+            time_list = [(start_time, end_time)]
+        return time_list