Files
my-springboot-project/src/main/java/top/tqx/demo_1/controller/QuestionController.java

249 lines
12 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package top.tqx.demo_1.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import top.tqx.demo_1.common.PageResult;
import top.tqx.demo_1.common.Result;
import top.tqx.demo_1.dto.QuestionCreateRequest;
import top.tqx.demo_1.dto.QuestionStatsRequest;
import top.tqx.demo_1.dto.QuestionStatsResponse;
import top.tqx.demo_1.dto.QuestionUpdateRequest;
import top.tqx.demo_1.entity.Question;
import top.tqx.demo_1.service.AuthService;
import top.tqx.demo_1.service.QuestionService;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Tag(name = "题目管理", description = "题目的增删改查管理接口")
@RestController
@RequestMapping("/question")
@Slf4j
public class QuestionController extends BaseController {
@Autowired
private QuestionService questionService;
@Autowired
private AuthService authService;
@Operation(summary = "创建题目", description = "创建新的题目记录")
@PostMapping
public Result<Question> createQuestion(@RequestBody QuestionCreateRequest request) {
if (request.getQuestionType() == null || request.getQuestionType().isEmpty()) {
return Result.error(400, "题目类型不能为空");
}
if (request.getDifficulty() == null || request.getDifficulty() < 1 || request.getDifficulty() > 5) {
return Result.error(400, "难度等级必须在1-5之间");
}
if (request.getContent() == null) {
return Result.error(400, "题目内容不能为空");
}
try {
Question question = questionService.createQuestion(request);
log.info("创建题目成功: id={}, questionType={}", question.getId(), question.getQuestionType());
return Result.success("题目创建成功", question);
} catch (Exception e) {
log.error("创建题目失败: {}", e.getMessage(), e);
return Result.error(500, "创建题目失败: " + e.getMessage());
}
}
@Operation(summary = "分页查询题目", description = "根据条件分页查询题目列表")
@GetMapping("/page")
public Result<PageResult<Question>> pageQuestions(
@Parameter(description = "页码", example = "1") @RequestParam(defaultValue = "1") Integer pageNum,
@Parameter(description = "每页大小", example = "10") @RequestParam(defaultValue = "10") Integer pageSize,
@Parameter(description = "题目类型") @RequestParam(required = false) String questionType,
@Parameter(description = "难度等级") @RequestParam(required = false) Integer difficulty,
@Parameter(description = "审核状态") @RequestParam(required = false) String status) {
PageResult<Question> result = questionService.pageQuestions(pageNum, pageSize, questionType, difficulty, status);
return Result.success(result);
}
@Operation(summary = "获取题目详情", description = "根据题目ID获取题目详细信息")
@GetMapping("/{id}")
public Result<Question> getQuestionById(
@Parameter(description = "题目ID") @PathVariable Long id) {
Question question = questionService.getById(id);
if (question == null) {
return Result.error(404, "题目不存在");
}
return Result.success(question);
}
@Operation(summary = "获取待审核题目列表", description = "获取所有待审核的题目")
@GetMapping("/pending")
public Result<List<Question>> getPendingQuestions() {
List<Question> questions = questionService.getPendingQuestions();
return Result.success(questions);
}
@Operation(summary = "更新题目", description = "更新题目信息,支持部分字段更新")
@PutMapping("/{id}")
public Result<Question> updateQuestion(
@Parameter(description = "题目ID(支持Long类型的id或UUID格式的questionId)") @PathVariable String id,
@RequestBody QuestionUpdateRequest request) {
try {
Question existing = null;
if (isNumeric(id)) {
existing = questionService.getById(Long.parseLong(id));
log.info("通过自增ID查询题目: id={}", id);
} else {
LambdaQueryWrapper<Question> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Question::getQuestionId, id);
existing = questionService.getOne(wrapper);
log.info("通过UUID查询题目: questionId={}", id);
}
if (existing == null) {
return Result.error(404, "题目不存在: " + id);
}
Question updated = questionService.updateQuestion(existing.getId(), request);
log.info("更新题目成功: id={}, questionId={}", existing.getId(), existing.getQuestionId());
return Result.success("题目更新成功", updated);
} catch (NumberFormatException e) {
log.error("ID格式错误: {}", id, e);
return Result.error(400, "ID格式错误,请使用数字ID或有效的UUID");
} catch (Exception e) {
log.error("更新题目失败: {}", e.getMessage(), e);
return Result.error(500, "更新题目失败: " + e.getMessage());
}
}
private boolean isNumeric(String str) {
if (str == null || str.isEmpty()) {
return false;
}
try {
Long.parseLong(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
@Operation(summary = "删除题目", description = "根据ID删除题目")
@DeleteMapping("/{id}")
public Result<Void> deleteQuestion(
@Parameter(description = "题目ID") @PathVariable Long id) {
try {
Question existing = questionService.getById(id);
if (existing == null) {
return Result.error(404, "题目不存在");
}
boolean success = questionService.deleteById(id);
if (success) {
log.info("删除题目成功: id={}", id);
return Result.success("题目删除成功");
} else {
return Result.error(500, "删除题目失败");
}
} catch (Exception e) {
log.error("删除题目失败: {}", e.getMessage(), e);
return Result.error(500, "删除题目失败: " + e.getMessage());
}
}
@Operation(summary = "批量删除题目", description = "根据ID列表批量删除题目")
@DeleteMapping("/batch")
public Result<Integer> batchDeleteQuestions(
@Parameter(description = "题目ID列表") @RequestParam String ids) {
try {
List<Long> idList = Arrays.stream(ids.split(","))
.map(String::trim)
.filter(s -> !s.isEmpty())
.map(Long::parseLong)
.collect(Collectors.toList());
if (idList.isEmpty()) {
return Result.error(400, "ID列表不能为空");
}
int deletedCount = questionService.batchDelete(idList);
log.info("批量删除题目成功: count={}", deletedCount);
return Result.success("批量删除成功", deletedCount);
} catch (NumberFormatException e) {
return Result.error(400, "ID格式不正确,请提供逗号分隔的数字ID");
} catch (Exception e) {
log.error("批量删除题目失败: {}", e.getMessage(), e);
return Result.error(500, "批量删除失败: " + e.getMessage());
}
}
@Operation(summary = "审核题目", description = "审核通过或拒绝题目")
@PutMapping("/review/{questionId}")
public Result<Void> reviewQuestion(
@Parameter(description = "题目UUID") @PathVariable String questionId,
@Parameter(description = "审核状态:approved/rejected") @RequestParam String status,
@Parameter(description = "审核评论") @RequestParam(required = false) String reviewerComment) {
if (!"approved".equals(status) && !"rejected".equals(status)) {
return Result.error(400, "审核状态必须是approved或rejected");
}
boolean success = questionService.updateReviewStatus(questionId, status, reviewerComment);
if (success) {
return Result.success("审核操作成功");
} else {
return Result.error(500, "审核失败");
}
}
@Operation(summary = "条件查询题目列表", description = "根据多种条件查询题目,支持按用户权限过滤(本人库、本部门库、公共库)")
@GetMapping("/list")
public Result<List<Question>> listQuestions(
@Parameter(description = "题目类型") @RequestParam(required = false) String questionType,
@Parameter(description = "难度等级") @RequestParam(required = false) Integer difficulty,
@Parameter(description = "审核状态") @RequestParam(required = false) String status,
@Parameter(description = "文档名称") @RequestParam(required = false) String documentName,
@Parameter(description = "返回数量限制") @RequestParam(defaultValue = "100") Integer limit,
HttpServletRequest httpRequest) {
try {
String token = httpRequest.getHeader("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
return Result.error(401, "用户未登录");
}
top.tqx.demo_1.entity.User user = authService.validateToken(token.substring(7));
if (user == null) {
return Result.error(401, "用户未登录");
}
Long userId = user.getId();
Long deptId = user.getDeptId();
Integer userType = user.getUserType();
log.info("条件查询题目列表: userId={}, deptId={}, userType={}, questionType={}, difficulty={}, status={}, documentName={}, limit={}",
userId, deptId, userType, questionType, difficulty, status, documentName, limit);
List<Question> questions = questionService.listQuestions(questionType, difficulty, status, documentName, limit, userId, deptId, userType);
return Result.success(questions);
} catch (Exception e) {
log.error("查询题目列表失败: {}", e.getMessage(), e);
return Result.error(500, "查询失败: " + e.getMessage());
}
}
@Operation(summary = "题目数量统计", description = "按不同维度统计题目数量")
@PostMapping("/stats")
public Result<QuestionStatsResponse> getQuestionStats(@RequestBody QuestionStatsRequest request) {
try {
log.info("题目数量统计请求: deptId={}, fileIds={}, collection={}, questionTypes={}, status={}",
request.getDeptId(), request.getFileIds(), request.getCollection(),
request.getQuestionTypes(), request.getStatus());
QuestionStatsResponse response = questionService.getQuestionStats(request);
return Result.success("统计成功", response);
} catch (Exception e) {
log.error("题目数量统计失败: {}", e.getMessage(), e);
return Result.error(500, "统计失败: " + e.getMessage());
}
}
}