Kaynağa Gözat

fix:decloud commit算分模块改为按时间计算

sky 5 yıl önce
ebeveyn
işleme
f3c5cd8867

+ 41 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/domain/DevcloudCommitDao.java

@@ -0,0 +1,41 @@
+package cn.seecoder.data.server.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+@Table(name = "devcloud_commit")
+public class DevcloudCommitDao {
+    @Id
+    @Column(name = "id" , nullable = false)
+    private Integer id;
+
+
+    @Column(name = "submit_time" , nullable = false)
+    private LocalDateTime submitTime;
+
+
+    @Column(name = "gitlab_username" )
+    private String gitlabUsername;
+
+    @Column(name = "related_id")
+    private Integer relatedId;
+
+    @Column(name = "project_id " , nullable = false)
+    private Integer projectId ;
+
+    @Column(name = "related_type")
+    private String relatedType;
+
+    @Column(name = "email" , nullable = false)
+    private String email;
+}

+ 22 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/dto/devcloud/DevcloudCommitDto.java

@@ -0,0 +1,22 @@
+package cn.seecoder.data.server.dto.devcloud;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class DevcloudCommitDto {
+    private Integer id;
+
+    private LocalDateTime submitTime;
+
+    private String gitlabUsername;
+
+    private Integer relatedId;
+
+    private Integer projectId ;
+
+    private String relatedType;
+
+    private String email;
+}

+ 21 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/repository/DevcloudCommitRepository.java

@@ -0,0 +1,21 @@
+package cn.seecoder.data.server.repository;
+
+import cn.seecoder.data.server.domain.DevcloudCommitDao;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Repository
+public interface DevcloudCommitRepository extends JpaRepository<DevcloudCommitDao,Integer> {
+
+    List<DevcloudCommitDao> findByEmailAndSubmitTimeBetween(String email, LocalDateTime submitTime, LocalDateTime submitTime2);
+
+    @Query("select count(d) from DevcloudCommitDao d where d.projectId=:projectId and d.submitTime>=:submitTime and d.submitTime<:submitTime2")
+    int findCountByProjectIdAndSubmitTimeBetween(Integer projectId,LocalDateTime submitTime, LocalDateTime submitTime2 );
+
+    @Query("select count(distinct d.email) from DevcloudCommitDao d where d.projectId=:projectId and d.submitTime>=:submitTime and d.submitTime<:submitTime2")
+    int findCommitterCountByProjectIdAndSubmitTimeBetween(Integer projectId,LocalDateTime submitTime, LocalDateTime submitTime2 );
+}

+ 90 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/schedule/DevcloudSchedule.java

@@ -0,0 +1,90 @@
+package cn.seecoder.data.server.schedule;
+
+import cn.seecoder.data.server.domain.DevcloudCommitDao;
+import cn.seecoder.data.server.dto.coder.CoderDto;
+import cn.seecoder.data.server.dto.coder.Response;
+import cn.seecoder.data.server.dto.devcloud.DevcloudCommitDto;
+import cn.seecoder.data.server.repository.CoderRepository;
+import cn.seecoder.data.server.repository.DevcloudCommitRepository;
+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.enums.TimeType;
+import cn.seecoder.data.server.utils.exception.GlobalException;
+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.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+
+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;
+
+public class DevcloudSchedule {
+    @Value("${sys.decloud.url}")
+    private String devcloudBaseUrl;
+
+    @Autowired
+    private ExtractionLogService extractionLogService;
+
+    @Autowired
+    private DevcloudCommitRepository devcloudCommitRepository;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    private final String source = "devcloud";
+
+    @Scheduled(cron = "0 0 2 * * ?")
+    @DataExtractor(source)
+    @Transactional(rollbackFor = Exception.class)
+    public void coderDataExtraction() throws Exception {
+        LocalDateTime start = extractionLogService.getExtractionStartTime(source);
+        LocalDateTime end = extractionLogService.getExtractionEndTime(source);
+
+        Map<String,String> param1 = paramBuilder(start,end);
+
+        String devcloudApi = "/query/commit?startAt={startTime}&endAt={endTime}";
+        String url = devcloudBaseUrl + devcloudApi;
+        ParameterizedTypeReference<Response<List<DevcloudCommitDto>>> responseType = new ParameterizedTypeReference<Response<List<DevcloudCommitDto>>>() {};
+
+        List<DevcloudCommitDao> devcloudCommitDtos = getDevcloudApiData(url,param1,responseType).stream().map(this::dtoToDaoMapper).collect(Collectors.toList());
+        devcloudCommitRepository.saveAll(devcloudCommitDtos);
+}
+
+    private List<DevcloudCommitDto> getDevcloudApiData(String url1,Map<String,String> params,ParameterizedTypeReference<Response<List<DevcloudCommitDto>>> responseType) throws Exception {
+        ResponseEntity<Response<List<DevcloudCommitDto>>> r = restTemplate.exchange(url1, HttpMethod.GET,null,responseType,params );
+        Response<List<DevcloudCommitDto>> body = r.getBody();
+        if (body == null || body.getCode()!=200) throw new GlobalException(ErrorCodeEnum.SERVICE_ERROR_C0002);
+        List<DevcloudCommitDto> source = body.getSource();
+        if(source == null || source.size()==0) throw new GlobalException(ErrorCodeEnum.SERVICE_ERROR_C0003);
+        return source;
+    }
+
+    private Map<String, String> paramBuilder(LocalDateTime start, LocalDateTime end) {
+        Map<String,String> param = new HashMap<>();
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        param.put("startTime", start.format(df));
+        param.put("endTime", end.format(df));
+        return param;
+    }
+
+    private DevcloudCommitDao dtoToDaoMapper(DevcloudCommitDto devcloudCommitDto) {
+        return DevcloudCommitDao.builder()
+                .email(devcloudCommitDto.getEmail())
+                .gitlabUsername(devcloudCommitDto.getGitlabUsername())
+                .projectId(devcloudCommitDto.getProjectId())
+                .relatedId(devcloudCommitDto.getRelatedId())
+                .relatedType(devcloudCommitDto.getRelatedType())
+                .submitTime(devcloudCommitDto.getSubmitTime())
+                .id(devcloudCommitDto.getId())
+                .build();
+    }
+}

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

