DeviceDataController.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : UserDataController.py
  4. @Time : 2022/8/16 10:44
  5. @Author : peng
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import time
  10. import oss2
  11. from django.db import connection
  12. from django.db import transaction
  13. from django.db.models import Q, Count
  14. from django.views.generic.base import View
  15. import datetime
  16. from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
  17. from Controller.DeviceConfirmRegion import Device_Region
  18. from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, \
  19. iotdeviceInfoModel, UIDModel, Device_User, UserFamily, FamilyMember, FamilyMemberPermission, \
  20. FamilyRoomDevice, FamilyRoom, FamilyMemberJoin, GatewaySubDevice, CountryModel, DeviceTypeModel
  21. from Object.ResponseObject import ResponseObject
  22. from Object.TokenObject import TokenObject
  23. from Service.CommonService import CommonService
  24. # 设备数据
  25. class DeviceDataView(View):
  26. def get(self, request, *args, **kwargs):
  27. request.encoding = 'utf-8'
  28. operation = kwargs.get('operation')
  29. return self.validation(request.GET, request, operation)
  30. def post(self, request, *args, **kwargs):
  31. request.encoding = 'utf-8'
  32. operation = kwargs.get('operation')
  33. return self.validation(request.POST, request, operation)
  34. def validation(self, request_dict, request, operation):
  35. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  36. lang = request_dict.get('lang', None)
  37. if lang:
  38. response = ResponseObject(lang)
  39. else:
  40. response = ResponseObject(token.lang) if token.lang else ResponseObject()
  41. if token.code != 0:
  42. return response.json(token.code)
  43. user_id = token.userID
  44. if operation == 'increase': # 查询新增用户数据
  45. return self.device_increase(request_dict, response)
  46. if operation == 'type': # 统计设备类型
  47. return self.type_statistics(response)
  48. if operation == 'regional': # 设备地区分布
  49. return self.regional_statistics(response)
  50. else:
  51. return response.json(414)
  52. @classmethod
  53. def regional_statistics(cls, response):
  54. """
  55. 统计地区设备数量
  56. @param response:响应对象
  57. """
  58. device_info_qs = Device_Info.objects.all()
  59. count = device_info_qs.count()
  60. device_info_qs = device_info_qs.values('userID__region_country').order_by('userID__region_country').distinct()
  61. if not device_info_qs.exists():
  62. return response.json(444)
  63. try:
  64. device_country_list = []
  65. for device_user in device_info_qs:
  66. country_id = device_user['userID__region_country']
  67. country_qs = CountryModel.objects.filter(id=country_id).values('country_name', 'id')
  68. countryName = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  69. device_info = Device_Info.objects.filter(userID__region_country=country_id).values('id').count()
  70. rate = round(device_info / count * 100, 2)
  71. res = {
  72. 'id': country_id,
  73. 'name': countryName,
  74. 'total': device_info,
  75. 'rate': rate
  76. }
  77. device_country_list.append(res)
  78. return response.json(0, device_country_list)
  79. except Exception as e:
  80. print(e)
  81. return response.json(500)
  82. @classmethod
  83. def type_statistics(cls, response):
  84. """
  85. 统计设备类型
  86. @param response:响应对象
  87. @return:
  88. """
  89. device_info_qs = Device_Info.objects.filter().values('Type').order_by('Type').distinct()
  90. if not device_info_qs.exists():
  91. return response.json(444)
  92. device_type_list = []
  93. try:
  94. for device_info in device_info_qs:
  95. type = device_info['Type']
  96. device_type_qs = DeviceTypeModel.objects.filter(type=type).values('name')
  97. if not device_type_qs.exists():
  98. continue
  99. total = Device_Info.objects.filter(Type=type).count()
  100. res = {
  101. 'type': device_type_qs[0]['name'],
  102. 'total': total
  103. }
  104. device_type_list.append(res)
  105. return response.json(0, device_type_list)
  106. except Exception as e:
  107. print(e)
  108. return response.json(500)
  109. @classmethod
  110. def device_increase(cls, request_dict, response):
  111. """
  112. 查询用户增长数据
  113. @param request_dict:请求参数
  114. @request_dict startTime:开始时间
  115. @request_dict endTime:结束时间
  116. @param response:响应对象
  117. @return:
  118. """
  119. start_time = request_dict.get('startTime', None)
  120. end_time = request_dict.get('endTime', None)
  121. if not all([start_time, end_time]):
  122. return response.json(444, {'error param': 'startTime or endTime'})
  123. start_time = datetime.datetime.fromtimestamp(int(start_time))
  124. end_time = datetime.datetime.fromtimestamp(int(end_time))
  125. try:
  126. user_qs = Device_User.objects.filter(data_joined__range=(start_time, end_time))
  127. res = {
  128. 'total': user_qs.count(),
  129. 'region': []
  130. }
  131. if user_qs.exists():
  132. user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(
  133. '-count')
  134. region = []
  135. for item in user_country_qs:
  136. country_id = item['region_country']
  137. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  138. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  139. country_dict = {
  140. 'countryName': country_name,
  141. 'count': item['count']
  142. }
  143. region.append(country_dict)
  144. res['region'] = region
  145. return response.json(0, res)
  146. except Exception as e:
  147. return response.json(500, repr(e))