HomeDataController.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  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 openpyxl
  11. import requests
  12. from django.db.models import Sum
  13. from django.http import HttpResponse
  14. from django.utils.encoding import escape_uri_path
  15. from django.views.generic.base import View
  16. from Model.models import VideoPlaybackTimeModel, Device_User, Device_Info, Order_Model
  17. from Service.CommonService import CommonService
  18. # 业务数据
  19. class HomeDataView(View):
  20. def get(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation')
  23. return self.validation(request.GET, request, operation)
  24. def post(self, request, *args, **kwargs):
  25. request.encoding = 'utf-8'
  26. operation = kwargs.get('operation')
  27. return self.validation(request.POST, request, operation)
  28. def validation(self, request_dict, request, operation):
  29. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  30. if token_code != 0:
  31. return response.json(token_code)
  32. if operation == 'allData': # 查询首页数据
  33. return self.query_all_data(response)
  34. elif operation == 'salesVolume': # 查询销售额数据
  35. return self.query_sales_volume_data(request_dict, response)
  36. elif operation == 'global/allData': # 查询全球首页数据
  37. return self.query_global_all_data(request, request_dict, response)
  38. elif operation == 'global/salesVolume': # 查询全球销售额数据
  39. return self.query_global_sales_volume_data(request, request_dict, response)
  40. elif operation == 'exportData': # 查询全球销售额数据
  41. return self.export_data(request_dict, response)
  42. else:
  43. return response.json(414)
  44. @classmethod
  45. def query_all_data(cls, response):
  46. """
  47. 查询首页数据
  48. @param response:响应对象
  49. @return:
  50. """
  51. end_time = datetime.datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)
  52. start_time = end_time + datetime.timedelta(days=-1)
  53. end_time_stamp = CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S'))
  54. start_time_stamp = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
  55. try:
  56. user_increase_count = Device_User.objects.filter(data_joined__range=(start_time, end_time)).count()
  57. user_active_count = Device_User.objects.filter(last_login__range=(start_time, end_time)).count()
  58. user_all_count = Device_User.objects.filter(data_joined__lte=end_time).count()
  59. device_increase_count = Device_Info.objects.filter(data_joined__range=(start_time, end_time)).values(
  60. 'UID').distinct().count()
  61. device_active_count = VideoPlaybackTimeModel.objects.filter(
  62. startTime__range=(start_time_stamp, end_time_stamp)).values('uid').distinct().count()
  63. device_all_count = Device_Info.objects.filter(data_joined__lte=end_time).values('UID').distinct().count()
  64. order_qs = Order_Model.objects.filter(status=1, addTime__range=(start_time_stamp, end_time_stamp))
  65. order_total = order_qs.aggregate(total=Sum('price'))['total']
  66. vod_order_total = order_qs.filter(order_type=0).aggregate(total=Sum('price'))['total']
  67. ai_order_total = order_qs.filter(order_type=1).aggregate(total=Sum('price'))['total']
  68. unicom_order_total = order_qs.filter(order_type=2).aggregate(total=Sum('price'))['total']
  69. order_all_qs = Order_Model.objects.filter(status=1, addTime__lte=end_time_stamp)
  70. order_all_total = order_all_qs.aggregate(total=Sum('price'))['total']
  71. vod_order_all_total = order_all_qs.filter(order_type=0).aggregate(total=Sum('price'))['total']
  72. ai_order_all_total = order_all_qs.filter(order_type=1).aggregate(total=Sum('price'))['total']
  73. unicom_order_all_total = order_all_qs.filter(order_type=2).aggregate(total=Sum('price'))['total']
  74. res = {
  75. 'userIncreaseCount': user_increase_count,
  76. 'userActiveCount': user_active_count,
  77. 'userAllCount': user_all_count,
  78. 'deviceIncreaseCount': device_increase_count,
  79. 'deviceActiveCount': device_active_count,
  80. 'deviceAllCount': device_all_count,
  81. 'orderTotal': round(order_total, 2) if order_total else 0,
  82. 'vodOrderTotal': round(vod_order_total, 2) if vod_order_total else 0,
  83. 'aiOrderTotal': round(ai_order_total, 2) if ai_order_total else 0,
  84. 'unicomOrderTotal': round(unicom_order_total, 2) if unicom_order_total else 0,
  85. 'orderAllTotal': round(order_all_total, 2) if order_all_total else 0,
  86. 'vodOrderAllTotal': round(vod_order_all_total, 2) if vod_order_all_total else 0,
  87. 'aiOrderAllTotal': round(ai_order_all_total, 2) if ai_order_all_total else 0,
  88. 'unicomOrderAllTotal': round(unicom_order_all_total, 2) if unicom_order_all_total else 0,
  89. }
  90. return response.json(0, res)
  91. except Exception as e:
  92. return response.json(500, repr(e))
  93. @classmethod
  94. def query_sales_volume_data(cls, request_dict, response):
  95. """
  96. 查询销售额数据
  97. @param request_dict:请求参数
  98. @request_dict startTime:开始时间
  99. @request_dict endTime:结束时间
  100. @request_dict timeUnit:时间单位
  101. @param response:响应对象
  102. @return:
  103. """
  104. start_time = request_dict.get('startTime', None)
  105. end_time = request_dict.get('endTime', None)
  106. time_unit = request_dict.get('timeUnit', None)
  107. if not all([start_time, end_time, time_unit]):
  108. return response.json(444, {'error param': 'startTime or endTime or timeUnit'})
  109. try:
  110. order_qs = Order_Model.objects.filter(addTime__range=(start_time, end_time))
  111. start_time = datetime.datetime.fromtimestamp(int(start_time))
  112. end_time = datetime.datetime.fromtimestamp(int(end_time))
  113. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  114. order_list = []
  115. for item in time_list:
  116. total = order_qs.filter(addTime__range=item).aggregate(total=Sum('price'))['total']
  117. res = {
  118. 'total': round(total, 2) if total else 0,
  119. 'startTime': item[0],
  120. 'endTime': item[1]
  121. }
  122. order_list.append(res)
  123. return response.json(0, order_list)
  124. except Exception as e:
  125. return response.json(500, repr(e))
  126. @classmethod
  127. def query_global_all_data(cls, request, request_dict, response):
  128. """
  129. 查询全球首页数据
  130. @param request:请求
  131. @param request_dict:请求参数
  132. @param response:响应对象
  133. @return:
  134. """
  135. url_list = CommonService.get_domain_name()
  136. try:
  137. headers = {
  138. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  139. }
  140. user_increase_count = 0
  141. user_active_count = 0
  142. user_all_count = 0
  143. device_increase_count = 0
  144. device_active_count = 0
  145. device_all_count = 0
  146. order_total = 0
  147. vod_order_total = 0
  148. ai_order_total = 0
  149. unicom_order_total = 0
  150. order_all_total = 0
  151. vod_order_all_total = 0
  152. ai_order_all_total = 0
  153. unicom_order_all_total = 0
  154. for url in url_list:
  155. url = url + request.path.replace('global/', '')
  156. res = requests.get(url=url, params=request_dict, headers=headers)
  157. result = res.json()
  158. user_increase_count += result['result']['userIncreaseCount']
  159. user_active_count += result['result']['userActiveCount']
  160. user_all_count += result['result']['userAllCount']
  161. device_increase_count += result['result']['deviceIncreaseCount']
  162. device_active_count += result['result']['deviceActiveCount']
  163. device_all_count += result['result']['deviceAllCount']
  164. order_total += result['result']['orderTotal']
  165. vod_order_total += result['result']['vodOrderTotal']
  166. ai_order_total += result['result']['aiOrderTotal']
  167. unicom_order_total += result['result']['unicomOrderTotal']
  168. order_all_total += result['result']['orderAllTotal']
  169. vod_order_all_total += result['result']['vodOrderAllTotal']
  170. ai_order_all_total += result['result']['aiOrderAllTotal']
  171. unicom_order_all_total += result['result']['unicomOrderAllTotal']
  172. res = {
  173. 'userIncreaseCount': user_increase_count,
  174. 'userActiveCount': user_active_count,
  175. 'userAllCount': user_all_count,
  176. 'deviceIncreaseCount': device_increase_count,
  177. 'deviceActiveCount': device_active_count,
  178. 'deviceAllCount': device_all_count,
  179. 'orderTotal': order_total,
  180. 'vodOrderTotal': vod_order_total,
  181. 'aiOrderTotal': ai_order_total,
  182. 'unicomOrderTotal': unicom_order_total,
  183. 'orderAllTotal': order_all_total,
  184. 'vodOrderAllTotal': vod_order_all_total,
  185. 'aiOrderAllTotal': ai_order_all_total,
  186. 'unicomOrderAllTotal': unicom_order_all_total,
  187. }
  188. return response.json(0, res)
  189. except Exception as e:
  190. return response.json(500, repr(e))
  191. @classmethod
  192. def query_global_sales_volume_data(cls, request, request_dict, response):
  193. """
  194. 查询全球销售额数据
  195. @param request:请求
  196. @param request_dict:请求参数
  197. @param response:响应对象
  198. @return:
  199. """
  200. url_list = CommonService.get_domain_name()
  201. try:
  202. headers = {
  203. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  204. }
  205. order_list = []
  206. for url in url_list:
  207. url = url + request.path.replace('global/', '')
  208. res = requests.get(url=url, params=request_dict, headers=headers)
  209. result = res.json()
  210. for item in result['result']:
  211. flag = 0
  212. for each in order_list:
  213. if item['startTime'] == each['startTime'] and item['endTime'] == each['endTime']:
  214. each['total'] += item['total']
  215. break
  216. if flag == 0:
  217. order_list.append(item)
  218. return response.json(0, order_list)
  219. except Exception as e:
  220. return response.json(500, repr(e))
  221. @classmethod
  222. def export_data(cls, request_dict, response):
  223. """
  224. 下载文件
  225. @param request_dict:请求参数
  226. @request_dict tableData:表格数据
  227. @request_dict fileName:文件名
  228. @param response:响应对象
  229. @return:
  230. """
  231. table_data = request_dict.get('tableData', None)
  232. sheet_name = request_dict.get('fileName', None)
  233. if not all([table_data, sheet_name]):
  234. return response.json(444, {'error param': 'tableData or fileName'})
  235. table_data = eval(table_data)
  236. file_name = sheet_name + '.xlsx'
  237. try:
  238. res = HttpResponse(content_type='application/octet-stream')
  239. res['Content-Disposition'] = 'attachment; filename={}'.format(escape_uri_path(file_name))
  240. wb = openpyxl.Workbook()
  241. sh = wb.create_sheet(sheet_name, 0)
  242. for row, data in enumerate(table_data):
  243. if row == 0:
  244. sh.append(list(data.keys()))
  245. sh.append(list(data.values()))
  246. wb.save(res)
  247. # with open(file_path, 'rb') as f:
  248. # res = HttpResponse(f)
  249. # res['Content-Type'] = 'application/octet-stream'
  250. # res['Content-Disposition'] = 'attachment;filename="{}"'.format(file_name)
  251. return res
  252. except Exception as e:
  253. return response.json(500, repr(e))