From 3d2fb61df56fb444386525860342ecc4234e4f5f Mon Sep 17 00:00:00 2001 From: XingQue Date: Sun, 28 Jun 2026 18:41:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=81=87=E5=8D=95=E6=89=93=E4=B9=B1?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=AF=94=E8=BE=83=E6=94=B9=E7=94=A8=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=88=B3=EF=BC=8C=E9=81=BF=E5=85=8D=20naive/aware=20?= =?UTF-8?q?=E7=9B=B8=E5=87=8F=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- orders/services/fake_order_pool.py | 36 ++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/orders/services/fake_order_pool.py b/orders/services/fake_order_pool.py index dd6a1aa..cfa5384 100644 --- a/orders/services/fake_order_pool.py +++ b/orders/services/fake_order_pool.py @@ -1,6 +1,6 @@ """抢单大厅假单:无资格/封禁打手仅展示假数据。""" import random -from datetime import timedelta +from datetime import datetime, timedelta from decimal import Decimal from django.core.exceptions import ObjectDoesNotExist @@ -55,6 +55,26 @@ def _ensure_aware(dt): return dt +def _to_unix_ts(dt): + """统一转为 Unix 时间戳,避免 naive/aware 直接相减报错。""" + if dt is None: + return None + if timezone.is_aware(dt): + return dt.timestamp() + try: + return timezone.make_aware(dt, timezone.get_current_timezone()).timestamp() + except Exception: + return dt.timestamp() + + +def _elapsed_seconds(since_dt, until_dt): + since_ts = _to_unix_ts(since_dt) + until_ts = _to_unix_ts(until_dt) + if since_ts is None or until_ts is None: + return None + return until_ts - since_ts + + def _parse_shuffle_time(value): if not value: return None @@ -68,8 +88,14 @@ def _display_time_str_for_order(order_id, anchor_dt): """同一假单在打乱窗口内展示时间固定。""" seed = abs(hash(str(order_id))) % (2 ** 32) seconds_ago = 120 + (seed % 181) - base = _ensure_aware(anchor_dt) or timezone.now() - return fmt_datetime(base - timedelta(seconds=seconds_ago)) + base_ts = _to_unix_ts(_ensure_aware(anchor_dt) or timezone.now()) + if base_ts is None: + base_ts = _to_unix_ts(timezone.now()) or 0 + display_dt = datetime.fromtimestamp( + base_ts - seconds_ago, + tz=timezone.get_current_timezone(), + ) + return fmt_datetime(display_dt) def _load_fake_rows_in_saved_order(club_id, leixing_id): @@ -107,10 +133,12 @@ def _load_fake_rows_in_saved_order(club_id, leixing_id): if not last_dt and not created: last_dt = _ensure_aware(state.LastShuffleTime) + elapsed = _elapsed_seconds(last_dt, now) need_reshuffle = ( not stored_ids or last_dt is None - or (now - last_dt).total_seconds() >= interval + or elapsed is None + or elapsed >= interval ) if need_reshuffle: