/** * 班级操行分管理系统 - 操行分管理页JS * * 开发者: Canglan * 版权归属: Sea Network Technology Studio * * 版权所有 © Sea Network Technology Studio */ (function() { 'use strict'; async function loadStudents() { const res = await apiGet('/api/admin/students', {page_size: 1000}); if (res && res.success) { let html = ''; res.data.students.forEach(student => { html += ` ${escapeHtml(student.student_no)} ${escapeHtml(student.name)} ${student.total_points} `; }); if (res.data.students.length === 0) { html = '暂无学生数据'; } document.getElementById('studentList').innerHTML = html; } } function showSinglePointsModal(studentId, studentName) { window.selectedStudentIds = [studentId]; document.getElementById('selectedStudentsCount').innerHTML = `${studentName} (1人)`; document.getElementById('pointsChange').value = ''; document.getElementById('pointsReason').value = ''; document.getElementById('batchPointsModal').style.display = 'flex'; } async function exportMoralityRecords() { showToast('正在导出德育分记录...', 'info'); try { const studentsRes = await apiGet('/api/admin/students', { page_size: 1000 }); if (!studentsRes || !studentsRes.success) { showToast('获取学生列表失败', 'error'); return; } const students = studentsRes.data.students; if (students.length === 0) { showToast('没有找到学生', 'warning'); return; } const historyRes = await apiGet('/api/admin/conduct/history', { page: 1, page_size: 1000 }); if (!historyRes || !historyRes.success) { showToast('获取历史记录失败', 'error'); return; } const allRecords = historyRes.data.records || []; const recordsByStudent = {}; allRecords.forEach(record => { const sid = record.student_id; if (!recordsByStudent[sid]) { recordsByStudent[sid] = []; } recordsByStudent[sid].push(record); }); const studentRecords = []; for (const student of students) { const studentRecords_list = recordsByStudent[student.student_id] || []; const positiveRecords = studentRecords_list.filter(r => r.points_change > 0).map(r => `${r.reason}(+${r.points_change})`); const negativeRecords = studentRecords_list.filter(r => r.points_change < 0).map(r => `${r.reason}(${r.points_change})`); studentRecords.push({ student_no: student.student_no, name: student.name, total_points: student.total_points || 0, positive_history: positiveRecords.join('; '), negative_history: negativeRecords.join('; ') }); } function escapeCsvField(field) { if (field === null || field === undefined) return ''; let str = String(field).replace(/[\r\n]+/g, ' '); str = str.replace(/"/g, '""'); if (/[\,\;\"\s]/.test(str)) { str = '"' + str + '"'; } return str; } let csv = '\uFEFF'; csv += '学号,姓名,分数,加分历史,减分记录\n'; studentRecords.forEach(s => { csv += `${escapeCsvField(s.student_no)},${escapeCsvField(s.name)},${escapeCsvField(s.total_points)},${escapeCsvField(s.positive_history)},${escapeCsvField(s.negative_history)}\n`; }); const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = `德育分记录_${new Date().toISOString().slice(0,10)}.csv`; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); showToast(`导出成功,共${studentRecords.length}名学生`); } catch (err) { showToast('导出失败:' + err.message, 'error'); console.error('导出失败:', err); } } // 宿舍集体加分相关 var dormitoryStudentIds = []; async function showDormitoryPointsModal() { dormitoryStudentIds = []; document.getElementById('dormitorySelect').innerHTML = ''; document.getElementById('dormitoryStudentsGroup').style.display = 'none'; document.getElementById('dormitoryStudentsList').innerHTML = ''; document.getElementById('dormitoryPointsChange').value = ''; document.getElementById('dormitoryPointsReason').value = ''; // 加载宿舍列表 const res = await apiGet('/api/admin/students/dormitories'); if (res && res.success && res.data.dormitories) { const select = document.getElementById('dormitorySelect'); res.data.dormitories.forEach(d => { const option = document.createElement('option'); option.value = d; option.textContent = d; select.appendChild(option); }); } document.getElementById('dormitoryPointsModal').style.display = 'flex'; } async function onDormitorySelected() { const dormitory = document.getElementById('dormitorySelect').value; const studentsGroup = document.getElementById('dormitoryStudentsGroup'); const studentsList = document.getElementById('dormitoryStudentsList'); const studentsCount = document.getElementById('dormitoryStudentsCount'); dormitoryStudentIds = []; studentsList.innerHTML = ''; if (!dormitory) { studentsGroup.style.display = 'none'; return; } // 加载该宿舍的学生 const res = await apiGet('/api/admin/students', { dormitory_number: dormitory, page_size: 1000 }); if (res && res.success && res.data.students) { const students = res.data.students; if (students.length === 0) { studentsList.innerHTML = '

该宿舍暂无学生

'; studentsCount.textContent = ''; } else { students.forEach(s => { dormitoryStudentIds.push(s.student_id); const div = document.createElement('div'); div.style.cssText = 'display: flex; justify-content: space-between; padding: 4px 0; border-bottom: 1px solid var(--border-color);'; div.innerHTML = `${escapeHtml(s.name)}${escapeHtml(s.student_no)}`; studentsList.appendChild(div); }); studentsCount.textContent = `共 ${students.length} 人`; } studentsGroup.style.display = 'block'; } else { studentsList.innerHTML = '

加载失败

'; studentsGroup.style.display = 'block'; } } async function submitDormitoryPoints() { if (dormitoryStudentIds.length === 0) { showToast('该宿舍没有学生', 'warning'); return; } const pointsChange = parseInt(document.getElementById('dormitoryPointsChange').value); const reason = document.getElementById('dormitoryPointsReason').value; if (isNaN(pointsChange) || pointsChange === 0) { showToast('分值不能为0', 'error'); return; } if (!reason.trim()) { showToast('请填写原因', 'error'); return; } const data = { student_ids: dormitoryStudentIds, points_change: pointsChange, reason: reason }; const res = await apiPost('/api/admin/conduct/add', data); if (res && res.success) { showToast(`操作成功: ${res.data.success_count} 人成功`); closeModal('dormitoryPointsModal'); loadStudents(); } else { showToast(res?.message || '操作失败', 'error'); } } loadStudents(); window.loadStudents = loadStudents; window.showSinglePointsModal = showSinglePointsModal; window.exportMoralityRecords = exportMoralityRecords; window.showDormitoryPointsModal = showDormitoryPointsModal; window.onDormitorySelected = onDormitorySelected; window.submitDormitoryPoints = submitDormitoryPoints; })();