Client:售罄临时页仅下拉刷新一次并重新识别商品 #265

Open
opened 2026-08-18 11:52:49 +08:00 by ila · 1 comment
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 Client 可运行任务闭环
  • 阶段:商品深链打开与售罄临时页恢复
  • 关联工单:#111、#159、#96、#97

要解决什么

Android 浏览器打开 PDD URL 并跳转到 PDD App 后,部分有效商品会短暂显示“商品已售罄”。人工在页面内按住屏幕向下拉刷新一次后,可以恢复完整商品详情页。当前 Client 不会执行这次刷新:公共页面分类器也没有把售罄页作为独立页面类型,因此采集或采购可能等待超时、报找不到规格入口,或在后续解析阶段才返回商品不可用。

需要把“明确售罄临时页 → 只下拉刷新一次 → 重新确认商品页”纳入采集和采购共用的商品打开状态机。刷新后恢复正常商品页才继续;仍显示售罄才以 PDD_GOODS_UNAVAILABLE 安全结束。

做什么 / 不做什么

  • 做:共享识别明确页面级售罄文案;采集和采购在商品打开阶段只执行一次有界下拉刷新;刷新后重新走页面分类和商品身份确认;持续售罄返回统一不可重试业务失败;记录不含商品原文的刷新次数与页面原因;补充状态机、采集和采购测试。
  • 不做:不把 SKU/尺码中的普通“售罄”当成整页售罄;不循环刷新;不点击推荐商品、购买、规格或支付控件;不修改 Admin 接口、数据库、任务结构或 AI 匹配;不自动登录、注册或付款。

怎么做

  • 修改 client/src/pdd_page_classifier.py:新增明确的整页售罄分类,只接受“商品已售罄”“该商品已售罄”“商品暂时缺货”等页面级短语;为 GoodsOpenTracker 增加一次刷新动作和刷新后仍售罄的终态,保持首页重新打开一次、网络、登录、验证码和旧商品页规则不变。
  • 新增或复用 Client 公共手势函数:从最新控件树计算安全屏幕区域,只在已分类为售罄页时从页面内容区向下滑一次;手势避开状态栏和底部导航,不使用固定设备分辨率,不点击任何节点。
  • 修改 client/src/pdd_collect_service.py 和 client/src/pdd_u2_purchase_adapter.py:两条商品打开循环处理共享刷新动作;刷新后恢复 PAGE_GOODS 才继续;第二次售罄返回 PDD_GOODS_UNAVAILABLE、page_reason=out_of_stock、refresh_attempts=1。采购发生在规格选择和不可逆标记之前。
  • 修改相关测试:覆盖一次刷新恢复、刷新后仍售罄、售罄推荐卡片不点击、普通 SKU 售罄不触发整页刷新、首页重开和其他特殊页回归。
  • 同步 docs/client/06-quality-security.md 的稳定规则。

预计不修改数据库和 Admin 接口。

验收标准

  • 深链后明确显示页面级“商品已售罄”时,只执行一次向下拉刷新,不点击推荐商品或其他控件。
  • 刷新后恢复正常目标商品详情页,采集或采购继续原流程。
  • 刷新后仍显示售罄,统一返回不可重试 PDD_GOODS_UNAVAILABLE,诊断包含 page_reason=out_of_stock 和 refresh_attempts=1。
  • 同一任务无论售罄页重复出现多少次,最多刷新一次。
  • SKU、尺码或规格按钮中的“售罄”不会触发整页刷新。
  • 首页一次重开、网络错误、持续加载、登录、验证码、风控、支付和旧商品页判断保持原行为。
  • 采集与采购复用同一页面分类和刷新规则;采购刷新发生在规格选择和不可逆标记之前。
  • Python 3.10 定向测试、Client 全量测试、语法检查和离屏 UI 冒烟完成。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m py_compile src/pdd_page_classifier.py src/pdd_goods_refresh.py src/pdd_collect_service.py src/pdd_u2_purchase_adapter.py
C:/Python310/python.exe -m pytest -q test/test_pdd_page_classifier.py test/test_pdd_collect_service.py test/test_pdd_u2_purchase_adapter.py
C:/Python310/python.exe -m pytest -q test
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()"
Remove-Item Env:QT_QPA_PLATFORM

真机只验证深链打开、一次下拉刷新和恢复商品详情;不选择规格、不提交订单、不付款。

风险和回退

风险是误把 SKU 售罄或普通推荐文案识别为整页售罄,以及下拉手势落入系统状态栏或其他控件。只接受明确商品级短语,且手势起止点限制在最新 PDD 内容树的中部安全区域;刷新最多一次,方向或页面证据不足时安全停止。回退可恢复为原等待/售罄失败行为,不涉及数据迁移;不可通过扩大刷新次数或放宽页面分类绕过平台异常。

