diff --git a/src/sgp/api.js b/src/sgp/api.js index 3bb3475..4a32efe 100644 --- a/src/sgp/api.js +++ b/src/sgp/api.js @@ -247,7 +247,7 @@ class SgpAPI { id_olt_sgp: onu.olt_id, pon: onu.pon !== undefined ? `${onu.slot ?? ''}/${onu.pon}` : '', perfil: '', - serial: onu.serial || '', + serial: onu.serial || onu.phy_addr || onu.addr || onu.serial_onu || srv.serial || '', serviceport: '', ultimo_rx_power: onu.rx || '', ultimo_tx_power: onu.tx || '', @@ -325,10 +325,50 @@ class SgpAPI { const clientes = await this._listarClientes(credentials, { cliente_id: id }); const dados = []; clientes.forEach(c => dados.push(...this._mapServicos({ ...c, id: this._clienteId(c) ?? id }))); + await this._completarDadosOnu(credentials, dados); return { dados }; }); } + /** + * Lista de ONUs do SGP (cache curto). Cada item traz phy_addr (serial), + * login do serviço e contrato vinculado. + */ + async _listarOnus(credentials) { + if (this.onuCache && Date.now() - this.onuCache.at < 5 * 60 * 1000) return this.onuCache.lista; + const lista = await this._request(credentials, 'GET', '/api/fttx/onu/list/'); + const arr = Array.isArray(lista) ? lista : (lista.onus || lista.result || []); + this.onuCache = { at: Date.now(), lista: arr }; + return arr; + } + + /** + * Quando o cadastro do cliente não traz o serial da ONU, busca na lista de + * ONUs do SGP pelo contrato ou pelo login do serviço. + */ + async _completarDadosOnu(credentials, servicos) { + const faltando = servicos.filter(s => !s.serial); + if (!faltando.length) return; + try { + const onus = await this._listarOnus(credentials); + faltando.forEach(srv => { + const onu = onus.find(o => + (o.service_contrato !== undefined && String(o.service_contrato) === String(srv.id_servico)) || + (srv.login && o.login && String(o.login).toLowerCase() === String(srv.login).toLowerCase())); + if (!onu) return; + srv.serial = onu.phy_addr || ''; + if (onu.olt_name && !srv.base) srv.base = onu.olt_name; + if (onu.olt_id !== undefined && !srv.id_ap) { + srv.id_ap = this._idApLegado({ olt_id: onu.olt_id, olt_nome: onu.olt_name }); + srv.id_olt_sgp = onu.olt_id; + } + if (!srv.pon && onu.pon !== undefined) srv.pon = `${onu.slot ?? ''}/${onu.pon}`; + }); + } catch (error) { + logger.warn('SGP: não foi possível completar dados da ONU', { error: error.message }); + } + } + async obterDadosCompletosCliente(idCliente, location = '', credentials) { const instance = this.getInstanceByLocation(); try { diff --git a/src/ssh/manager.js b/src/ssh/manager.js index da3e603..84f3e60 100644 --- a/src/ssh/manager.js +++ b/src/ssh/manager.js @@ -38,7 +38,7 @@ class SSHManager { // Concentrador Juniper - Pedro Afonso const juniperPedroAfonso = { name: 'Concentrador Juniper Pedro Afonso', - host: process.env.JUNIPER_PEDRO_AFONSO_HOST || '45.189.140.2', + host: process.env.JUNIPER_PEDRO_AFONSO_HOST || '192.168.100.10', username: process.env.JUNIPER_PEDRO_AFONSO_USER || 'rodrigo', password: process.env.JUNIPER_PEDRO_AFONSO_PASS || '', port: 22,