|
@@ -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)}')
|