瀏覽代碼

刷题时,错题记录

mingfu 1 月之前
父節點
當前提交
27b8e1bf39

+ 85 - 24
ie-admin/src/main/java/com/ruoyi/web/service/ExamService.java

@@ -15,7 +15,7 @@ import com.ruoyi.learn.domain.*;
 import com.ruoyi.learn.mapper.*;
 import com.ruoyi.learn.service.ILearnPaperService;
 import com.ruoyi.learn.service.ILearnPlanService;
-import com.ruoyi.learn.service.impl.LearnPlanServiceImpl;
+import com.ruoyi.mxjb.domain.MxjbContants;
 import com.ruoyi.system.service.ISysUserService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -40,12 +40,14 @@ public class ExamService {
     private final LearnPaperMapper paperMapper;
     private final LearnKnowledgeTreeMapper knowledgeTreeMapper;
     private final LearnExamineeMapper examineeMapper;
+    private final LearnWrongBookMapper wrongBookMapper;
+    private final LearnWrongDetailMapper wrongDetailMapper;
     private final ILearnPaperService learnPaperService;
     private final PaperService paperService;
     private final IAMarjorPlanService marjorPlanService;
     private final ISysUserService sysUserService;
 
-    public ExamService(LearnPaperMapper paperMapper, LearnKnowledgeTreeMapper knowledgeTreeMapper, LearnExamineeMapper examineeMapper, ILearnPaperService learnPaperService, PaperService paperService, IAMarjorPlanService marjorPlanService, LearnAnswerMapper learnAnswerMapper, LearnExamineeMapper learnExamineeMapper, ISysUserService sysUserService, LearnStudentMapper learnStudentMapper, ILearnPlanService learnPlanService, LearnQuestionsMapper learnQuestionsMapper) {
+    public ExamService(LearnPaperMapper paperMapper, LearnKnowledgeTreeMapper knowledgeTreeMapper, LearnExamineeMapper examineeMapper, ILearnPaperService learnPaperService, PaperService paperService, IAMarjorPlanService marjorPlanService, LearnAnswerMapper learnAnswerMapper, LearnExamineeMapper learnExamineeMapper, ISysUserService sysUserService, LearnStudentMapper learnStudentMapper, ILearnPlanService learnPlanService, LearnQuestionsMapper learnQuestionsMapper, LearnWrongBookMapper wrongBookMapper, LearnWrongDetailMapper wrongDetailMapper) {
         this.paperMapper = paperMapper;
         this.knowledgeTreeMapper = knowledgeTreeMapper;
         this.examineeMapper = examineeMapper;
@@ -58,6 +60,8 @@ public class ExamService {
         this.learnStudentMapper = learnStudentMapper;
         this.learnPlanService = learnPlanService;
         this.learnQuestionsMapper = learnQuestionsMapper;
+        this.wrongBookMapper = wrongBookMapper;
+        this.wrongDetailMapper = wrongDetailMapper;
     }
 
     /**
@@ -127,32 +131,30 @@ public class ExamService {
         Map<Long, LearnAnswer> answerMap = learnAnswerMapper.selectLearnAnswerList(aCond).stream().collect(Collectors.toMap(LearnAnswer::getQuestionId, t -> t));
         Map<Long, PaperVO.QuestionAnswer> questionMap = paperService.loadPaperQuestionAnswers(null, exitExaminee.getPaperId(), answerMap, true).stream().collect(Collectors.toMap(PaperVO.QuestionAnswer::getId, t -> t));
 
-        List<LearnAnswer> addList = Lists.newArrayList();
-        List<LearnAnswer> updateList = Lists.newArrayList();
+        List<LearnAnswer> answersList = Lists.newArrayList();
         Integer wrongCount = 0;
         for(PaperVO.QuestionAnswer question : answerSheet.getQuestions()) {
             if(CollectionUtils.isNotEmpty(question.getSubQuestions())) {
                 for(PaperVO.QuestionAnswer sq : question.getSubQuestions()) {
-                    LearnAnswer answer = buildAnswer(answerSheet, questionMap, sq, addList, updateList);
-                    if(answerSheet.getIsDone() && !answer.getState().equals(1L)) {
+                    LearnAnswer answer = buildAnswer(answerSheet, questionMap, sq, answersList);
+                    if(answerSheet.getIsDone() && !answer.getState().equals(1)) {
                         wrongCount++;
                     }
                 }
             } else {
-                LearnAnswer answer = buildAnswer(answerSheet, questionMap, question, addList, updateList);
-                if(answerSheet.getIsDone() && !answer.getState().equals(1L)) {
+                LearnAnswer answer = buildAnswer(answerSheet, questionMap, question, answersList);
+                if(answerSheet.getIsDone() && !answer.getState().equals(1)) {
                     wrongCount++;
                 }
             }
         }
-        if(addList.size() > 0) {
-            addList.stream().forEach(t -> {
-                learnAnswerMapper.insertLearnAnswer(t);
-            });
-        }
-        if(updateList.size() > 0) {
-            updateList.stream().forEach(t -> {
-                learnAnswerMapper.updateLearnAnswer(t);
+        if(answersList.size() > 0) {
+            answersList.stream().forEach(t -> {
+                if(null == t.getAnswerId()) {
+                    learnAnswerMapper.insertLearnAnswer(t);
+                } else {
+                    learnAnswerMapper.updateLearnAnswer(t);
+                }
             });
         }
         LearnExaminee upExaminee = new LearnExaminee();
@@ -173,29 +175,88 @@ public class ExamService {
 
             if(PaperType.Practice.getVal().equals(exitExaminee.getPaperType())) {
                 learnPlanService.updateLearnPlan(exitExaminee.getStudentId());
+                calculateWrongAnswers(exitExaminee, questionMap, answersList, PaperType.Practice.name());
             }
         }
     }
 
+    public Set<Integer> invalidStatusSet = Sets.newHashSet(2, 3);
+    public void  calculateWrongAnswers(LearnExaminee examinee, Map<Long, PaperVO.QuestionAnswer> questionMap, List<LearnAnswer> answersList, String source) {
+        if (CollectionUtils.isEmpty(answersList)){
+            return;
+        }
+        answersList.forEach(t -> {
+            if (invalidStatusSet.contains(t.getState())) {
+                LearnWrongBook wrongBookCond = new LearnWrongBook();
+                wrongBookCond.setStudentId(examinee.getStudentId());
+                wrongBookCond.setQuestionId(t.getQuestionId());
+                PaperVO.QuestionAnswer stdAnswer = questionMap.get(t.getQuestionId());
+                wrongBookCond.setKnownledgeId(stdAnswer.getKnowledgeId());
+                List<LearnWrongBook> wrongBookList = wrongBookMapper.selectLearnWrongBookList(wrongBookCond);
+                if (CollectionUtils.isNotEmpty(wrongBookList)) {
+                    LearnWrongBook wrongBook = wrongBookList.get(0);
+                    if (null == wrongBook.getWrongCount()) {
+                        wrongBook.setWrongCount(0L);
+                    }
+                    if (null == wrongBook.getTotalCount()) {
+                        wrongBook.setTotalCount(0L);
+                    }
+                    wrongBookCond.setWrongId(wrongBook.getWrongId());
+                    wrongBookCond.setStudentId(null);
+                    wrongBookCond.setQuestionId(null);
+                    wrongBookCond.setWrongCount(wrongBook.getWrongCount() + 1);
+                    wrongBookCond.setTotalCount(wrongBook.getTotalCount() + 1);
+                } else {
+                    wrongBookCond.setAnswer1(stdAnswer.getAnswer1());
+                    wrongBookCond.setAnswer2(stdAnswer.getAnswer2());
+                    // wrongBookCond.setSubjectId(stdAnswer.getSubjectId());
+                    wrongBookCond.setRightCount(0L);
+                    wrongBookCond.setWrongCount(1L);
+                    wrongBookCond.setTotalCount(1L);
+                    // wrongBookCond.setScoreTotal(standard.getScoreTotal());
+                }
+                // wrongBookCond.setKnownledgeId(standard.getKnowledgeId());
+                wrongBookCond.setPaperId(examinee.getPaperId());
+                wrongBookCond.setScore(t.getScore());
+                wrongBookCond.setSource(source);
+                wrongBookCond.setAnswers(t.getAnswer());
+                wrongBookCond.setState(MxjbContants.QuestionScoreWrong);
+                if(null == wrongBookCond.getWrongId()) {
+                    wrongBookMapper.insertLearnWrongBook(wrongBookCond);
+                } else {
+                    wrongBookMapper.insertLearnWrongBook(wrongBookCond);
+                }
+                LearnWrongDetail wrongDetail = new LearnWrongDetail();
+                wrongDetail.setWrongId(wrongBookCond.getWrongId());
+                wrongDetail.setCreatedTime(new Date());
+                wrongDetail.setKnownledgeId(stdAnswer.getKnowledgeId());
+                wrongDetail.setSource(wrongBookCond.getSource());
+                wrongDetail.setExamineeId(examinee.getExamineeId());
+                wrongDetail.setStudentId(examinee.getStudentId());
+                wrongDetail.setPaperId(examinee.getPaperId());
+                wrongDetailMapper.insertLearnWrongDetail(wrongDetail);
+            }
+        });
+    }
+
     private LearnAnswer buildAnswer(AnswerSheet answerSheet, Map<Long, PaperVO.QuestionAnswer> questionMap, PaperVO.QuestionAnswer question,
-                             List<LearnAnswer> addList, List<LearnAnswer> updateList) {
+                             List<LearnAnswer> answerList) {
         LearnAnswer answer = new LearnAnswer();
-        PaperVO.QuestionAnswer stdWidhAnswer = questionMap.remove(question.getId());
-        if(null == stdWidhAnswer.getAnswerId()) {
+        PaperVO.QuestionAnswer stdAnswer = questionMap.get(question.getId());
+        if(null == stdAnswer.getAnswerId()) {
             answer.setExamineeId(answerSheet.getExamineeId());
             answer.setStudentId(SecurityUtils.getUserId());
             answer.setQuestionId(question.getId());
             answer.setSeq(question.getSeq());
-            answer.setKnowledgeId(answerSheet.getKnowledgeId());
-            addList.add(answer);
+            answer.setKnowledgeId(stdAnswer.getKnowledgeId());
         } else {
-            answer.setAnswerId(stdWidhAnswer.getAnswerId());
-            updateList.add(answer);
+            answer.setAnswerId(stdAnswer.getAnswerId());
         }
+        answerList.add(answer);
         answer.setAnswer(StringUtils.join(question.getAnswers(), ","));
         answer.setMark(null != question.getIsMark() && question.getIsMark());
         answer.setNotKnow(null != question.getIsNotKnow() && question.getIsNotKnow());
-        answer.setState(question.calcState(stdWidhAnswer, answerSheet.getIsDone()));
+        answer.setState(question.calcState(stdAnswer, answerSheet.getIsDone()));
         return answer;
     }
 

+ 4 - 3
ie-admin/src/main/java/com/ruoyi/web/service/PaperService.java

@@ -277,13 +277,13 @@ public class PaperService {
                     qCond.setId(studentId);
                     qCond.setNumber(ktc.assign > 500 ? (long) random.nextInt(ktc.exclAssign.intValue() - 500) :  0L);
                     List<LearnQuestions> questions = questionsMapper.selectQuestionsForPaper(qCond);
-                    addRandomList(questions, random, paperDef.getTotal(), ktc.exclAssign, typeDef.getScore(), existQuestionIdSet, pqList);
+                    addRandomList(knowId, questions, random, paperDef.getTotal(), ktc.exclAssign, typeDef.getScore(), existQuestionIdSet, pqList);
                 }
                 if(ktc.assign > 0L) {
                     qCond.setId(null);
                     qCond.setNumber(ktc.assign > 500 ? (long) random.nextInt(ktc.assign.intValue() - 500) :  0L);
                     List<LearnQuestions> questions = questionsMapper.selectQuestionsForPaper(qCond);
-                    addRandomList(questions, random, paperDef.getTotal(), ktc.exclAssign, typeDef.getScore(), existQuestionIdSet, pqList);
+                    addRandomList(knowId, questions, random, paperDef.getTotal(), ktc.exclAssign, typeDef.getScore(), existQuestionIdSet, pqList);
                 }
 
             }
@@ -294,12 +294,13 @@ public class PaperService {
         return pqList;
     }
 
-    private void addRandomList(List<LearnQuestions> questions, Random random, Long totalCount, Long count, Integer score, Set<Long> existQuestionIdSet, List<LearnPaperQuestion> pqList) {
+    private void addRandomList(Long knowId, List<LearnQuestions> questions, Random random, Long totalCount, Long count, Integer score, Set<Long> existQuestionIdSet, List<LearnPaperQuestion> pqList) {
         while(count > 0 && questions.size() > 0) {
             LearnQuestions q = questions.size() > 1 ? questions.remove(random.nextInt(questions.size() - 1)) : questions.remove(0);
             if(existQuestionIdSet.add(q.getId())) {
                 LearnPaperQuestion pq = new LearnPaperQuestion();
                 pq.setSeq(pqList.size() + 1);
+                pq.setKnowledgeId(q.getKnowledgeId());
                 pq.setScore(score);
                 pq.setQuestionId(q.getId());
                 pqList.add(pq);

+ 3 - 3
ie-system/src/main/java/com/ruoyi/learn/domain/LearnAnswer.java

@@ -57,7 +57,7 @@ public class LearnAnswer extends BaseEntity
 
     /** 状态 1 正确 */
     @Excel(name = "0 默认 1正确 2错误 3不会")
-    private Long state;
+    private Integer state;
 
     /** 评级 */
     @Excel(name = "评级")
@@ -174,12 +174,12 @@ public class LearnAnswer extends BaseEntity
         return count;
     }
 
-    public void setState(Long state) 
+    public void setState(Integer state)
     {
         this.state = state;
     }
 
-    public Long getState() 
+    public Integer getState()
     {
         return state;
     }

+ 12 - 1
ie-system/src/main/java/com/ruoyi/learn/domain/LearnPaperQuestion.java

@@ -18,6 +18,9 @@ public class LearnPaperQuestion extends BaseEntity
     /** 试卷题id */
     private Long id;
 
+    /** 知识点id */
+    private Long knowledgeId;
+
     /** 试卷id */
     @Excel(name = "试卷id")
     private Long paperId;
@@ -50,7 +53,15 @@ public class LearnPaperQuestion extends BaseEntity
         return id;
     }
 
-    public void setPaperId(Long paperId) 
+    public Long getKnowledgeId() {
+        return knowledgeId;
+    }
+
+    public void setKnowledgeId(Long knowledgeId) {
+        this.knowledgeId = knowledgeId;
+    }
+
+    public void setPaperId(Long paperId)
     {
         this.paperId = paperId;
     }

+ 10 - 8
ie-system/src/main/java/com/ruoyi/learn/domain/PaperVO.java

@@ -28,6 +28,7 @@ public class PaperVO {
     @ApiModel("试题")
     public static class QuestionSeq {
         private Long id;
+        private Long knowledgeId;
         private String title;
         private String answer1;
         @ApiModelProperty("非标准格式答案或含部分过程说明的答案")
@@ -52,6 +53,7 @@ public class PaperVO {
         private Long answerId;
         @ApiModelProperty("题ID")
         private Long id;
+        private Long knowledgeId;
         private String title;
         private String answer1;
         @ApiModelProperty("非标准格式答案或含部分过程说明的答案")
@@ -72,29 +74,29 @@ public class PaperVO {
         List<String> answers;
 
         @ApiModelProperty("答题正确状态 0 默认 1正确 2错误 3不会")
-        Long state;
+        Integer state;
 
         List<QuestionAnswer> subQuestions;
 
-        public Long calcState(QuestionAnswer std, boolean isDone) {
+        public Integer calcState(QuestionAnswer std, boolean isDone) {
             if(null != isNotKnow && isNotKnow) {
-                return 3L;
+                return 3;
             } if(isDone) {
                 QuestionType qt = QuestionType.of(this.typeId);
                 if(QuestionType.Single.equals(qt) || QuestionType.Judgment.equals(qt)) {
                     if(CollectionUtils.isEmpty(answers)) {
-                        return 0L;
+                        return 0;
                     }
-                    return answers.get(0).equals(std.getAnswer1()) ? 1L : 2L;
+                    return answers.get(0).equals(std.getAnswer1()) ? 1 : 2;
                 } else if(QuestionType.Multiple.equals(qt)) {
                     if(CollectionUtils.isEmpty(answers)) {
-                        return 0L;
+                        return 0;
                     }
                     List<String> stdAnswers = Arrays.asList(std.getAnswer1().split(","));
-                    return stdAnswers.size() == answers.size() && CollectionUtils.intersection(stdAnswers, answers).size() == answers.size() ? 1L : 2L;
+                    return stdAnswers.size() == answers.size() && CollectionUtils.intersection(stdAnswers, answers).size() == answers.size() ? 1 : 2;
                 }
             }
-            return 0L;
+            return 0;
         }
     }
 }

+ 5 - 0
ie-system/src/main/resources/mapper/learn/LearnPaperQuestionMapper.xml

@@ -8,6 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="id"    column="id"    />
         <result property="paperId"    column="paper_id"    />
         <result property="questionId"    column="question_id"    />
+        <result property="knowledgeId"    column="knowledge_id"    />
         <result property="seq"    column="seq"    />
         <result property="score"    column="score"    />
         <result property="createTime"    column="createTime"    />
@@ -22,6 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <where>  
             <if test="paperId != null "> and paper_id = #{paperId}</if>
             <if test="questionId != null "> and question_id = #{questionId}</if>
+            <if test="knowledgeId != null "> and knowledge_id = #{knowledgeId}</if>
             <if test="seq != null "> and seq = #{seq}</if>
             <if test="score != null "> and score = #{score}</if>
             <if test="createTime != null "> and createTime = #{createTime}</if>
@@ -38,6 +40,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="paperId != null">paper_id,</if>
             <if test="questionId != null">question_id,</if>
+            <if test="knowledgeId != null">knowledge_id,</if>
             <if test="seq != null">seq,</if>
             <if test="score != null">score,</if>
             <if test="createTime != null">createTime,</if>
@@ -45,6 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="paperId != null">#{paperId},</if>
             <if test="questionId != null">#{questionId},</if>
+            <if test="knowledgeId != null">#{knowledgeId},</if>
             <if test="seq != null">#{seq},</if>
             <if test="score != null">#{score},</if>
             <if test="createTime != null">#{createTime},</if>
@@ -56,6 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="SET" suffixOverrides=",">
             <if test="paperId != null">paper_id = #{paperId},</if>
             <if test="questionId != null">question_id = #{questionId},</if>
+            <if test="knowledgeId != null">knowledge_id = #{knowledgeId},</if>
             <if test="seq != null">seq = #{seq},</if>
             <if test="score != null">score = #{score},</if>
             <if test="createTime != null">createTime = #{createTime},</if>

+ 1 - 1
ie-system/src/main/resources/mapper/learn/LearnQuestionsMapper.xml

@@ -269,7 +269,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <select id="selectQuestionByPaperId" parameterType="Long" resultMap="LearnQuestionsResult">
-        select q.`id`, pq.`seq`, pq.`score`, title, option_a, option_b, option_c, option_d, option_e, option_f, option_g, qtpye, diff, similarity, isSub, paperTypeTitle, title0, answer1, answer2,parse
+        select q.`id`, pq.`seq`, pq.`score`, title, option_a, option_b, option_c, option_d, option_e, option_f, option_g, qtpye, diff, similarity, isSub, paperTypeTitle, title0, answer1, answer2,parse,pq.knowledge_id `knowledgeId`
           from learn_paper_question pq join `learn_questions` q on q.`id` = pq.`question_id`
           where pq.`paper_id` = #{paperId}
           order by pq.`seq`, q.`id`