PDD 任务列表显示店铺名和最新执行用时 #136

Closed
opened 2026-08-11 09:59:52 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 Client 可运行任务闭环
  • 阶段:SQLite 和本地任务列表
  • 关联工单:#131(任务表列与交互优化)

要解决什么

PDD 任务列表目前只显示商品标题、规格、价格、状态和更新时间,采购人员无法直接看到采集到的店铺名称,也无法比较每次采集或采购实际用了多少秒。

现有 task_runs 已按执行尝试保存 started_at 和 finished_at,可以计算最新一次执行用时;店铺名目前只在完整 pdd_data.shop_name 中,任务摘要没有轻量字段。任务列表采用增量加载,不能为每一行读取和保留完整 pdd_data。

做什么 / 不做什么

  • 做:任务表在“商品标题”后增加“店铺名”列,在“状态”和“更新时间”之间增加“用时”列。
  • 做:店铺名显示已采集结果中的 shop_name;空值显示 —,截断时提供完整工具提示。
  • 做:用时取最新一条 task_runs,按 finished_at - started_at 计算并显示整数秒,例如“63 秒”。
  • 做:成功、失败、取消和人工处理的已结束执行都显示实际用时;没有执行记录显示 —,最新执行仍在运行时显示“执行中”。
  • 做:重新执行产生新 attempt_no 后,列表显示最新一次执行的用时;历史执行记录不修改。
  • 做:用时范围从本次执行记录开始到本地结束并写入结果或失败,不包含领取前等待,也不包含后续重新上报 Admin 的时间。
  • 做:数据库升级时从已有合法 pdd_data.shop_name 回填旧任务的店铺名。
  • 不做:不在列表模型中保存完整 pdd_data,不逐行追加数据库查询。
  • 不做:不增加每秒刷新的动态计时器。
  • 不做:不修改 PDD 自动化步骤;采购结果没有采集到店铺名时显示 —,不为补店铺名额外滚动手机页面。
  • 不做:不修改 Admin 接口、任务状态、pdd_data 结构或真实下单安全规则。

已确认的实现方案

  1. SQLite 升级:
    • 在 client/src/db_schema.py 末尾增加版本 5,给 pdd_tasks 增加可空的 shop_name TEXT;
    • 使用安全的 JSON 有效性判断,从已有 pdd_data.shop_name 回填非空文本;
    • 迁移保持事务性,禁止修改已经发布的 1~4 版本迁移。
  2. 结果入库:
    • 修改 client/src/task_repository.py,在采集成功、采购成功以及只读核单成功更新最新结果时,同步写入轻量 shop_name;
    • 缺少或不是非空字符串时写入 NULL,不改变原始 pdd_data。
  3. 列表查询:
    • 扩展 TaskSummary,增加 shop_name、最新执行状态和可空的整数 duration_seconds;
    • list_tasks 在现有分页查询中一次关联每个任务最新 attempt_no,利用现有 idx_task_runs_task(task_id, attempt_no DESC);
    • 不执行 N+1 查询;结束时间缺失时不计算秒数,异常负值安全归零。
  4. 界面显示:
    • 扩展 TaskRow 和表格模型;
    • 推荐列顺序:选择、任务类型、商品标题、店铺名、颜色、尺码、价格、数量、状态、用时、更新时间;
    • 店铺名左对齐,建议宽度约 140px;用时右对齐,建议宽度约 80px;
    • 保持商品标题为伸展列,窄窗口允许水平滚动,不隐藏主要命令。
  5. 更新数据库、Repository、PDD UI 自动测试及 docs/client/03-data-model.md、docs/client/05-ui-specification.md。

预计修改文件:

  • client/src/db_schema.py
  • client/src/task_models.py
  • client/src/task_repository.py
  • client/src/pdd_ui.py
  • client/src/pdd_ui_event.py(仅摘要到 TaskRow 的映射需要时)
  • client/test/test_db.py 或现有数据库迁移测试
  • client/test/test_task_repository.py
  • client/test/test_pdd_ui.py
  • client/test/test_pdd_ui_event.py(映射涉及时)
  • docs/client/03-data-model.md
  • docs/client/05-ui-specification.md

