v2.5.1更新

This commit is contained in:
2026-05-29 20:16:25 +08:00
parent fe58ee1d23
commit b2c36cab2c
22 changed files with 347 additions and 166 deletions

View File

@@ -224,7 +224,8 @@ class ConductModel:
related_type: str = None,
reason_prefix: str = None,
page: int = 1,
page_size: int = 20
page_size: int = 20,
is_revoked: int = None
) -> Dict[str, Any]:
"""获取分组后的操行分记录(同批次合并)"""
if start_date == "":
@@ -236,9 +237,15 @@ class ConductModel:
if reason_prefix == "":
reason_prefix = None
conditions = ["cr.is_revoked = 0"]
conditions = ["1=1"]
params = []
if is_revoked is not None:
conditions.append("cr.is_revoked = %s")
params.append(1 if is_revoked else 0)
else:
conditions.append("cr.is_revoked = 0")
if student_id:
conditions.append("cr.student_id = %s")
params.append(student_id)
@@ -258,7 +265,7 @@ class ConductModel:
where_clause = " AND ".join(conditions)
count_sql = f"""
SELECT COUNT(DISTINCT CONCAT(cr.points_change, '|', cr.reason, '|', cr.recorder_id, '|', DATE_FORMAT(cr.created_at, '%%Y-%%m-%%d %%H:%%i'))) as total
SELECT COUNT(DISTINCT CONCAT(cr.points_change, '|', cr.reason, '|', cr.recorder_id, '|', DATE_FORMAT(cr.created_at, '%%Y-%%m-%%d %%H:%%i:%%s'))) as total
FROM conduct_records cr
WHERE {where_clause}
"""
@@ -270,11 +277,12 @@ class ConductModel:
cr.recorder_name,
DATE_FORMAT(MIN(cr.created_at), '%%Y-%%m-%%d %%H:%%i:%%s') as created_at,
GROUP_CONCAT(s.name ORDER BY s.student_id SEPARATOR ', ') as student_names,
COUNT(*) as student_count
COUNT(*) as student_count,
MAX(cr.is_revoked) as all_revoked
FROM conduct_records cr
JOIN students s ON cr.student_id = s.student_id
WHERE {where_clause}
GROUP BY cr.points_change, cr.reason, cr.recorder_id, DATE_FORMAT(cr.created_at, '%%Y-%%m-%%d %%H:%%i')
GROUP BY cr.points_change, cr.reason, cr.recorder_id, DATE_FORMAT(cr.created_at, '%%Y-%%m-%%d %%H:%%i:%%s')
ORDER BY MIN(cr.created_at) DESC
LIMIT %s OFFSET %s
"""

View File

@@ -42,11 +42,28 @@ async def list_semesters(request: Request):
@router.get("/active")
async def get_active_semester(request: Request):
"""获取当前活跃学期"""
"""获取当前活跃学期(含当前周数)"""
user = await get_current_user(request)
result = await SemesterService.get_active_semester()
if result["success"]:
return success_response(data=result.get("semester"))
semester = result.get("semester")
if semester and semester.get('start_date'):
from datetime import date, datetime
try:
start = semester['start_date']
if isinstance(start, str):
start_date = datetime.strptime(start, '%Y-%m-%d').date()
else:
start_date = start
today = date.today()
delta = (today - start_date).days
if delta >= 0:
semester['current_week'] = delta // 7 + 1
else:
semester['current_week'] = 0
except Exception:
semester['current_week'] = None
return success_response(data=semester)
else:
return error_response(message=result["message"])

View File

@@ -52,4 +52,4 @@ async def delete_subject(request: Request, subject_id: int):
if not await PermissionChecker.check_can_manage_subjects(user["user_id"]):
return error_response(message="无权限", code=403)
result = await SubjectService.delete_subject(subject_id)
return success_response(message="科目已禁用") if result["success"] else error_response(message=result["message"])
return success_response(message="科目已删除") if result["success"] else error_response(message=result["message"])

View File

@@ -37,6 +37,7 @@ ALL_VERSIONS = {
'2.3': 'v2.3.sql',
'2.4': 'v2.4.sql',
'2.5': 'v2.5.sql',
'2.5.1': 'v2.5.1.sql',
}
# 版本特征标记(按优先级从高到低)

View File

@@ -15,6 +15,7 @@ from datetime import datetime
from models.student import StudentModel
from models.conduct import ConductModel
from models.user import UserModel
from models.semester import SemesterModel
from middleware.permission import PermissionChecker
from config import settings
from utils.logger import get_logger
@@ -86,6 +87,10 @@ class ConductService:
fail_count = 0
details = []
# 自动获取当前活跃学期
active_semester = await SemesterModel.get_active()
semester_id = active_semester['semester_id'] if active_semester else None
for student_id in student_ids:
try:
# 检查学生是否存在
@@ -104,6 +109,17 @@ class ConductService:
related_type=related_type
)
# 自动关联到当前学期
if semester_id and record_id:
try:
from utils.database import execute_update as _exec_update
await _exec_update(
"UPDATE conduct_records SET semester_id = %s WHERE record_id = %s AND semester_id IS NULL",
(semester_id, record_id)
)
except Exception:
pass # 关联失败不影响主流程
# 更新学生总分
await StudentModel.update_total_points(student_id, points_change)
@@ -242,7 +258,8 @@ class ConductService:
related_type=related_type,
reason_prefix=reason_prefix,
page=page,
page_size=page_size
page_size=page_size,
is_revoked=is_revoked
)
records = await ConductModel.get_all_records(

View File

@@ -30,10 +30,23 @@ class SemesterService:
"""获取学期列表"""
try:
semesters = await SemesterModel.get_all()
today = datetime.date.today()
for sem in semesters:
counts = await SemesterModel.count_records_by_semester(sem['semester_id'])
sem['conduct_count'] = counts['conduct_count']
sem['attendance_count'] = counts['attendance_count']
# 计算当前周数(仅活跃学期且有开始日期时)
sem['current_week'] = None
if sem.get('is_active') and sem.get('start_date'):
try:
s_date = sem['start_date']
if isinstance(s_date, str):
s_date = datetime.datetime.strptime(s_date, '%Y-%m-%d').date()
delta = (today - s_date).days
if delta >= 0:
sem['current_week'] = delta // 7 + 1
except (ValueError, TypeError):
pass
return {
"success": True,
"semesters": semesters