From 1d2c8926334bcc72dc35f9cb46c244c65e192f8f Mon Sep 17 00:00:00 2001 From: feliperm17 Date: Sat, 11 Jul 2026 14:25:48 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20corrige=20relat=C3=B3rios=20de=20tombos?= =?UTF-8?q?=20por=20cidade=20e=20diagn=C3=B3stico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/TableCollapseParaCidades.jsx | 107 ++++++++++++------ .../RelatorioCoordenadaForaPoligonoScreen.jsx | 8 +- 2 files changed, 77 insertions(+), 38 deletions(-) diff --git a/src/components/TableCollapseParaCidades.jsx b/src/components/TableCollapseParaCidades.jsx index 4f3b01a..d48a036 100644 --- a/src/components/TableCollapseParaCidades.jsx +++ b/src/components/TableCollapseParaCidades.jsx @@ -1,4 +1,4 @@ -import { Collapse, Skeleton, Table } from 'antd' +import { Collapse, Skeleton, Table, Tag } from 'antd' import converteDecimalParaGrausMinutosSegundos from '@/helpers/conversoes/Coordenadas' @@ -126,41 +126,80 @@ const TableCollapseParaCidades = ({ data, loading, showCoordenadas }) => { 'VII', 'VIII', 'IX', 'X', 'XI', 'XII' ] + const montaDataSource = registros => registros.map(registro => { + let dataColeta = '' + if (registro.data_coleta_dia !== null && registro.data_coleta_dia !== undefined) { + dataColeta = String(registro.data_coleta_dia).padStart(2, '0') + } + if (registro.data_coleta_mes !== null && registro.data_coleta_mes !== undefined) { + if (dataColeta) dataColeta += '/' + dataColeta += mesesRomanos[registro.data_coleta_mes - 1] + } + if (registro.data_coleta_ano !== null && registro.data_coleta_ano !== undefined) { + if (dataColeta) dataColeta += '/' + dataColeta += registro.data_coleta_ano + } + return { + ...registro, + key: registro.hcf, + latitude: registro.latitude ? converteDecimalParaGrausMinutosSegundos(registro.latitude, false, true) : null, + longitude: registro.longitude ? converteDecimalParaGrausMinutosSegundos(registro.longitude, false, true) : null, + datacoleta: dataColeta, + familia: registro?.familia?.nome || '-', + especie: ((registro?.genero?.nome || '') + ' ' + (registro?.especy?.nome || registro?.especie?.nome || '')).trim() || '-', + autor: registro?.especy?.autor?.nome || registro?.especie?.autor?.nome || '' + } + }) + + // agrupa a lista plana de cidades por estado + const estadosMap = {} + data.forEach(item => { + const estadoNome = item.estado || 'Desconhecido' + if (!estadosMap[estadoNome]) { + estadosMap[estadoNome] = { + estado: estadoNome, + sigla: item.estadoSigla || getSiglaEstado(estadoNome), + cidades: [] + } + } + estadosMap[estadoNome].cidades.push(item) + }) + + // ordena estados em ordem alfabética e, dentro de cada estado, as cidades em ordem alfabética + const estados = Object.values(estadosMap) + .sort((a, b) => a.estado.localeCompare(b.estado, 'pt-BR')) + .map(estado => ({ + ...estado, + cidades: [...estado.cidades].sort((a, b) => (a.municipio || '').localeCompare(b.municipio || '', 'pt-BR')) + })) + return ( - {data.map(item => ( - - { - let dataColeta = '' - if (registro.data_coleta_dia !== null && registro.data_coleta_dia !== undefined) { - dataColeta = String(registro.data_coleta_dia).padStart(2, '0') - } - if (registro.data_coleta_mes !== null && registro.data_coleta_mes !== undefined) { - if (dataColeta) dataColeta += '/' - dataColeta += mesesRomanos[registro.data_coleta_mes - 1] - } - if (registro.data_coleta_ano !== null && registro.data_coleta_ano !== undefined) { - if (dataColeta) dataColeta += '/' - dataColeta += registro.data_coleta_ano - } - return { - ...registro, - latitude: registro.latitude ? converteDecimalParaGrausMinutosSegundos(registro.latitude, false, true) : null, - longitude: registro.longitude ? converteDecimalParaGrausMinutosSegundos(registro.longitude, false, true) : null, - datacoleta: dataColeta, - familia: registro?.familia?.nome || '-', - especie: ((registro?.genero?.nome || '') + ' ' + (registro?.especy?.nome || registro?.especie?.nome || '')).trim() || '-', - autor: registro?.especy?.autor?.nome || registro?.especie?.autor?.nome || '' - } - })} - columns={showCoordenadas ? columnsWithCoordenadas : columnsWithoutCoordenadas} - /> - - ))} + {estados.map(estado => { + const totalTombos = estado.cidades.reduce((acc, c) => acc + (c.registros?.length || 0), 0) + return ( + {`${totalTombos} tombo(s)`}} + > + + {estado.cidades.map(item => ( + {`${item.registros?.length || 0} tombo(s)`}} + > +
+ + ))} + + + ) + })} ) } diff --git a/src/pages/RelatorioCoordenadaForaPoligonoScreen.jsx b/src/pages/RelatorioCoordenadaForaPoligonoScreen.jsx index 8d6d2db..e6e38d3 100644 --- a/src/pages/RelatorioCoordenadaForaPoligonoScreen.jsx +++ b/src/pages/RelatorioCoordenadaForaPoligonoScreen.jsx @@ -35,7 +35,7 @@ class RelatorioCoordenadaForaPoligonoScreen extends Component { } componentDidMount() { - this.requisitaDadosDoRelatorio() + // não carregar automaticamente - aguardar o usuário clicar em Pesquisar this.requisitaPaises() } @@ -349,9 +349,9 @@ class RelatorioCoordenadaForaPoligonoScreen extends Component { estadoId: null, cidadeId: null, estados: [], - cidades: [] - }, () => { - this.requisitaDadosDoRelatorio() + cidades: [], + dados: [], + metadados: {} }) }} className="login-form-button"