v2.5.1更新
This commit is contained in:
@@ -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
|
||||
"""
|
||||
|
||||
@@ -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"])
|
||||
|
||||
|
||||
@@ -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"])
|
||||
@@ -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',
|
||||
}
|
||||
|
||||
# 版本特征标记(按优先级从高到低)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user