/** * 부적합 현황 페이지 JavaScript * category_type=nonconformity 고정 필터 */ const API_BASE = window.API_BASE_URL || 'http://localhost:20005/api'; const CATEGORY_TYPE = 'nonconformity'; // 상태 한글 변환 const STATUS_LABELS = { reported: '신고', received: '접수', in_progress: '처리중', completed: '완료', closed: '종료' }; // DOM 요소 let issueList; let filterStatus, filterStartDate, filterEndDate; // 초기화 document.addEventListener('DOMContentLoaded', async () => { issueList = document.getElementById('issueList'); filterStatus = document.getElementById('filterStatus'); filterStartDate = document.getElementById('filterStartDate'); filterEndDate = document.getElementById('filterEndDate'); // 필터 이벤트 리스너 filterStatus.addEventListener('change', loadIssues); filterStartDate.addEventListener('change', loadIssues); filterEndDate.addEventListener('change', loadIssues); // 데이터 로드 await Promise.all([loadStats(), loadIssues()]); }); /** * 통계 로드 (부적합만) */ async function loadStats() { try { const response = await fetch(`${API_BASE}/work-issues/stats/summary?category_type=${CATEGORY_TYPE}`, { headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` } }); if (!response.ok) { document.getElementById('statsGrid').style.display = 'none'; return; } const data = await response.json(); if (data.success && data.data) { document.getElementById('statReported').textContent = data.data.reported || 0; document.getElementById('statReceived').textContent = data.data.received || 0; document.getElementById('statProgress').textContent = data.data.in_progress || 0; document.getElementById('statCompleted').textContent = data.data.completed || 0; } } catch (error) { console.error('통계 로드 실패:', error); document.getElementById('statsGrid').style.display = 'none'; } } /** * 부적합 목록 로드 */ async function loadIssues() { try { // 필터 파라미터 구성 (category_type 고정) const params = new URLSearchParams(); params.append('category_type', CATEGORY_TYPE); if (filterStatus.value) params.append('status', filterStatus.value); if (filterStartDate.value) params.append('start_date', filterStartDate.value); if (filterEndDate.value) params.append('end_date', filterEndDate.value); const response = await fetch(`${API_BASE}/work-issues?${params.toString()}`, { headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` } }); if (!response.ok) throw new Error('목록 조회 실패'); const data = await response.json(); if (data.success) { renderIssues(data.data || []); } } catch (error) { console.error('부적합 목록 로드 실패:', error); issueList.innerHTML = `
목록을 불러올 수 없습니다

잠시 후 다시 시도해주세요.

`; } } /** * 부적합 목록 렌더링 */ function renderIssues(issues) { if (issues.length === 0) { issueList.innerHTML = `
등록된 부적합 신고가 없습니다

새로운 부적합을 신고하려면 '부적합 신고' 버튼을 클릭하세요.

`; return; } const baseUrl = (window.API_BASE_URL || 'http://localhost:20005').replace('/api', ''); issueList.innerHTML = issues.map(issue => { const reportDate = new Date(issue.report_date).toLocaleString('ko-KR', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }); // 위치 정보 let location = issue.custom_location || ''; if (issue.factory_name) { location = issue.factory_name; if (issue.workplace_name) { location += ` - ${issue.workplace_name}`; } } // 신고 제목 (항목명 또는 카테고리명) const title = issue.issue_item_name || issue.issue_category_name || '부적합 신고'; // 사진 목록 const photos = [ issue.photo_path1, issue.photo_path2, issue.photo_path3, issue.photo_path4, issue.photo_path5 ].filter(Boolean); return `
#${issue.report_id} ${STATUS_LABELS[issue.status] || issue.status}
${issue.issue_category_name || '부적합'} ${title}
${issue.reporter_full_name || issue.reporter_name} ${reportDate} ${location ? ` ${location} ` : ''} ${issue.assigned_full_name ? ` 담당: ${issue.assigned_full_name} ` : ''}
${photos.length > 0 ? `
${photos.slice(0, 3).map(p => ` 신고 사진 `).join('')} ${photos.length > 3 ? `+${photos.length - 3}` : ''}
` : ''}
`; }).join(''); } /** * 상세 보기 */ function viewIssue(reportId) { window.location.href = `/pages/safety/issue-detail.html?id=${reportId}&from=nonconformity`; }