21909-1012 ระบบฐานข้อมูลสำหรับงาน IoT
🎓 ระบบตรวจสอบการส่งงาน LAB วิชาฐานข้อมูลสำหรับงาน IOT 1/2569
🔬 เลือก LAB
-- เลือก LAB --
🏫 เลือกห้อง
-- เลือกห้อง --
กำลังโหลดข้อมูล...
📊 ส่งออกรายงานเป็น Excel
📊 เปอร์เซ็นต์การส่งงาน
0%
0 / 0 คน
🚀 ส่งเร็ว (30% แรก - 10 คะแนน)
⚡ ปานกลาง (20% ถัดมา - 8 คะแนน)
🐢 ส่งช้า (ที่เหลือ - 6 คะแนน)
❌ ยังไม่ได้ส่ง
| รหัส ชื่อ สกุล | สถานะ | ไฟล์โค้ด | ไฟล์ผลลัพธ์ | เวลาส่งงาน | ลำดับ | คะแนน |
|---|
ไม่มีข้อมูล
';
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 => `${s.studentId}
`).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();