V10.520 拆分過期價格刷新與搜尋救援
All checks were successful
CD Pipeline / deploy (push) Successful in 1m11s

This commit is contained in:
OoO
2026-05-31 23:41:44 +08:00
parent 371a2b325e
commit dd6b6160fe
6 changed files with 88 additions and 18 deletions

View File

@@ -1794,6 +1794,7 @@ class CompetitorPriceFeeder:
skus: list,
source: str = "pchome",
label: str = "已確認身份價格刷新",
allow_missing_recovery: bool = True,
) -> FeederResult:
start = time.time()
@@ -1837,6 +1838,25 @@ class CompetitorPriceFeeder:
try:
product = product_map.get(_product_id_key(competitor_product_id))
if not product:
if not allow_missing_recovery:
self._record_match_attempt(
sku,
momo_name,
momo_product_id=momo_product_id,
momo_price=momo_price,
search_terms=search_terms,
candidate_count=0,
attempt_status="refresh_no_result",
error_message=(
f"PChome product_id not returned: {competitor_product_id}; "
"fresh_search_recovery_deferred"
),
source=source,
)
skipped_no += 1
attempts_written += 1
continue
recovered, recovery_terms, recovery_candidate_count = _recover_low_score_with_fresh_search(
crawler,
momo_name,
@@ -2029,20 +2049,21 @@ class CompetitorPriceFeeder:
if score < MIN_MATCH_SCORE:
recovery_terms: list[str] = []
recovery_candidate_count = 0
recovered, recovery_terms, recovery_candidate_count = _recover_low_score_with_fresh_search(
crawler,
momo_name,
momo_price=momo_price,
existing_product_id=competitor_product_id,
)
if recovered:
recovered_product, recovered_score, recovered_diagnostics = recovered
if (
recovered_score > score
or getattr(diagnostics, "hard_veto", False)
and not getattr(recovered_diagnostics, "hard_veto", False)
):
best_product, score, diagnostics = recovered_product, recovered_score, recovered_diagnostics
if allow_missing_recovery:
recovered, recovery_terms, recovery_candidate_count = _recover_low_score_with_fresh_search(
crawler,
momo_name,
momo_price=momo_price,
existing_product_id=competitor_product_id,
)
if recovered:
recovered_product, recovered_score, recovered_diagnostics = recovered
if (
recovered_score > score
or getattr(diagnostics, "hard_veto", False)
and not getattr(recovered_diagnostics, "hard_veto", False)
):
best_product, score, diagnostics = recovered_product, recovered_score, recovered_diagnostics
if score >= MIN_MATCH_SCORE:
extras = ["refresh_known_identity"]
@@ -2144,7 +2165,11 @@ class CompetitorPriceFeeder:
best_product=best_product,
best_score=score,
diagnostics=diagnostics,
error_message=_format_match_diagnostics(diagnostics),
error_message=(
_format_match_diagnostics(diagnostics)
if allow_missing_recovery
else f"fresh_search_recovery_deferred; {_format_match_diagnostics(diagnostics)}"
),
source=source,
)
skipped_low += 1
@@ -2286,7 +2311,12 @@ class CompetitorPriceFeeder:
logger.error(f"[Feeder] 讀取過期 identity_v2 商品失敗: {e}")
return FeederResult(0, 0, 0, 0, 1, 0.0)
return self._run_known_identity_refresh_items(skus, source=source, label="identity_v2 過期價格刷新")
return self._run_known_identity_refresh_items(
skus,
source=source,
label="identity_v2 過期價格刷新",
allow_missing_recovery=False,
)
def run_retryable_candidate_revalidation(
self,