UserDataController.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  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. from django.db.models import Count, Sum
  10. from django.views.generic.base import View
  11. import datetime
  12. import requests
  13. from Model.models import DeviceUserSummary
  14. from Service.CommonService import CommonService
  15. # 用户数据
  16. class UserDataView(View):
  17. def get(self, request, *args, **kwargs):
  18. request.encoding = 'utf-8'
  19. operation = kwargs.get('operation')
  20. return self.validation(request.GET, request, operation)
  21. def post(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation')
  24. return self.validation(request.POST, request, operation)
  25. def validation(self, request_dict, request, operation):
  26. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  27. if token_code != 0:
  28. return response.json(token_code)
  29. if operation == 'increase': # 查询用户新增数据
  30. return self.user_increase(request_dict, response)
  31. elif operation == 'active': # 查询用户活跃数据
  32. return self.user_active(request_dict, response)
  33. elif operation == 'region': # 查询用户地区分布
  34. return self.user_region(response)
  35. elif operation == 'global/increase': # 查询全球用户新增数据
  36. return self.global_user_increase(request, request_dict, response)
  37. elif operation == 'global/active': # 查询全球用户活跃数据
  38. return self.global_user_active(request, request_dict, response)
  39. elif operation == 'global/region': # 查询全球用户地区分布
  40. return self.global_user_region(request, response)
  41. else:
  42. return response.json(414)
  43. @classmethod
  44. def user_increase(cls, request_dict, response):
  45. """
  46. 查询用户增长数据
  47. @param request_dict:请求参数
  48. @request_dict startTime:开始时间
  49. @request_dict endTime:结束时间
  50. @request_dict timeUnit:时间单位
  51. @param response:响应对象
  52. @return:
  53. """
  54. start_time = request_dict.get('startTime', None)
  55. end_time = request_dict.get('endTime', None)
  56. time_unit = request_dict.get('timeUnit', None)
  57. if not all([start_time, end_time, time_unit]):
  58. return response.json(444, {'error param': 'startTime or endTime or timeUnit'})
  59. try:
  60. all_user_qs = DeviceUserSummary.objects.filter(time__gte=start_time, time__lt=end_time,
  61. query_type=0).values('count', 'country')
  62. count = all_user_qs.aggregate(total=Sum('count'))['total']
  63. count = count if count else 0
  64. # 处理用户地区
  65. region_dict = {}
  66. region_list = []
  67. for item in all_user_qs:
  68. country_temp_dict = eval(item['country'])
  69. for k, v in country_temp_dict.items():
  70. if k in region_dict:
  71. region_dict[k] += v
  72. else:
  73. region_dict[k] = v
  74. for k, v in region_dict.items():
  75. rate = round(v / count * 100, 2) if count else 0
  76. region_list.append({
  77. 'countryName': k,
  78. 'count': v,
  79. 'rate': rate
  80. })
  81. # 处理时间段用户
  82. start_time = datetime.datetime.fromtimestamp(int(start_time))
  83. end_time = datetime.datetime.fromtimestamp(int(end_time))
  84. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  85. user_list = []
  86. for item in time_list:
  87. user_qs = all_user_qs.filter(time__gte=item[0], time__lt=item[1]).values('count')
  88. temp_count = user_qs.aggregate(total=Sum('count'))['total']
  89. temp_count = temp_count if temp_count else 0
  90. rate = round(temp_count / count * 100, 2) if count else 0
  91. user_dict = {
  92. 'count': temp_count,
  93. 'rate': rate,
  94. 'startTime': item[0],
  95. 'endTime': item[1]
  96. }
  97. user_list.append(user_dict)
  98. res = {
  99. 'user': user_list,
  100. 'region': region_list
  101. }
  102. return response.json(0, res)
  103. except Exception as e:
  104. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  105. @classmethod
  106. def user_active(cls, request_dict, response):
  107. """
  108. 查询用户活跃数据
  109. @param request_dict:请求参数
  110. @request_dict startTime:开始时间
  111. @request_dict endTime:结束时间
  112. @request_dict timeUnit:时间单位
  113. @param response:响应对象
  114. @return:
  115. """
  116. start_time = request_dict.get('startTime', None)
  117. end_time = request_dict.get('endTime', None)
  118. time_unit = request_dict.get('timeUnit', None)
  119. if not all([start_time, end_time, time_unit]):
  120. return response.json(444, {'error param': 'startTime or endTime or timeUnit'})
  121. try:
  122. all_user_qs = DeviceUserSummary.objects.filter(time__gte=start_time, time__lt=end_time,
  123. query_type=1).values('count', 'country')
  124. count = all_user_qs.aggregate(total=Sum('count'))['total']
  125. count = count if count else 0
  126. # 处理用户地区
  127. region_dict = {}
  128. region_list = []
  129. for item in all_user_qs:
  130. country_temp_dict = eval(item['country'])
  131. for k, v in country_temp_dict.items():
  132. if k in region_dict:
  133. region_dict[k] += v
  134. else:
  135. region_dict[k] = v
  136. for k, v in region_dict.items():
  137. rate = round(v / count * 100, 2) if count else 0
  138. region_list.append({
  139. 'countryName': k,
  140. 'count': v,
  141. 'rate': rate
  142. })
  143. # 处理时间段用户
  144. start_time = datetime.datetime.fromtimestamp(int(start_time))
  145. end_time = datetime.datetime.fromtimestamp(int(end_time))
  146. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  147. user_list = []
  148. for item in time_list:
  149. user_qs = all_user_qs.filter(time__gte=item[0], time__lt=item[1]).values('count')
  150. temp_count = user_qs.aggregate(total=Sum('count'))['total']
  151. temp_count = temp_count if temp_count else 0
  152. rate = round(temp_count / count * 100, 2) if count else 0
  153. user_dict = {
  154. 'count': temp_count,
  155. 'rate': rate,
  156. 'startTime': item[0],
  157. 'endTime': item[1]
  158. }
  159. user_list.append(user_dict)
  160. res = {
  161. 'user': user_list,
  162. 'region': region_list
  163. }
  164. return response.json(0, res)
  165. except Exception as e:
  166. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  167. @classmethod
  168. def user_region(cls, response):
  169. """
  170. 查询用户地区分布
  171. @param response:响应对象
  172. @return:
  173. """
  174. try:
  175. user_qs = DeviceUserSummary.objects.filter(query_type=0).values('count', 'country', 'continent')
  176. count = user_qs.aggregate(total=Sum('count'))['total']
  177. count = count if count else 0
  178. continent_dict = {}
  179. country_dict = {}
  180. continent_list = []
  181. country_list = []
  182. for item in user_qs:
  183. country_temp_dict = eval(item['country'])
  184. continent_temp_dict = eval(item['continent'])
  185. for k, v in country_temp_dict.items():
  186. if k in country_dict:
  187. country_dict[k] += v
  188. else:
  189. country_dict[k] = v
  190. for k, v in continent_temp_dict.items():
  191. if k in continent_dict:
  192. continent_dict[k] += v
  193. else:
  194. continent_dict[k] = v
  195. # 处理用户国家
  196. for k, v in country_dict.items():
  197. rate = round(v / count * 100, 2) if count else 0
  198. country_list.append({
  199. 'countryName': k,
  200. 'count': v,
  201. 'rate': rate
  202. })
  203. # 处理用户大洲
  204. for k, v in continent_dict.items():
  205. rate = round(v / count * 100, 2) if count else 0
  206. continent_list.append({
  207. 'continentName': k,
  208. 'count': v,
  209. 'rate': rate
  210. })
  211. res = {
  212. 'countries': country_list,
  213. 'continent': continent_list
  214. }
  215. return response.json(0, res)
  216. except Exception as e:
  217. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  218. @classmethod
  219. def global_user_increase(cls, request, request_dict, response):
  220. """
  221. 查询全球用户新增数据
  222. @param request:请求
  223. @param request_dict:请求参数
  224. @param response:响应对象
  225. @return:
  226. """
  227. url_list = CommonService.get_domain_name()
  228. try:
  229. headers = {
  230. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  231. }
  232. user_list = []
  233. user_count = 0
  234. region_list = []
  235. for url in url_list:
  236. url = url + request.path.replace('global/', '')
  237. res = requests.get(url=url, params=request_dict, headers=headers)
  238. result = res.json()
  239. if result['result_code'] == 0:
  240. for item in result['result']['user']:
  241. flag = 0
  242. for each in user_list:
  243. if item['startTime'] == each['startTime'] and item['endTime'] == each['endTime']:
  244. each['count'] += item['count']
  245. user_count += item['count']
  246. flag = 1
  247. break
  248. if flag == 0:
  249. user_list.append(item)
  250. user_count += item['count']
  251. for item in result['result']['region']:
  252. flag = 0
  253. for each in region_list:
  254. if item['countryName'] == each['countryName']:
  255. each['count'] += item['count']
  256. flag = 1
  257. break
  258. if flag == 0:
  259. region_list.append(item)
  260. else:
  261. return response.json(result['result_code'], result['result'])
  262. for item in user_list:
  263. item['rate'] = round(item['count'] / user_count * 100, 2) if user_count else 0
  264. for item in region_list:
  265. item['rate'] = round(item['count'] / user_count * 100, 2) if user_count else 0
  266. res = {
  267. 'user': user_list,
  268. 'region': CommonService.list_sort(region_list)
  269. }
  270. return response.json(0, res)
  271. except Exception as e:
  272. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  273. @classmethod
  274. def global_user_active(cls, request, request_dict, response):
  275. """
  276. 查询全球用户活跃数据
  277. @param request:请求
  278. @param request_dict:请求参数
  279. @param response:响应对象
  280. @return:
  281. """
  282. url_list = CommonService.get_domain_name()
  283. try:
  284. headers = {
  285. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  286. }
  287. user_list = []
  288. user_count = 0
  289. region_list = []
  290. for url in url_list:
  291. url = url + request.path.replace('global/', '')
  292. res = requests.get(url=url, params=request_dict, headers=headers)
  293. result = res.json()
  294. if result['result_code'] == 0:
  295. for item in result['result']['user']:
  296. flag = 0
  297. for each in user_list:
  298. if item['startTime'] == each['startTime'] and item['endTime'] == each['endTime']:
  299. each['count'] += item['count']
  300. user_count += item['count']
  301. flag = 1
  302. break
  303. if flag == 0:
  304. user_list.append(item)
  305. user_count += item['count']
  306. for item in result['result']['region']:
  307. flag = 0
  308. for each in region_list:
  309. if item['countryName'] == each['countryName']:
  310. each['count'] += item['count']
  311. flag = 1
  312. break
  313. if flag == 0:
  314. region_list.append(item)
  315. else:
  316. return response.json(result['result_code'], result['result'])
  317. for item in user_list:
  318. item['rate'] = round(item['count'] / user_count * 100, 2) if user_count else 0
  319. for item in region_list:
  320. item['rate'] = round(item['count'] / user_count * 100, 2) if user_count else 0
  321. res = {
  322. 'user': user_list,
  323. 'region': CommonService.list_sort(region_list)
  324. }
  325. return response.json(0, res)
  326. except Exception as e:
  327. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  328. @classmethod
  329. def global_user_region(cls, request, response):
  330. """
  331. 查询全球用户地区分布
  332. @param request:请求
  333. @param response:响应对象
  334. @return:
  335. """
  336. url_list = CommonService.get_domain_name()
  337. try:
  338. headers = {
  339. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  340. }
  341. country_list = []
  342. continent_list = []
  343. user_count = 0
  344. for url in url_list:
  345. url = url + request.path.replace('global/', '')
  346. res = requests.get(url=url, headers=headers)
  347. result = res.json()
  348. if result['result_code'] == 0:
  349. # 处理地区
  350. for item in result['result']['countries']:
  351. flag = 0
  352. for each in country_list:
  353. if each['countryName'] == item['countryName']:
  354. each['count'] += int(item['count'])
  355. user_count += int(item['count'])
  356. flag = 1
  357. break
  358. if flag == 0:
  359. country_list.append(item)
  360. user_count += int(item['count'])
  361. for item in result['result']['continent']:
  362. flag = 0
  363. for each in continent_list:
  364. if each['continentName'] == item['continentName']:
  365. each['count'] += item['count']
  366. flag = 1
  367. break
  368. if flag == 0:
  369. continent_list.append(item)
  370. else:
  371. return response.json(result['result_code'], result['result'])
  372. for item in country_list:
  373. item['rate'] = round(item['count'] / user_count * 100, 2) if user_count else 0
  374. for item in continent_list:
  375. item['rate'] = round(item['count'] / user_count * 100, 2) if user_count else 0
  376. res = {
  377. 'countries': CommonService.list_sort(country_list)[:20],
  378. 'continent': CommonService.list_sort(continent_list)
  379. }
  380. return response.json(0, res)
  381. except Exception as e:
  382. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))