from sqlalchemy.orm import Session from sqlalchemy import func from model.wl_student_model import Student from model.wl_class_model import Class_ # 你同学写的 from scheme.wl_student_scheme import StudentCreate, StudentUpdate # ---- 学号生成 ---- def generate_stu_no(db: Session, class_id: int, seq: int = None) -> str: #没选班级和班级不存在给不同的提示,前端能直接展示给用户看 if class_id is None: raise ValueError("请先选择班级") #非测试就解除下面5行测试,注释date_str = "20260912" cls = db.query(Class_).filter_by(class_id=class_id).first() if not cls or not cls.start_time: raise ValueError("班级不存在或未设置开班时间") date_str = cls.start_time.strftime("%Y%m%d") # 直接写死一个日期字符串用于测试 # date_str = "20260912" 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) #学生model没有status,先注释 # 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