New paste Repaste Download
// ============================================================================
// 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));
}
Filename: None. Size: 5kb. View raw, , hex, or download this file.

This paste expires on 2025-10-29 20:10:04.095619. Pasted through web.