Просмотр исходного кода

feat: 优化Eval和Question服务

181250114 4 лет назад
Родитель
Сommit
ead251e847

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

@@ -1,7 +1,9 @@
 package com.seecoder.dataanalysis.analysis;
 
+import cn.seecoder.bok.common.vo.QuestionVO;
 import com.seecoder.dataanalysis.data.entity.competency.CompetencyTree;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -33,5 +35,4 @@ public interface EvalDataAnalysisService {
      */
     Map<String, Double> getStudentErrorQuestions(int userId);
 
-
 }

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

@@ -1,6 +1,8 @@
 package com.seecoder.dataanalysis.analysis.impl;
 
+import cn.seecoder.bok.common.vo.QuestionVO;
 import com.seecoder.dataanalysis.analysis.EvalDataAnalysisService;
+import com.seecoder.dataanalysis.controller.EvalController;
 import com.seecoder.dataanalysis.data.dao.competency.CompetencyTreeDao;
 import com.seecoder.dataanalysis.data.dao.eval.EvalExamInfoDao;
 import com.seecoder.dataanalysis.data.dao.eval.EvalExamRecordDao;
@@ -126,7 +128,7 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
         //修改成不初始化,而是逐条添加的模式,对每一题进行分析入库
         for (Map.Entry<String, Double> entry : studentScores.entrySet()) {
             String questionId = entry.getKey();
-            Question question = questionService.getQuestionById(questionId);
+            Question question = questionService.getQuestionByIdForAnalysis(questionId);
             List<String> knowledgeList = question.getCompetencies();
             Integer weight = question.getWeight();
 
@@ -254,12 +256,7 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
             Map<String,Double> questionAndScore = evalExamInfo.getQuestionAndScore();
             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 = questionService.getQuestionById(questionId);
+                Question question = questionService.getQuestionByIdForAnalysis(questionId);
                 //如果题目分数为0,则跳过该题不做分析
                 if(questionAndScore.get(questionId) == 0){
                     continue;
@@ -277,4 +274,5 @@ public class EvalDataAnalysisServiceImpl implements EvalDataAnalysisService {
         }
         return res;
     }
+
 }

+ 39 - 5
src/main/java/com/seecoder/dataanalysis/logic/question/Impl/QuestionServiceImpl.java

@@ -1,14 +1,21 @@
 package com.seecoder.dataanalysis.logic.question.Impl;
 
 import cn.seecoder.bok.client.SeecoderBokClient;
+import cn.seecoder.bok.common.QuestionType;
+import cn.seecoder.bok.common.vo.KnowledgeNodeVO;
 import cn.seecoder.bok.common.vo.QuestionVO;
 import com.seecoder.dataanalysis.data.entity.eval.Question;
 import com.seecoder.dataanalysis.logic.question.QuestionService;
 import com.seecoder.dataanalysis.vo.question.CompleteQuestionVO;
 import org.apache.kafka.common.protocol.types.Field;
 import org.springframework.beans.BeanUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
