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;