const Course = require('../models/Course'); const Score = require('../models/Score'); const Student = require('../models/Student'); class TeacherService { static async getCourses(teacherId) { return await Course.findByTeacherId(teacherId); } static async getClasses() { return await Course.getClasses(); } static async getTeacherClasses(teacherId) { const sql = `SELECT * FROM classes WHERE teacher_id = ?`; const db = require('../config/database'); return await db.query(sql, [teacherId]); } static async createCourse(teacherId, courseData) { return await Course.create({ ...courseData, teacher_id: teacherId }); } static async updateCourse(teacherId, courseId, courseData) { // Verify ownership const course = await Course.findById(courseId); if (!course || course.teacher_id != teacherId) { throw new Error('无权修改该课程或课程不存在'); } return await Course.update(courseId, courseData); } static async getGrades(teacherId, filters) { if (filters.courseId) { return await Score.findCourseStudentsWithGrades(filters.courseId, teacherId); } else { return await Score.findByTeacher(teacherId, filters); } } static async addScore(teacherId, scoreData) { let { studentId, courseId, score, usual_score, midterm_score, final_score } = scoreData; // 验证学生 const student = await Student.findById(studentId); if (!student) { throw new Error('学生不存在'); } // 如果没有总分但有平时/期中/期末分,尝试计算总分 (30% + 30% + 40%) if ((score === undefined || score === '') && (usual_score || midterm_score || final_score)) { const u = parseFloat(usual_score) || 0; const m = parseFloat(midterm_score) || 0; const f = parseFloat(final_score) || 0; score = (u * 0.3 + m * 0.3 + f * 0.4).toFixed(1); } // 计算绩点和等级 const numericScore = parseFloat(score); let gradePoint = 0; let gradeLevel = 'F'; if (!isNaN(numericScore)) { if (numericScore >= 90) { gradePoint = 4.0; gradeLevel = 'A'; } else if (numericScore >= 85) { gradePoint = 3.7; gradeLevel = 'A-'; } else if (numericScore >= 82) { gradePoint = 3.3; gradeLevel = 'B+'; } else if (numericScore >= 78) { gradePoint = 3.0; gradeLevel = 'B'; } else if (numericScore >= 75) { gradePoint = 2.7; gradeLevel = 'B-'; } else if (numericScore >= 72) { gradePoint = 2.3; gradeLevel = 'C+'; } else if (numericScore >= 68) { gradePoint = 2.0; gradeLevel = 'C'; } else if (numericScore >= 64) { gradePoint = 1.5; gradeLevel = 'C-'; } else if (numericScore >= 60) { gradePoint = 1.0; gradeLevel = 'D'; } } else { gradePoint = null; gradeLevel = null; } const fullScoreData = { ...scoreData, score, // 更新后的总分 teacherId, gradePoint, gradeLevel, usual_score, midterm_score, final_score }; const gradeId = await Score.upsert(fullScoreData); return gradeId; } } module.exports = TeacherService;