21909-2010 โปรแกรมเชิงวัตถุ

🎓 ระบบตรวจสอบการส่งงาน LAB วิชา โปรแกรมเชิงวัตถุ 1/2569

🔬 เลือก LAB -- เลือก LAB --
🏫 เลือกห้อง -- เลือกห้อง --
กำลังโหลดข้อมูล...
📊 ส่งออกรายงานเป็น Excel
📊 เปอร์เซ็นต์การส่งงาน
0%
0 / 0 คน
🚀 ส่งเร็ว (30% แรก - 10 คะแนน)
⚡ ปานกลาง (20% ถัดมา - 8 คะแนน)
🐢 ส่งช้า (ที่เหลือ - 6 คะแนน)
❌ ยังไม่ได้ส่ง
รหัส ชื่อ สกุล สถานะ ไฟล์โค้ด ไฟล์ผลลัพธ์ เวลาส่งงาน ลำดับ คะแนน
`).join('') : '
ไม่มีข้อมูล
'; document.getElementById('mediumList').innerHTML = medium.length > 0 ? medium.map(s => `
#${s.rank} ${s.studentId}
`).join('') : '
ไม่มีข้อมูล
'; document.getElementById('slowList').innerHTML = slow.length > 0 ? slow.map(s => `
#${s.rank} ${s.studentId}
`).join('') : '
ไม่มีข้อมูล
'; document.getElementById('notSubmittedList').innerHTML = notSubmitted.length > 0 ? notSubmitted.map(s => ``).join('') : '
ส่งครบทุกคนแล้ว 🎉
'; } function displayTable(students) { const tbody = document.getElementById('tableBody'); tbody.innerHTML = students.map(s => { const statusIcon = s.submitted ? '' : ''; const codeLink = s.codeFile ? `📥 ดาวน์โหลด` : '-'; const resultLink = s.resultFile ? `📥 ดาวน์โหลด` : '-'; const timestamp = s.timestamp ? new Date(s.timestamp).toLocaleString('th-TH') : '-'; const rank = s.rank ? `#${s.rank}` : '-'; const score = s.submitted ? `${s.score}` : `0`; return ` ${s.studentId} ${statusIcon} ${codeLink} ${resultLink} ${timestamp} ${rank} ${score} `; }).join(''); } function exportToExcel() { const room = document.getElementById('roomSelect').value; if (!room) { alert('กรุณาเลือกห้องก่อนส่งออกรายงาน'); return; } const studentsInRoom = studentsData.filter(s => s.room === room); const allLabs = [...new Set(submissionsData.map(s => s.lab))].sort(); const scoreMap = new Map(); allLabs.forEach(lab => { const filteredSubmissions = submissionsData.filter(s => s.lab === lab && s.room === room ); const scoredSubmissions = calculateScores(filteredSubmissions); scoredSubmissions.forEach(s => { const key = `${s.studentId}_${lab}`; scoreMap.set(key, s.score); }); }); const excelData = studentsInRoom.map((student, index) => { const row = { 'ลำดับ': index + 1, 'รหัส ชื่อ สกุล': student.id }; let totalScore = 0; allLabs.forEach(lab => { const key = `${student.id}_${lab}`; const score = scoreMap.get(key) || 0; row[lab] = score; totalScore += score; }); row['รวม'] = totalScore; return row; }); const wb = XLSX.utils.book_new(); const ws = XLSX.utils.json_to_sheet(excelData); const colWidths = [ { wch: 10 }, { wch: 30 }, ...allLabs.map(() => ({ wch: 15 })), { wch: 10 } ]; ws['!cols'] = colWidths; // ลบอักขระต้องห้ามสำหรับชื่อ Sheet const safeSheetName = room.replace(/[\/\\:*?\[\]]/g, '_'); XLSX.utils.book_append_sheet(wb, ws, safeSheetName); const safeRoom = room.replace(/[\/\\:*?"<>|]/g, '_'); const date = new Date().toISOString().split('T')[0]; const filename = `รายงานการส่งงาน_${safeRoom}_${date}.xlsx`; XLSX.writeFile(wb, filename); } async function init() { try { document.getElementById('loading').style.display = 'block'; document.getElementById('error').style.display = 'none'; await loadStudents(); await loadSubmissions(); populateFilters(); document.getElementById('loading').style.display = 'none'; document.getElementById('exportButton').style.display = 'block'; document.getElementById('labSelect').addEventListener('change', displayData); document.getElementById('roomSelect').addEventListener('change', displayData); } catch (error) { document.getElementById('loading').style.display = 'none'; document.getElementById('error').style.display = 'block'; document.getElementById('error').textContent = 'เกิดข้อผิดพลาดในการโหลดข้อมูล: ' + error.message; console.error('Error:', error); } } init();
แชร์ LINE