From 09f12c6c477274488b60a07f14ca53addb67cdd5 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Thu, 11 Jun 2026 18:27:21 +0800 Subject: [PATCH] trade/refresh --- app/api/routes/scrape.py | 51 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) 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",