Skip to content

Commit 52bd2aa

Browse files
author
王灏
committed
Merge branch 'feature-c7n-502' into 'master'
[IMP] 代码调整 See merge request hand-yanqianyun-yq-devops/devops-service!1432
2 parents ebfbfb9 + 26a5204 commit 52bd2aa

File tree

8 files changed

+194
-36
lines changed

8 files changed

+194
-36
lines changed

src/main/java/io/choerodon/devops/api/controller/v1/DevopsProjectQualityController.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.choerodon.devops.api.controller.v1;
22

3+
import java.util.List;
4+
35
import io.swagger.annotations.ApiOperation;
46
import io.swagger.annotations.ApiParam;
57
import org.springframework.beans.factory.annotation.Autowired;
@@ -9,9 +11,11 @@
911
import io.choerodon.core.domain.Page;
1012
import io.choerodon.core.iam.InitRoleCode;
1113
import io.choerodon.core.iam.ResourceLevel;
14+
import io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorRankVO;
1215
import io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorVO;
1316
import io.choerodon.devops.api.vo.sonar.SonarOverviewVO;
1417
import io.choerodon.devops.app.service.SonarAnalyseRecordService;
18+
import io.choerodon.devops.app.service.SonarAnalyseUserIssueAuthorService;
1519
import io.choerodon.mybatis.pagehelper.domain.PageRequest;
1620
import io.choerodon.swagger.annotation.Permission;
1721

