/** * Work Analysis API Client Module * 작업 분석 관련 모든 API 호출을 관리하는 모듈 */ class WorkAnalysisAPIClient { constructor() { this.baseURL = window.API_BASE_URL || 'http://localhost:30005/api'; } /** * 기본 API 호출 메서드 * @param {string} endpoint - API 엔드포인트 * @param {string} method - HTTP 메서드 * @param {Object} data - 요청 데이터 * @returns {Promise} API 응답 */ async apiCall(endpoint, method = 'GET', data = null) { try { const config = { method, headers: { 'Content-Type': 'application/json', } }; if (data && method !== 'GET') { config.body = JSON.stringify(data); } const response = await fetch(`${this.baseURL}${endpoint}`, config); const result = await response.json(); if (!response.ok) { throw new Error(result.message || `HTTP ${response.status}`); } return result; } catch (error) { console.error(` API 실패: ${this.baseURL}${endpoint}`, error); throw error; } } /** * 날짜 범위 파라미터 생성 * @param {string} startDate - 시작일 * @param {string} endDate - 종료일 * @param {Object} additionalParams - 추가 파라미터 * @returns {URLSearchParams} URL 파라미터 */ createDateParams(startDate, endDate, additionalParams = {}) { const params = new URLSearchParams({ start: startDate, end: endDate, ...additionalParams }); return params; } // ========== 기본 통계 API ========== /** * 기본 통계 조회 */ async getBasicStats(startDate, endDate, projectId = null) { const params = this.createDateParams(startDate, endDate, projectId ? { project_id: projectId } : {} ); return await this.apiCall(`/work-analysis/stats?${params}`); } /** * 일별 추이 조회 */ async getDailyTrend(startDate, endDate, projectId = null) { const params = this.createDateParams(startDate, endDate, projectId ? { project_id: projectId } : {} ); return await this.apiCall(`/work-analysis/daily-trend?${params}`); } /** * 작업자별 통계 조회 */ async getWorkerStats(startDate, endDate, projectId = null) { const params = this.createDateParams(startDate, endDate, projectId ? { project_id: projectId } : {} ); return await this.apiCall(`/work-analysis/worker-stats?${params}`); } /** * 프로젝트별 통계 조회 */ async getProjectStats(startDate, endDate) { const params = this.createDateParams(startDate, endDate); return await this.apiCall(`/work-analysis/project-stats?${params}`); } // ========== 상세 분석 API ========== /** * 프로젝트별-작업유형별 분석 */ async getProjectWorkTypeAnalysis(startDate, endDate, limit = 2000) { const params = this.createDateParams(startDate, endDate, { limit }); return await this.apiCall(`/work-analysis/project-worktype-analysis?${params}`); } /** * 최근 작업 데이터 조회 */ async getRecentWork(startDate, endDate, limit = 2000) { const params = this.createDateParams(startDate, endDate, { limit }); return await this.apiCall(`/work-analysis/recent-work?${params}`); } /** * 오류 분석 데이터 조회 */ async getErrorAnalysis(startDate, endDate) { const params = this.createDateParams(startDate, endDate); return await this.apiCall(`/work-analysis/error-analysis?${params}`); } // ========== 배치 API 호출 ========== /** * 여러 API를 병렬로 호출 * @param {Array} apiCalls - API 호출 배열 * @returns {Promise} 결과 배열 */ async batchCall(apiCalls) { const promises = apiCalls.map(async ({ name, method, ...args }) => { try { const result = await this[method](...args); return { name, success: true, data: result }; } catch (error) { console.warn(` ${name} API 오류:`, error); return { name, success: false, error: error.message, data: null }; } }); const results = await Promise.all(promises); return results.reduce((acc, result) => { acc[result.name] = result; return acc; }, {}); } /** * 차트 데이터를 위한 배치 호출 */ async getChartData(startDate, endDate, projectId = null) { return await this.batchCall([ { name: 'dailyTrend', method: 'getDailyTrend', startDate, endDate, projectId }, { name: 'workerStats', method: 'getWorkerStats', startDate, endDate, projectId }, { name: 'projectStats', method: 'getProjectStats', startDate, endDate }, { name: 'errorAnalysis', method: 'getErrorAnalysis', startDate, endDate } ]); } /** * 프로젝트 분포 분석을 위한 배치 호출 */ async getProjectDistributionData(startDate, endDate) { return await this.batchCall([ { name: 'projectWorkType', method: 'getProjectWorkTypeAnalysis', startDate, endDate }, { name: 'workerStats', method: 'getWorkerStats', startDate, endDate }, { name: 'recentWork', method: 'getRecentWork', startDate, endDate } ]); } } // 전역 인스턴스 생성 window.WorkAnalysisAPI = new WorkAnalysisAPIClient(); // 하위 호환성을 위한 전역 함수 window.apiCall = (endpoint, method, data) => { return window.WorkAnalysisAPI.apiCall(endpoint, method, data); }; // Export는 브라우저 환경에서 제거됨