Ajuste de peso apontado real e base soldavel nos cards do relatorio

This commit is contained in:
2026-09-22 11:37:45 +00:00
parent 3a3e230ce7
commit f4a15ef751
2 changed files with 80 additions and 23 deletions
@@ -26,18 +26,37 @@ export const RelatorioPecasProcessoModal: React.FC<RelatorioPecasProcessoModalPr
const { dashboardData } = useDashboardProducaoOtimizado(selectedOF); const { dashboardData } = useDashboardProducaoOtimizado(selectedOF);
// Filtrar peças por fase selecionada // Filtrar peças por fase selecionada
const pecasFiltradas = selectedFase === 'todas' const pecasFiltradas = useMemo(() => {
? pecasComStatus return selectedFase === 'todas'
: pecasComStatus.filter(peca => peca.etapa_fase === selectedFase); ? pecasComStatus
: pecasComStatus.filter(peca => peca.etapa_fase === selectedFase);
}, [selectedFase, pecasComStatus]);
// Recalcular estatísticas para as peças filtradas // Recalcular estatísticas para as peças filtradas com o peso real apontado
const estatisticasFiltradas = { const estatisticasFiltradas = useMemo(() => {
totalPecas: pecasFiltradas.length, if (selectedFase === 'todas' && dashboardData?.processos && dashboardData.processos.length > 0) {
pesoTotalCorte: pecasFiltradas.filter(p => p.processos.corte).reduce((sum, p) => sum + p.peso_total, 0), const pCorte = dashboardData.processos.find(p => p.nome.toLowerCase().includes('corte'));
pesoTotalSolda: pecasFiltradas.filter(p => p.processos.solda).reduce((sum, p) => sum + p.peso_total, 0), const pSolda = dashboardData.processos.find(p => p.nome.toLowerCase().includes('solda'));
pesoTotalPintura: pecasFiltradas.filter(p => p.processos.pintura).reduce((sum, p) => sum + p.peso_total, 0), const pPintura = dashboardData.processos.find(p => p.nome.toLowerCase().includes('pint') || p.nome.toLowerCase().includes('galv'));
pesoTotalExpedicao: pecasFiltradas.filter(p => p.processos.expedicao).reduce((sum, p) => sum + p.peso_total, 0) const pExp = dashboardData.processos.find(p => p.nome.toLowerCase().includes('exped'));
};
return {
totalPecas: pecasFiltradas.length,
pesoTotalCorte: pCorte?.pesoFabricado ?? pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.corte || 0), 0),
pesoTotalSolda: pSolda?.pesoFabricado ?? pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.solda || 0), 0),
pesoTotalPintura: pPintura?.pesoFabricado ?? pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.pintura || 0), 0),
pesoTotalExpedicao: pExp?.pesoFabricado ?? pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.expedicao || 0), 0)
};
}
return {
totalPecas: pecasFiltradas.length,
pesoTotalCorte: pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.corte || 0), 0),
pesoTotalSolda: pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.solda || 0), 0),
pesoTotalPintura: pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.pintura || 0), 0),
pesoTotalExpedicao: pecasFiltradas.reduce((sum, p) => sum + (p.pesoApontado?.expedicao || 0), 0)
};
}, [selectedFase, dashboardData, pecasFiltradas]);
// Calcular percentual de progresso conforme índices da tela de Dashboard de Produção // Calcular percentual de progresso conforme índices da tela de Dashboard de Produção
const percentuais = useMemo(() => { const percentuais = useMemo(() => {
+50 -12
View File
@@ -24,6 +24,12 @@ export interface PecaComStatus {
pintura?: string | null; pintura?: string | null;
expedicao?: string | null; expedicao?: string | null;
}; };
pesoApontado?: {
corte: number;
solda: number;
pintura: number;
expedicao: number;
};
} }
export interface ResumoProcesso { export interface ResumoProcesso {
@@ -154,9 +160,12 @@ export const useRelatorioPecasProcesso = (ofNumber: string) => {
console.log('Apontamentos encontrados:', apontamentosData.length); console.log('Apontamentos encontrados:', apontamentosData.length);
// Mapear status dos processos por peça e guardar a ÚLTIMA data apontada de cada processo // Mapear status dos processos por peça, guardar a ÚLTIMA data apontada e o PESO APONTADO REAL de cada processo
const statusPorPeca = new Map<string, Set<string>>(); const statusPorPeca = new Map<string, Set<string>>();
const datasPorPeca = new Map<string, { corte: string; solda: string; pintura: string; expedicao: string }>(); const datasPorPeca = new Map<string, { corte: string; solda: string; pintura: string; expedicao: string }>();
const pesosPorPeca = new Map<string, { corte: number; solda: number; pintura: number; expedicao: number }>();
const mapaPecas = new Map(pecasData.map(p => [p.id, p]));
apontamentosData.forEach(apt => { apontamentosData.forEach(apt => {
if (!statusPorPeca.has(apt.peca_id)) { if (!statusPorPeca.has(apt.peca_id)) {
@@ -168,20 +177,33 @@ export const useRelatorioPecasProcesso = (ofNumber: string) => {
if (!datasPorPeca.has(apt.peca_id)) { if (!datasPorPeca.has(apt.peca_id)) {
datasPorPeca.set(apt.peca_id, { corte: '', solda: '', pintura: '', expedicao: '' }); datasPorPeca.set(apt.peca_id, { corte: '', solda: '', pintura: '', expedicao: '' });
} }
if (!pesosPorPeca.has(apt.peca_id)) {
pesosPorPeca.set(apt.peca_id, { corte: 0, solda: 0, pintura: 0, expedicao: 0 });
}
const datas = datasPorPeca.get(apt.peca_id)!; const datas = datasPorPeca.get(apt.peca_id)!;
const pesos = pesosPorPeca.get(apt.peca_id)!;
const pecaInfo = mapaPecas.get(apt.peca_id);
const pesoUnitario = Number(pecaInfo?.peso_unitario || 0);
const qtdApontada = Number(apt.quantidade_produzida || 0);
const pesoCalculado = pesoUnitario * qtdApontada;
const dataApt = apt.data_apontamento || apt.created_at || ''; const dataApt = apt.data_apontamento || apt.created_at || '';
const nomeLower = nomeProc.toLowerCase(); const nomeLower = nomeProc.toLowerCase();
if (dataApt) { if (nomeLower.includes('corte')) {
if (nomeLower.includes('corte')) { pesos.corte += pesoCalculado;
if (!datas.corte || dataApt > datas.corte) datas.corte = dataApt; if (dataApt && (!datas.corte || dataApt > datas.corte)) datas.corte = dataApt;
} else if (nomeLower.includes('solda')) { } else if (nomeLower.includes('solda')) {
if (!datas.solda || dataApt > datas.solda) datas.solda = dataApt; pesos.solda += pesoCalculado;
} else if (nomeLower.includes('pint') || nomeLower.includes('galv')) { if (dataApt && (!datas.solda || dataApt > datas.solda)) datas.solda = dataApt;
if (!datas.pintura || dataApt > datas.pintura) datas.pintura = dataApt; } else if (nomeLower.includes('pint') || nomeLower.includes('galv')) {
} else if (nomeLower.includes('exped')) { pesos.pintura += pesoCalculado;
if (!datas.expedicao || dataApt > datas.expedicao) datas.expedicao = dataApt; if (dataApt && (!datas.pintura || dataApt > datas.pintura)) datas.pintura = dataApt;
} } else if (nomeLower.includes('exped')) {
pesos.expedicao += pesoCalculado;
if (dataApt && (!datas.expedicao || dataApt > datas.expedicao)) datas.expedicao = dataApt;
} }
}); });
@@ -197,7 +219,16 @@ export const useRelatorioPecasProcesso = (ofNumber: string) => {
if (!datasPorPeca.has(pecaAlvo.id)) { if (!datasPorPeca.has(pecaAlvo.id)) {
datasPorPeca.set(pecaAlvo.id, { corte: '', solda: '', pintura: '', expedicao: '' }); datasPorPeca.set(pecaAlvo.id, { corte: '', solda: '', pintura: '', expedicao: '' });
} }
if (!pesosPorPeca.has(pecaAlvo.id)) {
pesosPorPeca.set(pecaAlvo.id, { corte: 0, solda: 0, pintura: 0, expedicao: 0 });
}
const datas = datasPorPeca.get(pecaAlvo.id)!; const datas = datasPorPeca.get(pecaAlvo.id)!;
const pesos = pesosPorPeca.get(pecaAlvo.id)!;
const pesoUnitario = Number(pecaAlvo.peso_unitario || 0);
const qtdExp = Number(item.quantidade_expedida || 0);
pesos.expedicao += pesoUnitario * qtdExp;
const dataExp = item.romaneios_expedicao?.data_saida || const dataExp = item.romaneios_expedicao?.data_saida ||
item.romaneios_expedicao?.data_emissao || item.romaneios_expedicao?.data_emissao ||
item.romaneios_expedicao?.created_at || item.romaneios_expedicao?.created_at ||
@@ -208,10 +239,11 @@ export const useRelatorioPecasProcesso = (ofNumber: string) => {
} }
}); });
// Construir array de peças com status e última data apontada // Construir array de peças com status, última data apontada e peso apontado
const pecasComStatusFormatadas: PecaComStatus[] = pecasData.map(peca => { const pecasComStatusFormatadas: PecaComStatus[] = pecasData.map(peca => {
const processosRealizados = statusPorPeca.get(peca.id) || new Set(); const processosRealizados = statusPorPeca.get(peca.id) || new Set();
const datas = datasPorPeca.get(peca.id) || { corte: '', solda: '', pintura: '', expedicao: '' }; const datas = datasPorPeca.get(peca.id) || { corte: '', solda: '', pintura: '', expedicao: '' };
const pesos = pesosPorPeca.get(peca.id) || { corte: 0, solda: 0, pintura: 0, expedicao: 0 };
return { return {
id: peca.id, id: peca.id,
@@ -235,6 +267,12 @@ export const useRelatorioPecasProcesso = (ofNumber: string) => {
solda: formatarDiaMes(datas.solda), solda: formatarDiaMes(datas.solda),
pintura: formatarDiaMes(datas.pintura), pintura: formatarDiaMes(datas.pintura),
expedicao: formatarDiaMes(datas.expedicao) expedicao: formatarDiaMes(datas.expedicao)
},
pesoApontado: {
corte: Number(pesos.corte.toFixed(2)),
solda: Number(pesos.solda.toFixed(2)),
pintura: Number(pesos.pintura.toFixed(2)),
expedicao: Number(pesos.expedicao.toFixed(2))
} }
}; };
}); });