// daily-work-report.js - 브라우저 호환 버전 // ================================================================= // 🌐 API 설정 (window 객체에서 가져오기) // ================================================================= // API 설정은 api-config.js에서 window 객체에 설정됨 // 전역 변수 let workTypes = []; let workStatusTypes = []; let errorTypes = []; let workers = []; let projects = []; let selectedWorkers = new Set(); let workEntryCounter = 0; let currentStep = 1; let editingWorkId = null; // 수정 중인 작업 ID let incompleteTbms = []; // 미완료 TBM 작업 목록 let currentTab = 'tbm'; // 현재 활성 탭 // 부적합 원인 관리 let currentDefectIndex = null; // 현재 편집 중인 행 인덱스 let tempDefects = {}; // 임시 부적합 원인 저장 { index: [{ error_type_id, defect_hours, note }] } // 작업장소 지도 관련 변수 let mapCanvas = null; let mapCtx = null; let mapImage = null; let mapRegions = []; let selectedWorkplace = null; let selectedWorkplaceName = null; let selectedWorkplaceCategory = null; let selectedWorkplaceCategoryName = null; // 시간 선택 관련 변수 let currentEditingField = null; // { index, type: 'total' | 'error' } let currentTimeValue = 0; // ================================================================= // TBM 작업보고 관련 함수 // ================================================================= /** * 탭 전환 함수 */ window.switchTab = function(tab) { currentTab = tab; const tbmBtn = document.getElementById('tbmReportTab'); const completedBtn = document.getElementById('completedReportTab'); const tbmSection = document.getElementById('tbmReportSection'); const completedSection = document.getElementById('completedReportSection'); // 모든 탭 버튼 비활성화 tbmBtn.classList.remove('active'); completedBtn.classList.remove('active'); // 모든 섹션 숨기기 tbmSection.style.display = 'none'; completedSection.style.display = 'none'; // 선택된 탭 활성화 if (tab === 'tbm') { tbmBtn.classList.add('active'); tbmSection.style.display = 'block'; loadIncompleteTbms(); // TBM 목록 로드 } else if (tab === 'completed') { completedBtn.classList.add('active'); completedSection.style.display = 'block'; // 오늘 날짜로 초기화 document.getElementById('completedReportDate').value = getKoreaToday(); loadCompletedReports(); } }; /** * 미완료 TBM 작업 로드 */ async function loadIncompleteTbms() { try { const response = await window.apiCall('/tbm/sessions/incomplete-reports'); if (!response.success) { throw new Error(response.message || '미완료 TBM 조회 실패'); } let data = response.data || []; // 사용자 권한 확인 및 필터링 const user = getUser(); if (user && user.role !== 'Admin' && user.access_level !== 'system') { // 일반 사용자: 자신이 생성한 세션만 표시 const userId = user.user_id; data = data.filter(tbm => tbm.created_by === userId); } // 관리자는 모든 데이터 표시 incompleteTbms = data; renderTbmWorkList(); } catch (error) { console.error('미완료 TBM 로드 오류:', error); showMessage('TBM 작업 목록을 불러오는 중 오류가 발생했습니다.', 'error'); } } /** * 사용자 정보 가져오기 (auth-check.js와 동일한 로직) */ function getUser() { const user = localStorage.getItem('user'); return user ? JSON.parse(user) : null; } /** * TBM 작업 목록 렌더링 (세션별 그룹화) */ function renderTbmWorkList() { const container = document.getElementById('tbmWorkList'); // TBM을 세션별로 그룹화 const groupedTbms = {}; if (incompleteTbms && incompleteTbms.length > 0) { incompleteTbms.forEach((tbm, index) => { const key = `${tbm.session_id}_${tbm.session_date}`; if (!groupedTbms[key]) { groupedTbms[key] = { session_id: tbm.session_id, session_date: tbm.session_date, created_by_name: tbm.created_by_name, items: [] }; } groupedTbms[key].items.push({ ...tbm, originalIndex: index }); }); } let html = `
| 작업자 | 날짜 | 프로젝트 | 공정 | 작업 | 작업장소 | 작업시간 | 부적합 | 제출 |
|---|
| 작업자 | 프로젝트 | 공정 | 작업 | 작업장소 | 작업시간 | 부적합 | 제출 |
|---|---|---|---|---|---|---|---|
|
${tbm.worker_name || '작업자'}
${tbm.job_type || '-'}
|
${tbm.project_name || '-'} | ${tbm.work_type_name || '-'} | ${tbm.task_name || '-'} |
${tbm.category_name || ''}
${tbm.workplace_name || '-'}
|
시간 선택
|
작성된 작업보고서가 없습니다.
'; return; } const html = reports.map(report => `${details}