Browse Source

feat: 增加用于展示的接口

181250114@smail.nju.edu.cn 4 years ago
parent
commit
cd7c5e2e92

+ 9 - 0
src/main/java/com/seecoder/dataanalysis/analysis/DisplayService.java

@@ -1,7 +1,9 @@
 package com.seecoder.dataanalysis.analysis;
 
+import cn.seecoder.bok.common.vo.QuestionVO;
 import com.seecoder.dataanalysis.data.entity.devcloud.display.FormatGroup;
 import com.seecoder.dataanalysis.data.entity.eval.User;
+import com.seecoder.dataanalysis.data.entity.eval.display.FormatQuestion;
 
 import java.util.List;
 
@@ -30,4 +32,11 @@ public interface DisplayService {
      * @return FormatGroup
      */
     FormatGroup getGroupAnalysisById(Integer user_id);
+
+    /**
+     * 推荐题目后,根据题目id集合返回题目集合
+     * @param user_id
+     * @return List<QuestionVO>
+     */
+    List<QuestionVO> getRecommendQuestions(int user_id);
 }

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

@@ -58,6 +58,13 @@ public interface EvalDataAnalysisService {
      * @param types 要显示的题目类型,由知识点来分类
      * @return questionsList 用于展示的题目列表
      */
-    List<FormatQuestion> getStudentQuestionsList(int userId, List<String> types);
+    List<FormatQuestion> getStudentQuestionsListByType(int userId, List<String> types);
+
+    /**
+     * 根据学生id返回所有做过的题目
+     * @param userId 学生id
+     * @return questionList 所有做过的题目
+     */
+    List<FormatQuestion> getStudentQuestions(int userId);
 
 }

+ 22 - 0
src/main/java/com/seecoder/dataanalysis/analysis/impl/DisplayServiceImpl.java

@@ -1,7 +1,10 @@
 package com.seecoder.dataanalysis.analysis.impl;
 
+import cn.seecoder.bok.common.vo.QuestionVO;
 import com.seecoder.dataanalysis.analysis.DevcloudDataAnalysisService;
 import com.seecoder.dataanalysis.analysis.DisplayService;
+import com.seecoder.dataanalysis.analysis.EvalDataAnalysisService;
+import com.seecoder.dataanalysis.analysis.RecommendService;
 import com.seecoder.dataanalysis.data.dao.devcloud.DevcloudUserDao;
 import com.seecoder.dataanalysis.data.dao.devcloud.ProjectRelateDao;
 import com.seecoder.dataanalysis.data.dao.eval.UserDao;
@@ -9,6 +12,8 @@ import com.seecoder.dataanalysis.data.entity.devcloud.DevcloudUser;
 import com.seecoder.dataanalysis.data.entity.devcloud.ProjectRelate;
 import com.seecoder.dataanalysis.data.entity.devcloud.display.FormatGroup;
 import com.seecoder.dataanalysis.data.entity.eval.User;
+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;
 
@@ -26,6 +31,10 @@ public class DisplayServiceImpl implements DisplayService {
     private DevcloudUserDao devcloudUserDao;
     @Autowired
     private DevcloudDataAnalysisService devcloudDataAnalysisService;
+    @Autowired
+    private RecommendService recommendService;
+    @Autowired
+    private QuestionService questionService;
 
     @Override
     public List<User> getAllUsers(){
@@ -78,4 +87,17 @@ public class DisplayServiceImpl implements DisplayService {
 
         return devcloudDataAnalysisService.getGroupAnalysis(project_id);
     }
+
+    @Override
+    public List<QuestionVO> getRecommendQuestions(int user_id){
+        List<String> questionIds = recommendService.getRecommendById(user_id);
+        List<QuestionVO> res = new ArrayList<>();
+
+        for(String id : questionIds){
+            QuestionVO question = questionService.getQuestionById(id);
+            res.add(question);
+        }
+
+        return res;
+    }
 }

+ 65 - 1
src/main/java/com/seecoder/dataanalysis/analysis/impl/EvalDataAnalysisServiceImpl.java

@@ -387,7 +387,7 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
     }
 
     @Override
