HomeDataController.py 12 KB

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