trade/refresh
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user