98 lines
2.6 KiB
Python
98 lines
2.6 KiB
Python
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 |