feat: sistema de deteccao de conflitos, conciliacao e ordem de intervencao fabril na importacao de pecas

This commit is contained in:
2026-10-16 15:27:30 -03:00
parent ac8bacc9e1
commit ec980cba05
10 changed files with 1975 additions and 11 deletions
+39 -8
View File
@@ -9,6 +9,9 @@ import { ScrollArea } from '@/components/ui/scroll-area';
import { AlertTriangle, Check, X, Upload, FileSpreadsheet, Weight, AlertCircle, Edit3 } from 'lucide-react';
import { toast } from 'sonner';
import { parseCSV } from '@/utils/csvUtils';
import { analisarConflitosImportacao, consolidarPecasEComponentes } from '@/utils/importDiffService';
import { ResultadoAnaliseImportacao } from '@/types/importDiff';
import { ImportarPecasDiffModal } from '@/components/pecas/ImportarPecasDiffModal';
interface PecaCSVData {
of_number: string;
@@ -62,6 +65,9 @@ export function ImportarPecasModal({ open, onOpenChange, onImport, pecasExistent
const [isLoading, setIsLoading] = useState(false);
const [step, setStep] = useState<'upload' | 'preview'>('upload');
const [showErrors, setShowErrors] = useState(false);
const [analiseDiff, setAnaliseDiff] = useState<ResultadoAnaliseImportacao | null>(null);
const [componentesMapDiff, setComponentesMapDiff] = useState<Map<string, any[]>>(new Map());
const [showDiffModal, setShowDiffModal] = useState(false);
const requiredHeaders = [
'of_number', 'etapa_fase', 'marca', 'descricao', 'quantidade',
@@ -307,19 +313,29 @@ export function ImportarPecasModal({ open, onOpenChange, onImport, pecasExistent
};
const handleImport = async () => {
const validPecas = csvData.filter((_, index) => !duplicates[index]?.isDuplicate);
console.log('🚀 Iniciando importação de', validPecas.length, 'peças...');
if (validPecas.length === 0) {
if (csvData.length === 0) {
toast.error('Nenhuma peça válida para importar');
return;
}
setIsLoading(true);
try {
await onImport(validPecas);
console.log('✅ Importação concluída com sucesso!');
// Analisar conflitos e status na base de dados
toast.info('Verificando existência e status de produção das peças...');
const analise = await analisarConflitosImportacao(csvData);
const { componentesMap } = consolidarPecasEComponentes(csvData);
// Se houver peças já cadastradas na base
if (analise.totalComDivergencia > 0 || analise.totalIdenticas > 0 || analise.totalComApontamento > 0) {
setAnaliseDiff(analise);
setComponentesMapDiff(componentesMap);
setShowDiffModal(true);
setIsLoading(false);
return;
}
await onImport(csvData);
toast.success(`${csvData.length} novas peças importadas com sucesso!`);
handleClose();
} catch (error) {
console.error('❌ Erro na importação:', error);
@@ -352,7 +368,8 @@ export function ImportarPecasModal({ open, onOpenChange, onImport, pecasExistent
.reduce((sum, peca) => sum + peca.peso_total, 0);
return (
<Dialog open={open} onOpenChange={handleClose}>
<>
<Dialog open={open} onOpenChange={handleClose}>
<DialogContent className="max-w-6xl max-h-[80vh]">
<DialogHeader>
<DialogTitle className="flex items-center gap-2">
@@ -601,5 +618,19 @@ export function ImportarPecasModal({ open, onOpenChange, onImport, pecasExistent
</DialogFooter>
</DialogContent>
</Dialog>
{/* Modal de Detecção de Conflitos e Conciliação */}
<ImportarPecasDiffModal
open={showDiffModal}
onOpenChange={setShowDiffModal}
analise={analiseDiff}
componentesMap={componentesMapDiff}
ofDefault={csvData[0]?.of_number || ''}
onConcluido={() => {
setShowDiffModal(false);
handleClose();
}}
/>
</>
);
}