Ver Fonte

新增代理商订单套餐记录、优化代理订单表

zhangdongming há 1 ano atrás
pai
commit
bb6002fcd6

+ 142 - 0
AdminController/CloudServiceManage/AgentOrderController.py

@@ -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

+ 2 - 0
AgentModel/models.py

@@ -141,6 +141,8 @@ class AgentDeviceOrder(models.Model):
     is_del = models.BooleanField(blank=True, default=False, verbose_name=u'是否删除')
     settlement_time = models.IntegerField(default=0, verbose_name='结算时间')
     remark = models.CharField(null=True, default=None, max_length=128, verbose_name='备注')
+    expire_time = models.IntegerField(default=0, verbose_name='套餐失效时间')
+    pay_time = models.IntegerField(default=0, verbose_name='套餐支付时间')
     created_time = models.IntegerField(default=0, verbose_name='创建时间')
     updated_time = models.IntegerField(default=0, verbose_name='修改时间')