mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-23 15:08:12 +02:00
fix: ranking bulk match by codein AND gencod/gtin, add entry key logging
The bulk ranking response (GET /api/ranking?limit=30000) may use 'gencod' instead of 'codein' as the article identifier. Added: - gtin→codein lookup map built from article gtin fields - Match entries by entry.codein first, then by entry.gencod→article.gtin - Diagnostic logging of the first entry's keys and values to identify the correct identifier field in the API response - Increased fallback per-article batchSize from 20 to 50 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
1cd3ade77e
commit
383b8ccac7
1 file changed
+16
-6
@@ -508,9 +508,13 @@ export async function getRankingByArticles(
|
|||||||
if (articles.length === 0) return { rankings, totalRankedProducts: 0 };
|
if (articles.length === 0) return { rankings, totalRankedProducts: 0 };
|
||||||
|
|
||||||
const articleCodeins = new Set(articles.map(a => a.codein));
|
const articleCodeins = new Set(articles.map(a => a.codein));
|
||||||
|
// Map gtin → codein pour matcher par gencod si le bulk response utilise gencod
|
||||||
|
const gtinToCodein = new Map<string, string>();
|
||||||
|
for (const a of articles) {
|
||||||
|
if (a.gtin) gtinToCodein.set(a.gtin, a.codein);
|
||||||
|
}
|
||||||
|
|
||||||
// Stratégie : télécharger tout le classement réseau en 1 appel, puis matcher par codein
|
// Stratégie : télécharger tout le classement réseau en 1 appel, puis matcher par codein ou gencod
|
||||||
// Le nombre d'articles retournés = totalRankedProducts réel
|
|
||||||
const RANKING_FULL_LIMIT = 30000;
|
const RANKING_FULL_LIMIT = 30000;
|
||||||
try {
|
try {
|
||||||
const url = `${FF_API_BASE}/api/ranking?limit=${RANKING_FULL_LIMIT}`;
|
const url = `${FF_API_BASE}/api/ranking?limit=${RANKING_FULL_LIMIT}`;
|
||||||
@@ -519,10 +523,16 @@ export async function getRankingByArticles(
|
|||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
const rankingList: Record<string, string | null>[] = data?.ranking ?? [];
|
const rankingList: Record<string, string | null>[] = data?.ranking ?? [];
|
||||||
const totalRankedProducts = rankingList.length;
|
const totalRankedProducts = rankingList.length;
|
||||||
console.log(`[api-ff] Ranking full fetch: ${rankingList.length} produits classés dans le réseau`);
|
console.log(`[api-ff] Ranking full fetch: ${rankingList.length} entrées`);
|
||||||
|
if (rankingList.length > 0) {
|
||||||
|
console.log(`[api-ff] Ranking entry keys: ${Object.keys(rankingList[0]).join(",")}`);
|
||||||
|
console.log(`[api-ff] Ranking entry sample: ${JSON.stringify(rankingList[0])}`);
|
||||||
|
}
|
||||||
|
|
||||||
for (const entry of rankingList) {
|
for (const entry of rankingList) {
|
||||||
const codein = entry.codein;
|
// Essaie de trouver le codein via codein direct OU via gencod→gtin→codein
|
||||||
|
let codein = entry.codein ?? null;
|
||||||
|
if (!codein && entry.gencod) codein = gtinToCodein.get(entry.gencod) ?? null;
|
||||||
if (!codein || !articleCodeins.has(codein)) continue;
|
if (!codein || !articleCodeins.has(codein)) continue;
|
||||||
rankings.set(codein, {
|
rankings.set(codein, {
|
||||||
ranking_ca: parseRankNum(entry.ranking_ca),
|
ranking_ca: parseRankNum(entry.ranking_ca),
|
||||||
@@ -535,7 +545,7 @@ export async function getRankingByArticles(
|
|||||||
pv_cen: parseRankNum(entry.pv_cen),
|
pv_cen: parseRankNum(entry.pv_cen),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
console.log(`[api-ff] Ranking: ${rankings.size}/${articles.length} articles du fournisseur classés`);
|
console.log(`[api-ff] Ranking: ${rankings.size}/${articles.length} articles classés`);
|
||||||
return { rankings, totalRankedProducts };
|
return { rankings, totalRankedProducts };
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@@ -543,7 +553,7 @@ export async function getRankingByArticles(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fallback : 1 appel par article
|
// Fallback : 1 appel par article
|
||||||
const batchSize = 20;
|
const batchSize = 50;
|
||||||
for (let i = 0; i < articles.length; i += batchSize) {
|
for (let i = 0; i < articles.length; i += batchSize) {
|
||||||
const batch = articles.slice(i, i + batchSize);
|
const batch = articles.slice(i, i + batchSize);
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
|
|||||||
Reference in new issue
Block a user