Client:修正规格候选遍历后的颜色复核顺序 #266

Open
opened 2026-08-24 11:29:01 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#96(关联 Client Epic #1)
  • 所属 MVP / 版本:#253 采购运行时 AI 规格纠偏闭环
  • 阶段:阶段 5,真机异常路径修复
  • 关联工单:#257、#260

要解决什么

Client 已选中颜色后,目标尺码无法直接匹配时会完整遍历 PDD 第二规格并等待 Admin 解析。完整遍历可能把规格面板留在尺码列表末端,使已选颜色节点和完整“已选”摘要离开当前无障碍控件树。apply_resolved_size 当前先调用 _selected 复核颜色,失败后才调用 _restore_purchase_panel_color_region,导致实际颜色未变时误报 PURCHASE_SPEC_CONTEXT_CHANGED:等待规格解析期间已选颜色发生变化。

本地记录显示 cg52 两次、cg59 一次都在 Admin 已返回同一候选快照的唯一结果后触发该错误;现有诊断没有保存失败控件树,因此修复仍须保持强证据和安全停止,不得直接跳过颜色复核。

做什么 / 不做什么

  • 做:确认仍在规格确认页后,先有界恢复到颜色区域,再读取最新控件树复核已选颜色;区分“无法恢复/无法确认颜色区域”和“看到明确不同颜色”两类失败;完整候选复算及尺码点击前继续使用最新页面;补充颜色滑出屏幕后恢复、真实换色、恢复失败和繁简等价回归测试;同步采购安全文档。
  • 不做:不删除颜色复核;不使用模糊颜色匹配;不改变 Admin AI 结果或接口;不重新请求解析;不点击其他颜色、提交订单或付款;不改变不可逆阶段规则。

已确认的实现方案

  • 修改 client/src/pdd_u2_purchase_adapter.py:apply_resolved_size 首先重读并验证页面类型;随后调用既有 _restore_purchase_panel_color_region,使用其返回的最新 XML 再执行 _selected。恢复失败沿用 PURCHASE_PANEL_COLOR_REGION_NOT_FOUND,不伪装成颜色变化。
  • 颜色恢复后若目标颜色仍无选中强证据,返回 PURCHASE_SPEC_CONTEXT_CHANGED,并保留 context_check=selected_color;不因颜色文字仅繁简不同而失败。
  • 继续重新完整读取尺码候选并比对快照;点击 Admin 返回尺码前仍使用最新控件树,不放松候选哈希、候选逐字副本和最终选中确认。
  • 修改 client/test/test_pdd_u2_purchase_adapter.py:构造候选遍历后颜色滑出屏幕、恢复后仍选中的控件树;验证恢复发生在颜色复核之前;覆盖明确换色和无法恢复时安全失败。
  • 同步 docs/client/06-quality-security.md,说明候选遍历后的颜色复核必须先恢复可观察区域。

预计修改文件:

  • client/src/pdd_u2_purchase_adapter.py
  • client/test/test_pdd_u2_purchase_adapter.py
  • docs/client/06-quality-security.md

验收标准

  • Admin 返回规格结果时,如果颜色节点只是因候选遍历滑出当前控件树,Client 有界恢复颜色区域后可以继续。
  • 恢复后必须重新读取控件树并确认原目标颜色仍明确选中,繁简等价沿用既有安全规则。
  • 明确选中了其他颜色时仍返回 PURCHASE_SPEC_CONTEXT_CHANGED,不点击返回尺码。
  • 无法恢复颜色区域时返回 PURCHASE_PANEL_COLOR_REGION_NOT_FOUND,不误报颜色变化。
  • 候选快照变化、页面离开确认页、Admin 返回非法候选等既有门禁保持不变。
  • 全流程发生在规格选择阶段和不可逆标记之前,不新增重新下单路径。
  • Python 3.10 语法检查、定向测试、Client 全量测试及离屏 UI 冒烟完成。

验证方式

从 client/ 目录执行:

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

真机验收只观察颜色区域恢复、颜色复核和尺码选择;若继续至提交订单,必须按既有真实采购单次提交门禁执行,绝不付款。

风险和回退

风险是恢复动作改变面板位置后仍使用旧 XML,或把无法确认误当成颜色未变。实现必须使用恢复函数返回的最新 XML 再复核,任何恢复失败、页面变化或选中证据不足都安全停止。回退仅恢复原复核顺序,不涉及数据库和接口迁移;不得以移除颜色复核作为回退。

