"""停课保号路由""" from datetime import datetime from flask import render_template, request, redirect, url_for, flash, session from models import db, Student, Course, StudentAccount, StopRecord from utils import login_required, log_operation, permission_required, export_excel import business_rules as rules def register_routes(app): @app.route('/stops', endpoint='stop_list') @login_required @permission_required('stop_view') def stop_list(): records = StopRecord.query.order_by(StopRecord.created_at.desc()).all() return render_template('stop_list.html', records=records) @app.route('/stops/add', methods=['GET', 'POST'], endpoint='stop_add') @login_required @permission_required('stop_add') def stop_add(): if request.method == 'POST': student_id = request.form.get('student_id') course_id = request.form.get('course_id') start_date_str = request.form.get('start_date') end_date_str = request.form.get('end_date') reason = request.form.get('reason', '') start_date = datetime.strptime(start_date_str, '%Y-%m-%d').date() if start_date_str else None end_date = datetime.strptime(end_date_str, '%Y-%m-%d').date() if end_date_str else None ok, msg = rules.validate_stop_period(start_date, end_date) if not ok: flash(msg, 'danger') return redirect(url_for('stop_add')) account = StudentAccount.query.filter_by( student_id=student_id, course_id=course_id ).first() if not account: flash('未找到该学员的课时账户', 'danger') return redirect(url_for('stop_add')) if account.is_stopped: flash('该学员已在停课保号中', 'danger') return redirect(url_for('stop_add')) account.is_stopped = 1 account.stop_end_date = end_date record = StopRecord( student_id=student_id, course_id=course_id, start_date=start_date, end_date=end_date, reason=reason, operator_id=session.get('user_id'), status=1, ) db.session.add(record) db.session.commit() log_operation('停课保号', f'学员ID:{student_id} 停课至{end_date_str}') flash('停课保号成功', 'success') return redirect(url_for('stop_list')) students = Student.query.filter_by(status=1).all() courses = Course.query.filter_by(status=1).all() return render_template('stop_form.html', students=students, courses=courses) @app.route('/stops/resume/', endpoint='stop_resume') @login_required @permission_required('stop_add') def stop_resume(record_id): from datetime import date as dt_date record = db.session.get(StopRecord, record_id) if record: if record.end_date and record.end_date > dt_date.today(): flash( f'停课尚未结束(至 {record.end_date}),如需提前复课请由管理员确认', 'warning', ) record.status = 0 account = StudentAccount.query.filter_by( student_id=record.student_id, course_id=record.course_id, ).first() if account: account.is_stopped = 0 account.stop_end_date = None db.session.commit() log_operation('复课', f'学员ID:{record.student_id} 复课') flash('复课成功', 'success') return redirect(url_for('stop_list')) @app.route('/stops/export', endpoint='stop_export') @login_required @permission_required('stop_export') def stop_export(): from utils import export_stops as do_export return do_export()