|
@@ -1,7 +1,9 @@
|
|
|
package cn.seecoder.data.server.service.Impl;
|
|
package cn.seecoder.data.server.service.Impl;
|
|
|
|
|
|
|
|
|
|
+import cn.seecoder.data.server.domain.CoderDao;
|
|
|
import cn.seecoder.data.server.domain.sonar.SonarCoderDao;
|
|
import cn.seecoder.data.server.domain.sonar.SonarCoderDao;
|
|
|
import cn.seecoder.data.server.dto.sonarqube.ComponentTreeDto;
|
|
import cn.seecoder.data.server.dto.sonarqube.ComponentTreeDto;
|
|
|
|
|
+import cn.seecoder.data.server.repository.CoderRepository;
|
|
|
import cn.seecoder.data.server.repository.SonarCoderRepository;
|
|
import cn.seecoder.data.server.repository.SonarCoderRepository;
|
|
|
import cn.seecoder.data.server.service.SonarqubeService;
|
|
import cn.seecoder.data.server.service.SonarqubeService;
|
|
|
import cn.seecoder.data.server.utils.enums.ErrorCodeEnum;
|
|
import cn.seecoder.data.server.utils.enums.ErrorCodeEnum;
|
|
@@ -15,10 +17,10 @@ import org.springframework.http.ResponseEntity;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.web.client.RestTemplate;
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
|
|
-import java.util.HashMap;
|
|
|
|
|
-import java.util.LinkedList;
|
|
|
|
|
-import java.util.List;
|
|
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
|
+import java.util.*;
|
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
@Service
|
|
@Service
|
|
|
public class SonarqubeServiceImpl implements SonarqubeService {
|
|
public class SonarqubeServiceImpl implements SonarqubeService {
|
|
@@ -26,6 +28,9 @@ public class SonarqubeServiceImpl implements SonarqubeService {
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private SonarCoderRepository sonarCoderRepository;
|
|
private SonarCoderRepository sonarCoderRepository;
|
|
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private CoderRepository coderRepository;
|
|
|
|
|
+
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private RestTemplate restTemplate;
|
|
private RestTemplate restTemplate;
|
|
|
|
|
|
|
@@ -33,10 +38,20 @@ public class SonarqubeServiceImpl implements SonarqubeService {
|
|
|
private String sonarBaseUrl;
|
|
private String sonarBaseUrl;
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public double getSonarScoreOfUser(int userId) { // 所有项目取平均分 , 100.0 满分
|
|
|
|
|
- List<ComponentTreeDto> componentTreeDtos = getSonarDataOfUser(userId);
|
|
|
|
|
- double sum = componentTreeDtos.stream().mapToDouble(componentTreeDto -> handleMeasures(componentTreeDto.getBaseComponent().getMeasures())).sum();
|
|
|
|
|
- return sum / componentTreeDtos.size();
|
|
|
|
|
|
|
+ public double getSonarScoreOfUser(int userId) {
|
|
|
|
|
+ return getSonarScoreOfUser(userId, LocalDateTime.MIN, LocalDateTime.MAX);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public double getSonarScoreOfUser(int userId, LocalDateTime start, LocalDateTime end) { // 所有项目取平均分 , 100.0 满分
|
|
|
|
|
+ try {
|
|
|
|
|
+ List<ComponentTreeDto> componentTreeDtos = getSonarDataOfUser(userId, start, end);
|
|
|
|
|
+ double sum = componentTreeDtos.stream().mapToDouble(componentTreeDto -> handleMeasures(componentTreeDto.getBaseComponent().getMeasures())).sum();
|
|
|
|
|
+ return sum / componentTreeDtos.size();
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ LoggerFactory.getLogger(this.getClass()).error("score: sonar得分计算失败" + " userId: "+userId, e);
|
|
|
|
|
+ return 0.0;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private double handleMeasures(List<ComponentTreeDto.Measure> measures) { // 单个项目得分计算
|
|
private double handleMeasures(List<ComponentTreeDto.Measure> measures) { // 单个项目得分计算
|
|
@@ -48,17 +63,27 @@ public class SonarqubeServiceImpl implements SonarqubeService {
|
|
|
return sum.get() / measures.size();
|
|
return sum.get() / measures.size();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private List<ComponentTreeDto> getSonarDataOfUser(int userId) { // note: 以后devcloud接入sonar之后,此处源码需要修改
|
|
|
|
|
- // 1. fetch sonarName by userId
|
|
|
|
|
- List<SonarCoderDao> sonarCoderDaos = sonarCoderRepository.findAllByUserId(userId);
|
|
|
|
|
|
|
+ private List<ComponentTreeDto> getSonarDataOfUser(int userId, LocalDateTime start, LocalDateTime end) { // note: 以后devcloud接入sonar之后,此处源码需要修改
|
|
|
|
|
+ // 0. 通过考试结束时间来获取所有 last commit
|
|
|
|
|
+ // 1. 在sonar coder表中通过last commit 获取到对应的 sonarname, 去重
|
|
|
|
|
+ Set<String> sonarNames = new HashSet<>();
|
|
|
|
|
+ Set<Integer> commitIdsSet = coderRepository.findAllByUserIdAndLastCommitAtBetween(userId,start,end)
|
|
|
|
|
+ .stream().map(CoderDao::getCommitId).collect(Collectors.toSet());
|
|
|
|
|
+
|
|
|
|
|
+ commitIdsSet.forEach(commitId -> {
|
|
|
|
|
+ SonarCoderDao byCommitId = sonarCoderRepository.findByCommitId(commitId);
|
|
|
|
|
+ if(byCommitId!=null) sonarNames.add(byCommitId.getSonarName());
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
// 2. fetch sonarComponentTreeDto by sonarName
|
|
// 2. fetch sonarComponentTreeDto by sonarName
|
|
|
List<ComponentTreeDto> componentTreeDtos = new LinkedList<>();
|
|
List<ComponentTreeDto> componentTreeDtos = new LinkedList<>();
|
|
|
- sonarCoderDaos.forEach(sonarCoderDao -> {
|
|
|
|
|
|
|
+ sonarNames.forEach(sonarName -> {
|
|
|
try {
|
|
try {
|
|
|
- ComponentTreeDto componentTreeDto = fetchSonarDataBySonarName(sonarCoderDao.getSonarName());
|
|
|
|
|
|
|
+ ComponentTreeDto componentTreeDto = fetchSonarDataBySonarName(sonarName);
|
|
|
componentTreeDtos.add(componentTreeDto);
|
|
componentTreeDtos.add(componentTreeDto);
|
|
|
} catch (Exception e){
|
|
} catch (Exception e){
|
|
|
- LoggerFactory.getLogger(getClass()).error("sonar: Cannot get data by sonarname '" + sonarCoderDao.getSonarName() + "' !" );
|
|
|
|
|
|
|
+ LoggerFactory.getLogger(getClass()).error("sonar: Cannot get data by sonarname '" + sonarName + "' !" );
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
return componentTreeDtos;
|
|
return componentTreeDtos;
|