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

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

sky 5 лет назад
Родитель
Сommit
0ca129e9ee

+ 8 - 2
seec-data-server/src/main/java/cn/seecoder/data/server/controller/AnalysisController.java

@@ -2,7 +2,7 @@ package cn.seecoder.data.server.controller;
 
 
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
-import cn.seecoder.data.server.service.Impl.EvaluateServiceImpl;
+import cn.seecoder.data.server.service.EvaluateService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -17,12 +17,18 @@ public class AnalysisController {
     @Autowired
     GeneralRecordRepository generalRecordRepository;
 
+    @Autowired
+    EvaluateService evaluateService;
+
     @RequestMapping("/score/{id}")
     public Map<String,Double> getEvaluate(@PathVariable("id") Integer id){
         HashMap<String,Double> ans = new HashMap<>();
-        EvaluateServiceImpl evaluateService = new EvaluateServiceImpl(generalRecordRepository);
         ans.put("helper",evaluateService.getQuestionScore(id,"helper"));
         ans.put("evaluate",evaluateService.getQuestionScore(id,"evaluate"));
+        ans.put("playground",evaluateService.getQuestionScore(id,"playground"));
+        ans.put("helper-week",evaluateService.getQuestionScoreByWeek(id,"helper"));
+        ans.put("evaluate-week",evaluateService.getQuestionScoreByWeek(id,"evaluate"));
+        ans.put("playground-week",evaluateService.getQuestionScoreByWeek(id,"playground"));
         return ans;
     }
 }

+ 6 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/domain/helper/HelperEventDao.java

@@ -1,12 +1,18 @@
 package cn.seecoder.data.server.domain.helper;
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import javax.persistence.*;
 import java.time.LocalDateTime;
 
 @Data
 @Entity
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
 @Table(name = "helper_event")
 public class HelperEventDao {
     @Id

+ 6 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/domain/helper/HelperQuizDao.java

@@ -1,10 +1,16 @@
 package cn.seecoder.data.server.domain.helper;
 
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import javax.persistence.*;
 
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
 @Data
 @Entity
 @Table(name = "helper_quiz")

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

@@ -22,5 +22,7 @@ public interface GeneralRecordRepository extends JpaRepository<GeneralRecordDao,
 
         public List<GeneralRecordDao> getByUserIdAndCreateTimeBetween(Integer userId, LocalDateTime time1,LocalDateTime time2);
 
+        public List<GeneralRecordDao> getByUserIdAndDataSourceAndCreateTimeBetween(Integer userId, String datasource, LocalDateTime time1,LocalDateTime time2);
+
         public List<GeneralRecordDao> getByQuestionId(String questionId);
 }

+ 2 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/service/EvaluateService.java

@@ -6,5 +6,7 @@ public interface EvaluateService {
 
     public double getQuestionScore(int userId,String dataSource);
 
+    public double getQuestionScoreByWeek(int userId,String dataSource);
+
     public Map<String, Map<String,Double>> analyzeEvalTest(Integer examId);
 }

+ 48 - 19
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/EvaluateServiceImpl.java

