ソースを参照

feat: 增加QuestionList展示类和相关接口

181250114 4 年 前
親
コミット
6551a45153

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

@@ -2,6 +2,8 @@ package com.seecoder.dataanalysis.analysis;
 
 import cn.seecoder.bok.common.vo.QuestionVO;
 import com.seecoder.dataanalysis.data.entity.competency.CompetencyTree;
+import com.seecoder.dataanalysis.data.entity.eval.Question;
+import com.seecoder.dataanalysis.data.entity.eval.display.FormatQuestion;
 
 import java.util.List;
 import java.util.Map;
@@ -35,4 +37,12 @@ public interface EvalDataAnalysisService {
      */
     Map<String, Double> getStudentErrorQuestions(int userId);
 
+    /**
+     * 根据学生id和指定的知识点返回做过的题目列表
+     * @param userId 学生id
+     * @param types 要显示的题目类型,由知识点来分类
+     * @return questionsList 用于展示的题目列表
+     */
+    List<FormatQuestion> getStudentQuestionsList(int userId, List<String> types);
+
 }

+ 84 - 0
src/main/java/com/seecoder/dataanalysis/analysis/impl/EvalDataAnalysisServiceImpl.java

@@ -10,6 +10,7 @@ import com.seecoder.dataanalysis.data.entity.competency.*;
 import com.seecoder.dataanalysis.data.entity.eval.EvalExamInfo;
 import com.seecoder.dataanalysis.data.entity.eval.EvalExamRecord;
 import com.seecoder.dataanalysis.data.entity.eval.Question;
+import com.seecoder.dataanalysis.data.entity.eval.display.FormatQuestion;
 import com.seecoder.dataanalysis.logic.question.QuestionService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -275,4 +276,87 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
         return res;
     }
 
