Browse Source

设备地区分布和设备类型统计接口

guanhailong 3 years ago
parent
commit
386a5ed74c
1 changed files with 66 additions and 2 deletions
  1. 66 2
      AdminController/dataSystemManagement/DeviceDataController.py

+ 66 - 2
AdminController/dataSystemManagement/DeviceDataController.py

@@ -20,7 +20,7 @@ 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
+    FamilyRoomDevice, FamilyRoom, FamilyMemberJoin, GatewaySubDevice, CountryModel, DeviceTypeModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -54,9 +54,72 @@ class DeviceDataView(View):
 
         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):
         """
@@ -80,7 +143,8 @@ class DeviceDataView(View):
                 'region': []
             }
             if user_qs.exists():
-                user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by('-count')
+                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']