重构规格面板蛇形逐色采价与尺码采集 #37

Closed
opened 2026-08-08 09:14:01 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 阶段:PDD 商品采集
  • 关联缺陷:#36

要解决什么

#36 已能进入规格面板,但当前正式采集先滑动合并文字,再逐个按名称搜索颜色;点击后只凭目标文字仍在控件树中判断选中,并要求 selected_text 同时包含颜色和全部维度。真机 selected_text 为空,最终所有颜色价格无效并返回 PDD_DATA_PRICE_MISSING。

业务规则已确认:不同颜色可能价格不同;尺码不影响价格,只需采集所有尺码文字,不逐个选择尺码。

做什么 / 不做什么

  • 做:动态识别颜色行;从左端开始逐行蛇形遍历;按颜色名称去重;每次点击后重新读取控件树并等待价格稳定;保存每个颜色对应价格;颜色完成后滚动到尺码区域收集全部尺码文字;完整数据先写 SQLite 和 Outbox,再提交 Admin。
  • 不做:不按尺码采价;不逐个选择尺码;不加购、不下单、不付款;不新增 Admin 接口;不处理店铺和评价缺失。

已确认方案

  1. 定位颜色横向滚动容器并归位到左端。
  2. 按节点中心 y 动态聚类颜色行,按行使用左到右、右到左交替的蛇形顺序。
  3. 只点击完整可见、启用且未采集的颜色;每次点击后丢弃旧坐标并重新获取 XML。
  4. 选择确认优先使用 selected、checked 或“已选”证据;无该证据时允许以完整可见可点击节点的成功点击作为降级证据,但不能仅凭文字仍存在确认。
  5. 价格连续读取稳定后记录为该颜色价格;price_observed_at 只写真实颜色,不虚构尺码。
  6. 到边以连续稳定且没有新颜色为准,并设置滑动次数、颜色总数和总超时上限。
  7. 所有颜色完成后滚动外层规格面板,收集并去重尺码文字;不点击尺码。
  8. price_granularity 保持 color;生成颜色和尺码展示组合时复用颜色价格,采价证据只保留颜色。
  9. 使用脱敏 XML 和假设备测试遍历顺序、边缘判断、同价颜色、空 selected_text、尺码采集及本地先保存再提交。

预计修改文件:

  • client/src/pdd_collect_service.py
  • client/test/test_pdd_collect_service.py
  • 必要时调整规格 XML 固件测试
  • docs/client/01-requirements.md
  • docs/client/02-architecture.md
  • docs/client/03-data-model.md
  • docs/client/04-admin-api-contract.md

验收标准

  • 颜色按动态行从左到右、下一行从右到左交替遍历。
  • 每个可用颜色只采价一次,重复出现在相邻视口时不重复采集。
  • 点击后使用最新 XML,selected_text 为空时仍能按明确降级规则完成采价。
  • 相邻颜色价格相同也不会漏采。
  • 横向到边且没有下一行后才进入尺码采集。
  • 尺码只收集文字和可用状态,不点击、不采价。
  • pdd_data.price_granularity=color,price_observed_at 不虚构尺码。
  • 完整结果先保存 SQLite/Outbox,之后才调用 Admin。
  • 全量 Client 测试通过;真机验证不发生加购、下单和付款。

验证方式

从 client 目录执行:

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

真机只允许打开商品与规格面板、点击颜色和滚动采集;禁止点击确认购买、下单和支付按钮。

风险和回退

  • 风险:PDD 不同版本可能不暴露选中属性;点击颜色可能让列表自动滚动;规格可能���在未知第三维度。
  • 控制:每次操作重新解析、按名称去重、稳定边缘判断、总超时和诊断 XML;未知额外维度停止并报告。
  • 回退:恢复 #36 后的规格扫描实现,不涉及数据库迁移。
