Browse Source

职位-权重查询更新功能

uncln 5 years ago
parent
commit
e4d3574c61
18 changed files with 426 additions and 114 deletions
  1. 1 5
      seec-data-server/src/main/java/cn/seecoder/data/server/SeecDataServerApplication.java
  2. 0 4
      seec-data-server/src/main/java/cn/seecoder/data/server/controller/AnalysisController.java
  3. 4 9
      seec-data-server/src/main/java/cn/seecoder/data/server/controller/EvaluateController.java
  4. 7 5
      seec-data-server/src/main/java/cn/seecoder/data/server/domain/knowledge/KnowledgeDao.java
  5. 37 0
      seec-data-server/src/main/java/cn/seecoder/data/server/domain/knowledge/PositionWeightDao.java
  6. 0 13
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/KnowledgeRepository.java
  7. 35 0
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/knowledge/KnowledgeRepository.java
  8. 13 0
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/knowledge/PositionWeightRepository.java
  9. 2 4
      seec-data-server/src/main/java/cn/seecoder/data/server/service/GeneralService.java
  10. 35 37
      seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/GeneralServiceImpl.java
  11. 157 0
      seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/KnowledgeServiceImpl.java
  12. 30 0
      seec-data-server/src/main/java/cn/seecoder/data/server/service/KnowledgeService.java
  13. 14 10
      seec-data-server/src/main/java/cn/seecoder/data/server/vo/knowledge/KnowledgePointVO.java
  14. 36 0
      seec-data-server/src/main/java/cn/seecoder/data/server/vo/knowledge/KnowledgeVO.java
  15. 1 13
      seec-data-server/src/test/java/cn/seecoder/data/server/schedule/EvaluateScheduleTest.java
  16. 0 3
      seec-data-server/src/test/java/cn/seecoder/data/server/schedule/HelperScheduleTest.java
  17. 1 11
      seec-data-server/src/test/java/cn/seecoder/data/server/service/Impl/GeneralServiceImplTest.java
  18. 53 0
      seec-data-server/src/test/java/cn/seecoder/data/server/service/Impl/KnowledgeServiceImplTest.java

+ 1 - 5
seec-data-server/src/main/java/cn/seecoder/data/server/SeecDataServerApplication.java

@@ -1,18 +1,14 @@
 package cn.seecoder.data.server;
 
