feat: 班级管理增加分配目标功能,支持批量分配目标给班级所有学员
This commit is contained in:
+76
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user