Browse Source

生成知识掌握率

4228306 5 years ago
parent
commit
7538e23663

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

@@ -1,8 +1,70 @@
 package edu.math.diagnosis.config;
 
+
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 
+import java.util.HashMap;
+import java.util.Map;
+
 public class Constants {
+    public static final String ALEADY = "aleady";
+    public static final String NOTALEADY = "notaleady";
+
+    public static final String TOPIC_SECTION = "【模块】";
+    public static final String TOPIC_QUESTION = "【题干】";
+    public static final String TOPIC_ANSWER = "【答案】";
+    public static final String TOPIC_TAG = "【标签】";
+    public static final String TOPIC_ABILITY = "【能力】";
+    public static final String TOPIC_EVALUATE_CORRECT = "【正确评语】";
+    public static final String TOPIC_EVALUATE_WRONG = "【错误评语】";
+    //    public static final String TOPIC_ANALYSE = "【分析】";
+//    public static final String TOPIC_EVALUATE = "【评价】";
+//    public static final String TOPIC_POINT = "【知识点】";
+    public static final String TOPIC_QUESTION_TYPE = "题目类型";
+
+    public static final int OPTION_NUMS = 5;
+    public static final int DEFAULT_HEIGHT = 300;
+    public static final int DEFAULT_WIDTH = 400;
+    public static final int MIN_HEIGHT = 150;
+    public static final int MIN_WIDTH = 200;
+    public static final int MAX_HEIGHT = 600;
+    public static final int MAX_WIDTH = 800;
+
+    public static final String TOPIC_ABILITY_CALC = "A1";//"计算能力";
+    public static final String TOPIC_ABILITY_INTRO = "A2";//"归纳类比";
+    public static final String TOPIC_ABILITY_SPACE = "A3";//"空间想象";
+    public static final String TOPIC_ABILITY_LANGUAGE = "A4";//"语言理解能力";
+    public static final String TOPIC_ABILITY_LOGIC = "A5";//"逻辑推理";
+    public static final String TOPIC_ABILITY_CONVERSION = "A6";//"转化迁移能力";
+
+    public static final String SUBJECT_LIT = "LIT"; //语文
+    public static final String SUBJECT_MAS = "MAS"; //数学
+    public static final String SUBJECT_PYS = "PYS"; //物理
+    public static final String SUBJECT_CHE = "CHE"; //化学
+    public static final String SUBJECT_BIO = "BIO"; //生物
+    public static final String SUBJECT_HST = "HST"; //历史
+    public static final String SUBJECT_GEO = "GEO"; //地理
+    public static final String SUBJECT_ENG = "ENG"; //英语
+    public static final String SUBJECT_POL = "POL"; //政治
+    public static final String SUBJECT_EMO = "EMO"; //情绪
+
+    public static final String MATH_JAX = "<script type=\"text/javascript\" async src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=MML_CHTML\" ></script>";
+
+    public static final Map<String, String> SUBJECTS = new HashMap<String, String>() {
+        {
+            put(SUBJECT_LIT, "语文");
+            put(SUBJECT_MAS, "数学");
+            put(SUBJECT_PYS, "物理");
+            put(SUBJECT_CHE, "化学");
+            put(SUBJECT_BIO, "生物");
+            put(SUBJECT_HST, "历史");
+            put(SUBJECT_GEO, "地理");
+            put(SUBJECT_ENG, "英语");
+            put(SUBJECT_POL, "政治");
+            put(SUBJECT_EMO, "情绪");
+        }
+    };
+
     public static final String USER_TYPE_ADMIN = "admin";
     public static final String USER_TYPE_STUDENT = "student";
     public static final String USER_TYPE_TEACHER = "teacher";
@@ -12,4 +74,11 @@ public class Constants {
     public static final SimpleGrantedAuthority USER_TEACHER = new SimpleGrantedAuthority(USER_TYPE_TEACHER);
     public static final SimpleGrantedAuthority USER_STUDENT = new SimpleGrantedAuthority(USER_TYPE_STUDENT);
     public static final SimpleGrantedAuthority USER_GUEST = new SimpleGrantedAuthority(USER_TYPE_GUEST);
+
+    public static final String PAGENO = "1";
+    public static final String PAGESIZE = "10";
+
+    public static final int KNOWLEDGE_NOT_MASTER = 0;
+    public static final int KNOWLEDGE_LACK = 1;
+    public static final int KNOWLEDGE_MASTER = 2;
 }

+ 1 - 1
src/main/java/edu/math/diagnosis/controller/OpenController.java

@@ -1,7 +1,7 @@
 package edu.math.diagnosis.controller;
 
 import edu.math.diagnosis.entity.UserInfo;
-import edu.math.diagnosis.model.Constants;
+import edu.math.diagnosis.config.Constants;
 import edu.math.diagnosis.service.UserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;

+ 1 - 1
src/main/java/edu/math/diagnosis/controller/PaperCommitController.java

@@ -1,7 +1,7 @@
 package edu.math.diagnosis.controller;
 
 import edu.math.diagnosis.entity.PaperCommit;
-import edu.math.diagnosis.model.Constants;
+import edu.math.diagnosis.config.Constants;
 import edu.math.diagnosis.model.Result;
 import edu.math.diagnosis.service.CommitService;
 import io.swagger.annotations.Api;

+ 1 - 1
src/main/java/edu/math/diagnosis/controller/UserManagerController.java

@@ -1,7 +1,7 @@
 package edu.math.diagnosis.controller;
 
 import edu.math.diagnosis.entity.UserInfo;
-import edu.math.diagnosis.model.Constants;
+import edu.math.diagnosis.config.Constants;
 import edu.math.diagnosis.service.UserService;
 import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.*;

+ 50 - 0
src/main/java/edu/math/diagnosis/entity/Chapter.java

@@ -0,0 +1,50 @@
+package edu.math.diagnosis.entity;
+
+import io.swagger.annotations.ApiModel;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@ApiModel("章节")
+public class Chapter {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+    private String name;
+    private String chapter;
+    private Long subjectId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getChapter() {
+        return chapter;
+    }
+
+    public void setChapter(String chapter) {
+        this.chapter = chapter;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+}

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

@@ -93,7 +93,7 @@ public class Question {
 
     @Lob
     @Column
-    @ApiModelProperty("题目各能力分数")
+    @ApiModelProperty("题目各能力分数 {\"A1:0\",\"A2\":1}")
     private String jsonScore;
 
     @CreationTimestamp

+ 38 - 0
src/main/java/edu/math/diagnosis/model/AbilityScoreListVo.java

@@ -0,0 +1,38 @@
+package edu.math.diagnosis.model;
+
+import java.util.List;
+
+public class AbilityScoreListVo {
+
+    private List<AbilityScoreVo> list;
+
+    public List<AbilityScoreVo> getList() {
+        return list;
+    }
+
+    public void setList(List<AbilityScoreVo> list) {
+        this.list = list;
+    }
+
+    public static class AbilityScoreVo {
+
+        private String code;
+        private Double score;
+
+        public String getCode() {
+            return code;
+        }
+
+        public void setCode(String code) {
+            this.code = code;
+        }
+
+        public Double getScore() {
+            return score;
+        }
+
+        public void setScore(Double score) {
+            this.score = score;
+        }
+    }
+}

+ 1 - 0
src/main/java/edu/math/diagnosis/model/AuthUser.java

@@ -1,5 +1,6 @@
 package edu.math.diagnosis.model;
 
+import edu.math.diagnosis.config.Constants;
 import edu.math.diagnosis.entity.UserInfo;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.core.GrantedAuthority;

+ 0 - 81
src/main/java/edu/math/diagnosis/model/Constants.java

@@ -1,81 +0,0 @@
-package edu.math.diagnosis.model;
-
-
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class Constants {
-    public static final String ALEADY = "aleady";
-    public static final String NOTALEADY = "notaleady";
-
-    public static final String TOPIC_SECTION = "【模块】";
-    public static final String TOPIC_QUESTION = "【题干】";
-    public static final String TOPIC_ANSWER = "【答案】";
-    public static final String TOPIC_TAG = "【标签】";
-    public static final String TOPIC_ABILITY = "【能力】";
-    public static final String TOPIC_EVALUATE_CORRECT = "【正确评语】";
-    public static final String TOPIC_EVALUATE_WRONG = "【错误评语】";
-    //    public static final String TOPIC_ANALYSE = "【分析】";
-//    public static final String TOPIC_EVALUATE = "【评价】";
-//    public static final String TOPIC_POINT = "【知识点】";
-    public static final String TOPIC_QUESTION_TYPE = "题目类型";
-
-    public static final int OPTION_NUMS = 5;
-    public static final int DEFAULT_HEIGHT = 300;
-    public static final int DEFAULT_WIDTH = 400;
-    public static final int MIN_HEIGHT = 150;
-    public static final int MIN_WIDTH = 200;
-    public static final int MAX_HEIGHT = 600;
-    public static final int MAX_WIDTH = 800;
-
-    public static final String TOPIC_ABILITY_CALC = "A1";//"计算能力";
-    public static final String TOPIC_ABILITY_INTRO = "A2";//"归纳类比";
-    public static final String TOPIC_ABILITY_SPACE = "A3";//"空间想象";
-    public static final String TOPIC_ABILITY_LANGUAGE = "A4";//"语言理解能力";
-    public static final String TOPIC_ABILITY_LOGIC = "A5";//"逻辑推理";
-    public static final String TOPIC_ABILITY_CONVERSION = "A6";//"转化迁移能力";
-
-    public static final String SUBJECT_LIT = "LIT"; //语文
-    public static final String SUBJECT_MAS = "MAS"; //数学
-    public static final String SUBJECT_PYS = "PYS"; //物理
-    public static final String SUBJECT_CHE = "CHE"; //化学
-    public static final String SUBJECT_BIO = "BIO"; //生物
-    public static final String SUBJECT_HST = "HST"; //历史
-    public static final String SUBJECT_GEO = "GEO"; //地理
-    public static final String SUBJECT_ENG = "ENG"; //英语
-    public static final String SUBJECT_POL = "POL"; //政治
-    public static final String SUBJECT_EMO = "EMO"; //情绪
-
-    public static final String MATH_JAX = "<script type=\"text/javascript\" async src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=MML_CHTML\" ></script>";
-
-    public static final Map<String, String> SUBJECTS = new HashMap<String, String>() {
-        {
-            put(SUBJECT_LIT, "语文");
-            put(SUBJECT_MAS, "数学");
-            put(SUBJECT_PYS, "物理");
-            put(SUBJECT_CHE, "化学");
-            put(SUBJECT_BIO, "生物");
-            put(SUBJECT_HST, "历史");
-            put(SUBJECT_GEO, "地理");
-            put(SUBJECT_ENG, "英语");
-            put(SUBJECT_POL, "政治");
-            put(SUBJECT_EMO, "情绪");
-        }
-    };
-
-    public static final String USER_TYPE_ADMIN = "admin";
-    public static final String USER_TYPE_STUDENT = "student";
-    public static final String USER_TYPE_TEACHER = "teacher";
-    public static final String USER_TYPE_GUEST = "guest";
-
-    public static final SimpleGrantedAuthority USER_ADMIN = new SimpleGrantedAuthority(USER_TYPE_ADMIN);
-    public static final SimpleGrantedAuthority USER_TEACHER = new SimpleGrantedAuthority(USER_TYPE_TEACHER);
-    public static final SimpleGrantedAuthority USER_STUDENT = new SimpleGrantedAuthority(USER_TYPE_STUDENT);
-    public static final SimpleGrantedAuthority USER_GUEST = new SimpleGrantedAuthority(USER_TYPE_GUEST);
-
-    public static final String PAGENO = "1";
-    public static final String PAGESIZE = "10";
-
-}

+ 190 - 27
src/main/java/edu/math/diagnosis/service/PaperResultService.java

@@ -1,5 +1,6 @@
 package edu.math.diagnosis.service;
 
+import edu.math.diagnosis.config.Constants;
 import edu.math.diagnosis.dao.PaperCommitRepo;
 import edu.math.diagnosis.dao.PaperResultRepo;
 import edu.math.diagnosis.entity.*;
@@ -10,14 +11,13 @@ import edu.math.diagnosis.util.ObjectUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.security.core.parameters.P;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class PaperResultService {
@@ -31,6 +31,10 @@ public class PaperResultService {
     private PaperService paperService;
     @Resource
     private KnowledgeService knowledgeService;
+    @Resource
+    private AbilityScoreService abilityScoreService;
+    @Resource
+    private SubjectAbilityService subjectAbilityService;
 
     private static final Logger logger = LoggerFactory.getLogger(PaperResultService.class);
 
@@ -51,7 +55,7 @@ public class PaperResultService {
         Map<String, Double> pData = ObjectUtil.json2Object(paper.getJsonScore(), Map.class);
         //清空value为0
         pData.keySet().forEach(d -> pData.put(d, 0d));
-        final Double[] score = {0d};
+        double score = 0d;
         for (Question q : questions) {
             String ans = q.getAnswer();
             if (StringUtils.isBlank(ans)) {
@@ -68,19 +72,20 @@ public class PaperResultService {
                 collectQuestion.add(q.getNumber());
                 String jsonScore = q.getJsonScore();
                 Map<String, Double> qData = ObjectUtil.json2Object(jsonScore, Map.class);
-                pData.keySet().forEach(d -> {
+                //计算分数
+                for (String d : pData.keySet()) {
                     Double pData0 = qData.getOrDefault(d, 0d) + pData.get(d);
-                    score[0] += qData.getOrDefault(d, 0d);
+                    score += qData.getOrDefault(d, 0d);
                     pData.put(d, pData0);
-                });
+                }
             }
         }
         result.setCollectQuestion(StringUtils.join(collectQuestion, ","));
         result.setJsonScore(ObjectUtil.object2Json(pData));
         //转换分数为百分制
         double totalScore = paper.getTotalScore();
-        double s = Double.parseDouble(NumberUtil.formatDouble(score[0] * 100 / totalScore));
-        result.setScore(totalScore == 0 ? score[0] : s);
+        double s = NumberUtil.format(score * 100 / totalScore);
+        result.setScore(totalScore == 0 ? score : s);
         result.setTotalScore(totalScore);
         paperResultRepo.save(result);
         logger.info("答案分析保存成功");
@@ -114,30 +119,188 @@ public class PaperResultService {
         PaperCommit commit = paperCommitRepo.findByPidAndUid(r.getPid(), r.getUid());
         Paper paper = paperService.getOnePaper(r.getPid());
         //知识点掌握率
-        r.setKnowledgeRate(88.88);
-        r.setAbilityScore("{}");
+        r.setKnowledgeRate(knowledgeRate(r, paper));
+        r.setAbilityScore(abilityScore(r, paper));
+
     }
 
-    public Double knowledgeRate(PaperResult result,PaperCommit commit, Paper paper) {
+    /**
+     * 知识点掌握率 = 各知识点掌握数总和 / 总知识点数
+     * 知识点掌握 为 该知识点对应的题目都做对了
+     *
+     * @param result 试卷答题
+     * @param paper  试卷
+     * @return 知识点掌握率
+     */
+    public Double knowledgeRate(PaperResult result, Paper paper) {
+
+//        Map<qid,tag> 定义为一对一 题目与知识点对应关系
+//        Map<Long, String> tags = new LinkedHashMap<>();
+
+//         Map<tag,num> 每个知识点的数量
+//        Map<String, Integer> tagNum = new LinkedHashMap<>();
+//        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());
+
+        //Map<tag,Set<number>> 知识点与题目对应
+        Map<String, Set<Integer>> tagNumbers = tagNumbers(paper);
+        //Map<tag,keep> 每个知识点的掌握情况
+        Map<String, Integer> tagKeep = tagKeep(collects, tagNumbers);
+
+        if (tagKeep.size() == 0) {
+            return 0D;
+        }
+        long count = tagKeep.values().stream().filter(t -> t == Constants.KNOWLEDGE_MASTER).count();
+
+        return NumberUtil.format(count * 100.0 / tagKeep.size());
+
+        //试卷的所有知识点
+//        Set<String> tag = new HashSet<>(tags.values());
+
+        //
+//        for (String c : collect) {
+//            Question q = questionMap.get(Integer.valueOf(c));
+//        }
+//
+//        for (SubjectKnowledge k : knowledge) {
+//            //每个知识点的能力标签
+//            String abilityCodes = k.getAbilityCodes();
+//            String[] codes = abilityCodes.split(",");
+//        }
+//        return 0d;
+    }
+
+
+    /**
+     * 能力分数
+     *
+     * @param result 提交的试卷
+     * @param paper  试卷
+     * @return {"计算能力":4.22,"转化能力":2.1}
+     */
+    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 HashMap<>();
+        //初始化能力分数
+        abilityCodes.keySet().forEach(e -> codeScore.put(e, 0d));
+
+        paper.getQuestions().forEach(q -> {
+            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);
+//                }
+//            });
+            //如果这题做对了 分数累加
+            if (collectQuestion.contains(q.getNumber())) {
+                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
+        for (Map.Entry<String, Double> e : codeScore.entrySet()) {
+            double s = e.getValue();
+            double score = NumberUtil.format(5 * s * 100.0 / paperJsonScore.get(e.getKey()));
+            d.put(abilityCodes.get(e.getKey()), score);
+        }
+        return ObjectUtil.object2Json(d);
+
+    }
 
-        //知识点掌握率 = 各知识点掌握数总和 / 总知识点数
-        //知识点掌握 为 该知识点对应的题目都做对了
+    /**
+     * 章节掌握情况
+     *
+     * @param result 提交的试卷
+     * @param paper  试卷
+     * @return [[1, 2, 0], [0, 0, 1]]
+     */
+    public String keepStatus(PaperResult result, Paper paper) {
+        List<List<Integer>> keepStatus = new ArrayList<>();
         Long subjectId = paper.getSubjectId();
         String grade = paper.getGrade();
         List<SubjectKnowledge> knowledge = knowledgeService.list(subjectId, grade);
-        //Map<qid,tag> 定义为一对一
-        Map<Long, String> tags = new LinkedHashMap<>();
-        List<Question> questions = paper.getQuestions();
-        String collectOption = result.getCollectQuestion();
-        String[] options = collectOption.split(",");
-//        List<QuestionOption> options = questions.stream().map(Question::getOptions).flatMap(Collection::stream).collect(Collectors.toList());
-        questions.forEach(q -> tags.put(q.getId(), q.getTag()));
+        //根据章节分组 Map<chapter,...>
+        Map<String, List<SubjectKnowledge>> group = knowledge.stream().collect(Collectors.groupingBy(SubjectKnowledge::getChapter));
+        List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
 
-        for (SubjectKnowledge k : knowledge) {
-            String abilityCodes = k.getAbilityCodes();
-            String[]codes = abilityCodes.split(",");
-        }
-        return 0d;
+        //Map<tag,Set<number>> 知识点与题目对应
+        Map<String, Set<Integer>> tagNumbers = tagNumbers(paper);
+        //Map<tag,keep> 每个知识点的掌握情况
+        Map<String, Integer> tagKeep = tagKeep(collects, tagNumbers);
+        group.forEach((chapter, list) -> {
+            List<Integer> chapterKeep = new ArrayList<>();
+            list.forEach(k -> {
+                //找到知识点的掌握情况
+                int keep = tagKeep.getOrDefault(k.getCode(), 0);
+                chapterKeep.add(keep);
+            });
+            keepStatus.add(chapterKeep);
+        });
+        return ObjectUtil.object2Json(keepStatus);
     }
 
+    public String chapterKeepRate(PaperResult result,Paper paper){
+        Map<String,Double> chapterKeepRate = new LinkedHashMap<>();
+        List<SubjectKnowledge> knowledge = knowledgeService.list(paper.getSubjectId(), paper.getGrade());
+        //根据章节分组 Map<chapter,...>
+        Map<String, List<SubjectKnowledge>> group = knowledge.stream().collect(Collectors.groupingBy(SubjectKnowledge::getChapter));
+        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);
+
+        return "{}";
+    }
+
+
+    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 -> {
+            String tag = q.getTag();
+//            tagNum.put(tag, tagNum.getOrDefault(tag, 0) + 1);
+            Set<Integer> number = tagNumbers.getOrDefault(tag, new HashSet<>());
+            number.add(q.getNumber());
+            tagNumbers.put(tag, number);
+        });
+        return tagNumbers;
+    }
+
+    private Map<String, Integer> tagKeep(List<Integer> collects, Map<String, Set<Integer>> tagNumbers) {
+        Map<String, Integer> tagKeep = new LinkedHashMap<>();
+        for (Map.Entry<String, Set<Integer>> entry : tagNumbers.entrySet()) {
+            Set<Integer> number = entry.getValue();
+            int right = Constants.KNOWLEDGE_NOT_MASTER;
+            if (collects.containsAll(number)) {
+                right = Constants.KNOWLEDGE_MASTER;
+            } else if (number.stream().anyMatch(collects::contains)) {
+                right = Constants.KNOWLEDGE_LACK;
+            }
+            tagKeep.put(entry.getKey(), right);
+        }
+        return tagKeep;
+    }
 }

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

@@ -4,7 +4,7 @@ import edu.math.diagnosis.dao.OptionRepo;
 import edu.math.diagnosis.dao.PaperRepo;
 import edu.math.diagnosis.dao.QuestionRepo;
 import edu.math.diagnosis.entity.*;
-import edu.math.diagnosis.model.Constants;
+import edu.math.diagnosis.config.Constants;
 import edu.math.diagnosis.model.PaperVo;
 import edu.math.diagnosis.model.Result;
 import edu.math.diagnosis.util.CommonUtil;

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

@@ -2,7 +2,7 @@ package edu.math.diagnosis.service;
 
 import edu.math.diagnosis.dao.PaperTemplateRepo;
 import edu.math.diagnosis.entity.PaperTemplate;
-import edu.math.diagnosis.model.Constants;
+import edu.math.diagnosis.config.Constants;
 import edu.math.diagnosis.util.CommonUtil;
 import org.springframework.stereotype.Service;
 

+ 11 - 0
src/main/java/edu/math/diagnosis/service/SubjectAbilityService.java

@@ -5,7 +5,9 @@ import edu.math.diagnosis.entity.SubjectAbility;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class SubjectAbilityService {
@@ -20,4 +22,13 @@ public class SubjectAbilityService {
     public List<SubjectAbility> list(Long subjectId) {
         return subjectAbilityRepo.findAllBySubjectId(subjectId);
     }
+
+    public Map<String, String> map(Long subjectId) {
+        List<SubjectAbility> abilities = list(subjectId);
+
+        // Map<code,Name>
+        Map<String, String> code = new HashMap<>();
+        abilities.forEach(a -> code.put(a.getCode(), a.getName()));
+        return code;
+    }
 }

+ 5 - 1
src/main/java/edu/math/diagnosis/util/NumberUtil.java

@@ -3,7 +3,7 @@ package edu.math.diagnosis.util;
 import java.text.DecimalFormat;
 
 public class NumberUtil {
-    private final static DecimalFormat df = new DecimalFormat("0.00");
+    private static final DecimalFormat df = new DecimalFormat("0.00");
 
     /**
      * 保留两位小数
@@ -15,6 +15,10 @@ public class NumberUtil {
         return df.format(d);
     }
 
+    public static Double format(double d) {
+        return Double.parseDouble(formatDouble(d));
+    }
+
     public static void main(String[] args) {
         System.out.println(Double.parseDouble(formatDouble(0.11111111)));
         System.out.println(Double.parseDouble(formatDouble(123.188)));

+ 13 - 0
src/main/java/edu/math/diagnosis/util/ObjectUtil.java

@@ -8,6 +8,7 @@ import java.lang.reflect.Field;
 import java.lang.reflect.Type;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @AUTHOR: DaiFengWen
@@ -27,6 +28,18 @@ public class ObjectUtil {
         return gson.fromJson(json, type);
     }
 
+    public static <T> Map<String, T> json2Map(String json) {
+        Type type = new TypeToken<HashMap<String, T>>() {
+        }.getType();
+        return gson.fromJson(json, type);
+    }
+
+    public static <T> List<T> json2List(String json) {
+        Type type = new TypeToken<List<T>>() {
+        }.getType();
+        return gson.fromJson(json, type);
+    }
+
     public static <T> T json2Object(String json, Class<T> clazz) {
         return gson.fromJson(json, clazz);
     }

+ 1 - 1
src/main/java/edu/math/diagnosis/word/WordService.java

@@ -4,7 +4,7 @@ import edu.math.diagnosis.entity.AbilityScore;
 import edu.math.diagnosis.entity.PaperTemplate;
 import edu.math.diagnosis.entity.Question;
 import edu.math.diagnosis.entity.QuestionOption;
-import edu.math.diagnosis.model.Constants;
+import edu.math.diagnosis.config.Constants;
 import edu.math.diagnosis.service.FileService;
 import edu.math.diagnosis.service.LocalFileService;
 import edu.math.diagnosis.util.CommonUtil;

+ 2 - 2
src/main/resources/application-dev.properties

@@ -2,9 +2,9 @@ server.port=8085
 serverAddress=119.23.22.31
 
 uploadPattern=/upload/**
-#baseLocation=d:/diagnosis
+baseLocation=d:/diagnosis
 #baseLocation=/Users/feick/IdeaProjects/yaoxiang/diagnosis
-baseLocation=/d:/diagnosis
+#baseLocation=/d:/diagnosis
 uploadLocation=${baseLocation}/upload/
 spring.servlet.multipart.location=${baseLocation}/uploadTemp/
 spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${uploadLocation}

+ 17 - 0
src/test/java/edu/math/diagnosis/service/NumberTest.java

@@ -0,0 +1,17 @@
+package edu.math.diagnosis.service;
+
+import edu.math.diagnosis.util.NumberUtil;
+import org.junit.Test;
+
+public class NumberTest {
+
+    @Test
+    public void convert(){
+        int c = 81;
+        int size = 99;
+//        NumberUtil.formatDouble()
+
+        System.out.println(c * 100.0 / size);
+
+    }
+}