优化考勤记录

This commit is contained in:
2026-04-27 01:36:23 +08:00
parent 439c074534
commit 17cc08071c
7 changed files with 119 additions and 47 deletions

View File

@@ -20,7 +20,7 @@ class AttendanceModel:
@staticmethod
async def get_student_records(student_id: int, month: str = None) -> List[Dict[str, Any]]:
sql = """
SELECT attendance_id, date, status, reason, deduction_applied, created_at
SELECT attendance_id, date, slot, status, reason, deduction_applied, created_at
FROM attendance_records
WHERE student_id = %s
"""
@@ -37,7 +37,8 @@ class AttendanceModel:
@staticmethod
async def get_class_records(
date: str = None,
student_id: int = None
student_id: int = None,
slot: str = None
) -> List[Dict[str, Any]]:
sql = """
SELECT ar.*, s.name as student_name, s.student_no
@@ -55,6 +56,10 @@ class AttendanceModel:
sql += " AND ar.student_id = %s"
params.append(student_id)
if slot:
sql += " AND ar.slot = %s"
params.append(slot)
sql += " ORDER BY ar.date DESC, s.student_no"
return await execute_query(sql, tuple(params))
@@ -65,30 +70,31 @@ class AttendanceModel:
date: str,
status: str,
reason: str = None,
recorder_id: int = None
recorder_id: int = None,
slot: str = 'morning'
) -> int:
# 检查是否已存在当天记录
# 检查是否已存在当天同时段记录
existing = await execute_one(
"SELECT attendance_id FROM attendance_records WHERE student_id = %s AND date = %s",
(student_id, date)
"SELECT attendance_id FROM attendance_records WHERE student_id = %s AND date = %s AND slot = %s",
(student_id, date, slot)
)
if existing:
# 更新已有记录
sql = """
UPDATE attendance_records
UPDATE attendance_records
SET status = %s, reason = %s, recorder_id = %s
WHERE student_id = %s AND date = %s
WHERE student_id = %s AND date = %s AND slot = %s
"""
await execute_update(sql, (status, reason, recorder_id, student_id, date))
await execute_update(sql, (status, reason, recorder_id, student_id, date, slot))
return existing["attendance_id"]
else:
# 插入新记录
sql = """
INSERT INTO attendance_records (student_id, date, status, reason, recorder_id)
VALUES (%s, %s, %s, %s, %s)
INSERT INTO attendance_records (student_id, date, slot, status, reason, recorder_id)
VALUES (%s, %s, %s, %s, %s, %s)
"""
return await execute_insert(sql, (student_id, date, status, reason, recorder_id))
return await execute_insert(sql, (student_id, date, slot, status, reason, recorder_id))
@staticmethod
async def mark_deduction_applied(attendance_id: int) -> bool: