import React, { useState, useEffect } from 'react'; import { Typography, Box, Card, CardContent, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, TablePagination, CircularProgress, Alert, Chip } from '@mui/material'; import { Inventory } from '@mui/icons-material'; function MaterialList({ selectedProject }) { const [materials, setMaterials] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(25); const [totalCount, setTotalCount] = useState(0); useEffect(() => { if (selectedProject) { fetchMaterials(); } else { setMaterials([]); setTotalCount(0); } }, [selectedProject, page, rowsPerPage]); const fetchMaterials = async () => { setLoading(true); setError(''); try { const skip = page * rowsPerPage; const response = await fetch( `http://localhost:8000/api/files/materials?project_id=${selectedProject.id}&skip=${skip}&limit=${rowsPerPage}` ); if (response.ok) { const data = await response.json(); setMaterials(data.materials || []); setTotalCount(data.total_count || 0); } else { setError('자재 데이터를 불러오는데 실패했습니다.'); } } catch (error) { console.error('자재 조회 실패:', error); setError('네트워크 오류가 발생했습니다.'); } finally { setLoading(false); } }; const handleChangePage = (event, newPage) => { setPage(newPage); }; const handleChangeRowsPerPage = (event) => { setRowsPerPage(parseInt(event.target.value, 10)); setPage(0); }; const getItemTypeColor = (itemType) => { const colors = { 'PIPE': 'primary', 'FITTING': 'secondary', 'VALVE': 'success', 'FLANGE': 'warning', 'BOLT': 'info', 'OTHER': 'default' }; return colors[itemType] || 'default'; }; if (!selectedProject) { return ( 📋 자재 목록 프로젝트를 선택해주세요 프로젝트 관리 탭에서 프로젝트를 선택하면 자재 목록을 확인할 수 있습니다. ); } return ( 📋 자재 목록 (그룹핑) {selectedProject.project_name} ({selectedProject.official_project_code}) {error && ( {error} )} {loading ? ( 자재 데이터 로딩 중... ) : materials.length === 0 ? ( 자재 데이터가 없습니다 파일 업로드 탭에서 BOM 파일을 업로드해주세요. ) : ( 총 {totalCount.toLocaleString()}개 자재 그룹 번호 유형 자재명 총 수량 단위 사이즈 재질 라인 수 {materials.map((material, index) => ( {page * rowsPerPage + index + 1} {material.original_description} {material.quantity.toLocaleString()} {material.material_grade || '-'} ))}
`${from}-${to} / 총 ${count !== -1 ? count : to} 개` } />
)}
); } export default MaterialList;