## 基本信息 - 类型:缺陷 - 父级大工单:#96(关联 Client Epic #1) - 所属 MVP / 版本:#253 采购运行时 AI 规格纠偏闭环 - 阶段:阶段 5,真机异常路径修复 - 关联工单:#257、#260 ## 要解决什么 Client 已选中颜色后,目标尺码无法直接匹配时会完整遍历 PDD 第二规格并等待 Admin 解析。完整遍历可能把规格面板留在尺码列表末端,使已选颜色节点和完整“已选”摘要离开当前无障碍控件树。`apply_resolved_size` 当前先调用 `_selected` 复核颜色,失败后才调用 `_restore_purchase_panel_color_region`,导致实际颜色未变时误报 `PURCHASE_SPEC_CONTEXT_CHANGED:等待规格解析期间已选颜色发生变化`。 本地记录显示 `cg52` 两次、`cg59` 一次都在 Admin 已返回同一候选快照的唯一结果后触发该错误;现有诊断没有保存失败控件树,因此修复仍须保持强证据和安全停止,不得直接跳过颜色复核。 ## 做什么 / 不做什么 - 做:确认仍在规格确认页后,先有界恢复到颜色区域,再读取最新控件树复核已选颜色;区分“无法恢复/无法确认颜色区域”和“看到明确不同颜色”两类失败;完整候选复算及尺码点击前继续使用最新页面;补充颜色滑出屏幕后恢复、真实换色、恢复失败和繁简等价回归测试;同步采购安全文档。 - 不做:不删除颜色复核;不使用模糊颜色匹配;不改变 Admin AI 结果或接口;不重新请求解析;不点击其他颜色、提交订单或付款;不改变不可逆阶段规则。 ## 已确认的实现方案 - 修改 `client/src/pdd_u2_purchase_adapter.py`:`apply_resolved_size` 首先重读并验证页面类型;随后调用既有 `_restore_purchase_panel_color_region`,使用其返回的最新 XML 再执行 `_selected`。恢复失败沿用 `PURCHASE_PANEL_COLOR_REGION_NOT_FOUND`,不伪装成颜色变化。 - 颜色恢复后若目标颜色仍无选中强证据,返回 `PURCHASE_SPEC_CONTEXT_CHANGED`,并保留 `context_check=selected_color`;不因颜色文字仅繁简不同而失败。 - 继续重新完整读取尺码候选并比对快照;点击 Admin 返回尺码前仍使用最新控件树,不放松候选哈希、候选逐字副本和最终选中确认。 - 修改 `client/test/test_pdd_u2_purchase_adapter.py`:构造候选遍历后颜色滑出屏幕、恢复后仍选中的控件树;验证恢复发生在颜色复核之前;覆盖明确换色和无法恢复时安全失败。 - 同步 `docs/client/06-quality-security.md`,说明候选遍历后的颜色复核必须先恢复可观察区域。 预计修改文件: - `client/src/pdd_u2_purchase_adapter.py` - `client/test/test_pdd_u2_purchase_adapter.py` - `docs/client/06-quality-security.md` ## 验收标准 - [x] Admin 返回规格结果时,如果颜色节点只是因候选遍历滑出当前控件树,Client 有界恢复颜色区域后可以继续。 - [x] 恢复后必须重新读取控件树并确认原目标颜色仍明确选中,繁简等价沿用既有安全规则。 - [x] 明确选中了其他颜色时仍返回 `PURCHASE_SPEC_CONTEXT_CHANGED`,不点击返回尺码。 - [x] 无法恢复颜色区域时返回 `PURCHASE_PANEL_COLOR_REGION_NOT_FOUND`,不误报颜色变化。 - [x] 候选快照变化、页面离开确认页、Admin 返回非法候选等既有门禁保持不变。 - [x] 全流程发生在规格选择阶段和不可逆标记之前,不新增重新下单路径。 - [x] Python 3.10 语法检查、定向测试、Client 全量测试及离屏 UI 冒烟完成。 ## 验证方式 从 `client/` 目录执行: ```powershell C:/Python310/python.exe -m py_compile src/pdd_u2_purchase_adapter.py C:/Python310/python.exe -m pytest -q test/test_pdd_u2_purchase_adapter.py test/test_purchase_task_service.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 ``` 真机验收只观察颜色区域恢复、颜色复核和尺码选择;若继续至提交订单,必须按既有真实采购单次提交门禁执行,绝不付款。 ## 风险和回退 风险是恢复动作改变面板位置后仍使用旧 XML,或把无法确认误当成颜色未变。实现必须使用恢复函数返回的最新 XML 再复核,任何恢复失败、页面变化或选中证据不足都安全停止。回退仅恢复原复核顺序,不涉及数据库和接口迁移;不得以移除颜色复核作为回退。
Author
Owner

实施完成,等待用户验收

  • 实现提交:b0cddb9
  • 归档提交:024f5e6
  • 归档:docs/task/266-修正规格候选遍历后的颜色复核顺序.md
  • 定向测试:84 项通过
  • 离屏 UI:通过(输出 OK)
  • Client 全量测试:528 项通过、2 项失败;失败均为现有 version.py=0.1.2 与旧测试期待 0.1.0 的基线差异,与 #266 无关
  • 真机未验证:尚未在真实 Android 设备复现长尺码列表后的颜色区域恢复;未执行真实规格点击或下单

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

## 实施完成,等待用户验收 - 实现提交:`b0cddb9` - 归档提交:`024f5e6` - 归档:`docs/task/266-修正规格候选遍历后的颜色复核顺序.md` - 定向测试:84 项通过 - 离屏 UI:通过(输出 `OK`) - Client 全量测试:528 项通过、2 项失败;失败均为现有 `version.py=0.1.2` 与旧测试期待 `0.1.0` 的基线差异,与 #266 无关 - 真机未验证:尚未在真实 Android 设备复现长尺码列表后的颜色区域恢复;未执行真实规格点击或下单 工单保持开启,待用户真机验收后关闭并同步父工单。
Author
Owner

#267 根据真机流程修订 #266 的最终实现顺序:不再在 AI 返回后强制先恢复颜色区域,改为先复算并选择尺码、再核对完整组合,摘要不足时才兜底恢复颜色。#266 保留实现记录,最终行为以 #267 为准。

#267 根据真机流程修订 #266 的最终实现顺序:不再在 AI 返回后强制先恢复颜色区域,改为先复算并选择尺码、再核对完整组合,摘要不足时才兜底恢复颜色。#266 保留实现记录,最终行为以 #267 为准。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/cmautobuy#266