uncln пре 5 година
родитељ
комит
c5601ab704
17 измењених фајлова са 272 додато и 5 уклоњено
  1. 13 3
      seec-data-server/src/main/java/cn/seecoder/data/server/controller/EvaluateController.java
  2. 36 0
      seec-data-server/src/main/java/cn/seecoder/data/server/dto/knowledge/KnowledgeNodeDTO.java
  3. 10 0
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/GeneralRecordRepository.java
  4. 4 0
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/KnowledgeRepository.java
  5. 9 0
      seec-data-server/src/main/java/cn/seecoder/data/server/service/GeneralService.java
  6. 160 0
      seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/GeneralServiceImpl.java
  7. 1 1
      seec-data-server/src/main/resources/application.yml
  8. 38 0
      seec-data-server/src/test/java/cn/seecoder/data/server/service/Impl/GeneralServiceImplTest.java
  9. BIN
      seec-data-server/target/classes/META-INF/demo.kotlin_module
  10. 1 1
      seec-data-server/target/classes/application.yml
  11. BIN
      seec-data-server/target/classes/cn/seecoder/data/server/Repository/GeneralRecordRepository.class
  12. BIN
      seec-data-server/target/classes/cn/seecoder/data/server/Repository/KnowledgeRepository.class
  13. BIN
      seec-data-server/target/classes/cn/seecoder/data/server/SeecDataServerApplication.class
  14. BIN
      seec-data-server/target/classes/cn/seecoder/data/server/controller/EvaluateController.class
  15. BIN
      seec-data-server/target/classes/cn/seecoder/data/server/domain/EvaluateDao.class
  16. BIN
      seec-data-server/target/classes/cn/seecoder/data/server/domain/GeneralRecordDao.class
  17. BIN
      seec-data-server/target/classes/cn/seecoder/data/server/domain/KnowledgeDao.class

+ 13 - 3
seec-data-server/src/main/java/cn/seecoder/data/server/controller/EvaluateController.java

@@ -1,22 +1,32 @@
 package cn.seecoder.data.server.controller;
 
 
+import cn.seecoder.data.server.dto.knowledge.KnowledgeNodeDTO;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
+import cn.seecoder.data.server.repository.KnowledgeRepository;
+import cn.seecoder.data.server.service.Impl.GeneralServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import cn.seecoder.data.server.domain.GeneralRecordDao;
 
