docs: 归档任务 #22

This commit is contained in:
chengma
2026-08-07 14:14:48 +08:00
parent 27a09e524c
commit c96228fb72
@@ -0,0 +1,70 @@
# 22 保存当前使用的 Android 设备
- 类型:需求
- 父级大工单:#1
- 所属 MVP / 版本:#2 / MVP
- 状态:已实现,待验收
- 日期:2026-08-07
- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/22
## 背景与目标
Android 设备搜索结果原来只存在于界面内存中。此次补齐“保存”和“删除”行为,使 Client 重启后仍知道自动化应该使用哪台 Android 设备。
## 最终方案
- 只在现有 `app_settings` 表保存 `android.selected_serial`,不保存容易过期的搜索列表、在线状态、型号和 Android 版本。
- 勾选设备只是临时选择;点击“保存”且写入成功后,才成为当前使用设备。
- 页面启动时通过一次简单的索引查询恢复设备号;搜索后若设备在线则自动勾选,离线时保留配置并提示用户。
- 保存和删除由 `QObject + moveToThread` Worker 在后台写入 SQLite,防止阻塞 Qt 主线程并避免重复提交。
- 写入失败时保留原配置和当前临时选择;页面关闭后忽略迟到结果。
- “删除”只清除本地设置,不执行 ADB 断开,也不删除手机或 PDD 数据。
- 没有新增数据库迁移、Admin 接口和第三方依赖。
工单最初把所有 SQLite 读写都计划为后台任务。实现时按现有设置页启动方式,将一次少量、带索引的启动读取保留为同步操作;可能阻塞的保存和删除仍在后台执行。该调整减少了初级维护人员需要理解的线程状态,不改变用户功能。
本任务只补全现有设置页行为,没有调整布局,因此按 Windows UI/UX 规范跳过 HTML 原型。
## 改了哪些
- `client/src/selected_android_device_service.py`:设置键、设备号校验、读取、保存和删除。
- `client/src/settings_ui_event.py`:启动恢复、后台写入、搜索后自动选择、离线提示及线程关闭保护。
- `client/test/test_selected_android_device_service.py`:覆盖设置服务的正常、异常和删除边界。
- `client/test/test_settings_ui_event.py`:覆盖保存、恢复、在线/离线搜索、失败保留、删除、重复提交和关闭安全。
## 验收结果
| 验收标准 | 结果 |
|---|---|
| 保存后 `android.selected_serial` 等于所选设备号 | 通过 |
| 重新创建页面后恢复已保存设备号 | 通过 |
| 已保存设备在线时搜索后自动勾选 | 通过 |
| 已保存设备离线时保留配置并明确提示 | 通过 |
| 搜索结果、状态、型号和版本不写入数据库 | 通过 |
| 未勾选设备时不能保存 | 通过 |
| 保存失败时原配置和临时选择不变 | 通过 |
| 删除只清除当前设备设置,不执行 ADB 操作 | 通过 |
| 保存和删除防止重复提交,主线程保持响应 | 通过 |
| 页面关闭后忽略迟到写入结果 | 通过 |
| 不新增迁移、Admin 接口和第三方依赖 | 通过 |
| 全量测试、语法检查和差异检查 | 通过 |
## 测试
- 执行的命令:
```powershell
C:/Python310/python.exe -m py_compile client/src/selected_android_device_service.py client/src/settings_ui_event.py client/test/test_selected_android_device_service.py client/test/test_settings_ui_event.py
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"
git diff --check
```
- 结果:Client 全量 74 项测试通过;语法检查和差异检查通过。
- **没验证到的部分**:尚未在可见窗口中用真实在线/离线设备完成重启、自动勾选和删除的整套人工流程;未检查打包后的 exe;Narrator、高对比度和 200% 缩放未做人工检查;数据库失败场景使用测试替身模拟。
测试环境仍会输出现有 PyQt5 字体目录缺失和 SIP API 弃用警告,不影响测试结果。
## 相关提交
- `27a09e5` `feat: 保存当前使用的 Android 设备 (#22)`