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

114 lines
6.0 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-603
title: ②/③ 重置持久化标记与商品ID列语义色
phase: 7
deps: [T-404a, T-511, T-534, T-554, T-566, T-577]
status: TODO
created: 2026-07-11
---
## 问题 / 背景
②AI生成和③更新蝦皮已经支持多种重置:
- ②「重置生成结果」可重置标题、封面或全部。
- ②封面画廊「重置图片」可只清当前封面指针,退出后批量补生成。
- ③「重置更新状态」可把已更新/失败任务退回待更新,方便重新提交测试或正式重跑。
但当前重置只改变 `new_title/new_cover_path/stage/status/last_error` 等业务字段,没有一个明确的“这条记录是用户手动重置后待处理”的持久化标记。用户刷新列表、切换批次、重启软件后,很难快速看出哪些商品是刚刚被人工重置过、需要重点补生成或重新更新。
需要增加**持久化标记 + 商品ID列语义色**:被重置且仍待处理的任务,在②/③表格的「商品ID」列用 warning 语义色突出;补生成或重新更新成功后自动清除标记。
## 方案
### 1. DB 持久化标记
在 `tasks` 表做兼容迁移,新增轻量字段:
- `generation_reset_flags TEXT NOT NULL DEFAULT ''`
- 取值为空、`title`、`cover`、`title,cover`。
- 表示②生成结果被人工重置后,哪些组件仍处于“待补生成/待恢复”状态。
- `generation_reset_at TEXT`
- 最近一次②生成结果重置时间,用于 tooltip 或诊断。
- `apply_reset_pending INTEGER NOT NULL DEFAULT 0`
- ③更新状态是否被人工重置后仍待重新更新。
- `apply_reset_at TEXT`
- 最近一次③更新状态重置时间,用于 tooltip 或诊断。
同步更新 `Task` dataclass、row 映射、schema 初始化和重复初始化迁移测试。
### 2. 标记写入与清除
- `db.reset_generated(..., reset_title=True/False, reset_cover=True/False)`:
- 根据本次重置组件把 `generation_reset_flags` 写为 `title` / `cover` / `title,cover`。
- 反复重置时合并组件,不丢旧标记。
- 写入 `generation_reset_at=now`。
- ②封面画廊「重置图片」复用 `reset_generated(reset_title=False, reset_cover=True)`,自动得到 `cover` 标记。
- `db.update_generated_title()`:
- 用户手动填回/修改新标题成功时,清除 `title` 标记。
- `db.update_generated_cover()`:
- 用户从历史候选图保存为当前封面时,清除 `cover` 标记。
- `db.set_generated()` / AI 批量生成成功写库:
- 成功写入 `new_title` 时清除 `title` 标记。
- 成功写入 `new_cover_path` 时清除 `cover` 标记。
- 两个组件都清完后 `generation_reset_flags=''`;`generation_reset_at` 可保留最近时间,不驱动颜色。
- `db.reset_apply_status()`:
- 写入 `apply_reset_pending=1`、`apply_reset_at=now`。
- `db.set_applied(... committed=True ...)`:
- 重新更新成功后清除 `apply_reset_pending=0`。
- 更新失败不清除,继续提醒该商品仍是重置后待处理。
### 3. 商品ID列语义色
只改商品ID列,不刷整行背景,不覆盖状态列颜色:
- ② `GenerateTaskTableModel`
- 商品ID列(列 1)如果 `generation_reset_flags` 非空,`Qt.ForegroundRole` 返回 `COLOR_WARNING`。
- tooltip 增加中文说明,例如:
- `该商品已重置标题,需重新生成标题`
- `该商品已重置图片,需重新生成或从候选图保存图片`
- `该商品已重置标题和图片,需重新生成后再更新`
- ③ `ApplyTaskTableModel`
- 商品ID列(列 1)如果 `apply_reset_pending=1`,`Qt.ForegroundRole` 返回 `COLOR_WARNING`。
- tooltip 增加中文说明:`该商品已重置更新状态,需重新更新蝦皮`。
- 颜色取自 T-511/T-543 既有语义色板,不新增随意颜色。
- 失败仍通过状态列/结果列显示 danger;商品ID warning 只表达“人工重置后待处理”,不表达失败。
### 4. 筛选和日志
- 第一版不新增“只看已重置”筛选,避免扩大范围;用户可通过商品ID列颜色快速识别。
- 既有 `run_type=reset` 运行日志保留;本任务只补 DB 活跃标记。
- Excel 回写不新增字段,不把重置标记写回运营 Excel。
## 验收要点
- ②重置标题后,刷新列表/重启软件仍能看到该商品ID列为 warning 色,tooltip 说明需重新生成标题。
- ②重置封面或画廊「重置图片」后,商品ID列为 warning 色;从历史候选图点「保存」或 AI 成功补生成封面后,warning 色消失。
- ②重置全部后,只有标题和图片都重新补齐后,商品ID列才恢复普通颜色。
- ③重置更新状态后,③表格商品ID列为 warning 色;重新更新成功后恢复普通颜色,更新失败则继续保留 warning 标记。
- 标记跨列表刷新、批次切换、软件重启持久存在;不是内存变量。
- 任务失败的状态列/结果列仍按 T-511 显示 danger,不被商品ID warning 逻辑破坏。
- 单测覆盖:
- schema 迁移和旧库重复初始化。
- `reset_generated` 写入/合并/清除 `generation_reset_flags`。
- `update_generated_title`、`update_generated_cover`、`set_generated` 清除对应组件标记。
- `reset_apply_status` 写入、`set_applied(success)` 清除、失败不清除。
- ②/③ TableModel 商品ID列 `ForegroundRole` 和 tooltip。
- 验证命令:
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `py -3.10 -m unittest discover -s tests`
- `git diff --check`
## 边界(不改什么)
- 不改 AI/cmhub 请求、并发、重试、下载保存逻辑。
- 不改 Shopee/CDP 更新流程,不因为颜色标记自动提交或自动生成。
- 不新增 Excel 字段,不回写重置标记。
- 不新增筛选条件,不做整行底色,不改变现有状态列/结果列文案。
- 不把“曾经重置过”的历史永久高亮;高亮只代表“重置后仍待处理”。历史仍以 run_logs 为准。
## 执行记录
(完成后记录 schema 字段、标记清除口径、GUI 颜色与验证命令。)