不新增依赖,不修改 Admin。

验收标准

  • 新数据库直接创建到版本 5,旧版本 4 数据库可事务性升级到版本 5。
  • 旧任务合法的 pdd_data.shop_name 被回填;无值、空白或无效内容不会导致迁移失败,显示为 —。
  • 新采集结果保存后,任务摘要同步保存店铺名;采购或核单结果有店铺名时同样同步,无值时为 NULL。
  • 任务表在商品标题后显示“店铺名”,截断时能查看完整文字。
  • 任务表在状态后显示“用时”,已结束最新执行显示非负整数秒。
  • 没有执行记录显示 —;最新执行未结束显示“执行中”。
  • 失败、取消、人工处理和成功记录都按最新一次执行显示用时。
  • 重新执行后显示最新 attempt_no 的用时,不覆盖历史 task_runs。
  • 列表分页使用一次 SQL 查询取得摘要和最新执行信息,不读取完整 pdd_data,不存在逐行查询。
  • 筛选、稳定倒序、增量加载、全选/反选、详情入口和批量操作没有回归。
  • 1000px 紧凑窗口和宽窗口可访问全部列;长店铺名、空值和三位数以上秒数不会破坏表格。
  • Client 全量测试通过,未操作 Android、未启用或执行真实下单。

验证方式

从 client/ 目录执行:

C:/Python310/python.exe -m py_compile src/db_schema.py src/task_models.py src/task_repository.py src/pdd_ui.py
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -m unittest discover -s test -p "test_db*.py" -v
C:/Python310/python.exe -m unittest test.test_task_repository -v
C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_ui*.py" -v
C:/Python310/python.exe -m unittest discover -s test -v
Remove-Item Env:QT_QPA_PLATFORM

手工界面验收:

C:/Python310/python.exe buyer_main.py

准备无执行记录、执行中、成功、失败、重新执行、长店铺名和无店铺名任务,检查店铺名、秒数、工具提示、水平滚动以及原有勾选和详情操作。

