Client:修复售罄推荐页误识别为规格面板 #159

Closed
opened 2026-08-11 15:45:11 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / Client 可运行任务闭环
  • 阶段:PDD 售罄页与规格面板识别
  • 关联工单:#154、#155
  • 状态:待验收

要解决什么

Client 采集商品 https://mobile.yangkeduo.com/goods.html?goods_id=757123298435 时返回 PDD_DATA_SPEC_INCOMPLETE:规格面板没有可识别的规格区域。

真实 XML 证明点击购买入口后 PDD 显示“商品已售罄,推荐以下相似商品”,并未进入规格面板。当前 parse_spec_panel 会把售罄页中的普通 RecyclerView 和可点击推荐商品卡片默认解释为“颜色分类”;_wait_spec_panel 又以“解析到任意维度,或识别到面板”作为成功条件,因此错误进入颜色采集,后续页面过渡为空树时才抛出误导性的规格错误。

做什么 / 不做什么

  • 做:点击规格入口后检测明确售罄页并以现有 PDD_GOODS_UNAVAILABLE 安全终止。
  • 做:收紧规格面板等待成功条件,不能只因任意滚动列表解析出维度就通过。
  • 做:没有真实规格标题或可靠面板证据时,不把普通滚动列表默认解释为颜色。
  • 做:增加售罄推荐页和空白过渡树回归测试。
  • 不做:不增加 sleep 或超时时间;不修改颜色价格、尺码、Admin 接口或 pdd_data 结构。
  • 不做:不点击推荐商品,不执行采购、下单或付款。

已确认的实现方案

  1. 在 client/src/pdd_collect_service.py 增加明确售罄页面检测,至少覆盖“商品已售罄,推荐以下相似商品”“该商品已售罄”“暂时缺货”等稳定语义;在规格面板等待与后续规格读取前优先检查,命中后抛出 PDD_GOODS_UNAVAILABLE,并记录 page_reason=out_of_stock。
  2. _wait_spec_panel 只有可靠规格面板证据成立时才返回;解析出的 dimensions 只作为面板内容,不再单独证明面板已打开。
  3. parse_spec_panel 不再为没有对应规格标题的普通嵌套滚动列表无条件赋名“颜色分类”。旧版有标题的滚动规格面板和 #154 非滚动面板继续支持。
  4. 在颜色行、颜色点击采价和尺码采集的每次新 XML 读取后复用售罄/特殊页检查,避免面板消失后继续点击其他页面。
  5. 使用本次售罄 XML 制作或复用脱敏固件,断言:不识别规格维度、不点击推荐卡片、返回 PDD_GOODS_UNAVAILABLE;空白 PDD 树不会被误判为规格面板。
  6. 保留普通商品页、旧版可滚动面板、新版非滚动面板、验证码、登录和风控回归。

预计修改:

  • client/src/pdd_collect_service.py
  • client/test/test_pdd_collect_service.py
  • client/test/fixtures/ 下必要的脱敏售罄页固件
  • 完成后归档 docs/task/<工单号>-修复售罄页误识别规格面板.md

验收标准

  • 本次售罄推荐页返回 PDD_GOODS_UNAVAILABLE,不再返回规格不完整。
  • 售罄页推荐商品不被解析成颜色,也不会被点击。
  • 空白过渡控件树不会被当成规格面板。
  • _wait_spec_panel 不再仅凭任意 dimensions 判定成功。
  • 旧版可滚动和新版非滚动规格面板继续正常解析。
  • Client 精确测试、完整 unittest 与 py_compile 通过。

验证方式

从 client/ 执行:

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"
C:/Python310/python.exe -m py_compile src/pdd_collect_service.py test/test_pdd_collect_service.py

只使用 XML 固件和 Fake Device,不执行真机采购或下单。

风险和回退

  • 风险:规格面板条件过严可能让旧页面重新超时,因此必须保留旧版可滚动、新版非滚动以及无可见选项面板测试。
  • 风险:售罄文字可能出现在推荐卡片说明中,因此检测应使用页面级明确短语���结构,不能仅匹配任意“售罄”。
  • 回退:恢复本工单代码提交即可;不涉及数据库迁移、Admin 接口或不可逆操作。
