const riskModel = require('../models/riskModel'); // ==================== 공정 템플릿 ==================== exports.getTemplates = async (req, res) => { try { const templates = await riskModel.getTemplates(req.query.product_type); res.json({ success: true, data: templates }); } catch (err) { console.error('템플릿 조회 오류:', err); res.status(500).json({ success: false, error: '템플릿 조회 실패' }); } }; // ==================== 프로젝트 CRUD ==================== exports.createProject = async (req, res) => { try { const { title, product_type } = req.body; if (!title || !product_type) { return res.status(400).json({ success: false, error: '제목과 제품유형은 필수입니다' }); } const data = { ...req.body, created_by: req.user.user_id || req.user.id }; const projectId = await riskModel.createProject(data); res.status(201).json({ success: true, message: '프로젝트가 생성되었습니다', data: { id: projectId } }); } catch (err) { console.error('프로젝트 생성 오류:', err); res.status(500).json({ success: false, error: '프로젝트 생성 실패' }); } }; exports.getAllProjects = async (req, res) => { try { const projects = await riskModel.getAllProjects(req.query); // 대시보드 요약 const summary = { total: projects.length, risk_distribution: { high: 0, substantial: 0, moderate: 0, low: 0 } }; for (const p of projects) { summary.risk_distribution.high += p.high_risk_count || 0; } res.json({ success: true, data: { projects, summary } }); } catch (err) { console.error('프로젝트 목록 조회 오류:', err); res.status(500).json({ success: false, error: '프로젝트 목록 조회 실패' }); } }; exports.getProjectById = async (req, res) => { try { const project = await riskModel.getProjectById(req.params.id); if (!project) return res.status(404).json({ success: false, error: '프로젝트를 찾을 수 없습니다' }); res.json({ success: true, data: project }); } catch (err) { console.error('프로젝트 상세 조회 오류:', err); res.status(500).json({ success: false, error: '프로젝트 상세 조회 실패' }); } }; exports.updateProject = async (req, res) => { try { const result = await riskModel.updateProject(req.params.id, req.body); if (result.affectedRows === 0) return res.status(404).json({ success: false, error: '프로젝트를 찾을 수 없습니다' }); res.json({ success: true, message: '프로젝트가 수정되었습니다' }); } catch (err) { console.error('프로젝트 수정 오류:', err); res.status(500).json({ success: false, error: '프로젝트 수정 실패' }); } }; exports.deleteProject = async (req, res) => { try { const result = await riskModel.deleteProject(req.params.id); if (result.affectedRows === 0) return res.status(404).json({ success: false, error: '프로젝트를 찾을 수 없습니다' }); res.json({ success: true, message: '프로젝트가 삭제되었습니다' }); } catch (err) { console.error('프로젝트 삭제 오류:', err); res.status(500).json({ success: false, error: '프로젝트 삭제 실패' }); } }; // ==================== 세부 공정 ==================== exports.addProcess = async (req, res) => { try { const { process_name } = req.body; if (!process_name) return res.status(400).json({ success: false, error: '공정명은 필수입니다' }); const processId = await riskModel.addProcess(req.params.id, req.body); res.status(201).json({ success: true, message: '공정이 추가되었습니다', data: { id: processId } }); } catch (err) { console.error('공정 추가 오류:', err); res.status(500).json({ success: false, error: '공정 추가 실패' }); } }; // ==================== 평가 항목 CRUD ==================== exports.createItem = async (req, res) => { try { const itemId = await riskModel.createItem(req.params.processId, req.body); res.status(201).json({ success: true, message: '항목이 추가되었습니다', data: { id: itemId } }); } catch (err) { console.error('항목 추가 오류:', err); res.status(500).json({ success: false, error: '항목 추가 실패' }); } }; exports.updateItem = async (req, res) => { try { const result = await riskModel.updateItem(req.params.itemId, req.body); if (result.affectedRows === 0) return res.status(404).json({ success: false, error: '항목을 찾을 수 없습니다' }); res.json({ success: true, message: '항목이 수정되었습니다' }); } catch (err) { console.error('항목 수정 오류:', err); res.status(500).json({ success: false, error: '항목 수정 실패' }); } }; exports.deleteItem = async (req, res) => { try { const result = await riskModel.deleteItem(req.params.itemId); if (result.affectedRows === 0) return res.status(404).json({ success: false, error: '항목을 찾을 수 없습니다' }); res.json({ success: true, message: '항목이 삭제되었습니다' }); } catch (err) { console.error('항목 삭제 오류:', err); res.status(500).json({ success: false, error: '항목 삭제 실패' }); } }; // ==================== 감소대책 CRUD ==================== exports.getMitigations = async (req, res) => { try { const mitigations = await riskModel.getMitigationsByProject(req.params.id); res.json({ success: true, data: mitigations }); } catch (err) { console.error('감소대책 조회 오류:', err); res.status(500).json({ success: false, error: '감소대책 조회 실패' }); } }; exports.createMitigation = async (req, res) => { try { const { mitigation_no } = req.body; if (!mitigation_no) return res.status(400).json({ success: false, error: '대책 번호는 필수입니다' }); const mitigationId = await riskModel.createMitigation(req.params.id, req.body); res.status(201).json({ success: true, message: '감소대책이 추가되었습니다', data: { id: mitigationId } }); } catch (err) { if (err.code === 'ER_DUP_ENTRY') { return res.status(409).json({ success: false, error: '이미 존재하는 대책 번호입니다' }); } console.error('감소대책 생성 오류:', err); res.status(500).json({ success: false, error: '감소대책 생성 실패' }); } }; exports.updateMitigation = async (req, res) => { try { const result = await riskModel.updateMitigation(req.params.mitigationId, req.body); if (result.affectedRows === 0) return res.status(404).json({ success: false, error: '감소대책을 찾을 수 없습니다' }); res.json({ success: true, message: '감소대책이 수정되었습니다' }); } catch (err) { console.error('감소대책 수정 오류:', err); res.status(500).json({ success: false, error: '감소대책 수정 실패' }); } }; exports.uploadPhoto = async (req, res) => { try { if (!req.file) return res.status(400).json({ success: false, error: '사진 파일이 없습니다' }); const photoPath = '/uploads/risk/' + req.file.filename; await riskModel.updateMitigationPhoto(req.params.mitigationId, photoPath); res.json({ success: true, message: '사진이 업로드되었습니다', data: { photo_url: photoPath } }); } catch (err) { console.error('사진 업로드 오류:', err); res.status(500).json({ success: false, error: '사진 업로드 실패' }); } }; // ==================== Excel 내보내기 ==================== exports.exportExcel = async (req, res) => { try { const project = await riskModel.getProjectById(req.params.id); if (!project) return res.status(404).json({ success: false, error: '프로젝트를 찾을 수 없습니다' }); const { generateRiskExcel } = require('../utils/riskExcelExport'); const buffer = await generateRiskExcel(project); const filename = encodeURIComponent(`위험성평가_${project.title}_${project.year}.xlsx`); res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${filename}`); res.send(buffer); } catch (err) { console.error('Excel 내보내기 오류:', err); res.status(500).json({ success: false, error: 'Excel 내보내기 실패' }); } };