更新学期功能

This commit is contained in:
2026-04-22 02:51:58 +08:00
parent 8f77251910
commit eb49309058
5 changed files with 414 additions and 7 deletions

View File

@@ -127,9 +127,110 @@ class SemesterService:
return {"success": False, "message": f"激活学期失败: {str(e)}"}
@staticmethod
async def archive_semester(
async def update_semester(
semester_id: int,
semester_name: str = None,
start_date: str = None,
end_date: str = None,
operator_id: int = None
) -> Dict[str, Any]:
"""编辑学期信息"""
try:
semester = await SemesterModel.get_by_id(semester_id)
if not semester:
return {"success": False, "message": "学期不存在"}
if semester['is_archived']:
return {"success": False, "message": "已归档的学期不能编辑"}
result = await SemesterModel.update(
semester_id=semester_id,
semester_name=semester_name,
start_date=start_date,
end_date=end_date
)
if result:
logger.info(f"用户[{operator_id}] 编辑了学期: {semester['semester_name']}")
return {"success": True, "message": "学期信息已更新"}
else:
return {"success": False, "message": "更新失败,请检查参数"}
except Exception as e:
logger.error(f"编辑学期失败: {e}")
return {"success": False, "message": f"编辑学期失败: {str(e)}"}
@staticmethod
async def delete_semester(
semester_id: int,
operator_id: int = None
) -> Dict[str, Any]:
"""删除学期"""
try:
semester = await SemesterModel.get_by_id(semester_id)
if not semester:
return {"success": False, "message": "学期不存在"}
# 检查是否有关联归档数据
archive_count = await SemesterModel.count_archives(semester_id)
if archive_count > 0:
return {"success": False, "message": f"该学期有 {archive_count} 条归档数据,无法删除"}
result = await SemesterModel.delete(semester_id)
if result:
logger.info(f"用户[{operator_id}] 删除了学期: {semester['semester_name']}")
return {"success": True, "message": "学期已删除"}
else:
return {"success": False, "message": "删除失败"}
except Exception as e:
logger.error(f"删除学期失败: {e}")
return {"success": False, "message": f"删除学期失败: {str(e)}"}
@staticmethod
async def associate_records(
semester_id: int,
operator_id: int = None
) -> Dict[str, Any]:
"""关联记录到学期"""
try:
semester = await SemesterModel.get_by_id(semester_id)
if not semester:
return {"success": False, "message": "学期不存在"}
if semester['is_archived']:
return {"success": False, "message": "已归档的学期不能关联数据"}
start_date = semester.get('start_date')
if not start_date:
return {"success": False, "message": "学期未设置开始日期,无法关联数据"}
end_date = semester.get('end_date') or datetime.date.today().isoformat()
counts = await SemesterModel.associate_records_by_date_range(
semester_id=semester_id,
start_date=start_date,
end_date=end_date
)
logger.info(
f"用户[{operator_id}] 关联数据到学期: {semester['semester_name']}, "
f"操行分 {counts['conduct']} 条, 考勤 {counts['attendance']}"
)
return {
"success": True,
"message": f"关联完成:操行分 {counts['conduct']} 条,考勤 {counts['attendance']}",
"data": counts
}
except Exception as e:
logger.error(f"关联记录失败: {e}")
return {"success": False, "message": f"关联记录失败: {str(e)}"}
@staticmethod
async def archive_semester(
semester_id: int,
operator_id: int = None,
reset_scores: bool = False
) -> Dict[str, Any]:
"""归档学期"""
try:
@@ -231,6 +332,18 @@ class SemesterService:
# 标记学期为已归档
await SemesterModel.archive(semester_id)
# 归档成功后按需重置学生操行分
if reset_scores:
reset_result = await SemesterService.reset_student_points()
logger.info(
f"用户[{operator_id}] 归档学期: {semester['semester_name']} 并重置学生操行分, "
f"{total_students} 名学生"
)
return {
"success": True,
"message": f"学期归档成功,共归档 {total_students} 名学生数据,已重置学生操行分"
}
logger.info(
f"用户[{operator_id}] 归档了学期: {semester['semester_name']}, "
f"{total_students} 名学生"