## 基本信息 - 类型:缺陷 - 父级大工单:#1 - 所属 MVP / 版本:#2 / Client 可运行任务闭环 - 阶段:PDD 售罄页与规格面板识别 - 关联工单:#154、#155 - 状态:待验收 ## 要解决什么 Client 采集商品 https://mobile.yangkeduo.com/goods.html?goods_id=757123298435 时返回 PDD_DATA_SPEC_INCOMPLETE:规格面板没有可识别的规格区域。 真实 XML 证明点击购买入口后 PDD 显示“商品已售罄,推荐以下相似商品”,并未进入规格面板。当前 parse_spec_panel 会把售罄页中的普通 RecyclerView 和可点击推荐商品卡片默认解释为“颜色分类”;_wait_spec_panel 又以“解析到任意维度,或识别到面板”作为成功条件,因此错误进入颜色采集,后续页面过渡为空树时才抛出误导性的规格错误。 ## 做什么 / 不做什么 - 做:点击规格入口后检测明确售罄页并以现有 PDD_GOODS_UNAVAILABLE 安全终止。 - 做:收紧规格面板等待成功条件,不能只因任意滚动列表解析出维度就通过。 - 做:没有真实规格标题或可靠面板证据时,不把普通滚动列表默认解释为颜色。 - 做:增加售罄推荐页和空白过渡树回归测试。 - 不做:不增加 sleep 或超时时间;不修改颜色价格、尺码、Admin 接口或 pdd_data 结构。 - 不做:不点击推荐商品,不执行采购、下单或付款。 ## 已确认的实现方案 1. 在 client/src/pdd_collect_service.py 增加明确售罄页面检测,至少覆盖“商品已售罄,推荐以下相似商品”“该商品已售罄”“暂时缺货”等稳定语义;在规格面板等待与后续规格读取前优先检查,命中后抛出 PDD_GOODS_UNAVAILABLE,并记录 page_reason=out_of_stock。 2. _wait_spec_panel 只有可靠规格面板证据成立时才返回;解析出的 dimensions 只作为面板内容,不再单独证明面板已打开。 3. parse_spec_panel 不再为没有对应规格标题的普通嵌套滚动列表无条件赋名“颜色分类”。旧版有标题的滚动规格面板和 #154 非滚动面板继续支持。 4. 在颜色行、颜色点击采价和尺码采集的每次新 XML 读取后复用售罄/特殊页检查,避免面板消失后继续点击其他页面。 5. 使用本次售罄 XML 制作或复用脱敏固件,断言:不识别规格维度、不点击推荐卡片、返回 PDD_GOODS_UNAVAILABLE;空白 PDD 树不会被误判为规格面板。 6. 保留普通商品页、旧版可滚动面板、新版非滚动面板、验证码、登录和风控回归。 预计修改: - client/src/pdd_collect_service.py - client/test/test_pdd_collect_service.py - client/test/fixtures/ 下必要的脱敏售罄页固件 - 完成后归档 docs/task/<工单号>-修复售罄页误识别规格面板.md ## 验收标准 - [ ] 本次售罄推荐页返回 PDD_GOODS_UNAVAILABLE,不再返回规格不完整。 - [ ] 售罄页推荐商品不被解析成颜色,也不会被点击。 - [ ] 空白过渡控件树不会被当成规格面板。 - [ ] _wait_spec_panel 不再仅凭任意 dimensions 判定成功。 - [ ] 旧版可滚动和新版非滚动规格面板继续正常解析。 - [ ] Client 精确测试、完整 unittest 与 py_compile 通过。 ## 验证方式 从 client/ 执行: 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" C:/Python310/python.exe -m py_compile src/pdd_collect_service.py test/test_pdd_collect_service.py 只使用 XML 固件和 Fake Device,不执行真机采购或下单。 ## 风险和回退 - 风险:规格面板条件过严可能让旧页面重新超时,因此必须保留旧版可滚动、新版非滚动以及无可见选项面板测试。 - 风险:售罄文字可能出现在推荐卡片说明中,因此检测应使用页面级明确短语���结构,不能仅匹配任意“售罄”。 - 回退:恢复本工单代码提交即可;不涉及数据库迁移、Admin 接口或不可逆操作。
Author
Owner

