| // ============================================================================
|
| // 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));
|
| }
|