feat(account): 一键查询展示「角色绑定明细」—— 不只一个"已绑定"

用户看到绑定状态后问:「是不是在详情中增加详细的绑定信息啥的」。

`bind_info` 的返回里本来就有明细(`_parse_bind_info` 会解析出来),
之前只取了 `role_name` 一项。现在把运营真正要看的都带上:

- **角色名**(`role_name`)
- **区服 / 平台**(`area_name` / `plat_name`)
- 换绑冷却(`change_role_wait_time`)与可换绑时间(`can_change_time`)

实测(账号 61):

  精英: 柿子洋音 / 微信 / 安卓(android)
  电竞: 资跳 / 微信 / 苹果(iOS),可换绑 1788624000

面板新增「🎮 角色绑定明细」卡片,三个作用域并排;
冷却时间格式化成"无 / x 小时 / x 天 y 小时",
时间戳过 `formatUnixSeconds` 那套(`0`/空显示 `-`,不显示 1970)。

## 验证(本地)

TZ=Asia/Shanghai **615 passed / 6 skipped**;ruff 全绿;前端 build 通过。
This commit is contained in:
yml2213
2026-10-04 20:26:31 +08:00
parent 6b5271c983
commit b199428619
2 changed files with 71 additions and 1 deletions
@@ -452,9 +452,16 @@ class OverviewMixin:
try:
info = self._fetch_bind_info(client, scope, alias)
derived = derive_from_bind_info(info)
# 把**明细**也带上:运营要看的是"绑的哪个角色、哪个区服、
# 什么时候能换绑",不是一个"已绑定"就完事。
overview["bind"][scope] = {
"derived": derived,
"role_name": str(info.get("role_name") or info.get("role") or ""),
"area_name": str(info.get("area_name") or ""),
"plat_name": str(info.get("plat_name") or ""),
"nickname": str(info.get("nickname") or ""),
"change_role_wait_time": _ts(info.get("change_role_wait_time")),
"can_change_time": _ts(info.get("can_change_time")),
}
if derived is not None:
# 唯一写入者;推不出来(None)时**不动原值** —— 宁可留 unknown,