Forráskód Böngészése

feat: 按照新方案完善KSD入库分析功能

181250114 4 éve
szülő
commit
280c798bc2

+ 4 - 4
src/main/java/com/seecoder/dataanalysis/analysis/EvalDataAnalysisService.java

@@ -13,10 +13,10 @@ public interface EvalDataAnalysisService {
 
     /**
      * 根据学生id,分析该学生的能力树,返回可用于可视化的结果
-     * @param student_id 学生id
+     * @param userId 学生id
      * @return competency_tree 返回能力树
      */
-    CompetencyTree getTreeById(int student_id);
+    CompetencyTree getTreeById(int userId);
 
     /**
      * 学生提交试卷,根据考试结果分析KSD并入库
@@ -27,10 +27,10 @@ public interface EvalDataAnalysisService {
 
     /**
      * 根据学生id,获得学生的错题列表
-     * @param student_id 学生id
+     * @param userId 学生id
      * @return Map<String, Double> errorQuestions 返回学生的错误题目
      */
-    Map<String, Double> getStudentErrorQuestions(int student_id);
+    Map<String, Double> getStudentErrorQuestions(int userId);
 
 
 }

+ 108 - 35
src/main/java/com/seecoder/dataanalysis/analysis/impl/EvalDataAnalysisServiceImpl.java

@@ -16,8 +16,7 @@ import com.sun.xml.internal.bind.v2.TODO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @author Peng Yiyan
@@ -36,8 +35,9 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
     private QuestionDao questionDao;
 
     @Override
