StatisticsController.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import json
  4. import time
  5. from django.db.models import Count
  6. from django.views.decorators.csrf import csrf_exempt
  7. from Model.models import UserAppFrequencyModel, AppFrequencyStatisticsModel, Device_User, \
  8. AppFrequencyYearStatisticsModel, Equipment_Info, EquipmentInfoExStatisticsModel
  9. from Object.ResponseObject import ResponseObject
  10. from Object.TokenObject import TokenObject
  11. @csrf_exempt
  12. def statistcsAppFrequency(request):
  13. request.encoding = 'utf-8'
  14. response = ResponseObject()
  15. if request.method == 'POST':
  16. request_dict = request.POST
  17. elif request.method == 'GET':
  18. request_dict = request.GET
  19. else:
  20. return response.json(444)
  21. token = TokenObject(request_dict.get('token', None))
  22. if token.code != 0:
  23. return response.json(token.code)
  24. target_year = request_dict.get('year', None)
  25. target_month = request_dict.get('month', None)
  26. localtime = time.localtime()
  27. current_month = localtime.tm_mon
  28. current_year = localtime.tm_year
  29. if target_year and target_month:
  30. current_year = int(target_year)
  31. current_month = int(target_month)
  32. time_struct = [current_year, 1, 1, 0, 0, 0, 0, 0, 0]
  33. distance_time = 8 * 60 * 60
  34. # 该月的开始时间
  35. time_struct[1] = current_month
  36. start_time = time.mktime(tuple(time_struct))
  37. start_time = start_time - time.timezone - distance_time
  38. # 该月的结束时间
  39. time_struct[1] = current_month + 1
  40. end_time = time.mktime(tuple(time_struct))
  41. end_time = end_time - time.timezone - distance_time
  42. # 统计该月的数据
  43. uaf_qs = UserAppFrequencyModel.objects.filter(data_time__gte=start_time, data_time__lt=end_time) \
  44. .values('type').annotate(quantity=Count('id')).order_by()
  45. afs_qs = AppFrequencyStatisticsModel.objects.filter(year=current_year, month=current_month)
  46. if afs_qs.exists():
  47. afs_qs.update(data=json.dumps(uaf_qs))
  48. else:
  49. data = {
  50. 'data': json.dumps(list(uaf_qs)),
  51. 'month': current_month,
  52. 'year': current_year
  53. }
  54. AppFrequencyStatisticsModel.objects.create(**data)
  55. return response.json(0)
  56. @csrf_exempt
  57. def statistcsAppFrequencyYear(request):
  58. request.encoding = 'utf-8'
  59. response = ResponseObject()
  60. if request.method == 'POST':
  61. request_dict = request.POST
  62. elif request.method == 'GET':
  63. request_dict = request.GET
  64. else:
  65. return response.json(444)
  66. token = TokenObject(request_dict.get('token', None))
  67. if token.code != 0:
  68. return response.json(token.code)
  69. year = request_dict.get('year', None)
  70. localtime = time.localtime()
  71. current_year = localtime.tm_year
  72. if year:
  73. current_year = int(year)
  74. afs_qs = AppFrequencyStatisticsModel.objects.filter(year=current_year).values('data', 'month')
  75. # num = Device_User.objects.count()
  76. num = 300000
  77. res = []
  78. result = {
  79. 0: 0,
  80. 1: 0,
  81. 2: 0,
  82. 3: 0,
  83. 4: 0,
  84. 5: 0,
  85. 6: 0
  86. }
  87. quantity = 0
  88. for afs in afs_qs:
  89. data = json.loads(afs['data'])
  90. for item in data:
  91. result[item['type']] += item['quantity']
  92. quantity += item['quantity']
  93. tmps = []
  94. for k, v in result.items():
  95. tmp = {
  96. 'type': k,
  97. 'value': round(v / 12 / num, 3)
  98. }
  99. tmps.append(tmp)
  100. res.append({
  101. 'year': current_year,
  102. 'data': tmps
  103. })
  104. print(res)
  105. afys_qs = AppFrequencyYearStatisticsModel.objects.filter(year=current_year)
  106. #
  107. if afys_qs.exists():
  108. afys_qs.update(data=json.dumps(res))
  109. else:
  110. data = {
  111. 'data': json.dumps(res),
  112. 'year': current_year,
  113. 'num': num
  114. }
  115. AppFrequencyYearStatisticsModel.objects.create(**data)
  116. return response.json(0)
  117. @csrf_exempt
  118. def statistcsPushDay(request):
  119. request.encoding = 'utf-8'
  120. response = ResponseObject()
  121. if request.method == 'POST':
  122. request_dict = request.POST
  123. elif request.method == 'GET':
  124. request_dict = request.GET
  125. else:
  126. return response.json(444)
  127. token = TokenObject(request_dict.get('token', None))
  128. if token.code != 0:
  129. return response.json(token.code)
  130. current_time = int(time.time())
  131. count = int((current_time + 8 * 3600) / (24 * 3600))
  132. end_time = count * 24 * 3600 - 8 * 3600
  133. start_time = end_time - 24 * 3600
  134. print(start_time)
  135. print(end_time)
  136. eq_qs = Equipment_Info.objects.filter(addTime__gte=start_time, addTime__lte=end_time)
  137. print(eq_qs.values())
  138. # 0:APNS推送,1:谷歌推送,2:极光推送
  139. now_time = int(time.time())
  140. jpush = EquipmentInfoExStatisticsModel(push_type=2, statistics_date=start_time, add_time=now_time, date_type=0)
  141. apns = EquipmentInfoExStatisticsModel(push_type=0, statistics_date=start_time, add_time=now_time, date_type=0)
  142. gcm = EquipmentInfoExStatisticsModel(push_type=1, statistics_date=start_time, add_time=now_time, date_type=0)
  143. total = EquipmentInfoExStatisticsModel(push_type=-1, statistics_date=start_time, add_time=now_time, date_type=0)
  144. for eq in eq_qs:
  145. if eq.push_type == 0:
  146. do_sum(eq, apns)
  147. elif eq.push_type == 1:
  148. do_sum(eq, gcm)
  149. elif eq.push_type == 2:
  150. do_sum(eq, jpush)
  151. do_sum(eq, total)
  152. datas = []
  153. datas.append(apns)
  154. datas.append(gcm)
  155. datas.append(jpush)
  156. datas.append(total)
  157. EquipmentInfoExStatisticsModel.objects.bulk_create(datas)
  158. return response.json(0)
  159. @csrf_exempt
  160. def statistcsPushMonth(request):
  161. request.encoding = 'utf-8'
  162. response = ResponseObject()
  163. if request.method == 'POST':
  164. request_dict = request.POST
  165. elif request.method == 'GET':
  166. request_dict = request.GET
  167. else:
  168. return response.json(444)
  169. token = TokenObject(request_dict.get('token', None))
  170. if token.code != 0:
  171. return response.json(token.code)
  172. gmtime = time.gmtime(int(time.time()) + 28800)
  173. current_month = gmtime.tm_mon - 1
  174. # print(current_month)
  175. time_struct = [gmtime.tm_year, current_month, 1, 0, 0, 0, 0, 0, gmtime.tm_isdst]
  176. start_time = int(time.mktime(tuple(time_struct))) - 28800
  177. # print(start_time)
  178. time_struct[1] = current_month + 1
  179. end_time = int(time.mktime(tuple(time_struct))) - 28800
  180. # print(end_time)
  181. eq_qs = EquipmentInfoExStatisticsModel.objects.filter(statistics_date__gte=start_time, statistics_date__lte=end_time, date_type=0)
  182. # 0:APNS推送,1:谷歌推送,2:极光推送
  183. now_time = int(time.time())
  184. jpush = EquipmentInfoExStatisticsModel(push_type=2, statistics_date=start_time, add_time=now_time, date_type=1)
  185. apns = EquipmentInfoExStatisticsModel(push_type=0, statistics_date=start_time, add_time=now_time, date_type=1)
  186. gcm = EquipmentInfoExStatisticsModel(push_type=1, statistics_date=start_time, add_time=now_time, date_type=1)
  187. total = EquipmentInfoExStatisticsModel(push_type=-1, statistics_date=start_time, add_time=now_time, date_type=1)
  188. for eq in eq_qs:
  189. if eq.push_type == 0:
  190. do_sum_two(eq, apns)
  191. elif eq.push_type == 1:
  192. do_sum_two(eq, gcm)
  193. elif eq.push_type == 2:
  194. do_sum_two(eq, jpush)
  195. elif eq.push_type == -1:
  196. do_sum_two(eq, total)
  197. datas = []
  198. datas.append(apns)
  199. datas.append(gcm)
  200. datas.append(jpush)
  201. datas.append(total)
  202. EquipmentInfoExStatisticsModel.objects.bulk_create(datas)
  203. return response.json(0)
  204. def do_sum(eq: Equipment_Info, target: EquipmentInfoExStatisticsModel):
  205. if eq.push_server_status == 200:
  206. target.number_of_successes += 1
  207. else:
  208. target.number_of_failures += 1
  209. if eq.push_device_status == 1:
  210. target.number_of_arrival += 1
  211. def do_sum_two(eq: EquipmentInfoExStatisticsModel, target: EquipmentInfoExStatisticsModel):
  212. target.number_of_successes += eq.number_of_successes
  213. target.number_of_failures += eq.number_of_failures
  214. target.number_of_arrival += eq.number_of_arrival