实现 PDD 任务列表 UI #4

Closed
opened 2026-08-06 14:13:01 +08:00 by ila · 9 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 阶段:1. UI 与工程骨架

要解决什么

当前 client/src/pdd_ui.py 还是手工输入商品链接、颜色和尺码的旧占位页,不符合已确认的 PDD 任务列表需求。需要先完成一个可独立演示的任务列表 UI,为后续 SQLite Repository 接入提供稳定界面边界。

做什么 / 不做什么

  • 做:
    • 在 client/src/pdd_ui.py 实现顶部命令区、任务表格、空状态和底部运行状态区;
    • 使用 qfluentwidgets.TableView 和自定义 QAbstractTableModel;
    • 展示任务类型、商品标题、颜色、尺码、价格、数量、状态、更新时间、操作;
    • 支持内存演示数据、类型/状态/关键词筛选、清除筛选、刷新请求和详情请求;
    • 默认按更新时间倒序,使用 remote_task_id 作为稳定身份;
    • 提供 set_tasks()、加载状态和自动获取状态等 UI 更新入口;
    • 保持页面 objectName=pddTaskPage。
  • 不做:
    • 不连接 SQLite、Admin 或 uiautomator2;
    • 不实现真实领取、采集、采购或下单;
    • 不实现任务详情窗口;
    • 不修改其他 Python 文件、数据库、接口或依赖;
    • 不把 pdd_data 放入表格模型。

怎么做

  1. 定义仅包含表格显示字段的 TaskRow 数据类,不包含 pdd_data。
  2. 定义 TaskTableModel,实现显示、工具提示、稳定任务编号和内存分页。
  3. 重写 PDDTaskPage 布局,使用 Fluent 按钮、搜索框、下拉框和表格。
  4. 页面通过 PyQt 信号转发自动获取、搜索、刷新、详情操作,不执行阻塞业务。
  5. 提供空数据、筛选无结果、加载中、加载失败四类状态。
  6. 使用模拟任务执行离屏测试,不把模拟数据默认写入正式页面。

预计修改文件:

  • client/src/pdd_ui.py

验收标准

  • 页面包含“开始自动获取”、类型、状态、关键词、搜索和刷新控件;
  • 表格列与 docs/client/05-ui-specification.md 一致;
  • 表格使用 TableView + QAbstractTableModel,没有每行常驻 QWidget;
  • 模型不保存 pdd_data,通过 remote_task_id 标识任务;
  • 模拟数据默认按更新时间倒序并可按条件筛选;
  • 点击操作列或激活行能发出目标任务编号;
  • 空数据和筛选无结果显示不同文案;
  • 无数据时表格、表头和网格空行仍保持显示,空行填满表格可视区域且不可交互;
  • 任务类型、任务状态、关键词三个标签与“开始自动获取”按钮位于同一行,关键词输入框使用紧凑宽度;
  • 普通无数据状态不显示“还没有领取过任务”和“点击开始自动获取开始领取任务”文案;
  • 关键词搜索框默认宽度约为原来的 150%,并随可用宽度在最小值和最大值之间自适应缩放;
  • Ctrl+F 聚焦关键词,关键词 Enter 执行搜索;
  • 文件通过语法检查,离屏 UI 冒烟测试通过;
  • 没有连接数据库、Admin 或 Android 设备。

怎么验证

从 client/ 目录执行:

C:/Python310/python.exe -m py_compile src/pdd_ui.py

离屏创建页面,注入采集/采购模拟任务,检查排序、筛选、稳定编号、详情信号和空状态;同时离屏创建 MainWindow 验证装配。

风险和回退

主要风险是 Fluent 表格版本 API 差异和后续 Repository 接入时的数据边界变化。实现只使用当前固定版本已安装的控件及 Qt 标准 Model/View API;需要回退时只回退本工单提交。

## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:1. UI 与工程骨架 ## 要解决什么 当前 `client/src/pdd_ui.py` 还是手工输入商品链接、颜色和尺码的旧占位页,不符合已确认的 PDD 任务列表需求。需要先完成一个可独立演示的任务列表 UI,为后续 SQLite Repository 接入提供稳定界面边界。 ## 做什么 / 不做什么 - 做: - 在 `client/src/pdd_ui.py` 实现顶部命令区、任务表格、空状态和底部运行状态区; - 使用 `qfluentwidgets.TableView` 和自定义 `QAbstractTableModel`; - 展示任务类型、商品标题、颜色、尺码、价格、数量、状态、更新时间、操作; - 支持内存演示数据、类型/状态/关键词筛选、清除筛选、刷新请求和详情请求; - 默认按更新时间倒序,使用 `remote_task_id` 作为稳定身份; - 提供 `set_tasks()`、加载状态和自动获取状态等 UI 更新入口; - 保持页面 `objectName=pddTaskPage`。 - 不做: - 不连接 SQLite、Admin 或 uiautomator2; - 不实现真实领取、采集、采购或下单; - 不实现任务详情窗口; - 不修改其他 Python 文件、数据库、接口或依赖; - 不把 `pdd_data` 放入表格模型。 ## 怎么做 1. 定义仅包含表格显示字段的 `TaskRow` 数据类,不包含 `pdd_data`。 2. 定义 `TaskTableModel`,实现显示、工具提示、稳定任务编号和内存分页。 3. 重写 `PDDTaskPage` 布局,使用 Fluent 按钮、搜索框、下拉框和表格。 4. 页面通过 PyQt 信号转发自动获取、搜索、刷新、详情操作,不执行阻塞业务。 5. 提供空数据、筛选无结果、加载中、加载失败四类状态。 6. 使用模拟任务执行离屏测试,不把模拟数据默认写入正式页面。 预计修改文件: - `client/src/pdd_ui.py` ## 验收标准 - [x] 页面包含“开始自动获取”、类型、状态、关键词、搜索和刷新控件; - [x] 表格列与 `docs/client/05-ui-specification.md` 一致; - [x] 表格使用 `TableView + QAbstractTableModel`,没有每行常驻 QWidget; - [x] 模型不保存 `pdd_data`,通过 `remote_task_id` 标识任务; - [x] 模拟数据默认按更新时间倒序并可按条件筛选; - [x] 点击操作列或激活行能发出目标任务编号; - [x] 空数据和筛选无结果显示不同文案; - [x] 无数据时表格、表头和网格空行仍保持显示,空行填满表格可视区域且不可交互; - [x] 任务类型、任务状态、关键词三个标签与“开始自动获取”按钮位于同一行,关键词输入框使用紧凑宽度; - [x] 普通无数据状态不显示“还没有领取过任务”和“点击开始自动获取开始领取任务”文案; - [x] 关键词搜索框默认宽度约为原来的 150%,并随可用宽度在最小值和最大值之间自适应缩放; - [x] Ctrl+F 聚焦关键词,关键词 Enter 执行搜索; - [x] 文件通过语法检查,离屏 UI 冒烟测试通过; - [x] 没有连接数据库、Admin 或 Android 设备。 ## 怎么验证 从 `client/` 目录执行: ```powershell C:/Python310/python.exe -m py_compile src/pdd_ui.py ``` 离屏创建页面,注入采集/采购模拟任务,检查排序、筛选、稳定编号、详情信号和空状态;同时离屏创建 `MainWindow` 验证装配。 ## 风险和回退 主要风险是 Fluent 表格版本 API 差异和后续 Repository 接入时的数据边界变化。实现只使用当前固定版本已安装的控件及 Qt 标准 Model/View API;需要回退时只回退本工单提交。
Author
Owner

状态:进行中。已确认仅修改 client/src/pdd_ui.py,先实现使用内存数据的任务列表 UI,不连接 SQLite、Admin 或 Android 设备。

状态:进行中。已确认仅修改 `client/src/pdd_ui.py`,先实现使用内存数据的任务列表 UI,不连接 SQLite、Admin 或 Android 设备。
Author
Owner

实施完成,等待用户验收

最终实现

  • 已在 client/src/pdd_ui.py 实现顶部命令区、九列任务表格、空状态和底部状态区;
  • 使用 TableView + QAbstractTableModel,内存数据每页 50 条;
  • 默认按更新时间倒序,支持类型、状态、关键词组合筛选;
  • 使用 remote_task_id 作为详情和选择恢复身份,不保存 pdd_data;
  • 提供自动获取、搜索、刷新、详情信号及页面状态更新方法;
  • 未连接 SQLite、Admin、uiautomator2 或真机。

测试

  • 语法检查:通过;
  • 两条采集/采购模拟数据排序、筛选、金额、详情信号、空状态:通过,输出 PDD_UI_OK;
  • 120 条模拟数据按 50/50/20 分页和 Ctrl+F:通过,输出 PAGINATION_AND_SHORTCUT_OK;
  • MainWindow 离屏装配及 1040×680 布局:通过;
  • 环境仍输出既存的 PyQt5 字体目录缺失警告,不影响断言。

提交与归档

  • 实现提交:ad19700
  • 归档提交:b6be66c
  • 本地归档:docs/task/4-实现-pdd-任务列表-ui.md

未验证

未进行用户人工界面验收、真实 Windows 字体效果、深色/高对比度、200% 缩放和真机测试。工单保持打开,等待用户验收。

