feat: sistema de deteccao de conflitos, conciliacao e ordem de intervencao fabril na importacao de pecas
This commit is contained in:
@@ -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();
|
||||
}}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user