## 基本信息 - 类型:缺陷 - 父级大工单:#1 - 所属 MVP / 版本:#2 Client 可运行任务闭环 - 阶段:商品深链打开与售罄临时页恢复 - 关联工单:#111、#159、#96、#97 ## 要解决什么 Android 浏览器打开 PDD URL 并跳转到 PDD App 后,部分有效商品会短暂显示“商品已售罄”。人工在页面内按住屏幕向下拉刷新一次后,可以恢复完整商品详情页。当前 Client 不会执行这次刷新:公共页面分类器也没有把售罄页作为独立页面类型,因此采集或采购可能等待超时、报找不到规格入口,或在后续解析阶段才返回商品不可用。 需要把“明确售罄临时页 → 只下拉刷新一次 → 重新确认商品页”纳入采集和采购共用的商品打开状态机。刷新后恢复正常商品页才继续;仍显示售罄才以 `PDD_GOODS_UNAVAILABLE` 安全结束。 ## 做什么 / 不做什么 - 做:共享识别明确页面级售罄文案;采集和采购在商品打开阶段只执行一次有界下拉刷新;刷新后重新走页面分类和商品身份确认;持续售罄返回统一不可重试业务失败;记录不含商品原文的刷新次数与页面原因;补充状态机、采集和采购测试。 - 不做:不把 SKU/尺码中的普通“售罄”当成整页售罄;不循环刷新;不点击推荐商品、购买、规格或支付控件;不修改 Admin 接口、数据库、任务结构或 AI 匹配;不自动登录、注册或付款。 ## 怎么做 - 修改 `client/src/pdd_page_classifier.py`:新增明确的整页售罄分类,只接受“商品已售罄”“该商品已售罄”“商品暂时缺货”等页面级短语;为 `GoodsOpenTracker` 增加一次刷新动作和刷新后仍售罄的终态,保持首页重新打开一次、网络、登录、验证码和旧商品页规则不变。 - 新增或复用 Client 公共手势函数:从最新控件树计算安全屏幕区域,只在已分类为售罄页时从页面内容区向下滑一次;手势避开状态栏和底部导航,不使用固定设备分辨率,不点击任何节点。 - 修改 `client/src/pdd_collect_service.py` 和 `client/src/pdd_u2_purchase_adapter.py`:两条商品打开循环处理共享刷新动作;刷新后恢复 `PAGE_GOODS` 才继续;第二次售罄返回 `PDD_GOODS_UNAVAILABLE`、`page_reason=out_of_stock`、`refresh_attempts=1`。采购发生在规格选择和不可逆标记之前。 - 修改相关测试:覆盖一次刷新恢复、刷新后仍售罄、售罄推荐卡片不点击、普通 SKU 售罄不触发整页刷新、首页重开和其他特殊页回归。 - 同步 `docs/client/06-quality-security.md` 的稳定规则。 预计不修改数据库和 Admin 接口。 ## 验收标准 - [x] 深链后明确显示页面级“商品已售罄”时,只执行一次向下拉刷新,不点击推荐商品或其他控件。 - [x] 刷新后恢复正常目标商品详情页,采集或采购继续原流程。 - [x] 刷新后仍显示售罄,统一返回不可重试 `PDD_GOODS_UNAVAILABLE`,诊断包含 `page_reason=out_of_stock` 和 `refresh_attempts=1`。 - [x] 同一任务无论售罄页重复出现多少次,最多刷新一次。 - [x] SKU、尺码或规格按钮中的“售罄”不会触发整页刷新。 - [x] 首页一次重开、网络错误、持续加载、登录、验证码、风控、支付和旧商品页判断保持原行为。 - [x] 采集与采购复用同一页面分类和刷新规则;采购刷新发生在规格选择和不可逆标记之前。 - [x] Python 3.10 定向测试、Client 全量测试、语法检查和离屏 UI 冒烟完成。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m py_compile src/pdd_page_classifier.py src/pdd_goods_refresh.py src/pdd_collect_service.py src/pdd_u2_purchase_adapter.py C:/Python310/python.exe -m pytest -q test/test_pdd_page_classifier.py test/test_pdd_collect_service.py test/test_pdd_u2_purchase_adapter.py C:/Python310/python.exe -m pytest -q test $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()" Remove-Item Env:QT_QPA_PLATFORM ``` 真机只验证深链打开、一次下拉刷新和恢复商品详情;不选择规格、不提交订单、不付款。 ## 风险和回退 风险是误把 SKU 售罄或普通推荐文案识别为整页售罄,以及下拉手势落入系统状态栏或其他控件。只接受明确商品级短语,且手势起止点限制在最新 PDD 内容树的中部安全区域;刷新最多一次,方向或页面证据不足时安全停止。回退可恢复为原等待/售罄失败行为,不涉及数据迁移;不可通过扩大刷新次数或放宽页面分类绕过平台异常。
Author
Owner

实施完成,等待用户验收

  • 实现提交:e7ac5a4
  • 归档提交:1ce99d4
  • 归档:docs/task/265-售罄临时页仅下拉刷新一次.md
  • 定向测试:146 项通过
  • 离屏 UI:通过(输出 OK)
  • Client 全量测试:526 项通过、2 项失败;失败均为现有 version.py=0.1.2 与旧测试期待 0.1.0 的基线差异,与 #265 无关
  • 真机未验证:尚未用真实 Android 设备复现临时售罄页并执行下拉;未执行规格选择或真实下单

工单保持开启,待用户真机验收后关闭并同步父工单。

## 实施完成,等待用户验收 - 实现提交:`e7ac5a4` - 归档提交:`1ce99d4` - 归档:`docs/task/265-售罄临时页仅下拉刷新一次.md` - 定向测试:146 项通过 - 离屏 UI:通过(输出 `OK`) - Client 全量测试:526 项通过、2 项失败;失败均为现有 `version.py=0.1.2` 与旧测试期待 `0.1.0` 的基线差异,与 #265 无关 - 真机未验证:尚未用真实 Android 设备复现临时售罄页并执行下拉;未执行规格选择或真实下单 工单保持开启,待用户真机验收后关闭并同步父工单。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#265