OperatingCostsDataController.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : UserDataController.py
  4. @Time : 2024年6月7日09:27:28
  5. @Author : peng
  6. @Email : peng
  7. @Software: PyCharm
  8. """
  9. from django.db.models import Q, Sum
  10. from django.views.generic.base import View
  11. import datetime
  12. import requests
  13. from Model.models import OperatingCosts, Order_Model, CountryModel, UID_Bucket
  14. from Service.CommonService import CommonService
  15. from Ansjer.config import CONFIG_EUR, CONFIG_INFO, CONFIG_CN, CONFIG_US
  16. from dateutil.relativedelta import relativedelta
  17. # 运营成本数据
  18. class OperatingCostsDataView(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 == 'getOperatingCosts': # 查询订单成本利润
  32. return self.get_operating_costs(request, request_dict, response)
  33. else:
  34. return response.json(414)
  35. @classmethod
  36. def get_operating_costs(cls, request, request_dict, response):
  37. """
  38. 查询订单成本利润
  39. @param request:请求参数
  40. @param request_dict:请求参数
  41. @request_dict startTime:开始时间
  42. @request_dict endTime:结束时间
  43. @param response:响应对象
  44. @return:
  45. """
  46. start_time = request_dict.get('startTime', None)
  47. end_time = request_dict.get('endTime', None)
  48. page = request_dict.get('page', 1)
  49. line = request_dict.get('line', 10)
  50. if not all([page, line]):
  51. return response.json(444, {'error param': 'page or line'})
  52. page = int(page)
  53. line = int(line)
  54. params = {'page': page, 'line': line}
  55. try:
  56. if start_time and end_time:
  57. operating_costs_qs = OperatingCosts.objects.filter(Q(time__gte=start_time), Q(time__lt=end_time))
  58. params['startTime'] = start_time
  59. params['endTime'] = end_time
  60. else:
  61. operating_costs_qs = OperatingCosts.objects.all()
  62. count = operating_costs_qs.count()
  63. operating_qs = operating_costs_qs.filter(~Q(order_id='')).values('order_id', 'uid', 'day_average_price',
  64. 'month_average_price',
  65. 'purchase_quantity', 'actual_storage',
  66. 'actual_api',
  67. 'monthly_income', 'settlement_days',
  68. 'remaining_usage_time',
  69. 'end_time', 'created_time',
  70. 'time').order_by('order_id')[
  71. (page - 1) * line:page * line]
  72. res = []
  73. storage_univalence = 0.023 / 30
  74. api_univalence = 0.005 / 1000
  75. for item in operating_qs:
  76. order_qs = Order_Model.objects.filter(orderID=item['order_id'], UID=item['uid']).values('price',
  77. 'order_type',
  78. 'fee',
  79. 'userID__region_country',
  80. 'rank__expire',
  81. 'payType')
  82. if not order_qs.exists():
  83. continue
  84. country_qs = CountryModel.objects.filter(id=order_qs[0]['userID__region_country']).values(
  85. 'country_name')
  86. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知国家'
  87. region = '国内' if CONFIG_INFO == CONFIG_CN else '国外'
  88. if order_qs[0]['order_type'] in [0, 1]:
  89. order_type = '云存'
  90. order_start_time = int((datetime.datetime.fromtimestamp(item['end_time']) - relativedelta(
  91. months=order_qs[0]['rank__expire'])).timestamp())
  92. storage_cost = float(item['actual_storage']) / 1024 * storage_univalence * item['settlement_days']
  93. api_cost = int(item['actual_api']) * api_univalence
  94. if CONFIG_INFO == CONFIG_CN: # 国内要换算汇率
  95. storage_cost = storage_cost * 7
  96. api_cost = api_cost * 7
  97. profit = round(float(item['monthly_income']) - storage_cost - api_cost, 2)
  98. else:
  99. profit = round(float(item['monthly_income']) - storage_cost - api_cost, 2)
  100. expire = str(order_qs[0]['rank__expire']) + '个月'
  101. else:
  102. order_type = '4G流量'
  103. storage_cost = 0
  104. api_cost = 0
  105. if order_qs[0]['payType'] in [2, 3]:
  106. fee = float(order_qs[0]['price']) * 0.0054
  107. else:
  108. fee = order_qs[0]['fee']
  109. res.append({
  110. 'order_id': item['order_id'],
  111. 'uid': item['uid'],
  112. 'region': region,
  113. 'country_name': country_name,
  114. 'order_type': order_type,
  115. 'expire': expire,
  116. 'price': order_qs[0]['price'],
  117. 'fee': fee,
  118. 'real_income': round(float(order_qs[0]['price']) - float(order_qs[0]['fee']), 2),
  119. 'day_average_price': item['day_average_price'],
  120. 'month_average_price': item['month_average_price'],
  121. 'purchase_quantity': item['purchase_quantity'],
  122. 'start_time': order_start_time,
  123. 'end_time': item['end_time'],
  124. 'settlement_time': item['created_time'],
  125. 'settlement_days': item['settlement_days'],
  126. 'monthly_income': item['monthly_income'],
  127. 'remaining_usage_time': item['remaining_usage_time'],
  128. 'actual_storage': item['actual_storage'],
  129. 'actual_api': item['actual_api'],
  130. 'storage_cost': storage_cost,
  131. 'api_cost': api_cost,
  132. 'profit': profit
  133. })
  134. if CONFIG_INFO == CONFIG_US:
  135. headers = {
  136. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  137. }
  138. eur_response = requests.get('https://www.zositeche.com/dataManagement/costsData/getOperatingCosts',
  139. params=params, headers=headers)
  140. if eur_response.status_code == 200:
  141. eur_result = eur_response.json()
  142. if eur_result['result_code'] == 0:
  143. res += eur_result['result']['res']
  144. count += eur_result['result']['count']
  145. return response.json(0, {'count': count, 'res': CommonService.list_sort_v2(res, 'order_id')})
  146. except Exception as e:
  147. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))