+import javax.validation.constraints.Null;
+import java.util.ArrayList;
+
 @RestController
 public class EvaluateController {
 
     @Autowired
     GeneralRecordRepository generalRecordRepository;
 
+    @Autowired
+    KnowledgeRepository knowledgeRepository;
+
     @RequestMapping("/user/{id}")
-    public GeneralRecordDao getEvaluate(@PathVariable("id") Integer id){
-        GeneralRecordDao test = generalRecordRepository.findById(id).get();
-        return test;
+    public KnowledgeNodeDTO getEvaluate(@PathVariable("id") Integer id){
+        GeneralServiceImpl generalService = new GeneralServiceImpl(generalRecordRepository,knowledgeRepository);
+        KnowledgeNodeDTO root = generalService.getTreeNode(332);
+        return root;
     }
 }

+ 36 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/dto/knowledge/KnowledgeNodeDTO.java

@@ -0,0 +1,36 @@
+package cn.seecoder.data.server.dto.knowledge;
+
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class KnowledgeNodeDTO {
+    private String knowledge;
+    private String name;
+    private double scoreGotten;
+    private double scoreTotal;
+    private double questionsNumDone;
+    private double questionsNumTotal;
+    private double coverageRate;
+    private double correctRate;
+    private List<KnowledgeNodeDTO> knowledgeNodeDTOs;
+
+    public KnowledgeNodeDTO(String knowledge, double coverageRate, double correctRate, List<KnowledgeNodeDTO> knowledgeNodeDTO) {
+        this.knowledge=knowledge;
+        this.coverageRate=coverageRate;
+        this.correctRate=correctRate;
+        this.knowledgeNodeDTOs=knowledgeNodeDTO;
+    }
+
+    public KnowledgeNodeDTO(String knowledge, double scoreGotten, double scoreTotal, double questionsNumDone, double questionsNumTotal,
+                List<KnowledgeNodeDTO> knowledgeNodeDTOS){
+        this.knowledge = knowledge;
+        this.scoreGotten = scoreGotten;
+        this.scoreTotal = scoreTotal;
+        this.questionsNumDone = questionsNumDone;
+        this.questionsNumTotal = questionsNumTotal;
+        this.knowledgeNodeDTOs = knowledgeNodeDTOS;
+    }
+}

+ 10 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/repository/GeneralRecordRepository.java

@@ -2,12 +2,22 @@ package cn.seecoder.data.server.repository;
 
 import cn.seecoder.data.server.domain.GeneralRecordDao;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Map;
 
 @Repository
 public interface GeneralRecordRepository extends JpaRepository<GeneralRecordDao,Integer>{
 
         public List<GeneralRecordDao> getByUserIdAndDataSource(Integer userId,String dataSource);
+
+        public List<GeneralRecordDao> getByUserId(Integer userId);
+
+        @Query(value = "select question_id,max(score) from general_record where user_id = ?1 group by question_id; ",
+                        nativeQuery = true)
+        public List getByUserIdMaxScore(Integer userId);
+
+        public List<GeneralRecordDao> getByQuestionId(String questionId);
 }

+ 4 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/repository/KnowledgeRepository.java

@@ -3,5 +3,9 @@ package cn.seecoder.data.server.repository;
 import org.springframework.data.jpa.repository.JpaRepository;
 import cn.seecoder.data.server.domain.KnowledgeDao;
 
+import java.util.List;
+
 public interface KnowledgeRepository extends JpaRepository<KnowledgeDao,Integer> {
+
+    public List<KnowledgeDao> findByAbbreviation(String abbreviation);
 }

+ 9 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/service/GeneralService.java

@@ -0,0 +1,9 @@
+package cn.seecoder.data.server.service;
+
+import cn.seecoder.data.server.dto.knowledge.KnowledgeNodeDTO;
+
+import java.util.Map;
+
+public interface GeneralService {
+    public KnowledgeNodeDTO getTreeNode(int userId);
+}

+ 160 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/GeneralServiceImpl.java

@@ -0,0 +1,160 @@
+package cn.seecoder.data.server.service.Impl;
+
+
+import cn.seecoder.bok.client.SeecoderBokClient;
+import cn.seecoder.bok.common.vo.QuestionVO;
+import cn.seecoder.data.server.dto.knowledge.KnowledgeNodeDTO;
+import cn.seecoder.data.server.repository.GeneralRecordRepository;
+import cn.seecoder.data.server.repository.KnowledgeRepository;
+import cn.seecoder.data.server.service.GeneralService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Service
+public class GeneralServiceImpl implements GeneralService {
+
+    @Autowired
+    private GeneralRecordRepository generalRecordRepository;
+
+    @Autowired
+    private KnowledgeRepository knowledgeRepository;
+
+    public GeneralServiceImpl(GeneralRecordRepository generalRecordRepository
+                            ,KnowledgeRepository knowledgeRepository){
+        this.generalRecordRepository = generalRecordRepository;
+        this.knowledgeRepository = knowledgeRepository;
+    }
+
+    @Override
+    public KnowledgeNodeDTO getTreeNode(int userId) {
+        List generalScoreList = generalRecordRepository.getByUserIdMaxScore(userId);
+        ArrayList<String> questionIds = new ArrayList<>();
+        ArrayList<Double> scores = new ArrayList<>();
+        ArrayList<Double> scoresTotal = new ArrayList<>();
+        for(int i=0;i<generalScoreList.size();i++) {
+            Object[] cells = (Object[]) generalScoreList.get(i);
+            questionIds.add((String)cells[0]);
+            scores.add(Double.valueOf(cells[1].toString()));
+            scoresTotal.add(Double.valueOf(generalRecordRepository.getByQuestionId((String)cells[0]).get(0).getScoreTotal().toString()));
+        }
+        SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
+        List<QuestionVO> questionVOS = seecoderBokClient.getQuestionListByIds(questionIds);
+        ArrayList<KnowledgeNodeDTO> knowledgeNodeDTOS = new ArrayList<>();
+        ArrayList<String> knowledgeName = new ArrayList<>();
+        double[] weights = {1,1,1,1.1,1.2};
+        for(int i=0;i<questionVOS.size();i++){
+            QuestionVO questionVO = questionVOS.get(i);
+            ArrayList<String> knowledgeList = (ArrayList<String>) questionVO.getKnowledgeId();
+            if(knowledgeList!=null && knowledgeList.size()>0) {
+                for (String knowledge : knowledgeList) {
+                    if(knowledgeName.contains(knowledge)){
+                        int index = knowledgeName.indexOf(knowledge);
+                        KnowledgeNodeDTO knowledgeNodeDTO = knowledgeNodeDTOS.get(index);
+                        if(questionVO.getWeight()==null || questionVO.getWeight()==0){
+                            knowledgeNodeDTO.setScoreGotten(knowledgeNodeDTO.getScoreGotten()+scores.get(i));
+                            knowledgeNodeDTO.setScoreTotal(knowledgeNodeDTO.getScoreTotal()+scoresTotal.get(i));
+                            knowledgeNodeDTO.setQuestionsNumDone(knowledgeNodeDTO.getQuestionsNumDone()+1);
+                        }
+                        else{
+                            knowledgeNodeDTO.setScoreGotten(knowledgeNodeDTO.getScoreGotten()+scores.get(i)*weights[questionVO.getWeight()]);
+                            knowledgeNodeDTO.setScoreTotal(knowledgeNodeDTO.getScoreTotal()+scoresTotal.get(i));
+                            knowledgeNodeDTO.setQuestionsNumDone(knowledgeNodeDTO.getQuestionsNumDone()+1);
+                        }
+                    }
+                    else{
+                        knowledgeName.add(knowledge);
+                        if(questionVO.getWeight()!=null && questionVO.getWeight()!=0)
+                            knowledgeNodeDTOS.add(new KnowledgeNodeDTO(knowledge,scores.get(i)*weights[questionVO.getWeight()]
+                                    ,scoresTotal.get(i),1,0,null));
+                        else
+                            knowledgeNodeDTOS.add(new KnowledgeNodeDTO(knowledge,scores.get(i)
+                                    ,scoresTotal.get(i),1,0,null));
+                    }
+                }
+            }
+        }
+        for(int i=0;i<knowledgeNodeDTOS.size();i++){
+            KnowledgeNodeDTO knowledgeNodeDTO = knowledgeNodeDTOS.get(i);
+            ArrayList<String> knowledgeIds = new ArrayList<>();
+            knowledgeIds.add(knowledgeNodeDTO.getKnowledge());
+            long questionNum = seecoderBokClient.getQuestionList(null,null,knowledgeIds,null).getTotalElements();
+            knowledgeNodeDTO.setQuestionsNumTotal(questionNum);
+        }
+        KnowledgeNodeDTO root = new KnowledgeNodeDTO("SE",0,0,0,0,null);
+        root.setName("Software Engineering");
+        for(int i=0;i<knowledgeNodeDTOS.size();i++){
+            KnowledgeNodeDTO node = knowledgeNodeDTOS.get(i);
+            String[] tempNodes = node.getKnowledge().split("\\.");
+            boolean newNode = false;
+            if(tempNodes.length>0){
+                if(tempNodes[0].trim().equals("SE")) {
+                    addstatistics(root,node);
+                }
+                else{
+                    int deep = 0;
+                    KnowledgeNodeDTO target = root;
+                    String prefix = "";
+                    while (tempNodes.length>deep){
+                        ArrayList<String> abbreviations = getAbbreviationOnDTO(target.getKnowledgeNodeDTOs());
+                        String knowledgeAbb;
+                        if(!newNode)
+                            addstatistics(target,node);
+                        if(prefix.equals(""))
+                            knowledgeAbb = prefix + tempNodes[deep];
+                        else
+                            knowledgeAbb = prefix + "." + tempNodes[deep];
+                        if(abbreviations.contains(knowledgeAbb))
+                            target = target.getKnowledgeNodeDTOs().get(abbreviations.indexOf(knowledgeAbb));
+                        else{
+                            newNode = true;
+                            KnowledgeNodeDTO temp = new KnowledgeNodeDTO(knowledgeAbb, node.getScoreGotten(), node.getScoreTotal(),
+                                    node.getQuestionsNumDone(), node.getQuestionsNumTotal(), null);
+                            if(knowledgeRepository.findByAbbreviation(knowledgeAbb).size()>0) {
+                                temp.setName(knowledgeRepository.findByAbbreviation(knowledgeAbb).get(0).getName());
+                            }
+                            ArrayList<KnowledgeNodeDTO> know = (ArrayList<KnowledgeNodeDTO>) target.getKnowledgeNodeDTOs();
+                            if(know == null)
+                                know = new ArrayList<>();
+                            know.add(temp);
+                            target.setKnowledgeNodeDTOs(know);
+                            target = temp;
+                        }
+                        prefix = knowledgeAbb;
+                        deep++;
+                    }
+                }
+            }
+        }
+        getCoverAndCorretRates(root);
+        return root;
+    }
+
+    public ArrayList<String> getAbbreviationOnDTO(List<KnowledgeNodeDTO> knowledgeNodeDTOS){
+        ArrayList<String> arrayList= new ArrayList<>();
+        if(knowledgeNodeDTOS!=null && knowledgeNodeDTOS.size()>0) {
+            for (KnowledgeNodeDTO knowledgeNodeDTO : knowledgeNodeDTOS)
+                arrayList.add(knowledgeNodeDTO.getKnowledge());
+        }
+        return arrayList;
+    }
+
+    public void addstatistics(KnowledgeNodeDTO target,KnowledgeNodeDTO adder){
+        target.setScoreGotten(target.getScoreGotten()+adder.getScoreGotten());
+        target.setScoreTotal(target.getScoreTotal()+adder.getScoreTotal());
+        target.setQuestionsNumDone(target.getQuestionsNumDone()+adder.getQuestionsNumDone());
+        target.setQuestionsNumTotal(target.getQuestionsNumTotal()+adder.getQuestionsNumTotal());
+    }
+
+    public void getCoverAndCorretRates(KnowledgeNodeDTO root){
+        root.setCoverageRate(root.getQuestionsNumDone()/ root.getQuestionsNumTotal());
+        root.setCorrectRate(root.getScoreGotten()/root.getScoreTotal());
+        if(root.getKnowledgeNodeDTOs()!=null && root.getKnowledgeNodeDTOs().size()>0){
+            for(KnowledgeNodeDTO temp : root.getKnowledgeNodeDTOs())
+                getCoverAndCorretRates(temp);
+        }
+    }
+}

+ 1 - 1
seec-data-server/src/main/resources/application.yml

@@ -7,6 +7,6 @@ spring:
   jpa:
     hibernate:
       ddl-auto: update
-    show-sql: true
+    show-sql: false
 urls:
   url1: www.baidu.com

+ 38 - 0
seec-data-server/src/test/java/cn/seecoder/data/server/service/Impl/GeneralServiceImplTest.java

@@ -0,0 +1,38 @@
+package cn.seecoder.data.server.service.Impl;
+
+import cn.seecoder.bok.client.SeecoderBokClient;
+import cn.seecoder.bok.common.vo.QuestionVO;
+import cn.seecoder.data.server.repository.GeneralRecordRepository;
+import cn.seecoder.data.server.repository.KnowledgeRepository;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+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.Sort;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@Rollback
+@SpringBootTest
+class GeneralServiceImplTest {
+
+    @Autowired
+    GeneralRecordRepository generalRecordRepository;
+
+    @Autowired
+    KnowledgeRepository knowledgeRepository;
+
+    @Test
+    void getTreeNode(){
+        GeneralServiceImpl generalService = new GeneralServiceImpl(generalRecordRepository,knowledgeRepository);
+        generalService.getTreeNode(332);
+    }
+}

BIN
seec-data-server/target/classes/META-INF/demo.kotlin_module


+ 1 - 1
seec-data-server/target/classes/application.yml

@@ -7,6 +7,6 @@ spring:
   jpa:
     hibernate:
       ddl-auto: update
-    show-sql: true
+    show-sql: false
 urls:
   url1: www.baidu.com

BIN
seec-data-server/target/classes/cn/seecoder/data/server/Repository/GeneralRecordRepository.class


BIN
seec-data-server/target/classes/cn/seecoder/data/server/Repository/KnowledgeRepository.class


BIN
seec-data-server/target/classes/cn/seecoder/data/server/SeecDataServerApplication.class


BIN
seec-data-server/target/classes/cn/seecoder/data/server/controller/EvaluateController.class


BIN
seec-data-server/target/classes/cn/seecoder/data/server/domain/EvaluateDao.class


BIN
seec-data-server/target/classes/cn/seecoder/data/server/domain/GeneralRecordDao.class


BIN
seec-data-server/target/classes/cn/seecoder/data/server/domain/KnowledgeDao.class