|
@@ -0,0 +1,142 @@
|
|
|
|
+# -*- encoding: utf-8 -*-
|
|
|
|
+"""
|
|
|
|
+@File : AgentOrderController.py
|
|
|
|
+@Time : 2024/3/14 10:53
|
|
|
|
+@Author : stephen
|
|
|
|
+@Email : zhangdongming@asj6.wecom.work
|
|
|
|
+@Software: PyCharm
|
|
|
|
+"""
|
|
|
|
+import threading
|
|
|
|
+import time
|
|
|
|
+from decimal import Decimal
|
|
|
|
+
|
|
|
|
+from django.http import QueryDict
|
|
|
|
+from django.views import View
|
|
|
|
+
|
|
|
|
+from AgentModel.models import AgentDevice, AgentCloudServicePackage, AgentCustomerPackage, AgentDeviceOrder
|
|
|
|
+from Model.models import Order_Model
|
|
|
|
+from Object.ResponseObject import ResponseObject
|
|
|
|
+from Object.TokenObject import TokenObject
|
|
|
|
+from Service.CommonService import CommonService
|
|
|
|
+from Ansjer.config import LOGGER
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class AgentOrderView(View):
|
|
|
|
+ def get(self, request, *args, **kwargs):
|
|
|
|
+ request.encoding = 'utf-8'
|
|
|
|
+ operation = kwargs.get('operation')
|
|
|
|
+ return self.validation(request.GET, request, operation)
|
|
|
|
+
|
|
|
|
+ def post(self, request, *args, **kwargs):
|
|
|
|
+ request.encoding = 'utf-8'
|
|
|
|
+ operation = kwargs.get('operation')
|
|
|
|
+ return self.validation(request.POST, request, operation)
|
|
|
|
+
|
|
|
|
+ def delete(self, request, *args, **kwargs):
|
|
|
|
+ request.encoding = 'utf-8'
|
|
|
|
+ operation = kwargs.get('operation')
|
|
|
|
+ delete = QueryDict(request.body)
|
|
|
|
+ if not delete:
|
|
|
|
+ delete = request.GET
|
|
|
|
+ return self.validation(delete, request, operation)
|
|
|
|
+
|
|
|
|
+ def put(self, request, *args, **kwargs):
|
|
|
|
+ request.encoding = 'utf-8'
|
|
|
|
+ operation = kwargs.get('operation')
|
|
|
|
+ put = QueryDict(request.body)
|
|
|
|
+ return self.validation(put, request, operation)
|
|
|
|
+
|
|
|
|
+ def validation(self, request_dict, request, operation):
|
|
|
|
+ response = ResponseObject()
|
|
|
|
+ tko = TokenObject(
|
|
|
|
+ request.META.get('HTTP_AUTHORIZATION'),
|
|
|
|
+ returntpye='pc')
|
|
|
|
+ if operation == 'addOrder':
|
|
|
|
+ order_id = request_dict.get('order_id', None)
|
|
|
|
+ uid = request_dict.get('uid', None)
|
|
|
|
+ order_type = request_dict.get('order_type', None)
|
|
|
|
+ package_id = request_dict.get('package_id', None)
|
|
|
|
+
|
|
|
|
+ self.check_agent_service_package(order_id, uid, int(package_id))
|
|
|
|
+ return response.json(0)
|
|
|
|
+
|
|
|
|
+ @classmethod
|
|
|
|
+ def check_agent_service_package(cls, order_id, uid, package_id):
|
|
|
|
+ """
|
|
|
|
+ 检查是否代理服务套餐
|
|
|
|
+ @param package_id: 套餐id
|
|
|
|
+ @param order_id: 订单ID
|
|
|
|
+ @param uid: UID
|
|
|
|
+ @return: True | False
|
|
|
|
+ """
|
|
|
|
+ try:
|
|
|
|
+ serial_number = CommonService.get_serial_number_by_uid(uid)
|
|
|
|
+ a_device_qs = AgentDevice.objects.filter(serial_number=serial_number) \
|
|
|
|
+ .values('ac_id', 'type', 'status')
|
|
|
|
+ if not a_device_qs.exists():
|
|
|
|
+ return False
|
|
|
|
+ LOGGER.info(f'******check_agent_service_package当前设备属于代理商*****serial_number:{serial_number}')
|
|
|
|
+ asy = threading.Thread(target=cls.save_agent_package,
|
|
|
|
+ args=(order_id, serial_number, a_device_qs[0]['ac_id'], package_id))
|
|
|
|
+ asy.start()
|
|
|
|
+ return True
|
|
|
|
+ except Exception as e:
|
|
|
|
+ LOGGER.info('*****AgentOrderView.check_agent_service_package:errLine:{}, errMsg:{}'
|
|
|
|
+ .format(e.__traceback__.tb_lineno, repr(e)))
|
|
|
|
+ return False
|
|
|
|
+
|
|
|
|
+ @classmethod
|
|
|
|
+ def save_agent_package(cls, order_id, serial_number, ac_id, package_id):
|
|
|
|
+ """
|
|
|
|
+ 保存代理套餐
|
|
|
|
+ """
|
|
|
|
+ try:
|
|
|
|
+ package_id = int(package_id)
|
|
|
|
+ agent_package_qs = AgentCloudServicePackage.objects.filter(package_id=package_id, status=1)
|
|
|
|
+ if not agent_package_qs.exists():
|
|
|
|
+ LOGGER.info(f'******save_agent_package当前套餐未绑定代理******order_id:{order_id},serial_number:{serial_number}')
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ agent_package = agent_package_qs.first() # 代理云服务套餐
|
|
|
|
+ LOGGER.info(f'******save_agent_package代理套餐******agentPackage:{agent_package_qs.first()}')
|
|
|
|
+ acp_qs = AgentCustomerPackage.objects.filter(ac_id=ac_id, cs_id=agent_package.id).values('id')
|
|
|
|
+ if not acp_qs.exists():
|
|
|
|
+ LOGGER.info(f'******save_agent_package当前代理客户未添加此套餐******ac_id:{ac_id},package_id:{package_id}')
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ order_qs = Order_Model.objects.filter(orderID=order_id, status=1).values('price', 'payTime')
|
|
|
|
+ if not order_qs.exists():
|
|
|
|
+ LOGGER.info(f'******save_agent_package当前代理客户未添加此套餐******ac_id:{ac_id},package_id:{package_id}')
|
|
|
|
+ return
|
|
|
|
+ # 组装数据
|
|
|
|
+ now_time = int(time.time())
|
|
|
|
+
|
|
|
|
+ pay_price = Decimal(order_qs[0]['price']).quantize(Decimal('0.00'))
|
|
|
|
+ profit = cls.calculate_order_profit(agent_package, pay_price)
|
|
|
|
+ dict_data = {'ac_id': ac_id, 'serial_number': serial_number, 'csp_id': package_id,
|
|
|
|
+ 'order_id': order_id, 'status': 1, 'profit_amount': pay_price, 'profit': profit,
|
|
|
|
+ 'pay_time': order_qs[0]['payTime'], 'created_time': now_time, 'updated_time': now_time}
|
|
|
|
+ AgentDeviceOrder.objects.create(**dict_data)
|
|
|
|
+ LOGGER.info(f'******save_agent_package代理订单存表结束:{dict_data}')
|
|
|
|
+ except Exception as e:
|
|
|
|
+ LOGGER.info('*****AgentOrderView.save_agent_package:errLine:{}, errMsg:{}'
|
|
|
|
+ .format(e.__traceback__.tb_lineno, repr(e)))
|
|
|
|
+
|
|
|
|
+ @classmethod
|
|
|
|
+ def calculate_order_profit(cls, agent_package, price):
|
|
|
|
+ """
|
|
|
|
+ 计算利润
|
|
|
|
+ @param agent_package: 套餐配置
|
|
|
|
+ @param price: 支付价格
|
|
|
|
+ @return: 利润
|
|
|
|
+ """
|
|
|
|
+ profit = 0
|
|
|
|
+ price = Decimal(price).quantize(Decimal('0.00'))
|
|
|
|
+ if agent_package.profit_type == 1:
|
|
|
|
+ profit = agent_package.profit
|
|
|
|
+ elif agent_package.profit_type == 2:
|
|
|
|
+ profit_value = Decimal(agent_package.profit).quantize(Decimal('0.00'))
|
|
|
|
+ cost = Decimal(agent_package.cost).quantize(Decimal('0.00'))
|
|
|
|
+ profit = (price - cost) * (profit_value / 100)
|
|
|
|
+ profit = profit.quantize(Decimal('0.00'))
|
|
|
|
+ return profit
|