Преглед изворни кода

Merge remote-tracking branch 'remotes/origin/test'

Ansjer пре 3 година
родитељ
комит
4025b7e70b

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

+ 161 - 0
AdminController/dataSystemManagement/DeviceDataController.py

@@ -0,0 +1,161 @@
+# -*- 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, DeviceTypeModel
+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)
+        if operation == 'type':  # 统计设备类型
+            return self.type_statistics(response)
+        if operation == 'regional':  # 设备地区分布
+            return self.regional_statistics(response)
+        else:
+            return response.json(414)
+
+    @classmethod
+    def regional_statistics(cls, response):
+        """
+        统计地区设备数量
+        @param response:响应对象
+        """
+        device_info_qs = Device_Info.objects.all()
+        count = device_info_qs.count()
+        device_info_qs = device_info_qs.values('userID__region_country').order_by('userID__region_country').distinct()
+        if not device_info_qs.exists():
+            return response.json(444)
+        try:
+            device_country_list = []
+            for device_user in device_info_qs:
+                country_id = device_user['userID__region_country']
+                country_qs = CountryModel.objects.filter(id=country_id).values('country_name', 'id')
+                countryName = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
+                device_info = Device_Info.objects.filter(userID__region_country=country_id).values('id').count()
+                rate = round(device_info / count * 100, 2)
+                res = {
+                    'id': country_id,
+                    'name': countryName,
+                    'total': device_info,
+                    'rate': rate
+                }
+                device_country_list.append(res)
+            return response.json(0, device_country_list)
+        except Exception as e:
+            print(e)
+            return response.json(500)
+
+    @classmethod
+    def type_statistics(cls, response):
+        """
+        统计设备类型
+        @param response:响应对象
+        @return:
+        """
+        device_info_qs = Device_Info.objects.filter().values('Type').order_by('Type').distinct()
+        if not device_info_qs.exists():
+            return response.json(444)
+        device_type_list = []
+        try:
+            for device_info in device_info_qs:
+                type = device_info['Type']
+                device_type_qs = DeviceTypeModel.objects.filter(type=type).values('name')
+                if not device_type_qs.exists():
+                    continue
+                total = Device_Info.objects.filter(Type=type).count()
+                res = {
+                    'type': device_type_qs[0]['name'],
+                    'total': total
+                }
+                device_type_list.append(res)
+            return response.json(0, device_type_list)
+        except Exception as e:
+            print(e)
+            return response.json(500)
+
+    @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))

+ 155 - 0
AdminController/dataSystemManagement/ServiceDataController.py

@@ -0,0 +1,155 @@
+# -*- 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, 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 Order_Model, CountryModel, Device_Info, DeviceTypeModel
+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_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 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)
+        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:
+            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 = {
+                'orders': order_list,
+                'regions': region_list,
+                'deviceType': device_type_list,
+                'storeMeal': store_meal_list,
+            }
+            return response.json(0, res)
+        except Exception as e:
+            return response.json(500, repr(e))

+ 181 - 0
AdminController/dataSystemManagement/UserDataController.py

@@ -0,0 +1,181 @@
+# -*- 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:结束时间
+        @request_dict timeUnit:时间单位
+        @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:
+                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': 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(
+                '-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:结束时间
+        @request_dict timeUnit:时间单位
+        @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:
+                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': 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(
+                '-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")),
     # 后台界面接口 -----------------------------------------------------
 
     # 定时删除任务接口

+ 1 - 1
Controller/SensorGateway/EquipmentFamilyController.py

