Browse Source

Question实体增加code字段,用来表示题目在模块中的编号,原number编号修改为整个试题的编号

4228306 5 years ago
parent
commit
d2d6eb9f4a

+ 4 - 0
src/main/java/edu/math/diagnosis/config/Constants.java

@@ -90,4 +90,8 @@ public class Constants {
     public static final String DEFAULT_SCORE_LEVEL = "一级";
     public static final String DEFAULT_SCORE_LEVEL_EVALUATE = "您的%s处于有待开发的阶段。对%s进行专项训练可以帮助您快速提高%s成绩。";
     public static final String DEFAULT_SCORE_LEVEL_PARAMS = "[\"ability\",\"ability\",\"subject\"]";
+
+    public static final int DEFAULT_SECTION_START_NUMBER = 1;
+    public static final int DEFAULT_SECTION_DURATION = 20;
+    public static final int DEFAULT_SECTION_REST = 2;
 }

+ 13 - 1
src/main/java/edu/math/diagnosis/entity/Question.java

@@ -27,9 +27,13 @@ public class Question {
     private long pid;//所属试卷id
 
     @Column(nullable = false, columnDefinition = " int default 1")
-    @ApiModelProperty("题目编号")
+    @ApiModelProperty("针对整套试题的题目编号")
     private int number;//题目显式编号1,2,3
 
+    @Column(nullable = false,columnDefinition = " int default 1")
+    @ApiModelProperty("针对模块的题目编号")
+    private int code;
+
     @Lob
     @Column(nullable = false)
     @ApiModelProperty("题目内容")
@@ -138,6 +142,14 @@ public class Question {
         this.number = number;
     }
 
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
     public String getContent() {
         return content;
     }

+ 20 - 0
src/main/java/edu/math/diagnosis/service/PaperResultService.java

@@ -556,6 +556,26 @@ public class PaperResultService {
         return ObjectUtil.object2Json(evaluates);
     }
 
+    /**
+     * 该问题在所有题目中的占比,比如10个错题,8个有粗心大意,则粗心大意占比为80
+     *
+     * 该问题在所有题目中的占比,比如10个错题,8个有基础不好,则基础不好占比为80
+     * {
+     *     "知识记忆不牢":{
+     *         "percent":88.88,
+     *         "wrong":[1,2,3]
+     *     }
+     * }
+     *
+     * {
+     *     "基础不好":{
+     *         "commonMatter":"知识记忆不牢,学习动力问题",
+     *         "percent":88.10,
+     *         "isStudy":true,
+     *         "isEmotion":true
+     *     }
+     * }
+     */
     public String questionMatter(PaperResult result, Paper paper) {
         List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
         List<Integer> wrongs = convertWrongQuestion(paper, collects);

+ 21 - 13
src/main/java/edu/math/diagnosis/service/PaperService.java

@@ -25,6 +25,7 @@ import org.springframework.util.Assert;
 import javax.annotation.Resource;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -243,12 +244,13 @@ public class PaperService {
     }
 
     private Map<String, List<XWPFParagraph>> initSections(Paper paper, String sectionPattern, String questionPattern, List<XWPFParagraph> paragraphs) {
-        Map<String, List<XWPFParagraph>> sections = new ConcurrentHashMap<>();
+        //保证顺序
+        Map<String, List<XWPFParagraph>> sections = new LinkedHashMap<>();
         String tag = "";
         boolean betweenSectionAndQuestion = false;
         StringBuilder material = new StringBuilder();
         int section = 0;
-        List<Section> ss = new ArrayList<>();
+        List<Section> sectionList = new ArrayList<>();
         logger.info("initSections start");
         boolean hasFormula = false;
         for (XWPFParagraph paragraph : paragraphs) {
@@ -272,7 +274,7 @@ public class PaperService {
             }
             if (betweenSectionAndQuestion && text.matches(questionPattern)) {
                 Section s = initSection(section, material.toString());
-                ss.add(s);
+                sectionList.add(s);
                 //清空背景材料
                 material = new StringBuilder();
                 betweenSectionAndQuestion = false;
@@ -291,8 +293,8 @@ public class PaperService {
                 sections.put(tag, list);
             }
         }
-        paper.setSections(ss);
-        logger.info("initSections end,sections num is {}", ss.size());
+        paper.setSections(sectionList);
+        logger.info("initSections end,sections num is {}", sectionList.size());
         return sections;
     }
 
@@ -314,17 +316,23 @@ public class PaperService {
 //        sections.values().parallelStream().forEach(ps -> {
 //            initQuestions(paper, questionPattern, ps);
 //        });
-        Map<String, List<Question>> qs = new HashMap<>();
+        Map<String, List<Question>> qs = new LinkedHashMap<>();
         List<String> abilities = subjectAbilityService.list(paper.getSubjectId())
                 .stream().map(SubjectAbility::getCode).collect(Collectors.toList());
-        sections.keySet().forEach(s -> {
+        int currentNumber = 0;
+        //此处section应该是顺序的
+        for (String s : sections.keySet()) {
             List<XWPFParagraph> ps = sections.get(s);
 //            Section current = ss.stream().filter(section -> s.contains(section.getNumber().toString())).findFirst().orElse(null);
             Section current = sectionMap.get(s);
             Map<String, List<XWPFParagraph>> questions = initQuestions(current, questionPattern, ps);
+            current.setStartNumber(currentNumber);
             List<Question> list = parseQuestions(questions, current, template, topic, abilities);
+            current.setNums(list.size());
+            currentNumber = currentNumber + list.size();
             qs.put(s, list);
-        });
+        }
+        ;
         List<Question> list = new ArrayList<>();
         qs.values().forEach(list::addAll);
         paper.setQuestions(list);
@@ -361,8 +369,8 @@ public class PaperService {
         questions.forEach((k, v) -> {
             Matcher matcher = pattern.matcher(k);
             if (k.matches(template.getQuestion()) && matcher.find()) {
-                String number = matcher.group();
-                Question question = questionService.initQuestion(section.getNumber(), Integer.valueOf(number));
+                String code= matcher.group();
+                Question question = questionService.initQuestion(section.getNumber(), section.getStartNumber(), Integer.valueOf(code));
                 wordService.parseQuestion(question, v, topic, template, abilities);
                 list.add(question);
             }
@@ -401,11 +409,11 @@ public class PaperService {
 
     private Section initSection(int number, String material) {
         Section section = new Section();
-        section.setStartNumber(1);
+        section.setStartNumber(Constants.DEFAULT_SECTION_START_NUMBER);
         section.setNumber(number);
         section.setMaterial(material);
-        section.setDuration(20);
-        section.setRest(2);
+        section.setDuration(Constants.DEFAULT_SECTION_DURATION);
+        section.setRest(Constants.DEFAULT_SECTION_REST);
         return section;
     }
 

+ 3 - 2
src/main/java/edu/math/diagnosis/service/QuestionService.java

@@ -131,11 +131,12 @@ public class QuestionService {
         return question;
     }
 
-    public Question initQuestion(Integer section, Integer number) {
+    public Question initQuestion(Integer section,Integer startNumber, Integer number) {
         Question question = new Question();
         question.setCreatetime(new Date());
         question.setScore(1D);
-        question.setNumber(number);
+        question.setNumber(startNumber + number);
+        question.setCode(number);
         question.setDuration(60);
         question.setSection(section);
         return question;