+    @Override
+    public List<FormatQuestion> getStudentQuestionsList(int userId, List<String> types){
+        List<FormatQuestion> questionList = new ArrayList<>();
+        List<EvalExamRecord> evalExamRecordList = evalExamRecordDao.findByUserId(userId);
+        Map<String,Double> res = new HashMap<>();
+
+        for(EvalExamRecord evalExamRecord : evalExamRecordList){
+            Optional<EvalExamInfo> result = evalExamInfoDao.findById(evalExamRecord.getExamId());
+            if(!result.isPresent()){
+                System.out.println("找不到对应考试信息");
+                continue;
+            }
+            EvalExamInfo evalExamInfo = evalExamInfoDao.findById(evalExamRecord.getExamId()).get();
+
+
+            //获得题目ID和题目分数的对应关系
+            Map<String,Double> questionAndScore = evalExamInfo.getQuestionAndScore();
+            Map<String,Double> errorQuestions = evalExamRecord.getErrorQuestions();
+            for(String questionId : errorQuestions.keySet()){
+                QuestionVO questionVO = questionService.getQuestionById(questionId);
+
+
+
+                Boolean isType = false;
+                //当Types为空的时候默认全选
+                if(types==null||types.size()==0){
+                    isType = true;
+                }else {
+                    for(String type : types){
+                        for(String know : questionVO.getKnowledgeId()){
+                            //包含,说明是要查找的type,则继续
+                            if(know.contains(type)){
+                                isType = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+                //如果该题不是要求返回的type,则跳过不做分析
+                if(isType == false){
+                    continue;
+                }
+                //如果题目分数为0,则跳过不做分析
+                if(questionAndScore.get(questionId) == 0){
+                    continue;
+                }
+//                System.out.println(errorQuestions.get(questionId));
+//                System.out.println(question.getQuestionScore());
+                //如果做过相同的题目,则取最高分
+                DecimalFormat df = new DecimalFormat("#.00");
+                //当前题目的得分比值
+                Double scorePercent = errorQuestions.get(questionId)/questionAndScore.get(questionId);
+                //如果res里已经有当前的questionId,说明这道题已经做过了,判断是否需要更新信息
+                if(res.containsKey(questionId)){
+                    scorePercent = Math.max(scorePercent,res.get(questionId));
+                    //只有当得分/总分比当前值更大的时候才需要更新
+                    if(scorePercent > res.get(questionId)){
+                        for(FormatQuestion formatQuestion : questionList){
+                            if(formatQuestion.getQuestionId().equals(questionId)){
+                                formatQuestion.setScore(errorQuestions.get(questionId));
+                                formatQuestion.setTotalScore(questionAndScore.get(questionId));
+                                formatQuestion.setExamId(evalExamRecord.getExamId());
+                                break;
+                            }
+                        }
+                    }
+                }else {//如果没有做过,则新建一个FormatQuestion
+                    FormatQuestion formatQuestion = new FormatQuestion();
+                    formatQuestion.setQuestionId(questionId);
+                    formatQuestion.setQuestionVO(questionVO);
+                    formatQuestion.setKnows(questionVO.getKnowledgeId());
+                    formatQuestion.setScore(errorQuestions.get(questionId));
+                    formatQuestion.setTotalScore(questionAndScore.get(questionId));
+                    formatQuestion.setExamId(evalExamRecord.getExamId());
+                    questionList.add(formatQuestion);
+                }
+                res.put(questionId,Double.valueOf(df.format(scorePercent)));
+
+            }
+        }
+        return questionList;
+    }
+
 }

+ 11 - 4
src/main/java/com/seecoder/dataanalysis/controller/EvalController.java

@@ -9,6 +9,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * @author Peng Yiyan
  * @since 2022/04/06
@@ -28,13 +30,18 @@ public class EvalController {
         return ResponseVO.buildSuccess(evalDataAnalysisService.getTreeById(user_id));
     }
 
-    @GetMapping("/getTreeAfterExam")
-    public ResponseVO getTreeAfterExam(@RequestParam(value = "record_id") int record_id){
-        return ResponseVO.buildSuccess(evalDataAnalysisService.getTreeAfterExam(record_id));
-    }
+//    @GetMapping("/getTreeAfterExam")
+//    public ResponseVO getTreeAfterExam(@RequestParam(value = "record_id") int record_id){
+//        return ResponseVO.buildSuccess(evalDataAnalysisService.getTreeAfterExam(record_id));
+//    }
 
     @GetMapping("/getStudentErrorQuestions")
     public ResponseVO getStudentErrorQuestions(@RequestParam(value = "user_id") int user_id){
         return ResponseVO.buildSuccess(evalDataAnalysisService.getStudentErrorQuestions(user_id));
     }
+
+    @GetMapping("/getStudentQuestionsList")
+    public ResponseVO getStudentQuestionsList(@RequestParam(value = "user_id") int user_id, @RequestParam(value = "types") List<String> types){
+        return ResponseVO.buildSuccess(evalDataAnalysisService.getStudentQuestionsList(user_id,types));
+    }
 }

+ 62 - 0
src/main/java/com/seecoder/dataanalysis/data/entity/eval/display/FormatQuestion.java

@@ -0,0 +1,62 @@
+package com.seecoder.dataanalysis.data.entity.eval.display;
+
+import cn.seecoder.bok.common.vo.QuestionVO;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 用于前端显示的Question类
+ */
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+@Data
+public class FormatQuestion {
+
+    /**
+     * 题目id
+     */
+    String questionId;
+
+    /**
+     * 知识点
+     */
+    List<String> knows;
+
+    /**
+     * 该题得分
+     */
+    Double score;
+
+    /**
+     * 该题总分
+     */
+    Double totalScore;
+
+    /**
+     * 题目来源的试卷
+     */
+    Integer examId;
+
+    /**
+     * 题目的完整信息
+     */
+    QuestionVO questionVO;
+
+    public void display(){
+        System.out.println("QuestionId: "+this.questionId);
+        System.out.print("Knowledges: ");
+        for(String know : this.knows){
+            System.out.print(know+" ");
+        }
+        System.out.println();
+        System.out.println("Score: "+this.score);
+        System.out.println("Total: "+this.totalScore);
+        System.out.println("ExamId: "+this.examId);
+        System.out.println(this.questionVO);
+    }
+}

+ 45 - 3
src/test/java/com/seecoder/dataanalysis/eval/impl/EvalDataAnalysisServiceImplTest.java

@@ -9,6 +9,7 @@ import com.seecoder.dataanalysis.data.entity.competency.*;
 import com.seecoder.dataanalysis.data.entity.eval.EvalExamInfo;
 import com.seecoder.dataanalysis.data.entity.eval.EvalExamRecord;
 import com.seecoder.dataanalysis.data.entity.eval.Question;
+import com.seecoder.dataanalysis.data.entity.eval.display.FormatQuestion;
 import com.seecoder.dataanalysis.logic.question.QuestionService;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -95,7 +96,7 @@ public class EvalDataAnalysisServiceImplTest {
 
         EvalExamInfo evalExamInfo1 = new EvalExamInfo()
                 .setExamId(1)
-                .setExamScore(100.0)
+                .setExamScore(150.0)
                 .setUpdateTime(new Date())
                 .setStartTime(new Date())
                 .setEndTime(new Date())
@@ -109,8 +110,23 @@ public class EvalDataAnalysisServiceImplTest {
         }else {
             System.out.println(evalExamInfo1.getDisposition());
         }
+
+        Map<String,Double> questionAndScore2 = new HashMap<>();
+        questionAndScore2.put(question1.getQuestionId(),100.0);
+
+        EvalExamInfo evalExamInfo2 = new EvalExamInfo()
+                .setExamId(2)
+                .setExamScore(100.0)
+                .setUpdateTime(new Date())
+                .setStartTime(new Date())
+                .setEndTime(new Date())
+                .setDifficulty(1)
+                .setQuestionAndScore(questionAndScore2);
+
+        evalExamInfoDao.save(evalExamInfo2);
     }
 
+
 //    @Test
 //    void addExamInfo(){
 //        Question question1 = questionDao.findById("abc123").get();
@@ -169,6 +185,19 @@ public class EvalDataAnalysisServiceImplTest {
                 .setUserId(2);
 
         evalExamRecordDao.save(evalExamRecord1);
+
+        Map<String, Double> quesScore2 = new HashMap<>();
+        quesScore2.put(question1.getQuestionId(),100.0);
+
+        EvalExamRecord evalExamRecord2 = new EvalExamRecord()
+                .setRecordId(2)
+                .setExamId(2)
+                .setScore(quesScore2.get(question1.getQuestionId()))
+                .setErrorQuestions(quesScore2)
+                .setSubmitTime(new Date())
+                .setUserId(2);
+
+        evalExamRecordDao.save(evalExamRecord2);
     }
 
 //    @Test
@@ -264,8 +293,8 @@ public class EvalDataAnalysisServiceImplTest {
 
     @Test
     void testGetTreeAfterExam(){
-//        evalDataAnalysisService.getTreeAfterExam(2);
-        evalController.getTreeAfterExam(1);
+        evalDataAnalysisService.getTreeAfterExam(2);
+//        evalController.getTreeAfterExam(1);
     }
 
     @Test
@@ -277,5 +306,18 @@ public class EvalDataAnalysisServiceImplTest {
         }
     }
 
+    @Test
+    void testGetStudentQuestionsList(){
+        List<String> types = new ArrayList<>();
+        types.add("SR");
+//        List<FormatQuestion> formatQuestionList = evalDataAnalysisService.getStudentQuestionsList(2,types);
+        List<FormatQuestion> formatQuestionList = (List<FormatQuestion>)evalController.getStudentQuestionsList(2,types).getContent();
+//        System.out.println(formatQuestionList.size());
+        for(FormatQuestion formatQuestion : formatQuestionList){
+            formatQuestion.display();
+        }
+    }
+
+
 
 }

+ 12 - 1
src/test/java/com/seecoder/dataanalysis/question/impl/QuestionServiceImplTest.java

@@ -68,7 +68,18 @@ public class QuestionServiceImplTest {
     void testSearchQuestions(){
         List<String> ks = new ArrayList<>();
         ks.add("SR");
-        System.out.println(questionService.searchQuestions(ks).size());
+        //搜索出所有“软件需求”大类的题目
+        List<QuestionVO> questionVOS = questionService.searchQuestions(ks);
+        List<String> questionIds = new ArrayList<>();
+        for(QuestionVO questionVO : questionVOS){
+            questionIds.add(questionVO.getId());
+        }
+        System.out.println(questionVOS.size());
+        System.out.println(questionIds.size());
+        //该题目的标签为SR.SRF,即软件需求基础,理应也是软件需求大类下的题目,但它并不在上述的题目集合里
+        System.out.println(questionService.getKnowledgesById("b39005ff-23c0-43a2-8174-f370f774eea8"));
+        System.out.println(questionVOS.contains(questionService.getQuestionById("b39005ff-23c0-43a2-8174-f370f774eea8")));
+        System.out.println(questionIds.contains("b39005ff-23c0-43a2-8174-f370f774eea8"));
     }
 
     @Test