This commit is contained in:
daniel.rodrigues 2026-01-16 09:25:43 -03:00
parent 0620fa776d
commit f2e091739c

View File

@ -177,10 +177,13 @@ def process_store_with_retry(store, headers, max_retries=3, retry_delay=5, token
Retorna tupla (lista de dados da loja, needs_token_refresh) Retorna tupla (lista de dados da loja, needs_token_refresh)
needs_token_refresh indica se o token precisa ser renovado needs_token_refresh indica se o token precisa ser renovado
""" """
store_data = []
needs_token_refresh = False needs_token_refresh = False
for attempt in range(max_retries): for attempt in range(max_retries):
# IMPORTANTE: Limpar dados a cada tentativa para evitar duplicação
# caso uma tentativa anterior tenha processado pedidos parcialmente antes de falhar
store_data = []
try: try:
# Primeira chamada para obter totalElements e calcular total de páginas # Primeira chamada para obter totalElements e calcular total de páginas
params = PARAMS_BASE.copy() params = PARAMS_BASE.copy()
@ -457,9 +460,10 @@ BASE_HEADERS = {
# 4) LOOP POR LOJA # 4) LOOP POR LOJA
# =============================== # ===============================
def process_stores(stores_to_process, all_data, base_headers, token): def process_stores(stores_to_process, all_data, base_headers, token, is_retry=False):
""" """
Processa uma lista de lojas e retorna os dados coletados e as lojas que falharam. Processa uma lista de lojas e retorna os dados coletados e as lojas que falharam.
Se is_retry=True, remove dados existentes da loja antes de adicionar novos (evita duplicação).
""" """
failed = [] failed = []
processed_count = 0 processed_count = 0
@ -496,6 +500,15 @@ def process_stores(stores_to_process, all_data, base_headers, token):
base_headers["authorization"] = token base_headers["authorization"] = token
base_headers["x-authorization"] = token base_headers["x-authorization"] = token
# Se é retry e a loja foi processada com sucesso, remove dados antigos dessa loja
# para evitar duplicação (caso tenha coletado dados parciais antes de falhar)
if is_retry and len(store_data) > 0:
old_count = len(all_data)
all_data[:] = [record for record in all_data if record["Loja"] != store]
removed = old_count - len(all_data)
if removed > 0:
print(f" [RETRY] Removidos {removed} registros antigos da loja {store} para evitar duplicação")
# Adicionar dados da loja ao total # Adicionar dados da loja ao total
all_data.extend(store_data) all_data.extend(store_data)
processed_count += 1 processed_count += 1
@ -531,9 +544,9 @@ while failed_stores and retry_round < FAILED_STORES_MAX_RETRIES:
BASE_HEADERS["authorization"] = TOKEN BASE_HEADERS["authorization"] = TOKEN
BASE_HEADERS["x-authorization"] = TOKEN BASE_HEADERS["x-authorization"] = TOKEN
# Tentar processar as lojas que falharam # Tentar processar as lojas que falharam (is_retry=True para evitar duplicação)
stores_to_retry = failed_stores.copy() stores_to_retry = failed_stores.copy()
failed_stores, TOKEN = process_stores(stores_to_retry, all_data, BASE_HEADERS, TOKEN) failed_stores, TOKEN = process_stores(stores_to_retry, all_data, BASE_HEADERS, TOKEN, is_retry=True)
if not failed_stores: if not failed_stores:
print(f"\n[SUCESSO] Todas as lojas foram processadas com sucesso no retry {retry_round}!") print(f"\n[SUCESSO] Todas as lojas foram processadas com sucesso no retry {retry_round}!")
@ -550,6 +563,32 @@ if failed_stores:
# =============================== # ===============================
if all_data: if all_data:
# Remover duplicatas em all_data antes de inserir
# Usa uma chave composta: Loja + Pedido + SKU
print(f"\nVerificando duplicatas em all_data...")
seen = set()
unique_data = []
duplicates_removed = 0
for record in all_data:
# Criar chave única baseada nos campos que identificam um registro
key = (
record.get("Loja", ""),
record.get("Pedido", ""),
record.get("SKU", "")
)
if key not in seen:
seen.add(key)
unique_data.append(record)
else:
duplicates_removed += 1
if duplicates_removed > 0:
print(f"[AVISO] Removidas {duplicates_removed} linhas duplicadas de all_data")
all_data = unique_data
print(f"Total de registros após deduplicação: {len(all_data)}")
print(f"\nConectando ao banco de dados...") print(f"\nConectando ao banco de dados...")
try: try: