fix: 假单打乱时间比较改用时间戳,避免 naive/aware 相减报错
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
"""抢单大厅假单:无资格/封禁打手仅展示假数据。"""
|
"""抢单大厅假单:无资格/封禁打手仅展示假数据。"""
|
||||||
import random
|
import random
|
||||||
from datetime import timedelta
|
from datetime import datetime, timedelta
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
@@ -55,6 +55,26 @@ def _ensure_aware(dt):
|
|||||||
return 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):
|
def _parse_shuffle_time(value):
|
||||||
if not value:
|
if not value:
|
||||||
return None
|
return None
|
||||||
@@ -68,8 +88,14 @@ def _display_time_str_for_order(order_id, anchor_dt):
|
|||||||
"""同一假单在打乱窗口内展示时间固定。"""
|
"""同一假单在打乱窗口内展示时间固定。"""
|
||||||
seed = abs(hash(str(order_id))) % (2 ** 32)
|
seed = abs(hash(str(order_id))) % (2 ** 32)
|
||||||
seconds_ago = 120 + (seed % 181)
|
seconds_ago = 120 + (seed % 181)
|
||||||
base = _ensure_aware(anchor_dt) or timezone.now()
|
base_ts = _to_unix_ts(_ensure_aware(anchor_dt) or timezone.now())
|
||||||
return fmt_datetime(base - timedelta(seconds=seconds_ago))
|
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):
|
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:
|
if not last_dt and not created:
|
||||||
last_dt = _ensure_aware(state.LastShuffleTime)
|
last_dt = _ensure_aware(state.LastShuffleTime)
|
||||||
|
|
||||||
|
elapsed = _elapsed_seconds(last_dt, now)
|
||||||
need_reshuffle = (
|
need_reshuffle = (
|
||||||
not stored_ids
|
not stored_ids
|
||||||
or last_dt is None
|
or last_dt is None
|
||||||
or (now - last_dt).total_seconds() >= interval
|
or elapsed is None
|
||||||
|
or elapsed >= interval
|
||||||
)
|
)
|
||||||
|
|
||||||
if need_reshuffle:
|
if need_reshuffle:
|
||||||
|
|||||||
Reference in New Issue
Block a user