定义任务数据模型与 SQLite Repository #8

Closed
opened 2026-08-06 16:17:19 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 阶段:2. SQLite 和本地任务列表
  • 依赖:#7

要解决什么

SQLite v1 已能建库,但 Python 代码还没有清晰的数据对象和 Repository。后续 Admin、任务执行和 UI 如果直接传字典或散落 SQL,会难以维护,也容易把数据库字段、状态值和界面显示混在一起。

做什么 / 不做什么

  • 做:
    • 在 client/src/task_models.py 定义数据库状态枚举和简单数据类;
    • 定义新领取任务、任务摘要、任务详情、执行记录、Outbox 和设置记录模型;
    • 在 client/src/task_repository.py 实现领取任务写入、分页筛选、数量统计和详情读取;
    • 在 client/src/settings_repository.py 实现非敏感设置的 JSON 读写和删除;
    • 每个 Repository 方法独立打开并关闭 SQLite 连接;
    • 在 client/test 使用临时数据库测试。
  • 不做:
    • 不修改数据库结构或迁移版本;
    • 不实现任务状态转换、执行记录写入、结果与 Outbox 事务;
    • 不连接 PDD 任务 UI、Admin 或 Android 设备;
    • 不保存 token、Cookie、密码等凭据;
    • 不新增第三方依赖。

怎么做

  1. 保持 client/src 扁平结构,使用 dataclass、Enum、sqlite3 和 unittest。
  2. 数据模型不导入 Qt、uiautomator2 或具体界面类。
  3. Repository 只接收数据模型并返回数据模型,不向调用方暴露 sqlite3.Row。
  4. 新任务只能以 claimed 状态写入;相同 remote_task_id 重复写入时明确报错,不覆盖本地执行状态。
  5. 列表只读取表格字段,不读取 admin_payload 和 pdd_data。
  6. 筛选支持任务类型、状态和关键词;关键词匹配任务编号、商品编号和标题。
  7. 默认稳定排序为 updated_at DESC, id DESC。
  8. 设置值使用 JSON 编解码,调用方必须保证只保存非敏感设置。

预计修改:

  • client/src/task_models.py
  • client/src/task_repository.py
  • client/src/settings_repository.py
  • client/test/test_task_repository.py
  • client/test/test_settings_repository.py

验收标准

  • 状态枚举值与 SQLite v1 CHECK 约束一致;
  • 数据模型不依赖 Qt、Admin 或 uiautomator2;
  • 能写入一条新领取任务,初始状态固定为 claimed;
  • 重复任务编号不会覆盖已有记录;
  • 分页查询按 updated_at DESC, id DESC 稳定排序;
  • 类型、状态和关键词筛选采用 AND 关系;
  • 列表摘要不读取完整 JSON,详情读取能还原 JSON;
  • 能统计筛选后的任务数量;
  • 设置 Repository 支持 JSON 值新增、读取、更新、删除和默认值;
  • 所有测试使用临时数据库;
  • 语法检查、unittest 和 git diff --check 通过。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m py_compile src/task_models.py src/task_repository.py src/settings_repository.py test/test_task_repository.py test/test_settings_repository.py
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" -v
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:2. SQLite 和本地任务列表 - 依赖:#7 ## 要解决什么 SQLite v1 已能建库,但 Python 代码还没有清晰的数据对象和 Repository。后续 Admin、任务执行和 UI 如果直接传字典或散落 SQL,会难以维护,也容易把数据库字段、状态值和界面显示混在一起。 ## 做什么 / 不做什么 - 做: - 在 `client/src/task_models.py` 定义数据库状态枚举和简单数据类; - 定义新领取任务、任务摘要、任务详情、执行记录、Outbox 和设置记录模型; - 在 `client/src/task_repository.py` 实现领取任务写入、分页筛选、数量统计和详情读取; - 在 `client/src/settings_repository.py` 实现非敏感设置的 JSON 读写和删除; - 每个 Repository 方法独立打开并关闭 SQLite 连接; - 在 `client/test` 使用临时数据库测试。 - 不做: - 不修改数据库结构或迁移版本; - 不实现任务状态转换、执行记录写入、结果与 Outbox 事务; - 不连接 PDD 任务 UI、Admin 或 Android 设备; - 不保存 token、Cookie、密码等凭据; - 不新增第三方依赖。 ## 怎么做 1. 保持 `client/src` 扁平结构,使用 `dataclass`、`Enum`、`sqlite3` 和 `unittest`。 2. 数据模型不导入 Qt、uiautomator2 或具体界面类。 3. Repository 只接收数据模型并返回数据模型,不向调用方暴露 `sqlite3.Row`。 4. 新任务只能以 `claimed` 状态写入;相同 `remote_task_id` 重复写入时明确报错,不覆盖本地执行状态。 5. 列表只读取表格字段,不读取 `admin_payload` 和 `pdd_data`。 6. 筛选支持任务类型、状态和关键词;关键词匹配任务编号、商品编号和标题。 7. 默认稳定排序为 `updated_at DESC, id DESC`。 8. 设置值使用 JSON 编解码,调用方必须保证只保存非敏感设置。 预计修改: - `client/src/task_models.py` - `client/src/task_repository.py` - `client/src/settings_repository.py` - `client/test/test_task_repository.py` - `client/test/test_settings_repository.py` ## 验收标准 - [x] 状态枚举值与 SQLite v1 CHECK 约束一致; - [x] 数据模型不依赖 Qt、Admin 或 uiautomator2; - [x] 能写入一条新领取任务,初始状态固定为 `claimed`; - [x] 重复任务编号不会覆盖已有记录; - [x] 分页查询按 `updated_at DESC, id DESC` 稳定排序; - [x] 类型、状态和关键词筛选采用 AND 关系; - [x] 列表摘要不读取完整 JSON,详情读取能还原 JSON; - [x] 能统计筛选后的任务数量; - [x] 设置 Repository 支持 JSON 值新增、读取、更新、删除和默认值; - [x] 所有测试使用临时数据库; - [x] 语法检查、unittest 和 `git diff --check` 通过。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m py_compile src/task_models.py src/task_repository.py src/settings_repository.py test/test_task_repository.py test/test_settings_repository.py C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" -v ```
Author
Owner

状态:进行中。沿用 client/src 扁平代码和 client/test 测试目录;优先使用直白数据类与小型 Repository 方法,不引入 ORM 或复杂抽象。

状态:进行中。沿用 `client/src` 扁平代码和 `client/test` 测试目录;优先使用直白数据类与小型 Repository 方法,不引入 ORM 或复杂抽象。
Author
Owner

实施完成,等待用户验收

  • 新增任务/执行/Outbox/设置枚举和数据类;
  • TaskRepository 支持新任务写入、重复保护、稳定分页、AND 筛选、计数和详情 JSON;
  • SettingsRepository 支持非敏感 JSON 设置新增、读取、更新、删除和默认值;
  • 每个方法独立打开并关闭数据库连接;
  • 未连接 UI、Admin、Android,也未实现任务状态机和结果/Outbox 事务。

首轮测试发现 Dict 类型导入遗漏,已补齐;修正后全量 17 项 unittest 全部通过,语法检查和 git diff --check 通过。

实现提交:e60b0c9。归档提交:be6ee3d。本地归档:docs/task/8-定义任务数据模型与-sqlite-repository.md。

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

## 实施完成,等待用户验收 - 新增任务/执行/Outbox/设置枚举和数据类; - `TaskRepository` 支持新任务写入、重复保护、稳定分页、AND 筛选、计数和详情 JSON; - `SettingsRepository` 支持非敏感 JSON 设置新增、读取、更新、删除和默认值; - 每个方法独立打开并关闭数据库连接; - 未连接 UI、Admin、Android,也未实现任务状态机和结果/Outbox 事务。 首轮测试发现 `Dict` 类型导入遗漏,已补齐;修正后全量 17 项 unittest 全部通过,语法检查和 `git diff --check` 通过。 实现提交:`e60b0c9`。归档提交:`be6ee3d`。本地归档:`docs/task/8-定义任务数据模型与-sqlite-repository.md`。 工单保持打开,等待用户验收。
Author
Owner

用户已要求继续下一阶段,视为 Task #8 验收通过。关闭本工单。

用户已要求继续下一阶段,视为 Task #8 验收通过。关闭本工单。
ila closed this issue 2026-08-06 16:25:38 +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#8