实施结果

  • 增加页面级售罄语义检测,命中后返回现有 PDD_GOODS_UNAVAILABLE,并附带 page_reason=out_of_stock。
  • _wait_spec_panel 现在只在可靠规格面板证据成立时返回,不再仅凭任意 dimensions 通过。
  • 可滚动规格面板证据兼容三种情况:已选/请选择摘要、提交选择提示、位于滚动容器内的真实规格标题。
  • parse_spec_panel 不再把没有对应规格标题的嵌套 RecyclerView 默认命名为颜色分类。
  • 新增脱敏售罄推荐页固件和3项回归,确认推荐卡片不被解析或点击,空白 PDD 树不被当成规格面板。
  • 本次真实售罄 XML 只读复验返回 PDD_GOODS_UNAVAILABLE;最终空白 XML 返回 PDD_DATA_SPEC_INCOMPLETE,但在完整等待流程中会继续等待而不会进入颜色采集。
  • 采集服务45项通过;Client完整402项通过;py_compile与diff check通过。
  • 实现提交:a875fbc。

未验证:未使用真机重新采集;未执行采购、下单或付款。

## 实施结果 - 增加页面级售罄语义检测,命中后返回现有 PDD_GOODS_UNAVAILABLE,并附带 page_reason=out_of_stock。 - _wait_spec_panel 现在只在可靠规格面板证据成立时返回,不再仅凭任意 dimensions 通过。 - 可滚动规格面板证据兼容三种情况:已选/请选择摘要、提交选择提示、位于滚动容器内的真实规格标题。 - parse_spec_panel 不再把没有对应规格标题的嵌套 RecyclerView 默认命名为颜色分类。 - 新增脱敏售罄推荐页固件和3项回归,确认推荐卡片不被解析或点击,空白 PDD 树不被当成规格面板。 - 本次真实售罄 XML 只读复验返回 PDD_GOODS_UNAVAILABLE;最终空白 XML 返回 PDD_DATA_SPEC_INCOMPLETE,但在完整等待流程中会继续等待而不会进入颜色采集。 - 采集服务45项通过;Client完整402项通过;py_compile与diff check通过。 - 实现提交:a875fbc。 未验证:未使用真机重新采集;未执行采购、下单或付款。
Author
Owner

完成与归档

  • 实现提交:a875fbc fix: 阻止售罄页误入规格采集 (#159)
  • 归档提交:20950ef docs: 归档任务 #159
  • 本地归档:docs/task/159-修复售罄页误识别规格面板.md
  • 精确测试45项、Client完整402项及语法检查全部通过。
  • 当前状态:待用户使用真机重新采集商品 757123298435 验收。

预期结果:该商品仍售罄时应直接显示商品不可用,不再显示规格不完整,不进入颜色遍历,也不点击推荐商品。

## 完成与归档 - 实现提交:a875fbc `fix: 阻止售罄页误入规格采集 (#159)` - 归档提交:20950ef `docs: 归档任务 #159` - 本地归档:docs/task/159-修复售罄页误识别规格面板.md - 精确测试45项、Client完整402项及语法检查全部通过。 - 当前状态:待用户使用真机重新采集商品 757123298435 验收。 预期结果:该商品仍售罄时应直接显示商品不可用,不再显示规格不完整,不进入颜色遍历,也不点击推荐商品。
Author
Owner

用户于 2026-08-13 明确验收通过。本地归档状态已更新,批量验收记录提交:ad44f83。现关闭工单。

用户于 2026-08-13 明确验收通过。本地归档状态已更新,批量验收记录提交:`ad44f83`。现关闭工单。
ila closed this issue 2026-08-13 15:58:08 +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#159