Client:采购尺码不匹配时完整采集真机候选 #256

Open
opened 2026-08-17 16:30:22 +08:00 by ila · 4 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#96(关联 Client Epic #1)
  • 所属 MVP / 版本:#253 采购运行时 AI 规格纠偏闭环
  • 阶段:3. Client 真机尺码候选完整采集
  • 依赖:#254 的候选数据契约;复用 #167、#177 的第二规格遍历能力

要解决什么

Client 当前收到采购任务后按完整动态规格精确选择。目标尺码在 PDD App 中不存在时,PURCHASE_OPTIONS_MISMATCH 只记录失败原因,没有把当前颜色下真实可购买尺码形成完整、稳定、可提交的候选快照,Admin 无法进行后续规则或 AI 匹配。

必须严格区分“业务尺码文字对不上”和“页面识别/点击不安全”:只有商品正确、颜色成功选中、尺码列表完整遍历后仍找不到唯一目标,才能产出解析候选。

做什么 / 不做什么

  • 做:
    • 在采购 Adapter 增加只读的当前颜色下尺码候选完整采集能力。
    • 复用采集流程已经验证的静态、横向、纵向及标题滑出续页遍历,不复制一套滚动算法。
    • 保留 PDD App 原始尺码文字、可用状态、规格维度名称和稳定候选编号,并计算确定性候选快照哈希所需的规范结构。
    • 只有本地精确、繁简唯一匹配仍失败,且失败原因为 target_not_visible 时,返回结构化“需要远端解析”结果。
    • 候选遍历不完整、列表持续变化或页面丢失时明确报普通采购失败,不能伪装成候选完整。
  • 不做:
    • 本工单不调用 Admin、不运行 AI、不继续点击解析后的尺码。
    • 不在颜色失败、target_ambiguous、safe_target_missing、selection_unconfirmed、商品不符或未知页面时触发远端解析。
    • 不上传或记录原始无障碍 XML;XML 固件只留在本机非 Git 目录,自动化测试使用脱敏样本。
    • 不触碰数量、地址、提交订单或付款控件。

怎么做

  1. 为采购适配层定义清晰的候选观察数据对象和“需要规格解析”结果/异常,字段与 #254 契约一致但不依赖 HTTP。
  2. 从现有第二规格完整遍历中提取可复用的只读扫描组件;必须确认起点、滚动方向、终点和重复视口收敛,不能只返回当前屏候选。
  3. 在颜色已经选中后重新读取规格面板,再采集该颜色上下文中的尺码;若颜色改变会导致尺码列表变化,候选必须绑定已选颜色。
  4. 先调用当前精确/繁简唯一匹配。只有完整候选中目标确实不可见时生成观察;其他安全失败保持原错误码和停止行为。
  5. 对候选数量、文字长度、重复值、可用状态和维度做本地校验;规范化仅用于比较和哈希,原始文字用于后续点击。
  6. 使用脱敏 XML 固件测试静态、横向、纵向、标题滑出、临时空树、重复候选、禁用尺码和列表不完整。

预计修改文件:

  • client/src/pdd_u2_purchase_adapter.py
  • client/src/util/select_color_size.py
  • client/src/pdd_collect_service.py(仅抽取可复用只读遍历能力时)
  • client/src/pdd_purchase_adapter.py
  • 相邻 Client 测试和脱敏 testdata
  • docs/client/01-requirements.md
  • docs/client/02-architecture.md
  • 完成后归档 docs/task/<工单号>-client采购尺码候选完整采集.md

验收标准

  • 商品正确、颜色选中且目标尺码精确/繁简唯一匹配成功时不生成远端候选,原流程继续。
  • 目标尺码不存在且当前颜色下尺码已完整遍历时,生成包含全部原始候选和可用状态的结构化观察。
  • 静态、横向、纵向和标题滑出续页列表都能确认完整终点,不只采当前视口。
  • 候选观察绑定当前商品与已选颜色,页面或颜色变化时旧观察不能复用。
  • target_ambiguous、安全点击缺失、选中未确认、颜色失败、未知页面和遍历不完整均不触发远端解析。
  • 不点击任何新尺码、数量、地址、提交订单或支付控件。
  • 不把原始 XML、个人数据或凭据写入日志、SQLite、工单或测试固件。
  • Python 3.10 单元测试、语法检查和现有采购 Adapter 回归通过。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m pytest -q
