更新学期功能

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

@@ -137,6 +137,73 @@ class SemesterModel:
GROUP BY hs.student_id, hs.status
"""
return await execute_query(sql, (start_date, end_date))
@staticmethod
async def update(
semester_id: int,
semester_name: str = None,
start_date: str = None,
end_date: str = None
) -> bool:
"""编辑学期信息(仅未归档)"""
sets = []
params = []
if semester_name is not None:
sets.append("semester_name = %s")
params.append(semester_name)
if start_date is not None:
sets.append("start_date = %s")
params.append(start_date)
if end_date is not None:
sets.append("end_date = %s")
params.append(end_date)
if not sets:
return False
params.append(semester_id)
sql = f"UPDATE semesters SET {', '.join(sets)} WHERE semester_id = %s AND is_archived = 0"
result = await execute_update(sql, tuple(params))
return result > 0
@staticmethod
async def delete(semester_id: int) -> bool:
"""删除学期"""
sql = "DELETE FROM semesters WHERE semester_id = %s"
result = await execute_update(sql, (semester_id,))
return result > 0
@staticmethod
async def count_archives(semester_id: int) -> int:
"""统计学期的归档数据数量"""
sql = "SELECT COUNT(*) as cnt FROM semester_archives WHERE semester_id = %s"
result = await execute_one(sql, (semester_id,))
return result['cnt'] if result else 0
@staticmethod
async def associate_records_by_date_range(
semester_id: int,
start_date: str,
end_date: str
) -> Dict[str, int]:
"""按日期范围关联记录到学期"""
# 关联操行分记录created_at 为 TIMESTAMP需包含 end_date 当天)
conduct_sql = """
UPDATE conduct_records
SET semester_id = %s
WHERE semester_id IS NULL
AND created_at BETWEEN %s AND CONCAT(%s, ' 23:59:59')
"""
conduct_count = await execute_update(conduct_sql, (semester_id, start_date, end_date))
# 关联考勤记录
attendance_sql = """
UPDATE attendance_records
SET semester_id = %s
WHERE semester_id IS NULL
AND `date` BETWEEN %s AND %s
"""
attendance_count = await execute_update(attendance_sql, (semester_id, start_date, end_date))
return {"conduct": conduct_count, "attendance": attendance_count}
class SemesterArchiveModel: