72 lines
2.1 KiB
JavaScript
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('인쇄 중 오류가 발생했습니다.');
|
|
}
|
|
}
|