feat: 班级管理增加分配目标功能,支持批量分配目标给班级所有学员

This commit is contained in:
hmo
2026-04-24 09:24:24 +08:00
parent 8e0f6ec46d
commit 070533326a
4 changed files with 272 additions and 1 deletions
+76 -1
View File
@@ -1,8 +1,9 @@
# 班级管理路由
from flask import request, jsonify, render_template, session
from datetime import datetime, timedelta
from app.routes import main_bp
from app.models import db, Class, Student
from app.models import db, Class, Student, StudentGoal, Goal
from app.routes.auth import login_required_json, admin_required
import logging
@@ -149,3 +150,77 @@ def api_classes_assign(class_id):
db.session.rollback()
logger.error(f"分配学员失败: {str(e)}")
return jsonify({"error": "操作失败,请稍后重试", "code": "SERVER_ERROR"}), 500
@main_bp.route("/api/classes/<int:class_id>/goals", methods=["POST"])
@login_required_json
def api_classes_assign_goals(class_id):
"""批量分配目标给班级所有学员"""
cls = Class.query.get_or_404(class_id)
data = request.get_json()
goal_id = data.get("goal_id")
assessment_days = data.get("assessment_days")
assessment_date = data.get("assessment_date")
start_date = data.get("start_date")
start_now = data.get("start_now", True)
if not goal_id:
return jsonify({"error": "请选择目标", "code": "VALIDATION_ERROR"}), 400
if not assessment_days and not assessment_date:
return jsonify({"error": "请选择评估方式", "code": "VALIDATION_ERROR"}), 400
# 检查目标是否存在
goal = Goal.query.get(goal_id)
if not goal:
return jsonify({"error": "目标不存在", "code": "NOT_FOUND"}), 404
# 获取班级所有学员
students = Student.query.filter_by(class_id=class_id).all()
if not students:
return jsonify({"error": "班级没有学员", "code": "NO_STUDENTS"}), 400
# 处理评估日期
final_assessment_date = None
if assessment_date:
final_assessment_date = datetime.fromisoformat(assessment_date)
elif assessment_days:
final_assessment_date = datetime.now() + timedelta(days=int(assessment_days))
# 处理开始日期
final_start_date = None
if start_date:
final_start_date = datetime.fromisoformat(start_date)
elif start_now:
final_start_date = datetime.now()
# 批量创建 StudentGoal
assigned_count = 0
skipped = []
for student in students:
# 检查是否已分配
existing = StudentGoal.query.filter_by(student_id=student.id, goal_id=goal_id).first()
if existing:
skipped.append(student.name)
continue
record = StudentGoal(
student_id=student.id,
goal_id=goal_id,
start_date=final_start_date,
assessment_date=final_assessment_date
)
db.session.add(record)
assigned_count += 1
try:
db.session.commit()
result = {"message": f"成功分配 {assigned_count} 个学员", "assigned": assigned_count}
if skipped:
result["skipped"] = skipped
result["skipped_count"] = len(skipped)
return jsonify(result)
except Exception as e:
db.session.rollback()
logger.error(f"分配目标失败: {str(e)}")
return jsonify({"error": "操作失败,请稍后重试", "code": "SERVER_ERROR"}), 500