Browse Source

完成各章节知识点与能力对应接口、能力评价接口

4228306 5 years ago
parent
commit
03d8becc1e

+ 2 - 2
src/main/java/edu/math/diagnosis/entity/PaperResult.java

@@ -53,13 +53,13 @@ public class PaperResult {
     private Double knowledgeRate;
 
     /**
-     * 各能力分数,5分制
+     * 各能力分数,10分制
      * {
      * "计算能力":"aa"
      * }
      */
     @Lob
-    @ApiModelProperty("各能力分数,5分制 {\"计算能力\":4.1}")
+    @ApiModelProperty("各能力分数,10分制 {\"计算能力\":4.1}")
     private String abilityScore;
 
     /**

+ 5 - 3
src/main/java/edu/math/diagnosis/model/AbilityEvaluateVo.java

@@ -1,10 +1,12 @@
 package edu.math.diagnosis.model;
 
+import java.util.List;
+
 public class AbilityEvaluateVo {
     private Double score;
     private String abilityCode;
     private String evaluate;
-    private String keep;
+    private List<Integer> keep;
     private String explain;
 
     public Double getScore() {
@@ -31,11 +33,11 @@ public class AbilityEvaluateVo {
         this.evaluate = evaluate;
     }
 
-    public String getKeep() {
+    public List<Integer> getKeep() {
         return keep;
     }
 
-    public void setKeep(String keep) {
+    public void setKeep(List<Integer> keep) {
         this.keep = keep;
     }
 

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

@@ -40,6 +40,10 @@ public class PaperResultService {
     private MatterService matterService;
     @Resource
     private PaperCountService paperCountService;
+    @Resource
+    private ScoreSegmentService scoreSegmentService;
+    @Resource
+    private SubjectService subjectService;
 
     private static final Logger logger = LoggerFactory.getLogger(PaperResultService.class);
 
@@ -199,11 +203,10 @@ public class PaperResultService {
 
 
     /**
-     * 能力分数
-     *
-     * @param result 提交的试卷
-     * @param paper  试卷
-     * @return {"计算能力":4.22,"转化能力":2.1}
+     * 各能力分数,10分制
+     * {
+     * "计算能力":"10.0"
+     * }
      */
     public String abilityScore(PaperResult result, Paper paper) {
 
@@ -213,11 +216,14 @@ public class PaperResultService {
 //        Map<String, Set<Integer>> codeNumber = new HashMap<>();
 
         //Map<code,score> 各能力分数
-        Map<String, Double> codeScore = new HashMap<>();
+        Map<String, Double> codeScore = new LinkedHashMap<>();
         //初始化能力分数
         abilityCodes.keySet().forEach(e -> codeScore.put(e, 0d));
 
-        paper.getQuestions().forEach(q -> {
+        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) -> {
@@ -228,20 +234,20 @@ public class PaperResultService {
 //                }
 //            });
             //如果这题做对了 分数累加
-            if (collectQuestion.contains(q.getNumber())) {
-                for (Map.Entry<String, Double> e : codeScore.entrySet()) {
-                    e.setValue(e.getValue() + scores.get(e.getKey()));
-                }
+            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<>();
-        //将分数转化为最大值为5
+        //将分数转化为最大值为10
         for (Map.Entry<String, Double> e : codeScore.entrySet()) {
             double s = e.getValue();
-            double score = NumberUtil.format(5 * s * 100.0 / paperJsonScore.get(e.getKey()));
+            //改成10分制
+            double score = NumberUtil.format(10 * s * 100.0 / paperJsonScore.get(e.getKey()));
             d.put(abilityCodes.get(e.getKey()), score);
         }
         return ObjectUtil.object2Json(d);
@@ -249,11 +255,13 @@ public class PaperResultService {
     }
 
     /**
-     * 章节掌握情况
-     *
-     * @param result 提交的试卷
-     * @param paper  试卷
-     * @return [[1, 2, 0], [0, 0, 1]]
+     * 以章节为单位各知识点接受程度
+     * 0 未掌握
+     * 1 半掌握
+     * 2 已掌握
+     * [
+     * [1,1],[0,1,2]
+     * ]
      */
     public String knowledgeAcceptanceLevel(PaperResult result, Paper paper) {
         List<List<Integer>> keepStatus = new ArrayList<>();
@@ -280,6 +288,13 @@ public class PaperResultService {
         return ObjectUtil.object2Json(keepStatus);
     }
 
+    /**
+     * 各章节掌握率
+     * {
+     * "预备章节":0,
+     * "第一章":88.8,
+     * }
+     */
     public String chapterRate(PaperResult result, Paper paper) {
         //Map<chapter,rate> 章节掌握率
         Map<String, Double> chapterKeepRate = new LinkedHashMap<>();
@@ -311,6 +326,17 @@ public class PaperResultService {
         return ObjectUtil.object2Json(chapterKeepRate);
     }
 
+
+    /**
+     * {
+     * "第一章":[{
+     * "chapter":"1",
+     * "number":1,
+     * "knowledgeName":"⼩学⽔平计算",
+     * "matter":"计算出错,学习动力问题"
+     * }]
+     * }
+     */
     public Map<String, List<KnowledgeKeepVo>> knowledgeKeepStatus(PaperResult result, Paper paper) {
         //Map<chapter,List<KnowledgeKeepVo>>
         Map<String, List<KnowledgeKeepVo>> knowledgeKeepStatus = new LinkedHashMap<>();
@@ -401,12 +427,26 @@ public class PaperResultService {
         return ObjectUtil.object2Json(useTime);
     }
 
+    /**
+     * 各题目答题时间
+     * [50,20]
+     */
     public String avgUseTime(Paper paper) {
         paperCountService.updateAvgCommitTime(paper);
         PaperCount count = paperCountService.findByPid(paper.getId());
         return count.getUseTimeAgvRate();
     }
 
+    /**
+     * 模块作答详情
+     * {
+     * "1":{
+     * "collectInfo":"43/50",
+     * "useTime":"30:00/30:00",
+     * "score":35
+     * }
+     * }
+     */
     public String sectionInfo(PaperResult result, Paper paper) {
         //TODO 按模块输出答题情况
         SectionInfoVo vo1 = new SectionInfoVo("模块一", "43/50", "23:00/30:00", 35d);
@@ -419,6 +459,18 @@ public class PaperResultService {
         return ObjectUtil.object2Json(list);
     }
 
+    /**
+     * 每章节能力掌握情况
+     * {
+     * "第一章":[{
+     * "chapter":1,
+     * "knowledgeContent":"1.10 因数和倍数"
+     * "knowledgeCode":"A1",
+     * "keep":1,
+     * "abilityCodes": "A1A2"
+     * }]
+     * }
+     */
     public String chapterAbility(PaperResult result, Paper paper) {
         List<SubjectKnowledge> knowledge = knowledgeService.list(paper.getSubjectId(), paper.getGrade());
         //根据章节分组 Map<chapter,List<SubjectKnowledge>>
@@ -445,14 +497,76 @@ public class PaperResultService {
         return ObjectUtil.object2Json(group);
     }
 
+    /**
+     * 各能力评价
+     * {
+     * "计算能力":{
+     * "abilityCode":"A1",
+     * "score":4.5,
+     * "evaluate":"您的成绩...",
+     * "keep":[1,0,1,2,0,1,0],
+     * "explain":"这是示例与解释"
+     * }
+     * }
+     */
     public String abilityEvaluate(PaperResult result, Paper paper) {
-        return "{}";
+
+        List<ScoreSegment> scoreSegments = scoreSegmentService.findBySubjectId(paper.getSubjectId());
+        String subject = subjectService.get(paper.getSubjectId()).getName();
+        String abilityScore = result.getAbilityScore();
+        Map<String, Double> scores = ObjectUtil.json2Map(abilityScore);
+
+        List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
+        //Map<tag,Set<number>> 知识点与题目对应
+        Map<String, Set<Integer>> tagNumbers = tagNumbers(paper);
+        //Map<tag,keep> 每个知识点的掌握情况
+        Map<String, Integer> tagKeep = tagKeep(collects, tagNumbers);
+
+        List<SubjectKnowledge> knowledge = knowledgeService.list(paper.getSubjectId(), paper.getGrade());
+
+        //Map<ability,Set<String>> 能力与知识点对应
+        Map<String, Set<String>> abilityKnowledge = new LinkedHashMap<>();
+        knowledge.forEach(k -> {
+            String[] abilityCodes = k.getAbilityCodes().split(",");
+            for (String abilityCode : abilityCodes) {
+                Set<String> ks = abilityKnowledge.getOrDefault(abilityCode, new HashSet<>());
+                ks.add(k.getCode());
+                abilityKnowledge.put(abilityCode, ks);
+            }
+        });
+
+        Map<String, String> abilities = subjectAbilityService.map(paper.getSubjectId());
+        Map<String, AbilityEvaluateVo> evaluates = new LinkedHashMap<>();
+        for (Map.Entry<String, Set<String>> entry : abilityKnowledge.entrySet()) {
+            String code = entry.getKey();
+            AbilityEvaluateVo vo = new AbilityEvaluateVo();
+            vo.setAbilityCode(code);
+            vo.setScore(scores.get(code));
+
+            ScoreSegment scoreSegment = scoreSegmentService.getLevel(vo.getScore(), scoreSegments, abilities.get(code), subject);
+            vo.setEvaluate(scoreSegment.getEvaluate());
+            vo.setExplain(scoreSegment.getExplanation());
+
+            Set<String> ks = entry.getValue();
+            List<Integer> keep = new ArrayList<>();
+            ks.forEach(k -> keep.add(tagKeep.get(k)));
+            vo.setKeep(keep);
+            evaluates.put(abilities.get(code), vo);
+        }
+        return ObjectUtil.object2Json(evaluates);
     }
 
     public String questionMatter(PaperResult result, Paper paper) {
+        List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
+        List<Integer> wrongs = convertWrongQuestion(paper, collects);
+
         return "{}";
     }
 
+    private List<Integer> convertWrongQuestion(Paper paper, List<Integer> collects) {
+        return paper.getQuestions().stream().map(Question::getNumber).filter(q->!collects.contains(q)).collect(Collectors.toList());
+    }
+
     private List<Answer> convertAnswer(String json) {
         return ObjectUtil.getGson().fromJson(json, new TypeToken<List<Answer>>() {
         }.getType());

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

@@ -14,7 +14,7 @@ public class ScoreSegmentService {
     @Resource
     private ScoreSegmentRepo scoreSegmentRepo;
 
-    private List<ScoreSegment> findBySubjectId(Long subjectId) {
+    public List<ScoreSegment> findBySubjectId(Long subjectId) {
         return scoreSegmentRepo.findBySubjectId(subjectId);
     }
 
@@ -26,7 +26,7 @@ public class ScoreSegmentService {
             if (s.getLowerScore() <= score && score < s.getHighScore()) {
                 String params = s.getParams();
                 String[] p = params.split(",");
-                s.setEvaluate(String.format(s.getEvaluate(),p));
+                s.setEvaluate(String.format(s.getEvaluate(), (Object[]) p));
                 return s;
             }
         }

+ 8 - 1
src/main/java/edu/math/diagnosis/service/SubjectAbilityService.java

@@ -6,6 +6,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -26,7 +27,13 @@ public class SubjectAbilityService {
 
     public Map<String, String> map(Long subjectId) {
         List<SubjectAbility> abilities = list(subjectId);
+//        return abilities.stream().collect(Collectors.toMap(SubjectAbility::getCode, SubjectAbility::getName));
+        //保证顺序
         // Map<code,Name>
-        return abilities.stream().collect(Collectors.toMap(SubjectAbility::getCode, SubjectAbility::getName));
+        Map<String,String> result = new LinkedHashMap<>();
+        for (SubjectAbility ability:abilities){
+            result.put(ability.getCode(),ability.getName());
+        }
+        return result;
     }
 }