# -*- 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') LOGGER.info(f'******check_agent_service_package检查是否代理*****orderId:{order_id}') 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