fix: 校验采购尺码候选边界 (#256)
This commit is contained in:
@@ -1168,6 +1168,8 @@ class U2PddPurchaseAdapter(PddPurchaseAdapter):
|
||||
diagnostics={"selection_failure": "target_not_visible"},
|
||||
)
|
||||
|
||||
self._validate_size_candidate_dimension(dimension)
|
||||
|
||||
available_values = tuple(
|
||||
item for item in dimension.values if item.available
|
||||
)
|
||||
@@ -1213,6 +1215,39 @@ class U2PddPurchaseAdapter(PddPurchaseAdapter):
|
||||
)
|
||||
raise PddPurchaseSpecResolutionRequired(snapshot)
|
||||
|
||||
@staticmethod
|
||||
def _validate_size_candidate_dimension(dimension: SpecDimension) -> None:
|
||||
"""候选进入快照前满足 #254 的数量、文字和维度边界。"""
|
||||
|
||||
def valid_text(value: str) -> bool:
|
||||
return (
|
||||
1 <= len(value) <= 191
|
||||
and not any(ord(char) < 32 or 127 <= ord(char) <= 159 for char in value)
|
||||
)
|
||||
|
||||
texts = [item.text for item in dimension.values]
|
||||
available_count = sum(item.available for item in dimension.values)
|
||||
invalid_reason = ""
|
||||
if dimension.key != "size" or not valid_text(dimension.name):
|
||||
invalid_reason = "dimension_invalid"
|
||||
elif len(set(texts)) != len(texts):
|
||||
invalid_reason = "candidate_duplicated"
|
||||
elif any(not valid_text(text) for text in texts):
|
||||
invalid_reason = "candidate_text_invalid"
|
||||
elif available_count > 100:
|
||||
invalid_reason = "candidate_count_exceeded"
|
||||
if invalid_reason:
|
||||
raise PddPurchaseError(
|
||||
"PURCHASE_SIZE_CANDIDATE_SCAN_INCOMPLETE",
|
||||
"完整尺码候选不符合规格解析边界,已停止采购",
|
||||
step="purchase_select_options",
|
||||
diagnostics={
|
||||
"selection_failure": "target_not_visible",
|
||||
"candidate_validation": invalid_reason,
|
||||
"candidate_count": available_count,
|
||||
},
|
||||
)
|
||||
|
||||
def _collect_size_candidates(self, device: Any) -> Optional[SpecDimension]:
|
||||
"""使用采集模块同一套第二规格遍历,不建立新连接也不保存 XML。"""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user