HomeDataController.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  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 datetime
  10. import requests
  11. from django.db.models import Q, Count, Sum
  12. from django.views.generic.base import View
  13. from Model.models import VideoPlaybackTimeModel, Device_User, Device_Info, Order_Model
  14. from Service.CommonService import CommonService
  15. # 业务数据
  16. class HomeDataView(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 == 'allData': # 查询首页数据
  30. return self.query_all_data(response)
  31. elif operation == 'salesVolume': # 查询销售额数据
  32. return self.query_sales_volume_data(request_dict, response)
  33. elif operation == 'global/allData': # 查询全球首页数据
  34. return self.query_global_all_data(request, request_dict, response)
  35. elif operation == 'global/salesVolume': # 查询全球销售额数据
  36. return self.query_global_sales_volume_data(request, request_dict, response)
  37. else:
  38. return response.json(414)
  39. @classmethod
  40. def query_all_data(cls, response):
  41. """
  42. 查询首页数据
  43. @param response:响应对象
  44. @return:
  45. """
  46. end_time = datetime.datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)
  47. start_time = end_time + datetime.timedelta(days=-1)
  48. end_time_stamp = CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S'))
  49. start_time_stamp = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
  50. try:
  51. user_increase_count = Device_User.objects.filter(data_joined__range=(start_time, end_time)).count()
  52. user_active_count = Device_User.objects.filter(last_login__range=(start_time, end_time)).count()
  53. user_all_count = Device_User.objects.filter(data_joined__lte=end_time).count()
  54. device_increase_count = Device_Info.objects.filter(data_joined__range=(start_time, end_time)).values(
  55. 'UID').distinct().count()
  56. device_active_count = VideoPlaybackTimeModel.objects.filter(
  57. startTime__range=(start_time_stamp, end_time_stamp)).values('uid').distinct().count()
  58. device_all_count = Device_Info.objects.filter(data_joined__lte=end_time).values('UID').distinct().count()
  59. order_qs = Order_Model.objects.filter(status=1, addTime__range=(start_time_stamp, end_time_stamp))
  60. order_total = order_qs.aggregate(total=Sum('price'))['total']
  61. vod_order_total = order_qs.filter(order_type=0).aggregate(total=Sum('price'))['total']
  62. ai_order_total = order_qs.filter(order_type=1).aggregate(total=Sum('price'))['total']
  63. unicom_order_total = order_qs.filter(order_type=2).aggregate(total=Sum('price'))['total']
  64. order_all_qs = Order_Model.objects.filter(status=1, addTime__lte=end_time_stamp)
  65. order_all_total = order_all_qs.aggregate(total=Sum('price'))['total']
  66. vod_order_all_total = order_all_qs.filter(order_type=0).aggregate(total=Sum('price'))['total']
  67. ai_order_all_total = order_all_qs.filter(order_type=1).aggregate(total=Sum('price'))['total']
  68. unicom_order_all_total = order_all_qs.filter(order_type=2).aggregate(total=Sum('price'))['total']
  69. res = {
  70. 'userIncreaseCount': user_increase_count,
  71. 'userActiveCount': user_active_count,
  72. 'userAllCount': user_all_count,
  73. 'deviceIncreaseCount': device_increase_count,
  74. 'deviceActiveCount': device_active_count,
  75. 'deviceAllCount': device_all_count,
  76. 'orderTotal': round(order_total, 2) if order_total else 0,
  77. 'vodOrderTotal': round(vod_order_total, 2) if vod_order_total else 0,
  78. 'aiOrderTotal': round(ai_order_total, 2) if ai_order_total else 0,
  79. 'unicomOrderTotal': round(unicom_order_total, 2) if unicom_order_total else 0,
  80. 'orderAllTotal': round(order_all_total, 2) if order_all_total else 0,
  81. 'vodOrderAllTotal': round(vod_order_all_total, 2) if vod_order_all_total else 0,
  82. 'aiOrderAllTotal': round(ai_order_all_total, 2) if ai_order_all_total else 0,
  83. 'unicomOrderAllTotal': round(unicom_order_all_total, 2) if unicom_order_all_total else 0,
  84. }
  85. return response.json(0, res)
  86. except Exception as e:
  87. return response.json(500, repr(e))
  88. @classmethod
  89. def query_sales_volume_data(cls, request_dict, response):
  90. """
  91. 查询销售额数据
  92. @param request_dict:请求参数
  93. @request_dict startTime:开始时间
  94. @request_dict endTime:结束时间
  95. @request_dict timeUnit:时间单位
  96. @param response:响应对象
  97. @return:
  98. """
  99. start_time = request_dict.get('startTime', None)
  100. end_time = request_dict.get('endTime', None)
  101. time_unit = request_dict.get('timeUnit', None)
  102. try:
  103. order_qs = Order_Model.objects.filter(addTime__range=(start_time, end_time))
  104. start_time = datetime.datetime.fromtimestamp(int(start_time))
  105. end_time = datetime.datetime.fromtimestamp(int(end_time))
  106. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  107. order_list = []
  108. for item in time_list:
  109. total = order_qs.filter(addTime__range=item).aggregate(total=Sum('price'))['total']
  110. res = {
  111. 'total': round(total, 2) if total else 0,
  112. 'startTime': item[0],
  113. 'endTime': item[1]
  114. }
  115. order_list.append(res)
  116. return response.json(0, order_list)
  117. except Exception as e:
  118. return response.json(500, repr(e))
  119. @classmethod
  120. def query_global_all_data(cls, request, request_dict, response):
  121. """
  122. 查询全球首页数据
  123. @param request:请求
  124. @param request_dict:请求参数
  125. @param response:响应对象
  126. @return:
  127. """
  128. url_list = CommonService.get_domain_name()
  129. try:
  130. headers = {
  131. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  132. }
  133. user_increase_count = 0
  134. user_active_count = 0
  135. user_all_count = 0
  136. device_increase_count = 0
  137. device_active_count = 0
  138. device_all_count = 0
  139. order_total = 0
  140. vod_order_total = 0
  141. ai_order_total = 0
  142. unicom_order_total = 0
  143. order_all_total = 0
  144. vod_order_all_total = 0
  145. ai_order_all_total = 0
  146. unicom_order_all_total = 0
  147. for url in url_list:
  148. url = url + request.path.replace('global/', '')
  149. res = requests.get(url=url, params=request_dict, headers=headers)
  150. result = res.json()
  151. user_increase_count += result['result']['userIncreaseCount']
  152. user_active_count += result['result']['userActiveCount']
  153. user_all_count += result['result']['userAllCount']
  154. device_increase_count += result['result']['deviceIncreaseCount']
  155. device_active_count += result['result']['deviceActiveCount']
  156. device_all_count += result['result']['deviceAllCount']
  157. order_total += result['result']['orderTotal']
  158. vod_order_total += result['result']['vodOrderTotal']
  159. ai_order_total += result['result']['aiOrderTotal']
  160. unicom_order_total += result['result']['unicomOrderTotal']
  161. order_all_total += result['result']['orderAllTotal']
  162. vod_order_all_total += result['result']['vodOrderAllTotal']
  163. ai_order_all_total += result['result']['aiOrderAllTotal']
  164. unicom_order_all_total += result['result']['unicomOrderAllTotal']
  165. res = {
  166. 'userIncreaseCount': user_increase_count,
  167. 'userActiveCount': user_active_count,
  168. 'userAllCount': user_all_count,
  169. 'deviceIncreaseCount': device_increase_count,
  170. 'deviceActiveCount': device_active_count,
  171. 'deviceAllCount': device_all_count,
  172. 'orderTotal': order_total,
  173. 'vodOrderTotal': vod_order_total,
  174. 'aiOrderTotal': ai_order_total,
  175. 'unicomOrderTotal': unicom_order_total,
  176. 'orderAllTotal': order_all_total,
  177. 'vodOrderAllTotal': vod_order_all_total,
  178. 'aiOrderAllTotal': ai_order_all_total,
  179. 'unicomOrderAllTotal': unicom_order_all_total,
  180. }
  181. return response.json(0, res)
  182. except Exception as e:
  183. return response.json(500, repr(e))
  184. @classmethod
  185. def query_global_sales_volume_data(cls, request, request_dict, response):
  186. """
  187. 查询全球销售额数据
  188. @param request:请求
  189. @param request_dict:请求参数
  190. @param response:响应对象
  191. @return:
  192. """
  193. url_list = CommonService.get_domain_name()
  194. try:
  195. headers = {
  196. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  197. }
  198. order_list = []
  199. for url in url_list:
  200. url = url + request.path.replace('global/', '')
  201. res = requests.get(url=url, params=request_dict, headers=headers)
  202. result = res.json()
  203. for item in result['result']:
  204. flag = 0
  205. for each in order_list:
  206. if item['startTime'] == each['startTime'] and item['endTime'] == each['endTime']:
  207. each['total'] += item['total']
  208. break
  209. if flag == 0:
  210. order_list.append(item)
  211. return response.json(0, order_list)
  212. except Exception as e:
  213. return response.json(500, repr(e))