-    public List<FormatQuestion> getStudentQuestionsList(int userId, List<String> types){
+    public List<FormatQuestion> getStudentQuestionsListByType(int userId, List<String> types){
         List<FormatQuestion> questionList = new ArrayList<>();
         List<EvalExamRecord> evalExamRecordList = evalExamRecordDao.findByUserId(userId);
         Map<String,Double> res = new HashMap<>();
@@ -431,6 +431,70 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
                     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());
+                                formatQuestion.setTime(evalExamRecord.getSubmitTime());
+                                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());
+                    formatQuestion.setTime(evalExamRecord.getSubmitTime());
+                    questionList.add(formatQuestion);
+                }
+                res.put(questionId,Double.valueOf(df.format(scorePercent)));
+
+            }
+        }
+        return questionList;
+    }
+
+    @Override
+    public List<FormatQuestion> getStudentQuestions(int userId){
+        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);
+
+                //如果题目分数为0,则跳过不做分析
+                if(questionAndScore.get(questionId) == 0){
+                    continue;
+                }
+//                System.out.println(errorQuestions.get(questionId));
 //                System.out.println(question.getQuestionScore());
                 //如果做过相同的题目,则取最高分
                 DecimalFormat df = new DecimalFormat("#.00");

+ 6 - 0
src/main/java/com/seecoder/dataanalysis/controller/DisplayController.java

@@ -3,6 +3,7 @@ package com.seecoder.dataanalysis.controller;
 import com.seecoder.dataanalysis.analysis.DisplayService;
 import com.seecoder.dataanalysis.vo.ResponseVO;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.aggregation.ArrayOperators;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -32,4 +33,9 @@ public class DisplayController {
     public ResponseVO getGroupAnalysisById(@RequestParam(value = "user_id") Integer user_id){
         return ResponseVO.buildSuccess(displayService.getGroupAnalysisById(user_id));
     }
+
+    @GetMapping("/getRecommendQuestions")
+    public ResponseVO getRecommendQuestions(@RequestParam(value = "user_id") Integer user_id){
+        return ResponseVO.buildSuccess(displayService.getRecommendQuestions(user_id));
+    }
 }

+ 7 - 2
src/main/java/com/seecoder/dataanalysis/controller/EvalController.java

@@ -45,8 +45,13 @@ public class EvalController {
         return ResponseVO.buildSuccess(evalDataAnalysisService.getStudentErrorQuestions(user_id));
     }
 
-    @GetMapping("/getStudentQuestionsList")
+    @GetMapping("/getStudentQuestionsListByType")
     public ResponseVO getStudentQuestionsList(@RequestParam(value = "user_id") int user_id, @RequestParam(value = "types") List<String> types){
-        return ResponseVO.buildSuccess(evalDataAnalysisService.getStudentQuestionsList(user_id,types));
+        return ResponseVO.buildSuccess(evalDataAnalysisService.getStudentQuestionsListByType(user_id,types));
+    }
+
+    @GetMapping("/getStudentQuestions")
+    public ResponseVO getStudentQuestions(@RequestParam(value = "user_id") int user_id){
+        return ResponseVO.buildSuccess(evalDataAnalysisService.getStudentQuestions(user_id));
     }
 }

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

@@ -210,7 +210,7 @@ public class EvalDataAnalysisServiceImplTest {
                 .setScore(55.0)
                 .setErrorQuestions(quesScore1)
                 .setSubmitTime(new Date())
-                .setUserId(2);
+                .setUserId(1626);
 
         evalExamRecordDao.save(evalExamRecord1);
 
@@ -378,9 +378,9 @@ public class EvalDataAnalysisServiceImplTest {
     @Test
     void testGetStudentQuestionsList(){
         List<String> types = new ArrayList<>();
-        types.add("SR");
+//        types.add("SR");
 //        List<FormatQuestion> formatQuestionList = evalDataAnalysisService.getStudentQuestionsList(2,types);
-        List<FormatQuestion> formatQuestionList = (List<FormatQuestion>)evalController.getStudentQuestionsList(2,types).getContent();
+        List<FormatQuestion> formatQuestionList = (List<FormatQuestion>)evalController.getStudentQuestionsList(1626,types).getContent();
 //        System.out.println(formatQuestionList.size());
         for(FormatQuestion formatQuestion : formatQuestionList){
             formatQuestion.display();