3분 만에 확인하는
PMS 도입 시급성
K-Platform 기반 8개 질문으로 현재 프로젝트 관리 수준과
PMS 도입 시급성을 한눈에 확인합니다.
🔴
PMS 도입 시급성: 높음 (상)
📋 답변 요약
상세 진단이 필요하신가요?
간편 진단은 빠른 현황 파악용이며, 실제 PMS 도입 검토를 위해서는
영역별 상세 진단 및 담당자 협의가 필요합니다.
const QUESTIONS = [ { id: 'q1', type: 'single', score: false, q: '귀사의 임직원 수는 어느 정도입니까?', opts: ['30명 미만', '30~100명', '101~300명', '300명 이상'] }, { id: 'q2', type: 'multi', score: false, q: '주로 사용하는 CAD는 무엇입니까?', opts: ['CATIA', 'Siemens NX', 'PTC Creo', 'AutoCAD', 'SolidWorks', '기타'] }, { id: 'q3', type: 'single', score: true, maxScore: 4, q: '프로젝트 관리는 어떻게 하고 계십니까?', opts: [ { txt: '관리하지 않고 있음', sc: 1 }, { txt: 'Excel 기반 관리', sc: 2 }, { txt: '자체 개발 시스템 운영', sc: 3 }, { txt: '전문 PMS 솔루션 운영', sc: 4 } ] }, { id: 'q4', type: 'single', score: false, q: '프로젝트 관리 주체 부서는 어디입니까?', opts: ['설계팀', '개발팀', '연구소', '기타 / 별도 부서 없음'] }, { id: 'q5', type: 'single', score: true, maxScore: 4, q: '프로젝트 관리 표준화 수준은?', opts: [ { txt: '관리하고 있지 않음', sc: 1 }, { txt: '관리는 하지만 표준화되어 있지 않음', sc: 2 }, { txt: '일부 프로세스만 표준화됨', sc: 3 }, { txt: '개발단계(Proto·시작·양산)별 WBS 표준화 완료', sc: 4 } ] }, { id: 'q6', type: 'single', score: true, maxScore: 4, q: '도면 및 기술문서는 어디에 보관하고 계십니까?', opts: [ { txt: '보관 체계 없음 / 설계자 개인 PC·USB', sc: 1 }, { txt: '공용 파일서버 / 공유폴더', sc: 2 }, { txt: 'NAS / 클라우드 스토리지', sc: 3 }, { txt: '자체 PDM 또는 PLM 운영', sc: 4 } ] }, { id: 'q7', type: 'single', score: true, maxScore: 4, q: '기술문서의 분류 및 양식 표준화 수준은?', opts: [ { txt: '관리하지 않음', sc: 1 }, { txt: '관리는 하지만 표준화되어 있지 않음', sc: 2 }, { txt: '일부 양식만 표준화됨', sc: 3 }, { txt: '표준/시험/일반 기술문서 등 양식 완전 표준화', sc: 4 } ] }, { id: 'q8', type: 'multi', score: false, q: '가장 시급하게 해결하고 싶은 문제는?', opts: [ '프로젝트 현황 관리', '실시간 검색 및 공유 환경', '산출물 관리', '실시간 작업현황 모니터링', '이슈 및 리스크 관리', '리소스 관리 및 효율적 업무 배치', '기타' ] } ];
const answers = {};
function render() { const container = document.getElementById('questions'); QUESTIONS.forEach((q, idx) => { const multiBadge = q.type === 'multi' ? '복수선택' : ''; let optsHtml = ''; q.opts.forEach((opt, oIdx) => { const txt = typeof opt === 'object' ? opt.txt : opt; const sc = typeof opt === 'object' ? opt.sc : null; const scBadge = q.score && sc ? `${sc}점` : ''; const icon = q.type === 'multi' ? '
' : '
'; const cls = q.type === 'multi' ? 'ob multi' : 'ob'; optsHtml += `
`; }); const numCls = q.type === 'multi' ? 'qnum multi' : 'qnum'; const orient = q.type === 'single' && q.opts.length >= 4 ? 'vertical' : ''; container.insertAdjacentHTML('beforeend', `
${multiBadge}
`); }); }
render();
function selOpt(qId, oIdx, type, el) { if (type === 'single') { document.querySelectorAll('#opts_' + qId + ' .ob').forEach(x => x.classList.remove('sel')); el.classList.add('sel'); answers[qId] = [oIdx]; } else { el.classList.toggle('sel'); if (!answers[qId]) answers[qId] = []; if (el.classList.contains('sel')) { if (!answers[qId].includes(oIdx)) answers[qId].push(oIdx); } else { answers[qId] = answers[qId].filter(x => x !== oIdx); } } updateProgress(); }
function updateProgress() { let answered = 0; QUESTIONS.forEach(q => { if (answers[q.id] && answers[q.id].length > 0) { answered++; document.getElementById('card_' + q.id).classList.add('answered'); } else { document.getElementById('card_' + q.id).classList.remove('answered'); } }); document.getElementById('progN').textContent = answered; document.getElementById('progF').style.width = (answered / QUESTIONS.length * 100) + '%'; document.getElementById('calcBtn').disabled = answered < QUESTIONS.length; } function calculate() { const unanswered = QUESTIONS.filter(q => !answers[q.id] || answers[q.id].length === 0); if (unanswered.length > 0) { const w = document.getElementById('warnBar'); w.textContent = `⚠ ${unanswered.length}개 질문이 답변되지 않았습니다. 모든 질문에 답해주세요.`; w.classList.add('show'); unanswered[0] && document.getElementById('card_' + unanswered[0].id).scrollIntoView({ behavior: 'smooth', block: 'center' }); return; } document.getElementById('warnBar').classList.remove('show');
const scoringQs = QUESTIONS.filter(q => q.score); let totalScore = 0; const scoreBreakdown = []; scoringQs.forEach(q => { const oIdx = answers[q.id][0]; const opt = q.opts[oIdx]; const raw = opt.sc; // 1~4 const normalized = Math.round(((raw - 1) / 3) * 100); totalScore += normalized; scoreBreakdown.push({ q: q.q, ans: opt.txt, raw, score: normalized }); }); const avgScore = Math.round(totalScore / scoringQs.length);
document.getElementById('questions').style.display = 'none'; document.querySelector('.progress-shell').style.display = 'none'; document.querySelector('.qs').style.display = 'none'; document.querySelector('.bb').style.display = 'none';
const resEl = document.getElementById('results'); resEl.classList.add('show'); resEl.scrollIntoView({ behavior: 'smooth', block: 'start' });
animateNum('r_score', 0, avgScore, 1500);
const urg = getUrgency(avgScore); document.getElementById('r_label').textContent = urg.label;
const urgBanner = document.getElementById('urgBanner'); urgBanner.classList.remove('u-high', 'u-med', 'u-low'); urgBanner.classList.add('u-' + urg.key); document.getElementById('urgEmoji').textContent = urg.emoji; document.getElementById('urgLevel').textContent = urg.text;
setTimeout(() => { document.getElementById('segMarker').style.left = avgScore + '%'; document.getElementById('segL').classList.toggle('active', urg.key === 'high'); document.getElementById('segM').classList.toggle('active', urg.key === 'med'); document.getElementById('segH').classList.toggle('active', urg.key === 'low'); }, 100);
const companySize = QUESTIONS[0].opts[answers.q1[0]]; const cadList = answers.q2.map(i => QUESTIONS[1].opts[i]).join(', '); const painCount = answers.q8.length;
document.getElementById('kpiRow').innerHTML = `
`;
if (answers.q8.length > 0) { const painsHtml = answers.q8.map(i => `
`).join(''); document.getElementById('painPanel').innerHTML = `
🎯 귀사가 가장 시급하게 해결하고 싶은 과제
- ${painsHtml}
`; } else { document.getElementById('painPanel').style.display = 'none'; }
const ansEl = document.getElementById('ansList'); ansEl.innerHTML = ''; QUESTIONS.forEach((q, idx) => { let ansText = ''; let ansCls = ''; let scoreTxt = ''; if (q.type === 'multi') { ansText = answers[q.id].map(i => q.opts[i]).join(', '); } else { const oIdx = answers[q.id][0]; const opt = q.opts[oIdx]; if (typeof opt === 'object') { ansText = opt.txt; ansCls = 'c-' + opt.sc; const nScore = Math.round(((opt.sc - 1) / 3) * 100); scoreTxt = nScore + '점'; } else { ansText = opt; } } ansEl.insertAdjacentHTML('beforeend', `
${scoreTxt}
`); });
const recs = generateRecs(avgScore, urg, scoreBreakdown, answers, companySize); document.getElementById('recPanel').innerHTML = `
💡 진단 기반 권고사항
- ${recs.map(r => `
- ${r}
`).join('')}
`; }
function getUrgency(total) { if (total < 40) return { key: 'high', emoji: '🔴', label: '현재 구조로는 프로젝트 통제가 매우 어려운 상태입니다', text: '높음 (상)' }; if (total < 70) return { key: 'med', emoji: '🟡', label: '부분적 관리는 하고 있으나 시스템화가 필요합니다', text: '중간 (중)' }; return { key: 'low', emoji: '🟢', label: '기본 체계는 갖추어진 상태로 선별 도입을 검토하세요', text: '낮음 (하)' }; } function generateRecs(score, urg, breakdown, answers, companySize) { const recs = []; if (urg.key === 'high') { recs.push(`종합 점수 ${score}점 — PMS 도입 시급성이 높음(상)입니다. 간편 진단 결과만으로도 명확한 시스템화 필요성이 확인됩니다.`); } else if (urg.key === 'med') { recs.push(`종합 점수 ${score}점 — PMS 도입 시급성이 중간(중)입니다. 현재 관리 체계의 한계를 시스템으로 보완할 시점입니다.`); } else { recs.push(`종합 점수 ${score}점 — PMS 도입 시급성이 낮음(하)입니다. 기존 체계의 고도화 또는 영역별 선별 도입을 고려해볼 수 있습니다.`); }
const q3 = breakdown.find(b => b.q.includes('프로젝트 관리는')); if (q3 && q3.raw <= 2) { recs.push(`프로젝트 관리 방식: "${q3.ans}" 수준은 프로젝트 규모가 커질수록 통제 불가 상태에 빠집니다. 전문 PMS 도입이 최우선 과제입니다.`); }
const q5 = breakdown.find(b => b.q.includes('표준화')); if (q5 && q5.raw <= 2) { recs.push(`표준화 부재: 표준 WBS가 없으면 담당자별로 관리 방식이 달라 데이터 통합이 불가능합니다. 개발단계별 표준 WBS 정립이 PMS 도입의 전제 조건입니다.`); }
const q6 = breakdown.find(b => b.q.includes('도면') || b.q.includes('기술문서는')); if (q6 && q6.raw <= 2) { recs.push(`문서 보관 위험: 현재 보관 방식(${q6.ans})은 버전 혼선, 데이터 유실, 보안 사고의 직접적 원인입니다. 시급한 개선이 필요합니다.`); }
const q7 = breakdown.find(b => b.q.includes('분류')); if (q7 && q7.raw <= 2) { recs.push(`문서 체계 부재: 분류·양식 표준화 없이는 검색·공유·재활용이 어렵습니다. PMS 도입과 동시에 문서 분류 체계 수립이 필수입니다.`); }
const painMap = { 0: '프로젝트 현황 관리', 1: '실시간 검색/공유', 2: '산출물 관리', 3: '실시간 모니터링', 4: '이슈/리스크 관리', 5: '리소스 관리' }; if (answers.q8 && answers.q8.length >= 3) { const painNames = answers.q8.filter(i => painMap[i]).map(i => painMap[i]).join(', '); recs.push(`Pain Point ${answers.q8.length}개: ${painNames} — 시급 과제가 복수로 누적되어 있습니다. 통합 PMS 솔루션이 개별 도구 도입보다 효과적입니다.`); } else if (answers.q8 && answers.q8.length > 0) { recs.push(`선택하신 시급 과제(${answers.q8.length}개)는 3DEXPERIENCE PMS의 핵심 기능으로 모두 해결 가능한 영역입니다.`); }
if (companySize.includes('300명 이상')) { recs.push(`대기업 규모: 300명 이상 조직에서는 엑셀·수기 관리로 전사 가시성 확보가 사실상 불가능합니다. 즉시 도입 검토가 권고됩니다.`); } else if (companySize.includes('101~300') || companySize.includes('30~100')) { recs.push(`중견·중소 규모: 현 시점은 PMS 도입 효과가 극대화되는 임계 규모입니다. 지금 도입 시 조직 확장 전 선제적 체계 구축이 가능합니다.`); }
if (urg.key !== 'low') { recs.push(`다음 단계: 이 간편 진단 결과를 바탕으로 상세 진단(20개 질문)을 통해 영역별 우선순위를 수립하실 수 있습니다.`); }
return recs; }
function animateNum(id, s, e, dur) { const el = document.getElementById(id); const range = e - s; const t0 = performance.now(); function tick(now) { const p = Math.min((now - t0) / dur, 1); const ea = p === 1 ? 1 : 1 - Math.pow(2, -10 * p); el.textContent = Math.round(s + range * ea); if (p < 1) requestAnimationFrame(tick); } requestAnimationFrame(tick); } async function downloadPDF() { const btn = document.getElementById('pdfBtn'); const bt = document.getElementById('pdfBtnT'); const sp = document.getElementById('pdfSpin'); btn.disabled = true; bt.textContent = 'PDF 생성 중...'; sp.style.display = 'inline-block'; const now = new Date(); const ds = `${now.getFullYear()}. ${now.getMonth() + 1}. ${now.getDate()}.`; const src = document.getElementById('results'); const cl = src.cloneNode(true); const pde = cl.querySelector('#pdfDate'); if (pde) pde.textContent = `진단일: ${ds}`; cl.classList.add('pm'); cl.style.cssText = 'position:absolute;left:-9999px;top:0;width:780px;display:block;z-index:9999;'; document.body.appendChild(cl); const marker = cl.querySelector('#segMarker'); if (marker) { const score = parseInt(document.getElementById('r_score').textContent) || 0; marker.style.left = score + '%'; } await new Promise(r => setTimeout(r, 700));
try { const canvas = await html2canvas(cl, { scale: 3, useCORS: true, backgroundColor: '#ffffff', width: 780, windowWidth: 780, logging: false, imageTimeout: 15000, });
const { jsPDF } = window.jspdf; const pdf = new jsPDF('p', 'mm', 'a4'); const pw = 210, ph = 297, mg = 8; const cw = pw - mg * 2; const iw = canvas.width, ih = canvas.height; const ratio = cw / (iw / 3); const sh = (ih / 3) * ratio; const mh = ph - mg * 2; let yo = 0, pg = 0;
while (yo < sh) { if (pg > 0) pdf.addPage(); const sy = (yo / ratio) * 3; const sH = Math.min((mh / ratio) * 3, ih - sy); const dH = Math.min(mh, sh - yo); const sc = document.createElement('canvas'); sc.width = iw; sc.height = sH; sc.getContext('2d').drawImage(canvas, 0, sy, iw, sH, 0, 0, iw, sH); pdf.addImage(sc.toDataURL('image/png'), 'PNG', mg, mg, cw, dH); yo += mh; pg++; }
pdf.save(`PMS_간편진단_${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}.pdf`); } catch (e) { console.error('PDF error:', e); alert('PDF 생성 중 오류가 발생했습니다.\n브라우저 인쇄(Ctrl+P)로 PDF 저장을 이용해주세요.'); }
document.body.removeChild(cl); btn.disabled = false; bt.textContent = 'PDF 리포트 다운로드'; sp.style.display = 'none'; }
function goToSurvey(e) {
const surveyURL = "https://docs.google.com/forms/d/e/1FAIpQLSdJQmx9z0ptpDWm0NmusJb0t5T_6KrUpx7WHPa0rTRjA1JwOA/viewform?usp=publish-editor";
setTimeout(() => window.open(surveyURL, '_blank'), 300); }


