115 lines
3.6 KiB
Python
115 lines
3.6 KiB
Python
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": "删除成功"}
|
|
|
|
|
|
|
|
|
|
|