// ============================================================================ // SUBSTITUA a função fetchAlimentadorFromAPI no seu ra-tables.js // ============================================================================ async function fetchAlimentadorFromAPI(refalm) { const API_URL = 'http://gdis-apoio:80/gdis-do-web/services/getRedeAlimentador'; // Extrair credenciais do .env const userName = process.env.GDIS_USER || process.env.NP; const cookiesStr = process.env.GDIS_COOKIES || '[]'; const cookies = JSON.parse(cookiesStr); const jsessionid = cookies.find(c => c.name === 'JSESSIONID')?.value; if (!jsessionid || !userName) { throw new Error('[API] Credenciais não encontradas no .env'); } // ======================================== // PREPARAR VARIAÇÕES DO REFALM // ======================================== const refalmOriginal = String(refalm).trim(); const variacoes = [refalmOriginal]; // Se não tem espaço, criar variação COM espaço if (!refalmOriginal.includes(' ')) { const match = refalmOriginal.match(/^([A-Z]+)(\d+)$/); if (match) { const [, letras, numeros] = match; const refalmComEspaco = `${letras} ${numeros}`; variacoes.push(refalmComEspaco); } } // Se tem espaço, criar variação SEM espaço else { const refalmSemEspaco = refalmOriginal.replace(/\s+/g, ''); variacoes.push(refalmSemEspaco); } if (variacoes.length > 1) { console.log(`[API] Variações preparadas: "${variacoes[0]}" e "${variacoes[1]}"`); } const delays = [3000, 5000, 10000]; // Delays para retries // ======================================== // FUNÇÃO AUXILIAR: TENTAR UMA VARIAÇÃO // ======================================== const tentarVariacao = async (refalmAtual, tentativaInicial) => { for (let attempt = 0; attempt <= delays.length; attempt++) { try { const numTentativa = tentativaInicial + attempt; console.log(`[API] Tentativa ${numTentativa} para "${refalmAtual}"`); const params = { alim: refalmAtual, ambiente: 'operacao', userName: userName, sessionId: jsessionid, salt: Date.now().toString() }; const response = await axios.post(API_URL, qs.stringify(params), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, timeout: 15000 }); // Validar resposta const responseData = response.data; if (!responseData || (typeof responseData === 'string' && responseData.trim() === '') || (typeof responseData === 'string' && responseData.trim() === '{}')) { throw new Error('Resposta vazia da API'); } // Parsear JSON let data; try { data = typeof responseData === 'object' ? responseData : JSON.parse(responseData); } catch (parseError) { throw new Error(`JSON inválido: ${parseError.message}`); } // Validar dados de rede if (!data.nos || !Array.isArray(data.nos) || data.nos.length === 0) { throw new Error('JSON sem dados de rede (nos vazio)'); } console.log(`[API] Sucesso com "${refalmAtual}" (${data.nos.length} nós)`); return { sucesso: true, data }; } catch (error) { const isLastAttempt = attempt === delays.length; if (isLastAttempt) { console.warn(`[API] "${refalmAtual}" falhou após ${attempt + 1} tentativas: ${error.message}`); return { sucesso: false, erro: error }; } const delay = delays[attempt]; console.warn(`[API] Tentativa ${numTentativa} falhou, aguardando ${delay}ms...`); await sleep(delay); } } }; // ======================================== // TENTAR VARIAÇÕES SEQUENCIALMENTE // ======================================== let tentativaAtual = 1; for (const variacao of variacoes) { const resultado = await tentarVariacao(variacao, tentativaAtual); if (resultado.sucesso) { return resultado.data; } tentativaAtual += delays.length + 1; // Incrementar contador de tentativas // Se falhou e tem mais variações, avisa e tenta próxima if (variacoes.indexOf(variacao) < variacoes.length - 1) { const proximaVariacao = variacoes[variacoes.indexOf(variacao) + 1]; console.log(`[API] Tentando variação alternativa: "${proximaVariacao}"`); } } // Se todas falharam console.error(`[API] Todas as variações falharam para ${refalmOriginal}`); throw new Error(`Todas as tentativas falharam para ${refalmOriginal}`); } // Função auxiliar sleep (se ainda não existir) function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }