优化 PDD 颜色采集等待时间 #44

Closed
opened 2026-08-09 10:04:20 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:重构
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 阶段:PDD 商品采集

要解决什么

当前正式采集器在逐个选择颜色时,每轮固定等待 0.2 秒并最多轮询 8 次;左右滑动完成后还会固定等待 0.35 秒。颜色较多或部分颜色无法确认价格时,固定等待会累积成明显耗时。

复现方式:进入包含较多颜色的商品规格面板,遍历全部颜色。正常颜色至少产生两次 0.2 秒等待;无法确认选择或价格的颜色会等待最多 1.6 秒;每次水平滑动还会额外固定等待 0.35 秒。

做什么 / 不做什么

  • 做:
    • 将颜色选择与价格采样改为短间隔、总超时受控的状态驱动等待。
    • 点击后立即读取一次控件树;选择尚未确认时短间隔轮询。
    • 颜色已选中但价格未稳定时允许继续等待,但使用独立的价格稳定超时。
    • 滑动后的固定等待缩短,并根据控件树是否变化决定是否补等。
    • 把相关等待参数集中到 PddCollectService 构造参数,保留安全默认值。
    • 增加自动化测试,验证快速成功、点击未生效、价格未出现和滑动页面延迟更新。
  • 不做:
    • 不修改颜色蛇形遍历顺序、颜色/尺码识别规则和尺码滚动算法。
    • 不修改 pdd_data、SQLite、Admin 接口和任务状态。
    • 不修改 #42 已确认的“颜色缺价不阻断”规则。
    • 不操作真实下单流程。

怎么做

修改 client/src/pdd_collect_service.py:

  1. 增加容易理解的构造参数,分别控制颜色轮询间隔、颜色选择确认超时、价格稳定超时和滑动稳定等待。
  2. _click_and_sample_color() 使用单调时钟判断总超时:
    • 点击后立即读取控件树;
    • 未确认选中时按短间隔轮询,超过选择确认超时返回空价格;
    • 已确认选中后等待连续两次相同价格,超过价格稳定超时返回空价格;
    • 全程只点击一次目标颜色。
  3. 水平归位和颜色遍历滑动后先短暂等待并读取控件树;视口未变化时只做有限补等,不引入无限轮询。
  4. 保留生产默认值的保守余量,测试通过注入 sleeper 和 monotonic 验证,不依赖真机。

修改 client/test/test_pdd_collect_service.py,覆盖等待次数、超时和原有蛇形顺序。必要时只更新与稳定行为有关的 Client 文档,不记录容易失效的内部秒数。

不修改数据库和接口。

验收标准

  • 正常颜色点击后立即检查,连续两次读取到相同价格即结束。
  • 点击未生效时在选择确认超时内返回空价格,且只点击一次。
  • 颜色已选中但没有稳定价格时在价格稳定超时内返回空价格。
  • 水平滑动不再无条件追加原来的 0.35 秒固定等待,并能处理一次延迟更新。
  • 原有颜色蛇形顺序、尺码采集和缺价继续提交行为保持不变。
  • 等待参数集中、命名直白,便于初级程序员调节。
  • PDD 采集专项和 Client 全量自动化测试通过。

怎么验证

从 client/ 目录执行:

C:/Python310/python.exe -m py_compile src/pdd_collect_service.py test/test_pdd_collect_service.py
C:/Python310/python.exe -m unittest discover -s test -p test_pdd_collect_service.py
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"

真机验证:选择一个颜色数量较多的 PDD 商品,对比优化前后的颜色遍历耗时,确认颜色顺序、价格和尺码结果没有异常。不得执行真实下单。

风险和回退

风险是等待过短时可能把正常但加载较慢的价格记为空。通过把“选中确认”和“价格稳定”分开计时、保留可配置默认值及真机验收降低风险。如真机数据完整度下降,可只回调构造参数,无需回退遍历逻辑。

