Add SKU-scoped PChome rescore pilot
All checks were successful
CD Pipeline / deploy (push) Successful in 1m4s

This commit is contained in:
OoO
2026-05-25 08:33:05 +08:00
parent b877805a4c
commit da7bc88b5e
8 changed files with 47 additions and 2 deletions

View File

@@ -514,6 +514,7 @@ def fetch_match_attempt_rescore_rows(
source: str = "pchome",
statuses: Sequence[str] = DEFAULT_RESCAN_STATUSES,
reason_filter: str | None = None,
skus: Sequence[str] | None = None,
limit: int = 100,
latest_sku_only: bool = True,
) -> list[dict[str, Any]]:
@@ -525,6 +526,8 @@ def fetch_match_attempt_rescore_rows(
already moved to a newer review state.
"""
status_values = tuple(status for status in statuses if status) or DEFAULT_RESCAN_STATUSES
sku_values = tuple(str(sku).strip() for sku in (skus or ()) if str(sku).strip())
sku_predicate = "AND sku IN :skus" if sku_values else ""
if latest_sku_only:
reason_predicate = "AND diagnostic_codes::text LIKE :reason_filter" if (
@@ -576,6 +579,7 @@ def fetch_match_attempt_rescore_rows(
WHERE rn = 1
AND attempt_status IN :statuses
{reason_predicate}
{sku_predicate}
ORDER BY attempted_at DESC{nulls_last}
LIMIT :limit
""").bindparams(bindparam("statuses", expanding=True))
@@ -602,6 +606,7 @@ def fetch_match_attempt_rescore_rows(
WHERE source = :source
AND attempt_status IN :statuses
{reason_predicate}
{sku_predicate}
ORDER BY sku, best_competitor_product_id, attempted_at DESC NULLS LAST, id DESC
LIMIT :limit
""").bindparams(bindparam("statuses", expanding=True))
@@ -633,6 +638,7 @@ def fetch_match_attempt_rescore_rows(
WHERE source = :source
AND attempt_status IN :statuses
{reason_predicate}
{sku_predicate}
)
SELECT *
FROM ranked
@@ -640,6 +646,8 @@ def fetch_match_attempt_rescore_rows(
ORDER BY attempted_at DESC
LIMIT :limit
""").bindparams(bindparam("statuses", expanding=True))
if sku_values:
sql = sql.bindparams(bindparam("skus", expanding=True))
params = {
"source": source,
@@ -648,6 +656,8 @@ def fetch_match_attempt_rescore_rows(
}
if reason_filter:
params["reason_filter"] = f"%{reason_filter}%"
if sku_values:
params["skus"] = sku_values
return [dict(row) for row in conn.execute(sql, params).mappings().all()]
@@ -658,6 +668,7 @@ def build_match_attempt_rescore_audit(
source: str = "pchome",
statuses: Sequence[str] = DEFAULT_RESCAN_STATUSES,
reason_filter: str | None = None,
skus: Sequence[str] | None = None,
limit: int = 100,
min_score: float = MIN_MATCH_SCORE,
sample_limit: int = 20,
@@ -669,6 +680,7 @@ def build_match_attempt_rescore_audit(
source=source,
statuses=statuses,
reason_filter=reason_filter,
skus=skus,
limit=limit,
latest_sku_only=latest_sku_only,
)