C:/Python310/python.exe -m py_compile src/pdd_u2_purchase_adapter.py src/pdd_purchase_adapter.py
$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

用脱敏 XML 固件逐项验证候选完整性和非触发错误;真机只读验证允许打开商品和规格面板、选择测试颜色并读取尺码,不进入下单提交。

风险和回退

  • 风险:把未完整列表当成全部候选。必须有明确起点、终点与稳定收敛证据,无法证明完整即失败。
  • 风险:复用采集遍历影响现有采集任务。抽取公共只读���力时保持原入口测试,禁止顺手修改采价逻辑。
  • 回退:移除候选观察分支,恢复现有目标找不到即 PURCHASE_OPTIONS_MISMATCH;不会产生数据库变更或外部订单。
## 基本信息 - 类型:需求 - 父级大工单:#96(关联 Client Epic #1) - 所属 MVP / 版本:#253 采购运行时 AI 规格纠偏闭环 - 阶段:3. Client 真机尺码候选完整采集 - 依赖:#254 的候选数据契约;复用 #167、#177 的第二规格遍历能力 ## 要解决什么 Client 当前收到采购任务后按完整动态规格精确选择。目标尺码在 PDD App 中不存在时,`PURCHASE_OPTIONS_MISMATCH` 只记录失败原因,没有把当前颜色下真实可购买尺码形成完整、稳定、可提交的候选快照,Admin 无法进行后续规则或 AI 匹配。 必须严格区分“业务尺码文字对不上”和“页面识别/点击不安全”:只有商品正确、颜色成功选中、尺码列表完整遍历后仍找不到唯一目标,才能产出解析候选。 ## 做什么 / 不做什么 - 做: - 在采购 Adapter 增加只读的当前颜色下尺码候选完整采集能力。 - 复用采集流程已经验证的静态、横向、纵向及标题滑出续页遍历,不复制一套滚动算法。 - 保留 PDD App 原始尺码文字、可用状态、规格维度名称和稳定候选编号,并计算确定性候选快照哈希所需的规范结构。 - 只有本地精确、繁简唯一匹配仍失败,且失败原因为 `target_not_visible` 时,返回结构化“需要远端解析”结果。 - 候选遍历不完整、列表持续变化或页面丢失时明确报普通采购失败,不能伪装成候选完整。 - 不做: - 本工单不调用 Admin、不运行 AI、不继续点击解析后的尺码。 - 不在颜色失败、`target_ambiguous`、`safe_target_missing`、`selection_unconfirmed`、商品不符或未知页面时触发远端解析。 - 不上传或记录原始无障碍 XML;XML 固件只留在本机非 Git 目录,自动化测试使用脱敏样本。 - 不触碰数量、地址、提交订单或付款控件。 ## 怎么做 1. 为采购适配层定义清晰的候选观察数据对象和“需要规格解析”结果/异常,字段与 #254 契约一致但不依赖 HTTP。 2. 从现有第二规格完整遍历中提取可复用的只读扫描组件;必须确认起点、滚动方向、终点和重复视口收敛,不能只返回当前屏候选。 3. 在颜色已经选中后重新读取规格面板,再采集该颜色上下文中的尺码;若颜色改变会导致尺码列表变化,候选必须绑定已选颜色。 4. 先调用当前精确/繁简唯一匹配。只有完整候选中目标确实不可见时生成观察;其他安全失败保持原错误码和停止行为。 5. 对候选数量、文字长度、重复值、可用状态和维度做本地校验;规范化仅用于比较和哈希,原始文字用于后续点击。 6. 使用脱敏 XML 固件测试静态、横向、纵向、标题滑出、临时空树、重复候选、禁用尺码和列表不完整。 预计修改文件: - `client/src/pdd_u2_purchase_adapter.py` - `client/src/util/select_color_size.py` - `client/src/pdd_collect_service.py`(仅抽取可复用只读遍历能力时) - `client/src/pdd_purchase_adapter.py` - 相邻 Client 测试和脱敏 `testdata` - `docs/client/01-requirements.md` - `docs/client/02-architecture.md` - 完成后归档 `docs/task/<工单号>-client采购尺码候选完整采集.md` ## 验收标准 - [ ] 商品正确、颜色选中且目标尺码精确/繁简唯一匹配成功时不生成远端候选,原流程继续。 - [ ] 目标尺码不存在且当前颜色下尺码已完整遍历时,生成包含全部原始候选和可用状态的结构化观察。 - [ ] 静态、横向、纵向和标题滑出续页列表都能确认完整终点,不只采当前视口。 - [ ] 候选观察绑定当前商品与已选颜色,页面或颜色变化时旧观察不能复用。 - [ ] `target_ambiguous`、安全点击缺失、选中未确认、颜色失败、未知页面和遍历不完整均不触发远端解析。 - [ ] 不点击任何新尺码、数量、地址、提交订单或支付控件。 - [ ] 不把原始 XML、个人数据或凭据写入日志、SQLite、工单或测试固件。 - [ ] Python 3.10 单元测试、语法检查和现有采购 Adapter 回归通过。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m pytest -q C:/Python310/python.exe -m py_compile src/pdd_u2_purchase_adapter.py src/pdd_purchase_adapter.py $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 ``` 用脱敏 XML 固件逐项验证候选完整性和非触发错误;真机只读验证允许打开商品和规格面板、选择测试颜色并读取尺码,不进入下单提交。 ## 风险和回退 - 风险:把未完整列表当成全部候选。必须有明确起点、终点与稳定收敛证据,无法证明完整即失败。 - 风险:复用采集遍历影响现有采集任务。抽取公共只读���力时保持原入口测试,禁止顺手修改采价逻辑。 - 回退:移除候选观察分支,恢复现有目标找不到即 `PURCHASE_OPTIONS_MISMATCH`;不会产生数据库变更或外部订单。
Author
Owner

