禁用除新订单服务号广播外的所有 Celery/Beat 任务,仅保留 dingdan_guangbo
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -61,8 +61,22 @@ ensure_redis_loaded()
|
||||
@receiver(pre_save, sender='dingdan.Dingdan')
|
||||
def handle_order_status_8(sender, instance, **kwargs):
|
||||
"""
|
||||
订单状态变为8时,提交定时任务
|
||||
订单状态变为8时,提交定时任务(已禁用:仅保留新订单广播)
|
||||
"""
|
||||
if getattr(settings, 'CELERY_ONLY_ORDER_BROADCAST', True):
|
||||
if instance.pk is None:
|
||||
return
|
||||
try:
|
||||
from dingdan.models import Dingdan
|
||||
old = Dingdan.objects.filter(pk=instance.pk).values_list('zhuangtai', flat=True).first()
|
||||
if old == 8 and instance.zhuangtai != 8:
|
||||
instance.status_8_time = None
|
||||
instance.pending_dispatch = False
|
||||
instance.auto_task_id = ''
|
||||
except Exception as e:
|
||||
logger.error(f"信号处理失败: {e}")
|
||||
return
|
||||
|
||||
# 跳过新增的订单
|
||||
if instance.pk is None:
|
||||
return
|
||||
|
||||
@@ -17,6 +17,7 @@ import logging
|
||||
from dingdan.models import Dingdan, DingdanShangjia
|
||||
from yonghu.models import UserMain, UserDashou, UserShangjia
|
||||
from utils.celery_utils import safe_decimal_operation, log_task_execution, rollback_on_failure
|
||||
from utils.celery_guard import celery_non_broadcast_blocked
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -33,6 +34,11 @@ def process_expired_order(self, dingdan_id):
|
||||
"""
|
||||
处理单个超时订单(订单状态=8,超过48小时未处理)
|
||||
"""
|
||||
blocked = celery_non_broadcast_blocked()
|
||||
if blocked:
|
||||
logger.info('跳过 process_expired_order(%s): %s', dingdan_id, blocked)
|
||||
return blocked
|
||||
|
||||
if not getattr(settings, 'ORDER_AUTO_SETTLE_ENABLED', False):
|
||||
logger.info('订单自动结算已禁用,跳过 process_expired_order(%s)', dingdan_id)
|
||||
return f'自动结算已禁用,跳过订单{dingdan_id}'
|
||||
@@ -166,6 +172,10 @@ def process_expired_order(self, dingdan_id):
|
||||
@shared_task(bind=True, max_retries=3, default_retry_delay=15)
|
||||
def retry_establish_order_chat_task(self, dingdan_id):
|
||||
"""抢单后建聊失败时的延迟补偿任务"""
|
||||
blocked = celery_non_broadcast_blocked()
|
||||
if blocked:
|
||||
return blocked
|
||||
|
||||
try:
|
||||
from utils.chat_utils import establish_order_chat_with_retry
|
||||
ok = establish_order_chat_with_retry(dingdan_id, max_rounds=5)
|
||||
@@ -186,6 +196,10 @@ def retry_establish_order_chat_task(self, dingdan_id):
|
||||
@shared_task(bind=True, max_retries=2, default_retry_delay=10)
|
||||
def push_order_status_chat_task(self, dingdan_id):
|
||||
"""订单状态变更后推送群聊状态卡片"""
|
||||
blocked = celery_non_broadcast_blocked()
|
||||
if blocked:
|
||||
return blocked
|
||||
|
||||
try:
|
||||
from utils.chat_utils import push_order_status_chat_update
|
||||
ok = push_order_status_chat_update(dingdan_id)
|
||||
@@ -209,6 +223,11 @@ def check_order_expire_task():
|
||||
每5分钟执行一次,作为信号处理的备用方案
|
||||
查找状态为8且创建时间超过72小时的订单(宽松时间,防止误处理)
|
||||
"""
|
||||
blocked = celery_non_broadcast_blocked()
|
||||
if blocked:
|
||||
logger.info('跳过 check_order_expire_task: %s', blocked)
|
||||
return {"success": True, "message": blocked, "count": 0}
|
||||
|
||||
if not getattr(settings, 'ORDER_AUTO_SETTLE_ENABLED', False):
|
||||
logger.info('订单自动结算已禁用,跳过 check_order_expire_task')
|
||||
return {"success": True, "message": "自动结算已禁用", "count": 0}
|
||||
|
||||
@@ -3,7 +3,7 @@ import logging
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
from a_long_dianjing.celery_app import app
|
||||
from a_long_dianjing.celery import app
|
||||
from utils.weixin_broadcast import WeixinBroadcastSender
|
||||
|
||||
logger = logging.getLogger('weixin_broadcast')
|
||||
@@ -12,11 +12,13 @@ logger = logging.getLogger('weixin_broadcast')
|
||||
@app.task(
|
||||
bind=True,
|
||||
name='dingdan.tongzhi_tasks.dingdan_guangbo',
|
||||
max_retries=2,
|
||||
max_retries=3,
|
||||
default_retry_delay=30,
|
||||
queue='broadcast',
|
||||
soft_time_limit=240,
|
||||
time_limit=300,
|
||||
acks_late=True,
|
||||
reject_on_worker_lost=True,
|
||||
)
|
||||
def dingdan_guangbo(self, order_info):
|
||||
"""
|
||||
|
||||
@@ -4211,12 +4211,13 @@ class QiangdanView(APIView):
|
||||
chat_success = establish_order_chat_with_retry(dingdan_id, max_rounds=5)
|
||||
|
||||
if not chat_success:
|
||||
try:
|
||||
from dingdan.tasks import retry_establish_order_chat_task
|
||||
retry_establish_order_chat_task.apply_async(args=[dingdan_id], countdown=8)
|
||||
retry_establish_order_chat_task.apply_async(args=[dingdan_id], countdown=30)
|
||||
except Exception as chat_task_err:
|
||||
logger.error(f"提交建聊补偿任务失败: {chat_task_err}")
|
||||
if not getattr(settings, 'CELERY_ONLY_ORDER_BROADCAST', True):
|
||||
try:
|
||||
from dingdan.tasks import retry_establish_order_chat_task
|
||||
retry_establish_order_chat_task.apply_async(args=[dingdan_id], countdown=8)
|
||||
retry_establish_order_chat_task.apply_async(args=[dingdan_id], countdown=30)
|
||||
except Exception as chat_task_err:
|
||||
logger.error(f"提交建聊补偿任务失败: {chat_task_err}")
|
||||
|
||||
try:
|
||||
update_dashou_daily_by_action(
|
||||
|
||||
Reference in New Issue
Block a user