from model.all_model import ClassManagement from fastapi import HTTPException from schema.cla_schema import claRequest from datetime import datetime from sqlalchemy.exc import SQLAlchemyError import logging logger = logging.getLogger(__name__) def add_class_dao(c: claRequest, session): try: # ---------- 校验:班级名称不能重复 ---------- # 只查未删除的记录,含义是:已逻辑删除的班级允许重建同名 exists = ( session.query(ClassManagement) .filter(ClassManagement.class_name == c.class_name) .filter(ClassManagement.delete_status == 0) .first() ) if exists: raise HTTPException(400, f"班级 '{c.class_name}' 已存在,不能重复添加") # 班主任和授课教师可以是同一个人,无需校验 data = c.model_dump() d = ClassManagement(**data) session.add(d) session.commit() session.refresh(d) return d except HTTPException: raise except SQLAlchemyError as e: session.rollback() logger.error(f"新增班级失败: {e}") raise HTTPException(400, "输入有误,请重新添加班级!") def get_class_dao(n: int, m: int, session): try: if n < 1 or m < 1: return [] class_list = ( session.query(ClassManagement) .filter(ClassManagement.delete_status == 0) .offset((n - 1) * m) .limit(m) .all() ) return class_list except SQLAlchemyError as e: logger.error(f"查询班级列表失败: {e}") raise HTTPException(status_code=400, detail="查询失败,请稍后重试!") def update_class_dao(class_id: int, req: claRequest, session): try: rows = ( session.query(ClassManagement) .filter(ClassManagement.class_id == class_id) .filter(ClassManagement.delete_status == 0) .update(req.model_dump(exclude_unset=True), synchronize_session=False) ) session.commit() if rows == 0: raise HTTPException(status_code=404, detail="该班级不存在或已被删除") except HTTPException: session.rollback() raise except SQLAlchemyError as e: session.rollback() logger.error(f"更新班级失败: {e}") raise HTTPException(status_code=400, detail="更新失败,请检查参数") return {"code": 200, "msg": "更新成功"} def delete_class_dao(class_id: int, session): try: # 先按 class_id 查记录,再判断状态,从而区分"不存在"和"已删除" obj = ( session.query(ClassManagement) .filter(ClassManagement.class_id == class_id) .first() ) # 情况 1:记录不存在 if obj is None: raise HTTPException(status_code=404, detail="该班级不存在") # 情况 2:记录存在但已删除 → 提示"已删除" if obj.delete_status == 1: raise HTTPException(status_code=400, detail="该班级已被删除,请勿重复操作") # 情况 3:执行逻辑删除 obj.delete_status = 1 obj.delete_time = datetime.now() session.commit() except HTTPException: session.rollback() raise except SQLAlchemyError as e: session.rollback() logger.error(f"删除班级失败: {e}") raise HTTPException(status_code=400, detail="删除异常,请核对后重试!") return {"code": 200, "msg": "删除成功"}