trade/refresh

This commit is contained in:
2026-06-11 18:27:21 +08:00
parent 02a4484211
commit 09f12c6c47
+50 -1
View File
@@ -34,6 +34,9 @@ from surugaya_common.models import SurugayaOrderDetail
router = APIRouter(prefix="/api", tags=["scrape"]) 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: def _parse_callback_response_body(content_type: str, body_bytes: bytes) -> Any:
if not body_bytes: if not body_bytes:
@@ -317,7 +320,7 @@ async def trade(
dedup_key = redis_keys.trade_pending_key(trade_code) dedup_key = redis_keys.trade_pending_key(trade_code)
dedup_exists = await container.session_store._redis.get(dedup_key) dedup_exists = await container.session_store._redis.get(dedup_key)
if not dedup_exists: 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( await container.session_store._redis.xadd(
name=redis_keys.trade_fetch_stream(), name=redis_keys.trade_fetch_stream(),
fields={"payload": json.dumps({"trade_code": trade_code})}, 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( @router.post(
"/test/check_task_callback_url", "/test/check_task_callback_url",