Merge branch 'main' into dev

This commit is contained in:
yml2213
2026-10-07 14:52:22 +08:00
8 changed files with 128 additions and 117 deletions
+19 -36
View File
@@ -17,46 +17,29 @@
### 2.1 「是否已获得」的依据:**官方兑换记录**(⚠️ 修正过一次)
**结论:用 `exchange_records(manual_id)` 判定,不要用 `query_limited_goods` 的库存字段。**
**结论:以商城 `storehome` 商品项的 `status == 1`(已达兑换上限)为最高裁判;`exchange_records` 仅作历史展示与下架商品兜底。**
#### ❌ 被推翻的第一版规则
#### ❌ 历史踩坑与认知误区复盘(2026-10-07 事故修正)
第一版拿 `query_limited_goods` 商品项里的 `count` / `storeStatus` 判断,依据是:
第一版曾误以为商品列表里的 `count`(库存数)和 `storeStatus`(店铺上架状态)在不同账号间一致,
就武断地认为“商品列表整个对象都是全局的,不暴露账号信息”,因而全盘依赖 `exchange_records(manual_id)`。
| 字段 | 账号 558(兑换过) | 账号 15407(没兑换) |
**这是严重的偷换概念与认知漏洞!**
实测(HAR 抓包与生产 50 账号对比采样)表明:
1. 斗鱼官方的 `exchange_records`(`exchangeList`)接口对早期兑换记录**早已返回空列表(0 条)**,根本不可信;
2. 斗鱼官方真正的账号准入状态就在商城接口 `storehome`(`list_goods`)中:
- **`status == 1`**:官方前端渲染为【已达兑换上限】(该账号限量 1 件已满,已兑换,不可再兑);
- **`status == 0`**:官方前端渲染为【立即兑换】(该账号未兑换,可兑换)。
生产 50 账号实测中,兔兔白日梦有 23 个账号 `status=0`(可兑换),27 个账号 `status=1`(已达上限)。
#### ✅ 正确判定法则(双重承重)
| 来源 | 条件 | 判定结果 |
| --- | --- | --- |
| `count` | 0 | 96982 |
| `storeStatus` | 0 | 1 |
**这是错的。** 上面两条记录分别取自 **2026-08-01** 和 **2026-10-04**,
相隔两个月 —— 我把**时间差异**当成了**账号差异**。
在**同一时刻**同时查 558 / 607(都兑换过)和 15507(没有),
商品项的**所有字段完全一致**,`preExchange.isExists` 也都是 0。
`count` 的取值分布是 0 / 98746 / 103350 / 109832 … 随时间变化,
**是全局库存/活动状态,不暴露账号维度信息**。
> 用全局字段判"这个账号有没有"必然给错结论 ——
> 而对高价值资产给错结论是本功能最不能接受的失败方式。
#### ✅ 正确依据
`exchange_records(manual_id)` —— 斗鱼官方的**账号级**兑换记录。同一时刻实测:
| 账号 | 官方兑换记录 | 判定 |
| --- | --- | --- |
| 558 | `破片手榴弹-兔兔白日梦` | **已获得** |
| 607 | `破片手榴弹-兔兔白日梦` | **已获得** |
| 15507 | (0 条) | 未获得 |
同时刻三者看到的兔兔白日梦库存**都是 96956**(全局),但兑换记录把账号区分得干干净净。
#### 两处信息各司其职
| 来源 | 用途 |
| --- | --- |
| `exchange_records` | **是否已获得**(账号级) |
| `query_limited_goods` | 当前积分价 / 库存 / 活动时间(**全局**,只用于"现在还能不能换、要多少分") |
| 商城商品列表(`storehome`) | `status == 1` | **已获得 / 已达兑换上限(不可再兑)**(最高现场裁判) |
| 商城商品列表(`storehome`) | `status == 0` 且 records 无记录 | **未获得(可兑换)** |
| 官方兑换记录(`exchange_records`) | 存在匹配记录 | **已获得**(用于已下架商品的历史兜底) |
| 两处均查无此商品 | - | `missing = True`(未上架/未查到) |
#### 名字按子串匹配