风险和回退

  • 风险:数据库迁移失败会阻止 Client 启动;必须覆盖空数据库、版本 4 升级、空/合法/异常旧 JSON,并保持单事务回滚。
  • 风险:错误关联旧执行记录会显示错误用时;查询必须按 attempt_no DESC 只取最新执行。
  • 风险:列表读取完整 pdd_data 或逐行查询会破坏增量加载性能;店铺名使用摘要列,用时在同一分页 SQL 中取得。
  • 回退:实现提交可整体回退,但数据库一旦升级到版本 5,旧程序会因版本过高拒绝启动;回退前必须备份数据库,并提供兼容版本或恢复升级前备份。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 Client 可运行任务闭环 - 阶段:SQLite 和本地任务列表 - 关联工单:#131(任务表列与交互优化) ## 要解决什么 PDD 任务列表目前只显示商品标题、规格、价格、状态和更新时间,采购人员无法直接看到采集到的店铺名称,也无法比较每次采集或采购实际用了多少秒。 现有 `task_runs` 已按执行尝试保存 `started_at` 和 `finished_at`,可以计算最新一次执行用时;店铺名目前只在完整 `pdd_data.shop_name` 中,任务摘要没有轻量字段。任务列表采用增量加载,不能为每一行读取和保留完整 `pdd_data`。 ## 做什么 / 不做什么 - 做:任务表在“商品标题”后增加“店铺名”列,在“状态”和“更新时间”之间增加“用时”列。 - 做:店铺名显示已采集结果中的 `shop_name`;空值显示 `—`,截断时提供完整工具提示。 - 做:用时取最新一条 `task_runs`,按 `finished_at - started_at` 计算并显示整数秒,例如“63 秒”。 - 做:成功、失败、取消和人工处理的已结束执行都显示实际用时;没有执行记录显示 `—`,最新执行仍在运行时显示“执行中”。 - 做:重新执行产生新 `attempt_no` 后,列表显示最新一次执行的用时;历史执行记录不修改。 - 做:用时范围从本次执行记录开始到本地结束并写入结果或失败,不包含领取前等待,也不包含后续重新上报 Admin 的时间。 - 做:数据库升级时从已有合法 `pdd_data.shop_name` 回填旧任务的店铺名。 - 不做:不在列表模型中保存完整 `pdd_data`,不逐行追加数据库查询。 - 不做:不增加每秒刷新的动态计时器。 - 不做:不修改 PDD 自动化步骤;采购结果没有采集到店铺名时显示 `—`,不为补店铺名额外滚动手机页面。 - 不做:不修改 Admin 接口、任务状态、`pdd_data` 结构或真实下单安全规则。 ## 已确认的实现方案 1. SQLite 升级: - 在 `client/src/db_schema.py` 末尾增加版本 5,给 `pdd_tasks` 增加可空的 `shop_name TEXT`; - 使用安全的 JSON 有效性判断,从已有 `pdd_data.shop_name` 回填非空文本; - 迁移保持事务性,禁止修改已经发布的 1~4 版本迁移。 2. 结果入库: - 修改 `client/src/task_repository.py`,在采集成功、采购成功以及只读核单成功更新最新结果时,同步写入轻量 `shop_name`; - 缺少或不是非空字符串时写入 `NULL`,不改变原始 `pdd_data`。 3. 列表查询: - 扩展 `TaskSummary`,增加 `shop_name`、最新执行状态和可空的整数 `duration_seconds`; - `list_tasks` 在现有分页查询中一次关联每个任务最新 `attempt_no`,利用现有 `idx_task_runs_task(task_id, attempt_no DESC)`; - 不执行 N+1 查询;结束时间缺失时不计算秒数,异常负值安全归零。 4. 界面显示: - 扩展 `TaskRow` 和表格模型; - 推荐列顺序:选择、任务类型、商品标题、店铺名、颜色、尺码、价格、数量、状态、用时、更新时间; - 店铺名左对齐,建议宽度约 140px;用时右对齐,建议宽度约 80px; - 保持商品标题为伸展列,窄窗口允许水平滚动,不隐藏主要命令。 5. 更新数据库、Repository、PDD UI 自动测试及 `docs/client/03-data-model.md`、`docs/client/05-ui-specification.md`。 预计修改文件: - `client/src/db_schema.py` - `client/src/task_models.py` - `client/src/task_repository.py` - `client/src/pdd_ui.py` - `client/src/pdd_ui_event.py`(仅摘要到 `TaskRow` 的映射需要时) - `client/test/test_db.py` 或现有数据库迁移测试 - `client/test/test_task_repository.py` - `client/test/test_pdd_ui.py` - `client/test/test_pdd_ui_event.py`(映射涉及时) - `docs/client/03-data-model.md` - `docs/client/05-ui-specification.md` 不新增依赖,不修改 Admin。 ## 验收标准 - [x] 新数据库直接创建到版本 5,旧版本 4 数据库可事务性升级到版本 5。 - [x] 旧任务合法的 `pdd_data.shop_name` 被回填;无值、空白或无效内容不会导致迁移失败,显示为 `—`。 - [x] 新采集结果保存后,任务摘要同步保存店铺名;采购或核单结果有店铺名时同样同步,无值时为 `NULL`。 - [x] 任务表在商品标题后显示“店铺名”,截断时能查看完整文字。 - [x] 任务表在状态后显示“用时”,已结束最新执行显示非负整数秒。 - [x] 没有执行记录显示 `—`;最新执行未结束显示“执行中”。 - [x] 失败、取消、人工处理和成功记录都按最新一次执行显示用时。 - [x] 重新执行后显示最新 `attempt_no` 的用时,不覆盖历史 `task_runs`。 - [x] 列表分页使用一次 SQL 查询取得摘要和最新执行信息,不读取完整 `pdd_data`,不存在逐行查询。 - [x] 筛选、稳定倒序、增量加载、全选/反选、详情入口和批量操作没有回归。 - [x] 1000px 紧凑窗口和宽窗口可访问全部列;长店铺名、空值和三位数以上秒数不会破坏表格。 - [x] Client 全量测试通过,未操作 Android、未启用或执行真实下单。 ## 验证方式 从 `client/` 目录执行: ```powershell C:/Python310/python.exe -m py_compile src/db_schema.py src/task_models.py src/task_repository.py src/pdd_ui.py $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -m unittest discover -s test -p "test_db*.py" -v C:/Python310/python.exe -m unittest test.test_task_repository -v C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_ui*.py" -v C:/Python310/python.exe -m unittest discover -s test -v Remove-Item Env:QT_QPA_PLATFORM ``` 手工界面验收: ```powershell C:/Python310/python.exe buyer_main.py ``` 准备无执行记录、执行中、成功、失败、重新执行、长店铺名和无店铺名任务,检查店铺名、秒数、工具提示、水平滚动以及原有勾选和详情操作。 ## 风险和回退 - 风险:数据库迁移失败会阻止 Client 启动;必须覆盖空数据库、版本 4 升级、空/合法/异常旧 JSON,并保持单事务回滚。 - 风险:错误关联旧执行记录会显示错误用时;查询必须按 `attempt_no DESC` 只取最新执行。 - 风险:列表读取完整 `pdd_data` 或逐行查询会破坏增量加载性能;店铺名使用摘要列,用时在同一分页 SQL 中取得。 - 回退:实现提交可整体回退,但数据库一旦升级到版本 5,旧程序会因版本过高拒绝启动;回退前必须备份数据库,并提供兼容版本或恢复升级前备份。
