Browse Source

独立答卷题,忽略冲突属性

mingfu 1 month ago
parent
commit
3e044e7b4f

+ 39 - 20
ie-admin/src/main/java/com/ruoyi/web/service/ExamService.java

@@ -98,7 +98,7 @@ public class ExamService {
         aCond.setExamineeId(examineeId);
         Map<Long, LearnAnswer> answerMap = learnAnswerMapper.selectLearnAnswerList(aCond).stream().collect(Collectors.toMap(LearnAnswer::getQuestionId, t -> t));
         LearnPaper learnPaper = learnPaperService.selectLearnPaperById(examinee.getPaperId());
-        List<PaperVO.QuestionSeq> questionList = paperService.loadPaperQuestions(examinee.getPaperId(), answerMap, !examContinue);
+        List<PaperVO.QuestionAnswer> questionList = paperService.loadPaperQuestionAnswers(examinee.getPaperId(), answerMap, !examContinue);
         AnswerSheet answerSheet = buildAnswerSheet(learnPaper, examinee);
         answerSheet.setTotalCount(questionList.size());
         answerSheet.setWrongCount(examinee.getWrongCount());
@@ -119,32 +119,31 @@ public class ExamService {
      */
     @Transactional(rollbackFor = Exception.class)
     public void commitAnswerSheet(AnswerSheet answerSheet) {
+        LearnExaminee exitExaminee = learnExamineeMapper.selectLearnExamineeByExamineeId(answerSheet.getExamineeId());
+        if(null == exitExaminee) {
+            throw new RuntimeException("无此答卷" + answerSheet.getExamineeId());
+        }
         LearnAnswer aCond = new LearnAnswer();
         aCond.setExamineeId(answerSheet.getExamineeId());
         Map<Long, LearnAnswer> answerMap = learnAnswerMapper.selectLearnAnswerList(aCond).stream().collect(Collectors.toMap(LearnAnswer::getQuestionId, t -> t));
-        Map<Long, PaperVO.QuestionSeq> questionMap = paperService.loadPaperQuestions(answerSheet.getPaperId(), answerMap, true).stream().collect(Collectors.toMap(PaperVO.QuestionSeq::getId, t -> t));
+        Map<Long, PaperVO.QuestionAnswer> questionMap = paperService.loadPaperQuestionAnswers(answerSheet.getPaperId(), answerMap, true).stream().collect(Collectors.toMap(PaperVO.QuestionAnswer::getId, t -> t));
 
         List<LearnAnswer> addList = Lists.newArrayList();
         List<LearnAnswer> updateList = Lists.newArrayList();
         Integer wrongCount = 0;
-        for(PaperVO.QuestionSeq question : answerSheet.getQuestions()) {
-            LearnAnswer answer = new LearnAnswer();
-            PaperVO.QuestionSeq exist = questionMap.remove(question.getId());
-            if(null == exist) {
-                answer.setExamineeId(answerSheet.getExamineeId());
-                answer.setStudentId(SecurityUtils.getUserId());
-                answer.setQuestionId(question.getId());
-                answer.setSeq(question.getSeq());
-                answer.setKnowledgeId(answerSheet.getKnowledgeId());
-                addList.add(answer);
+        for(PaperVO.QuestionAnswer question : answerSheet.getQuestions()) {
+            if(CollectionUtils.isEmpty(question.getSubQuestions())) {
+                for(PaperVO.QuestionAnswer sq : question.getSubQuestions()) {
+                    LearnAnswer answer = buildAnswer(answerSheet, questionMap, sq, addList, updateList);
+                    if(!answer.getState().equals(1L)) {
+                        wrongCount++;
+                    }
+                }
             } else {
-                answer.setAnswerId(answerMap.get(question.getId()).getAnswerId());
-                updateList.add(answer);
-            }
-            answer.setAnswer(StringUtils.join(question.getAnswers(), ","));
-            answer.setState(question.getState());
-            if(!answer.getState().equals(1L)) {
-                wrongCount++;
+                LearnAnswer answer = buildAnswer(answerSheet, questionMap, question, addList, updateList);
+                if(!answer.getState().equals(1L)) {
+                    wrongCount++;
+                }
             }
         }
         if(addList.size() > 0) {
@@ -172,6 +171,26 @@ public class ExamService {
         paperMapper.updateLearnPaper(up);
     }
 
+    private LearnAnswer buildAnswer(AnswerSheet answerSheet, Map<Long, PaperVO.QuestionAnswer> questionMap, PaperVO.QuestionAnswer question,
+                             List<LearnAnswer> addList, List<LearnAnswer> updateList) {
+        LearnAnswer answer = new LearnAnswer();
+        PaperVO.QuestionAnswer exist = questionMap.remove(question.getId());
+        if(null == exist) {
+            answer.setExamineeId(answerSheet.getExamineeId());
+            answer.setStudentId(SecurityUtils.getUserId());
+            answer.setQuestionId(question.getId());
+            answer.setSeq(question.getSeq());
+            answer.setKnowledgeId(answerSheet.getKnowledgeId());
+            addList.add(answer);
+        } else {
+            answer.setAnswerId(exist.getAnswerId());
+            updateList.add(answer);
+        }
+        answer.setAnswer(StringUtils.join(question.getAnswers(), ","));
+        answer.setState(question.getState());
+        return answer;
+    }
+
     private AnswerSheet openExaminee(PaperType paperType, Long paperId, Long studentId) {
         LearnPaper paper = paperMapper.selectLearnPaperById(paperId);
 
@@ -250,7 +269,7 @@ public class ExamService {
                 LearnAnswer aCond = new LearnAnswer();
                 aCond.setExamineeId(examinee.getExamineeId());
                 Map<Long, LearnAnswer> answerMap = learnAnswerMapper.selectLearnAnswerList(aCond).stream().collect(Collectors.toMap(LearnAnswer::getQuestionId, t -> t));
-                List<PaperVO.QuestionSeq> questionList = paperService.loadPaperQuestions(examinee.getPaperId(), answerMap, false);
+                List<PaperVO.QuestionAnswer> questionList = paperService.loadPaperQuestionAnswers(examinee.getPaperId(), answerMap, false);
                 AnswerSheet answerSheet = buildAnswerSheet(existPaper, examinee);
                 answerSheet.setQuestions(questionList);
                 answerSheet.setKnowledgeId(existPaper.getRelateId());

+ 33 - 7
ie-admin/src/main/java/com/ruoyi/web/service/PaperService.java

@@ -54,7 +54,7 @@ public class PaperService {
         LearnPaper learnPaper = paperMapper.selectLearnPaperById(paperId);
         PaperVO result = new PaperVO();
         BeanUtils.copyProperties(learnPaper, result);
-        result.setQuestions(loadPaperQuestions(paperId, null, false));
+        result.setQuestions(loadPaperQuestions(paperId));
         return result;
     }
 
@@ -63,13 +63,40 @@ public class PaperService {
      * @param paperId
      * @return
      */
-    public List<PaperVO.QuestionSeq> loadPaperQuestions(Long paperId, Map<Long, LearnAnswer> answerMap, boolean withParse) {
+    public List<PaperVO.QuestionSeq> loadPaperQuestions(Long paperId) {
         List<LearnQuestions> questions = questionsMapper.selectQuestionByPaperId(paperId);
         Map<String, PaperVO.QuestionSeq> gropuMap = Maps.newHashMap();
         List<PaperVO.QuestionSeq> paperQuestionList = Lists.newArrayList();
-        LearnAnswer answer;
         for(LearnQuestions lqs : questions) {
             PaperVO.QuestionSeq qs = new PaperVO.QuestionSeq();
+            BeanUtils.copyProperties(lqs, qs, "options");
+            QuestionType qt = QuestionType.of(lqs.getQtpye());
+            qs.setTypeId(qt.getVal());
+            qs.setType(qt.getTitle());
+            qs.setOptions(getOptions(lqs.getOptionA(), lqs.getOptionB(), lqs.getOptionC(), lqs.getOptionD(), lqs.getOptionE(), lqs.getOptionF(), lqs.getOptionG()));
+            if(StringUtils.isNotBlank(lqs.getTitle0())) { // 大题
+                PaperVO.QuestionSeq qg = gropuMap.get(lqs.getTitle0());
+                if(qg == null) {
+                    qg = new PaperVO.QuestionSeq();
+                    qg.setTitle(lqs.getTitle0());
+                    gropuMap.put(lqs.getTitle0(), qg);
+                    paperQuestionList.add(qg);
+                }
+                qg.getSubQuestions().add(qs);
+            } else {
+                paperQuestionList.add(qs);
+            }
+        }
+        return paperQuestionList;
+    }
+
+    public List<PaperVO.QuestionAnswer> loadPaperQuestionAnswers(Long paperId, Map<Long, LearnAnswer> answerMap, boolean withParse) {
+        List<LearnQuestions> questions = questionsMapper.selectQuestionByPaperId(paperId);
+        Map<String, PaperVO.QuestionAnswer> gropuMap = Maps.newHashMap();
+        List<PaperVO.QuestionAnswer> paperQuestionList = Lists.newArrayList();
+        LearnAnswer answer;
+        for(LearnQuestions lqs : questions) {
+            PaperVO.QuestionAnswer qs = new PaperVO.QuestionAnswer();
             if(!withParse) {
                 BeanUtils.copyProperties(lqs, qs, "options");
             } else {
@@ -77,17 +104,16 @@ public class PaperService {
             }
             QuestionType qt = QuestionType.of(lqs.getQtpye());
             qs.setTypeId(qt.getVal());
-            qs.setType(qt.getTitle());
-            qs.setOptions(getOptions(lqs.getOptionA(), lqs.getOptionB(), lqs.getOptionC(), lqs.getOptionD(), lqs.getOptionE(), lqs.getOptionF(), lqs.getOptionG()));
             if(null != answerMap && null != (answer = answerMap.get(lqs.getId()))) {
+                qs.setAnswerId(answer.getAnswerId());
                 qs.setAnswers(Arrays.asList(answer.getAnswer().split(",")));
                 qs.setState(answer.getState());
                 qs.setIsNotKnow(answer.getState().equals(3L));
             }
             if(StringUtils.isNotBlank(lqs.getTitle0())) { // 大题
-                PaperVO.QuestionSeq qg = gropuMap.get(lqs.getTitle0());
+                PaperVO.QuestionAnswer qg = gropuMap.get(lqs.getTitle0());
                 if(qg == null) {
-                    qg = new PaperVO.QuestionSeq();
+                    qg = new PaperVO.QuestionAnswer();
                     qg.setTitle(lqs.getTitle0());
                     gropuMap.put(lqs.getTitle0(), qg);
                     paperQuestionList.add(qg);

+ 1 - 4
ie-system/src/main/java/com/ruoyi/learn/domain/AnswerSheet.java

@@ -1,10 +1,7 @@
 package com.ruoyi.learn.domain;
 
-import com.alibaba.fastjson2.JSONObject;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.enums.ExamType;
-import com.ruoyi.enums.PaperType;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -52,7 +49,7 @@ public class AnswerSheet {
     @ApiModelProperty("错误题数")
     private Integer wrongCount;
 
-    List<PaperVO.QuestionSeq> questions;
+    List<PaperVO.QuestionAnswer> questions;
 
     @Data
     public static class PaperCond {

+ 52 - 0
ie-system/src/main/java/com/ruoyi/learn/domain/PaperVO.java

@@ -76,4 +76,56 @@ public class PaperVO {
             return 0L;
         }
     }
+
+
+    @Data
+    @ApiModel("试题")
+    public static class QuestionAnswer {
+        private Long answerId;
+        @ApiModelProperty("题ID")
+        private Long id;
+        private String title;
+        private String answer1;
+        @ApiModelProperty("非标准格式答案或含部分过程说明的答案")
+        private String answer2;
+        private String parse;
+        @ApiModelProperty("序号")
+        Integer seq;
+        @ApiModelProperty("考题类型 question_type")
+        Integer typeId;
+
+        @ApiModelProperty("本卷中标记")
+        Boolean isMark;
+        @ApiModelProperty("是否收藏")
+        Boolean isFavorite;
+        @ApiModelProperty("不会做,转State")
+        Boolean isNotKnow;
+        @ApiModelProperty("学生回答")
+        List<String> answers;
+
+        @ApiModelProperty("答题正确状态 0 默认 1正确 2错误 3不会")
+        Long state;
+
+        List<QuestionAnswer> subQuestions;
+
+        public Long getState() {
+            if(null != isNotKnow && isNotKnow) {
+                return 3L;
+            }
+            QuestionType qt = QuestionType.of(this.typeId);
+            if(QuestionType.Single.equals(qt) || QuestionType.Judgment.equals(qt)) {
+                if(CollectionUtils.isEmpty(answers)) {
+                    return 0L;
+                }
+                return answers.get(0).equals(answer1) ? 1L : 2L;
+            } else if(QuestionType.Multiple.equals(qt)) {
+                if(CollectionUtils.isEmpty(answers)) {
+                    return 0L;
+                }
+                List<String> stdAnswers = Arrays.asList(answer1.split(","));
+                return stdAnswers.size() == answers.size() && CollectionUtils.intersection(stdAnswers, answers).size() == answers.size() ? 1L : 2L;
+            }
+            return 0L;
+        }
+    }
 }