AgentOrderController.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : AgentOrderController.py
  4. @Time : 2024/3/14 10:53
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import threading
  10. import time
  11. from decimal import Decimal
  12. from django.http import QueryDict
  13. from django.views import View
  14. from AgentModel.models import AgentDevice, AgentCloudServicePackage, AgentCustomerPackage, AgentDeviceOrder
  15. from Model.models import Order_Model
  16. from Object.ResponseObject import ResponseObject
  17. from Object.TokenObject import TokenObject
  18. from Service.CommonService import CommonService
  19. from Ansjer.config import LOGGER
  20. class AgentOrderView(View):
  21. def get(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation')
  24. return self.validation(request.GET, request, operation)
  25. def post(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. operation = kwargs.get('operation')
  28. return self.validation(request.POST, request, operation)
  29. def delete(self, request, *args, **kwargs):
  30. request.encoding = 'utf-8'
  31. operation = kwargs.get('operation')
  32. delete = QueryDict(request.body)
  33. if not delete:
  34. delete = request.GET
  35. return self.validation(delete, request, operation)
  36. def put(self, request, *args, **kwargs):
  37. request.encoding = 'utf-8'
  38. operation = kwargs.get('operation')
  39. put = QueryDict(request.body)
  40. return self.validation(put, request, operation)
  41. def validation(self, request_dict, request, operation):
  42. response = ResponseObject()
  43. tko = TokenObject(
  44. request.META.get('HTTP_AUTHORIZATION'),
  45. returntpye='pc')
  46. if operation == 'addOrder':
  47. order_id = request_dict.get('order_id', None)
  48. uid = request_dict.get('uid', None)
  49. order_type = request_dict.get('order_type', None)
  50. package_id = request_dict.get('package_id', None)
  51. self.check_agent_service_package(order_id, uid, int(package_id))
  52. return response.json(0)
  53. @classmethod
  54. def check_agent_service_package(cls, order_id, uid, package_id):
  55. """
  56. 检查是否代理服务套餐
  57. @param package_id: 套餐id
  58. @param order_id: 订单ID
  59. @param uid: UID
  60. @return: True | False
  61. """
  62. try:
  63. serial_number = CommonService.get_serial_number_by_uid(uid)
  64. a_device_qs = AgentDevice.objects.filter(serial_number=serial_number) \
  65. .values('ac_id', 'type', 'status')
  66. if not a_device_qs.exists():
  67. return False
  68. LOGGER.info(f'******check_agent_service_package当前设备属于代理商*****serial_number:{serial_number}')
  69. asy = threading.Thread(target=cls.save_agent_package,
  70. args=(order_id, serial_number, a_device_qs[0]['ac_id'], package_id))
  71. asy.start()
  72. return True
  73. except Exception as e:
  74. LOGGER.info('*****AgentOrderView.check_agent_service_package:errLine:{}, errMsg:{}'
  75. .format(e.__traceback__.tb_lineno, repr(e)))
  76. return False
  77. @classmethod
  78. def save_agent_package(cls, order_id, serial_number, ac_id, package_id):
  79. """
  80. 保存代理套餐
  81. """
  82. try:
  83. package_id = int(package_id)
  84. agent_package_qs = AgentCloudServicePackage.objects.filter(package_id=package_id, status=1)
  85. if not agent_package_qs.exists():
  86. LOGGER.info(f'******save_agent_package当前套餐未绑定代理******order_id:{order_id},serial_number:{serial_number}')
  87. return
  88. agent_package = agent_package_qs.first() # 代理云服务套餐
  89. LOGGER.info(f'******save_agent_package代理套餐******agentPackage:{agent_package_qs.first()}')
  90. acp_qs = AgentCustomerPackage.objects.filter(ac_id=ac_id, cs_id=agent_package.id).values('id')
  91. if not acp_qs.exists():
  92. LOGGER.info(f'******save_agent_package当前代理客户未添加此套餐******ac_id:{ac_id},package_id:{package_id}')
  93. return
  94. order_qs = Order_Model.objects.filter(orderID=order_id, status=1).values('price', 'payTime')
  95. if not order_qs.exists():
  96. LOGGER.info(f'******save_agent_package当前代理客户未添加此套餐******ac_id:{ac_id},package_id:{package_id}')
  97. return
  98. # 组装数据
  99. now_time = int(time.time())
  100. pay_price = Decimal(order_qs[0]['price']).quantize(Decimal('0.00'))
  101. profit = cls.calculate_order_profit(agent_package, pay_price)
  102. dict_data = {'ac_id': ac_id, 'serial_number': serial_number, 'csp_id': package_id,
  103. 'order_id': order_id, 'status': 1, 'profit_amount': pay_price, 'profit': profit,
  104. 'pay_time': order_qs[0]['payTime'], 'created_time': now_time, 'updated_time': now_time}
  105. AgentDeviceOrder.objects.create(**dict_data)
  106. LOGGER.info(f'******save_agent_package代理订单存表结束:{dict_data}')
  107. except Exception as e:
  108. LOGGER.info('*****AgentOrderView.save_agent_package:errLine:{}, errMsg:{}'
  109. .format(e.__traceback__.tb_lineno, repr(e)))
  110. @classmethod
  111. def calculate_order_profit(cls, agent_package, price):
  112. """
  113. 计算利润
  114. @param agent_package: 套餐配置
  115. @param price: 支付价格
  116. @return: 利润
  117. """
  118. profit = 0
  119. price = Decimal(price).quantize(Decimal('0.00'))
  120. if agent_package.profit_type == 1:
  121. profit = agent_package.profit
  122. elif agent_package.profit_type == 2:
  123. profit_value = Decimal(agent_package.profit).quantize(Decimal('0.00'))
  124. cost = Decimal(agent_package.cost).quantize(Decimal('0.00'))
  125. profit = (price - cost) * (profit_value / 100)
  126. profit = profit.quantize(Decimal('0.00'))
  127. return profit