-import org.python.util.PythonInterpreter;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
-import java.io.IOException;
-import java.util.Properties;
-
 @SpringBootApplication
 @EnableScheduling
 public class SeecDataServerApplication {
 
-	public static void main(String[] args) throws IOException {
+	public static void main(String[] args){
 		SpringApplication.run(SeecDataServerApplication.class, args);
 	}
 

+ 0 - 4
seec-data-server/src/main/java/cn/seecoder/data/server/controller/AnalysisController.java

@@ -1,18 +1,14 @@
 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.service.Impl.EvaluateServiceImpl;
-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 java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 @RestController

+ 4 - 9
seec-data-server/src/main/java/cn/seecoder/data/server/controller/EvaluateController.java

@@ -1,18 +1,13 @@
 package cn.seecoder.data.server.controller;
 
-
-import cn.seecoder.data.server.dto.knowledge.KnowledgeNodeDTO;
+import cn.seecoder.data.server.vo.knowledge.*;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
-import cn.seecoder.data.server.repository.KnowledgeRepository;
+import cn.seecoder.data.server.repository.knowledge.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 {
@@ -24,9 +19,9 @@ public class EvaluateController {
     KnowledgeRepository knowledgeRepository;
 
     @RequestMapping("/user/{id}")
-    public KnowledgeNodeDTO getEvaluate(@PathVariable("id") Integer id){
+    public KnowledgePointVO getEvaluate(@PathVariable("id") Integer id){
         GeneralServiceImpl generalService = new GeneralServiceImpl(generalRecordRepository,knowledgeRepository);
-        KnowledgeNodeDTO root = generalService.getTreeNode(332);
+        KnowledgePointVO root = generalService.getTreeNode(332);
         return root;
     }
 }

+ 7 - 5
seec-data-server/src/main/java/cn/seecoder/data/server/domain/KnowledgeDao.java → seec-data-server/src/main/java/cn/seecoder/data/server/domain/knowledge/KnowledgeDao.java

@@ -1,12 +1,10 @@
-package cn.seecoder.data.server.domain;
+package cn.seecoder.data.server.domain.knowledge;
 
 
 import lombok.Data;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
+import java.util.List;
 
 @Data
 @Entity
@@ -36,4 +34,8 @@ public class KnowledgeDao {
 
     @Column(name = "pid")
     private int pid;
+
+    @Column(name = "isleaf")
+    private Integer isleaf;
+
 }

+ 37 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/domain/knowledge/PositionWeightDao.java

@@ -0,0 +1,37 @@
+package cn.seecoder.data.server.domain.knowledge;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+@Data
+@Entity
+@IdClass(KnowledgePositionKeys.class)
+@Table(name = "knowledge_position")
+@AllArgsConstructor
+@NoArgsConstructor
+public class PositionWeightDao {
+
+    /**
+     * 知识点表中id
+     */
+    @Id
+    @Column(name = "knowledge_id")
+    private int knowledgeId;
+
+    /**
+     * 代表职位
+     */
+    @Id
+    @Column(name = "position")
+    private String position;
+
+    /**
+     * 所占权重
+     */
+    @Column(name = "weight")
+    private double weight;
+}

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

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

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

@@ -0,0 +1,35 @@
+package cn.seecoder.data.server.repository.knowledge;
+
+import cn.seecoder.data.server.domain.knowledge.KnowledgeOnPositionDao;
+import cn.seecoder.data.server.vo.knowledge.KnowledgePointVO;
+import cn.seecoder.data.server.vo.knowledge.KnowledgeVO;
+import org.springframework.data.jpa.repository.JpaRepository;
+import cn.seecoder.data.server.domain.knowledge.KnowledgeDao;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface KnowledgeRepository extends JpaRepository<KnowledgeDao,Integer> {
+
+    public KnowledgeDao findByAbbreviation(String abbreviation);
+
+    public KnowledgeDao findById(int id);
+
+    @Query(value = " select new cn.seecoder.data.server.domain.knowledge.KnowledgeOnPositionDao(" +
+            "k1.id," +
+            "k1.name," +
+            "k1.nameEng," +
+            "k1.abbreviation," +
+            "k1.parentId," +
+            "k1.parentName," +
+            "k1.uid," +
+            "k1.pid," +
+            "k2.position," +
+            "k2.weight," +
+            "k1.isleaf)" +
+            " from KnowledgeDao k1,PositionWeightDao k2 where k1.id = k2.knowledgeId order by k1.id"
+            )
+    public List<KnowledgeOnPositionDao> findAllInfo();
+}

+ 13 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/repository/knowledge/PositionWeightRepository.java

@@ -0,0 +1,13 @@
+package cn.seecoder.data.server.repository.knowledge;
+
+import cn.seecoder.data.server.domain.knowledge.PositionWeightDao;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface PositionWeightRepository extends JpaRepository<PositionWeightDao,Integer> {
+
+    public List<PositionWeightDao> findByKnowledgeId(int kowledgeId);
+
+    public List<PositionWeightDao> findByPosition(String position);
+}

+ 2 - 4
seec-data-server/src/main/java/cn/seecoder/data/server/service/GeneralService.java

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

+ 35 - 37
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/GeneralServiceImpl.java

@@ -3,12 +3,12 @@ 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.repository.knowledge.KnowledgeRepository;
 import cn.seecoder.data.server.service.GeneralService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import cn.seecoder.data.server.vo.knowledge.KnowledgePointVO;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -30,7 +30,7 @@ public class GeneralServiceImpl implements GeneralService {
     }
 
     @Override
-    public KnowledgeNodeDTO getTreeNode(int userId) {
+    public KnowledgePointVO getTreeNode(int userId) {
         List generalScoreList = generalRecordRepository.getByUserIdMaxScore(userId);
         ArrayList<String> questionIds = new ArrayList<>();
         ArrayList<Double> scores = new ArrayList<>();
@@ -43,7 +43,7 @@ public class GeneralServiceImpl implements GeneralService {
         }
         SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
         List<QuestionVO> questionVOS = seecoderBokClient.getQuestionListByIds(questionIds);
-        ArrayList<KnowledgeNodeDTO> knowledgeNodeDTOS = new ArrayList<>();
+        ArrayList<KnowledgePointVO> knowledgePointVOS = new ArrayList<KnowledgePointVO>();
         ArrayList<String> knowledgeName = new ArrayList<>();
         double[] weights = {1,1,1,1.1,1.2};
         for(int i=0;i<questionVOS.size();i++){
@@ -53,41 +53,41 @@ public class GeneralServiceImpl implements GeneralService {
                 for (String knowledge : knowledgeList) {
                     if(knowledgeName.contains(knowledge)){
                         int index = knowledgeName.indexOf(knowledge);
-                        KnowledgeNodeDTO knowledgeNodeDTO = knowledgeNodeDTOS.get(index);
+                        KnowledgePointVO knowledgePointVO = knowledgePointVOS.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);
+                            knowledgePointVO.setScoreGotten(knowledgePointVO.getScoreGotten()+scores.get(i));
+                            knowledgePointVO.setScoreTotal(knowledgePointVO.getScoreTotal()+scoresTotal.get(i));
+                            knowledgePointVO.setQuestionsNumDone(knowledgePointVO.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);
+                            knowledgePointVO.setScoreGotten(knowledgePointVO.getScoreGotten()+scores.get(i)*weights[questionVO.getWeight()]);
+                            knowledgePointVO.setScoreTotal(knowledgePointVO.getScoreTotal()+scoresTotal.get(i));
+                            knowledgePointVO.setQuestionsNumDone(knowledgePointVO.getQuestionsNumDone()+1);
                         }
                     }
                     else{
                         knowledgeName.add(knowledge);
                         if(questionVO.getWeight()!=null && questionVO.getWeight()!=0)
-                            knowledgeNodeDTOS.add(new KnowledgeNodeDTO(knowledge,scores.get(i)*weights[questionVO.getWeight()]
+                            knowledgePointVOS.add(new KnowledgePointVO(knowledge,scores.get(i)*weights[questionVO.getWeight()]
                                     ,scoresTotal.get(i),1,0,null));
                         else
-                            knowledgeNodeDTOS.add(new KnowledgeNodeDTO(knowledge,scores.get(i)
+                            knowledgePointVOS.add(new KnowledgePointVO(knowledge,scores.get(i)
                                     ,scoresTotal.get(i),1,0,null));
                     }
                 }
             }
         }
-        for(int i=0;i<knowledgeNodeDTOS.size();i++){
-            KnowledgeNodeDTO knowledgeNodeDTO = knowledgeNodeDTOS.get(i);
+        for(int i=0;i<knowledgePointVOS.size();i++){
+            KnowledgePointVO knowledgePointVO = knowledgePointVOS.get(i);
             ArrayList<String> knowledgeIds = new ArrayList<>();
-            knowledgeIds.add(knowledgeNodeDTO.getKnowledge());
+            knowledgeIds.add(knowledgePointVO.getKnowledge());
             long questionNum = seecoderBokClient.getQuestionList(null,null,knowledgeIds,null).getTotalElements();
-            knowledgeNodeDTO.setQuestionsNumTotal(questionNum);
+            knowledgePointVO.setQuestionsNumTotal(questionNum);
         }
-        KnowledgeNodeDTO root = new KnowledgeNodeDTO("SE",0,0,0,0,null);
+        KnowledgePointVO root = new KnowledgePointVO("SE",0,0,0,0,null);
         root.setName("Software Engineering");
-        for(int i=0;i<knowledgeNodeDTOS.size();i++){
-            KnowledgeNodeDTO node = knowledgeNodeDTOS.get(i);
+        for(int i=0;i<knowledgePointVOS.size();i++){
+            KnowledgePointVO node = knowledgePointVOS.get(i);
             String[] tempNodes = node.getKnowledge().split("\\.");
             boolean newNode = false;
             if(tempNodes.length>0){
@@ -96,10 +96,10 @@ public class GeneralServiceImpl implements GeneralService {
                 }
                 else{
                     int deep = 0;
-                    KnowledgeNodeDTO target = root;
+                    KnowledgePointVO target = root;
                     String prefix = "";
                     while (tempNodes.length>deep){
-                        ArrayList<String> abbreviations = getAbbreviationOnDTO(target.getKnowledgeNodeDTOs());
+                        ArrayList<String> abbreviations = getAbbreviationOnVO(target.getKnowledgePointVOs());
                         String knowledgeAbb;
                         if(!newNode)
                             addstatistics(target,node);
@@ -108,19 +108,17 @@ public class GeneralServiceImpl implements GeneralService {
                         else
                             knowledgeAbb = prefix + "." + tempNodes[deep];
                         if(abbreviations.contains(knowledgeAbb))
-                            target = target.getKnowledgeNodeDTOs().get(abbreviations.indexOf(knowledgeAbb));
+                            target = target.getKnowledgePointVOs().get(abbreviations.indexOf(knowledgeAbb));
                         else{
                             newNode = true;
-                            KnowledgeNodeDTO temp = new KnowledgeNodeDTO(knowledgeAbb, node.getScoreGotten(), node.getScoreTotal(),
+                            KnowledgePointVO temp = new KnowledgePointVO(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();
+                            temp.setName(knowledgeRepository.findByAbbreviation(knowledgeAbb).getName());
+                            ArrayList<KnowledgePointVO> know = (ArrayList<KnowledgePointVO>) target.getKnowledgePointVOs();
                             if(know == null)
                                 know = new ArrayList<>();
                             know.add(temp);
-                            target.setKnowledgeNodeDTOs(know);
+                            target.setKnowledgePointVOs(know);
                             target = temp;
                         }
                         prefix = knowledgeAbb;
@@ -133,27 +131,27 @@ public class GeneralServiceImpl implements GeneralService {
         return root;
     }
 
-    public ArrayList<String> getAbbreviationOnDTO(List<KnowledgeNodeDTO> knowledgeNodeDTOS){
+    public ArrayList<String> getAbbreviationOnVO(List<KnowledgePointVO> knowledgePointVOS){
         ArrayList<String> arrayList= new ArrayList<>();
-        if(knowledgeNodeDTOS!=null && knowledgeNodeDTOS.size()>0) {
-            for (KnowledgeNodeDTO knowledgeNodeDTO : knowledgeNodeDTOS)
-                arrayList.add(knowledgeNodeDTO.getKnowledge());
+        if(knowledgePointVOS!=null && knowledgePointVOS.size()>0) {
+            for (KnowledgePointVO knowledgePointVO : knowledgePointVOS)
+                arrayList.add(knowledgePointVO.getKnowledge());
         }
         return arrayList;
     }
 
-    public void addstatistics(KnowledgeNodeDTO target,KnowledgeNodeDTO adder){
+    public void addstatistics(KnowledgePointVO target,KnowledgePointVO 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){
+    public void getCoverAndCorretRates(KnowledgePointVO 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())
+        if(root.getKnowledgePointVOs()!=null && root.getKnowledgePointVOs().size()>0){
+            for(KnowledgePointVO temp : root.getKnowledgePointVOs())
                 getCoverAndCorretRates(temp);
         }
     }

+ 157 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/KnowledgeServiceImpl.java

@@ -0,0 +1,157 @@
+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.domain.GeneralRecordDao;
+import cn.seecoder.data.server.domain.knowledge.KnowledgeDao;
+import cn.seecoder.data.server.domain.knowledge.KnowledgeOnPositionDao;
+import cn.seecoder.data.server.domain.knowledge.PositionWeightDao;
+import cn.seecoder.data.server.repository.GeneralRecordRepository;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class KnowledgeServiceImpl implements KnowledgeService {
+
+    @Autowired
+    KnowledgeRepository knowledgeRepository;
+
+    @Autowired
+    PositionWeightRepository positionWeightRepository;
+
+    @Autowired
+    GeneralRecordRepository generalRecordRepository;
+
+    @Override
+    public List<KnowledgeVO> getAllKnowledgeAndWeight() {
+        List<KnowledgeOnPositionDao> knowledgeOnPositionDaos = knowledgeRepository.findAllInfo();
+        ArrayList<KnowledgeVO> knowledgeVOS = new ArrayList<>();
+        KnowledgeVO knowledgeVO = null;
+        if(knowledgeOnPositionDaos.size()>0)
+            knowledgeVO = new KnowledgeVO(knowledgeOnPositionDaos.get(0));
+        for(int i=1;i<knowledgeOnPositionDaos.size();i++){
+            KnowledgeOnPositionDao knowledge = knowledgeOnPositionDaos.get(i);
+            if(knowledge.getIsleaf()==0)
+                continue;
+            if(knowledgeOnPositionDaos.get(i).getId()==knowledgeOnPositionDaos.get(i-1).getId()){
+                knowledgeVO.getWeightOnPosition().put(knowledge.getPosition(),knowledge.getWeight());
+            }
+            else{
+                knowledgeVOS.add(knowledgeVO);
+                knowledgeVO = new KnowledgeVO(knowledgeOnPositionDaos.get(i));
+            }
+        }
+        return knowledgeVOS;
+    }
+
+    @Override
+    public KnowledgeVO updatePositionWeight(KnowledgeVO knowledgeVO) {
+        Map<String,Double> positonWeight = knowledgeVO.getWeightOnPosition();
+        for(String position : positonWeight.keySet()){
+            PositionWeightDao positionWeightDao = new PositionWeightDao(knowledgeVO.getId(),position,positonWeight.get(position));
+            positionWeightRepository.save(positionWeightDao);
+        }
+        List<PositionWeightDao> positionWeightDaos = positionWeightRepository.findByKnowledgeId(knowledgeVO.getId());
+        Map<String,Double> ans = new HashMap<>();
+        for(int i=0;i<positionWeightDaos.size();i++)
+            ans.put(positionWeightDaos.get(i).getPosition(),positionWeightDaos.get(i).getWeight());
+        knowledgeVO.setWeightOnPosition(ans);
+        return knowledgeVO;
+    }
+
+    @Override
+    public KnowledgePointVO getTreeByPosition(String position) {
+        List<PositionWeightDao> positionWeightDaos = positionWeightRepository.findByPosition(position);
+        KnowledgePointVO root = new KnowledgePointVO("SE","软件工程",0,0,0,0,0,0,0,null);
+        for(int i=0;i<positionWeightDaos.size();i++){
+            PositionWeightDao positionWeight = positionWeightDaos.get(i);
+            KnowledgeDao knowledgeInfo = knowledgeRepository.findById(positionWeight.getKnowledgeId());
+            String[] knowledgeLevel = knowledgeInfo.getAbbreviation().split("\\.");
+            String prefix = "";
+            KnowledgePointVO upNode = root;
+            KnowledgePointVO nodeToAdd = null;
+            for(int j=0;j<knowledgeLevel.length;j++){
+                if(prefix!="")
+                    prefix = prefix + ".";
+                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(knowledgeRepository.findByAbbreviation(tempLevel).getIsleaf()==1)
+                        nodeToAdd.setLeafWeight(positionWeight.getWeight());
+                    else{
+                        String nodeName = knowledgeRepository.findByAbbreviation(tempLevel).getName();
+                        nodeToAdd.setName(nodeName);
+                    }
+                    if(upNode.getKnowledgePointVOs()==null){
+                        List<KnowledgePointVO> nodes = new ArrayList<>();
+                        nodes.add(nodeToAdd);
+                        upNode.setKnowledgePointVOs(nodes);
+                    }
+                    else
+                        upNode.getKnowledgePointVOs().add(nodeToAdd);
+                    upNode = nodeToAdd;
+                }
+                else
+                    upNode = upNode.getKnowledgePointVOs().get(getAbbOnVO(upNode.getKnowledgePointVOs()).indexOf(tempLevel));
+                prefix = tempLevel;
+            }
+        }
+        return root;
+    }
+
+    @Override
+    public KnowledgePointVO getTreeByPositionAndUser(String position, int userId) {
+        KnowledgePointVO root = getTreeByPosition(position);
+        List generalRecordDaos = generalRecordRepository.getByUserIdMaxScore(userId);
+        ArrayList<String> questionIds = new ArrayList<>();
+        ArrayList<Double> scores = new ArrayList<>();
+        ArrayList<Double> scoresTotal = new ArrayList<>();
+        ArrayList<String> abbs = new ArrayList<>();
+        getLeafAbbOnNode(root,abbs);
+        for(int i=0;i<generalRecordDaos.size();i++) {
+            Object[] cells = (Object[]) generalRecordDaos.get(i);
+            questionIds.add((String)cells[0]);
+            scores.add((Double) (cells[1]));
+            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;
+    }
+
+//    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<>();
+        if(knowledgePointVOS!=null && knowledgePointVOS.size()>0) {
+            for (KnowledgePointVO knowledgePointVO : knowledgePointVOS)
+                arrayList.add(knowledgePointVO.getKnowledge());
+        }
+        return arrayList;
+    }
+
+    public void getLeafAbbOnNode(KnowledgePointVO knowledgePointVO,ArrayList<String> ans){
+        ans.add(knowledgePointVO.getKnowledge());
+
+    }
+}

+ 30 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/service/KnowledgeService.java

@@ -0,0 +1,30 @@
+package cn.seecoder.data.server.service;
+
+import cn.seecoder.data.server.vo.knowledge.KnowledgePointVO;
+import cn.seecoder.data.server.vo.knowledge.KnowledgeVO;
+
+import java.util.List;
+
+public interface KnowledgeService {
+
+    /**
+     * 获取所有叶子知识点及其在岗位的权重
+     */
+    public List<KnowledgeVO> getAllKnowledgeAndWeight();
+
+    /**
+     * 更新知识点对应的职位权重
+     */
+    public KnowledgeVO updatePositionWeight(KnowledgeVO knowledgeVO);
+
+    /**
+     * 获取对应职位的树
+     */
+    public KnowledgePointVO getTreeByPosition(String position);
+
+    /**
+     * 获取对应用户在对应职位的知识点树
+     */
+
+    public KnowledgePointVO getTreeByPositionAndUser(String position, int userId);
+}

+ 14 - 10
seec-data-server/src/main/java/cn/seecoder/data/server/dto/knowledge/KnowledgeNodeDTO.java → seec-data-server/src/main/java/cn/seecoder/data/server/vo/knowledge/KnowledgePointVO.java

@@ -1,12 +1,15 @@
-package cn.seecoder.data.server.dto.knowledge;
-
+package cn.seecoder.data.server.vo.knowledge;
 
+import cn.seecoder.data.server.domain.knowledge.KnowledgeDao;
+import cn.seecoder.data.server.domain.knowledge.PositionWeightDao;
+import lombok.AllArgsConstructor;
 import lombok.Data;
 
 import java.util.List;
 
 @Data
-public class KnowledgeNodeDTO {
+@AllArgsConstructor
+public class KnowledgePointVO {
     private String knowledge;
     private String name;
     private double scoreGotten;
@@ -15,22 +18,23 @@ public class KnowledgeNodeDTO {
     private double questionsNumTotal;
     private double coverageRate;
     private double correctRate;
-    private List<KnowledgeNodeDTO> knowledgeNodeDTOs;
+    private double leafWeight;
+    private List<KnowledgePointVO> knowledgePointVOs;
 
-    public KnowledgeNodeDTO(String knowledge, double coverageRate, double correctRate, List<KnowledgeNodeDTO> knowledgeNodeDTO) {
+    public KnowledgePointVO(String knowledge, double coverageRate, double correctRate, List<KnowledgePointVO> knowledgesNodeVO) {
         this.knowledge=knowledge;
         this.coverageRate=coverageRate;
         this.correctRate=correctRate;
-        this.knowledgeNodeDTOs=knowledgeNodeDTO;
+        this.knowledgePointVOs = knowledgesNodeVO;
     }
 
-    public KnowledgeNodeDTO(String knowledge, double scoreGotten, double scoreTotal, double questionsNumDone, double questionsNumTotal,
-                List<KnowledgeNodeDTO> knowledgeNodeDTOS){
+    public KnowledgePointVO(String knowledge, double scoreGotten, double scoreTotal, double questionsNumDone, double questionsNumTotal,
+                            List<KnowledgePointVO> knowledgesNodeVOS){
         this.knowledge = knowledge;
         this.scoreGotten = scoreGotten;
         this.scoreTotal = scoreTotal;
         this.questionsNumDone = questionsNumDone;
         this.questionsNumTotal = questionsNumTotal;
-        this.knowledgeNodeDTOs = knowledgeNodeDTOS;
+        this.knowledgePointVOs = knowledgesNodeVOS;
     }
-}
+}

+ 36 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/vo/knowledge/KnowledgeVO.java

@@ -0,0 +1,36 @@
+package cn.seecoder.data.server.vo.knowledge;
+
+import cn.seecoder.data.server.domain.knowledge.KnowledgeOnPositionDao;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Data
+@AllArgsConstructor
+public class KnowledgeVO{
+    private int id;
+    private String name;
+    private String nameEng;
+    private String abbreviation;
+    private int parentId;
+    private String parentName;
+    private int uid;
+    private int pid;
+    private Map<String,Double> weightOnPosition;
+
+    public KnowledgeVO(KnowledgeOnPositionDao knowledgeOnPositionDao) {
+        this.id = knowledgeOnPositionDao.getId();
+        this.name = knowledgeOnPositionDao.getName();
+        this.nameEng = knowledgeOnPositionDao.getNameEng();
+        this.abbreviation = knowledgeOnPositionDao.getAbbreviation();
+        this.parentId = knowledgeOnPositionDao.getParentId();
+        this.parentName = knowledgeOnPositionDao.getParentName();
+        this.uid = knowledgeOnPositionDao.getUid();
+        this.pid = knowledgeOnPositionDao.getPid();
+        this.weightOnPosition = new HashMap<>();
+        weightOnPosition.put(knowledgeOnPositionDao.getPosition(),knowledgeOnPositionDao.getWeight());
+    }
+}

+ 1 - 13
seec-data-server/src/test/java/cn/seecoder/data/server/schedule/EvaluateScheduleTest.java

@@ -1,25 +1,13 @@
 package cn.seecoder.data.server.schedule;
 
 import cn.seecoder.data.server.repository.EvaluateRepository;
-import cn.seecoder.data.server.repository.KnowledgeRepository;
-import cn.seecoder.data.server.domain.KnowledgeDao;
+import cn.seecoder.data.server.repository.knowledge.KnowledgeRepository;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
-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.jpa.repository.config.EnableJpaRepositories;
 import org.springframework.test.annotation.Rollback;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-
-import javax.transaction.Transactional;
-import java.sql.Timestamp;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
 
 @RunWith(SpringJUnit4ClassRunner.class)
 @Rollback(value = false)

+ 0 - 3
seec-data-server/src/test/java/cn/seecoder/data/server/schedule/HelperScheduleTest.java

@@ -3,15 +3,12 @@ package cn.seecoder.data.server.schedule;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
 import cn.seecoder.data.server.repository.helper.HelperEventRepository;
 import cn.seecoder.data.server.repository.helper.HelperQuizRepository;
-import org.junit.jupiter.api.Test;
 import org.junit.runner.RunWith;
-import org.python.util.PythonInterpreter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.annotation.Rollback;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
-import java.io.IOException;
 
 @RunWith(SpringJUnit4ClassRunner.class)
 @Rollback(value = true)

+ 1 - 11
seec-data-server/src/test/java/cn/seecoder/data/server/service/Impl/GeneralServiceImplTest.java

@@ -1,23 +1,13 @@
 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 cn.seecoder.data.server.repository.knowledge.KnowledgeRepository;
 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

+ 53 - 0
seec-data-server/src/test/java/cn/seecoder/data/server/service/Impl/KnowledgeServiceImplTest.java

@@ -0,0 +1,53 @@
+package cn.seecoder.data.server.service.Impl;
+
+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.KnowledgeVO;
+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.stereotype.Repository;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.List;
+import java.util.Random;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@Rollback(value = false)
+@SpringBootTest
+class KnowledgeServiceImplTest {
+
+    @Autowired
+    KnowledgeRepository knowledgeRepository;
+
+    @Autowired
+    PositionWeightRepository positionWeightRepository;
+
+//    @Test
+//    void pushDataTest(){
+//        String[] position = {"algorithm"};
+//        Random random = new Random();
+//        List<KnowledgeDao> knowledgeDaos = knowledgeRepository.findAll();
+//        for(int i=0;i<knowledgeDaos.size();i=i+60){
+//            int knowledgeId = knowledgeDaos.get(i).getId();
+//            PositionWeightDao positionWeightDao = new PositionWeightDao();
+//            positionWeightDao.setKnowledgeId(knowledgeId);
+//            positionWeightDao.setPosition(position[0]);
+//            positionWeightDao.setWeight(random.nextDouble());
+//            positionWeightRepository.save(positionWeightDao);
+//            System.out.println(positionWeightDao);
+//        }
+//    }
+
+//    @Test
+//    void positionTest(){
+//        List<KnowledgeVO> result = knowledgeRepository.findAllInfo();
+//    }
+}