DeviceDataController.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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, DEVICE_TYPE
  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, Order_Model
  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_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  36. if token_code != 0:
  37. return response.json(token_code)
  38. if operation == 'increase': # 查询新增用户数据
  39. return self.device_increase(request_dict, response)
  40. if operation == 'type': # 统计设备类型
  41. return self.type_statistics(response)
  42. if operation == 'regional': # 设备地区分布
  43. return self.regional_statistics(response)
  44. if operation == 'active': # 查询设备增长数据
  45. return self.device_add(request_dict, response)
  46. if operation == 'typeUid':
  47. return self.type_uid(request_dict, response)
  48. else:
  49. return response.json(414)
  50. @classmethod
  51. def type_uid(cls, request_dict, response):
  52. order_type = request_dict.get('orderType', None)
  53. if not order_type:
  54. return response.json(444)
  55. order_type = int(order_type)
  56. order_type_qs = Order_Model.objects.filter(order_type=order_type).values('UID').order_by('UID').distinct()
  57. try:
  58. order_type_list = []
  59. for order in order_type_qs:
  60. UID = order['UID']
  61. device_info_qs = Device_Info.objects.filter(UID=UID).values('Type').order_by('Type').distinct()
  62. if not device_info_qs.exists():
  63. continue
  64. device_info_qs = device_info_qs[0]['Type']
  65. order_type_list.append(device_info_qs)
  66. type_list = []
  67. for i in order_type_list:
  68. if i not in type_list:
  69. type_list.append(i)
  70. return response.json(0, type_list)
  71. except Exception as e:
  72. print(e)
  73. return response.json(500)
  74. @classmethod
  75. def device_add(cls, request_dict, response):
  76. """
  77. 查询设备增长数据
  78. @param request_dict:请求参数
  79. @request_dict starTime:开始时间
  80. @request_dict endTime:结束时间
  81. @param response:响应对象
  82. """
  83. start_time = request_dict.get('startTime', None) # 时间戳
  84. end_time = request_dict.get('endTime', None)
  85. unit_time = request_dict.get('unitTime', None)
  86. order_type = request_dict.get('orderType', None)
  87. if not all([start_time, end_time, unit_time]):
  88. return response.json(444, {'error param': 'startTime or endTime or timeUnit'})
  89. start_time = datetime.datetime.fromtimestamp(int(start_time))
  90. end_time = datetime.datetime.fromtimestamp(int(end_time))
  91. time_list = CommonService.cutting_time(start_time, end_time, unit_time)
  92. try:
  93. device_info_qs = Device_Info.objects.filter(data_joined__range=(start_time, end_time))
  94. info_list = []
  95. count = device_info_qs.count()
  96. for item in time_list:
  97. device_info_date_qs = device_info_qs.filter(data_joined__range=item)
  98. start_time = CommonService.str_to_timestamp(item[0].strftime('%Y-%m-%d %H:%M:%S'))
  99. end_time = CommonService.str_to_timestamp(item[1].strftime('%Y-%m-%d %H:%M:%S'))
  100. info_dict = {
  101. 'count': device_info_date_qs.count(),
  102. 'startTime': start_time,
  103. 'endTime': end_time
  104. }
  105. info_list.append(info_dict)
  106. device_info_country_qs = device_info_qs.values('userID__region_country').annotate(
  107. count=Count('userID__region_country')).order_by('-count')
  108. region_list = []
  109. for item in device_info_country_qs:
  110. country_id = item['userID__region_country']
  111. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  112. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  113. rate = round(item['count'] / count * 100, 2)
  114. country_dict = {
  115. 'countryName': country_name,
  116. 'count': item['count'],
  117. 'rate': rate
  118. }
  119. region_list.append(country_dict)
  120. device_type_qs = device_info_qs.values('Type').annotate(count=Count('Type')).order_by('-count')
  121. type_list = []
  122. for device_type in device_type_qs:
  123. type = device_type['type']
  124. device_type_qs = DeviceTypeModel.objects.filter(type=type).values('name')
  125. if not device_info_qs.exists():
  126. continue
  127. total = Device_Info.objects.filter(Type=type).count()
  128. type_dict = {
  129. 'type': device_type_qs[0]['name'],
  130. 'total': total
  131. }
  132. type_list.append(type_dict)
  133. order_model_qs = Order_Model.objects.filter(order_type=order_type).values('UID')
  134. count = order_model_qs.count()
  135. clound_list = []
  136. for device_uid in order_model_qs:
  137. UID = device_uid['UID']
  138. order_model_qs = Device_Info.objects.filter(UID=UID).values('Type')
  139. # type_qs =
  140. res = {
  141. 'info': info_list,
  142. 'region': region_list,
  143. 'type': type_list,
  144. 'cloudStorage': clound_list
  145. }
  146. return response.json(0, res)
  147. except Exception as e:
  148. return response.json(500, repr(e))
  149. @classmethod
  150. def regional_statistics(cls, response):
  151. """
  152. 统计地区设备数量
  153. @param response:响应对象
  154. """
  155. device_info_qs = Device_Info.objects.all()
  156. device_info_qs = device_info_qs.values('UID').order_by('UID').distinct()
  157. count = device_info_qs.count()
  158. if not device_info_qs.exists():
  159. return response.json(444)
  160. try:
  161. device_country_list = []
  162. for device_info in device_info_qs:
  163. UID = device_info['UID']
  164. if UID is '':
  165. continue
  166. device_country_list.append(UID)
  167. device_region_qs = device_info_qs.filter(UID__in=device_country_list).values(
  168. 'userID__region_country').annotate()
  169. region_list = []
  170. for device_region in device_region_qs:
  171. region = device_region['userID__region_country']
  172. region_list.append(region)
  173. device_country_qs = device_info_qs.values('userID__region_country').order_by(
  174. 'userID__region_country').distinct()
  175. device_region_list = []
  176. for device_country in device_country_qs:
  177. country_id = device_country['userID__region_country']
  178. country_qs = CountryModel.objects.filter(id=country_id).values('country_name', 'id')
  179. countryName = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  180. device_info = region_list.count(country_id)
  181. rate = round(device_info / count * 100, 2)
  182. res = {
  183. 'id': country_id,
  184. 'name': countryName,
  185. 'total': device_info,
  186. 'rate': rate
  187. }
  188. device_region_list.append(res)
  189. return response.json(0, device_region_list)
  190. except Exception as e:
  191. print(e)
  192. return response.json(500)
  193. @classmethod
  194. def type_statistics(cls, response):
  195. """
  196. 统计设备类型
  197. @param response:响应对象
  198. @return:
  199. """
  200. device_info_qs = Device_Info.objects.all().values('Type').annotate(count=Count('Type')).order_by('-count')
  201. if not device_info_qs.exists():
  202. return response.json(444)
  203. try:
  204. device_info_list = []
  205. for device_info in device_info_qs:
  206. type = device_info['Type']
  207. name = DEVICE_TYPE.get(type, '未知类型')
  208. name = name if name != 'UNKOWN' else '未知类型'
  209. count = Device_Info.objects.filter(Type=device_info['Type']).values('UID').annotate(
  210. count=Count('UID', distinct=True)).order_by('-count').count()
  211. device_info_list.append({
  212. 'type': name,
  213. 'total': count
  214. })
  215. return response.json(0, device_info_list)
  216. except Exception as e:
  217. print(e)
  218. return response.json(500)
  219. @classmethod
  220. def device_increase(cls, request_dict, response):
  221. """
  222. 查询用户增长数据
  223. @param request_dict:请求参数
  224. @request_dict startTime:开始时间
  225. @request_dict endTime:结束时间
  226. @param response:响应对象
  227. @return:
  228. """
  229. start_time = request_dict.get('startTime', None)
  230. end_time = request_dict.get('endTime', None)
  231. if not all([start_time, end_time]):
  232. return response.json(444, {'error param': 'startTime or endTime'})
  233. start_time = datetime.datetime.fromtimestamp(int(start_time))
  234. end_time = datetime.datetime.fromtimestamp(int(end_time))
  235. try:
  236. user_qs = Device_User.objects.filter(data_joined__range=(start_time, end_time))
  237. res = {
  238. 'total': user_qs.count(),
  239. 'region': []
  240. }
  241. if user_qs.exists():
  242. user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(
  243. '-count')
  244. region = []
  245. for item in user_country_qs:
  246. country_id = item['region_country']
  247. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  248. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  249. country_dict = {
  250. 'countryName': country_name,
  251. 'count': item['count']
  252. }
  253. region.append(country_dict)
  254. res['region'] = region
  255. return response.json(0, res)
  256. except Exception as e:
  257. return response.json(500, repr(e))