Browse Source

Merge branch 'master' of http://www.yaoxiangedu.com:10080/feick/diagnosis

HZH-PC\HZH 5 years ago
parent
commit
f0c47dd66b

+ 10 - 0
src/main/java/edu/math/diagnosis/entity/KnowledgeMatter.java

@@ -34,6 +34,8 @@ public class KnowledgeMatter {
     @Column(nullable = false)
     private Date updatetime;
 
+    private String options;
+
     public Long getId() {
         return id;
     }
@@ -121,4 +123,12 @@ public class KnowledgeMatter {
     public void setUpdatetime(Date updatetime) {
         this.updatetime = updatetime;
     }
+
+    public String getOptions() {
+        return options;
+    }
+
+    public void setOptions(String options) {
+        this.options = options;
+    }
 }

+ 50 - 0
src/main/java/edu/math/diagnosis/model/CommonMatterVo.java

@@ -0,0 +1,50 @@
+package edu.math.diagnosis.model;
+
+public class CommonMatterVo {
+
+    private String commonMatter;
+    private String mistakeMatter;
+    private Double percent;
+    private boolean study;
+    private boolean emotion;
+
+    public String getCommonMatter() {
+        return commonMatter;
+    }
+
+    public void setCommonMatter(String commonMatter) {
+        this.commonMatter = commonMatter;
+    }
+
+    public String getMistakeMatter() {
+        return mistakeMatter;
+    }
+
+    public void setMistakeMatter(String mistakeMatter) {
+        this.mistakeMatter = mistakeMatter;
+    }
+
+    public Double getPercent() {
+        return percent;
+    }
+
+    public void setPercent(Double percent) {
+        this.percent = percent;
+    }
+
+    public boolean isStudy() {
+        return study;
+    }
+
+    public void setStudy(boolean study) {
+        this.study = study;
+    }
+
+    public boolean isEmotion() {
+        return emotion;
+    }
+
+    public void setEmotion(boolean emotion) {
+        this.emotion = emotion;
+    }
+}

+ 36 - 0
src/main/java/edu/math/diagnosis/model/MistakeMatterVo.java

@@ -0,0 +1,36 @@
+package edu.math.diagnosis.model;
+
+import java.util.List;
+
+public class MistakeMatterVo {
+
+    private String mistakeMatter;
+
+    private List<Integer> wrongs;
+
+    private Double percent;
+
+    public String getMistakeMatter() {
+        return mistakeMatter;
+    }
+
+    public void setMistakeMatter(String mistakeMatter) {
+        this.mistakeMatter = mistakeMatter;
+    }
+
+    public List<Integer> getWrongs() {
+        return wrongs;
+    }
+
+    public void setWrongs(List<Integer> wrongs) {
+        this.wrongs = wrongs;
+    }
+
+    public Double getPercent() {
+        return percent;
+    }
+
+    public void setPercent(Double percent) {
+        this.percent = percent;
+    }
+}

+ 7 - 4
src/main/java/edu/math/diagnosis/service/MatterService.java

@@ -78,9 +78,12 @@ public class MatterService {
         return commonMatterRepo.existsByName(name);
     }
 
-    public KnowledgeMatter addKnowledge(String name, String code, String commonMatter, String mistakeMatter, String baseMatter, Long subjectId, String grade,Integer nubmer) {
+    public KnowledgeMatter addKnowledge(String name, String code, String commonMatter, String mistakeMatter, String baseMatter, Long subjectId, String grade, Integer number, String option) {
         if (existKnowledge(name, subjectId, grade)) {
-            return null;
+            KnowledgeMatter matter = knowledgeMatterRepo.findByNameAndSubjectIdAndGrade(name, subjectId, grade);
+            //更新选项编号
+            matter.setOptions(matter.getOptions() + "," + option);
+            return knowledgeMatterRepo.save(matter);
         }
         KnowledgeMatter matter = new KnowledgeMatter();
         matter.setName(name);
@@ -90,7 +93,7 @@ public class MatterService {
         matter.setBaseMatter(baseMatter);
         matter.setSubjectId(subjectId);
         matter.setGrade(grade);
-        matter.setNumber(nubmer);
+        matter.setNumber(number);
         return knowledgeMatterRepo.save(matter);
     }
 
@@ -111,7 +114,7 @@ public class MatterService {
             String knowledge = vo.getKnowledgeMatter();
             addMistake(mistake, CodeUtil.generate(4, CodeUtil.LOWER_ALPHA), base);
             addCommon(common, CodeUtil.generate(4, CodeUtil.LOWER_ALPHA), mistake, base);
-            addKnowledge(knowledge, CodeUtil.generate(4, CodeUtil.LOWER_ALPHA), common, mistake, base, vo.getSubjectId(), vo.getGrade(),vo.getNumber());
+            addKnowledge(knowledge, CodeUtil.generate(4, CodeUtil.LOWER_ALPHA), common, mistake, base, vo.getSubjectId(), vo.getGrade(), vo.getNumber(), vo.getOption());
         }
     }
 

+ 110 - 76
src/main/java/edu/math/diagnosis/service/PaperResultService.java

@@ -82,8 +82,8 @@ public class PaperResultService {
             if (a == null || StringUtils.isBlank(a.getOptions())) {
                 continue;
             }
-            //检测答案的对错,此处进行全匹配,全对上该题目才正确
-            if (ans.equalsIgnoreCase(a.getOptions())) {
+            //检测答案的对错,如果答案为空或者全部对上该题目正确
+            if (q.getCorrectNum() == 0 || ans.equalsIgnoreCase(a.getOptions())) {
                 collectQuestion.add(q.getNumber());
                 String jsonScore = q.getJsonScore();
                 Map<String, Double> qData = ObjectUtil.json2Object(jsonScore, Map.class);
@@ -98,6 +98,9 @@ public class PaperResultService {
         //对的选项进行升序排序
         collectQuestion.sort(Integer::compareTo);
         result.setCollectQuestion(StringUtils.join(collectQuestion, ","));
+        //错误选项
+        List<Integer> wrongQuestions = generateWrongQuestion(paper, collectQuestion);
+        result.setWrongQuestion(StringUtils.join(wrongQuestions, ","));
         result.setJsonScore(ObjectUtil.object2Json(pData));
         //转换分数为百分制
         double totalScore = paper.getTotalScore();
@@ -148,7 +151,8 @@ public class PaperResultService {
         //第二部分 学科能力
         r.setChapterAbility(chapterAbility(r, paper));
         r.setAbilityEvaluate(abilityEvaluate(r, paper));
-        questionMatter(r, paper);
+        r.setCommonMatters(commonMatters(r, paper));
+        r.setMistakeMatters(mistakeMatters(r, paper));
 
 //        paperResultRepo.save(r);
     }
@@ -171,7 +175,7 @@ public class PaperResultService {
 //        List<QuestionOption> options = questions.stream().map(Question::getOptions).flatMap(Collection::stream).collect(Collectors.toList());
 //        questions.forEach(q -> tags.put(q.getId(), q.getTag()));
 
-        List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
+        List<Integer> collects = convertQuestion(result.getCollectQuestion());
 
         //Map<tag,Set<number>> 知识点与题目对应
         Map<String, Set<Integer>> tagNumbers = tagNumbers(paper);
@@ -209,49 +213,18 @@ public class PaperResultService {
      * }
      */
     public String abilityScore(PaperResult result, Paper paper) {
-
-        Map<String, String> abilityCodes = subjectAbilityService.map(paper.getSubjectId());
-        List<Integer> collectQuestion = convertCollectQuestion(result.getCollectQuestion());
-        //各能力分数 Map<code,Set<number>> 能力与题目编号
-//        Map<String, Set<Integer>> codeNumber = new HashMap<>();
-
-        //Map<code,score> 各能力分数
-        Map<String, Double> codeScore = new LinkedHashMap<>();
-        //初始化能力分数
-        abilityCodes.keySet().forEach(e -> codeScore.put(e, 0d));
-
-        for (Question q : paper.getQuestions()) {
-            if (!collectQuestion.contains(q.getNumber())) {
-                continue;
-            }
-            String jsonScore = q.getJsonScore();
-            Map<String, Double> scores = ObjectUtil.json2Map(jsonScore);
-//            scores.forEach((code, score) -> {
-//                if (score > 0) {
-//                    Set<Integer> number = codeNumber.getOrDefault(code, new HashSet<>());
-//                    number.add(q.getNumber());
-//                    codeNumber.put(code, number);
-//                }
-//            });
-            //如果这题做对了 分数累加
-            for (Map.Entry<String, Double> e : codeScore.entrySet()) {
-                e.setValue(e.getValue() + scores.get(e.getKey()));
-            }
-        }
-        ;
-
-        //获取试卷的分数
-        Map<String, Double> paperJsonScore = ObjectUtil.json2Map(paper.getJsonScore());
-        Map<String, Double> d = new HashMap<>();
-        //将分数转化为最大值为10
-        for (Map.Entry<String, Double> e : codeScore.entrySet()) {
-            double s = e.getValue();
-            //改成10分制
-            double score = NumberUtil.format(10 * s * 100.0 / paperJsonScore.get(e.getKey()));
-            d.put(abilityCodes.get(e.getKey()), score);
+        String jsonScore = result.getJsonScore();
+        Map<String, Double> scores = ObjectUtil.json2Map(jsonScore);
+        Map<String, String> ability = subjectAbilityService.map(paper.getSubjectId());
+        Map<String, Double> abilityScores = ObjectUtil.json2Map(paper.getJsonScore());
+        Map<String, Double> ret = new LinkedHashMap<>();
+        //将成绩转化为10分
+        for (Map.Entry<String, Double> entry : scores.entrySet()) {
+            Double score = abilityScores.getOrDefault(entry.getKey(), 0d);
+            double s = score == 0 ? 0 : NumberUtil.format(10.0 * entry.getValue() / score);
+            ret.put(ability.get(entry.getKey()), s);
         }
-        return ObjectUtil.object2Json(d);
-
+        return ObjectUtil.object2Json(ret);
     }
 
     /**
@@ -270,7 +243,7 @@ public class PaperResultService {
         List<SubjectKnowledge> knowledge = knowledgeService.list(subjectId, grade);
         //根据章节分组 Map<chapter,...>
         Map<String, List<SubjectKnowledge>> group = knowledge.stream().collect(Collectors.groupingBy(SubjectKnowledge::getChapter));
-        List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
+        List<Integer> collects = convertQuestion(result.getCollectQuestion());
 
         //Map<tag,Set<number>> 知识点与题目对应
         Map<String, Set<Integer>> tagNumbers = tagNumbers(paper);
@@ -305,7 +278,7 @@ public class PaperResultService {
         List<SubjectKnowledge> knowledge = knowledgeService.list(paper.getSubjectId(), paper.getGrade());
         //根据章节分组 Map<chapter,List<SubjectKnowledge>>
         Map<String, List<SubjectKnowledge>> group = knowledge.stream().collect(Collectors.groupingBy(SubjectKnowledge::getChapter));
-        List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
+        List<Integer> collects = convertQuestion(result.getCollectQuestion());
         //Map<tag,Set<number>> 知识点与题目对应
         Map<String, Set<Integer>> tagNumbers = tagNumbers(paper);
         //Map<tag,keep> 每个知识点的掌握情况
@@ -353,7 +326,7 @@ public class PaperResultService {
         });
 
 
-        List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
+        List<Integer> collects = convertQuestion(result.getCollectQuestion());
 
         //Map<tag,Set<number>> 知识点与题目对应
         Map<String, Set<Integer>> tagNumbers = tagNumbers(paper);
@@ -380,13 +353,6 @@ public class PaperResultService {
     }
 
 
-    private List<Integer> convertCollectQuestion(String collectQuestion) {
-        //获取答对的题目
-        String[] collect = collectQuestion.split(",");
-        //转换成整型
-        return Arrays.stream(collect).map(Integer::valueOf).collect(Collectors.toList());
-    }
-
     private Map<String, Set<Integer>> tagNumbers(Paper paper) {
         Map<String, Set<Integer>> tagNumbers = new LinkedHashMap<>();
         paper.getQuestions().forEach(q -> {
@@ -476,7 +442,7 @@ public class PaperResultService {
         //根据章节分组 Map<chapter,List<SubjectKnowledge>>
 //        Map<String, List<SubjectKnowledge>> group = knowledge.stream().collect(Collectors.groupingBy(SubjectKnowledge::getChapter));
 
-        List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
+        List<Integer> collects = convertQuestion(result.getCollectQuestion());
         //Map<tag,Set<number>> 知识点与题目对应
         Map<String, Set<Integer>> tagNumbers = tagNumbers(paper);
         //Map<tag,keep> 每个知识点的掌握情况
@@ -488,7 +454,7 @@ public class PaperResultService {
             vo.setChapter(k.getChapter());
             vo.setKnowledgeCode(k.getCode());
 //            vo.setKnowledgeContent(k.getContent());
-            // 设置知识点掌握程度
+            // 设置知识点掌握程度
             vo.setKeep(tagKeep.getOrDefault(k.getCode(), 0));
             vo.setAbilityCodes(k.getAbilityCodes());
             vos.add(vo);
@@ -516,7 +482,7 @@ public class PaperResultService {
         String abilityScore = result.getAbilityScore();
         Map<String, Double> scores = ObjectUtil.json2Map(abilityScore);
 
-        List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
+        List<Integer> collects = convertQuestion(result.getCollectQuestion());
         //Map<tag,Set<number>> 知识点与题目对应
         Map<String, Set<Integer>> tagNumbers = tagNumbers(paper);
         //Map<tag,keep> 每个知识点的掌握情况
@@ -541,7 +507,7 @@ public class PaperResultService {
             String code = entry.getKey();
             AbilityEvaluateVo vo = new AbilityEvaluateVo();
             vo.setAbilityCode(code);
-            vo.setScore(scores.getOrDefault(code,0D));
+            vo.setScore(scores.getOrDefault(code, 0D));
 
             ScoreSegment scoreSegment = scoreSegmentService.getLevel(vo.getScore(), scoreSegments, abilities.get(code), subject);
             vo.setEvaluate(scoreSegment.getEvaluate());
@@ -550,39 +516,107 @@ public class PaperResultService {
             Set<String> ks = entry.getValue();
             List<Integer> keep = new ArrayList<>();
             //未掌握的为0
-            ks.forEach(k -> keep.add(tagKeep.getOrDefault(k,0)));
+            ks.forEach(k -> keep.add(tagKeep.getOrDefault(k, 0)));
             vo.setKeep(keep);
             evaluates.put(abilities.get(code), vo);
         }
         return ObjectUtil.object2Json(evaluates);
     }
 
+
     /**
-     * 该问题在所有题目中的占比,比如10个错题,8个有粗心大意,则粗心大意占比为80
-     * {
-     * "知识记忆不牢":{
-     * "percent":88.88,
-     * "wrong":[1,2,3]
-     * }
-     * }
-     *
-     * 该问题在所有题目中的占比,比如10个错题,8个有基础不好,则基础不好占比为80
+     * 题目暴露的问题 该问题在所有题目中的占比,比如10个错题,8个有粗心大意,则粗心大意占比为80
+     * 右边两列
      * {
-     * "基础不好":{
-     * "commonMatter":"知识记忆不牢,学习动力问题",
+     * "计算出错":{
+     * "commonMatter":"计算出错",
+     * "mistakeMatter":"粗心大意",
      * "percent":88.10,
      * "isStudy":true,
      * "isEmotion":true
      * }
      * }
      */
-    public void questionMatter(PaperResult result, Paper paper) {
-        List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
-        List<Integer> wrongs = convertWrongQuestion(paper, collects);
+    public String commonMatters(PaperResult result, Paper paper) {
+        List<KnowledgeMatter> matters = matterService.list(paper.getSubjectId(), paper.getGrade());
+
+//        Map<String, KnowledgeMatter> matterMap = matters.stream().collect(Collectors.toMap(KnowledgeMatter::getCommonMatter, k -> k));
+        //对于一个CommonMatter来说,它的mistakeMatter和baseMatter都是确定的
+        Map<String, KnowledgeMatter> matterMap = new HashMap<>();
+        for (KnowledgeMatter matter : matters) {
+            matterMap.putIfAbsent(matter.getCommonMatter(), matter);
+        }
+
+        //Map<commonMatter,List<KnowledgeMatter>>
+        Map<String, List<KnowledgeMatter>> group = matters.stream().collect(Collectors.groupingBy(KnowledgeMatter::getCommonMatter));
+
+        List<Integer> wrongs = convertQuestion(result.getWrongQuestion());
+        //Map<commonMatter,CommonMatterVo>
+        Map<String, CommonMatterVo> commons = new LinkedHashMap<>();
+        group.forEach((commonMatter, list) -> {
+            List<Integer> numbers = list.stream().map(KnowledgeMatter::getNumber).collect(Collectors.toList());
+            //该commonMatter的题目数量
+            int num = numbers.size();
+            //取交集
+            numbers.retainAll(wrongs);
+            int wrong = numbers.size();
+            double percent = num == 0 ? 100 : NumberUtil.format(100.0 * (num - wrong) / num);
+            CommonMatterVo vo = new CommonMatterVo();
+
+            KnowledgeMatter sample = matterMap.get(commonMatter);
+            vo.setMistakeMatter(sample.getMistakeMatter());
+            vo.setStudy(sample.getBaseMatter().contains(Constants.MATTER_STUDY));
+            vo.setEmotion(sample.getBaseMatter().contains(Constants.MATTER_EMOTION));
+            vo.setCommonMatter(commonMatter);
+            vo.setPercent(percent);
+            commons.put(commonMatter, vo);
+        });
+        return ObjectUtil.object2Json(commons);
+    }
+
+    /**
+     * 家长误以为的问题 该问题在所有题目中的占比,比如10个错题,8个有基础不好,则基础不好占比为80
+     * 左边两列
+     * {
+     * "知识记忆不牢":{
+     * "percent":88.88,
+     * "wrongs":[1,2,3],
+     * "mistakeMatter":"知识记忆不牢"
+     * }
+     * }
+     */
+    public String mistakeMatters(PaperResult result, Paper paper) {
+        List<KnowledgeMatter> matters = matterService.list(paper.getSubjectId(), paper.getGrade());
+        //Map<mistakeMatter,List<KnowledgeMatter> 以mistakeMatter进行分组
+        Map<String, List<KnowledgeMatter>> group = matters.stream().collect(Collectors.groupingBy(KnowledgeMatter::getMistakeMatter));
+        List<Integer> wrongs = convertQuestion(result.getWrongQuestion());
+        //Map<mistakeMatter,MistakeMatterVo>
+        Map<String, MistakeMatterVo> mistakes = new LinkedHashMap<>();
+        group.forEach((mistakeMatter, list) -> {
+            List<Integer> numbers = list.stream().map(KnowledgeMatter::getNumber).collect(Collectors.toList());
+            //该commonMatter的题目数量
+            int num = numbers.size();
+            //取交集
+            numbers.retainAll(wrongs);
+            int wrong = numbers.size();
+            double percent = num == 0 ? 100 : NumberUtil.format(100.0 * (num - wrong) / num);
+            MistakeMatterVo vo = new MistakeMatterVo();
+            vo.setMistakeMatter(mistakeMatter);
+            vo.setWrongs(numbers);
+            vo.setPercent(percent);
+            mistakes.put(mistakeMatter, vo);
+        });
+        return ObjectUtil.object2Json(mistakes);
+    }
 
+    private List<Integer> convertQuestion(String questionNumbers) {
+        //获取答对的题目
+        String[] collect = questionNumbers.split(",");
+        //转换成整型
+        return Arrays.stream(collect).map(Integer::valueOf).collect(Collectors.toList());
     }
 
-    private List<Integer> convertWrongQuestion(Paper paper, List<Integer> collects) {
+    private List<Integer> generateWrongQuestion(Paper paper, List<Integer> collects) {
         return paper.getQuestions().stream().map(Question::getNumber).filter(q -> !collects.contains(q)).collect(Collectors.toList());
     }