refactor(huya): 协作台账 done 状态展示名「已完成」→「抢购成功」(枚举值不变)
This commit is contained in:
@@ -200,7 +200,7 @@ CK 自带完整生命周期(导入 → 验证 → 使用/失效 → 重贴/重
|
||||
### 4.1 业务状态机(一行的进度)
|
||||
|
||||
```
|
||||
pending ─人工确认─▶ bound ─充值─▶ recharged ─上脚本─▶ scripted ─兑换成功─▶ done
|
||||
pending ─人工确认─▶ bound ─充值─▶ recharged ─上脚本─▶ scripted ─抢购成功─▶ done
|
||||
│ │ │ │ │
|
||||
└─────────────────┴──────────────┴─────────────────┴──────────────────┴──▶ failed(兑换失败)
|
||||
│ │ │ │ │
|
||||
@@ -213,7 +213,7 @@ pending ─人工确认─▶ bound ─充值─▶ recharged ─上脚本─▶
|
||||
| `bound` | **已确认绑定** | 人工核对「探针读到的绑定角色」与「主页截图」一致后手动切 | 人工(单行 / 批量) |
|
||||
| `recharged` | 已充值 | 充值完成后手动切(可跳步);写 `recharged_at` | 人工 |
|
||||
| `scripted` | 已上脚本 | 脚本上完后手动切(可跳步);写 `scripted_at` | 人工 |
|
||||
| `done` | 已完成 | 人工切;**或**「已上脚本」的单查积分/兑换记录命中礼包后自动切(§5.7) | 人工 / 系统判定 |
|
||||
| `done` | **抢购成功** | 人工切;**或**「已上脚本」的单查积分/兑换记录命中礼包后自动切(§5.7) | 人工 / 系统判定 |
|
||||
| `failed` | **兑换失败** | 人工切;**或**「已上脚本」的单查兑换记录**没有**这个礼包后自动切(§5.7) | 人工 / 系统判定 |
|
||||
| `void` | 已作废 | 任意流程内状态可进;`void_reason` 必填 | 人工 |
|
||||
|
||||
@@ -390,7 +390,7 @@ CK 失效了业务上可能仍然有效。列表上只做**显式提示**(红
|
||||
|
||||
| 情况 | verdict | 业务状态 |
|
||||
| --- | --- | --- |
|
||||
| 兑换记录里有这一单的礼包(名字互相包含即算命中,`gift_matches_records()`) | `success` | 「已上脚本」→ 自动「已完成」`done` |
|
||||
| 兑换记录里有这一单的礼包(名字互相包含即算命中,`gift_matches_records()`) | `success` | 「已上脚本」→ 自动「抢购成功」`done` |
|
||||
| 接口通了,但记录里没有这个礼包 | `failed` | 「已上脚本」→ 自动「兑换失败」`failed` |
|
||||
| 接口没通 / 这单没填礼包名 | `unknown` | **不动**(数据不够,不许瞎判) |
|
||||
|
||||
@@ -543,7 +543,7 @@ CK 失效了业务上可能仍然有效。列表上只做**显式提示**(红
|
||||
- **状态**:Tag 展示,行内"下一步"按钮推进(带二次确认);
|
||||
- **CK 状态**:Tag + 一键"验证";
|
||||
- 筛选:店铺 / 负责人 / 业务状态 / CK 状态 / 关键词(订单号、绑定账号、角色、uid);
|
||||
- 页头统计条:`待处理 N / 已绑定 N / 已充值 N / 已上脚本 N / 已完成 N / CK失效 N`。
|
||||
- 页头统计条:`待处理 N / 已确认绑定 N / 已充值·已上脚本 N / 抢购成功 N / 兑换失败 N / 已作废 N`(`done` 的展示名 2026-10-16 由「已完成」改为「抢购成功」,枚举值与库里数据不变)。
|
||||
|
||||
> 交互细节(2026-10-16 用户拍板):**店铺是点选按钮组**(列表里点单元格弹出同一组按钮,
|
||||
> 筛选条里也是),不是下拉;**新建时不用选负责人**——默认就是当前登录账号
|
||||
@@ -807,7 +807,7 @@ CK 失效了业务上可能仍然有效。列表上只做**显式提示**(红
|
||||
| 全生命周期 | 新表 `huya_external_order_metrics` + 迁移 `20261016_0059`;`query_order_activity()` / `query_activity_batch()`;`POST /{id}/activity/query`、`POST /activity/query`、`GET /{id}/metrics`;列表回填 `last_score/last_metric_at/last_verdict/last_metric_message` |
|
||||
| 前端 | 状态筛选与汇总卡片加「兑换失败」;工具栏「批量改状态(下拉选目标)」+「批量查积分/兑换」;行操作加「查积分 / 兑换记录」「改状态…」;列表加「积分」列(积分 + 判定徽标 + 时间,全文进 Tooltip);详情抽屉加「账号全生命周期」时间线 + 逐条命中的兑换记录 |
|
||||
| 测试 | 新增 `TestCollabStatusBatch`(4 例)、`TestCollabActivityLifecycle`(9 例);`tests/test_migrations.py` 的 `HEAD_REVISION` → `20261016_0059`;全量 `pytest` 944 passed / 6 skipped |
|
||||
| 接口冒烟 | `/tmp/smoke_collab_api.py` 补到 **67 项全绿**:批量跳步 + 时间戳补齐、单行查询命中→自动「已完成」、非 `scripted` 只记快照、时间线倒序、列表回填、批量查询判定→自动「兑换失败」、`failed` 状态筛选、批量逐行隔离、回退仍要 `rollback`、删单级联删快照 |
|
||||
| 接口冒烟 | `/tmp/smoke_collab_api.py` 补到 **67 项全绿**:批量跳步 + 时间戳补齐、单行查询命中→自动「抢购成功」、非 `scripted` 只记快照、时间线倒序、列表回填、批量查询判定→自动「兑换失败」、`failed` 状态筛选、批量逐行隔离、回退仍要 `rollback`、删单级联删快照 |
|
||||
|
||||
**这一轮踩到/定下的点**:
|
||||
|
||||
@@ -824,6 +824,10 @@ CK 失效了业务上可能仍然有效。列表上只做**显式提示**(红
|
||||
6. **尚未真机验证**:`getUserScore` / `getUserPrizeRecords` 两个接口只做了假客户端单测,
|
||||
真机字段名(`available_score` / `records[].prize_name`)还没拿真 CK 跑过一次;
|
||||
真机跑通前不要把"兑换失败"当成定论(先用单行查询看一眼 `raw`)。
|
||||
7. **展示名调整(同日第二刀)**:`done` 的展示名由「已完成」改成**「抢购成功」**
|
||||
—— 只改 `ORDER_STATUS_LABELS` / `STATUS_META` / 下拉与卡片文案,
|
||||
**枚举值仍是 `done`**(库里数据、接口参数、审计 detail 全不变,无需迁移)。
|
||||
「判定结论」里的 `success` 仍叫「兑换成功」(那是"查到兑换记录"的结论,与状态名分开)。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -341,7 +341,7 @@ def batch_query_external_order_activity(
|
||||
"""勾选多行查询积分 + 兑换记录(**串行带间隔**,防风控)。
|
||||
|
||||
每行都会落一条生命周期快照;「已上脚本」的单按查询结果自动改状态
|
||||
(查到礼包 → 已完成;没查到 → 兑换失败),其它状态只记录不动状态。
|
||||
(查到礼包 → 抢购成功;没查到 → 兑换失败),其它状态只记录不动状态。
|
||||
"""
|
||||
try:
|
||||
orders = collab.list_orders_by_ids(db, req.ids)
|
||||
@@ -478,7 +478,7 @@ def query_external_order_activity(
|
||||
):
|
||||
"""查这一单的积分 + 兑换记录(单行「查询」按钮):写一条生命周期快照。
|
||||
|
||||
「已上脚本」的单按查询结果自动改状态:查到这一单的礼包 → 已完成;
|
||||
「已上脚本」的单按查询结果自动改状态:查到这一单的礼包 → 抢购成功;
|
||||
接口通了但没查到 → 兑换失败;接口没通 → 不动(数据不够不许瞎判)。
|
||||
"""
|
||||
try:
|
||||
|
||||
@@ -75,7 +75,8 @@ ORDER_STATUS_LABELS = {
|
||||
STATUS_BOUND: "已确认绑定",
|
||||
STATUS_RECHARGED: "已充值",
|
||||
STATUS_SCRIPTED: "已上脚本",
|
||||
STATUS_DONE: "已完成",
|
||||
# 抢购跑到结果:查兑换记录能确认(自动改)也可以人工切(2026-10-16 用户把「已完成」改叫这个)
|
||||
STATUS_DONE: "抢购成功",
|
||||
# 旁路终态:抢购后查兑换记录,没查到这一单的礼包 → 判失败(人工确认后可作废或回退重试)
|
||||
STATUS_FAILED: "兑换失败",
|
||||
STATUS_VOID: "已作废",
|
||||
@@ -1266,7 +1267,7 @@ def query_order_activity(
|
||||
|
||||
| 情况 | verdict | 业务状态 |
|
||||
| --- | --- | --- |
|
||||
| 兑换记录里有这一单的礼包 | ``success`` | 「已上脚本」的单 → 自动「已完成」 |
|
||||
| 兑换记录里有这一单的礼包 | ``success`` | 「已上脚本」的单 → 自动「抢购成功」 |
|
||||
| 接口通了,但记录里没有这个礼包 | ``failed`` | 「已上脚本」的单 → 自动「兑换失败」 |
|
||||
| 接口没通 / 这单没填礼包名 | ``unknown`` | **不动**(数据不够,不许瞎判) |
|
||||
|
||||
|
||||
@@ -49,7 +49,8 @@ const STATUS_META: Record<HuyaCollabStatus, { label: string; color: string }> =
|
||||
bound: { label: '已确认绑定', color: 'blue' },
|
||||
recharged: { label: '已充值', color: 'geekblue' },
|
||||
scripted: { label: '已上脚本', color: 'purple' },
|
||||
done: { label: '已完成', color: 'success' },
|
||||
// 抢购成功(枚举值仍是 done):从「已上脚本」查到兑换记录 → 自动进这一步
|
||||
done: { label: '抢购成功', color: 'success' },
|
||||
// 旁路终态:抢购后查兑换记录没查到这一单的礼包
|
||||
failed: { label: '兑换失败', color: 'red' },
|
||||
void: { label: '已作废', color: 'error' },
|
||||
@@ -68,7 +69,7 @@ const STATUS_ORDER_OPTIONS: { value: HuyaCollabStatus; label: string }[] = [
|
||||
{ value: 'bound', label: '已确认绑定' },
|
||||
{ value: 'recharged', label: '已充值' },
|
||||
{ value: 'scripted', label: '已上脚本' },
|
||||
{ value: 'done', label: '已完成' },
|
||||
{ value: 'done', label: '抢购成功' },
|
||||
{ value: 'failed', label: '兑换失败' },
|
||||
{ value: 'void', label: '已作废' },
|
||||
];
|
||||
@@ -1194,7 +1195,7 @@ export default function HuyaCollabPage() {
|
||||
</Col>
|
||||
<Col flex="1">
|
||||
<Card size="small">
|
||||
<Statistic title="已完成" value={finished} valueStyle={{ color: '#52c41a' }} />
|
||||
<Statistic title={STATUS_META.done.label} value={finished} valueStyle={{ color: '#52c41a' }} />
|
||||
<Progress percent={summary?.total ? Math.round((finished / summary.total) * 100) : 0} size="small" />
|
||||
</Card>
|
||||
</Col>
|
||||
@@ -1504,7 +1505,7 @@ export default function HuyaCollabPage() {
|
||||
)}
|
||||
<Button icon={<SwapOutlined />} disabled={busy}
|
||||
onClick={() => {
|
||||
// 默认给「下一步」,终点态(已完成 / 已作废 / 兑换失败)退回当前状态,让人自己挑
|
||||
// 默认给「下一步」,终点态(抢购成功 / 已作废 / 兑换失败)退回当前状态,让人自己挑
|
||||
setRollbackTarget(detail.next_status ?? detail.status);
|
||||
setStatusReason('');
|
||||
setStatusAction({ order: detail, mode: 'set' });
|
||||
@@ -1556,7 +1557,7 @@ export default function HuyaCollabPage() {
|
||||
</Button>
|
||||
)}
|
||||
<Text type="secondary" style={{ fontSize: 12 }}>
|
||||
每次查询都会追加一条快照(只追加、不修改);「已上脚本」的单会按结论自动改成「已完成」或「兑换失败」。
|
||||
每次查询都会追加一条快照(只追加、不修改);「已上脚本」的单会按结论自动改成「抢购成功」或「兑换失败」。
|
||||
</Text>
|
||||
</Space>
|
||||
{!detail.has_cookie && (
|
||||
|
||||
Reference in New Issue
Block a user