UserDataController.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  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
  10. from django.views.generic.base import View
  11. import datetime
  12. import requests
  13. from Model.models import Device_User, CountryModel
  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. start_time = datetime.datetime.fromtimestamp(int(start_time))
  60. end_time = datetime.datetime.fromtimestamp(int(end_time))
  61. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  62. try:
  63. user_qs = Device_User.objects.filter(data_joined__range=(start_time, end_time))
  64. user_list = []
  65. count = user_qs.count()
  66. for item in time_list:
  67. s_time = datetime.datetime.fromtimestamp(int(item[0]))
  68. e_time = datetime.datetime.fromtimestamp(int(item[1]))
  69. user_date_qs = user_qs.filter(last_login__range=(s_time, e_time))
  70. rate = round(user_date_qs.count()/count*100, 2)
  71. user_dict = {
  72. 'count': user_date_qs.count(),
  73. 'rate': rate,
  74. 'startTime': item[0],
  75. 'endTime': item[1]
  76. }
  77. user_list.append(user_dict)
  78. user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(
  79. '-count')
  80. region_list = []
  81. for item in user_country_qs:
  82. country_id = item['region_country']
  83. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  84. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  85. rate = round(item['count'] / count * 100, 2)
  86. country_dict = {
  87. 'countryName': country_name,
  88. 'count': item['count'],
  89. 'rate': rate
  90. }
  91. region_list.append(country_dict)
  92. res = {
  93. 'user': user_list,
  94. 'region': region_list
  95. }
  96. return response.json(0, res)
  97. except Exception as e:
  98. return response.json(500, repr(e))
  99. @classmethod
  100. def user_active(cls, request_dict, response):
  101. """
  102. 查询用户活跃数据
  103. @param request_dict:请求参数
  104. @request_dict startTime:开始时间
  105. @request_dict endTime:结束时间
  106. @request_dict timeUnit:时间单位
  107. @param response:响应对象
  108. @return:
  109. """
  110. start_time = request_dict.get('startTime', None)
  111. end_time = request_dict.get('endTime', None)
  112. time_unit = request_dict.get('timeUnit', None)
  113. if not all([start_time, end_time, time_unit]):
  114. return response.json(444, {'error param': 'startTime or endTime or timeUnit'})
  115. start_time = datetime.datetime.fromtimestamp(int(start_time))
  116. end_time = datetime.datetime.fromtimestamp(int(end_time))
  117. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  118. try:
  119. user_qs = Device_User.objects.filter(last_login__range=(start_time, end_time))
  120. user_list = []
  121. count = user_qs.count()
  122. for item in time_list:
  123. s_time = datetime.datetime.fromtimestamp(int(item[0]))
  124. e_time = datetime.datetime.fromtimestamp(int(item[1]))
  125. user_date_qs = user_qs.filter(last_login__range=(s_time, e_time))
  126. rate = round(user_date_qs.count()/count*100, 2)
  127. user_dict = {
  128. 'count': user_date_qs.count(),
  129. 'rate': rate,
  130. 'startTime': item[0],
  131. 'endTime': item[1]
  132. }
  133. user_list.append(user_dict)
  134. user_country_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by(
  135. '-count')
  136. region_list = []
  137. for item in user_country_qs:
  138. country_id = item['region_country']
  139. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  140. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  141. rate = round(item['count'] / count * 100, 2)
  142. country_dict = {
  143. 'countryName': country_name,
  144. 'count': item['count'],
  145. 'rate': rate
  146. }
  147. region_list.append(country_dict)
  148. res = {
  149. 'user': user_list,
  150. 'region': region_list
  151. }
  152. return response.json(0, res)
  153. except Exception as e:
  154. return response.json(500, repr(e))
  155. @classmethod
  156. def user_region(cls, response):
  157. """
  158. 查询用户地区分布
  159. @param response:响应对象
  160. @return:
  161. """
  162. res = {
  163. 'countries': [],
  164. }
  165. try:
  166. user_qs = Device_User.objects.all()
  167. count = user_qs.count()
  168. user_qs = user_qs.values('region_country').annotate(count=Count('region_country')).order_by('-count')
  169. for item in user_qs:
  170. country_id = item['region_country']
  171. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  172. item['countryName'] = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  173. item['rate'] = round(item['count'] / count * 100, 2)
  174. res['countries'] = list(user_qs)
  175. return response.json(0, res)
  176. except Exception as e:
  177. return response.json(500, repr(e))
  178. @classmethod
  179. def global_user_increase(cls, request, request_dict, response):
  180. """
  181. 查询全球用户新增数据
  182. @param request:请求
  183. @param request_dict:请求参数
  184. @param response:响应对象
  185. @return:
  186. """
  187. ap_url = 'https://www.zositechc.cn/dataManagement/userData/increase'
  188. as_url = 'https://www.zositecha.com/dataManagement/userData/increase'
  189. na_url = 'https://www.dvema.com/dataManagement/userData/increase'
  190. eu_url = 'https://www.zositeche.com/dataManagement/userData/increase'
  191. local_url = 'http://127.0.0.1:8000/dataManagement/userData/increase'
  192. url_list = [local_url]
  193. try:
  194. headers = {
  195. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  196. }
  197. user_list = []
  198. user_count = 0
  199. region_list = []
  200. region_count = 0
  201. for url in url_list:
  202. res = requests.get(url=url, params=request_dict, headers=headers)
  203. result = res.json()
  204. if result['result_code'] == 0:
  205. for item in result['result']['user']:
  206. flag = 0
  207. for each in user_list:
  208. if item['startTime'] == each['startTime'] and item['endTime'] == each['endTime']:
  209. each['count'] += item['count']
  210. user_count += item['count']
  211. flag = 1
  212. break
  213. if flag == 0:
  214. user_list.append(item)
  215. user_count += item['count']
  216. for item in user_list:
  217. item['rate'] = round(item['count']/user_count*100, 2)
  218. for item in result['result']['region']:
  219. flag = 0
  220. for each in region_list:
  221. if item['countryName'] == each['countryName']:
  222. each['count'] += item['count']
  223. region_count += item['count']
  224. flag = 1
  225. break
  226. if flag == 0:
  227. region_list.append(item)
  228. region_count += item['count']
  229. for item in region_list:
  230. item['rate'] = round(item['count']/region_count*100, 2)
  231. else:
  232. return response.json(result['result_code'])
  233. res = {
  234. 'user': user_list,
  235. 'region': region_list
  236. }
  237. return response.json(0, res)
  238. except Exception as e:
  239. return response.json(500, repr(e))
  240. @classmethod
  241. def global_user_active(cls, request, request_dict, response):
  242. """
  243. 查询全球用户活跃数据
  244. @param request:请求
  245. @param request_dict:请求参数
  246. @param response:响应对象
  247. @return:
  248. """
  249. ap_url = 'https://www.zositechc.cn/dataManagement/userData/active'
  250. as_url = 'https://www.zositecha.com/dataManagement/userData/active'
  251. na_url = 'https://www.dvema.com/dataManagement/userData/active'
  252. eu_url = 'https://www.zositeche.com/dataManagement/userData/active'
  253. local_url = 'http://127.0.0.1:8000/dataManagement/userData/active'
  254. url_list = [local_url]
  255. try:
  256. headers = {
  257. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  258. }
  259. user_list = []
  260. user_count = 0
  261. region_list = []
  262. region_count = 0
  263. for url in url_list:
  264. res = requests.get(url=url, params=request_dict, headers=headers)
  265. result = res.json()
  266. if result['result_code'] == 0:
  267. for item in result['result']['user']:
  268. flag = 0
  269. for each in user_list:
  270. if item['startTime'] == each['startTime'] and item['endTime'] == each['endTime']:
  271. each['count'] += item['count']
  272. user_count += item['count']
  273. flag = 1
  274. break
  275. if flag == 0:
  276. user_list.append(item)
  277. user_count += item['count']
  278. for item in user_list:
  279. item['rate'] = round(item['count']/user_count*100, 2)
  280. for item in result['result']['region']:
  281. flag = 0
  282. for each in region_list:
  283. if item['countryName'] == each['countryName']:
  284. each['count'] += item['count']
  285. region_count += item['count']
  286. flag = 1
  287. break
  288. if flag == 0:
  289. region_list.append(item)
  290. region_count += item['count']
  291. for item in region_list:
  292. item['rate'] = round(item['count']/region_count*100, 2)
  293. else:
  294. return response.json(result['result_code'])
  295. res = {
  296. 'user': user_list,
  297. 'region': region_list
  298. }
  299. return response.json(0, res)
  300. except Exception as e:
  301. return response.json(500, repr(e))
  302. @classmethod
  303. def global_user_region(cls, request, response):
  304. """
  305. 查询全球用户地区分布
  306. @param request:请求
  307. @param request_dict:请求参数
  308. @param response:响应对象
  309. @return:
  310. """
  311. ap_url = 'https://www.zositechc.cn/dataManagement/userData/region'
  312. as_url = 'https://www.zositecha.com/dataManagement/userData/region'
  313. na_url = 'https://www.dvema.com/dataManagement/userData/region'
  314. eu_url = 'https://www.zositeche.com/dataManagement/userData/region'
  315. local_url = 'http://127.0.0.1:8000/dataManagement/userData/region'
  316. url_list = [local_url]
  317. try:
  318. headers = {
  319. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  320. }
  321. user_list = []
  322. user_count = 0
  323. for url in url_list:
  324. res = requests.get(url=url, headers=headers)
  325. result = res.json()
  326. if result['result_code'] == 0:
  327. # 处理地区
  328. for item in result['result']['countries']:
  329. flag = 0
  330. for each in user_list:
  331. if each['countryName'] == item['countryName']:
  332. each['count'] += int(item['count'])
  333. user_count += int(item['count'])
  334. flag = 1
  335. break
  336. if flag == 0:
  337. user_list.append(item)
  338. user_count += int(item['count'])
  339. for item in user_list:
  340. rate = round(item['count'] / user_count * 100, 2)
  341. item['rate'] = rate
  342. else:
  343. return response.json(result['result_code'])
  344. res = {
  345. 'countries': user_list
  346. }
  347. return response.json(0, res)
  348. except Exception as e:
  349. return response.json(500, repr(e))