feat(douyu): 精英宝典支持查询开通状态,开通前先校验且不再误判到账

线上两个问题:工作台看不到账号有没有开通精英宝典;点开通时二维码会「闪一下
就变小」——大图弹窗 2~4 秒后自动关闭,只剩列表里 56px 的小二维码。

根因:
- getUserInfo 的 manualType/expireTime 才是开通状态的权威口径,但只有兑换
  流程用过一次,没有任务类型对外暴露;前端只看积分列,而「开通后积分花完」
  和「从未开通」都是 0 分,区分不了(实测 13456 manualType=1/score=0);
- 开通前不查状态,且到账判定写成「积分 >= 300」:账上本来就有 680 分的账号
  在出码后第一轮轮询就被判成功,前端按 paymentArrived 自动关掉了弹窗。

改动:
- 新增任务类型 query_elite_status:查 manualType/manualScore/expireTime 并
  落库到 accounts.elite_opened / elite_expire_time(迁移 20261001_0036),
  精英工作台加查询按钮与「宝典状态」列(已开通+到期 / 未开通);
- create_elite_qr 开通前先查状态:已开通直接判成功、不再生成支付码(方案 A),
  既消除二维码闪现,也避免给已开通账号开出真实支付单;
- 到账判定改为「积分比开通前增长」,基线用与轮询同源的 credit/balance 取,
  取不到基线才退回旧口径;
- 支付弹窗不再自动关闭:到账/失败/停止都在弹窗里给结论 + 手动关闭;列表小
  二维码在任务进终态后隐藏。

新增 9 条测试覆盖上述行为,回退 runner 时其中 8 条失败。
This commit is contained in:
yml2213
2026-10-01 19:08:25 +08:00
parent 4d87cdc16d
commit 99db772ddd
12 changed files with 546 additions and 25 deletions
@@ -0,0 +1,40 @@
"""accounts 增加精英宝典开通状态字段。
原来只能靠「积分」列猜有没有开通,但开通后积分花完与从未开通过都是 0 分,
根本区分不了(线上实测:某账号 manualType=1/manualScore=0,另一个从未开通的
是 manualType=0/manualScore=0)。getUserInfo 的 manualType/expireTime 才是
权威口径,这里落库供工作台直接展示。
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
revision: str = "20261001_0036"
down_revision: str | None = "20261001_0035"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
bind = op.get_bind()
columns = {item["name"] for item in sa.inspect(bind).get_columns("accounts")}
if "elite_opened" not in columns:
op.add_column(
"accounts",
sa.Column("elite_opened", sa.Boolean(), nullable=True),
)
if "elite_expire_time" not in columns:
op.add_column(
"accounts",
sa.Column("elite_expire_time", sa.Integer(), nullable=True),
)
def downgrade() -> None:
bind = op.get_bind()
columns = {item["name"] for item in sa.inspect(bind).get_columns("accounts")}
for name in ("elite_expire_time", "elite_opened"):
if name in columns:
op.drop_column("accounts", name)