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 exams = this.getExamByPaperId(Long.parseLong(paperId)); List users = new ArrayList<>(); if (!exams.isEmpty()) { for (Exam exam : exams) { users.add(exam.getUser()); } } Specification specification = (root, query, criteriaBuilder) -> { List predicates = new ArrayList<>(); predicates.add(criteriaBuilder.equal(root.get("status"), User.Status.VALID)); // 条件2:用户必须拥有学生角色 Join 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 all = userDao.findAll(specification, pageable); List> resultList = new ArrayList<>(); for (User user : all.getContent()) { Map 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 exams = this.getExamByPaperId(Long.parseLong(paperId)); List users = new ArrayList<>(); if (!exams.isEmpty()) { for (Exam exam : exams) { users.add(exam.getUser()); } } Specification specification = (root, query, criteriaBuilder) -> { List 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 all = userDao.findAll(specification, pageable); List> resultList = new ArrayList<>(); for (User user : all.getContent()) { Map 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 getExamByPaperId(Long paperId) { Specification specification = (root, query, criteriaBuilder) -> { List 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 all = examDao.findAll(specification); return all; } @RequestMapping("/list") public Result list(Integer pageNum, Integer pageSize) { Pageable pageable = PageRequest.of(getPageNum(pageNum), pageSize); Specification specification = (root, query, criteriaBuilder) -> { List 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 all = examDao.findAll(pageable); List> resultList = new ArrayList<>(); for (Exam exam : all.getContent()) { Map 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 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 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 specification = (root, query, criteriaBuilder) -> { List 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 all = examDao.findAll(specification); if (all.isEmpty()) { return null; } return all.get(0); } @RequestMapping("/saveAnswer") public Result saveAnswer(@RequestParam @RequestBody Map params) { String jsonData = params.get("json_data").toString(); try { List 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); } }