from sqlalchemy.orm import Session from sqlalchemy import func from model.wl_student_model import Student # from model.class_ import Class # 你同学写的 from scheme.wl_student_scheme import StudentCreate, StudentUpdate # ---- 学号生成 ---- def generate_stu_no(db: Session, class_id: int, seq: int = None) -> str: cls = db.query(Class).filter_by(id=class_id).first() if not cls or not cls.start_date: raise ValueError("班级不存在或未设置开班时间") date_str = cls.start_date.strftime("%Y%m%d") if seq is None: count = db.query(func.count(Student.stu_id)) \ .filter(Student.class_id == class_id).scalar() or 0 seq = count + 1 return f"{date_str}{seq:03d}" # ---- 增 ---- def create_student(db: Session, data: StudentCreate) -> Student: stu_no = generate_stu_no(db, data.class_id) stu = Student(stu_no=stu_no, **data.model_dump()) db.add(stu) db.commit() db.refresh(stu) return stu # ---- 查(多条件)---- def search_students(db: Session, stu_no=None, stu_name=None, class_id=None, advisor_id=None, status=None): q = db.query(Student).filter(Student.is_deleted == 0) # 若加了逻辑删除字段 if stu_no: q = q.filter(Student.stu_no.like(f"%{stu_no}%")) if stu_name: q = q.filter(Student.stu_name.like(f"%{stu_name}%")) if class_id: q = q.filter(Student.class_id == class_id) if advisor_id: q = q.filter(Student.advisor_id == advisor_id) if status: q = q.filter(Student.status == status) return q.all() def get_student_by_no(db: Session, stu_no: str) -> Student | None: return db.query(Student).filter( Student.stu_no == stu_no, Student.is_deleted == 0 ).first() # ---- 改 ---- def update_student(db: Session, stu_no: str, data: StudentUpdate) -> Student | None: stu = get_student_by_no(db, stu_no) if not stu: return None for k, v in data.model_dump(exclude_unset=True).items(): setattr(stu, k, v) db.commit() db.refresh(stu) return stu # ---- 逻辑删 ---- def delete_student(db: Session, stu_no: str) -> bool: stu = get_student_by_no(db, stu_no) if not stu: return False stu.is_deleted = 1 db.commit() return True