Переглянути джерело

feat: 完成返回学生的错题信息功能

181250114 4 роки тому
батько
коміт
319b408e4a

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

@@ -26,9 +26,10 @@ public interface EvalDataAnalysisService {
     CompetencyTree getTreeAfterExam(int exam_id);
 
     /**
-     * 根据学生id,获得学生的错题列表
+     * 根据学生id,获得学生的错题列表,用于推荐系统
      * @param userId 学生id
      * @return Map<String, Double> errorQuestions 返回学生的错误题目
+     * 其中String代表题号,Double代表 学生得分/总分,值越高,说明学生掌握程度越高
      */
     Map<String, Double> getStudentErrorQuestions(int userId);
 

+ 21 - 5
src/main/java/com/seecoder/dataanalysis/analysis/impl/EvalDataAnalysisServiceImpl.java

@@ -44,8 +44,7 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
     @Override
     public CompetencyTree getTreeAfterExam(int exam_id){
         //TODO 测试检查
-        //TODO 修改Question的对应关系
-        //TODO 修改成逐条添加的形式
+
         EvalExamRecord evalExamRecord = evalExamRecordDao.findById(exam_id).get();
         EvalExamInfo evalExamInfo = evalExamInfoDao.findById(exam_id).get();
         CompetencyTree competencyTree;
@@ -180,8 +179,25 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
 
     @Override
     public Map<String, Double> getStudentErrorQuestions(int userId){
-        //TODO 需要综合题目总分考虑
-
-        return null;
+        List<EvalExamRecord> evalExamRecordList = evalExamRecordDao.findByUserId(userId);
+        Map<String,Double> res = new HashMap<>();
+        for(EvalExamRecord evalExamRecord : evalExamRecordList){
+            Map<String,Double> errorQuestions = evalExamRecord.getErrorQuestions();
+            for(String questionId : errorQuestions.keySet()){
+                Optional<Question> result = questionDao.findById(questionId);
+                if(!result.isPresent()){
+                    System.out.println("题号不存在");
+                    continue;
+                }
+                Question question = questionDao.findById(questionId).get();
+                //如果题目分数为0,则跳过该题不做分析
+                if(question.getQuestionScore() == 0){
+                    continue;
+                }
+                Double scorePercent = errorQuestions.get(questionId) / question.getQuestionScore();
+                res.put(questionId,res.getOrDefault(questionId,0.0)+scorePercent);
+            }
+        }
+        return res;
     }
 }

+ 4 - 0
src/main/java/com/seecoder/dataanalysis/data/dao/eval/EvalExamRecordDao.java

@@ -3,5 +3,9 @@ package com.seecoder.dataanalysis.data.dao.eval;
 import com.seecoder.dataanalysis.data.entity.eval.EvalExamRecord;
 import org.springframework.data.mongodb.repository.MongoRepository;
 
+import java.util.List;
+
 public interface EvalExamRecordDao extends MongoRepository<EvalExamRecord, Integer> {
+
+    List<EvalExamRecord> findByUserId(int userId);
 }

+ 4 - 1
src/test/java/com/seecoder/dataanalysis/eval/impl/EvalDataAnalysisServiceImplTest.java

@@ -32,7 +32,7 @@ public class EvalDataAnalysisServiceImplTest {
         EvalExamRecord evalExamRecord = new EvalExamRecord()
                 .setRecordId(2)
                 .setExamId(2)
-                .setScore(10.0)
+                .setScore(100.0)
                 .setErrorQuestions(quesScore)
                 .setSubmitTime(new Date())
                 .setUserId(1);
@@ -51,5 +51,8 @@ public class EvalDataAnalysisServiceImplTest {
     void testFindByUserId(){
         List<EvalExamRecord> evalExamRecordList = evalExamRecordDao.findByUserId(1);
         System.out.println(evalExamRecordList.size());
+        for(EvalExamRecord evalExamRecord : evalExamRecordList){
+            System.out.println(evalExamRecord.getScore());
+        }
     }
 }