feat: adicionar sistema de sugestao de consultores por tema

- Novo endpoint GET /api/v1/consultores/sugerir com busca por tema
- Busca inteligente em areas de avaliacao, conhecimento e pesquisa
- Filtro por consultores ativos e area de avaliacao especifica
- Endpoint GET /api/v1/consultores/areas-avaliacao com lista de areas
- Novo componente SugerirConsultores no frontend
- Botao 'Sugerir por Tema' integrado na interface principal
- Score de match baseado em relevancia do tema e experiencia
This commit is contained in:
Frederico Castro
2025-12-20 07:35:03 -03:00
parent f7557831eb
commit 45ab7412fe
8 changed files with 917 additions and 0 deletions

View File

@@ -3,6 +3,7 @@ import Header from './components/Header';
import ConsultorCard from './components/ConsultorCard';
import CompararModal from './components/CompararModal';
import FiltroSelos from './components/FiltroSelos';
import SugerirConsultores from './components/SugerirConsultores';
import { rankingService } from './services/api';
import './App.css';
@@ -23,6 +24,7 @@ function App() {
const [selecionados, setSelecionados] = useState([]);
const [modalAberto, setModalAberto] = useState(false);
const [filtroSelos, setFiltroSelos] = useState([]);
const [sugerirAberto, setSugerirAberto] = useState(false);
const toggleSelecionado = (consultor) => {
setSelecionados((prev) => {
@@ -42,6 +44,21 @@ function App() {
setModalAberto(false);
};
const handleSugestaoSelecionada = async (idPessoa) => {
try {
const resultados = await rankingService.searchConsultor(String(idPessoa), 1);
if (resultados && resultados.length > 0) {
const alvo = resultados[0];
const pos = alvo.posicao || 1;
const pagina = Math.ceil(pos / pageSize);
setHighlightId(alvo.id_pessoa);
setPage(pagina);
}
} catch (err) {
console.error('Erro ao navegar para consultor:', err);
}
};
useEffect(() => {
loadRanking();
}, [page, pageSize, filtroSelos]);
@@ -198,6 +215,10 @@ function App() {
onChange={(selos) => { setFiltroSelos(selos); setPage(1); }}
/>
<button className="btn-sugerir" onClick={() => setSugerirAberto(true)}>
Sugerir por Tema
</button>
<form className="search-box" onSubmit={handleSubmitBuscar}>
<input
type="text"
@@ -260,6 +281,13 @@ function App() {
/>
)}
{sugerirAberto && (
<SugerirConsultores
onClose={() => setSugerirAberto(false)}
onSelectConsultor={handleSugestaoSelecionada}
/>
)}
<footer>
<p>Dados: ATUACAPES (Elasticsearch) + Oracle</p>
<p>Clique em qualquer consultor para ver detalhes</p>