online-exam/src/main/java/com/zhangmeng/online/exam/controller/ExamController.java

262 lines
9.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.zhangmeng.online.exam.controller;
import com.alibaba.fastjson2.JSONArray;
import com.zhangmeng.online.exam.dao.ExamDao;
import com.zhangmeng.online.exam.dao.PaperDao;
import com.zhangmeng.online.exam.dao.UserDao;
import com.zhangmeng.online.exam.dto.Result;
import com.zhangmeng.online.exam.entity.*;
import com.zhangmeng.online.exam.service.ExamService;
import com.zhangmeng.online.exam.utils.UserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.zhangmeng.online.exam.utils.PageUtils.getPageNum;
/**
* @author zm
* @date 2025/4/17 16:24
* @version: 1.0
*/
@RestController
@RequestMapping("/exam")
public class ExamController {
@Autowired
private ExamDao examDao;
@Autowired
private PaperDao paperDao;
@Autowired
private UserDao userDao;
@Autowired
private ExamService examService;
@RequestMapping("/user/list")
public Result userList(String paperId, Integer pageNum, Integer pageSize) {
List<Exam> exams = this.getExamByPaperId(Long.parseLong(paperId));
List<User> users = new ArrayList<>();
if (!exams.isEmpty()) {
for (Exam exam : exams) {
users.add(exam.getUser());
}
}
Specification<User> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal(root.get("status"), User.Status.VALID));
// 条件2用户必须拥有学生角色
Join<User, Role> roleJoin = root.join("roles"); // 关联用户和角色表
predicates.add(criteriaBuilder.equal(roleJoin.get("type"), Role.Type.STUDENT));
// 条件3用户不能是已经参加过该试卷的学生
if (!users.isEmpty()) {
predicates.add(criteriaBuilder.not(root.get("id").in(users.stream().map(User::getId).toList())));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
Pageable pageable = PageRequest.of(getPageNum(pageNum), pageSize);
Page<User> all = userDao.findAll(specification, pageable);
List<Map<String, Object>> resultList = new ArrayList<>();
for (User user : all.getContent()) {
Map<String, Object> map = new HashMap<>();
map.put("id", user.getId());
map.put("username", user.getUsername());
map.put("email", user.getEmail());
map.put("phone", user.getPhone());
map.put("type", user.getRoles().stream().toList().get(0).getType().getDesc());
resultList.add(map);
}
// 处理查询结果并返回
return Result.success(pageNum, pageSize, all.getTotalElements(), resultList);
}
@RequestMapping("/user/choose/list")
public Result userChooseList(String paperId, Integer pageNum, Integer pageSize) {
List<Exam> exams = this.getExamByPaperId(Long.parseLong(paperId));
List<User> users = new ArrayList<>();
if (!exams.isEmpty()) {
for (Exam exam : exams) {
users.add(exam.getUser());
}
}
Specification<User> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if (!users.isEmpty()) {
predicates.add(criteriaBuilder.in(root.get("id")).value(users.stream().map(User::getId).toList()));
predicates.add(criteriaBuilder.equal(root.get("status"), User.Status.VALID));
} else {
// 添加一个无效条件,确保查询结果为空
predicates.add(criteriaBuilder.equal(root.get("id"), -1));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
Pageable pageable = PageRequest.of(getPageNum(pageNum), pageSize);
Page<User> all = userDao.findAll(specification, pageable);
List<Map<String, Object>> resultList = new ArrayList<>();
for (User user : all.getContent()) {
Map<String, Object> map = new HashMap<>();
map.put("id", user.getId());
map.put("username", user.getUsername());
map.put("email", user.getEmail());
map.put("phone", user.getPhone());
map.put("type", user.getRoles().stream().toList().get(0).getType().getDesc());
resultList.add(map);
}
// 处理查询结果并返回
return Result.success(pageNum, pageSize, all.getTotalElements(), resultList);
}
private List<Exam> getExamByPaperId(Long paperId) {
Specification<Exam> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if (paperId != null) {
predicates.add(criteriaBuilder.equal(root.get("paper").get("id"), paperId));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
List<Exam> all = examDao.findAll(specification);
return all;
}
@RequestMapping("/list")
public Result list(Integer pageNum, Integer pageSize) {
Pageable pageable = PageRequest.of(getPageNum(pageNum), pageSize);
Specification<Exam> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
Long userId = UserUtils.getCurrentUserId();
if (userId != null) {
predicates.add(criteriaBuilder.equal(root.get("user").get("id"), userId));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
Page<Exam> all = examDao.findAll(pageable);
List<Map<String, Object>> resultList = new ArrayList<>();
for (Exam exam : all.getContent()) {
Map<String, Object> map = new HashMap<>();
Paper paper = exam.getPaper();
map.put("id", exam.getId());
map.put("paperName", paper.getName());
map.put("paperId", paper.getId());
map.put("examTime", paper.getExamTime());
map.put("subjectName", paper.getSubject().getName());
map.put("score", paper.getTotalScore());
map.put("status", exam.getStatus() == null ? "" : exam.getStatus().getDesc());
resultList.add(map);
}
// 处理查询结果并返回
return Result.success(pageNum, pageSize, all.getTotalElements(), resultList);
}
@RequestMapping("/choosePaper/save")
public Result choosePaperSave(@RequestParam @RequestBody Map<String, Object> params) {
String id = (String) params.get("id");
Paper paper = this.paperDao.getById(Long.parseLong(id));
String ids = (String) params.get("ids");
if (ids != null && !ids.isEmpty()) {
List<String> idArr = JSONArray.parseArray(ids, String.class);
for (String userId : idArr) {
User user = userDao.getById(Long.parseLong(userId));
Exam exam = this.getExamByPaperIdAndUserId(paper.getId(), user.getId());
if (exam == null) {
exam = new Exam();
exam.setPaper(paper);
exam.setUser(user);
examDao.save(exam);
}
}
}
return Result.success(null);
}
private Exam getExamByPaperIdAndUserId(Long paperId, Long userId) {
Specification<Exam> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if (userId != null) {
predicates.add(criteriaBuilder.equal(root.get("user").get("id"), userId));
}
if (paperId != null) {
predicates.add(criteriaBuilder.equal(root.get("paper").get("id"), paperId));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
List<Exam> all = examDao.findAll(specification);
if (all.isEmpty()) {
return null;
}
return all.get(0);
}
@RequestMapping("/saveAnswer")
public Result saveAnswer(@RequestParam @RequestBody Map<String, Object> params) {
String jsonData = params.get("json_data").toString();
try {
List<Map> maps = JSONArray.parseArray(jsonData, Map.class);
// 如果解析成功,继续处理 maps
for (Map map : maps) {
this.examService.saveAnswer(map);
}
} catch (com.alibaba.fastjson2.JSONException e) {
// 处理 jsonData 格式不正确的情况
return Result.error("jsonData 格式不正确,请提供有效的 JSON 数据。");
} catch (Exception e) {
// 处理其他未知错误的情况
return Result.error("发生未知错误,请联系系统管理员。");
}
return Result.success(null);
}
}