## 实施完成,等待用户验收 ### 最终实现 - 已在 `client/src/pdd_ui.py` 实现顶部命令区、九列任务表格、空状态和底部状态区; - 使用 `TableView + QAbstractTableModel`,内存数据每页 50 条; - 默认按更新时间倒序,支持类型、状态、关键词组合筛选; - 使用 `remote_task_id` 作为详情和选择恢复身份,不保存 `pdd_data`; - 提供自动获取、搜索、刷新、详情信号及页面状态更新方法; - 未连接 SQLite、Admin、uiautomator2 或真机。 ### 测试 - 语法检查:通过; - 两条采集/采购模拟数据排序、筛选、金额、详情信号、空状态:通过,输出 `PDD_UI_OK`; - 120 条模拟数据按 50/50/20 分页和 Ctrl+F:通过,输出 `PAGINATION_AND_SHORTCUT_OK`; - `MainWindow` 离屏装配及 1040×680 布局:通过; - 环境仍输出既存的 PyQt5 字体目录缺失警告,不影响断言。 ### 提交与归档 - 实现提交:`ad19700` - 归档提交:`b6be66c` - 本地归档:`docs/task/4-实现-pdd-任务列表-ui.md` ### 未验证 未进行用户人工界面验收、真实 Windows 字体效果、深色/高对比度、200% 缩放和真机测试。工单保持打开,等待用户验收。
Author
Owner

验收变更:无数据时保留空表格

用户要求:没有任务数据时,表格不能被空状态页面替换;表头继续显示,并用空行填满表格区域。

调整方案:

  • 表格始终显示;
  • 模型没有真实任务时,根据 viewport 高度返回不可选择、不可点击的占位空行;
  • 空行不参与筛选、分页、详情或任务计数;
  • 无任务、筛选无结果、加载中和加载失败提示移到表格上方;
  • 只修改 client/src/pdd_ui.py,不连接数据库、Admin 或设备。

状态从待验收退回进行中,完成后重新提交测试结果。

## 验收变更:无数据时保留空表格 用户要求:没有任务数据时,表格不能被空状态页面替换;表头继续显示,并用空行填满表格区域。 调整方案: - 表格始终显示; - 模型没有真实任务时,根据 viewport 高度返回不可选择、不可点击的占位空行; - 空行不参与筛选、分页、详情或任务计数; - 无任务、筛选无结果、加载中和加载失败提示移到表格上方; - 只修改 `client/src/pdd_ui.py`,不连接数据库、Admin 或设备。 状态从待验收退回进行中,完成后重新提交测试结果。
Author
Owner

验收变更已完成,重新等待用户验收

  • 表格和表头现在始终显示;
  • 无真实任务时,根据 viewport 高度生成不可选择、不可点击的占位空行;
  • 空行不进入任务计数、筛选、分页或详情;
  • 无任务、筛选无结果、加载中和加载失败提示显示在表格上方;
  • 占位行使用向下取整,不产生没有意义的空数据滚动条。

验证输出:EMPTY_TABLE_AND_PDD_UI_OK、EMPTY_GRID_OK。

新增提交:

  • 实现修正:2322b46
  • 归档更新:aad20fe

工单保持打开,等待重新验收。

## 验收变更已完成,重新等待用户验收 - 表格和表头现在始终显示; - 无真实任务时,根据 viewport 高度生成不可选择、不可点击的占位空行; - 空行不进入任务计数、筛选、分页或详情; - 无任务、筛选无结果、加载中和加载失败提示显示在表格上方; - 占位行使用向下取整,不产生没有意义的空数据滚动条。 验证输出:`EMPTY_TABLE_AND_PDD_UI_OK`、`EMPTY_GRID_OK`。 新增提交: - 实现修正:`2322b46` - 归档更新:`aad20fe` 工单保持打开,等待重新验收。
Author
Owner

第二次界面验收调整

用户要求:

  1. “任务类型”“任务状态”“关键词”三个标签与“开始自动获取”按钮放在同一行;
  2. 缩短关键词输入框;
  3. 普通无数据时删除“还没有领取过任务”和“点击开始自动获取开始领取任务”两行提示。

实现边界:

  • 顶部命令区改成单行,刷新按钮仍靠右;
  • 关键词输入框限制为紧凑宽度;
  • 普通无数据时隐藏提示卡,只保留表头和占位空行;
  • 筛选无结果、加载中和加载失败提示继续保留;
  • 只修改 client/src/pdd_ui.py。
## 第二次界面验收调整 用户要求: 1. “任务类型”“任务状态”“关键词”三个标签与“开始自动获取”按钮放在同一行; 2. 缩短关键词输入框; 3. 普通无数据时删除“还没有领取过任务”和“点击开始自动获取开始领取任务”两行提示。 实现边界: - 顶部命令区改成单行,刷新按钮仍靠右; - 关键词输入框限制为紧凑宽度; - 普通无数据时隐藏提示卡,只保留表头和占位空行; - 筛选无结果、加载中和加载失败提示继续保留; - 只修改 `client/src/pdd_ui.py`。
Author
Owner

