import uuid from fastapi import APIRouter, Depends, HTTPException,Query from dao.class_dao import update_class_dao, add_class_dao, get_class_dao from database import get_db from model.class_model import StudentClassIntermediate from schema.class_request import ClassRequest, ClassResponse, TransferRequest from dao.class_dao import Student_delect_Dao from datetime import datetime from model.class_model import Class_info from sqlalchemy import select, func class_api = APIRouter() @class_api.post('',response_model=ClassResponse,summary='班级信息新增接口') def add_orders(cs:ClassRequest,db=Depends(get_db)): d = cs.model_dump() r = add_class_dao( o=d,db=db ) if not r: raise HTTPException(status_code=500,detail='服务器繁忙或班级不存在!') return ClassResponse(totals=1,data=d) # @class_api.delete('/{class_name}/') # def delete_orders(class_name:str,db=Depends(get_db)): # rows= delect_class_dao( class_name=class_name,db=db ) # if rows: # return {'code': 200, 'totals': rows, 'detail': '删除成功'} # raise HTTPException(status_code=500,detail='删除异常,稍后操作!') @class_api.delete("/class_id",summary='班级信息删除接口') async def delete_student(class_id: str, db= Depends(get_db)): target_student = Student_delect_Dao.soft_delete_student(db, class_id) if not target_student: raise HTTPException(status_code=404, detail="班级数据不存在或已删除") # 直接更新软删除标记为1,完成逻辑删除 target_student.is_deleted = 1 r=datetime.now().isoformat() db.commit() return ClassResponse(totals=1,data=r) @class_api.get('',summary='班级信息查询接口') def get_orders(class_name:str,db=Depends(get_db)): r=get_class_dao(class_name,db) if r: return [{"class_id": i.class_id, 'class_name': i.class_name, "class_code": i.class_code, "tags": i.tags, "status":i.status,'create_time':i.create_time,"update_time": i.update_time} for i in r] raise HTTPException(status_code=404,detail='班级不存在!') @class_api.put('/{class_id}',summary='班级信息更新接口') def get_orders(order:ClassRequest,class_id:str,db=Depends(get_db)): d = order.model_dump(exclude_unset=True) r = update_class_dao( class_id=class_id,update_data=d,db=db ) if not r: raise HTTPException(status_code=500, detail='没有更新!') return {'code':200,'totals':r,'detail':'更新成功'} @class_api.get("/classes",summary='班级学生信息分页查询接口') def get_all_classes_with_student_count( page: int = Query(1, ge=1), #page:页码,默认值为1 size: int = Query(10, ge=1, le=100), #size:单页返回数据条数,默认值10,约束范围1~100, db = Depends(get_db) #db:通过依赖注入的方式获取SQLAlchemy的数据库会话实例 ): total = db.scalar(select(func.count(Class_info.class_id)).where(Class_info.is_deleted == 0)) #班级表中所有符合条件的主键数量 offset = (page - 1) * size #计算分页偏移量 class_list = db.execute( select( Class_info.class_name, # 直接统计当前班级的学生数量 ( select(func.count(StudentClassIntermediate.student_id)) .where( StudentClassIntermediate.class_id == Class_info.class_id, StudentClassIntermediate.is_deleted == 0 ) ).label("student_count") ) .where(Class_info.is_deleted == 0) .order_by(Class_info.class_name) .offset(offset).limit(size) ).mappings().all() return { "total_classes": total, "page": page, "size": size, "class_list": class_list } # 同步转班接口 @class_api.patch("/students/{student_id}/transfer",summary='学生转班信息查询接口') def transfer_student( student_id: str, request: TransferRequest, db=Depends(get_db) ): target_class_name = request.target_class_name # 1. 【关键修改】根据班级名称查找班级ID # 注意:这里假设班级名称是唯一的。如果名称不唯一,建议前端传ID或后端增加歧义处理 target_class_res = db.execute( select(Class_info).where( Class_info.class_name == target_class_name, Class_info.is_deleted == 0 ) ) target_class = target_class_res.scalar_one_or_none() if not target_class: raise HTTPException(status_code=404, detail=f"未找到名为 '{target_class_name}' 的班级") # 获取目标班级的ID,用于后续关联 target_class_id = target_class.class_id # 2. 查询学生当前所在的有效班级关联 current_link_res = db.execute( select(StudentClassIntermediate).where( StudentClassIntermediate.student_id == student_id, StudentClassIntermediate.is_deleted == 0 ) ) current_link = current_link_res.scalar_one_or_none() now = datetime.now() # 3. 逻辑处理:如果学生已经在目标班级,直接返回 if current_link and current_link.class_id == target_class_id: return {"message": f"该学生已在 '{target_class_name}' 班级中,无需重复操作"} # 4. 逻辑删除原班级关联 (如果存在) if current_link: current_link.is_deleted = 1 # 标记为已删除 current_link.update_time = now # 更新时间 # 注意:这里不需要 db.add(current_link),因为它是从 session查出来的对象,修改属性后 commit 即可生效 # 5. 新增新班级关联记录 new_link = StudentClassIntermediate( id=str(uuid.uuid4())[:8], # 生成新的主键ID class_id=target_class_id, # 使用刚才查到的目标班级ID student_id=student_id, is_deleted=0, # 标记为有效 create_time=now, update_time=now ) db.add(new_link) # 6. 提交事务 db.commit() return { "message": f"学生 {student_id} 成功转入班级 '{target_class.class_name}'", "new_class_id": target_class_id, "old_class_id": current_link.class_id if current_link else None }