비상벨 프로젝트
완료
프로젝트 설명
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Malgun Gothic', '맑은 고딕', sans-serif;
background: #f5f5f5;
padding: 20px;
}
.container {
max-width: 1800px;
margin: 0 auto;
background: white;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.header {
background: #2c3e50;
color: white;
padding: 30px;
border-bottom: 3px solid #34495e;
}
.header h1 {
font-size: 24px;
font-weight: 600;
margin-bottom: 10px;
letter-spacing: -0.5px;
}
.header-info {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
margin-top: 20px;
padding-top: 20px;
border-top: 1px solid rgba(255,255,255,0.2);
}
.info-item {
display: flex;
flex-direction: column;
}
.info-label {
font-size: 12px;
color: rgba(255,255,255,0.7);
margin-bottom: 5px;
}
.info-value {
font-size: 16px;
font-weight: 600;
}
.summary {
padding: 25px 30px;
background: #ecf0f1;
border-bottom: 1px solid #bdc3c7;
}
.summary-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}
.summary-item {
background: white;
padding: 20px;
border-left: 4px solid #3498db;
box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.summary-label {
font-size: 13px;
color: #7f8c8d;
margin-bottom: 8px;
}
.summary-value {
font-size: 28px;
font-weight: 700;
color: #2c3e50;
}
.summary-unit {
font-size: 14px;
color: #95a5a6;
margin-left: 5px;
}
.gantt-wrapper {
overflow-x: auto;
padding: 30px;
}
.gantt-table {
width: 100%;
border-collapse: collapse;
min-width: 1500px;
}
.gantt-table thead th {
background: #34495e;
color: white;
padding: 15px 10px;
text-align: left;
font-size: 13px;
font-weight: 600;
border: 1px solid #2c3e50;
white-space: nowrap;
}
.gantt-table thead th.timeline-header {
text-align: center;
min-width: 800px;
}
.gantt-table tbody tr {
border-bottom: 1px solid #ecf0f1;
}
.gantt-table tbody tr:hover {
background: #f8f9fa;
}
.gantt-table tbody td {
padding: 12px 10px;
font-size: 13px;
border: 1px solid #ecf0f1;
}
.cell-id {
text-align: center;
font-weight: 600;
color: #34495e;
width: 60px;
}
.cell-task {
min-width: 280px;
font-weight: 500;
color: #2c3e50;
}
.cell-date {
text-align: center;
color: #7f8c8d;
white-space: nowrap;
width: 110px;
}
.cell-duration {
text-align: center;
color: #7f8c8d;
width: 80px;
}
.timeline-cell {
position: relative;
padding: 8px 5px;
min-width: 800px;
}
.timeline-container {
position: relative;
height: 28px;
background: #f8f9fa;
border-radius: 2px;
}
.timeline-bar {
position: absolute;
height: 24px;
top: 2px;
background: #3498db;
border-radius: 2px;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 11px;
font-weight: 600;
border: 1px solid #2980b9;
}
.category-label {
display: inline-block;
padding: 3px 8px;
border-radius: 2px;
font-size: 11px;
font-weight: 600;
margin-left: 8px;
background: #ecf0f1;
color: #7f8c8d;
}
.phase-section {
background: #2c3e50;
color: white;
font-weight: 700;
font-size: 14px;
}
.phase-section td {
padding: 15px 10px;
border: 1px solid #34495e;
}
.footer {
padding: 20px 30px;
background: #ecf0f1;
border-top: 1px solid #bdc3c7;
font-size: 12px;
color: #7f8c8d;
text-align: center;
}
.legend {
padding: 20px 30px;
background: white;
border-bottom: 1px solid #ecf0f1;
}
.legend-title {
font-size: 14px;
font-weight: 600;
color: #2c3e50;
margin-bottom: 12px;
}
.legend-items {
display: flex;
gap: 30px;
flex-wrap: wrap;
}
.legend-item {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
color: #7f8c8d;
}
.legend-color {
width: 24px;
height: 16px;
border-radius: 2px;
border: 1px solid #bdc3c7;
}
@media print {
body {
background: white;
padding: 0;
}
.container {
box-shadow: none;
}
.gantt-table {
page-break-inside: avoid;
}
}
const tasks = [
{ id: 82, name: "경광등 회로도", start: "2025-11-12", end: "2025-11-14", duration: 3, phase: "1단계: 하드웨어 설계" },
{ id: 83, name: "경광등 ARTWORK 제작", start: "2025-11-14", end: "2025-11-18", duration: 5, phase: "1단계: 하드웨어 설계" },
{ id: 76, name: "비상벨 회로도 제작", start: "2025-11-18", end: "2025-11-21", duration: 4, phase: "1단계: 하드웨어 설계" },
{ id: 79, name: "비상벨 ARTWORK 제작", start: "2025-11-21", end: "2025-11-23", duration: 3, phase: "1단계: 하드웨어 설계" },
{ id: 77, name: "메인 장치 회로도 제작", start: "2025-11-23", end: "2025-12-01", duration: 9, phase: "1단계: 하드웨어 설계" },
{ id: 80, name: "메인 장치 ARTWORK 제작", start: "2025-11-30", end: "2025-12-11", duration: 12, phase: "1단계: 하드웨어 설계" },
{ id: 78, name: "보조 장치 회로도 제작", start: "2025-12-10", end: "2025-12-14", duration: 5, phase: "1단계: 하드웨어 설계" },
{ id: 81, name: "보조장치 ARTWORK 제작", start: "2025-12-13", end: "2025-12-17", duration: 5, phase: "1단계: 하드웨어 설계" },
{ id: 75, name: "AUDIO 품질 튜닝", start: "2025-11-12", end: "2025-11-19", duration: 8, phase: "1단계: 소프트웨어 개발" },
{ id: 84, name: "AUDIO STREAMING Firmware", start: "2025-11-19", end: "2025-11-21", duration: 3, phase: "1단계: 소프트웨어 개발" },
{ id: 85, name: "AUDIO SIP 통신 진행", start: "2025-11-21", end: "2025-12-01", duration: 11, phase: "1단계: 소프트웨어 개발" },
{ id: 86, name: "경광등 하우징", start: "2025-11-15", end: "2025-11-17", duration: 3, phase: "1단계: 하우징 설계" },
{ id: 87, name: "비상벨 하우징", start: "2025-11-17", end: "2025-11-19", duration: 3, phase: "1단계: 하우징 설계" },
{ id: 88, name: "메인 장치 하우징", start: "2025-11-19", end: "2025-11-21", duration: 3, phase: "1단계: 하우징 설계" },
{ id: 89, name: "보조장치 하우징", start: "2025-11-21", end: "2025-11-23", duration: 3, phase: "1단계: 하우징 설계" },
{ id: 91, name: "부품 발주", start: "2025-12-18", end: "2025-12-31", duration: 14, phase: "2단계: 조달 및 제조" },
{ id: 90, name: "PCB / SMT", start: "2026-01-01", end: "2026-01-14", duration: 14, phase: "2단계: 조달 및 제조" },
{ id: 92, name: "커스텀 PCB 펌웨어 개발", start: "2026-01-14", end: "2026-02-12", duration: 30, phase: "3단계: 펌웨어 개발" },
{ id: 93, name: "펌웨어 테스트", start: "2026-02-12", end: "2026-02-25", duration: 14, phase: "4단계: 테스트 및 인증" },
{ id: 94, name: "KC 인증 서포트, 펌웨어 디버깅", start: "2026-02-25", end: "2026-03-26", duration: 30, phase: "4단계: 테스트 및 인증" }
];
const projectStart = new Date("2025-11-12");
const projectEnd = new Date("2026-03-26");
const totalDays = Math.ceil((projectEnd - projectStart) / (1000 * 60 * 60 * 24));
function getPosition(date) {
const days = Math.ceil((new Date(date) - projectStart) / (1000 * 60 * 60 * 24));
return (days / totalDays) * 100;
}
function getWidth(startDate, endDate) {
const duration = Math.ceil((new Date(endDate) - new Date(startDate)) / (1000 * 60 * 60 * 24));
return (duration / totalDays) * 100;
}
function formatDate(dateString) {
const date = new Date(dateString);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}.${month}.${day}`;
}
const ganttBody = document.getElementById('gantt-body');
let currentPhase = '';
tasks.forEach(task => {
// 단계 헤더 추가
if (task.phase !== currentPhase) {
const phaseRow = document.createElement('tr');
phaseRow.className = 'phase-section';
phaseRow.innerHTML = `
${task.phase}
`;
ganttBody.appendChild(phaseRow);
currentPhase = task.phase;
}
// 작업 행 추가
const row = document.createElement('tr');
const left = getPosition(task.start);
const width = getWidth(task.start, task.end);
row.innerHTML = `
${task.id}
${task.name}
${formatDate(task.start)}
${formatDate(task.end)}
${task.duration}
`;
ganttBody.appendChild(row);
});
프로젝트 일정표 (간트차트)
프로젝트 기간
2025.11.12 ~ 2026.03.26
총 소요 기간
4.5개월 (135일)
총 작업 수
20개 작업
1단계: 설계 및 개발
15개
2단계: 조달 및 제조
2개
3단계: 펌웨어 개발
1개
4단계: 테스트 및 인증
2개
범례
작업 진행 기간
타임라인 배경
| ID | 작업명 | 시작일 | 종료일 | 기간(일) | 일정 (2025년 11월 ~ 2026년 3월) |
|---|