第二次界面验收调整已完成

  • 顶部命令区已改为单行:“开始自动获取”后依次显示任务类型、任务状态、关键词、搜索,刷新按钮保持靠右;
  • 关键词输入框固定为 190 像素宽;
  • 普通无任务状态不再显示两行引导文字,只保留表头和占位空行;
  • 筛选无结果、加载中和加载失败提示继续保留。

验证:语法检查和离屏界面断言通过,输出 COMMAND_ROW_AND_EMPTY_TABLE_OK。

提交:

  • 代码:8f6e657
  • 本地归档:3190d1f

工单保持打开,等待用户重新验收。

## 第二次界面验收调整已完成 - 顶部命令区已改为单行:“开始自动获取”后依次显示任务类型、任务状态、关键词、搜索,刷新按钮保持靠右; - 关键词输入框固定为 190 像素宽; - 普通无任务状态不再显示两行引导文字,只保留表头和占位空行; - 筛选无结果、加载中和加载失败提示继续保留。 验证:语法检查和离屏界面断言通过,输出 `COMMAND_ROW_AND_EMPTY_TABLE_OK`。 提交: - 代码:`8f6e657` - 本地归档:`3190d1f` 工单保持打开,等待用户重新验收。
Author
Owner

第三次界面验收调整

用户要求关键词搜索框宽度增加到原来的 150%,并在窗口整体放大、缩小时自适应。

实施方案:

  • 将原固定 190px 改为建议宽度 285px;
  • 设置 120px 最小宽度和 480px 最大宽度;
  • 使用 QSizePolicy.Expanding 和网格列伸缩分配剩余空间;
  • 保持顶部命令控件为同一行,并验证紧凑、默认和宽窗口。

只修改 client/src/pdd_ui.py 中关键词输入框及命令栏布局;保留用户当前尚未提交的“获取任务”和隐藏页面标题修改。

## 第三次界面验收调整 用户要求关键词搜索框宽度增加到原来的 150%,并在窗口整体放大、缩小时自适应。 实施方案: - 将原固定 190px 改为建议宽度 285px; - 设置 120px 最小宽度和 480px 最大宽度; - 使用 `QSizePolicy.Expanding` 和网格列伸缩分配剩余空间; - 保持顶部命令控件为同一行,并验证紧凑、默认和宽窗口。 只修改 `client/src/pdd_ui.py` 中关键词输入框及命令栏布局;保留用户当前尚未提交的“获取任务”和隐藏页面标题修改。
Author
Owner

第三次界面验收调整已完成

  • 关键词框已从固定 190px 改为 QSizePolicy.Expanding;
  • 使用 190–480px 范围,紧凑窗口不低于原宽度,避免本次“放大”反而导致搜索框更窄;
  • 关键词列与尾部留白列按 4:1 分配可用空间;
  • 主窗口宽度 1040 / 1280 / 1600 时,关键词框实测为 190 / 298 / 480px;
  • 搜索、刷新及其他筛选控件仍保持同一行,刷新按钮未超出命令卡。

原计划最小值为 120px,测试发现 1040px 窗口会缩到 120px,违背“宽度增加”的目标,因此实现调整为 190px 最小值。

验证输出:RESPONSIVE_KEYWORD_OK。

提交:

  • 代码:ecc9d47
  • 本地归档:cbcfaca

工单保持打开,等待用户重新验收。

## 第三次界面验收调整已完成 - 关键词框已从固定 190px 改为 `QSizePolicy.Expanding`; - 使用 190–480px 范围,紧凑窗口不低于原宽度,避免本次“放大”反而导致搜索框更窄; - 关键词列与尾部留白列按 4:1 分配可用空间; - 主窗口宽度 1040 / 1280 / 1600 时,关键词框实测为 190 / 298 / 480px; - 搜索、刷新及其他筛选控件仍保持同一行,刷新按钮未超出命令卡。 原计划最小值为 120px,测试发现 1040px 窗口会缩到 120px,违背“宽度增加”的目标,因此实现调整为 190px 最小值。 验证输出:`RESPONSIVE_KEYWORD_OK`。 提交: - 代码:`ecc9d47` - 本地归档:`cbcfaca` 工单保持打开,等待用户重新验收。
Author
Owner

用户已确认 PDD 任务与参数设置 UI 验收通过。本工单验收完成,现关闭。

用户已确认 PDD 任务与参数设置 UI 验收通过。本工单验收完成,现关闭。
ila closed this issue 2026-08-06 16:01:07 +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#4