@@ -17,7 +24,17 @@ import java.util.Optional;
 public class QuestionServiceImpl implements QuestionService {
 
     @Override
-    public Question getQuestionById(String questionId){
+    public QuestionVO getQuestionById(String questionId){
+        SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
+        Optional<QuestionVO> response = seecoderBokClient.getQuestionById(questionId);
+        if(!response.isPresent()){
+            System.out.println("不存在该题目");
+        }
+        return response.get();
+    }
+
+    @Override
+    public Question getQuestionByIdForAnalysis(String questionId){
         SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
         Optional<QuestionVO> response = seecoderBokClient.getQuestionById(questionId);
         if(!response.isPresent()){
@@ -34,11 +51,28 @@ public class QuestionServiceImpl implements QuestionService {
         Question question = new Question(res);
 //        for(String s : question.getCompetencies()) {
 //            System.out.println(s);
-//            String[] cs = s.split("\\.");
-//            for(String s1 : cs){
-//                System.out.println(s1);
-//            }
 //        }
         return question;
     }
+
+    @Override
+    public List<QuestionVO> searchQuestions(List<String> knowledgeIds){
+        SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
+        List<String> tags = new ArrayList<>();
+        List<QuestionType> types = new ArrayList<>();
+        List<Integer> weights = new ArrayList<>();
+        Pageable page = PageRequest.of(0, 5000, Sort.by("id").ascending());
+        Page<QuestionVO> response = seecoderBokClient.getQuestionList("", tags, types, weights, knowledgeIds, page);
+        return response.getContent();
+    }
+
+    @Override
+    public List<String> getKnowledgesById(String questionId){
+        SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
+        Optional<QuestionVO> response = seecoderBokClient.getQuestionById(questionId);
+        if(!response.isPresent()){
+            System.out.println("不存在该题目");
+        }
+        return response.get().getKnowledgeId();
+    }
 }

+ 39 - 2
src/main/java/com/seecoder/dataanalysis/logic/question/QuestionService.java

@@ -1,12 +1,49 @@
 package com.seecoder.dataanalysis.logic.question;
 
+import cn.seecoder.bok.client.ParamUtil;
+import cn.seecoder.bok.common.QuestionType;
+import cn.seecoder.bok.common.vo.KnowledgeNodeVO;
+import cn.seecoder.bok.common.vo.QuestionVO;
 import com.seecoder.dataanalysis.data.entity.eval.Question;
+import okhttp3.HttpUrl;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 封装第三方题库bok得到的Service类
+ */
 public interface QuestionService {
+
+    /**
+     * 调用第三方题库,从题库系统获得题目原始信息
+     * @param questionId
+     * @return QuestionVO
+     */
+    QuestionVO getQuestionById(String questionId);
+
     /**
      * 调用第三方题库,从题库获得题目相关信息
+     * 本接口获得的是用于KSD分析系统,处理后的Question
+     * @param questionId
+     * @return Question 属于分析系统的特殊问题实体
+     */
+    Question getQuestionByIdForAnalysis(String questionId);
+
+    /**
+     * 筛选功能,根据筛选条件返回题目集合
+     * @param knowledgeIds 目标题目的知识点标签集合
+     * @return List<KnowledgeNodeVO>
+     */
+    List<QuestionVO> searchQuestions(List<String> knowledgeIds);
+
+    /**
+     * 获得题目的知识点
      * @param questionId
-     * @return Question
+     * @return List<String>
      */
-    Question getQuestionById(String questionId);
+    List<String> getKnowledgesById(String questionId);
 }

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

@@ -87,8 +87,8 @@ public class EvalDataAnalysisServiceImplTest {
 
     @Test
     void addExamInfo(){
-        Question question1 = questionService.getQuestionById("43604f6f-f829-4aaf-ab97-47b99c20ede0");
-        Question question2 = questionService.getQuestionById("b39005ff-23c0-43a2-8174-f370f774eea8");
+        Question question1 = questionService.getQuestionByIdForAnalysis("43604f6f-f829-4aaf-ab97-47b99c20ede0");
+        Question question2 = questionService.getQuestionByIdForAnalysis("b39005ff-23c0-43a2-8174-f370f774eea8");
         Map<String,Double> questionAndScore1 = new HashMap<>();
         questionAndScore1.put(question1.getQuestionId(),100.0);
         questionAndScore1.put(question2.getQuestionId(),50.0);
@@ -152,8 +152,8 @@ public class EvalDataAnalysisServiceImplTest {
 
     @Test
     void addExamRecord(){
-        Question question1 = questionService.getQuestionById("43604f6f-f829-4aaf-ab97-47b99c20ede0");
-        Question question2 = questionService.getQuestionById("b39005ff-23c0-43a2-8174-f370f774eea8");
+        Question question1 = questionService.getQuestionByIdForAnalysis("43604f6f-f829-4aaf-ab97-47b99c20ede0");
+        Question question2 = questionService.getQuestionByIdForAnalysis("b39005ff-23c0-43a2-8174-f370f774eea8");
         Map<String, Double> quesScore1 = new HashMap<>();
         quesScore1.put(question1.getQuestionId(),80.0);
         quesScore1.put(question2.getQuestionId(),30.0);

+ 55 - 2
src/test/java/com/seecoder/dataanalysis/question/impl/QuestionServiceImplTest.java

@@ -1,27 +1,80 @@
 package com.seecoder.dataanalysis.question.impl;
 
 import cn.seecoder.bok.client.SeecoderBokClient;
+import cn.seecoder.bok.common.QuestionType;
+import cn.seecoder.bok.common.vo.KnowledgeNodeVO;
 import cn.seecoder.bok.common.vo.QuestionVO;
 import com.seecoder.dataanalysis.logic.question.QuestionService;
 import com.seecoder.dataanalysis.vo.question.CompleteQuestionVO;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.web.PageableDefault;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Optional;
 
 @SpringBootTest
 public class QuestionServiceImplTest {
+
     @Autowired
     private QuestionService questionService;
 
     @Test
     void testGetQuestionId1(){
-        questionService.getQuestionById("43604f6f-f829-4aaf-ab97-47b99c20ede0");
+        questionService.getQuestionByIdForAnalysis("43604f6f-f829-4aaf-ab97-47b99c20ede0");
     }
 
     @Test
     void testGetQuestionId2(){
-        questionService.getQuestionById("b39005ff-23c0-43a2-8174-f370f774eea8");
+        questionService.getQuestionByIdForAnalysis("b39005ff-23c0-43a2-8174-f370f774eea8");
+    }
+
+    @Test
+    void testGetQuestionId3(){
+        QuestionVO questionVO = questionService.getQuestionById("43604f6f-f829-4aaf-ab97-47b99c20ede0");
+        System.out.println(questionVO);
+    }
+
+    @Test
+    void testGetQuestions(){
+        SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
+        List<String> tags = new ArrayList<>();
+//        tags.add("SR");
+        List<QuestionType> types = new ArrayList<>();
+        types.add(QuestionType.CHOICE);
+        List<Integer> weights = new ArrayList<>();
+//        weights.add(3);
+        List<String> knows = new ArrayList<>();
+        knows.add("SR");
+        Pageable page = PageRequest.of(0, 5000, Sort.by("id").ascending());
+        Page<QuestionVO> response = seecoderBokClient.getQuestionList("", tags, types, weights, knows,page);
+        System.out.println(response.getContent().size());
+    }
+
+//    @Test
+//    void testGetKnowlegde(){
+//        SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
+//        List<KnowledgeNodeVO> response = seecoderBokClient.getKnowledgeNode("软件需求");
+//        System.out.println(response);
+//    }
+
+    @Test
+    void testSearchQuestions(){
+        List<String> ks = new ArrayList<>();
+        ks.add("SR");
+        System.out.println(questionService.searchQuestions(ks).size());
+    }
+
+    @Test
+    void test(){
+        String s = "SR";
+        String[] strs = s.split("\\.");
+        System.out.println(strs[0]);
     }
 }