// daily-work-report.js - 통합 API 설정 적용 버전 // ================================================================= // 🌐 통합 API 설정 import // ================================================================= import { API, getAuthHeaders, apiCall } from '/js/api-config.js'; // 전역 변수 let workTypes = []; let workStatusTypes = []; let errorTypes = []; let workers = []; let projects = []; let selectedWorkers = new Set(); let workEntryCounter = 0; let currentStep = 1; let editingWorkId = null; // 수정 중인 작업 ID // 한국 시간 기준 오늘 날짜 가져오기 function getKoreaToday() { const today = new Date(); const year = today.getFullYear(); const month = String(today.getMonth() + 1).padStart(2, '0'); const day = String(today.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } // 현재 로그인한 사용자 정보 가져오기 function getCurrentUser() { try { const token = localStorage.getItem('token'); if (!token) return null; const payloadBase64 = token.split('.')[1]; if (payloadBase64) { const payload = JSON.parse(atob(payloadBase64)); console.log('토큰에서 추출한 사용자 정보:', payload); return payload; } } catch (error) { console.log('토큰에서 사용자 정보 추출 실패:', error); } try { const userInfo = localStorage.getItem('user') || localStorage.getItem('userInfo') || localStorage.getItem('currentUser'); if (userInfo) { const parsed = JSON.parse(userInfo); console.log('localStorage에서 가져온 사용자 정보:', parsed); return parsed; } } catch (error) { console.log('localStorage에서 사용자 정보 가져오기 실패:', error); } return null; } // 메시지 표시 function showMessage(message, type = 'info') { const container = document.getElementById('message-container'); container.innerHTML = `
`; if (type === 'success') { setTimeout(() => { hideMessage(); }, 5000); } } function hideMessage() { document.getElementById('message-container').innerHTML = ''; } // 단계 이동 function goToStep(stepNumber) { for (let i = 1; i <= 3; i++) { const step = document.getElementById(`step${i}`); if (step) { step.classList.remove('active', 'completed'); if (i < stepNumber) { step.classList.add('completed'); const stepNum = step.querySelector('.step-number'); if (stepNum) stepNum.classList.add('completed'); } else if (i === stepNumber) { step.classList.add('active'); } } } currentStep = stepNumber; } // 초기 데이터 로드 (통합 API 사용) async function loadData() { try { showMessage('데이터를 불러오는 중...', 'loading'); console.log('🔗 통합 API 설정을 사용한 기본 데이터 로딩 시작...'); await loadWorkers(); await loadProjects(); await loadWorkTypes(); await loadWorkStatusTypes(); await loadErrorTypes(); console.log('로드된 작업자 수:', workers.length); console.log('로드된 프로젝트 수:', projects.length); console.log('작업 유형 수:', workTypes.length); populateWorkerGrid(); hideMessage(); } catch (error) { console.error('데이터 로드 실패:', error); showMessage('데이터 로드 중 오류가 발생했습니다: ' + error.message, 'error'); } } async function loadWorkers() { try { console.log('Workers API 호출 중... (통합 API 사용)'); const data = await apiCall(`${API}/workers`); workers = Array.isArray(data) ? data : (data.workers || []); console.log('✅ Workers 로드 성공:', workers.length); } catch (error) { console.error('작업자 로딩 오류:', error); throw error; } } async function loadProjects() { try { console.log('Projects API 호출 중... (통합 API 사용)'); const data = await apiCall(`${API}/projects`); projects = Array.isArray(data) ? data : (data.projects || []); console.log('✅ Projects 로드 성공:', projects.length); } catch (error) { console.error('프로젝트 로딩 오류:', error); throw error; } } async function loadWorkTypes() { try { const data = await apiCall(`${API}/daily-work-reports/work-types`); if (Array.isArray(data) && data.length > 0) { workTypes = data; console.log('✅ 작업 유형 API 사용 (통합 설정)'); return; } throw new Error('API 실패'); } catch (error) { console.log('⚠️ 작업 유형 API 사용 불가, 기본값 사용'); workTypes = [ {id: 1, name: 'Base'}, {id: 2, name: 'Vessel'}, {id: 3, name: 'Piping'} ]; } } async function loadWorkStatusTypes() { try { const data = await apiCall(`${API}/daily-work-reports/work-status-types`); if (Array.isArray(data) && data.length > 0) { workStatusTypes = data; console.log('✅ 업무 상태 유형 API 사용 (통합 설정)'); return; } throw new Error('API 실패'); } catch (error) { console.log('⚠️ 업무 상태 유형 API 사용 불가, 기본값 사용'); workStatusTypes = [ {id: 1, name: '정규'}, {id: 2, name: '에러'} ]; } } async function loadErrorTypes() { try { const data = await apiCall(`${API}/daily-work-reports/error-types`); if (Array.isArray(data) && data.length > 0) { errorTypes = data; console.log('✅ 에러 유형 API 사용 (통합 설정)'); return; } throw new Error('API 실패'); } catch (error) { console.log('⚠️ 에러 유형 API 사용 불가, 기본값 사용'); errorTypes = [ {id: 1, name: '설계미스'}, {id: 2, name: '외주작업 불량'}, {id: 3, name: '입고지연'}, {id: 4, name: '작업 불량'} ]; } } // 작업자 그리드 생성 function populateWorkerGrid() { const grid = document.getElementById('workerGrid'); grid.innerHTML = ''; workers.forEach(worker => { const btn = document.createElement('button'); btn.type = 'button'; btn.className = 'worker-btn'; btn.textContent = worker.worker_name; btn.dataset.id = worker.worker_id; btn.addEventListener('click', () => { toggleWorkerSelection(worker.worker_id, btn); }); grid.appendChild(btn); }); } // 작업자 선택 토글 function toggleWorkerSelection(workerId, btnElement) { if (selectedWorkers.has(workerId)) { selectedWorkers.delete(workerId); btnElement.classList.remove('selected'); } else { selectedWorkers.add(workerId); btnElement.classList.add('selected'); } const nextBtn = document.getElementById('nextStep2'); nextBtn.disabled = selectedWorkers.size === 0; } // 작업 항목 추가 function addWorkEntry() { const container = document.getElementById('workEntriesList'); workEntryCounter++; const entryDiv = document.createElement('div'); entryDiv.className = 'work-entry'; entryDiv.dataset.id = workEntryCounter; entryDiv.innerHTML = `