@@ -1,7 +1,11 @@
 package cn.seecoder.data.server.service;
 
+import java.time.LocalDateTime;
+
 public interface DevcloudService {
 
     //通过用户id,获取用户在commit占比上的得分(注意,只有用户提交时按gitlab email提交的commit记录才会录入统计
-    Double commitScoreCompute(Integer userId);
+    public Double commitScoreCompute(Integer userId);
+
+    public Double commitScoreCompute(Integer userId, LocalDateTime start, LocalDateTime end);
 }

+ 42 - 13
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/DevcloudServiceImpl.java

@@ -1,17 +1,25 @@
 package cn.seecoder.data.server.service.Impl;
 
+import cn.seecoder.data.server.domain.DevcloudCommitDao;
 import cn.seecoder.data.server.dto.devcloud.DevcloudCommitCoverageDto;
 import cn.seecoder.data.server.dto.devcloud.Response;
+import cn.seecoder.data.server.repository.DevcloudCommitRepository;
 import cn.seecoder.data.server.service.DevcloudService;
+import cn.seecoder.data.server.utils.Utils;
 import com.nju.edu.gitlab.SeecoderGitlabClient;
 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.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
 
 @Service
 public class DevcloudServiceImpl implements DevcloudService {
@@ -22,25 +30,46 @@ public class DevcloudServiceImpl implements DevcloudService {
     @Value("${sys.gitlab.token}")
     private String gitlabToken;
 
-    @Value("${sys.devcloud.url}")
-    private String devcloudUrl;
+    @Autowired
+    DevcloudCommitRepository devcloudCommitRepository;
 
     @Override
-    public Double commitScoreCompute(Integer userId) { // TODO
+    public Double commitScoreCompute(Integer userId) {
+        return commitScoreCompute(userId, Utils.getSmallStartTime(),LocalDateTime.now());
+    }
+
+    @Override
+    public Double commitScoreCompute(Integer userId, LocalDateTime start,LocalDateTime end) { // TODO
         try {
             // 1. get email from gitlab
             //SeecoderGitlabClient seecoderGitlabClient = new SeecoderGitlabClient(gitlabUrl,gitlabToken);
-            //String email = "email from seecoder gitlab";
-            // 2. fetch data from devcloud
-            List<DevcloudCommitCoverageDto> list = new LinkedList<>();
-            list.add(new DevcloudCommitCoverageDto(1,60,100,5));
-            list.add(new DevcloudCommitCoverageDto(2,30,100,5));
-            list.add(new DevcloudCommitCoverageDto(3,10,100,5));
-            list.add(new DevcloudCommitCoverageDto(4,20,100,5));
-            list.add(new DevcloudCommitCoverageDto(5,50,100,5));
-            Response<List<DevcloudCommitCoverageDto>> coverageDtosResponse = Response.buildSuccess(list);
+            String email = "aaa";
+            // 2. fetch data from devcloudRepo
+
+            //list [{  projectId: 1, commitTimes: 10, allCommits: 30, allPeople: 3 }, ... ]
+
+            List<DevcloudCommitDao> personalCommitDaos = devcloudCommitRepository.findByEmailAndSubmitTimeBetween(email, start, end);
+            Map<Integer,DevcloudCommitCoverageDto> devcloudCommitCoverageMap = new HashMap<>();
+
+            personalCommitDaos.forEach(personalCommitDao -> {
+                Integer projectId = personalCommitDao.getProjectId();
+                if(devcloudCommitCoverageMap.containsKey(projectId)) {
+                    DevcloudCommitCoverageDto devcloudCommitCoverageDto = devcloudCommitCoverageMap.get(projectId);
+                    devcloudCommitCoverageDto.setCommitTimes(devcloudCommitCoverageDto.getCommitTimes() + 1);
+                } else {
+                    devcloudCommitCoverageMap.put(projectId,new DevcloudCommitCoverageDto(projectId,1,0,0));
+                }
+            });
+
+            List<DevcloudCommitCoverageDto> coverageDtos = devcloudCommitCoverageMap.values().stream().peek(devcloudCommitCoverageDto -> {
+                Integer projectId = devcloudCommitCoverageDto.getProjectId();
+                Integer allCommitCount = devcloudCommitRepository.findCountByProjectIdAndSubmitTimeBetween(projectId, start, end);
+                Integer allCommitter = devcloudCommitRepository.findCommitterCountByProjectIdAndSubmitTimeBetween(projectId, start, end);
+                devcloudCommitCoverageDto.setAllCommits(allCommitCount);
+                devcloudCommitCoverageDto.setAllPeople(allCommitter);
+            }).collect(Collectors.toList());
+
             // 3. analysis and compute
-            List<DevcloudCommitCoverageDto> coverageDtos = coverageDtosResponse.getData();
             AtomicInteger count = new AtomicInteger();
             AtomicReference<Double> biasSum = new AtomicReference<>(0.0);
             coverageDtos.forEach(data -> {