瀏覽代碼

feature:子系统算分

uncln 5 年之前
父節點
當前提交
d3fb75b0da
共有 24 個文件被更改,包括 691 次插入315 次删除
  1. 7 7
      seec-data-server/src/main/java/cn/seecoder/data/server/controller/AnalysisController.java
  2. 0 3
      seec-data-server/src/main/java/cn/seecoder/data/server/controller/EvaluateController.java
  3. 30 7
      seec-data-server/src/main/java/cn/seecoder/data/server/controller/KnowledgeController.java
  4. 14 0
      seec-data-server/src/main/java/cn/seecoder/data/server/dto/helper/HelperEventDto.java
  5. 15 0
      seec-data-server/src/main/java/cn/seecoder/data/server/dto/helper/HelperQuizDto.java
  6. 4 0
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/EvaluateRepository.java
  7. 3 0
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/helper/HelperEventRepository.java
  8. 2 0
      seec-data-server/src/main/java/cn/seecoder/data/server/repository/knowledge/PositionWeightRepository.java
  9. 112 52
      seec-data-server/src/main/java/cn/seecoder/data/server/schedule/HelperSchedule.java
  10. 23 0
      seec-data-server/src/main/java/cn/seecoder/data/server/service/AnalysisService.java
  11. 2 2
      seec-data-server/src/main/java/cn/seecoder/data/server/service/EvaluateService.java
  12. 0 7
      seec-data-server/src/main/java/cn/seecoder/data/server/service/GeneralService.java
  13. 26 1
      seec-data-server/src/main/java/cn/seecoder/data/server/service/HelperService.java
  14. 195 0
      seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/AnalysisServiceImpl.java
  15. 21 14
      seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/EvaluateServiceImpl.java
  16. 0 158
      seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/GeneralServiceImpl.java
  17. 105 19
      seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/HelperServiceImpl.java
  18. 26 17
      seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/KnowledgeServiceImpl.java
  19. 62 0
      seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/PlaygroundServiceImpl.java
  20. 14 0
      seec-data-server/src/main/java/cn/seecoder/data/server/service/PlaygroundService.java
  21. 1 0
      seec-data-server/src/main/java/cn/seecoder/data/server/vo/knowledge/KnowledgePointVO.java
  22. 17 16
      seec-data-server/src/main/resources/logback-spring.xml
  23. 1 1
      seec-data-server/src/test/java/cn/seecoder/data/server/service/Impl/AnalysisServiceImplTest.java
  24. 11 11
      seec-data-server/src/test/java/cn/seecoder/data/server/service/Impl/KnowledgeServiceImplTest.java

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