## 基本信息 - 类型:重构 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:PDD 商品采集 ## 要解决什么 当前正式采集器在逐个选择颜色时,每轮固定等待 0.2 秒并最多轮询 8 次;左右滑动完成后还会固定等待 0.35 秒。颜色较多或部分颜色无法确认价格时,固定等待会累积成明显耗时。 复现方式:进入包含较多颜色的商品规格面板,遍历全部颜色。正常颜色至少产生两次 0.2 秒等待;无法确认选择或价格的颜色会等待最多 1.6 秒;每次水平滑动还会额外固定等待 0.35 秒。 ## 做什么 / 不做什么 - 做: - 将颜色选择与价格采样改为短间隔、总超时受控的状态驱动等待。 - 点击后立即读取一次控件树;选择尚未确认时短间隔轮询。 - 颜色已选中但价格未稳定时允许继续等待,但使用独立的价格稳定超时。 - 滑动后的固定等待缩短,并根据控件树是否变化决定是否补等。 - 把相关等待参数集中到 `PddCollectService` 构造参数,保留安全默认值。 - 增加自动化测试,验证快速成功、点击未生效、价格未出现和滑动页面延迟更新。 - 不做: - 不修改颜色蛇形遍历顺序、颜色/尺码识别规则和尺码滚动算法。 - 不修改 `pdd_data`、SQLite、Admin 接口和任务状态。 - 不修改 #42 已确认的“颜色缺价不阻断”规则。 - 不操作真实下单流程。 ## 怎么做 修改 `client/src/pdd_collect_service.py`: 1. 增加容易理解的构造参数,分别控制颜色轮询间隔、颜色选择确认超时、价格稳定超时和滑动稳定等待。 2. `_click_and_sample_color()` 使用单调时钟判断总超时: - 点击后立即读取控件树; - 未确认选中时按短间隔轮询,超过选择确认超时返回空价格; - 已确认选中后等待连续两次相同价格,超过价格稳定超时返回空价格; - 全程只点击一次目标颜色。 3. 水平归位和颜色遍历滑动后先短暂等待并读取控件树;视口未变化时只做有限补等,不引入无限轮询。 4. 保留生产默认值的保守余量,测试通过注入 sleeper 和 monotonic 验证,不依赖真机。 修改 `client/test/test_pdd_collect_service.py`,覆盖等待次数、超时和原有蛇形顺序。必要时只更新与稳定行为有关的 Client 文档,不记录容易失效的内部秒数。 不修改数据库和接口。 ## 验收标准 - [x] 正常颜色点击后立即检查,连续两次读取到相同价格即结束。 - [x] 点击未生效时在选择确认超时内返回空价格,且只点击一次。 - [x] 颜色已选中但没有稳定价格时在价格稳定超时内返回空价格。 - [x] 水平滑动不再无条件追加原来的 0.35 秒固定等待,并能处理一次延迟更新。 - [x] 原有颜色蛇形顺序、尺码采集和缺价继续提交行为保持不变。 - [x] 等待参数集中、命名直白,便于初级程序员调节。 - [x] PDD 采集专项和 Client 全量自动化测试通过。 ## 怎么验证 从 `client/` 目录执行: ```powershell C:/Python310/python.exe -m py_compile src/pdd_collect_service.py test/test_pdd_collect_service.py C:/Python310/python.exe -m unittest discover -s test -p test_pdd_collect_service.py C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" ``` 真机验证:选择一个颜色数量较多的 PDD 商品,对比优化前后的颜色遍历耗时,确认颜色顺序、价格和尺码结果没有异常。不得执行真实下单。 ## 风险和回退 风险是等待过短时可能把正常但加载较慢的价格记为空。通过把“选中确认”和“价格稳定”分开计时、保留可配置默认值及真机验收降低风险。如真机数据完整度下降,可只回调构造参数,无需回退遍历逻辑。
Author
Owner

实现完成,等待真机验收

已完成状态驱动等待优化:

  • 点击颜色后立即读取,正常价格只需一次 0.1 秒稳定等待。
  • 选择确认默认上限 0.6 秒;确认后价格稳定默认上限 1.2 秒;全程只点击一次。
  • 水平滑动后等待 0.1 秒,视口未变化时只补等一次,并复用最新控件树。
  • 等待参数集中到 PddCollectService,非法非正值会明确报错。
  • 保持蛇形遍历、尺码采集、缺价继续提交、数据结构和接口不变。

验证:

  • PDD 采集专项 31 项通过。
  • Client 全量 172 项通过。
  • Python 语法检查和 git diff --check 通过。
  • 未执行真机耗时对比,也未执行采购或真实下单。

提交:

  • ed72e62 perf: 优化颜色采集等待时间 (#44)
  • 7b104e3 test: 覆盖颜色等待参数校验 (#44)
  • cbb03fa docs: 归档任务 #44
  • 归档:docs/task/44-优化PDD颜色采集等待时间.md

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

## 实现完成,等待真机验收 已完成状态驱动等待优化: - 点击颜色后立即读取,正常价格只需一次 0.1 秒稳定等待。 - 选择确认默认上限 0.6 秒;确认后价格稳定默认上限 1.2 秒;全程只点击一次。 - 水平滑动后等待 0.1 秒,视口未变化时只补等一次,并复用最新控件树。 - 等待参数集中到 `PddCollectService`,非法非正值会明确报错。 - 保持蛇形遍历、尺码采集、缺价继续提交、数据结构和接口不变。 验证: - PDD 采集专项 31 项通过。 - Client 全量 172 项通过。 - Python 语法检查和 `git diff --check` 通过。 - 未执行真机耗时对比,也未执行采购或真实下单。 提交: - `ed72e62` perf: 优化颜色采集等待时间 (#44) - `7b104e3` test: 覆盖颜色等待参数校验 (#44) - `cbb03fa` docs: 归档任务 #44 - 归档:`docs/task/44-优化PDD颜色采集等待时间.md` 工单保持打开,等待用户真机验收。
Author
Owner

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

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:eca9289
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`eca9289` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 10:58: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#44