refactor: Otimização da query ES e melhorias na UI

Backend:
- Query ES otimizada com boost por tipo de atuação
- Coordenação de área com maior peso (boost 10)
- Aumento do tamanho de busca para 1000 candidatos
- Cache de ranking mantido (TTL 5 min)

Frontend:
- Correção do display do score (pontuacao.pontuacao_total)
- Reorganização dos componentes de pontuação em tabelas
- Aumento do timeout do axios para 3 minutos
- Melhoria visual do Header com badges de pontuação máxima
This commit is contained in:
Frederico Castro
2025-12-09 05:01:32 -03:00
parent 9e6ba459a8
commit d237097913
6 changed files with 375 additions and 43 deletions

View File

@@ -55,7 +55,7 @@ const ConsultorCard = ({ consultor }) => {
</>
)}
<div className="stat">
<div className="score-value">{consultor.pontuacao_total}</div>
<div className="score-value">{pontuacao.pontuacao_total}</div>
<div className="stat-label">Score</div>
</div>
<div className="expand-icon">{expanded ? '▲' : '▼'}</div>

View File

@@ -79,27 +79,72 @@
.criteria-section h4 {
color: var(--accent-2);
font-size: 0.82rem;
margin-bottom: 0.6rem;
font-size: 0.85rem;
margin-bottom: 0.25rem;
letter-spacing: 0.4px;
display: inline;
}
.criteria-section ul {
list-style: none;
font-size: 0.8rem;
line-height: 1.7;
.max-pts {
display: inline-block;
margin-left: 0.5rem;
padding: 0.15rem 0.5rem;
background: rgba(79,70,229,0.3);
border-radius: 4px;
font-size: 0.7rem;
color: var(--silver);
font-weight: 500;
}
.criteria-table {
width: 100%;
margin-top: 0.6rem;
font-size: 0.75rem;
border-collapse: collapse;
}
.criteria-table th {
text-align: left;
color: var(--silver);
font-weight: 500;
padding: 0.3rem 0.4rem;
border-bottom: 1px solid rgba(255,255,255,0.1);
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.criteria-table td {
padding: 0.35rem 0.4rem;
color: var(--muted);
}
.criteria-section li {
padding: 0.2rem 0;
border-bottom: 1px dashed rgba(255,255,255,0.05);
}
.criteria-section li:last-child {
.criteria-table tr:last-child td {
border-bottom: none;
}
.criteria-table td:first-child {
color: var(--silver);
font-weight: 500;
}
.pts-value {
text-align: right;
color: var(--accent-2) !important;
font-weight: 400 !important;
}
.criteria-note {
margin-top: 0.5rem;
padding-top: 0.4rem;
border-top: 1px dashed rgba(255,255,255,0.1);
font-size: 0.7rem;
color: var(--muted);
text-align: center;
font-style: italic;
}
@media (max-width: 768px) {
.criteria-grid {
grid-template-columns: 1fr;

View File

@@ -20,44 +20,65 @@ const Header = ({ total }) => {
<h3>Componentes de Pontuação</h3>
<div className="criteria-grid">
<div className="criteria-section">
<h4>A - Coordenação CAPES (máx 450 pts)</h4>
<ul>
<li>CA: 200 base + 100 tempo + 100 áreas + 20 retorno + 30 bônus</li>
<li>CAJ: 150 base + 80 tempo + 100 áreas + 20 retorno + 20 bônus</li>
<li>CAJ-MP: 120 base + 60 tempo + 100 áreas + 20 retorno + 15 bônus</li>
<li>CAM: 100 base + 50 tempo + 100 áreas + 20 retorno + 10 bônus</li>
</ul>
<h4>A - Coordenação CAPES</h4>
<span className="max-pts">máx 450 pts</span>
<table className="criteria-table">
<thead>
<tr>
<th>Tipo</th>
<th>Base</th>
<th>Tempo</th>
<th>Bônus</th>
</tr>
</thead>
<tbody>
<tr><td>CA</td><td>200</td><td>até 100</td><td>30</td></tr>
<tr><td>CAJ</td><td>150</td><td>até 80</td><td>20</td></tr>
<tr><td>CAJ-MP</td><td>120</td><td>até 60</td><td>15</td></tr>
<tr><td>CAM</td><td>100</td><td>até 50</td><td>10</td></tr>
</tbody>
</table>
<div className="criteria-note">+ Áreas (até 100) + Retorno (20)</div>
</div>
<div className="criteria-section">
<h4>B - Coordenação Programa PPG (máx 180 pts)</h4>
<ul>
<li>Base: 70 pts</li>
<li>Tempo: 5 pts/ano (máx 50 pts)</li>
<li>Programas extras: 20 pts/programa (máx 40 pts)</li>
<li>Bônus ativo: 20 pts</li>
</ul>
<h4>B - Coordenação PPG</h4>
<span className="max-pts">máx 180 pts</span>
<table className="criteria-table">
<tbody>
<tr><td>Base</td><td className="pts-value">70 pts</td></tr>
<tr><td>Tempo</td><td className="pts-value">5 pts/ano (máx 50)</td></tr>
<tr><td>Programas extras</td><td className="pts-value">20 pts/prog (máx 40)</td></tr>
<tr><td>Bônus ativo</td><td className="pts-value">20 pts</td></tr>
</tbody>
</table>
</div>
<div className="criteria-section">
<h4>C - Consultoria (máx 230 pts)</h4>
<ul>
<li>Ativo: 150 pts base | Histórico: 100 pts base</li>
<li>Tempo: 5 pts/ano (máx 50 pts)</li>
<li>Eventos: 2 pts/evento (máx 20 pts)</li>
<li>Responsável: 5 pts/vez (máx 25 pts)</li>
<li>Áreas extras: 10 pts/área (máx 30 pts)</li>
</ul>
<h4>C - Consultoria</h4>
<span className="max-pts">máx 230 pts</span>
<table className="criteria-table">
<tbody>
<tr><td>Base (ativo)</td><td className="pts-value">150 pts</td></tr>
<tr><td>Base (histórico)</td><td className="pts-value">100 pts</td></tr>
<tr><td>Tempo</td><td className="pts-value">5 pts/ano (máx 50)</td></tr>
<tr><td>Eventos</td><td className="pts-value">2 pts/ev (máx 20)</td></tr>
<tr><td>Responsável</td><td className="pts-value">5 pts/vez (máx 25)</td></tr>
<tr><td>Áreas extras</td><td className="pts-value">10 pts/área (máx 30)</td></tr>
</tbody>
</table>
</div>
<div className="criteria-section">
<h4>D - Premiações (máx 180 pts)</h4>
<ul>
<li>Premiação: 60 pts</li>
<li>Avaliação: 40 pts</li>
<li>Inscrição: 20 pts</li>
<li>Total máximo: 180 pts</li>
</ul>
<h4>D - Premiações</h4>
<span className="max-pts">máx 180 pts</span>
<table className="criteria-table">
<tbody>
<tr><td>Premiação</td><td className="pts-value">60 pts</td></tr>
<tr><td>Avaliação</td><td className="pts-value">40 pts</td></tr>
<tr><td>Inscrição</td><td className="pts-value">20 pts</td></tr>
</tbody>
</table>
</div>
</div>
</div>