开始实施。已核对 #254 的 spec-resolution-v1 契约和现有第二规格遍历:本工单将把 PddCollectService 已验证的第二规格只读遍历开放为采购侧复用入口;仅在颜色已选中、尺码匹配原因为 target_not_visible 且遍历完整时,生成内存中的结构化候选快照。遍历不完整、页面丢失或候选变化仍按普通采购失败处理;本工单不调用 Admin、不点击解析后的尺码、不持久化 XML 或候选数据。

开始实施。已核对 #254 的 `spec-resolution-v1` 契约和现有第二规格遍历:本工单将把 `PddCollectService` 已验证的第二规格只读遍历开放为采购侧复用入口;仅在颜色已选中、尺码匹配原因为 `target_not_visible` 且遍历完整时,生成内存中的结构化候选快照。遍历不完整、页面丢失或候选变化仍按普通采购失败处理;本工单不调用 Admin、不点击解析后的尺码、不持久化 XML 或候选数据。
Author
Owner

实现完成,准备提交:

  • 采购 Adapter 仅在颜色已可靠选中、尺码失败原因为 target_not_visible 后启动完整只读遍历。
  • 复用 PddCollectService 现有第二规格遍历,并为采购候选启用严格起止边界确认;扫描中可用状态变化、页面丢失或达到上限均返回普通采购失败。
  • 内存快照保留规格名称、全部原文与 availability;只为可购买项按页面顺序生成 c1...,快照哈希严格按 #254 的 spec-resolution-v1 算法计算。
  • 完整列表若仍含目标原文或繁简等价项,判定为点击/确认失败,不触发远端解析。
  • 本工单没有 Admin 请求、没有解析后点击、没有 XML 或候选持久化。

