Files
TK-FB-Project/fastapi-bridge/static/js/report-viewer-export.js

72 lines
2.1 KiB
JavaScript

// /js/report-viewer-export.js
/**
* 주어진 데이터를 CSV 형식의 문자열로 변환합니다.
* @param {object} reportData - 요약 및 작업자별 데이터
* @returns {string} - CSV 형식의 문자열
*/
function convertToCsv(reportData) {
let csvContent = "\uFEFF"; // UTF-8 BOM
csvContent += "작업자명,프로젝트명,작업유형,작업상태,에러유형,작업시간,입력자\n";
reportData.workers.forEach(worker => {
worker.entries.forEach(entry => {
const row = [
worker.worker_name,
entry.project_name,
entry.work_type_name,
entry.work_status_name,
entry.error_type_name,
entry.work_hours,
entry.created_by_name
].map(field => `"${String(field || '').replace(/"/g, '""')}"`).join(',');
csvContent += row + "\n";
});
});
return csvContent;
}
/**
* 가공된 보고서 데이터를 CSV 파일로 다운로드합니다.
* @param {object|null} reportData - UI에 표시된 가공된 데이터
*/
export function exportToExcel(reportData) {
if (!reportData || !reportData.workers || reportData.workers.length === 0) {
alert('내보낼 데이터가 없습니다.');
return;
}
try {
const csv = convertToCsv(reportData);
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
const link = document.createElement('a');
const url = URL.createObjectURL(blob);
const fileName = `작업보고서_${reportData.summary.date}.csv`;
link.setAttribute('href', url);
link.setAttribute('download', fileName);
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
} catch (error) {
console.error('Excel 내보내기 실패:', error);
alert('Excel 파일을 생성하는 중 오류가 발생했습니다.');
}
}
/**
* 현재 페이지의 인쇄 기능을 호출합니다.
*/
export function printReport() {
try {
window.print();
} catch (error) {
console.error('인쇄 실패:', error);
alert('인쇄 중 오류가 발생했습니다.');
}
}