From c80b4e1c170c9b97957337118259a1a2fff5f328 Mon Sep 17 00:00:00 2001 From: chengma Date: Mon, 20 Jul 2026 09:54:17 +0800 Subject: [PATCH] docs(tasks): add collection status and task deletion --- docs/tasks/T-669.md | 50 ++++++++++++++++++++++++++++++++++++++++++++ docs/tasks/T-670.md | 51 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 docs/tasks/T-669.md create mode 100644 docs/tasks/T-670.md diff --git a/docs/tasks/T-669.md b/docs/tasks/T-669.md new file mode 100644 index 0000000..2c052eb --- /dev/null +++ b/docs/tasks/T-669.md @@ -0,0 +1,50 @@ +--- +id: T-669 +title: 导入采集商品状态展示与筛选 +status: TODO +phase: 7 +deps: [T-662a, T-667] +created: 2026-07-20 +--- + +# T-669 导入采集商品状态展示与筛选 + +## 问题 / 背景 + +商品状态已经在 `tasks.product_status/product_status_note/product_status_at` 保存,①「导入采集」却只显示处理阶段,顶部「状态」下拉实际也只筛选待采集、已采集、已生成等处理阶段。运营无法在采集页直观看出哪些商品已在架、未上架、审核中,或尚未检测;两个不同维度都称为“状态”也容易误操作。 + +## 方案 + +- 在①任务表新增「商品状态」列,位于「阶段」右侧;现有「阶段」继续表示工作流进度,不复用或替换其含义。 +- ①筛选行在现有处理阶段下拉左侧新增「商品状态」下拉,并把既有标签「状态」改为「处理状态」。商品状态选项固定为「全部商品状态、架上商品、未上架、审核中、状态未知、待检测」。 +- 显示和筛选以原始 `tasks.product_status` 区分:`normal` 显示「架上商品」、`unlisted` 显示「未上架」、`reviewing` 显示「审核中」、显式 `unknown` 显示「状态未知」、NULL/空白显示「待检测」。不得把未检测的空值在①列表里伪装为真实的「状态未知」。 +- 商品状态使用语义色:架上商品为成功绿,审核中为警示橙,未上架为错误红或深红,状态未知/待检测为中性灰;不能只依赖颜色,文字必须始终完整显示。保留已有阶段色。 +- 商品状态列 tooltip 显示 `product_status_note`;历史批次自动迁移的 `normal` 必须能看到「历史批次默认按架上商品处理(未实时检测)」,让用户区分默认值与实时检测快照。检测时间存在时可追加简短检测时间。 +- 商品状态和处理状态筛选为叠加关系,并与批次、店铺、商品 ID、未匹配筛选继续共同生效;刷新后按现有页面习惯保留可用选择。表格列宽调整为商品状态/阶段按内容宽度,商品 ID 和账号等主信息保留可读宽度,避免新增列后五列平均拉伸而截断。 + +## 验收标准 + +- [ ] ①列表显示「商品状态」列,并能正确区分架上商品、未上架、审核中、状态未知和待检测;阶段列仍正确显示待采集、已采集、已生成等工作流状态。 +- [ ] 商品状态下拉位于「处理状态」左侧;两项筛选可叠加,且继续与批次、店铺、商品 ID 筛选共同生效。 +- [ ] 历史默认正常记录显示「架上商品」,tooltip 明确其未实时检测语义;真实 `unknown` 与 NULL/空白的「待检测」不混淆。 +- [ ] 筛选、刷新、采集、回写、生成和更新既有行为不回归;不改变商品状态的写入时机、历史迁移规则或③更新安全预检。 +- [ ] `tests/test_gui.py` 和模型相关测试覆盖状态列展示、tooltip、商品状态筛选与处理状态叠加筛选。 + +## 验证 + +```bash +py -3.10 -m unittest discover -s tests -p "test_gui.py" +py -3.10 -m unittest discover -s tests +py -3.10 -m ruff check app tests main.py +py -3.10 -m compileall app main.py +git diff --check +``` + +## 非目标 + +- 不新增 SQLite 字段,不修改商品状态检测、Chrome/CDP、AI 调用、Excel 或③更新流程。 +- 不在②、③新增新的商品状态列或筛选控件;它们继续沿用现有生成/更新前的状态安全规则。 + +## 执行记录 + +- 待实现。 diff --git a/docs/tasks/T-670.md b/docs/tasks/T-670.md new file mode 100644 index 0000000..12898e0 --- /dev/null +++ b/docs/tasks/T-670.md @@ -0,0 +1,51 @@ +--- +id: T-670 +title: 导入采集单条任务软删除 +status: TODO +phase: 7 +deps: [] +created: 2026-07-20 +--- + +# T-670 导入采集单条任务软删除 + +## 问题 / 背景 + +①目前只能软删除整个批次。运营遇到 Excel 中误导入的单个商品、商品失效或不再需要处理的记录时,无法只移除该行,只能保留它或删除整个批次。当前 SQLite 仅有批次级删除标记,任务行没有独立软删除语义;因此不能只在界面上隐藏一行。 + +## 方案 + +- 在①任务表右键时先选中命中行,再打开中文右键菜单;第一版仅提供「删除本条记录」。右键本身不得直接弹确认框或执行删除。 +- 点击菜单项后显示确认框,明确商品 ID、店铺/别名、所属批次;若记录已提交线上,额外提示“仅删除本地记录,不会回滚蝦皮线上商品”。确认框还须说明不会删除原 Excel、本地图片或账号 Chrome 数据。 +- 为 `tasks` 增加 `deleted_at/deleted_reason` 任务级软删除字段及兼容迁移;新增受事务保护的任务软删除 API。默认任务查询、单条读取、①②③筛选、采集/生成/更新候选、运行日志统计和 Excel 回写都排除已软删除任务。已删除任务不物理删除,不改原 Excel、图片路径、生成结果、提交历史或线上商品。 +- 删除操作仅允许作用于当前可见的一条活动任务;①采集或回写运行中禁用入口。数据库 API 必须拒绝已软删除任务和正在处理的任务,避免并发 Worker 对已移除任务继续写入;失败时保留原数据并显示中文原因。 +- 删除成功后刷新①/②/③相关列表和当前批次进度摘要,状态栏提示「已删除本地记录:商品 ID」。不提供批量删除、恢复入口或图片目录清理;软删除记录由数据库保留以便后续维护工具处理。 + +## 验收标准 + +- [ ] 右键任务行只弹菜单,点击「删除本条记录」后才弹确认框;取消不改变任何数据。 +- [ ] 确认后任务被软删除,立即不再出现在①、②、③列表、筛选、采集、生成、更新、回写和默认统计中;其他同批次任务保持不变。 +- [ ] 已提交线上任务的确认框说明本地删除不回滚线上;原 Excel、本地图片与任务历史字段均未被物理删除。 +- [ ] 已删除或正在处理任务不能被重复删除,相关 API 事务安全且不产生半删除状态。 +- [ ] `tests/test_db.py` 覆盖 schema 迁移、默认排除、单条读取和重复/运行中保护;`tests/test_gui.py` 覆盖右键选中、确认/取消、已提交提示和删除后刷新。 + +## 验证 + +```bash +py -3.10 -m unittest discover -s tests -p "test_db.py" +py -3.10 -m unittest discover -s tests -p "test_gui.py" +py -3.10 -m unittest discover -s tests +py -3.10 -m ruff check app tests main.py +py -3.10 -m compileall app main.py +git diff --check +``` + +## 非目标 + +- 不物理删除 SQLite 任务、Excel、本地图片、账号目录或蝦皮线上商品。 +- 不新增批量删除、恢复页面、右键菜单的其他操作或跨批次删除。 +- 不修改商品状态检测、AI 模型、CDP/Shopee 自动化选择器或线上更新逻辑。 + +## 执行记录 + +- 待实现。