按 docs/order-gateway.md 落地:第三个部署单元 app.gateway(:31109)承担任务队列 + 状态镜像;本地 worker 在 app.trading.worker 内,按 RAKUTEN_ORDER_GATEWAY_URL 决定是否启动。规格 §5 最关键约束已守:租约过期绝不自动重投,恢复只能 reclaim, worker 收到 lease_count>1 时先核对站点订单。 站点交互(加购/下单/付款/订单列表反查)按规格 §10 留接口缝,site_interact.py 全部 NotImplementedError,verify.py 恒返回 unknown——等真实账号实测后再填, 不写猜测的提交逻辑。 310 个测试全绿,覆盖规格 §9 验收清单 12 条;架构测试守住三方互不 import。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
29 lines
980 B
Python
29 lines
980 B
Python
"""worker 侧数据模型:不引用网关的 Pydantic 模型
|
|
|
|
worker 通过 HTTP 与网关交互,看到的只有 JSON。这里定义 worker 自己用来表达
|
|
「领到的任务」「核对结论」的数据类——结构上对应网关响应,但**不 import**
|
|
app.gateway 的任何东西,保证架构边界(worker → shared,禁止 worker → gateway)。
|
|
|
|
OrderState / TaskStatus 枚举在 app.shared.task_state,两侧共用同一份取值表。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import Any
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class LeaseTask:
|
|
"""worker 从网关领到的任务
|
|
|
|
对应网关 GET /api/orders/lease 的 LeaseData,但用 dataclass 表达——worker
|
|
内部不依赖网关侧的 Pydantic 模型。
|
|
"""
|
|
|
|
task_id: str
|
|
site: str
|
|
intent: dict[str, Any] = field(default_factory=dict)
|
|
lease_expires_at: str = ""
|
|
lease_count: int = 1
|
|
known_state: str | None = None
|