You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

383 lines
16 KiB
Java

package com.ruoyi.course.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.course.common.R;
import com.ruoyi.course.domain.Classroom;
import com.ruoyi.course.domain.vo.ClassroomQueryVO;
import com.ruoyi.course.service.IClassroomService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* <p>
* 教室信息表 前端控制器
* </p>
*
* @author xu
* @since 2025-12-14
*/
@RestController
@RequestMapping("/course/classroom")
@Tag(name = "教室管理", description = "教室相关的CRUD操作和分配管理")
@Slf4j
public class ClassroomController extends BaseController {
@Autowired
private IClassroomService classroomService;
@Operation(summary = "新增教室", description = "创建一个新的教室")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "新增成功"),
@ApiResponse(responseCode = "500", description = "新增失败")
})
@PostMapping("/add")
public R<Boolean> addClassroom(@RequestBody Classroom classroom) {
// 设置创建时间和更新时间
classroom.setCreateTime(LocalDateTime.now());
classroom.setUpdateTime(LocalDateTime.now());
boolean success = classroomService.save(classroom);
return success ? R.ok(true, "新增成功") : R.error("新增失败");
}
@Operation(summary = "根据ID删除教室", description = "根据教室ID删除教室信息")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "删除成功"),
@ApiResponse(responseCode = "404", description = "教室不存在"),
@ApiResponse(responseCode = "500", description = "删除失败")
})
@DeleteMapping("/delete/{id}")
public R<Boolean> deleteClassroom(
@Parameter(description = "教室ID", required = true, example = "1")
@PathVariable Long id) {
boolean success = classroomService.removeById(id);
return success ? R.ok(true, "删除成功") : R.error("删除失败");
}
@Operation(summary = "批量删除教室", description = "批量删除多个教室")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "批量删除成功"),
@ApiResponse(responseCode = "400", description = "参数错误"),
@ApiResponse(responseCode = "500", description = "批量删除失败")
})
@DeleteMapping("/batchDelete")
public R<Boolean> batchDelete(@RequestBody List<Long> ids) {
if (ids == null || ids.isEmpty()) {
return R.paramError("请选择要删除的数据");
}
boolean success = classroomService.removeByIds(ids);
return success ? R.ok(true, "批量删除成功") : R.error("批量删除失败");
}
@Operation(summary = "修改教室信息", description = "更新教室信息")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "修改成功"),
@ApiResponse(responseCode = "400", description = "ID不能为空"),
@ApiResponse(responseCode = "404", description = "教室不存在"),
@ApiResponse(responseCode = "500", description = "修改失败")
})
@PutMapping("/update")
public R<Boolean> updateClassroom(@RequestBody Classroom classroom) {
if (classroom.getId() == null) {
return R.paramError("ID不能为空");
}
// 设置更新时间
classroom.setUpdateTime(LocalDateTime.now());
boolean success = classroomService.updateById(classroom);
return success ? R.ok(true, "修改成功") : R.error("修改失败");
}
@Operation(summary = "根据ID查询教室", description = "根据教室ID获取教室详细信息")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "查询成功"),
@ApiResponse(responseCode = "404", description = "教室不存在")
})
@GetMapping("/get/{id}")
public R<Classroom> getClassroomById(
@Parameter(description = "教室ID", required = true, example = "1")
@PathVariable Long id) {
Classroom classroom = classroomService.getById(id);
if (classroom == null) {
return R.notFound("教室不存在");
}
return R.ok(classroom, "查询成功");
}
@Operation(summary = "查询所有教室", description = "获取所有教室列表")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "查询成功")
})
@GetMapping("/list")
public TableDataInfo listTeachers() {
startPage();
List<Classroom> list = classroomService.list();
return getDataTable(list);
}
@Operation(summary = "分页查询教室列表", description = "根据条件分页查询教室列表")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "查询成功")
})
@PostMapping("/page")
public R<IPage<Classroom>> pageClassrooms(@RequestBody ClassroomQueryVO queryVO) {
// 创建分页对象
Page<Classroom> page = new Page<>(queryVO.getPageNum(), queryVO.getPageSize());
// 创建查询条件
LambdaQueryWrapper<Classroom> wrapper = new LambdaQueryWrapper<>();
// 添加查询条件(非空判断)
if (StringUtils.hasText(queryVO.getRoomNo())) {
wrapper.like(Classroom::getRoomNo, queryVO.getRoomNo());
}
if (StringUtils.hasText(queryVO.getRoomName())) {
wrapper.like(Classroom::getRoomName, queryVO.getRoomName());
}
if (StringUtils.hasText(queryVO.getRoomType())) {
wrapper.eq(Classroom::getRoomType, queryVO.getRoomType());
}
if (queryVO.getMinCapacity() != null) {
wrapper.ge(Classroom::getCapacity, queryVO.getMinCapacity());
}
if (queryVO.getMaxCapacity() != null) {
wrapper.le(Classroom::getCapacity, queryVO.getMaxCapacity());
}
if (queryVO.getFloor() != null) {
wrapper.eq(Classroom::getFloor, queryVO.getFloor());
}
if (StringUtils.hasText(queryVO.getBuilding())) {
wrapper.eq(Classroom::getBuilding, queryVO.getBuilding());
}
if (queryVO.getIsAvailable() != null) {
wrapper.eq(Classroom::getIsAvailable, queryVO.getIsAvailable());
}
// 按创建时间倒序
wrapper.orderByDesc(Classroom::getCreateTime);
// 执行分页查询
IPage<Classroom> result = classroomService.page(page, wrapper);
return R.ok(result, "查询成功");
}
@Operation(summary = "简单分页查询(无条件)", description = "无条件分页查询教室列表")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "查询成功")
})
@GetMapping("/page")
public R<IPage<Classroom>> simplePage(
@Parameter(description = "页码", required = false, example = "1")
@RequestParam(defaultValue = "1") Integer pageNum,
@Parameter(description = "每页条数", required = false, example = "10")
@RequestParam(defaultValue = "10") Integer pageSize) {
Page<Classroom> page = new Page<>(pageNum, pageSize);
IPage<Classroom> result = classroomService.page(page);
return R.ok(result, "查询成功");
}
@Operation(summary = "统计教室数量", description = "统计教室总数或根据条件统计")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "查询成功")
})
@GetMapping("/count")
public R<Long> countClassrooms(
@Parameter(description = "教室类型", required = false, example = "多媒体教室")
@RequestParam(required = false) String roomType,
@Parameter(description = "教学楼", required = false, example = "主教学楼")
@RequestParam(required = false) String building,
@Parameter(description = "楼层", required = false, example = "3")
@RequestParam(required = false) Integer floor,
@Parameter(description = "可用状态", required = false, example = "1")
@RequestParam(required = false) Integer isAvailable) {
LambdaQueryWrapper<Classroom> wrapper = new LambdaQueryWrapper<>();
if (StringUtils.hasText(roomType)) {
wrapper.eq(Classroom::getRoomType, roomType);
}
if (StringUtils.hasText(building)) {
wrapper.eq(Classroom::getBuilding, building);
}
if (floor != null) {
wrapper.eq(Classroom::getFloor, floor);
}
if (isAvailable != null) {
wrapper.eq(Classroom::getIsAvailable, isAvailable);
}
Long count = classroomService.count(wrapper);
return R.ok(count, "查询成功");
}
@Operation(summary = "根据容量范围查询教室", description = "根据容量范围查询符合条件的教室列表")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "查询成功")
})
@GetMapping("/listByCapacityRange")
public R<List<Classroom>> listByCapacityRange(
@Parameter(description = "最小容量", required = true, example = "30")
@RequestParam Integer minCapacity,
@Parameter(description = "最大容量", required = true, example = "100")
@RequestParam Integer maxCapacity) {
LambdaQueryWrapper<Classroom> wrapper = new LambdaQueryWrapper<>();
wrapper.ge(Classroom::getCapacity, minCapacity);
wrapper.le(Classroom::getCapacity, maxCapacity);
wrapper.orderByDesc(Classroom::getCreateTime);
List<Classroom> list = classroomService.list(wrapper);
return R.ok(list, "查询成功");
}
@Operation(summary = "根据教学楼和楼层查询教室", description = "根据教学楼和楼层组合查询教室列表")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "查询成功")
})
@GetMapping("/listByBuildingAndFloor")
public R<List<Classroom>> listByBuildingAndFloor(
@Parameter(description = "教学楼名称", required = true, example = "主教学楼")
@RequestParam String building,
@Parameter(description = "楼层", required = true, example = "3")
@RequestParam Integer floor) {
LambdaQueryWrapper<Classroom> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Classroom::getBuilding, building);
wrapper.eq(Classroom::getFloor, floor);
wrapper.orderByDesc(Classroom::getCreateTime);
List<Classroom> list = classroomService.list(wrapper);
return R.ok(list, "查询成功");
}
@Operation(summary = "验证班级-教室绑定完整性", description = "验证班级与教室的绑定关系是否完整")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "验证成功")
})
@GetMapping("/validate-assignments")
public Map<String, Object> validateAssignments() {
log.info("调用班级-教室绑定验证接口");
return classroomService.validateClassroomAssignments();
}
@Operation(summary = "自动分配教室给未分配的班级", description = "自动为未分配教室的班级分配教室")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "分配成功")
})
@PostMapping("/auto-assign")
public Map<String, Object> autoAssignClassrooms(
@Parameter(description = "年级", required = false, example = "2023级")
@RequestParam(required = false) String grade) {
log.info("调用自动分配教室接口,年级: {}", grade);
return classroomService.autoAssignClassrooms(grade);
}
@Operation(summary = "手动为班级分配教室", description = "手动为指定班级分配教室")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "分配成功"),
@ApiResponse(responseCode = "400", description = "分配失败")
})
@PostMapping("/assign")
public Map<String, Object> assignClassroom(
@Parameter(description = "班级ID", required = true, example = "1")
@RequestParam Long classId,
@Parameter(description = "教室ID", required = true, example = "1")
@RequestParam Long classroomId) {
log.info("调用手动分配教室接口,班级: {}, 教室: {}", classId, classroomId);
Map<String, Object> result = new java.util.HashMap<>();
try {
boolean success = classroomService.assignClassroomToClass(classId, classroomId);
result.put("success", success);
result.put("message", success ? "分配成功" : "分配失败");
} catch (Exception e) {
result.put("success", false);
result.put("message", e.getMessage());
}
return result;
}
@Operation(summary = "移除班级的教室分配", description = "移除指定班级的教室分配")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "移除成功"),
@ApiResponse(responseCode = "400", description = "移除失败")
})
@PostMapping("/remove-assignment")
public Map<String, Object> removeClassroomAssignment(
@Parameter(description = "班级ID", required = true, example = "1")
@RequestParam Long classId) {
log.info("调用移除教室分配接口,班级: {}", classId);
Map<String, Object> result = new java.util.HashMap<>();
boolean success = classroomService.removeClassroomFromClass(classId);
result.put("success", success);
result.put("message", success ? "移除成功" : "移除失败");
return result;
}
@Operation(summary = "批量分配教室(按年级)", description = "按年级批量分配教室")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "分配成功")
})
@PostMapping("/batch-assign")
public Map<String, Object> batchAssignClassrooms(
@Parameter(description = "年级", required = true, example = "2023级")
@RequestParam String grade,
@Parameter(description = "教室类型", required = true, example = "普通教室")
@RequestParam String roomType) {
log.info("调用批量分配教室接口,年级: {}, 教室类型: {}", grade, roomType);
return classroomService.batchAssignClassroomsByGrade(grade, roomType);
}
@Operation(summary = "获取教室使用统计", description = "获取教室使用情况统计信息")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "查询成功")
})
@GetMapping("/usage-statistics")
public Map<String, Object> getUsageStatistics() {
log.info("调用教室使用统计接口");
return classroomService.getClassroomUsageStatistics();
}
}