@@ -12,18 +12,23 @@ import cn.seecoder.data.server.repository.knowledge.KnowledgeRepository;
 import cn.seecoder.data.server.service.EvaluateService;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 
 @Service
 public class EvaluateServiceImpl implements EvaluateService {
 
+    @Value("${sys.bok.url}")
+    private String bokBaseUrl;
+
     @Autowired
     private GeneralRecordRepository generalRecordRepository;
 
@@ -36,27 +41,24 @@ public class EvaluateServiceImpl implements EvaluateService {
 
     @Override
     public double getQuestionScore(int userId,String dataSource) {
-        double ans = 0;
+        double ans = 0.0;
         try {
-            SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
             List<GeneralRecordDao> generalRecordDaoList = generalRecordRepository.getByUserIdAndDataSource(userId, dataSource);
-            ArrayList<String> questionIds = new ArrayList<String>();
-            for (int i = 0; i < generalRecordDaoList.size(); i++)
-                questionIds.add(generalRecordDaoList.get(i).getQuestionId());
-            double scoreTotal = 0;
-            double score = 0;
-            double[] weight = {1, 1, 1, 1.05, 1.1};
-            List<QuestionVO> questionVOS = seecoderBokClient.getQuestionListByIds(questionIds);
-            for (int i = 0; i < generalRecordDaoList.size(); i++) {
-                QuestionVO questionVO = questionVOS.get(i);
-                GeneralRecordDao generalRecordDao = generalRecordDaoList.get(i);
-                scoreTotal = scoreTotal + generalRecordDao.getScoreTotal();
-                if (questionVO.getWeight() == null || questionVO.getWeight() == 0)
-                    score = score + generalRecordDao.getScore();
-                else
-                    score = score + generalRecordDao.getScore() * weight[questionVO.getWeight()];
-            }
-            ans = score / scoreTotal;
+            ans = getScoreOnList(generalRecordDaoList);
+        }catch (Exception e){
+            LoggerFactory.getLogger(this.getClass()).error("score: "+dataSource+"得分计算失败" + "  userId: "+userId, e);
+        }
+        return ans;
+    }
+
+    @Override
+    public double getQuestionScoreByWeek(int userId, String dataSource) {
+        double ans = 0;
+        try {
+            LocalDateTime end = LocalDateTime.now();
+            LocalDateTime start = end.minusDays(7);
+            List<GeneralRecordDao> generalRecordDaoList = generalRecordRepository.getByUserIdAndDataSourceAndCreateTimeBetween(userId,dataSource,start,end);
+            ans = getScoreOnList(generalRecordDaoList);
         }catch (Exception e){
             LoggerFactory.getLogger(this.getClass()).error("score: "+dataSource+"得分计算失败" + "  userId: "+userId, e);
         }
@@ -156,4 +158,31 @@ public class EvaluateServiceImpl implements EvaluateService {
 
         return evalTestResult;
     }
+
+    private  double getScoreOnList(List<GeneralRecordDao> generalRecordDaoList){
+        SeecoderBokClient seecoderBokClient = new SeecoderBokClient(bokBaseUrl);
+        double ans = 0.0;
+        ArrayList<String> questionIds = new ArrayList<String>();
+        for (int i = 0; i < generalRecordDaoList.size(); i++)
+            questionIds.add(generalRecordDaoList.get(i).getQuestionId());
+        double scoreTotal = 0;
+        double score = 0;
+        double[] weight = {1, 1, 1, 1.05, 1.1};
+        List<QuestionVO> questionVOS = new ArrayList<>();
+        for(int i=0;i<questionIds.size();i=i+10)
+            questionVOS.addAll(seecoderBokClient.getQuestionListByIds(questionIds.subList(i,i+10>questionIds.size()?questionIds.size():i+10)));
+        for (int i = 0; i < generalRecordDaoList.size(); i++) {
+            QuestionVO questionVO = questionVOS.get(i);
+            GeneralRecordDao generalRecordDao = generalRecordDaoList.get(i);
+            scoreTotal = scoreTotal + generalRecordDao.getScoreTotal();
+            if (questionVO.getWeight() == null || questionVO.getWeight() == 0)
+                score = score + generalRecordDao.getScore();
+            else
+                score = score + generalRecordDao.getScore() * weight[questionVO.getWeight()];
+        }
+        if(scoreTotal!=0)
+            ans = score / scoreTotal;
+        ans = ans>100?100:ans;
+        return ans;
+    }
 }

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

@@ -1,7 +1,9 @@
 package cn.seecoder.data.server.service.Impl;
 
 import cn.seecoder.bok.client.SeecoderBokClient;
+import cn.seecoder.bok.common.vo.InteractionVO;
 import cn.seecoder.bok.common.vo.QuestionVO;
+import cn.seecoder.bok.common.vo.RecordQuestionVO;
 import cn.seecoder.data.server.domain.GeneralRecordDao;
 import cn.seecoder.data.server.domain.knowledge.KnowledgeDao;
 import cn.seecoder.data.server.domain.knowledge.KnowledgeOnPositionDao;
@@ -12,10 +14,14 @@ 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.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
+import java.awt.print.Pageable;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -199,6 +205,21 @@ public class KnowledgeServiceImpl implements KnowledgeService {
         return ans2;
     }
 
+    @Override
+    public double getBokInteractionScore(int userId) {
+        double score = 0;
+        try {
+            SeecoderBokClient seecoderBokClient = new SeecoderBokClient(bokBaseUrl);
+            List<InteractionVO> records = seecoderBokClient.getUserInteractiveQuestionIn(userId + "", null);
+            long collectTime = records.stream().map(n -> n.getCollection()).filter(collect -> collect == true).count();
+            long rateTime = records.stream().map(n -> n.getRate()).filter(rate -> rate > 0).count();
+            score = score + collectTime * 5 + rateTime * 5;
+        }catch (Exception e){
+            LoggerFactory.getLogger(this.getClass()).error("score: bok_event得分计算失败" + "  userId: "+userId, e);
+        }
+        return score;
+    }
+
     private KnowledgePointVO addScoreToNode(KnowledgePointVO root, Double score, Double scoreTotal, QuestionVO questionInfo,String knowledege,int deep) {
         String[] nodeKnowledge = knowledege.split("\\.");
         double[] questionWeight = {1,1,1,1,05,1.1};

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

@@ -36,4 +36,9 @@ public interface KnowledgeService {
      */
     public Map<String,Integer> getKnowledgeWeekCount(int userId);
 
+    /**
+     * 获取题库交互记录得分
+     */
+    public double getBokInteractionScore(int userId);
+
 }