import React, { useState, useEffect } from 'react'; import { api, fetchFiles, deleteFile as deleteFileApi } from '../api'; import BOMFileUpload from '../components/BOMFileUpload'; const BOMStatusPage = ({ jobNo, jobName, onNavigate, selectedProject }) => { const [files, setFiles] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [uploading, setUploading] = useState(false); const [selectedFile, setSelectedFile] = useState(null); const [bomName, setBomName] = useState(''); useEffect(() => { if (jobNo) { fetchFilesList(); } }, [jobNo]); const fetchFilesList = async () => { try { setLoading(true); const response = await api.get('/files/', { params: { job_no: jobNo } }); // API가 배열로 직접 반환하는 경우 if (Array.isArray(response.data)) { setFiles(response.data); } else if (response.data && response.data.success) { setFiles(response.data.files || []); } else { setFiles([]); } } catch (err) { console.error('파일 목록 로딩 실패:', err); setError('파일 목록을 불러오는데 실패했습니다.'); } finally { setLoading(false); } }; // 파일 업로드 const handleUpload = async () => { if (!selectedFile || !bomName.trim()) { alert('파일과 BOM 이름을 모두 입력해주세요.'); return; } try { setUploading(true); const formData = new FormData(); formData.append('file', selectedFile); formData.append('bom_name', bomName.trim()); formData.append('job_no', jobNo); const response = await api.post('/files/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); if (response.data && response.data.success) { alert('파일이 성공적으로 업로드되었습니다!'); setSelectedFile(null); setBomName(''); await fetchFilesList(); // 목록 새로고침 } else { throw new Error(response.data?.message || '업로드 실패'); } } catch (err) { console.error('파일 업로드 실패:', err); setError('파일 업로드에 실패했습니다.'); } finally { setUploading(false); } }; // 파일 삭제 const handleDelete = async (fileId) => { if (!window.confirm('정말로 이 파일을 삭제하시겠습니까?')) { return; } try { await deleteFileApi(fileId); await fetchFilesList(); // 목록 새로고침 } catch (err) { console.error('파일 삭제 실패:', err); setError('파일 삭제에 실패했습니다.'); } }; // 자재 관리 페이지로 바로 이동 (단순화) const handleViewMaterials = (file) => { if (onNavigate) { onNavigate('materials', { file_id: file.id, jobNo: file.job_no, bomName: file.bom_name || file.original_filename, revision: file.revision, filename: file.original_filename }); } }; return (
{/* 헤더 */}

📊 BOM 관리 시스템

{jobNo && jobName && (

{jobNo} - {jobName}

)}
{/* 파일 업로드 컴포넌트 */} {/* BOM 목록 */}

업로드된 BOM 목록

{loading ? (
로딩 중...
) : (
{files.map((file) => ( ))}
BOM 이름 파일명 리비전 자재 수 업로드 일시 작업
{file.bom_name || file.original_filename}
{file.description || ''}
{file.original_filename} {file.revision || 'Rev.0'} {file.parsed_count || 0}개 {new Date(file.created_at).toLocaleDateString()}
{files.length === 0 && (
업로드된 BOM 파일이 없습니다.
)}
)}
); }; export default BOMStatusPage;