Author
Owner

实施完成,待用户验收

  • SQLite 升级到 v5,增加 pdd_tasks.shop_name,并从有效的历史 pdd_data.shop_name 安全回填;
  • 新采集/采购结果保存时同步店铺名摘要;
  • 列表用同一条 SQL 关联最新 task_runs,没有 N+1 查询,也不加载完整 pdd_data;
  • 表格增加“店铺名”“用时”:执行中显示“进行中”,已结束显示整数秒,异常负值按 0 秒。

测试:test_db.py、test_task_repository.py、test_pdd_ui.py、test_pdd_ui_event.py,共 96 项通过。

提交:e354ddd
归档:docs/task/136-pdd任务列表显示店铺名和最新执行用时.md
归档提交:a441dfe

未验证:生产库副本迁移、真机执行后人工检查。当前状态:待验收,工单保持开启。

## 实施完成,待用户验收 - SQLite 升级到 v5,增加 `pdd_tasks.shop_name`,并从有效的历史 `pdd_data.shop_name` 安全回填; - 新采集/采购结果保存时同步店铺名摘要; - 列表用同一条 SQL 关联最新 `task_runs`,没有 N+1 查询,也不加载完整 `pdd_data`; - 表格增加“店铺名”“用时”:执行中显示“进行中”,已结束显示整数秒,异常负值按 0 秒。 测试:`test_db.py`、`test_task_repository.py`、`test_pdd_ui.py`、`test_pdd_ui_event.py`,共 96 项通过。 提交:`e354ddd` 归档:`docs/task/136-pdd任务列表显示店铺名和最新执行用时.md` 归档提交:`a441dfe` 未验证:生产库副本迁移、真机执行后人工检查。当前状态:待验收,工单保持开启。
Author
Owner

补充回归记录:完成 Client 全量测试,377 项全部通过。归档回归记录提交:eca6068。

补充回归记录:完成 Client 全量测试,377 项全部通过。归档回归记录提交:`eca6068`。
Author
Owner

用户已于 2026-08-11 确认验收通过。

  • 本地归档状态已更新为“已完成”
  • 验收记录提交:cc595c1
  • 工单现关闭
用户已于 2026-08-11 确认验收通过。 - 本地归档状态已更新为“已完成” - 验收记录提交:`cc595c1` - 工单现关闭
ila closed this issue 2026-08-11 11:24:59 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#136