ServiceDataController.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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 time
  10. import oss2
  11. from django.db import connection
  12. from django.db import transaction
  13. from django.db.models import Q, Count, Sum
  14. from django.views.generic.base import View
  15. import datetime
  16. from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
  17. from Controller.DeviceConfirmRegion import Device_Region
  18. from Model.models import Order_Model, CountryModel, Device_Info, DeviceTypeModel
  19. from Object.ResponseObject import ResponseObject
  20. from Object.TokenObject import TokenObject
  21. from Service.CommonService import CommonService
  22. # 服务数据
  23. class ServiceDataView(View):
  24. def get(self, request, *args, **kwargs):
  25. request.encoding = 'utf-8'
  26. operation = kwargs.get('operation')
  27. return self.validation(request.GET, request, operation)
  28. def post(self, request, *args, **kwargs):
  29. request.encoding = 'utf-8'
  30. operation = kwargs.get('operation')
  31. return self.validation(request.POST, request, operation)
  32. def validation(self, request_dict, request, operation):
  33. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  34. if token_code != 0:
  35. return response.json(token_code)
  36. if operation == 'payOrder': # 查询付费订单数据
  37. return self.query_pay_order(request_dict, response)
  38. else:
  39. return response.json(414)
  40. @classmethod
  41. def query_pay_order(cls, request_dict, response):
  42. """
  43. 查询付费订单数据
  44. @param request_dict:请求参数
  45. @request_dict startTime:开始时间
  46. @request_dict endTime:结束时间
  47. @request_dict timeUnit:时间单位
  48. @request_dict storeMealType:套餐类型
  49. @request_dict lang:套餐语言
  50. @param response:响应对象
  51. @return:
  52. """
  53. start_time = request_dict.get('startTime', None)
  54. end_time = request_dict.get('endTime', None)
  55. time_unit = request_dict.get('timeUnit', None)
  56. store_meal_type = request_dict.get('storeMealType', None)
  57. lang = request_dict.get('lang', 'cn')
  58. if not all([start_time, end_time, time_unit, store_meal_type]):
  59. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  60. try:
  61. order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  62. addTime__range=(start_time, end_time)).filter(~Q(price='0.00'))
  63. count = order_qs.count()
  64. total = order_qs.aggregate(total=Sum('price'))['total']
  65. start_time = datetime.datetime.fromtimestamp(int(start_time))
  66. end_time = datetime.datetime.fromtimestamp(int(end_time))
  67. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  68. # 订单数量统计
  69. order_list = []
  70. for item in time_list:
  71. order_temp_qs = order_qs.filter(addTime__range=item)
  72. order_dict = {
  73. 'orderId': order_temp_qs[0].orderID,
  74. 'count': order_temp_qs.count(),
  75. 'startTime': item[0],
  76. 'endTime': item[1]
  77. }
  78. order_list.append(order_dict)
  79. # 区域订单统计
  80. region_list = []
  81. region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count')
  82. for item in region_qs:
  83. country_id = item['userID__region_country']
  84. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  85. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  86. rate = round(item['count'] / count * 100, 2)
  87. region_dict = {
  88. 'countryName': country_name,
  89. 'count': item['count'],
  90. 'rate': rate
  91. }
  92. region_list.append(region_dict)
  93. # 设备类型订单统计
  94. device_type_list = []
  95. device_type_qs = order_qs.values('UID').annotate()
  96. uid_list = []
  97. uid_type_dict = {}
  98. for item in device_type_qs:
  99. uid_list.append(item['UID'])
  100. device_temp_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
  101. if device_temp_qs.exists():
  102. if device_temp_qs[0]['Type'] not in uid_type_dict:
  103. uid_type_dict[device_temp_qs[0]['Type']] = []
  104. uid_type_dict[device_temp_qs[0]['Type']].append(item['UID'])
  105. device_count = len(set(uid_list))
  106. device_qs = Device_Info.objects.filter(UID__in=uid_list).values('Type').annotate(
  107. count=Count('Type', distinct=True)).order_by('-count')
  108. for item in device_qs:
  109. type_qs = DeviceTypeModel.objects.filter(id=item['Type'])
  110. type_name = type_qs[0]['name'] if type_qs.exists() else '未知类型'
  111. type_rate = round(item['count'] / device_count * 100, 2)
  112. temp_total = order_qs.filter(UID__in=uid_type_dict[item['Type']]).aggregate(total=Sum('price'))['total']
  113. total_rate = round(temp_total / total * 100, 2)
  114. device_temp_qs = {
  115. 'typeName': type_name,
  116. 'count': item['count'],
  117. 'typeRate': type_rate,
  118. 'totalRate': total_rate
  119. }
  120. device_type_list.append(device_temp_qs)
  121. # 套餐订单统计
  122. store_meal_list = []
  123. store_meal_qs = order_qs.values('rank').annotate(count=Count('rank')).order_by('-count').filter(
  124. rank__lang__lang=lang).values('rank', 'count', 'rank__lang__content')
  125. for item in store_meal_qs:
  126. rate = round(item['count'] / count * 100, 2)
  127. store_meal_dict = {
  128. 'storeMealId': item['rank'],
  129. 'count': item['count'],
  130. 'storeMealName': item['rank__lang__content'],
  131. 'rate': rate
  132. }
  133. store_meal_list.append(store_meal_dict)
  134. res = {
  135. 'orders': order_list,
  136. 'regions': region_list,
  137. 'deviceType': device_type_list,
  138. 'storeMeal': store_meal_list,
  139. }
  140. return response.json(0, res)
  141. except Exception as e:
  142. return response.json(500, repr(e))