验证:相关测试 127 passed;Client 全量测试 480 passed、2 failed。两项失败均为工作区已有版本号 0.1.2 与旧测试固定期望 0.1.0 不一致(test_update_service.py、test_update_ui_event.py),与 #256 无关。

实现完成,准备提交: - 采购 Adapter 仅在颜色已可靠选中、尺码失败原因为 `target_not_visible` 后启动完整只读遍历。 - 复用 `PddCollectService` 现有第二规格遍历,并为采购候选启用严格起止边界确认;扫描中可用状态变化、页面丢失或达到上限均返回普通采购失败。 - 内存快照保留规格名称、全部原文与 availability;只为可购买项按页面顺序生成 `c1...`,快照哈希严格按 #254 的 `spec-resolution-v1` 算法计算。 - 完整列表若仍含目标原文或繁简等价项,判定为点击/确认失败,不触发远端解析。 - 本工单没有 Admin 请求、没有解析后点击、没有 XML 或候选持久化。 验证:相关测试 127 passed;Client 全量测试 480 passed、2 failed。两项失败均为工作区已有版本号 `0.1.2` 与旧测试固定期望 `0.1.0` 不一致(`test_update_service.py`、`test_update_ui_event.py`),与 #256 无关。
Author
Owner

已完成实现并归档,状态:待用户验收。

  • 实现提交:58dc902 feat: 完整采集采购尺码候选 (#256)
  • 归档提交:45e3064 docs: 归档任务 #256
  • 归档文档:docs/task/256-client采购尺码候选完整采集.md
  • 相关测试:127 passed
  • Client 全量回归:480 passed,2 个与本工单无关的既有版本号断言失败(当前 0.1.2,旧测试期望 0.1.0)
  • 未验证:尚未连接真机执行实际长尺码列表遍历

按流程暂不关闭 #256,也不勾选 #253 / #96,等待用户验收。

已完成实现并归档,状态:待用户验收。 - 实现提交:`58dc902` `feat: 完整采集采购尺码候选 (#256)` - 归档提交:`45e3064` `docs: 归档任务 #256` - 归档文档:`docs/task/256-client采购尺码候选完整采集.md` - 相关测试:127 passed - Client 全量回归:480 passed,2 个与本工单无关的既有版本号断言失败(当前 `0.1.2`,旧测试期望 `0.1.0`) - 未验证:尚未连接真机执行实际长尺码列表遍历 按流程暂不关闭 #256,也不勾选 #253 / #96,等待用户验收。
Author
Owner

补充完成工单正文要求的本地候选边界校验和 UI 启动验证:

  • 新增重复候选、候选超过 100 条、维度错误、文字长度/控制字符校验;失败统一停在可逆阶段,不生成待解析结果。
  • 将纵向标题滑出续页测试改由公开的严格候选入口执行。
  • 相关测试更新为 128 passed。
  • QT_QPA_PLATFORM=offscreen 创建 MainWindow 成功并输出 OK(仅有本机 PyQt5 字体目录警告)。

补充提交:

  • 9118541 fix: 校验采购尺码候选边界 (#256)
  • a699ec8 docs: 补充任务 #256 验证记录

仍为待用户验收,暂不关闭工单或更新父工单完成状态。

补充完成工单正文要求的本地候选边界校验和 UI 启动验证: - 新增重复候选、候选超过 100 条、维度错误、文字长度/控制字符校验;失败统一停在可逆阶段,不生成待解析结果。 - 将纵向标题滑出续页测试改由公开的严格候选入口执行。 - 相关测试更新为 128 passed。 - `QT_QPA_PLATFORM=offscreen` 创建 `MainWindow` 成功并输出 `OK`(仅有本机 PyQt5 字体目录警告)。 补充提交: - `9118541` `fix: 校验采购尺码候选边界 (#256)` - `a699ec8` `docs: 补充任务 #256 验证记录` 仍为待用户验收,暂不关闭工单或更新父工单完成状态。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#256