## 基本信息 - 类型:缺陷 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:PDD 商品采集 - 关联缺陷:#36 ## 要解决什么 #36 已能进入规格面板,但当前正式采集先滑动合并文字,再逐个按名称搜索颜色;点击后只凭目标文字仍在控件树中判断选中,并要求 selected_text 同时包含颜色和全部维度。真机 selected_text 为空,最终所有颜色价格无效并返回 PDD_DATA_PRICE_MISSING。 业务规则已确认:不同颜色可能价格不同;尺码不影响价格,只需采集所有尺码文字,不逐个选择尺码。 ## 做什么 / 不做什么 - 做:动态识别颜色行;从左端开始逐行蛇形遍历;按颜色名称去重;每次点击后重新读取控件树并等待价格稳定;保存每个颜色对应价格;颜色完成后滚动到尺码区域收集全部尺码文字;完整数据先写 SQLite 和 Outbox,再提交 Admin。 - 不做:不按尺码采价;不逐个选择尺码;不加购、不下单、不付款;不新增 Admin 接口;不处理店铺和评价缺失。 ## 已确认方案 1. 定位颜色横向滚动容器并归位到左端。 2. 按节点中心 y 动态聚类颜色行,按行使用左到右、右到左交替的蛇形顺序。 3. 只点击完整可见、启用且未采集的颜色;每次点击后丢弃旧坐标并重新获取 XML。 4. 选择确认优先使用 selected、checked 或“已选”证据;无该证据时允许以完整可见可点击节点的成功点击作为降级证据,但不能仅凭文字仍存在确认。 5. 价格连续读取稳定后记录为该颜色价格;price_observed_at 只写真实颜色,不虚构尺码。 6. 到边以连续稳定且没有新颜色为准,并设置滑动次数、颜色总数和总超时上限。 7. 所有颜色完成后滚动外层规格面板,收集并去重尺码文字;不点击尺码。 8. price_granularity 保持 color;生成颜色和尺码展示组合时复用颜色价格,采价证据只保留颜色。 9. 使用脱敏 XML 和假设备测试遍历顺序、边缘判断、同价颜色、空 selected_text、尺码采集及本地先保存再提交。 预计修改文件: - client/src/pdd_collect_service.py - client/test/test_pdd_collect_service.py - 必要时调整规格 XML 固件测试 - docs/client/01-requirements.md - docs/client/02-architecture.md - docs/client/03-data-model.md - docs/client/04-admin-api-contract.md ## 验收标准 - [ ] 颜色按动态行从左到右、下一行从右到左交替遍历。 - [ ] 每个可用颜色只采价一次,重复出现在相邻视口时不重复采集。 - [ ] 点击后使用最新 XML,selected_text 为空时仍能按明确降级规则完成采价。 - [ ] 相邻颜色价格相同也不会漏采。 - [ ] 横向到边且没有下一行后才进入尺码采集。 - [ ] 尺码只收集文字和可用状态,不点击、不采价。 - [ ] pdd_data.price_granularity=color,price_observed_at 不虚构尺码。 - [ ] 完整结果先保存 SQLite/Outbox,之后才调用 Admin。 - [ ] 全量 Client 测试通过;真机验证不发生加购、下单和付款。 ## 验证方式 从 client 目录执行: C:/Python310/python.exe -m unittest discover -s test -p test_*.py -q C:/Python310/python.exe -m py_compile src/pdd_collect_service.py 真机只允许打开商品与规格面板、点击颜色和滚动采集;禁止点击确认购买、下单和支付按钮。 ## 风险和回退 - 风险:PDD 不同版本可能不暴露选中属性;点击颜色可能让列表自动滚动;规格可能���在未知第三维度。 - 控制:每次操作重新解析、按名称去重、稳定边缘判断、总超时和诊断 XML;未知额外维度停止并报告。 - 回退:恢复 #36 后的规格扫描实现,不涉及数据库迁移。
Author
Owner

实施进度

