feat: defasagem configuravel entre corte e solda no cronograma e dashboard de producao

This commit is contained in:
2026-09-09 18:04:27 +00:00
parent bd429856a6
commit aa457ffa0c
4 changed files with 64 additions and 0 deletions
@@ -49,6 +49,7 @@ export const CronogramaForm: React.FC<CronogramaFormProps> = ({ cronograma, onCl
of_id: '',
gestor_id: '',
revisao: 1,
defasagem_solda: 10,
processos: processosDefault.map((nome, index) => ({
nome_processo: nome,
data_inicio: '',
@@ -75,6 +76,7 @@ export const CronogramaForm: React.FC<CronogramaFormProps> = ({ cronograma, onCl
of_id: cronograma.of_id,
gestor_id: cronograma.gestor_id,
revisao: cronograma.revisao,
defasagem_solda: cronograma.defasagem_solda !== undefined ? Number(cronograma.defasagem_solda) : 10,
processos: cronograma.processos.length > 0 ? cronograma.processos.map(p => ({
id: p.id,
nome_processo: p.nome_processo,
@@ -134,6 +136,7 @@ export const CronogramaForm: React.FC<CronogramaFormProps> = ({ cronograma, onCl
of_id: ofId,
gestor_id: cronogramaExistente.gestor_id,
revisao: cronogramaExistente.revisao,
defasagem_solda: cronogramaExistente.defasagem_solda !== undefined ? Number(cronogramaExistente.defasagem_solda) : 10,
processos: cronogramaExistente.processos.length > 0 ? cronogramaExistente.processos.map(p => ({
id: p.id,
nome_processo: p.nome_processo,
@@ -154,6 +157,7 @@ export const CronogramaForm: React.FC<CronogramaFormProps> = ({ cronograma, onCl
...prev,
gestor_id: '',
revisao: 1,
defasagem_solda: 10,
processos: processosDefault.map((nome, index) => ({
nome_processo: nome,
data_inicio: '',
@@ -413,6 +417,38 @@ export const CronogramaForm: React.FC<CronogramaFormProps> = ({ cronograma, onCl
/>
</div>
</div>
{/* Defasagem entre Corte e Solda - Exclusivo para o processo de Fabricação */}
{(processo.nome_processo.toLowerCase().includes('fabricação') ||
processo.nome_processo.toLowerCase().includes('fabricacao')) && (
<div className="mt-3 pt-3 border-t border-slate-100 dark:border-slate-800 flex flex-wrap items-center justify-between gap-3 bg-slate-50/80 dark:bg-slate-900/50 p-2.5 rounded-lg border border-slate-200/60 dark:border-slate-800">
<div className="flex items-center gap-1.5">
<span className="text-xs font-bold text-slate-700 dark:text-slate-200 uppercase tracking-wide">
DEFASAGEM ENTRE CORTE E SOLDA:
</span>
<span className="text-[11px] text-slate-500 dark:text-slate-400 hidden sm:inline">
(espera inicial da solda)
</span>
</div>
<div className="flex items-center gap-1.5">
<Input
type="number"
min={0}
max={100}
value={formData.defasagem_solda}
onChange={(e) => {
const val = Number(e.target.value);
setFormData(prev => ({
...prev,
defasagem_solda: isNaN(val) ? 0 : Math.max(0, Math.min(100, val))
}));
}}
className="w-20 h-8 text-xs font-bold text-center bg-white dark:bg-slate-950 border-slate-300 dark:border-slate-700"
/>
<span className="text-xs font-bold text-slate-600 dark:text-slate-300">%</span>
</div>
</div>
)}
</div>
{/* Botão de remoção */}
+5
View File
@@ -72,6 +72,7 @@ export const useCronogramas = () => {
of_id: cronograma.of_id,
gestor_id: cronograma.gestor_id,
revisao: cronograma.revisao,
defasagem_solda: cronograma.defasagem_solda ?? 10,
processos: processos || [],
peso_total: cronograma.ordens_fabricacao?.peso_total,
ordem_fabricacao: cronograma.ordens_fabricacao,
@@ -106,6 +107,7 @@ export const useCronogramas = () => {
.update({
gestor_id: cronograma.gestor_id,
revisao: novaRevisao,
defasagem_solda: cronograma.defasagem_solda !== undefined ? cronograma.defasagem_solda : 10,
updated_at: new Date().toISOString()
})
.eq('id', cronograma.id)
@@ -139,6 +141,7 @@ export const useCronogramas = () => {
.update({
gestor_id: cronograma.gestor_id,
revisao: novaRevisao,
defasagem_solda: cronograma.defasagem_solda !== undefined ? cronograma.defasagem_solda : 10,
updated_at: new Date().toISOString()
})
.eq('id', existingCronograma.id)
@@ -163,6 +166,7 @@ export const useCronogramas = () => {
of_id: cronograma.of_id,
gestor_id: cronograma.gestor_id,
revisao: 1,
defasagem_solda: cronograma.defasagem_solda !== undefined ? cronograma.defasagem_solda : 10,
created_by: user.id
})
.select()
@@ -255,6 +259,7 @@ export const useCronogramas = () => {
of_id: cronograma.of_id,
gestor_id: cronograma.gestor_id,
revisao: cronograma.revisao,
defasagem_solda: cronograma.defasagem_solda ?? 10,
processos: processos || [],
peso_total: cronograma.ordens_fabricacao?.peso_total,
ordem_fabricacao: cronograma.ordens_fabricacao,
@@ -215,6 +215,7 @@ export const useDashboardProducaoOtimizado = (ofNumber: string) => {
.from('cronogramas_of')
.select(`
id,
defasagem_solda,
processos_cronograma:processos_cronograma(
nome_processo,
data_inicio,
@@ -287,6 +288,27 @@ export const useDashboardProducaoOtimizado = (ofNumber: string) => {
console.log(`Processo ${nomeProcesso}: ${diasDecorridos}/${diasTotais} dias = ${percentualEsperado.toFixed(2)}%`);
}
// Se for o processo de Solda, aplicar o fator de defasagem configurado em relação ao Corte
if (nomeProcesso.toLowerCase().includes('solda')) {
const defasagem = cronogramaOf?.defasagem_solda !== undefined && cronogramaOf?.defasagem_solda !== null
? Number(cronogramaOf.defasagem_solda)
: 10;
if (percentualEsperado <= defasagem) {
console.log(`Processo Solda: Fabricação esperada (${percentualEsperado.toFixed(2)}%) <= defasagem (${defasagem}%) -> Progresso esperado Solda: 0%`);
return 0;
}
if (hoje > dataFim) {
return 100;
}
// Escalonamento suave proporcional: de defasagem% até 100%
const progressoSolda = ((percentualEsperado - defasagem) / (100 - defasagem)) * 100;
console.log(`Processo Solda: Fabricação (${percentualEsperado.toFixed(2)}%) com defasagem (${defasagem}%) -> Solda esperada: ${progressoSolda.toFixed(2)}%`);
return Math.min(100, Math.max(0, progressoSolda));
}
return Math.min(100, Math.max(0, percentualEsperado));
};
+1
View File
@@ -12,6 +12,7 @@ export interface CronogramaOf {
of_id: string;
gestor_id: string;
revisao: number;
defasagem_solda?: number;
processos: ProcessoCronograma[];
peso_total?: number;
ordem_fabricacao?: {