Files
drl_2/xuexiao/routes/stop.py
user9994793890 ee860ce0ae Initial commit
2026-05-29 10:28:07 +08:00

96 lines
3.9 KiB
Python

"""停课保号路由"""
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/<int:record_id>', 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()