perf: 减少采购重复前台查询 (#120)
This commit is contained in:
@@ -106,6 +106,17 @@ def _labels(root: ET.Element) -> list[str]:
|
||||
return [value for node in root.iter("node") if (value := _label(node))]
|
||||
|
||||
|
||||
def _package_hint_from_tree(root: ET.Element) -> str:
|
||||
"""可靠控件树可以直接证明 PDD 在前台,避免慢速前台查询。"""
|
||||
|
||||
pdd_node_count = sum(
|
||||
1
|
||||
for node in root.iter("node")
|
||||
if node.get("package") == PDD_PACKAGE_NAME
|
||||
)
|
||||
return PDD_PACKAGE_NAME if pdd_node_count >= 3 else ""
|
||||
|
||||
|
||||
def _sanitize_diagnostic_xml(xml_data: str) -> str:
|
||||
"""只保留页面判断所需语义,删除商品、账号和收货相关文字。"""
|
||||
|
||||
@@ -400,30 +411,36 @@ class U2PddPurchaseAdapter(PddPurchaseAdapter):
|
||||
device = self._require_device()
|
||||
self._check_cancelled("purchase_page_check")
|
||||
try:
|
||||
current = device.app_current()
|
||||
xml_data = self._dump_hierarchy()
|
||||
root = _parse_xml(xml_data)
|
||||
kind = _page_kind(root, str(current.get("package") or ""))
|
||||
labels = _labels(root)
|
||||
submit_targets = _final_submit_targets(root)
|
||||
selected = {
|
||||
key: value
|
||||
for key, value in self._requested_options.items()
|
||||
if _selected(root, value)
|
||||
}
|
||||
return PurchasePageState(
|
||||
page_kind=kind,
|
||||
goods_id=self._goods_id,
|
||||
selected_options=selected,
|
||||
quantity=_quantity(root),
|
||||
price_cent=_price_cent(root),
|
||||
candidate_count=1 if kind != "unknown" else 0,
|
||||
in_stock=not any(
|
||||
marker in " ".join(labels)
|
||||
for marker in _OUT_OF_STOCK_MARKERS
|
||||
),
|
||||
submit_candidate_count=len(submit_targets),
|
||||
)
|
||||
trace = current_performance_trace()
|
||||
stage = trace.stage("purchase_read_state") if trace else nullcontext()
|
||||
with stage:
|
||||
xml_data = self._dump_hierarchy()
|
||||
root = _parse_xml(xml_data)
|
||||
current_package = _package_hint_from_tree(root)
|
||||
if not current_package:
|
||||
current = device.app_current()
|
||||
current_package = str(current.get("package") or "")
|
||||
kind = _page_kind(root, current_package)
|
||||
labels = _labels(root)
|
||||
submit_targets = _final_submit_targets(root)
|
||||
selected = {
|
||||
key: value
|
||||
for key, value in self._requested_options.items()
|
||||
if _selected(root, value)
|
||||
}
|
||||
return PurchasePageState(
|
||||
page_kind=kind,
|
||||
goods_id=self._goods_id,
|
||||
selected_options=selected,
|
||||
quantity=_quantity(root),
|
||||
price_cent=_price_cent(root),
|
||||
candidate_count=1 if kind != "unknown" else 0,
|
||||
in_stock=not any(
|
||||
marker in " ".join(labels)
|
||||
for marker in _OUT_OF_STOCK_MARKERS
|
||||
),
|
||||
submit_candidate_count=len(submit_targets),
|
||||
)
|
||||
except PddPurchaseError:
|
||||
raise
|
||||
except Exception as exc:
|
||||
@@ -458,20 +475,35 @@ class U2PddPurchaseAdapter(PddPurchaseAdapter):
|
||||
panel_xml = self._wait_for_confirmation_panel()
|
||||
|
||||
color = checked.get("color")
|
||||
if color and not self._select_color(
|
||||
device, panel_xml, color, action_delay=0.2
|
||||
):
|
||||
raise PddPurchaseError(
|
||||
"PURCHASE_OPTIONS_MISMATCH",
|
||||
f"没有精确选中颜色:{color}",
|
||||
step="purchase_select_options",
|
||||
if color:
|
||||
trace = current_performance_trace()
|
||||
stage = (
|
||||
trace.stage("purchase_select_color")
|
||||
if trace else nullcontext()
|
||||
)
|
||||
with stage:
|
||||
color_selected = self._select_color(
|
||||
device, panel_xml, color, action_delay=0.2
|
||||
)
|
||||
if not color_selected:
|
||||
raise PddPurchaseError(
|
||||
"PURCHASE_OPTIONS_MISMATCH",
|
||||
f"没有精确选中颜色:{color}",
|
||||
step="purchase_select_options",
|
||||
)
|
||||
size = checked.get("size")
|
||||
if size:
|
||||
latest_xml = self._dump_hierarchy()
|
||||
if not self._select_size(
|
||||
device, latest_xml, size, action_delay=0.2
|
||||
):
|
||||
trace = current_performance_trace()
|
||||
stage = (
|
||||
trace.stage("purchase_select_size")
|
||||
if trace else nullcontext()
|
||||
)
|
||||
with stage:
|
||||
size_selected = self._select_size(
|
||||
device, latest_xml, size, action_delay=0.2
|
||||
)
|
||||
if not size_selected:
|
||||
raise PddPurchaseError(
|
||||
"PURCHASE_OPTIONS_MISMATCH",
|
||||
f"没有精确选中尺码:{size}",
|
||||
|
||||
Reference in New Issue
Block a user