@@ -21,14 +21,14 @@ public class AnalysisController {
     EvaluateService evaluateService;
 
     @RequestMapping("/score/{id}")
-    public Map<String,Double> getEvaluate(@PathVariable("id") Integer id){
+    public Map<String,Double> getEvaluation(@PathVariable("id") Integer id){
         HashMap<String,Double> ans = new HashMap<>();
-        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;
     }
+
+    @RequestMapping("/score-week/{id}")
+    public Map<String,Double> getEvaluationByWeek(@PathVariable("id") Integer id){
+        return null;
+    }
 }

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

@@ -1,16 +1,13 @@
 package cn.seecoder.data.server.controller;
 
-import cn.seecoder.data.server.dto.evaluate.Response;
 import cn.seecoder.data.server.utils.aspects.auth.Auth;
 import cn.seecoder.data.server.utils.enums.ErrorCodeEnum;
 import cn.seecoder.data.server.service.EvaluateService;
 import cn.seecoder.data.server.utils.enums.UserRole;
 import cn.seecoder.data.server.utils.exception.GlobalException;
 import cn.seecoder.data.server.vo.Result;
-import cn.seecoder.data.server.vo.knowledge.*;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
 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;

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

@@ -30,16 +30,33 @@ public class KnowledgeController {
         this.knowledgeService = knowledgeService;
     }
 
+
+    /**
+     * 展示所有知识点及其权重,便于标记
+     * @return
+     */
+    @CrossOrigin
     @RequestMapping("/knowledge/all")
     public List<KnowledgeVO> getEvaluate(){
         return knowledgeService.getAllKnowledgeAndWeight();
     }
 
+    /**
+     * 更新知识点职位信息
+     * @param knowledgeVO
+     * @return
+     */
     @PostMapping("/knowlegde-position/update")
     public KnowledgeVO updatePosition(@NotNull @RequestBody KnowledgeVO knowledgeVO) {
         return knowledgeService.updatePositionWeight(knowledgeVO);
     }
 
+    /**
+     * 删除知识点职位信息
+     * @param knowledgeId
+     * @param position
+     * @return
+     */
     @RequestMapping("/knowledge-tree/position/delete/{knowledgeId}/{position}")
     public Result<String> deletePosition(@PathVariable("knowledgeId") Integer knowledgeId,@PathVariable("position") String position){
         positionWeightRepository.delete(new PositionWeightDao(knowledgeId,position,0));
@@ -47,14 +64,20 @@ public class KnowledgeController {
         return Result.buildSuccess("success");
     }
 
-    @RequestMapping("/knowledge-tree/position/{position}")
-    public KnowledgePointVO getKnowledgeTreeOnPosition(@PathVariable("position") String position){
-        return knowledgeService.getTreeByPositionAndUser(position,332);
+    /**
+     * 根据用户id和职位获取对应的知识点树
+     * @param position
+     * @return
+     */
+    @CrossOrigin
+    @RequestMapping("/knowledge-tree/position/{userId}/{position}")
+    public KnowledgePointVO getKnowledgeTreeOnPosition(@PathVariable("position") String position, @PathVariable("userId") Integer userId){
+        return knowledgeService.getTreeByPositionAndUser(position,userId);
     }
 
-    @RequestMapping("/knowledge/week/{userId}")
-    public Map<String, Integer> getKnowledgeWeekCount(@PathVariable("userId") int userId){
-        return knowledgeService.getKnowledgeWeekCount(userId);
-    }
+//    @RequestMapping("/knowledge/week/{userId}")
+//    public Map<String, Integer> getKnowledgeWeekCount(@PathVariable("userId") int userId){
+//        return knowledgeService.getKnowledgeWeekCount(userId);
+//    }
 
 }

+ 14 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/dto/helper/HelperEventDto.java

@@ -0,0 +1,14 @@
+package cn.seecoder.data.server.dto.helper;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class HelperEventDto {
+    private Integer userId;
+    private String type;
+    private LocalDateTime time;
+    private String action;
+    private String description;
+}

+ 15 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/dto/helper/HelperQuizDto.java

@@ -0,0 +1,15 @@
+package cn.seecoder.data.server.dto.helper;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class HelperQuizDto {
+    private Integer String;
+    private String userId;
+    private LocalDateTime startTime;
+    private LocalDateTime endTime;
+    private Integer durationSeconds;
+    private boolean pass;
+}

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

@@ -6,4 +6,8 @@ import org.springframework.stereotype.Repository;
 
 @Repository
 public interface EvaluateRepository extends JpaRepository<EvaluateDao,Integer> {
+    /**
+     * 根据general_id获取记录
+     */
+    public EvaluateDao findByGeneralId(Integer generalId);
 }

+ 3 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/repository/helper/HelperEventRepository.java

@@ -5,10 +5,13 @@ import lombok.AllArgsConstructor;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 @Repository
 public interface HelperEventRepository extends JpaRepository<HelperEventDao,Integer> {
 
     List<HelperEventDao> findByUserId(int userId);
+
+    List<HelperEventDao> findByUserIdAndTimeBetween(int userId, LocalDateTime start, LocalDateTime end);
 }

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

@@ -10,4 +10,6 @@ public interface PositionWeightRepository extends JpaRepository<PositionWeightDa
     public List<PositionWeightDao> findByKnowledgeId(int kowledgeId);
 
     public List<PositionWeightDao> findByPosition(String position);
+
+    public List<PositionWeightDao> findAll();
 }

+ 112 - 52
seec-data-server/src/main/java/cn/seecoder/data/server/schedule/HelperSchedule.java

@@ -1,26 +1,49 @@
 package cn.seecoder.data.server.schedule;
 
 
+import cn.seecoder.data.server.domain.DevcloudCommitDao;
 import cn.seecoder.data.server.domain.GeneralRecordDao;
 import cn.seecoder.data.server.domain.helper.HelperEventDao;
 import cn.seecoder.data.server.domain.helper.HelperQuizDao;
+import cn.seecoder.data.server.dto.coder.Response;
+import cn.seecoder.data.server.dto.devcloud.DevcloudCommitDto;
+import cn.seecoder.data.server.dto.helper.HelperEventDto;
+import cn.seecoder.data.server.dto.helper.HelperQuizDto;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
 import cn.seecoder.data.server.repository.helper.HelperEventRepository;
 import cn.seecoder.data.server.repository.helper.HelperQuizRepository;
+import cn.seecoder.data.server.service.ExtractionLogService;
+import cn.seecoder.data.server.utils.aspects.dataExtraction.DataExtractor;
+import cn.seecoder.data.server.utils.enums.ErrorCodeEnum;
+import cn.seecoder.data.server.utils.exception.GlobalException;
 import com.alibaba.fastjson.JSONObject;
 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.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.client.RestTemplate;
 import com.alibaba.fastjson.JSONArray;
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @Component
 public class HelperSchedule {
 
+    @Value("${sys.helper.url}")
+    private String helperBaseUrl;
+
+    @Autowired
+    private ExtractionLogService extractionLogService;
+
     @Autowired
     private GeneralRecordRepository generalRecordRepository;
 
@@ -30,74 +53,111 @@ public class HelperSchedule {
     @Autowired
     private HelperEventRepository helperEventRepository;
 
+    @Autowired
+    private RestTemplate restTemplate;
+
+    private final String source = "helper";
+
     public HelperSchedule(GeneralRecordRepository generalRecordRepository,HelperQuizRepository helperQuizRepository,HelperEventRepository helperEventRepository){
         this.generalRecordRepository = generalRecordRepository;
         this.helperQuizRepository = helperQuizRepository;
         this.helperEventRepository = helperEventRepository;
     }
 
-//    @Scheduled(cron = "0 0 2 * * ?")
+    // @Scheduled(cron = "0 0 2 * * ?")
+    @DataExtractor(source)
+    @Transactional(rollbackFor = Exception.class)
     public void helperQuizExtraction(){
-        RestTemplate restTemplate = new RestTemplate();
-        JSONArray temp;
-        try{
-            temp = restTemplate.getForObject(
-                    "http://localhost:8080/api/quiz/quiz-records/all?start={1}&end={2}",
-                    JSONArray.class,
-                    "2020-06-01 00:00:00",
-                    "2021-04-27 00:00:00"
-            );
-            for(int i=0;i<temp.size();i++){
-                JSONObject quiz_record = temp.getJSONObject(i);
-                for (Map.Entry entry : quiz_record.getJSONObject("answers").entrySet()) {
-                    GeneralRecordDao generalRecordDao = new GeneralRecordDao();
-                    HelperQuizDao helperQuizDao = new HelperQuizDao();
-                    generalRecordDao.setUserId(Integer.parseInt(quiz_record.getString("studentId")));
-                    generalRecordDao.setQuestionId(entry.getKey().toString());
-                    generalRecordDao.setAnswer(((JSONObject)JSONObject.toJSON(entry.getValue())).getString("answer"));
-                    generalRecordDao.setDataSource("helper");
-                    generalRecordDao.setScoreTotal(5);
-                    getTime(generalRecordDao,Integer.parseInt(quiz_record.getString("quizId")),restTemplate,quiz_record.getString("submitAt"));
-                    if(((JSONObject)JSONObject.toJSON(entry.getValue())).getBooleanValue("correct")) {
-                        generalRecordDao.setPass(1);
-                        generalRecordDao.setScore(5);
-                    }
-                    else{
-                        generalRecordDao.setPass(0);
-                        generalRecordDao.setScore(0);
-                    }
-                    GeneralRecordDao ans = generalRecordRepository.save(generalRecordDao);
-                    helperQuizDao.setQuizId(Integer.parseInt(quiz_record.getString("quizId")));
-                    helperQuizDao.setQuizName(quiz_record.getString("quizName"));
-                    helperQuizDao.setGeneralId(ans.getId());
-                    helperQuizDao.setSubmitNumber(quiz_record.getInteger("submitNumber"));
-                    helperQuizRepository.save(helperQuizDao);
-                    System.out.println(generalRecordDao);
-                    System.out.println(helperQuizDao);
-                }
+        LocalDateTime start = extractionLogService.getExtractionStartTime(source);
+        LocalDateTime end = extractionLogService.getExtractionEndTime(source);
+        String helperQuizApi = "api/quiz/quiz_records/all";
+        String url = helperBaseUrl + helperQuizApi;
 
+        Map<String,String> params = buildParam(start,end);
+        ParameterizedTypeReference<Response<List<HelperQuizDto>>> responseType = new ParameterizedTypeReference<Response<List<HelperQuizDto>>>() {};
+
+
+        //List<HelperQuizDto> helperQuizDtos = getHelperEventData(url,params,responseType).stream().collect(Collectors.toList());
+
+        JSONArray temp = restTemplate.getForObject(
+                "http://localhost:8080/api/quiz/quiz-records/all?start={1}&end={2}",
+                JSONArray.class,
+                start,
+                end
+        );
+        for(int i=0;i<temp.size();i++){
+            JSONObject quiz_record = temp.getJSONObject(i);
+            for (Map.Entry entry : quiz_record.getJSONObject("answers").entrySet()) {
+                GeneralRecordDao generalRecordDao = new GeneralRecordDao();
+                HelperQuizDao helperQuizDao = new HelperQuizDao();
+                generalRecordDao.setUserId(Integer.parseInt(quiz_record.getString("studentId")));
+                generalRecordDao.setQuestionId(entry.getKey().toString());
+                generalRecordDao.setAnswer(((JSONObject)JSONObject.toJSON(entry.getValue())).getString("answer"));
+                generalRecordDao.setDataSource("helper");
+                generalRecordDao.setScoreTotal(5);
+                getTime(generalRecordDao,Integer.parseInt(quiz_record.getString("quizId")),restTemplate,quiz_record.getString("submitAt"));
+                if(((JSONObject)JSONObject.toJSON(entry.getValue())).getBooleanValue("correct")) {
+                    generalRecordDao.setPass(1);
+                    generalRecordDao.setScore(5);
+                }
+                else{
+                    generalRecordDao.setPass(0);
+                    generalRecordDao.setScore(0);
+                }
+                GeneralRecordDao ans = generalRecordRepository.save(generalRecordDao);
+                helperQuizDao.setQuizId(Integer.parseInt(quiz_record.getString("quizId")));
+                helperQuizDao.setQuizName(quiz_record.getString("quizName"));
+                helperQuizDao.setGeneralId(ans.getId());
+                helperQuizDao.setSubmitNumber(quiz_record.getInteger("submitNumber"));
+                helperQuizRepository.save(helperQuizDao);
             }
-        }catch (Exception e){
-            System.out.println(e);
+
         }
     }
 
     @Scheduled(cron = "0 0 2 * * ?")
+    @DataExtractor(source)
+    @Transactional(rollbackFor = Exception.class)
     public void helperEventExtraction(){
-        RestTemplate restTemplate = new RestTemplate();
-        JSONArray jsonArray = restTemplate.getForObject(
-                "http://localhost:8080/api/event/time?start={1}&end={2}",
-                JSONArray.class,
-                "2000-01-01 00:00:00",
-                "2021-04-30 00:00:00"
-        );
-        for(int i=0;i<jsonArray.size();i++){
-            HelperEventDao helperEventDao = jsonArray.getObject(i,HelperEventDao.class);
-            helperEventRepository.save(helperEventDao);
-        }
+        LocalDateTime start = extractionLogService.getExtractionStartTime(source);
+        LocalDateTime end = extractionLogService.getExtractionEndTime(source);
+        String helperEventApi = "api/event/time";
+        String url = helperBaseUrl + helperEventApi;
+        Map<String,String> params = buildParam(start,end);
+        ParameterizedTypeReference<Response<List<HelperEventDto>>> responseType =
+                new ParameterizedTypeReference<Response<List<HelperEventDto>>>() {};
+        List<HelperEventDao> helperEventDaos = getHelperEventData(url,params,responseType)
+                .stream().map(this::dtoToDaoMapper).collect(Collectors.toList());
+        helperEventRepository.saveAll(helperEventDaos);
+    }
+
+    private HelperEventDao dtoToDaoMapper(HelperEventDto helperEventDto) {
+        return HelperEventDao.builder()
+                .userId(helperEventDto.getUserId())
+                .type(helperEventDto.getType())
+                .action(helperEventDto.getAction())
+                .time(helperEventDto.getTime())
+                .action(helperEventDto.getAction())
+                .build();
+    }
+
+    private Map<String,String> buildParam(LocalDateTime start,LocalDateTime end) {
+        Map<String,String> param = new HashMap<>();
+        param.put("start",start.toString());
+        param.put("end",end.toString());
+        return param;
+    }
+
+    private List<HelperEventDto> getHelperEventData(String url, Map<String,String> param, ParameterizedTypeReference<Response<List<HelperEventDto>>> responseType) {
+        ResponseEntity<Response<List<HelperEventDto>>> r = restTemplate.exchange(url, HttpMethod.GET,null,responseType,param );
+        Response<List<HelperEventDto>> body = r.getBody();
+        if (body == null || body.getCode()!=200) throw new GlobalException(ErrorCodeEnum.SERVICE_ERROR_C0002);
+        List<HelperEventDto> source = body.getSource();
+        if(source == null || source.size()==0) throw new GlobalException(ErrorCodeEnum.SERVICE_ERROR_C0003);
+        return source;
     }
 
-    public void getTime(GeneralRecordDao generalRecordDao, int quizId, RestTemplate restTemplate, String submit){
+    private void getTime(GeneralRecordDao generalRecordDao, int quizId, RestTemplate restTemplate, String submit){
         try {
             JSONObject quiz = restTemplate.getForObject("http://localhost:8080/api/quiz/{1}",JSONObject.class,quizId);
             String start = quiz.getString("createAt").replace('T',' ').split("\\.")[0];

+ 23 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/service/AnalysisService.java

@@ -0,0 +1,23 @@
+package cn.seecoder.data.server.service;
+
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+@Service
+public interface AnalysisService {
+    /**
+     * 获取用户在子系统评分
+     * @param userId
+     * @return
+     */
+    public Map<String,Double> getSystemScoreByUserId(Integer userId);
+
+
+    /**
+     * 以周为单位获取用户在子系统评分
+     * @param userId
+     * @return
+     */
+    public Map<String,Double> getSystemWeekScoreByUserId(Integer userId);
+}

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

@@ -4,9 +4,9 @@ import java.util.Map;
 
 public interface EvaluateService {
 
-    public double getQuestionScore(int userId,String dataSource);
+    public double getEvaluationScore(int userId);
 
-    public double getQuestionScoreByWeek(int userId,String dataSource);
+    public double getEvaluationScoreByWeek(int userId);
 
     public Map<String, Map<String,Double>> analyzeEvalTest(Integer examId);
 }

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

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

+ 26 - 1
seec-data-server/src/main/java/cn/seecoder/data/server/service/HelperService.java

@@ -2,8 +2,33 @@ package cn.seecoder.data.server.service;
 
 import org.springframework.stereotype.Service;
 
+import javax.persistence.criteria.CriteriaBuilder;
+
 @Service
 public interface HelperService {
 
-    public double getHelperEventScoreById(int id);
+    /**
+     * 获取用户在helper的事件数据
+     * @param id
+     * @return
+     */
+    public double getHelperEventScoreById(Integer id);
+
+    /**
+     * 获取用户在helper的事件周报数据
+     */
+
+    public double getHelperEventScoreByIdByWeek(Integer id);
+
+    /**
+     * 获取用户在helper总分数
+     */
+    public double getHelperQuestionScoreById(Integer id);
+
+    /**
+     * 获取用户在helper总分周报数据
+     */
+    public double getHelperQuestionScoreByIdByWeek(Integer id);
+
+
 }

+ 195 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/AnalysisServiceImpl.java

@@ -0,0 +1,195 @@
+package cn.seecoder.data.server.service.Impl;
+
+import cn.seecoder.data.server.service.*;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Service
+public class AnalysisServiceImpl implements AnalysisService {
+
+
+    final HelperService helperService;
+
+    final EvaluateService evaluateService;
+
+    final CoderService coderService;
+
+    final DevcloudService devcloudService;
+
+    final PlaygroundService playgroundService;
+
+    public AnalysisServiceImpl(HelperService helperService, EvaluateService evaluateService, CoderService coderService, DevcloudService devcloudService, PlaygroundService playgroundService) {
+        this.helperService = helperService;
+        this.evaluateService = evaluateService;
+        this.coderService = coderService;
+        this.devcloudService = devcloudService;
+        this.playgroundService = playgroundService;
+    }
+
+    @Override
+    public Map<String,Double> getSystemScoreByUserId(Integer userId) {
+        HashMap<String,Double> ans = new HashMap<>();
+        LocalDateTime end = LocalDateTime.now();
+        LocalDateTime start = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
+        ans.put("evaluate",evaluateService.getEvaluationScore(userId));
+        ans.put("helper",helperService.getHelperQuestionScoreById(userId)*0.5+helperService.getHelperEventScoreById(userId)*0.5);
+        ans.put("coder",coderService.getCoderGrade(userId,start,end));
+        ans.put("devcloud", devcloudService.commitScoreCompute(userId,start,end));
+        ans.put("playground", playgroundService.getQuestionScore(userId,start,end));
+        return ans;
+    }
+
+    @Override
+    public Map<String,Double> getSystemWeekScoreByUserId(Integer userId){
+        HashMap<String,Double> ans = new HashMap<>();
+        LocalDateTime end = LocalDateTime.now();
+        LocalDateTime start = end.minusDays(7);
+        ans.put("evaluate",evaluateService.getEvaluationScoreByWeek(userId));
+        ans.put("helper",helperService.getHelperQuestionScoreByIdByWeek(userId)*0.5+helperService.getHelperEventScoreByIdByWeek(userId)*0.5);
+        ans.put("coder",coderService.getCoderGrade(userId,start,end));
+        ans.put("devcloud", devcloudService.commitScoreCompute(userId,start,end));
+        ans.put("playground", playgroundService.getQuestionScore(userId,start,end));
+        return ans;
+    }
+
+
+
+
+//    @Autowired
+//    private GeneralRecordRepository generalRecordRepository;
+//
+//    @Autowired
+//    private KnowledgeRepository knowledgeRepository;
+
+
+
+//    private KnowledgePointVO 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<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++){
+//            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);
+//                        KnowledgePointVO knowledgePointVO = knowledgePointVOS.get(index);
+//                        if(questionVO.getWeight()==null || questionVO.getWeight()==0){
+//                            knowledgePointVO.setScoreGotten(knowledgePointVO.getScoreGotten()+scores.get(i));
+//                            knowledgePointVO.setScoreTotal(knowledgePointVO.getScoreTotal()+scoresTotal.get(i));
+//                            knowledgePointVO.setQuestionsNumDone(knowledgePointVO.getQuestionsNumDone()+1);
+//                        }
+//                        else{
+//                            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)
+//                            knowledgePointVOS.add(new KnowledgePointVO(knowledge,scores.get(i)*weights[questionVO.getWeight()]
+//                                    ,scoresTotal.get(i),1,0,null));
+//                        else
+//                            knowledgePointVOS.add(new KnowledgePointVO(knowledge,scores.get(i)
+//                                    ,scoresTotal.get(i),1,0,null));
+//                    }
+//                }
+//            }
+//        }
+//        for(int i=0;i<knowledgePointVOS.size();i++){
+//            KnowledgePointVO knowledgePointVO = knowledgePointVOS.get(i);
+//            ArrayList<String> knowledgeIds = new ArrayList<>();
+//            knowledgeIds.add(knowledgePointVO.getKnowledge());
+//            long questionNum = seecoderBokClient.getQuestionList(null,null,null,null,knowledgeIds,null).getTotalElements();
+//            knowledgePointVO.setQuestionsNumTotal(questionNum);
+//        }
+//        KnowledgePointVO root = new KnowledgePointVO("SE",0,0,0,0,null);
+//        root.setName("Software Engineering");
+//        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){
+//                if(tempNodes[0].trim().equals("SE")) {
+//                    addstatistics(root,node);
+//                }
+//                else{
+//                    int deep = 0;
+//                    KnowledgePointVO target = root;
+//                    String prefix = "";
+//                    while (tempNodes.length>deep){
+//                        ArrayList<String> abbreviations = getAbbreviationOnVO(target.getKnowledgePointVOs());
+//                        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.getKnowledgePointVOs().get(abbreviations.indexOf(knowledgeAbb));
+//                        else{
+//                            newNode = true;
+//                            KnowledgePointVO temp = new KnowledgePointVO(knowledgeAbb, node.getScoreGotten(), node.getScoreTotal(),
+//                                    node.getQuestionsNumDone(), node.getQuestionsNumTotal(), null);
+//                            temp.setName(knowledgeRepository.findByAbbreviation(knowledgeAbb).getName());
+//                            ArrayList<KnowledgePointVO> know = (ArrayList<KnowledgePointVO>) target.getKnowledgePointVOs();
+//                            if(know == null)
+//                                know = new ArrayList<>();
+//                            know.add(temp);
+//                            target.setKnowledgePointVOs(know);
+//                            target = temp;
+//                        }
+//                        prefix = knowledgeAbb;
+//                        deep++;
+//                    }
+//                }
+//            }
+//        }
+//        getCoverAndCorretRates(root);
+//        return root;
+//    }
+//
+//    private ArrayList<String> getAbbreviationOnVO(List<KnowledgePointVO> knowledgePointVOS){
+//        ArrayList<String> arrayList= new ArrayList<>();
+//        if(knowledgePointVOS!=null && knowledgePointVOS.size()>0) {
+//            for (KnowledgePointVO knowledgePointVO : knowledgePointVOS)
+//                arrayList.add(knowledgePointVO.getKnowledge());
+//        }
+//        return arrayList;
+//    }
+//
+//    private 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());
+//    }
+//
+//    private void getCoverAndCorretRates(KnowledgePointVO root){
+//        root.setCoverageRate(root.getQuestionsNumDone()/ root.getQuestionsNumTotal());
+//        root.setCorrectRate(root.getScoreGotten()/root.getScoreTotal());
+//        if(root.getKnowledgePointVOs()!=null && root.getKnowledgePointVOs().size()>0){
+//            for(KnowledgePointVO temp : root.getKnowledgePointVOs())
+//                getCoverAndCorretRates(temp);
+//        }
+//    }
+}

+ 21 - 14
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/EvaluateServiceImpl.java

@@ -7,6 +7,7 @@ import cn.seecoder.data.server.domain.knowledge.KnowledgeDao;
 import cn.seecoder.data.server.dto.evaluate.ExamQuestionAndScoreDto;
 import cn.seecoder.data.server.dto.evaluate.ExamRecordDto;
 import cn.seecoder.data.server.dto.evaluate.Response;
+import cn.seecoder.data.server.repository.EvaluateRepository;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
 import cn.seecoder.data.server.repository.knowledge.KnowledgeRepository;
 import cn.seecoder.data.server.service.EvaluateService;
@@ -29,38 +30,41 @@ public class EvaluateServiceImpl implements EvaluateService {
     @Value("${sys.bok.url}")
     private String bokBaseUrl;
 
-    @Autowired
-    private GeneralRecordRepository generalRecordRepository;
+    final EvaluateRepository evaluateRepository;
 
-    @Autowired
-    private KnowledgeRepository knowledgeRepository;
+    final GeneralRecordRepository generalRecordRepository;
 
-    public EvaluateServiceImpl(GeneralRecordRepository generalRecordRepository){
+    final KnowledgeRepository knowledgeRepository;
+
+    @Autowired
+    public EvaluateServiceImpl(EvaluateRepository evaluateRepository, GeneralRecordRepository generalRecordRepository, KnowledgeRepository knowledgeRepository){
+        this.evaluateRepository = evaluateRepository;
         this.generalRecordRepository = generalRecordRepository;
+        this.knowledgeRepository = knowledgeRepository;
     }
 
     @Override
-    public double getQuestionScore(int userId,String dataSource) {
+    public double getEvaluationScore(int userId) {
         double ans = 0.0;
         try {
-            List<GeneralRecordDao> generalRecordDaoList = generalRecordRepository.getByUserIdAndDataSource(userId, dataSource);
+            List<GeneralRecordDao> generalRecordDaoList = generalRecordRepository.getByUserIdAndDataSource(userId, "evaluate");
             ans = getScoreOnList(generalRecordDaoList);
         }catch (Exception e){
-            LoggerFactory.getLogger(this.getClass()).error("score: "+dataSource+"得分计算失败" + "  userId: "+userId, e);
+            LoggerFactory.getLogger(this.getClass()).error("score: evaluate"+"得分计算失败" + "  userId: "+userId, e);
         }
         return ans;
     }
 
     @Override
-    public double getQuestionScoreByWeek(int userId, String dataSource) {
+    public double getEvaluationScoreByWeek(int userId) {
         double ans = 0;
         try {
             LocalDateTime end = LocalDateTime.now();
             LocalDateTime start = end.minusDays(7);
-            List<GeneralRecordDao> generalRecordDaoList = generalRecordRepository.getByUserIdAndDataSourceAndCreateTimeBetween(userId,dataSource,start,end);
+            List<GeneralRecordDao> generalRecordDaoList = generalRecordRepository.getByUserIdAndDataSourceAndCreateTimeBetween(userId,"evaluate",start,end);
             ans = getScoreOnList(generalRecordDaoList);
         }catch (Exception e){
-            LoggerFactory.getLogger(this.getClass()).error("score: "+dataSource+"得分计算失败" + "  userId: "+userId, e);
+            LoggerFactory.getLogger(this.getClass()).error("score: evaluate"+"得分计算失败" + "  userId: "+userId, e);
         }
         return ans;
     }
@@ -167,18 +171,21 @@ public class EvaluateServiceImpl implements EvaluateService {
             questionIds.add(generalRecordDaoList.get(i).getQuestionId());
         double scoreTotal = 0;
         double score = 0;
-        double[] weight = {1, 1, 1, 1.05, 1.1};
+        double[] weight = {1, 1, 1, 1, 1.05, 1.1};
+        double[] difficulty = {1, 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++) {
+            Integer diffWeight = evaluateRepository.findByGeneralId(generalRecordDaoList.get(i).getId()).getDifficuty();
+            diffWeight = diffWeight==null?0:diffWeight;
             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();
+                score = score + generalRecordDao.getScore() * difficulty[diffWeight];
             else
-                score = score + generalRecordDao.getScore() * weight[questionVO.getWeight()];
+                score = score + generalRecordDao.getScore() * weight[questionVO.getWeight()] * difficulty[diffWeight];
         }
         if(scoreTotal!=0)
             ans = score / scoreTotal;

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

@@ -1,158 +0,0 @@
-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.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;
-
-
-@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 KnowledgePointVO 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<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++){
-            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);
-                        KnowledgePointVO knowledgePointVO = knowledgePointVOS.get(index);
-                        if(questionVO.getWeight()==null || questionVO.getWeight()==0){
-                            knowledgePointVO.setScoreGotten(knowledgePointVO.getScoreGotten()+scores.get(i));
-                            knowledgePointVO.setScoreTotal(knowledgePointVO.getScoreTotal()+scoresTotal.get(i));
-                            knowledgePointVO.setQuestionsNumDone(knowledgePointVO.getQuestionsNumDone()+1);
-                        }
-                        else{
-                            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)
-                            knowledgePointVOS.add(new KnowledgePointVO(knowledge,scores.get(i)*weights[questionVO.getWeight()]
-                                    ,scoresTotal.get(i),1,0,null));
-                        else
-                            knowledgePointVOS.add(new KnowledgePointVO(knowledge,scores.get(i)
-                                    ,scoresTotal.get(i),1,0,null));
-                    }
-                }
-            }
-        }
-        for(int i=0;i<knowledgePointVOS.size();i++){
-            KnowledgePointVO knowledgePointVO = knowledgePointVOS.get(i);
-            ArrayList<String> knowledgeIds = new ArrayList<>();
-            knowledgeIds.add(knowledgePointVO.getKnowledge());
-            long questionNum = seecoderBokClient.getQuestionList(null,null,null,null,knowledgeIds,null).getTotalElements();
-            knowledgePointVO.setQuestionsNumTotal(questionNum);
-        }
-        KnowledgePointVO root = new KnowledgePointVO("SE",0,0,0,0,null);
-        root.setName("Software Engineering");
-        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){
-                if(tempNodes[0].trim().equals("SE")) {
-                    addstatistics(root,node);
-                }
-                else{
-                    int deep = 0;
-                    KnowledgePointVO target = root;
-                    String prefix = "";
-                    while (tempNodes.length>deep){
-                        ArrayList<String> abbreviations = getAbbreviationOnVO(target.getKnowledgePointVOs());
-                        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.getKnowledgePointVOs().get(abbreviations.indexOf(knowledgeAbb));
-                        else{
-                            newNode = true;
-                            KnowledgePointVO temp = new KnowledgePointVO(knowledgeAbb, node.getScoreGotten(), node.getScoreTotal(),
-                                    node.getQuestionsNumDone(), node.getQuestionsNumTotal(), null);
-                            temp.setName(knowledgeRepository.findByAbbreviation(knowledgeAbb).getName());
-                            ArrayList<KnowledgePointVO> know = (ArrayList<KnowledgePointVO>) target.getKnowledgePointVOs();
-                            if(know == null)
-                                know = new ArrayList<>();
-                            know.add(temp);
-                            target.setKnowledgePointVOs(know);
-                            target = temp;
-                        }
-                        prefix = knowledgeAbb;
-                        deep++;
-                    }
-                }
-            }
-        }
-        getCoverAndCorretRates(root);
-        return root;
-    }
-
-    public ArrayList<String> getAbbreviationOnVO(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 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(KnowledgePointVO root){
-        root.setCoverageRate(root.getQuestionsNumDone()/ root.getQuestionsNumTotal());
-        root.setCorrectRate(root.getScoreGotten()/root.getScoreTotal());
-        if(root.getKnowledgePointVOs()!=null && root.getKnowledgePointVOs().size()>0){
-            for(KnowledgePointVO temp : root.getKnowledgePointVOs())
-                getCoverAndCorretRates(temp);
-        }
-    }
-}

+ 105 - 19
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/HelperServiceImpl.java

@@ -1,46 +1,132 @@
 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.helper.HelperEventDao;
 import cn.seecoder.data.server.repository.GeneralRecordRepository;
 import cn.seecoder.data.server.repository.helper.HelperEventRepository;
 import cn.seecoder.data.server.service.HelperService;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 
 @Service
 public class HelperServiceImpl implements HelperService {
 
-    @Autowired
-    GeneralRecordRepository generalRecordRepository;
+    @Value("${sys.bok.url}")
+    private String bokBaseUrl;
+
+    final GeneralRecordRepository generalRecordRepository;
+
+    final HelperEventRepository helperEventRepository;
 
     @Autowired
-    HelperEventRepository helperEventRepository;
+    public HelperServiceImpl(GeneralRecordRepository generalRecordRepository, HelperEventRepository helperEventRepository){
+        this.generalRecordRepository = generalRecordRepository;
+        this.helperEventRepository = helperEventRepository;
+    }
 
     @Override
-    public double getHelperEventScoreById(int userId) {
+    public double getHelperEventScoreById(Integer userId) {
         double score = 0;
-        List<HelperEventDao> events = helperEventRepository.findByUserId(userId);
         try {
-            if (events.size() > 0) {
-                score = score + 60;
-                for (int i = 0; i < events.size(); i++) {
-                    HelperEventDao event = events.get(i);
-                    if (event.getType().equals("LESSON"))
-                        score = score + 10;
-                    else if (event.getType().equals("QUIZ"))
-                        score = score + 5;
-                    else if (event.getType().equals("POST")) {
-                        String comment = event.getDescription();
-                        score = score + 5 + (comment.length() / 10.0 > 5 ? 5 : comment.length() / 10.0);
-                    }
-                }
-            }
+            List<HelperEventDao> events = helperEventRepository.findByUserId(userId);
+            score = getEventScoreOnList(events);
         }catch (Exception e){
             LoggerFactory.getLogger(this.getClass()).error("score: helper_event得分计算失败" + "  userId: "+userId, e);
         }
         return score;
     }
+
+    @Override
+    public double getHelperEventScoreByIdByWeek(Integer userId) {
+        LocalDateTime end = LocalDateTime.now();
+        LocalDateTime start = end.minusDays(7);
+        double score = 0;
+        try {
+            List<HelperEventDao> events = helperEventRepository.findByUserIdAndTimeBetween(userId,start,end);
+            score = getEventScoreOnList(events);
+        }catch (Exception e){
+            LoggerFactory.getLogger(this.getClass()).error("score: helper_event得分计算失败" + "  userId: "+userId, e);
+        }
+        return score;
+    }
+
+    @Override
+    public double getHelperQuestionScoreById(Integer userId) {
+        double ans = 0;
+        try {
+            List<GeneralRecordDao> generalRecordDaoList = generalRecordRepository.getByUserIdAndDataSource(userId,"helper");
+            ans = getQuestionScoreOnList(generalRecordDaoList);
+        }catch (Exception e){
+            LoggerFactory.getLogger(this.getClass()).error("score: helper"+"得分计算失败" + "  userId: "+userId, e);
+        }
+        return ans;
+    }
+
+    @Override
+    public double getHelperQuestionScoreByIdByWeek(Integer userId) {
+        double ans = 0;
+        try {
+            LocalDateTime end = LocalDateTime.now();
+            LocalDateTime start = end.minusDays(7);
+            List<GeneralRecordDao> generalRecordDaoList = generalRecordRepository.getByUserIdAndDataSourceAndCreateTimeBetween(userId,"helper",start,end);
+            ans = getQuestionScoreOnList(generalRecordDaoList);
+        }catch (Exception e){
+            LoggerFactory.getLogger(this.getClass()).error("score: helper"+"得分计算失败" + "  userId: "+userId, e);
+        }
+        return ans;
+    }
+
+    private double getEventScoreOnList(List<HelperEventDao> events){
+        double score = 0;
+        if (events.size() > 0) {
+            score = score + 60;
+            for (int i = 0; i < events.size(); i++) {
+                HelperEventDao event = events.get(i);
+                if (event.getType().equals("LESSON"))
+                    score = score + 5;
+                else if (event.getType().equals("QUIZ"))
+                    score = score + 5;
+                else if (event.getType().equals("POST")) {
+                    String comment = event.getDescription();
+                    score = score + 5 + (comment.length() / 10.0 > 5 ? 5 : comment.length() / 10.0);
+                }
+            }
+        }
+        return 0;
+    }
+
+    private double getQuestionScoreOnList(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, 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;
+    }
 }

+ 26 - 17
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/KnowledgeServiceImpl.java

@@ -3,7 +3,6 @@ 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;
@@ -17,11 +16,8 @@ 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;
@@ -106,12 +102,19 @@ public class KnowledgeServiceImpl implements KnowledgeService {
 
     @Override
     public KnowledgePointVO getTreeByPosition(String position) {
-        List<PositionWeightDao> positionWeightDaos = positionWeightRepository.findByPosition(position);
+        List<PositionWeightDao> positionWeightDaos;
+        if(position.equals("all")) {
+            positionWeightDaos = positionWeightRepository.findAll();
+        }
+        else
+            positionWeightDaos = positionWeightRepository.findByPosition(position);
         SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
-        KnowledgePointVO root = new KnowledgePointVO("SE","软件工程",0,0,0,0,0,0,0,null);
+        KnowledgePointVO root = new KnowledgePointVO("SE","软件工程",0,0,0,0,0,0,0,null,0);
         for(int i=0;i<positionWeightDaos.size();i++){
             PositionWeightDao positionWeight = positionWeightDaos.get(i);
             KnowledgeDao knowledgeInfo = knowledgeRepository.findById(positionWeight.getKnowledgeId());
+            if(knowledgeInfo==null || knowledgeInfo.getIsleaf()==0)
+                continue;
             String[] knowledgeLevel = knowledgeInfo.getAbbreviation().split("\\.");
             String prefix = "";
             KnowledgePointVO upNode = root;
@@ -121,7 +124,7 @@ public class KnowledgeServiceImpl implements KnowledgeService {
                     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);
+                    nodeToAdd = new KnowledgePointVO(tempLevel,knowledgeInfo.getName(),0,0,0,0,0,0,0,null,0);
                     if(j+1==knowledgeLevel.length) {
                         ArrayList<String> knowledgeIds = new ArrayList<>();
                         knowledgeIds.add(tempLevel);
@@ -222,33 +225,39 @@ public class KnowledgeServiceImpl implements KnowledgeService {
 
     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};
+        double[] questionWeight = {1,1,1,1.05,1.1};
         String now = nodeKnowledge[0];
         for(int i=1;i<deep && i<nodeKnowledge.length;i++)
             now = now + "." + nodeKnowledge[i];
+        root.setQuestionsNumDone(root.getQuestionsNumDone()+1);
         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());
+            double weight = leafNode.getLeafWeight();
+            if(questionInfo.getWeight()!=null)
+                root.setScoreGotten(root.getScoreGotten()+(score*weight*questionWeight[questionInfo.getWeight()]));
+            else
+                root.setScoreGotten(root.getScoreGotten()+score*root.getLeafWeight());
+            root.setScoreTotal(root.getScoreTotal()+scoreTotal*weight);
             if(root.getScoreTotal()!=0)
-                root.setCorrectRate((root.getScoreGotten()/root.getScoreTotal())>1?1:(root.getScoreGotten()/root.getScoreTotal()));
+                root.setCorrectRate(root.getScoreGotten()/root.getScoreTotal());
             if(root.getQuestionsNumTotal()!=0)
-                root.setCoverageRate((root.getQuestionsNumDone()/root.getQuestionsNumTotal())>1?1:(root.getQuestionsNumDone()/root.getQuestionsNumTotal()));
+                root.setCoverageRate(root.getQuestionsNumDone()/root.getQuestionsNumTotal());
+            root.setScore(30*root.getCoverageRate() + 70*root.getCorrectRate());
             return leafNode;
         }
         else{
-            root.setQuestionsNumDone(root.getQuestionsNumDone()+1);
             if(questionInfo.getWeight()!=null)
-                root.setScoreGotten(score*root.getLeafWeight()*questionWeight[questionInfo.getWeight()]);
+                root.setScoreGotten(root.getScoreGotten()+(score*root.getLeafWeight()*questionWeight[questionInfo.getWeight()]));
             else
-                root.setScoreGotten(score*root.getLeafWeight());
-            root.setScoreTotal(scoreTotal*root.getLeafWeight());
+                root.setScoreGotten(root.getScoreGotten()+score*root.getLeafWeight());
+            root.setScoreTotal(root.getScoreTotal()+scoreTotal*root.getLeafWeight());
             if(root.getScoreTotal()!=0)
                 root.setCorrectRate(root.getScoreGotten()/root.getScoreTotal());
             if(root.getQuestionsNumTotal()!=0)
                 root.setCoverageRate(root.getQuestionsNumDone()/root.getQuestionsNumTotal());
+            root.setQuestionsNumDone(root.getQuestionsNumDone()+1);
+            root.setScore(30*root.getCoverageRate() + 70*root.getCorrectRate());
             return root;
         }
     }

+ 62 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/PlaygroundServiceImpl.java

@@ -0,0 +1,62 @@
+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.repository.GeneralRecordRepository;
+import cn.seecoder.data.server.service.PlaygroundService;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class PlaygroundServiceImpl implements PlaygroundService {
+
+    @Value("${sys.bok.url}")
+    private String bokBaseUrl;
+
+    final GeneralRecordRepository generalRecordRepository;
+
+    public PlaygroundServiceImpl(GeneralRecordRepository generalRecordRepository) {
+        this.generalRecordRepository = generalRecordRepository;
+    }
+
+
+    @Override
+    public Double getQuestionScore(Integer userId, LocalDateTime start, LocalDateTime end) {
+        double ans = 0;
+        try {
+            List<GeneralRecordDao> generalRecordDaoList = generalRecordRepository.getByUserIdAndDataSourceAndCreateTimeBetween(userId,"playground",start,end);
+            SeecoderBokClient seecoderBokClient = new SeecoderBokClient(bokBaseUrl);
+            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, 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;
+        }catch (Exception e){
+            LoggerFactory.getLogger(this.getClass()).error("score: playground"+"得分计算失败" + "  userId: "+userId, e);
+        }
+        return ans;
+    }
+}

+ 14 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/service/PlaygroundService.java

@@ -0,0 +1,14 @@
+package cn.seecoder.data.server.service;
+
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+
+@Service
+public interface PlaygroundService {
+
+    /**
+     * 按时间获取专题评分
+     */
+    public Double getQuestionScore(Integer userId, LocalDateTime start,LocalDateTime end);
+}

+ 1 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/vo/knowledge/KnowledgePointVO.java

@@ -20,6 +20,7 @@ public class KnowledgePointVO {
     private double correctRate;
     private double leafWeight;
     private List<KnowledgePointVO> knowledgePointVOs;
+    private double score;
 
     public KnowledgePointVO(String knowledge, double coverageRate, double correctRate, List<KnowledgePointVO> knowledgesNodeVO) {
         this.knowledge=knowledge;

+ 17 - 16
seec-data-server/src/main/resources/logback-spring.xml

@@ -233,23 +233,24 @@
         root指定最基础的日志输出级别,level属性指定
         appender-ref标识的appender将会添加到这个logger
     -->
-<!--    <root level="info">-->
-<!--        <appender-ref ref="CONSOLE"/>-->
-<!--        <appender-ref ref="DEBUG_FILE"/>-->
-<!--        <appender-ref ref="INFO_FILE"/>-->
-<!--        <appender-ref ref="WARN_FILE"/>-->
-<!--        <appender-ref ref="ERROR_FILE"/>-->
-<!--    </root>-->
+
+    <root level="info">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="DEBUG_FILE"/>
+        <appender-ref ref="INFO_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
+    </root>
 
     <!-- 4.2 生产环境:输出到文档 -->
-    <springProfile name="pro">
-        <root level="info">
-            <appender-ref ref="CONSOLE" />
-            <appender-ref ref="DEBUG_FILE" />
-            <appender-ref ref="INFO_FILE" />
-            <appender-ref ref="ERROR_FILE" />
-            <appender-ref ref="WARN_FILE" />
-        </root>
-    </springProfile>
+<!--    <springProfile name="pro">-->
+<!--        <root level="info">-->
+<!--            <appender-ref ref="CONSOLE" />-->
+<!--            <appender-ref ref="DEBUG_FILE" />-->
+<!--            <appender-ref ref="INFO_FILE" />-->
+<!--            <appender-ref ref="ERROR_FILE" />-->
+<!--            <appender-ref ref="WARN_FILE" />-->
+<!--        </root>-->
+<!--    </springProfile>-->
 
 </configuration>

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

@@ -17,7 +17,7 @@ import java.util.List;
 @RunWith(SpringJUnit4ClassRunner.class)
 @Rollback(value = false)
 @SpringBootTest
-class GeneralServiceImplTest {
+class AnalysisServiceImplTest {
 
     @Autowired
     GeneralRecordRepository generalRecordRepository;

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

@@ -25,7 +25,7 @@ import java.util.Random;
 import static org.junit.jupiter.api.Assertions.*;
 
 @RunWith(SpringJUnit4ClassRunner.class)
-@Rollback(value = true)
+@Rollback(value = false)
 @SpringBootTest
 class KnowledgeServiceImplTest {
 
@@ -35,12 +35,15 @@ class KnowledgeServiceImplTest {
     @Autowired
     PositionWeightRepository positionWeightRepository;
 
+    @Autowired
+    KnowledgeService knowledgeService;
+
     @Test
     void pushDataTest(){
-        String[] position = {"test"};
+        String[] position = {"test2"};
         Random random = new Random();
         List<KnowledgeDao> knowledgeDaos = knowledgeRepository.findAll();
-        for(int i=0;i<knowledgeDaos.size();i=i+20){
+        for(int i=0;i<knowledgeDaos.size();i=i+10){
             int knowledgeId = knowledgeDaos.get(i).getId();
             PositionWeightDao positionWeightDao = new PositionWeightDao();
             positionWeightDao.setKnowledgeId(knowledgeId);
@@ -52,12 +55,9 @@ class KnowledgeServiceImplTest {
     }
 
 
-//    @Test
-//    void positionTest(){
-//        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);
-//    }
+    @Test
+    void recordsTest(){
+        //knowledgeService.getBokInteractionScore(274);
+        System.out.println(knowledgeService.getBokInteractionScore(274));
+    }
 }