已完成规格适配层重构:

  • 颜色列表先归位左端,按动态 y 行聚类后蛇形逐色点击采价。
  • 每次点击后重新获取 XML;优先验证 selected/checked/“已选”,页面完全不暴露选择状态时才使用完整可见节点点击作为降级证据。
  • 价格连续两次稳定才记录;同价颜色不会因价格未变化被漏掉。
  • 操作顺序蛇形,输出恢复为页面逐行从左到右的自然顺序。
  • 颜色完成后才向下滚动,尺码只读取文字和可用状态,不点击、不采价。
  • price_observed_at 只包含真实颜色,不虚构尺码;SQLite + Outbox 先存后提交链路保持不变。

验证:

  • Client 全量测试 156 项通过。
  • 新增两行两视口假设备测试,点击顺序 A、B、C、F、E、D;A/B 同价均采集;尺码 M/L 未点击。
  • 真实 737116531267_size.xml 能识别两行完整颜色,并排除右侧半露节点。
  • 真机 R28M30T2JWE 验证被三星系统“支付安全 / 关闭 USB 调试”提示阻塞;无障碍树中没有 PDD 规格区域。遵守安全红线,未自动点击“忽略”,也未发生加购、下单或支付。待人工关闭系统提示后补做完整真机验证。
## 实施进度 已完成规格适配层重构: - 颜色列表先归位左端,按动态 y 行聚类后蛇形逐色点击采价。 - 每次点击后重新获取 XML;优先验证 selected/checked/“已选”,页面完全不暴露选择状态时才使用完整可见节点点击作为降级证据。 - 价格连续两次稳定才记录;同价颜色不会因价格未变化被漏掉。 - 操作顺序蛇形,输出恢复为页面逐行从左到右的自然顺序。 - 颜色完成后才向下滚动,尺码只读取文字和可用状态,不点击、不采价。 - `price_observed_at` 只包含真实颜色,不虚构尺码;SQLite + Outbox 先存后提交链路保持不变。 验证: - Client 全量测试 156 项通过。 - 新增两行两视口假设备测试,点击顺序 A、B、C、F、E、D;A/B 同价均采集;尺码 M/L 未点击。 - 真实 `737116531267_size.xml` 能识别两行完整颜色,并排除右侧半露节点。 - 真机 `R28M30T2JWE` 验证被三星系统“支付安全 / 关闭 USB 调试”提示阻塞;无障碍树中没有 PDD 规格区域。遵守安全红线,未自动点击“忽略”,也未发生加购、下单或支付。待人工关闭系统提示后补做完整真机验证。
Author
Owner

开发完成,等待验收

实现与自动化验证已完成:

  • 实现提交:9562da9 fix: 蛇形遍历颜色并逐色采价 (#37)
  • 归档提交:6c12e05 docs: 归档任务 #37
  • 归档:docs/task/37-规格面板蛇形逐色采价与尺码采集.md
  • Client 全量测试:156 项通过。
  • 真实规格 XML:两行颜色识别和半露节点过滤通过。
  • SQLite + Outbox 先存后提交回归通过。

真机 R28M30T2JWE 被三星“支付安全 / 关闭 USB 调试”系统提示阻塞。遵守安全规则,没有自动点击“忽略”,没有加购、下单、付款,也没有修改任务数据库或调用 Admin。人工关闭提示后仍需补做完整真机验收。

工单保持开启,状态为待验收。

## 开发完成,等待验收 实现与自动化验证已完成: - 实现提交:`9562da9 fix: 蛇形遍历颜色并逐色采价 (#37)` - 归档提交:`6c12e05 docs: 归档任务 #37` - 归档:`docs/task/37-规格面板蛇形逐色采价与尺码采集.md` - Client 全量测试:156 项通过。 - 真实规格 XML:两行颜色识别和半露节点过滤通过。 - SQLite + Outbox 先存后提交回归通过。 真机 `R28M30T2JWE` 被三星“支付安全 / 关闭 USB 调试”系统提示阻塞。遵守安全规则,没有自动点击“忽略”,没有加购、下单、付款,也没有修改任务数据库或调用 Admin。人工关闭提示后仍需补做完整真机验收。 工单保持开启,状态为待验收。
Author
Owner

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

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