feat(douyu-pool): 支持和平精英号池兑换与商品自动刷新,优化号池操作面板

- 扩展号池支持 peace (和平精英/小跑道) 活动 scope,映射 xpd_balance 与 exchange_xpd_goods 任务
- 新增 POST /douyu/pool/refresh-goods 接口与前端一键刷新,支持复用库内有效 CK 自动更新商品快照
- 前端 DouyuPoolPage 升级视觉设计与栅格布局,商品选择器支持按活动类型分类联动
- 修复 DouyuTask.result 类型守卫、account_events actor_id 类型防御与 runner 过滤规则边界值处理
- 验证方式:全量 pytest (797 通过)、pyright (0 错误)、tsc -b 及 ruff format/check 全部通过
This commit is contained in:
yml2213
2026-10-08 13:15:21 +08:00
parent 88422f2f05
commit bb20533c90
8 changed files with 669 additions and 211 deletions
+2 -1
View File
@@ -32,7 +32,7 @@ from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import Session
from ..models import Account, AccountEvent, AccountLease, DouyuTask, User
from .account_binding import SCOPE_ELITE, SCOPE_ESPORTS
from .account_binding import SCOPE_ELITE, SCOPE_ESPORTS, SCOPE_PEACE
#: 租约默认有效期(分钟)。到点由 `account_lease_reaper` 兜底回收。
DEFAULT_LEASE_TTL_MINUTES = 60
@@ -53,6 +53,7 @@ _POOL_OWNER_ROLES = ("super_admin", "operation")
_SCOPE_COLUMNS: dict[str, tuple[str, str | None]] = {
SCOPE_ELITE: ("points", "elite_opened"),
SCOPE_ESPORTS: ("esports_points", "esports_opened"),
SCOPE_PEACE: ("xpd_balance", None),
}
SUPPORTED_POOL_SCOPES = tuple(_SCOPE_COLUMNS)
+4 -1
View File
@@ -291,8 +291,11 @@ class DouyuBatchRunnerCore:
current = getattr(account, column, None)
if current is None:
return ""
raw_val = rule.get("value")
if raw_val is None:
return ""
try:
target = int(rule.get("value"))
target = int(raw_val)
except (TypeError, ValueError):
return ""
if compare(int(current), target):