-    public CompetencyTree getTreeById(int student_id){
+    public CompetencyTree getTreeById(int userId){
         //TODO 和ModelTree进行合并,空值补0,返回可以用于可视化的结果
+
         return null;
     }
 
@@ -48,7 +48,14 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
         //TODO 修改成逐条添加的形式
         EvalExamRecord evalExamRecord = evalExamRecordDao.findById(exam_id).get();
         EvalExamInfo evalExamInfo = evalExamInfoDao.findById(exam_id).get();
-        CompetencyTree competencyTree = competencyTreeDao.findById(evalExamRecord.getUserId()).get();
+        CompetencyTree competencyTree;
+
+        Optional<CompetencyTree> result = competencyTreeDao.findById(evalExamRecord.getUserId());
+        if(!result.isPresent()){
+            competencyTree = new CompetencyTree(evalExamRecord.getUserId());
+        }else {
+            competencyTree  = competencyTreeDao.findById(evalExamRecord.getUserId()).get();
+        }
 
         //数据取完,开始进行KSD分析和入库
         List<KSDScore> subTree = competencyTree.getSubCompetencyTree();
@@ -59,54 +66,120 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
         //得到学生所有题目的得分
         Map<String, Double> studentScores = evalExamRecord.getErrorQuestions();
 //        Map<String,Double> questionAndScore = evalExamInfo.getQuestionAndScore();
-        for(Map.Entry<String, Double> entry : studentScores.entrySet()){
+        //修改成不初始化,而是逐条添加的模式
+        for(Map.Entry<String,Double> entry : studentScores.entrySet()){
             String questionId = entry.getKey();
             Question question = questionDao.findById(questionId).get();
-            //在能力树中加成的部分 = 学生得分 * 试卷难度
+
+            //能力树中的加分 = 学生得分 * 试卷难度
             Double addScore = difficulty_percent[difficulty] * studentScores.get(questionId);
+            //增加能力树总分
             tree_Score += addScore;
-            //根据competency找大分类
-            for(KSDScore ksdScore : subTree){
-                if(ksdScore.getCompetency().equals(question.getCompetency())){
-                    //增加该能力子树的分数
-                    Double total_score = ksdScore.getTotalScore();
-                    total_score += addScore;
-                    ksdScore.setTotalScore(total_score);
-                    //在对应的competency下进行下一步小分类
-                    //修改K-S的分数
-                    List<KSScore> subKS = ksdScore.getKSScore();
-                    for(KSScore ksScore : subKS){
-                        if(ksScore.getKnowledge() == question.getKsScore().getKnowledge()){
-                            List<Double> Skills = ksScore.getSkillsAndScore();
-                            for(int i=0;i<Skills.size();i++){
-                                Double score = question.getKsScore().getSkillsAndScore().get(i) * addScore + Skills.get(i);
-                                Skills.set(i,score);
-                            }
-                            ksScore.setSkillsAndScore(Skills);
-                            break;
-                        }
+
+            for(int i=0;i<question.getCompetencies().size();i++){
+                String competency = question.getCompetencies().get(i);
+                KSScore ksScoreMessage = question.getKsScores().get(i);
+
+                //判定当前的subTree中是否添加过该分支,若添加过则直接修改,否则要新建分支
+                boolean existCom = false;
+                KSDScore changeKSDScore = new KSDScore();
+                //根据competency找大分类
+                for(KSDScore ksdScore : subTree){
+                    //competency大分支存在
+                    if(ksdScore.getCompetency().equals(competency)){
+                        existCom = true;
+                        changeKSDScore = ksdScore;
+                        break;
                     }
-                    List<DScore> subD = ksdScore.getDScore();
-                    //修改Disposition的分数
-                    for(DScore dScore : subD){
-                        if(dScore.getName().equals(disposition)){
-                            Double score = addScore + dScore.getScore();
-                            dScore.setScore(score);
-                            break;
-                        }
+                }
+                //competency大分支不存在,需要添加
+                if(existCom == false){
+                    changeKSDScore.setCompetency(competency);
+                    changeKSDScore.setTotalScore(0.0);
+                    List<KSScore> addKs = new ArrayList<>();
+                    List<DScore> addD = new ArrayList<>();
+                    changeKSDScore.setKSScore(addKs);
+                    changeKSDScore.setDScore(addD);
+                }
+
+
+                //增加该KSD子树的分数
+                Double total_score = changeKSDScore.getTotalScore();
+                total_score += addScore;
+                changeKSDScore.setTotalScore(total_score);
+
+                //开始处理KSScore,记录子分支是否存在
+                boolean existSubCom = false;
+                //在对应的competency下进行下一步小分类
+                List<KSScore> subKS = changeKSDScore.getKSScore();
+                KSScore changeKSScore = new KSScore();
+                for(KSScore ksScore : subKS){
+                    if(ksScore.getKnowledge().equals(ksScoreMessage.getKnowledge())){
+                        existSubCom = true;
+                        changeKSScore = ksScore;
+                        break;
                     }
                 }
+                //sub小分支不存在,需要添加并对分支名称和分数进行初始化
+                if(existSubCom == false){
+                    changeKSScore.setKnowledge(ksScoreMessage.getKnowledge());
+                    changeKSScore.setSkillsAndScore(Arrays.asList(new Double[]{0.0,0.0,0.0,0.0,0.0,0.0}));
+                }
+                List<Double> skills = changeKSScore.getSkillsAndScore();
+                for(int j=0;j<skills.size();j++){
+                    Double score = ksScoreMessage.getSkillsAndScore().get(j) * addScore + skills.get(i);
+                    skills.set(j,score);
+                }
+                changeKSScore.setSkillsAndScore(skills);
+                //需要增加新建的KS子分支
+                if(existSubCom == false){
+                    subKS.add(changeKSScore);
+                }
+
+
+
+                //开始处理DScore,记录该品质是否存在
+                boolean existD = false;
+                List<DScore> subD = changeKSDScore.getDScore();
+                DScore changeDScore = new DScore();
+                for(DScore dScore : subD){
+                    if(dScore.getName().equals(disposition)){
+                        existD = true;
+                        changeDScore = dScore;
+                        break;
+                    }
+                }
+                if(existD == false){
+                    changeDScore.setName(disposition);
+                    changeDScore.setScore(0.0);
+                }
+                Double addDScore = addScore + changeDScore.getScore();
+                changeDScore.setScore(addDScore);
+                //需要增加新建的D子分支
+                if(existD == false){
+                    subD.add(changeDScore);
+                }
+
+                //处理完KS分支和D分支
+                changeKSDScore.setKSScore(subKS);
+                changeKSDScore.setDScore(subD);
+
+                if(existCom == false){
+                    subTree.add(changeKSDScore);
+                }
             }
         }
+
         //处理完考试中的每个问题后,更新能力树
         competencyTree.setTreeScore(tree_Score);
+        competencyTree.setSubCompetencyTree(subTree);
         competencyTreeDao.save(competencyTree);
 
         return competencyTree;
     }
 
     @Override
-    public Map<String, Double> getStudentErrorQuestions(int student_id){
+    public Map<String, Double> getStudentErrorQuestions(int userId){
         //TODO 需要综合题目总分考虑
 
         return null;

+ 5 - 0
src/main/java/com/seecoder/dataanalysis/data/entity/competency/CompetencyTree.java

@@ -43,6 +43,11 @@ public class CompetencyTree {
         this.subCompetencyTree = new ArrayList<>();
     }
 
+    public CompetencyTree(Integer userId){
+        this.userId = userId;
+        this.subCompetencyTree = new ArrayList<>();
+    }
+
     /**
      * 生成初始化好的能力树,用于可视化结果返回
      * @return CompetencyTree 初始化好的能力树

+ 10 - 43
src/main/java/com/seecoder/dataanalysis/data/entity/eval/Question.java

@@ -9,8 +9,10 @@ import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.mapping.Document;
 import org.springframework.data.mongodb.core.mapping.Field;
 
+import java.util.List;
+
 /**
- * @author
+ * @author Peng Yiyan
  */
 @Document(collection = "question")
 @NoArgsConstructor
@@ -30,53 +32,18 @@ public class Question {
      * 题目总分值
      */
     @Field("question_score")
-    private String questionScore;
+    private Double questionScore;
 
     /**
-     * 题目考察的能力
+     * 题目考察的能力,可能考察多种不同能力,所以用list存储
      */
-    @Field("competency")
-    private String competency;
+    @Field("competencies")
+    private List<String> competencies;
 
     /**
-     * 题目考察的K-S对
+     * 题目考察的K-S对,和competencies中的下标一一对应
      */
-    @Field("ks_Score")
-    private KSScore ksScore;
-
-
-
-    public String getQuestionId() {
-        return questionId;
-    }
-
-    public void setQuestionId(String questionId) {
-        this.questionId = questionId;
-    }
-
-    public String getQuestionScore() {
-        return questionScore;
-    }
-
-    public void setQuestionScore(String questionScore) {
-        this.questionScore = questionScore;
-    }
-
-    public String getCompetency() {
-        return competency;
-    }
-
-    public void setCompetency(String competency) {
-        this.competency = competency;
-    }
-
-    public KSScore getKsScore() {
-        return ksScore;
-    }
-
-    public void setKsScore(KSScore ksScore) {
-        this.ksScore = ksScore;
-    }
-
+    @Field("ks_Scores")
+    private List<KSScore> ksScores;
 
 }

+ 32 - 0
src/test/java/com/seecoder/dataanalysis/eval/impl/EvalDataAnalysisServiceImplTest.java

@@ -1,18 +1,44 @@
 package com.seecoder.dataanalysis.eval.impl;
 
 import com.seecoder.dataanalysis.data.dao.competency.CompetencyTreeDao;
+import com.seecoder.dataanalysis.data.dao.eval.EvalExamRecordDao;
 import com.seecoder.dataanalysis.data.entity.competency.CompetencyTree;
 import com.seecoder.dataanalysis.data.entity.competency.Competencies;
+import com.seecoder.dataanalysis.data.entity.eval.EvalExamRecord;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 @SpringBootTest
 public class EvalDataAnalysisServiceImplTest {
 
     @Autowired
     CompetencyTreeDao competencyTreeDao;
 
+    @Autowired
+    EvalExamRecordDao evalExamRecordDao;
+
+    @Test
+    void addExamRecord(){
+        Map<String, Double> quesScore = new HashMap<>();
+        quesScore.put("1", 50.0);
+        quesScore.put("2", 50.0);
+
+        EvalExamRecord evalExamRecord = new EvalExamRecord()
+                .setRecordId(2)
+                .setExamId(2)
+                .setScore(10.0)
+                .setErrorQuestions(quesScore)
+                .setSubmitTime(new Date())
+                .setUserId(1);
+        evalExamRecordDao.save(evalExamRecord);
+    }
+
     @Test
     void testModelTree(){
         Competencies competencies = new Competencies();
@@ -20,4 +46,10 @@ public class EvalDataAnalysisServiceImplTest {
         model.display();
         competencyTreeDao.save(model);
     }
+
+    @Test
+    void testFindByUserId(){
+        List<EvalExamRecord> evalExamRecordList = evalExamRecordDao.findByUserId(1);
+        System.out.println(evalExamRecordList.size());
+    }
 }