@@ -568,7 +568,7 @@ class EquipmentFamilyView(View):
         @param response: 响应
         @return: 家庭列表items
         """
-        lang = request_dict.get('lang', 'cn')
+        lang = request_dict.get('lang', 'en')
         if user_id:
             with transaction.atomic():
                 user_family_qs = UserFamily.objects.filter(user_id=user_id)

+ 4 - 1
Controller/SensorGateway/GatewayFamilyMemberController.py

@@ -88,6 +88,9 @@ class GatewayFamilyMemberView(View):
                 for item in items:
                     family_member_join_qs = FamilyMemberJoin.objects.filter(id=int(item))
                     if family_member_join_qs.exists():
+                        sys_msg_qs = SysMsgModel.objects.filter(eventType=705, uid=item)
+                        if sys_msg_qs.exists():
+                            sys_msg_qs.delete()
                         family_member_join_qs.delete()
             return response.json(0)
         except Exception as e:
@@ -259,7 +262,7 @@ class GatewayFamilyMemberView(View):
                     'addTime': now_time,
                     'updTime': now_time,
                     'userID_id': family_join['user_id'] if join_type == 1 else family_join['family__user_id'],
-                    'eventType': 705
+                    'eventType': 0
                 }
                 if confirm == 'confirm':
                     msg_text = cls.get_confirm_text(nick_name, family_name, join_type, True, lang)

+ 5 - 9
Controller/SensorGateway/GatewayFamilyRoomController.py

@@ -8,7 +8,7 @@
 """
 
 from django.db import transaction
-from django.db.models import Q, Count, F
+from django.db.models import Q, Count
 from django.views.generic.base import View
 
 from Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyView
@@ -255,14 +255,10 @@ class GatewayFamilyRoomView(View):
             'sort': []
         }
         try:
-            family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=family_id).values('device_id',
-                                                                                                'device__Type',
-                                                                                                'device__NickName',
-                                                                                                'room_id',
-                                                                                                'sub_device',
-                                                                                                'category',
-                                                                                                ).order_by(
-                'sort', '-device__data_joined')
+            family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=family_id)
+            family_room_device_qs = family_room_device_qs.filter(~Q(device__isExist=2)) \
+                .values('device_id', 'device__Type', 'device__NickName', 'room_id',
+                        'sub_device', 'category', ).order_by('sort', '-device__data_joined')
 
             if not family_room_device_qs.exists():
                 return response.json(0, device_room)

+ 10 - 2
Controller/SensorGateway/SmartSceneController.py

@@ -237,7 +237,6 @@ class SmartSceneView(View):
                 if not device_info_qs.exists():
                     return response.json(173)
                 serial_number = device_info_qs[0]['serial_number']
-                msg['sensor_delay'] = tasks_list[0]['delay_time']
             else:  # 子设备设置场景
                 if not sub_device_id:
                     return response.json(444, {'error param': 'subDeviceId'})
@@ -320,6 +319,11 @@ class SmartSceneView(View):
                         'sensor_type': int(task['device_type']),
                         'sensor_action': int(task['event_type'])
                     }
+
+                    # 延时
+                    if 'delay_time' in task and task['delay_time'] != 0:
+                        task_temp['sensor_delay'] = task['delay_time']
+
                     sub_device_id = task.get('subDeviceId', None)
                     if sub_device_id:
                         sub_device_qs = GatewaySubDevice.objects.filter(id=sub_device_id).values('src_addr').first()
@@ -608,7 +612,6 @@ class SmartSceneView(View):
                 if not device_qs.exists():
                     return response.json(173)
                 serial_number = device_qs[0]['serial_number']
-                msg['sensor_delay'] = tasks_list[0]['delay_time']
 
             task_list = []
             for task in tasks_list:
@@ -616,6 +619,11 @@ class SmartSceneView(View):
                     'sensor_type': int(task['device_type']),
                     'sensor_action': int(task['event_type'])
                 }
+
+                # 延时
+                if 'delay_time' in task and task['delay_time'] != 0:
+                    task_temp['sensor_delay'] = task['delay_time']
+
                 task_sub_device_id = task.get('subDeviceId', None)
                 if task_sub_device_id:
                     sub_device_qs = GatewaySubDevice.objects.filter(id=task_sub_device_id).values('src_addr').first()

+ 42 - 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,44 @@ 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_unit: 时间单位
+        @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_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:
+                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_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