fix: AI 返回后先选尺码再核对组合 (#267)

This commit is contained in:
chengma
2026-08-18 14:17:50 +08:00
parent 024f5e69cb
commit 39c6258d24
3 changed files with 146 additions and 26 deletions
+115 -7
View File
@@ -266,12 +266,14 @@ class VerticallyScrolledColorPanelDevice(FakeDevice):
starts_at_top: bool,
restores_on_swipe: bool = True,
selected_color: str = "",
show_selected_summary: bool = False,
):
super().__init__()
self.at_color_top = starts_at_top
self.restores_on_swipe = restores_on_swipe
self.selected_color = selected_color
self.selected_size = ""
self.show_selected_summary = show_selected_summary
self.swipes = []
def dump_hierarchy(self):
@@ -293,6 +295,18 @@ class VerticallyScrolledColorPanelDevice(FakeDevice):
'<node text="均码" clickable="true"',
'<node text="均码" selected="true" clickable="true"',
)
if (
not self.at_color_top
and self.show_selected_summary
and self.selected_color
):
summary = self.selected_color
if self.selected_size:
summary = f"{summary} {self.selected_size}"
xml_data = xml_data.replace(
'text="请选择: 颜色分类"',
f'text="已选: {summary}"',
)
return xml_data
return super().dump_hierarchy()
@@ -1117,7 +1131,48 @@ class U2PddPurchaseAdapterTest(unittest.TestCase):
)
adapter.close()
def test_apply_resolved_size_restores_hidden_selected_color_before_recheck(self):
def test_apply_resolved_size_uses_complete_summary_without_color_restore(self):
clock = FakeClock()
device = VerticallyScrolledColorPanelDevice(
starts_at_top=False,
selected_color="黑色",
show_selected_summary=True,
)
selected_sizes = []
snapshot = PurchaseSpecCandidateSnapshot.build(
goods_id="753136429979",
selected_color="黑色",
target_size="50公斤",
dimension_name="尺码",
observations=(PurchaseSizeObservation("均码", True),),
observed_at="2026-08-18T04:00:00Z",
)
def select_size(_device, _xml, target, **_kwargs):
selected_sizes.append(target)
device.selected_size = target
return True
adapter = U2PddPurchaseAdapter(
"USB-001",
device_service=PddDeviceService(connector=lambda _serial: device),
sleeper=clock.sleep,
monotonic=clock.monotonic,
select_size_fn=select_size,
size_candidate_collector=lambda _device: SpecDimension(
"size", "尺码", (DimensionValue("均码", True),)
),
)
adapter.open_goods(GOODS_URL)
device.mode = "panel"
adapter.apply_resolved_size(snapshot, snapshot.candidates[0])
self.assertEqual(device.swipes, [])
self.assertEqual(selected_sizes, ["均码"])
adapter.close()
def test_apply_resolved_size_restores_color_when_summary_is_incomplete(self):
clock = FakeClock()
device = VerticallyScrolledColorPanelDevice(
starts_at_top=False,
@@ -1158,7 +1213,7 @@ class U2PddPurchaseAdapterTest(unittest.TestCase):
self.assertEqual(selected_sizes, ["均码"])
adapter.close()
def test_apply_resolved_size_stops_when_hidden_color_cannot_be_restored(self):
def test_apply_resolved_size_stops_when_color_fallback_cannot_be_restored(self):
clock = FakeClock()
device = VerticallyScrolledColorPanelDevice(
starts_at_top=False,
@@ -1175,13 +1230,25 @@ class U2PddPurchaseAdapterTest(unittest.TestCase):
observations=(PurchaseSizeObservation("均码", True),),
observed_at="2026-08-18T04:00:00Z",
)
def select_size(_device, _xml, target, **_kwargs):
selected_sizes.append(target)
device.selected_size = target
return True
def collect_candidates(_device):
candidate_scans.append(True)
return SpecDimension(
"size", "尺码", (DimensionValue("均码", True),)
)
adapter = U2PddPurchaseAdapter(
"USB-001",
device_service=PddDeviceService(connector=lambda _serial: device),
sleeper=clock.sleep,
monotonic=clock.monotonic,
select_size_fn=lambda *_args, **_kwargs: selected_sizes.append(True),
size_candidate_collector=lambda _device: candidate_scans.append(True),
select_size_fn=select_size,
size_candidate_collector=collect_candidates,
)
adapter.open_goods(GOODS_URL)
device.mode = "panel"
@@ -1194,8 +1261,49 @@ class U2PddPurchaseAdapterTest(unittest.TestCase):
"PURCHASE_PANEL_COLOR_REGION_NOT_FOUND",
)
self.assertEqual(len(device.swipes), 2)
self.assertEqual(candidate_scans, [])
self.assertEqual(selected_sizes, [])
self.assertEqual(candidate_scans, [True])
self.assertEqual(selected_sizes, ["均码"])
adapter.close()
def test_apply_resolved_size_rechecks_panel_after_selecting_returned_size(self):
device = FakeDevice()
resolved_size = "均码【80-120斤】"
snapshot = PurchaseSpecCandidateSnapshot.build(
goods_id="753136429979",
selected_color="黑色",
target_size="均码【40-60公斤】",
dimension_name="尺码",
observations=(PurchaseSizeObservation(resolved_size, True),),
observed_at="2026-08-18T04:00:00Z",
)
def leave_panel_after_size(*_args, **_kwargs):
device.special_xml = home_xml()
return True
adapter = U2PddPurchaseAdapter(
"USB-001",
device_service=PddDeviceService(connector=lambda _serial: device),
sleeper=lambda _seconds: None,
select_size_fn=leave_panel_after_size,
size_candidate_collector=lambda _device: SpecDimension(
"size", "尺码", (DimensionValue(resolved_size, True),)
),
)
adapter.open_goods(GOODS_URL)
device.mode = "special"
device.special_xml = panel_xml().replace(
"3XL【140-165斤】", resolved_size
)
with self.assertRaises(PddPurchaseError) as raised:
adapter.apply_resolved_size(snapshot, snapshot.candidates[0])
self.assertEqual(raised.exception.code, "PURCHASE_SPEC_CONTEXT_CHANGED")
self.assertEqual(
raised.exception.diagnostics["context_check"],
"page_kind_after_size",
)
adapter.close()
def test_apply_resolved_size_distinguishes_page_and_color_context_changes(self):
@@ -1217,7 +1325,7 @@ class U2PddPurchaseAdapterTest(unittest.TestCase):
.replace("已选: 黑色", "已选: 白色")
.replace("黑色", "缥缈仙姬绾【白色】")
.replace("3XL【140-165斤】", resolved_size),
"已选颜色发生变化",
"无法确认原颜色仍处于选中状态",
),
)
for context_check, current_xml, expected_message in cases: