Bläddra i källkod

feat: 计算代码贡献度得分; fix: cron表达式只允许6个参数,去除了多余参数

sky 5 år sedan
förälder
incheckning
67831e22df

+ 6 - 0
seec-data-server/pom.xml

@@ -21,6 +21,7 @@
 		<seecoder.judgement.version>0.2.0</seecoder.judgement.version>
 		<httpclient.version>4.5.6</httpclient.version>
 		<java.jwt.version>3.10.3</java.jwt.version>
+		<seecoder.gitlab.version>0.1.0</seecoder.gitlab.version>
 	</properties>
 	<dependencies>
 		<dependency>
@@ -108,6 +109,11 @@
 			<artifactId>judgement-client</artifactId>
 			<version>${seecoder.judgement.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>com.nju.edu</groupId>
+			<artifactId>seecoder-gitlab-client</artifactId>
+			<version>${seecoder.gitlab.version}</version>
+		</dependency>
 
 		<!-- Httpclient -->
 		<dependency>

+ 14 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/dto/devcloud/DevcloudCommitCoverageDto.java

@@ -0,0 +1,14 @@
+package cn.seecoder.data.server.dto.devcloud;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class DevcloudCommitCoverageDto {
+ //list [{  projectId: 1, commitTimes: 10, allCommits: 30, allPeople: 3 }, ... ]
+    Integer projectId;
+    Integer commitTimes;
+    Integer allCommits;
+    Integer allPeople;
+}

+ 35 - 0
seec-data-server/src/main/java/cn/seecoder/data/server/dto/devcloud/Response.java

@@ -0,0 +1,35 @@
+package cn.seecoder.data.server.dto.devcloud;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class Response<T> implements Serializable {
+
+    private Integer code;
+
+    private String msg;
+
+    private T data;
+
+    public Response(Integer code, String msg, T data) {
+        this.code = code;
+        this.msg = msg;
+        this.data = data;
+    }
+
+
+    public static Response<Object> buildSuccess() {
+        return new Response<>(200, "", null);
+    }
+
+
+    public static <T> Response<T> buildSuccess(T result) {
+        return new Response<>(200, "", result);
+    }
+
+    public static  Response<Object> buildFailure(Integer code, String message) {
+        return new Response<>(code,message, null);
+    }
+}

+ 1 - 1
seec-data-server/src/main/java/cn/seecoder/data/server/schedule/CoderSchedule.java

@@ -42,7 +42,7 @@ public class CoderSchedule {
 
     private final String source = "coder";
 
-    @Scheduled(cron = "0 0 2 * * ? *")
+    @Scheduled(cron = "0 0 2 * * ?")
     @DataExtractor(source)
     @Transactional(rollbackFor = Exception.class)
     public void coderDataExtraction() throws Exception {

+ 1 - 1
seec-data-server/src/main/java/cn/seecoder/data/server/schedule/EvaluateSchedule.java

@@ -37,7 +37,7 @@ public class EvaluateSchedule {
 
 
     @DataExtractor("evaluate")
-//    @Scheduled(cron = "0 0 2 * * ? *")
+//    @Scheduled(cron = "0 0 2 * * ?")
     public void evaluateDataExtration(){
         Date date = new Date();
         Calendar calendar = Calendar.getInstance();

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

@@ -36,7 +36,7 @@ public class HelperSchedule {
         this.helperEventRepository = helperEventRepository;
     }
 
-//    @Scheduled(cron = "0 0 2 * * ? *")
+//    @Scheduled(cron = "0 0 2 * * ?")
     public void helperQuizExtraction(){
         RestTemplate restTemplate = new RestTemplate();
         JSONArray temp;
@@ -82,7 +82,7 @@ public class HelperSchedule {
         }
     }
 
-    @Scheduled(cron = "00 00 00 * * ?")
+    @Scheduled(cron = "0 0 2 * * ?")
     public void helperEventExtraction(){
         RestTemplate restTemplate = new RestTemplate();
         JSONArray jsonArray = restTemplate.getForObject(

+ 1 - 1
seec-data-server/src/main/java/cn/seecoder/data/server/schedule/PlaygroundSchedule.java

@@ -42,7 +42,7 @@ public class PlaygroundSchedule {
 
     private final String source = "playground";
 
-    @Scheduled(cron = "0 0 2 * * ? *")
+    @Scheduled(cron = "0 0 2 * * ?")
     @DataExtractor(source)
     @Transactional(rollbackFor = Exception.class)
     public void playGroundDataExtraction() throws Exception {

+ 3 - 1
seec-data-server/src/main/java/cn/seecoder/data/server/schedule/SonarSchedule.java

@@ -16,6 +16,7 @@ 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;
 
@@ -24,6 +25,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+@Component
 public class SonarSchedule {
 
     private final String source = "coderSonar";
@@ -40,7 +42,7 @@ public class SonarSchedule {
     @Autowired
     private RestTemplate restTemplate;
 
-    @Scheduled(cron = "0 0 2 * * ? *")
+    @Scheduled(cron = "0 0 2 * * ?")
     @DataExtractor(source)
     @Transactional(rollbackFor = Exception.class)
     public void coderSoanrDataExtraction() throws Exception {

+ 48 - 3
seec-data-server/src/main/java/cn/seecoder/data/server/service/Impl/DevcloudServiceImpl.java

@@ -1,11 +1,56 @@
 package cn.seecoder.data.server.service.Impl;
 
+import cn.seecoder.data.server.dto.devcloud.DevcloudCommitCoverageDto;
+import cn.seecoder.data.server.dto.devcloud.Response;
 import cn.seecoder.data.server.service.DevcloudService;
+import com.nju.edu.gitlab.SeecoderGitlabClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
 
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+@Service
 public class DevcloudServiceImpl implements DevcloudService {
-    @Override
-    public Double commitScoreCompute(Integer userId) {
 
-        return null;
+    @Value("${sys.gitlab.url}")
+    private String gitlabUrl;
+
+    @Value("${sys.gitlab.token}")
+    private String gitlabToken;
+
+    @Value("${sys.devcloud.url}")
+    private String devcloudUrl;
+
+    private double[] dividePoint = new double[]{0.875, 0.165, 0.23};
+
+    @Override
+    public Double commitScoreCompute(Integer userId) { // TODO
+        // 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);
+        // 3. analysis and compute
+        List<DevcloudCommitCoverageDto> coverageDtos = coverageDtosResponse.getData();
+        AtomicInteger count = new AtomicInteger();
+        AtomicReference<Double> biasSum = new AtomicReference<>(0.0);
+        coverageDtos.forEach(data -> {
+            if(data.getAllPeople()>1) {
+                double difference = data.getCommitTimes() - data.getAllCommits() * 1.0 / data.getAllPeople();
+                biasSum.updateAndGet(v -> (double) (v + (difference > 0 ? difference / (data.getAllPeople()-1) : -difference) / data.getAllCommits() * data.getAllPeople()));
+                count.addAndGet(1);
+            }
+        });
+        double biasRate = biasSum.get()/count.get();
+        return 100 * (1 - biasRate);
     }
 }

+ 3 - 1
seec-data-server/src/main/resources/application.yml

@@ -23,7 +23,9 @@ sys:
     url: 'coder'
   playground:
     url: 'playground'
+    token: 'token'
   devcloud:
     url: 'devcloud'
   gitlab:
-    url: 'gitlab'
+    url: 'gitlab'
+    token: 'token'

+ 25 - 0
seec-data-server/src/test/java/cn/seecoder/data/server/service/Impl/DevcloudServiceImplTest.java

@@ -0,0 +1,25 @@
+package cn.seecoder.data.server.service.Impl;
+
+import cn.seecoder.data.server.service.DevcloudService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import static org.junit.Assert.*;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@Rollback
+@SpringBootTest
+public class DevcloudServiceImplTest {
+
+    @Autowired
+    DevcloudService devcloudService;
+
+    @Test
+    public void commitScoreCompute() {
+        System.out.println(devcloudService.commitScoreCompute(1));
+    }
+}