@@ -24,6 +28,8 @@
2428
public class DevopsProjectQualityController {
2529
@Autowired
2630
private SonarAnalyseRecordService sonarAnalyseRecordService;
31+
@Autowired
32+
private SonarAnalyseUserIssueAuthorService sonarAnalyseUserIssueAuthorService;
2733

2834

2935
@Permission(level = ResourceLevel.ORGANIZATION, roles = {InitRoleCode.PROJECT_OWNER})
@@ -43,8 +49,37 @@ public ResponseEntity<Page<SonarAnalyseIssueAuthorVO>> listMemberIssue(
4349
@PathVariable(value = "project_id") Long projectId,
4450
@RequestParam(value = "app_service_id") Long appServiceId,
4551
PageRequest pageRequest) {
46-
return ResponseEntity.ok(sonarAnalyseRecordService.listMemberIssue(projectId, appServiceId, pageRequest));
52+
return ResponseEntity.ok(sonarAnalyseUserIssueAuthorService.listMemberIssue(projectId, appServiceId, pageRequest));
53+
}
54+
55+
@Permission(level = ResourceLevel.ORGANIZATION, roles = {InitRoleCode.PROJECT_OWNER})
56+
@ApiOperation(value = "查询团队成员bug排名")
57+
@GetMapping("/member_bug_rank")
58+
public ResponseEntity<List<SonarAnalyseIssueAuthorRankVO>> listMemberBugRank(
59+
@ApiParam(value = "项目id", required = true)
60+
@PathVariable(value = "project_id") Long projectId,
61+
@RequestParam(value = "app_service_id") Long appServiceId) {
62+
return ResponseEntity.ok(sonarAnalyseUserIssueAuthorService.listMemberBugRank(projectId, appServiceId));
63+
}
64+
65+
@Permission(level = ResourceLevel.ORGANIZATION, roles = {InitRoleCode.PROJECT_OWNER})
66+
@ApiOperation(value = "查询团队成员漏洞排名")
67+
@GetMapping("/member_vuln_rank")
68+
public ResponseEntity<List<SonarAnalyseIssueAuthorRankVO>> listMemberVulnRank(
69+
@ApiParam(value = "项目id", required = true)
70+
@PathVariable(value = "project_id") Long projectId,
71+
@RequestParam(value = "app_service_id") Long appServiceId) {
72+
return ResponseEntity.ok(sonarAnalyseUserIssueAuthorService.listMemberVulnRank(projectId, appServiceId));
4773
}
4874

75+
@Permission(level = ResourceLevel.ORGANIZATION, roles = {InitRoleCode.PROJECT_OWNER})
76+
@ApiOperation(value = "查询团队成员代码异味排名")
77+
@GetMapping("/member_code_smell_rank")
78+
public ResponseEntity<List<SonarAnalyseIssueAuthorRankVO>> listMemberCodeSmellRank(
79+
@ApiParam(value = "项目id", required = true)
80+
@PathVariable(value = "project_id") Long projectId,
81+
@RequestParam(value = "app_service_id") Long appServiceId) {
82+
return ResponseEntity.ok(sonarAnalyseUserIssueAuthorService.listMemberCodeSmellRank(projectId, appServiceId));
83+
}
4984

5085
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.choerodon.devops.api.vo;
2+
3+
import io.swagger.annotations.ApiModelProperty;
4+
5+
/**
6+
7+
* @since 2023-06-13 16:22:21
8+
*/
9+
public class SonarAnalyseIssueAuthorRankVO {
10+
11+
private String author;
12+
private String username;
13+
@ApiModelProperty(value = "问题数")
14+
private Long number;
15+
16+
public String getAuthor() {
17+
return author;
18+
}
19+
20+
public void setAuthor(String author) {
21+
this.author = author;
22+
}
23+
24+
public String getUsername() {
25+
return username;
26+
}
27+
28+
public void setUsername(String username) {
29+
this.username = username;
30+
}
31+
32+
public Long getNumber() {
33+
return number;
34+
}
35+
36+
public void setNumber(Long number) {
37+
this.number = number;
38+
}
39+
}

src/main/java/io/choerodon/devops/app/service/SonarAnalyseRecordService.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,9 @@
44
import java.util.Map;
55
import javax.servlet.http.HttpServletRequest;
66

7-
import io.choerodon.core.domain.Page;
8-
import io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorVO;
97
import io.choerodon.devops.api.vo.sonar.SonarOverviewVO;
108
import io.choerodon.devops.api.vo.sonar.WebhookPayload;
119
import io.choerodon.devops.infra.dto.SonarAnalyseRecordDTO;
12-
import io.choerodon.mybatis.pagehelper.domain.PageRequest;
1310

1411
/**
1512
* 代码扫描记录表(SonarAnalyseRecord)应用服务
@@ -28,7 +25,5 @@ public interface SonarAnalyseRecordService {
2825
Map<Long, Double> listProjectScores(List<Long> actualPids);
2926

3027
SonarOverviewVO querySonarOverview(Long projectId);
31-
32-
Page<SonarAnalyseIssueAuthorVO> listMemberIssue(Long projectId, Long appServiceId, PageRequest pageRequest);
3328
}
3429

src/main/java/io/choerodon/devops/app/service/SonarAnalyseUserIssueAuthorService.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import java.util.Collection;
44
import java.util.List;
55

6+
import io.choerodon.core.domain.Page;
7+
import io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorRankVO;
68
import io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorVO;
79
import io.choerodon.devops.infra.dto.SonarAnalyseIssueAuthorDTO;
10+
import io.choerodon.mybatis.pagehelper.domain.PageRequest;
811

912
/**
1013
* 代码扫描记录表(SonarAnalyseUserRecord)应用服务
@@ -19,5 +22,13 @@ public interface SonarAnalyseUserIssueAuthorService {
1922
void batchSave(Long recordId, Collection<SonarAnalyseIssueAuthorDTO> sonarAnalyseIssueAuthorDTOList);
2023

2124
List<SonarAnalyseIssueAuthorVO> listMemberIssue(Long appServiceId);
25+
26+
List<SonarAnalyseIssueAuthorRankVO> listMemberBugRank(Long projectId, Long appServiceId);
27+
28+
Page<SonarAnalyseIssueAuthorVO> listMemberIssue(Long projectId, Long appServiceId, PageRequest pageRequest);
29+
30+
List<SonarAnalyseIssueAuthorRankVO> listMemberVulnRank(Long projectId, Long appServiceId);
31+
32+
List<SonarAnalyseIssueAuthorRankVO> listMemberCodeSmellRank(Long projectId, Long appServiceId);
2233
}
2334

src/main/java/io/choerodon/devops/app/service/impl/SonarAnalyseRecordServiceImpl.java

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.text.SimpleDateFormat;
44
import java.util.*;
5-
import java.util.function.Function;
65
import java.util.stream.Collectors;
76
import javax.servlet.http.HttpServletRequest;
87

@@ -21,9 +20,7 @@
2120
import io.choerodon.asgard.saga.annotation.Saga;
2221
import io.choerodon.asgard.saga.producer.StartSagaBuilder;
2322
import io.choerodon.asgard.saga.producer.TransactionalProducer;
24-
import io.choerodon.core.domain.Page;
2523
import io.choerodon.core.iam.ResourceLevel;
26-
import io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorVO;
2724
import io.choerodon.devops.api.vo.pipeline.DevopsCiSonarQualityGateVO;
2825
import io.choerodon.devops.api.vo.sonar.*;
2926
import io.choerodon.devops.app.eventhandler.constants.SagaTopicCodeConstants;
@@ -32,7 +29,6 @@
3229
import io.choerodon.devops.infra.config.SonarConfigProperties;
3330
import io.choerodon.devops.infra.constant.ExceptionConstants;
3431
import io.choerodon.devops.infra.dto.*;
35-
import io.choerodon.devops.infra.dto.iam.IamUserDTO;
3632
import io.choerodon.devops.infra.enums.SonarQubeType;
3733
import io.choerodon.devops.infra.enums.sonar.IssueFacetEnum;
3834
import io.choerodon.devops.infra.enums.sonar.IssueTypeEnum;
@@ -45,8 +41,6 @@
4541
import io.choerodon.devops.infra.util.MapperUtil;
4642
import io.choerodon.devops.infra.util.RetrofitCallExceptionParse;
4743
import io.choerodon.devops.infra.util.SonarUtil;
48-
import io.choerodon.mybatis.pagehelper.PageHelper;
49-
import io.choerodon.mybatis.pagehelper.domain.PageRequest;
5044

5145
/**
5246
* 代码扫描记录表(SonarAnalyseRecord)应用服务
@@ -371,30 +365,6 @@ public SonarOverviewVO querySonarOverview(Long projectId) {
371365
return sonarOverviewVO;
372366
}
373367

374-
@Override
375-
public Page<SonarAnalyseIssueAuthorVO> listMemberIssue(Long projectId, Long appServiceId, PageRequest pageRequest) {
376-
Page<SonarAnalyseIssueAuthorVO> page = PageHelper.doPageAndSort(pageRequest, () -> sonarAnalyseUserIssueAuthorService.listMemberIssue(appServiceId));
377-
List<SonarAnalyseIssueAuthorVO> content = page.getContent();
378-
if (CollectionUtils.isEmpty(content)) {
379-
return page;
380-
}
381-
List<String> userEmails = content.stream().map(SonarAnalyseIssueAuthorVO::getAuthor).collect(Collectors.toList());
382-
List<IamUserDTO> iamUserDTOS = baseServiceClientOperator.listUsersByEmails(userEmails);
383-
if (!CollectionUtils.isEmpty(iamUserDTOS)) {
384-
Map<String, IamUserDTO> userMap = iamUserDTOS.stream().collect(Collectors.toMap(IamUserDTO::getEmail, Function.identity()));
385-
386-
for (SonarAnalyseIssueAuthorVO sonarAnalyseIssueAuthorVO : content) {
387-
IamUserDTO iamUserDTO = userMap.get(sonarAnalyseIssueAuthorVO.getAuthor());
388-
if (iamUserDTO != null) {
389-
sonarAnalyseIssueAuthorVO.setEmail(iamUserDTO.getEmail());
390-
sonarAnalyseIssueAuthorVO.setRealName(iamUserDTO.getRealName());
391-
sonarAnalyseIssueAuthorVO.setImageUrl(iamUserDTO.getImageUrl());
392-
}
393-
}
394-
}
395-
return page;
396-
}
397-
398368

399369
private boolean validSignature(String payload, HttpServletRequest request) {
400370
String receivedSignature = request.getHeader("X-Sonar-Webhook-HMAC-SHA256");

src/main/java/io/choerodon/devops/app/service/impl/SonarAnalyseUserIssueAuthorServiceImpl.java

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
package io.choerodon.devops.app.service.impl;
22

3+
import java.util.ArrayList;
34
import java.util.Collection;
45
import java.util.List;
6+
import java.util.Map;
7+
import java.util.function.Function;
8+
import java.util.stream.Collectors;
59

610
import org.springframework.beans.factory.annotation.Autowired;
711
import org.springframework.stereotype.Service;
812
import org.springframework.transaction.annotation.Transactional;
913
import org.springframework.util.CollectionUtils;
1014

15+
import io.choerodon.core.domain.Page;
16+
import io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorRankVO;
1117
import io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorVO;
1218
import io.choerodon.devops.app.service.SonarAnalyseUserIssueAuthorService;
1319
import io.choerodon.devops.infra.dto.SonarAnalyseIssueAuthorDTO;
20+
import io.choerodon.devops.infra.dto.iam.IamUserDTO;
21+
import io.choerodon.devops.infra.feign.operator.BaseServiceClientOperator;
1422
import io.choerodon.devops.infra.mapper.SonarAnalyseUserRecordMapper;
1523
import io.choerodon.devops.infra.util.MapperUtil;
24+
import io.choerodon.mybatis.pagehelper.PageHelper;
25+
import io.choerodon.mybatis.pagehelper.domain.PageRequest;
1626

1727
/**
1828
* 代码扫描记录表(SonarAnalyseUserRecord)应用服务
@@ -26,6 +36,8 @@ public class SonarAnalyseUserIssueAuthorServiceImpl implements SonarAnalyseUserI
2636
private static final String DEVOPS_SAVE_SONAR_ANALYSE_USER_RECORD_FAILED = "devops.save.sonar.analyse.user.record.failed";
2737
@Autowired
2838
private SonarAnalyseUserRecordMapper sonarAnalyseUserRecordMapper;
39+
@Autowired
40+
private BaseServiceClientOperator baseServiceClientOperator;
2941

3042
@Override
3143
@Transactional(rollbackFor = Exception.class)
@@ -45,5 +57,76 @@ public void batchSave(Long recordId, Collection<SonarAnalyseIssueAuthorDTO> sona
4557
public List<SonarAnalyseIssueAuthorVO> listMemberIssue(Long appServiceId) {
4658
return sonarAnalyseUserRecordMapper.listMemberIssue(appServiceId);
4759
}
60+
61+
@Override
62+
public List<SonarAnalyseIssueAuthorRankVO> listMemberBugRank(Long projectId, Long appServiceId) {
63+
List<SonarAnalyseIssueAuthorRankVO> sonarAnalyseIssueAuthorRankVOS = sonarAnalyseUserRecordMapper.listMemberBugRank(appServiceId);
64+
if (CollectionUtils.isEmpty(sonarAnalyseIssueAuthorRankVOS)) {
65+
return new ArrayList<>();
66+
}
67+
addUsername(sonarAnalyseIssueAuthorRankVOS);
68+
return sonarAnalyseIssueAuthorRankVOS;
69+
}
70+
71+
private void addUsername(List<SonarAnalyseIssueAuthorRankVO> sonarAnalyseIssueAuthorRankVOS) {
72+
List<String> userEmails = sonarAnalyseIssueAuthorRankVOS.stream().map(SonarAnalyseIssueAuthorRankVO::getAuthor).collect(Collectors.toList());
73+
List<IamUserDTO> iamUserDTOS = baseServiceClientOperator.listUsersByEmails(userEmails);
74+
if (!CollectionUtils.isEmpty(iamUserDTOS)) {
75+
Map<String, IamUserDTO> userMap = iamUserDTOS.stream().collect(Collectors.toMap(IamUserDTO::getEmail, Function.identity()));
76+
77+
for (SonarAnalyseIssueAuthorRankVO sonarAnalyseIssueAuthorRankVO : sonarAnalyseIssueAuthorRankVOS) {
78+
IamUserDTO iamUserDTO = userMap.get(sonarAnalyseIssueAuthorRankVO.getAuthor());
79+
if (iamUserDTO != null) {
80+
sonarAnalyseIssueAuthorRankVO.setUsername(iamUserDTO.getRealName());
81+
} else {
82+
sonarAnalyseIssueAuthorRankVO.setUsername(sonarAnalyseIssueAuthorRankVO.getAuthor());
83+
}
84+
}
85+
}
86+
}
87+
88+
@Override
89+
public Page<SonarAnalyseIssueAuthorVO> listMemberIssue(Long projectId, Long appServiceId, PageRequest pageRequest) {
90+
Page<SonarAnalyseIssueAuthorVO> page = PageHelper.doPageAndSort(pageRequest, () -> sonarAnalyseUserRecordMapper.listMemberIssue(appServiceId));
91+
List<SonarAnalyseIssueAuthorVO> content = page.getContent();
92+
if (CollectionUtils.isEmpty(content)) {
93+
return page;
94+
}
95+
List<String> userEmails = content.stream().map(SonarAnalyseIssueAuthorVO::getAuthor).collect(Collectors.toList());
96+
List<IamUserDTO> iamUserDTOS = baseServiceClientOperator.listUsersByEmails(userEmails);
97+
if (!CollectionUtils.isEmpty(iamUserDTOS)) {
98+
Map<String, IamUserDTO> userMap = iamUserDTOS.stream().collect(Collectors.toMap(IamUserDTO::getEmail, Function.identity()));
99+
100+
for (SonarAnalyseIssueAuthorVO sonarAnalyseIssueAuthorVO : content) {
101+
IamUserDTO iamUserDTO = userMap.get(sonarAnalyseIssueAuthorVO.getAuthor());
102+
if (iamUserDTO != null) {
103+
sonarAnalyseIssueAuthorVO.setEmail(iamUserDTO.getEmail());
104+
sonarAnalyseIssueAuthorVO.setRealName(iamUserDTO.getRealName());
105+
sonarAnalyseIssueAuthorVO.setImageUrl(iamUserDTO.getImageUrl());
106+
}
107+
}
108+
}
109+
return page;
110+
}
111+
112+
@Override
113+
public List<SonarAnalyseIssueAuthorRankVO> listMemberVulnRank(Long projectId, Long appServiceId) {
114+
List<SonarAnalyseIssueAuthorRankVO> sonarAnalyseIssueAuthorRankVOS = sonarAnalyseUserRecordMapper.listMemberVulnRank(appServiceId);
115+
if (CollectionUtils.isEmpty(sonarAnalyseIssueAuthorRankVOS)) {
116+
return new ArrayList<>();
117+
}
118+
addUsername(sonarAnalyseIssueAuthorRankVOS);
119+
return sonarAnalyseIssueAuthorRankVOS;
120+
}
121+
122+
@Override
123+
public List<SonarAnalyseIssueAuthorRankVO> listMemberCodeSmellRank(Long projectId, Long appServiceId) {
124+
List<SonarAnalyseIssueAuthorRankVO> sonarAnalyseIssueAuthorRankVOS = sonarAnalyseUserRecordMapper.listMemberCodeSmellRank(appServiceId);
125+
if (CollectionUtils.isEmpty(sonarAnalyseIssueAuthorRankVOS)) {
126+
return new ArrayList<>();
127+
}
128+
addUsername(sonarAnalyseIssueAuthorRankVOS);
129+
return sonarAnalyseIssueAuthorRankVOS;
130+
}
48131
}
49132

src/main/java/io/choerodon/devops/infra/mapper/SonarAnalyseUserRecordMapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import org.apache.ibatis.annotations.Param;
77

8+
import io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorRankVO;
89
import io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorVO;
910
import io.choerodon.devops.infra.dto.SonarAnalyseIssueAuthorDTO;
1011
import io.choerodon.mybatis.common.BaseMapper;
@@ -20,5 +21,11 @@ void batchSave(@Param("recordId") Long recordId,
2021
@Param("sonarAnalyseUserIssueAuthorDTOList") Collection<SonarAnalyseIssueAuthorDTO> sonarAnalyseIssueAuthorDTOList);
2122

2223
List<SonarAnalyseIssueAuthorVO> listMemberIssue(@Param("appServiceId") Long appServiceId);
24+
25+
List<SonarAnalyseIssueAuthorRankVO> listMemberBugRank(@Param("appServiceId") Long appServiceId);
26+
27+
List<SonarAnalyseIssueAuthorRankVO> listMemberVulnRank(@Param("appServiceId") Long appServiceId);
28+
29+
List<SonarAnalyseIssueAuthorRankVO> listMemberCodeSmellRank(@Param("appServiceId") Long appServiceId);
2330
}
2431

src/main/resources/mapper/SonarAnalyseUserRecordMapper.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,23 @@
1818
from devops_sonar_analyse_issue_author dsaia
1919
where dsaia.record_id = (select max(id) from devops_sonar_analyse_record where app_service_id = #{appServiceId})
2020
</select>
21+
<select id="listMemberBugRank" resultType="io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorRankVO">
22+
select dsaia.author, dsaia.bug as number
23+
from devops_sonar_analyse_issue_author dsaia
24+
where dsaia.record_id = (select max(id) from devops_sonar_analyse_record where app_service_id = #{appServiceId})
25+
order by dsaia.bug desc
26+
</select>
27+
<select id="listMemberVulnRank" resultType="io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorRankVO">
28+
select dsaia.author, dsaia.vulnerability as number
29+
from devops_sonar_analyse_issue_author dsaia
30+
where dsaia.record_id = (select max(id) from devops_sonar_analyse_record where app_service_id = #{appServiceId})
31+
order by dsaia.vulnerability desc
32+
</select>
33+
<select id="listMemberCodeSmellRank" resultType="io.choerodon.devops.api.vo.SonarAnalyseIssueAuthorRankVO">
34+
select dsaia.author, dsaia.code_smell as number
35+
from devops_sonar_analyse_issue_author dsaia
36+
where dsaia.record_id = (select max(id) from devops_sonar_analyse_record where app_service_id = #{appServiceId})
37+
order by dsaia.code_smell desc
38+
</select>
2139
</mapper>
2240

0 commit comments

Comments
 (0)