diff --git a/app/api/routes/scrape.py b/app/api/routes/scrape.py index 4f7148f..ee4bbd2 100644 --- a/app/api/routes/scrape.py +++ b/app/api/routes/scrape.py @@ -34,6 +34,9 @@ from surugaya_common.models import SurugayaOrderDetail router = APIRouter(prefix="/api", tags=["scrape"]) +# 同一 trade_code 在该窗口内不因 /trade 未命中重复下发抓取任务 +TRADE_PENDING_TTL_SECONDS = 3600 + def _parse_callback_response_body(content_type: str, body_bytes: bytes) -> Any: if not body_bytes: @@ -317,7 +320,7 @@ async def trade( dedup_key = redis_keys.trade_pending_key(trade_code) dedup_exists = await container.session_store._redis.get(dedup_key) if not dedup_exists: - await container.session_store._redis.setex(dedup_key, 3600, "1") + await container.session_store._redis.setex(dedup_key, TRADE_PENDING_TTL_SECONDS, "1") await container.session_store._redis.xadd( name=redis_keys.trade_fetch_stream(), fields={"payload": json.dumps({"trade_code": trade_code})}, @@ -352,6 +355,52 @@ async def trade( ) +@router.get( + "/trade/refresh", + response_model=ApiResponse[None], + dependencies=[Depends(require_bearer_token)], +) +async def trade_refresh( + trade_code: str, + container: ServiceContainer = Depends(get_container), +) -> ApiResponse[None]: + """ + 立即下发订单详情刷新任务(绕过 /trade 未命中时的去重窗口,强制重抓) + """ + if not trade_code or trade_code.strip() == "": + return ApiResponse[None]( + success=False, + msg="trade_code 不能为空", + data=None, + code=400, + ) + + if container.session_store._redis is None: + return ApiResponse[None]( + success=False, + msg="Redis 未配置", + data=None, + code=500, + ) + + # 强制下发并重置去重窗口,避免随后 /trade 未命中时再次重复下发 + await container.session_store._redis.setex( + redis_keys.trade_pending_key(trade_code), TRADE_PENDING_TTL_SECONDS, "1" + ) + await container.session_store._redis.xadd( + name=redis_keys.trade_fetch_stream(), + fields={"payload": json.dumps({"trade_code": trade_code})}, + maxlen=100, + approximate=True, + ) + + return ApiResponse[None]( + success=True, + msg="success", + data=None, + code=0, + ) + @router.post( "/test/check_task_callback_url",