diff --git a/Pedidos_mar.py b/Pedidos_mar.py index 8d541a0..d52f535 100644 --- a/Pedidos_mar.py +++ b/Pedidos_mar.py @@ -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) needs_token_refresh indica se o token precisa ser renovado """ - store_data = [] needs_token_refresh = False 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: # Primeira chamada para obter totalElements e calcular total de páginas params = PARAMS_BASE.copy() @@ -457,9 +460,10 @@ BASE_HEADERS = { # 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. + Se is_retry=True, remove dados existentes da loja antes de adicionar novos (evita duplicação). """ failed = [] processed_count = 0 @@ -496,6 +500,15 @@ def process_stores(stores_to_process, all_data, base_headers, token): base_headers["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 all_data.extend(store_data) processed_count += 1 @@ -531,9 +544,9 @@ while failed_stores and retry_round < FAILED_STORES_MAX_RETRIES: BASE_HEADERS["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() - 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: 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: + # 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...") try: