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

Merge branch 'master' of http://gogs.seec.seecoder.cn/LiXueSong/DataAnalysis

sky 5 лет назад
Родитель
Сommit
26ac533d05

+ 1 - 1
seec-data-server/src/main/java/cn/seecoder/data/server/controller/KnowledgeController.java

@@ -31,7 +31,7 @@ public class KnowledgeController {
 
     @RequestMapping("/knowledge-tree/position/{position}")
     public KnowledgePointVO getKnowledgeTreeOnPosition(@PathVariable("position") String position){
-        return knowledgeService.getTreeByPosition(position);
+        return knowledgeService.getTreeByPositionAndUser(position,332);
     }
 
 }

+ 69 - 15
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/KnowledgeServiceImpl.java

@@ -12,6 +12,7 @@ import cn.seecoder.data.server.repository.knowledge.PositionWeightRepository;
 import cn.seecoder.data.server.service.KnowledgeService;
 import cn.seecoder.data.server.vo.knowledge.KnowledgePointVO;
 import cn.seecoder.data.server.vo.knowledge.KnowledgeVO;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -86,6 +87,13 @@ public class KnowledgeServiceImpl implements KnowledgeService {
                 String tempLevel = prefix + knowledgeLevel[j];
                 if(!getAbbOnVO(upNode.getKnowledgePointVOs()).contains(tempLevel)){
                     nodeToAdd = new KnowledgePointVO(tempLevel,knowledgeInfo.getName(),0,0,0,0,0,0,0,null);
+                    if(j+1==knowledgeLevel.length) {
+                        SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
+                        ArrayList<String> knowledgeIds = new ArrayList<>();
+                        knowledgeIds.add(tempLevel);
+                        long questionNum = seecoderBokClient.getQuestionList(null, null, knowledgeIds, null).getTotalElements();
+                        nodeToAdd.setQuestionsNumTotal(questionNum);
+                    }
                     if(knowledgeRepository.findByAbbreviation(tempLevel).getIsleaf()==1)
                         nodeToAdd.setLeafWeight(positionWeight.getWeight());
                     else{
@@ -106,6 +114,7 @@ public class KnowledgeServiceImpl implements KnowledgeService {
                 prefix = tempLevel;
             }
         }
+        getQuestionTotal(root);
         return root;
     }
 
@@ -121,25 +130,67 @@ public class KnowledgeServiceImpl implements KnowledgeService {
         for(int i=0;i<generalRecordDaos.size();i++) {
             Object[] cells = (Object[]) generalRecordDaos.get(i);
             questionIds.add((String)cells[0]);
-            scores.add((Double) (cells[1]));
+            scores.add(Double.valueOf(cells[1].toString()));
             scoresTotal.add(Double.valueOf(generalRecordRepository.getByQuestionId((String)cells[0]).get(0).getScoreTotal()));
         }
         SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
         List<QuestionVO> questionVOS = seecoderBokClient.getQuestionListByIds(questionIds);
-        return null;
+        for(int i=0;i<questionVOS.size();i++){
+            QuestionVO questionInfo = questionVOS.get(i);
+            List<String> knowledges = questionInfo.getKnowledgeId();
+            if(knowledges!=null)
+                for(String knowledge : knowledges){
+                    if(abbs.contains(knowledge) && knowledgeRepository.findByAbbreviation(knowledge).getIsleaf()==1 && !knowledge.equals("SE"))
+                        addScoreToNode(root,scores.get(i),scoresTotal.get(i),questionInfo,knowledge,1);
+                }
+        }
+        return root;
+    }
+
+
+    private KnowledgePointVO addScoreToNode(KnowledgePointVO root, Double score, Double scoreTotal, QuestionVO questionInfo,String knowledege,int deep) {
+        String[] nodeKnowledge = knowledege.split("\\.");
+        String now = nodeKnowledge[0];
+        for(int i=1;i<deep && i<nodeKnowledge.length;i++)
+            now = now + "." + nodeKnowledge[i];
+        if(root.getLeafWeight()==0){
+            KnowledgePointVO nextNode = root.getKnowledgePointVOs().get(getAbbOnVO(root.getKnowledgePointVOs()).indexOf(now));
+            KnowledgePointVO leafNode = addScoreToNode(nextNode,score,scoreTotal,questionInfo,knowledege,deep+1);
+            root.setQuestionsNumDone(root.getQuestionsNumDone()+1);
+            root.setScoreGotten(root.getScoreGotten()+leafNode.getScoreGotten());
+            root.setScoreTotal(root.getScoreTotal()+leafNode.getScoreTotal());
+            if(root.getScoreTotal()!=0)
+                root.setCorrectRate(root.getScoreGotten()/root.getScoreTotal());
+            if(root.getQuestionsNumTotal()!=0)
+                root.setCoverageRate(root.getQuestionsNumDone()/root.getQuestionsNumTotal());
+            return leafNode;
+        }
+        else{
+            root.setQuestionsNumDone(root.getQuestionsNumDone()+1);
+            root.setScoreGotten(score*root.getLeafWeight());
+            root.setScoreTotal(scoreTotal*root.getLeafWeight());
+            if(root.getScoreTotal()!=0)
+                root.setCorrectRate(root.getScoreGotten()/root.getScoreTotal());
+            if(root.getQuestionsNumTotal()!=0)
+                root.setCoverageRate(root.getQuestionsNumDone()/root.getQuestionsNumTotal());
+            return root;
+        }
+    }
+
+    private double getQuestionTotal(KnowledgePointVO root) {
+        if(root.getQuestionsNumTotal()!=0)
+            return root.getQuestionsNumTotal();
+        else{
+            double num = 0;
+            if(root.getKnowledgePointVOs()!=null){
+                for(KnowledgePointVO knowledgePointVO : root.getKnowledgePointVOs())
+                    num = num + getQuestionTotal(knowledgePointVO);
+                root.setQuestionsNumTotal(num);
+            }
+            return num;
+        }
     }
 
-//    private void isleaf(KnowledgePointVO root) {
-//        KnowledgeDao knowledgeDao = knowledgeRepository.findByAbbreviation(root.getKnowledge());
-//        if(root.getKnowledgePointVOs()==null)
-//            knowledgeDao.setIsleaf(1);
-//        else{
-//            knowledgeDao.setIsleaf(0);
-//            for(KnowledgePointVO child : root.getKnowledgePointVOs())
-//                isleaf(child);
-//        }
-//        knowledgeRepository.save(knowledgeDao);
-//    }
 
     public ArrayList<String> getAbbOnVO(List<KnowledgePointVO> knowledgePointVOS){
         ArrayList<String> arrayList= new ArrayList<>();
@@ -151,7 +202,10 @@ public class KnowledgeServiceImpl implements KnowledgeService {
     }
 
     public void getLeafAbbOnNode(KnowledgePointVO knowledgePointVO,ArrayList<String> ans){
-        ans.add(knowledgePointVO.getKnowledge());
-
+        if(knowledgePointVO.getKnowledgePointVOs()==null)
+            ans.add(knowledgePointVO.getKnowledge());
+        else
+            for(KnowledgePointVO child : knowledgePointVO.getKnowledgePointVOs())
+                getLeafAbbOnNode(child,ans);
     }
 }

+ 8 - 1
seec-data-server/src/test/java/cn/seecoder/data/server/service/Impl/KnowledgeServiceImplTest.java

@@ -1,10 +1,12 @@
 package cn.seecoder.data.server.service.Impl;
 
+import cn.seecoder.bok.client.SeecoderBokClient;
 import cn.seecoder.data.server.domain.knowledge.KnowledgeDao;
 import cn.seecoder.data.server.domain.knowledge.PositionWeightDao;
 import cn.seecoder.data.server.repository.knowledge.KnowledgeRepository;
 import cn.seecoder.data.server.repository.knowledge.PositionWeightRepository;
 import cn.seecoder.data.server.service.KnowledgeService;
+import cn.seecoder.data.server.vo.knowledge.KnowledgePointVO;
 import cn.seecoder.data.server.vo.knowledge.KnowledgeVO;
 import org.junit.jupiter.api.Test;
 import org.junit.runner.RunWith;
@@ -14,6 +16,7 @@ import org.springframework.stereotype.Repository;
 import org.springframework.test.annotation.Rollback;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
@@ -48,6 +51,10 @@ class KnowledgeServiceImplTest {
 
 //    @Test
 //    void positionTest(){
-//        List<KnowledgeVO> result = knowledgeRepository.findAllInfo();
+//        SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
+//        ArrayList<String> knowledgeIds = new ArrayList<>();
+//        knowledgeIds.add("SR");
+//        long questionNum = seecoderBokClient.getQuestionList(null, null, knowledgeIds, null).getTotalElements();
+//        System.out.println(questionNum);
 //    }
 }