diff --git a/jituan/services/order_deal.py b/jituan/services/order_deal.py index 1703cde..c6cc4e9 100644 --- a/jituan/services/order_deal.py +++ b/jituan/services/order_deal.py @@ -689,11 +689,44 @@ def save_deal_config(club_id: str, data: dict, updated_by: str = '') -> dict: row.updated_by = (updated_by or '')[:32] _persist_deal_config_row(row) - # 保存后触发一次历史回填,保证抢单池马上能刷到成交率/罚款率 + # 强制按主键再写一遍开关字段,避免偶发 save 未落 bool、前端「保存成功又弹回」 + from jituan.models import ClubOrderDealConfig + try: + ClubOrderDealConfig.objects.filter(pk=row.pk).update( + auto_settle_enabled=bool(row.auto_settle_enabled), + auto_settle_enabled_at=row.auto_settle_enabled_at, + dispatch_block_enabled=bool(getattr(row, 'dispatch_block_enabled', False)), + stats_enabled=bool(row.stats_enabled), + stats_since=row.stats_since, + hours_platform=int(row.hours_platform or 48), + hours_merchant=int(row.hours_merchant or 48), + dispatch_block_hours=int(getattr(row, 'dispatch_block_hours', None) or 24), + updated_by=(row.updated_by or '')[:32], + ) + except Exception as e: + logger.error('deal config 开关二次写入失败 club=%s: %s', row.club_id, e, exc_info=True) + raise + # minutes 列可能尚未迁移:单独尝试,失败忽略 + try: + ClubOrderDealConfig.objects.filter(pk=row.pk).update( + minutes_platform=getattr(row, 'minutes_platform', None), + minutes_merchant=getattr(row, 'minutes_merchant', None), + dispatch_block_minutes=getattr(row, 'dispatch_block_minutes', None), + ) + except Exception as e: + logger.warning('deal config minutes 二次写入跳过 club=%s: %s', row.club_id, e) + row.refresh_from_db() + logger.info( + 'deal config saved club=%s auto=%s block=%s stats=%s by=%s', + row.club_id, + row.auto_settle_enabled, + getattr(row, 'dispatch_block_enabled', False), + row.stats_enabled, + row.updated_by, + ) + # 保存后触发一次历史回填(幂等;勿每次删标记,否则会拖垮保存请求) try: - from jituan.models import DealStatEvent from jituan.services.deal_stats import ensure_club_stats_bootstrapped - DealStatEvent.objects.filter(event_key=f'{row.club_id}:stats_bootstrap_v1').delete() ensure_club_stats_bootstrapped(row.club_id) except Exception as e: logger.warning('保存成交配置后回填失败 club=%s: %s', row.club_id, e)