UserDataController.py 19 KB

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