from model.score_model import ScoreRecord # ========== 工具函数:算等级 ========== def calc_level(score): if score is None: return None if score >= 95: return 'A+' if score >= 90: return 'A' if score >= 80: return 'B' if score >= 70: return 'C' if score >= 60: return 'D' return 'E' # ========== 工具函数:算及格 ========== def calc_pass(score): if score is None: return None return 1 if score >= 60 else 0 # ========== 1. 添加成绩 ========== def add_score_dao(o, db): try: # 【业务校验】该学生该课程该序次是否已存在 existing = db.query(ScoreRecord).filter( ScoreRecord.student_id == o['student_id'], ScoreRecord.course_id == o['course_id'], ScoreRecord.exam_order == o['exam_order'], ScoreRecord.is_deleted == 0 ).all() if existing: raise ValueError('该学生该课程该序次成绩已存在') o1 = ScoreRecord(**o) db.add(o1) except: db.rollback() return False else: db.commit() return True # ========== 2. 修改成绩 ========== def update_score_dao(score_id, update_data, db): try: rows = db.query(ScoreRecord).filter( ScoreRecord.score_id == score_id, ScoreRecord.is_deleted == 0 ).update(update_data) except: db.rollback() return False else: db.commit() return rows # ========== 3. 查询成绩(动态条件 + 分页) ========== def get_scores_dao(score_id, student_id, course_id, teacher_id, exam_order, page, page_size, db): q = db.query(ScoreRecord).filter(ScoreRecord.is_deleted == 0) if score_id: q = q.filter(ScoreRecord.score_id == score_id) if student_id: q = q.filter(ScoreRecord.student_id == student_id) if course_id: q = q.filter(ScoreRecord.course_id == course_id) if teacher_id: q = q.filter(ScoreRecord.teacher_id == teacher_id) if exam_order: q = q.filter(ScoreRecord.exam_order == exam_order) r = q.order_by(ScoreRecord.exam_order.asc()) \ .offset((page - 1) * page_size) \ .limit(page_size).all() if r: return [item.to_dict() for item in r] return [] # ========== 4. 删除成绩 ========== def delete_score_dao(score_id, db): try: rows = db.query(ScoreRecord).filter( ScoreRecord.score_id == score_id, ScoreRecord.is_deleted == 0 ).update({'is_deleted': 1}) except: db.rollback() rows = 0 else: db.commit() finally: return rows