فهرست منبع

增加周期结算方法、调度任务

zhangdongming 1 سال پیش
والد
کامیت
2f79475827
2فایلهای تغییر یافته به همراه85 افزوده شده و 3 حذف شده
  1. 78 3
      AdminController/CloudServiceManage/AgentOrderController.py
  2. 7 0
      Controller/CeleryTasks/tasks.py

+ 78 - 3
AdminController/CloudServiceManage/AgentOrderController.py

@@ -15,9 +15,10 @@ from django.http import QueryDict
 from django.views import View
 
 from AgentModel.models import AgentDevice, AgentCloudServicePackage, AgentCustomerPackage, AgentDeviceOrder, \
-    AgentDeviceOrderInstallment
+    AgentDeviceOrderInstallment, AgentAccount
 from Ansjer.config import LOGGER
 from Model.models import Order_Model, Store_Meal, UnicomCombo
+from Object.CeleryBeatObject import CeleryBeatObj
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -61,6 +62,27 @@ class AgentOrderView(View):
 
             self.check_agent_service_package(order_id, uid, int(package_id))
             return response.json(0)
+        elif operation == 'addSettlementJob':
+            self.add_settlement_job()
+            return response.json(0)
+
+        elif operation == 'delSettlementJob':
+            self.del_settlement_job()
+            return response.json(0)
+
+    @classmethod
+    def add_settlement_job(cls):
+        celery_beat_obj = CeleryBeatObj()
+        job_name = 'Agent-updateSettlement'
+        SMART_SCENE_TASK = 'Controller.CeleryTasks.tasks.update_installment_settlement_order'
+        celery_beat_obj.creat_crontab_task(
+            timezone_offset=8, name=job_name, task=SMART_SCENE_TASK, minute=1)
+
+    @classmethod
+    def del_settlement_job(cls):
+        celery_beat_obj = CeleryBeatObj()
+        job_name = 'Agent-updateSettlement'
+        celery_beat_obj.del_task(job_name)
 
     @classmethod
     def check_agent_service_package(cls, order_id, uid, package_id):
@@ -131,7 +153,7 @@ class AgentOrderView(View):
             agent_order_obj = AgentDeviceOrder.objects.create(**dict_data)
 
             # 保存分期结算记录
-            cls.save_order_installment(agent_order_obj.id, package_type, package_id, profit)
+            cls.save_order_installment(agent_order_obj.id, package_type, package_id, profit, ac_id)
 
             LOGGER.info(f'******save_agent_package代理订单存表结束:{dict_data}')
         except Exception as e:
@@ -265,7 +287,7 @@ class AgentOrderView(View):
         return distributed_amounts
 
     @classmethod
-    def save_order_installment(cls, agent_order_id, package_type, package_id, profit):
+    def save_order_installment(cls, agent_order_id, package_type, package_id, profit, ac_id=None):
         """
         保存代理订单分期信息
 
@@ -275,6 +297,7 @@ class AgentOrderView(View):
         :param package_id: 套餐ID
         :param profit: 利润总额
         :return: 无返回值
+        :param ac_id: 代理客户ID
         """
         try:
             # 根据包裹类型和ID获取结算时间间隔列表
@@ -295,6 +318,7 @@ class AgentOrderView(View):
             for time_point in range(period_number):
                 installment_list.append(AgentDeviceOrderInstallment(ado_id=agent_order_id,
                                                                     period_number=period_number,
+                                                                    ac_id=ac_id,
                                                                     amount=amount_list[time_point],
                                                                     due_date=time_list[time_point],
                                                                     status=1,
@@ -315,3 +339,54 @@ class AgentOrderView(View):
             # 记录异常信息
             LOGGER.error('*****AgentOrderView.save_OrderInstallment:errLine:{}, errMsg:{}'
                          .format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def update_periodic_settlement():
+        """
+        更新周期结算信息
+
+        返回值:
+        - 无返回值
+        """
+        try:
+            # 根据条件查询需要更新结算信息的订单分期记录
+            adoi_qs = AgentDeviceOrderInstallment.objects.filter(status=1, due_date__lte=int(time.time()))
+            if not adoi_qs:
+                # 如果没有找到符合条件的记录,直接返回
+                return
+
+            ids = []
+            a_account_list = []
+            adoi_set = set()
+            n_time = int(time.time())
+            for item in adoi_qs:
+                # 准备分期记录的id列表和账户记录列表
+                ids.append(item.id)
+                adoi_set.add(item.ado_id)
+                a_account_list.append(AgentAccount(ac_id=item.ac_id, amount=item.amount,
+                                                   remark=f'周期结算',
+                                                   status=1, created_time=n_time,
+                                                   updated_time=n_time))
+
+            batch_size = 100
+
+            # 分批更新分期记录状态
+            for i in range(0, len(ids), batch_size):
+                AgentDeviceOrderInstallment.objects.filter(id__in=ids[i:i + batch_size]) \
+                    .update(status=2, settlement_time=n_time, updated_time=n_time)
+
+            # 分批创建账户记录
+            for i in range(0, len(a_account_list), batch_size):
+                AgentAccount.objects.bulk_create(a_account_list[i:i + batch_size])
+
+            # 检查是否所有分期都已结算,如果是,则更新订单状态为已结算
+            for ado in adoi_set:
+                adoi_qs = AgentDeviceOrderInstallment.objects.filter(ado_id=ado, status=1)
+                if not adoi_qs.exists():
+                    AgentDeviceOrder.objects.filter(id=ado, status=1) \
+                        .update(status=2, settlement_time=n_time, updated_time=n_time)
+
+        except Exception as e:
+            # 记录异常信息
+            LOGGER.error(
+                f'*****AgentOrderView.update_periodic_settlement:errLine:{e.__traceback__.tb_lineno}, errMsg:{str(e)}')

+ 7 - 0
Controller/CeleryTasks/tasks.py

@@ -9,6 +9,7 @@
 # 需要在setup之前导入celery app,否则缺少Django环境配置
 from Ansjer.celery import app
 import django
+
 django.setup()
 
 # 其他导入在setup之后
@@ -38,6 +39,8 @@ def test(arg):
 @app.task
 def add(x, y):
     print(x + y)
+
+
 # ###################
 
 
@@ -71,3 +74,7 @@ def loocam_smart_scene(device_type, event_type, serial_number, scene_id=0):
         url = DETECT_PUSH_DOMAINS + 'gatewayService/sceneLogPush'
         requests.post(url=url, data=data, timeout=8)
 
+
+@app.task
+def update_installment_settlement_order():
+    LOGGER.info('update_installment_settlement_order测试周期任务')