Files
cmshoppe/docs/tasks/T-550.md
T

48 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: T-550
title: ①②③ 批次下拉默认选中最新批次
phase: 7
deps: [T-523, T-206]
status: DONE
created: 2026-07-08
---
## 问题 / 背景
①导入采集、②AI生成、③更新蝦皮 三个 Tab 的「批次」下拉,当前在**没有已记住选择**时默认选「全部批次」(index 0)。
- 批次按 `created_at DESC` 排序,下拉里「全部批次」之后第一个就是最新批次。
- ①导入后会把 `current_batch_id` 设成刚导入的新批次(`app/gui/tabs/collect.py`),所以①导完已聚焦新批次;但**②③默认仍是「全部批次」**。
- 运营真实工作流是"导一批 → ①采集 → ②生成 → ③更新"处理**同一批**,默认「全部批次」导致每次切 Tab 都要手动再选一次;且③「开始更新」作用于当前筛选结果,默认「全部批次」时一不小心会更新**所有历史批次**,范围偏大。
## 方案
①②③ 批次下拉在**无有效已记住选择**时,默认选**最新批次**(下拉 index 1),而不是「全部批次」(index 0)。
- 改点:三个 Tab 的 `_populate_batch_filter`(`app/gui/tabs/collect.py` / `generate.py` / `apply.py`)里 `setCurrentIndex(index if index >= 0 else 0)` 的**兜底分支**。
- 规则(不破坏现有好行为):
- **保留"记住上次选择"**:`previous` 有效(`findData(previous) >= 0`)→ 沿用。
- **保留①导入自动选新批次**:`current_batch_id` 逻辑不动。
- **只改兜底**:没有有效 `previous`、且**存在批次** → 选最新批次(「全部批次」之后的第一项);**没有批次** → 「全部批次」/空,照旧。
- 三个 Tab 统一同一规则。
## 验收要点
- ②③ 首次打开(无记住选择)且有批次时,批次下拉默认选中**最新批次**,不是「全部批次」。
- 用户手动选过某批次后,切走再回来仍是该批次(记住优先,不被兜底覆盖)。
- 没有任何批次时,回退「全部批次」/空,不报错。
- ①导入后仍自动聚焦刚导入的新批次。
- ③ 的安全收益:默认作用域收窄到最新批次(确认弹窗仍显示范围,无回归)。
- `tests/test_gui.py` 覆盖:有批次时默认 index=最新、无批次回退、已记住选择优先、①导入自动选新批次不受影响。
## 边界(不改什么)
只改三个 Tab 的批次下拉默认选中逻辑 + GUI 单测;不改批次排序、`list_batches`、软删除过滤、筛选联动、采集/生成/更新执行流程、DB、Excel、CDP/Shopee。「全部批次」仍是可手动选择的选项。
## 执行记录
- 2026-07-08:完成 T-550。
- 代码:`app/gui/widgets.py` 新增批次下拉默认索引 helper;①`CollectTab`、②`GenerateTab`、③`ApplyTab` 的 `_populate_batch_filter` 改为“有效已选批次优先;用户手动选过全部批次则保留;无有效已记住选择且存在批次时默认选 index 1 最新批次;无批次回退 index 0”。
- 测试:`tests/test_gui.py` 新增 ①②③ 批次下拉默认最新批次、无批次回退、已记住批次优先、手动全部批次保留的覆盖;导入测试补充断言 ① 导入后仍自动选中新批次;原②③列表筛选测试显式手动选择「全部批次」,保持原测试目标。
- 验证:`py -3.10 -m unittest discover -s tests -p "test_gui.py"` 通过(103 tests);`python -m ruff check app tests main.py` 通过;`py -3.10 -m compileall app main.py` 通过;`git diff --check` 通过;`py -3.10 -m unittest discover -s tests` 通过(253 tests)。