96 lines
3.9 KiB
Python
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()
|