From 033d68ee77cb51eb1c146f4cafc756ad95dc309d Mon Sep 17 00:00:00 2001 From: qmstyle Date: Sat, 19 Apr 2025 15:03:17 +0800 Subject: [PATCH] =?UTF-8?q?2025=E5=B9=B44=E6=9C=8819=E6=97=A515:02:59?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exam/controller/ExamController.java | 45 +++++++-- .../online/exam/dao/ExamAnswerDao.java | 13 +++ .../online/exam/entity/ExamAnswer.java | 3 + .../online/exam/service/ExamService.java | 12 +++ .../exam/service/impl/ExamServiceImpl.java | 92 +++++++++++++++++++ 5 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/zhangmeng/online/exam/dao/ExamAnswerDao.java create mode 100644 src/main/java/com/zhangmeng/online/exam/service/ExamService.java create mode 100644 src/main/java/com/zhangmeng/online/exam/service/impl/ExamServiceImpl.java diff --git a/src/main/java/com/zhangmeng/online/exam/controller/ExamController.java b/src/main/java/com/zhangmeng/online/exam/controller/ExamController.java index 7c1da64..56ea6b2 100644 --- a/src/main/java/com/zhangmeng/online/exam/controller/ExamController.java +++ b/src/main/java/com/zhangmeng/online/exam/controller/ExamController.java @@ -5,10 +5,8 @@ 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.Exam; -import com.zhangmeng.online.exam.entity.Paper; -import com.zhangmeng.online.exam.entity.Role; -import com.zhangmeng.online.exam.entity.User; +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; @@ -48,6 +46,9 @@ public class ExamController { @Autowired private UserDao userDao; + @Autowired + private ExamService examService; + @RequestMapping("/user/list") public Result userList(String paperId, Integer pageNum, Integer pageSize) { @@ -109,10 +110,10 @@ public class ExamController { Specification specification = (root, query, criteriaBuilder) -> { List predicates = new ArrayList<>(); - if (!users.isEmpty()){ + 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 { + } else { // 添加一个无效条件,确保查询结果为空 predicates.add(criteriaBuilder.equal(root.get("id"), -1)); } @@ -177,7 +178,7 @@ public class ExamController { 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()); + map.put("status", exam.getStatus() == null ? "" : exam.getStatus().getDesc()); resultList.add(map); } @@ -194,7 +195,7 @@ public class ExamController { String ids = (String) params.get("ids"); if (ids != null && !ids.isEmpty()) { - List idArr = JSONArray.parseArray(ids,String.class); + 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()); @@ -229,4 +230,32 @@ public class ExamController { 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); + } + + + } diff --git a/src/main/java/com/zhangmeng/online/exam/dao/ExamAnswerDao.java b/src/main/java/com/zhangmeng/online/exam/dao/ExamAnswerDao.java new file mode 100644 index 0000000..0c193c6 --- /dev/null +++ b/src/main/java/com/zhangmeng/online/exam/dao/ExamAnswerDao.java @@ -0,0 +1,13 @@ +package com.zhangmeng.online.exam.dao; + +import com.zhangmeng.online.exam.entity.ExamAnswer; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +/** + * @author zm + * @date 2025/4/19 12:19 + * @version: 1.0 + */ +public interface ExamAnswerDao extends JpaRepository, JpaSpecificationExecutor { +} diff --git a/src/main/java/com/zhangmeng/online/exam/entity/ExamAnswer.java b/src/main/java/com/zhangmeng/online/exam/entity/ExamAnswer.java index edbfd0f..62f85b3 100644 --- a/src/main/java/com/zhangmeng/online/exam/entity/ExamAnswer.java +++ b/src/main/java/com/zhangmeng/online/exam/entity/ExamAnswer.java @@ -25,6 +25,9 @@ public class ExamAnswer extends BaseEntity { @ManyToOne private Exam exam; + @ManyToOne + private Paper paper;//试卷 + @ManyToOne private Question question;//问题 diff --git a/src/main/java/com/zhangmeng/online/exam/service/ExamService.java b/src/main/java/com/zhangmeng/online/exam/service/ExamService.java new file mode 100644 index 0000000..396bc80 --- /dev/null +++ b/src/main/java/com/zhangmeng/online/exam/service/ExamService.java @@ -0,0 +1,12 @@ +package com.zhangmeng.online.exam.service; + +import java.util.Map; + +/** + * @author zm + * @date 2025/4/19 12:13 + * @version: 1.0 + */ +public interface ExamService { + void saveAnswer(Map params); +} diff --git a/src/main/java/com/zhangmeng/online/exam/service/impl/ExamServiceImpl.java b/src/main/java/com/zhangmeng/online/exam/service/impl/ExamServiceImpl.java new file mode 100644 index 0000000..86e28b1 --- /dev/null +++ b/src/main/java/com/zhangmeng/online/exam/service/impl/ExamServiceImpl.java @@ -0,0 +1,92 @@ +package com.zhangmeng.online.exam.service.impl; + +import com.zhangmeng.online.exam.dao.*; +import com.zhangmeng.online.exam.entity.*; +import com.zhangmeng.online.exam.service.ExamService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Predicate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * @author zm + * @date 2025/4/19 12:13 + * @version: 1.0 + */ +@Service +public class ExamServiceImpl implements ExamService { + + @Autowired + private ExamDao examDao; + + @Autowired + private QuestionDao questionDao; + + @Autowired + private QuestionOptionDao questionOptionDao; + + @Autowired + private PaperDao paperDao; + + @Autowired + private ExamAnswerDao examAnswerDao; + + + @Override + public void saveAnswer(Map map) { + String option_id = map.get("option_id") == null? "" : (String) map.get("option_id"); + String question_id = map.get("question_id") == null? "" : (String) map.get("question_id"); + String paper_id = map.get("paper_id") == null? "" : String.valueOf( map.get("paper_id").toString()); + String answer_content = map.get("answer_content") == null? "" : (String) map.get("answer_content"); + + Paper paper = this.paperDao.getById(Long.parseLong(paper_id)); + Question question = this.questionDao.getById(Long.parseLong(question_id)); + QuestionOption questionOption = this.questionOptionDao.getById(Long.parseLong(option_id)); + + ExamAnswer examAnswer = null; + + Specification specification = (root, criteriaQuery, criteriaBuilder) -> { + + List predicates = new ArrayList<>(); + + predicates.add(criteriaBuilder.equal(root.get("paper").get("id"), paper.getId())); + predicates.add(criteriaBuilder.equal(root.get("question").get("id"), question.getId())); + + List questionOptionIds = new ArrayList<>(); + questionOptionIds.add(questionOption.getId());// 假设这是包含所有需要查询的 questionOption 的 id 的集合 + + Join join = root.join("questionOptions"); + predicates.add(join.get("id").in(questionOptionIds)); + + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + + }; + + List all = this.examAnswerDao.findAll(specification); + if (!all.isEmpty()) { + examAnswer = all.get(0); + } else { + examAnswer = new ExamAnswer(); + } + + examAnswer.setPaper(paper); + examAnswer.setQuestion(question); + + switch (question.getType()) { + case SINGLE_CHOICE, JUDGMENT -> examAnswer.setQuestionOptions(List.of(questionOption)); + case MULTIPLE_CHOICE -> { + + } + case SHORT_ANSWER -> examAnswer.setAnswer(answer_content); + } + + examAnswerDao.save(examAnswer); + + } +}