0611 ljc report模块修改

This commit is contained in:
HopeLi 2025-06-11 15:12:30 +08:00
parent a2fc4819ce
commit f1f96d08cd
6 changed files with 294 additions and 5 deletions

View File

@ -4,6 +4,7 @@ package cd.casic.ci.api;
import cd.casic.ci.process.dto.req.report.ReportAssetTaskReq;
import cd.casic.ci.process.dto.req.report.ReportDeleteReq;
import cd.casic.ci.process.dto.resp.report.ReportResp;
import cd.casic.ci.process.dto.resp.report.ReportTaskResp;
import cd.casic.ci.process.process.dataObject.base.BaseIdPageReq;
import cd.casic.ci.process.process.dataObject.base.BaseIdReq;
import cd.casic.ci.process.process.service.report.ReportService;
@ -14,10 +15,7 @@ import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
import org.jetbrains.annotations.NotNull;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
@ -71,4 +69,11 @@ public class ReportController {
return CommonResult.success(reportResp);
}
@GetMapping(path = "/findByScaTaskId")
public CommonResult<ReportTaskResp> findByScaTaskId(@RequestParam @NotNull String taskId) throws Exception {
ReportTaskResp taskResp = reportService.findByScaTaskId(taskId);
return CommonResult.success(taskResp);
}
}

View File

@ -0,0 +1,43 @@
package cd.casic.ci.process.dto.resp.report;
import lombok.Data;
/**
* @author HopeLi
* @version v1.0
* @ClassName ImageLayerInfo
* @Date: 2025/6/11 10:51
* @Description:
*/
@Data
public class ImageLayerInfo {
/**
* 是否为基础层
* 示例值: ""空字符串表示非基础层
*/
private String basicLayer;
/**
* 安装命令
* 示例值: "COPY . /home/ # buildkit"
*/
private String command;
/**
* 是否为指令安装
* 示例值: true
*/
private Boolean commandInstall;
/**
* 所属镜像层 ID
* 示例值: "1"
*/
private String layerId;
/**
* 层级序列号
* 示例值: 7
*/
private Integer layerIndex;
}

View File

@ -81,6 +81,5 @@ public class ReportResp {
private Integer fail;
private Integer success;
private Integer code;
}

View File

@ -0,0 +1,130 @@
package cd.casic.ci.process.dto.resp.report;
import lombok.Data;
import java.util.List;
/**
* @author HopeLi
* @version v1.0
* @ClassName ReportTaskResp
* @Date: 2025/6/11 10:47
* @Description:
*/
@Data
public class ReportTaskResp {
/** 应用id */
private Integer applicationId;
/** 已审计组件数 */
private Integer componentAuditNum;
/** 黑名单组件数 */
private Integer componentBlackNum;
/** 高风险组件数 */
private Integer componentHighNum;
/** 低风险组件数 */
private Integer componentLowNum;
/** 中风险组件数 */
private Integer componentMediumNum;
/** 无漏洞组件数 */
private Integer componentNormalNum;
/** 组件数 */
private Integer componentNum;
/** 恶意组件数 */
private Integer componentPoisonNum;
/** 严重组件数 */
private Integer componentSeriousNum;
/** 未审计组件数量 */
private Integer componentUnAuditNum;
/** 白名单组件数 */
private Integer componentWhiteNum;
/** 检测结束时间 */
private String detectEndTime;
/** 检测开始时间 */
private String detectStartTime;
/** 检测时长 */
private String detectTime;
/** 镜像分层信息 */
private List<ImageLayerInfo> imageLayerInfos;
/** 已审计许可证数量 */
private Integer licenseAuditNum;
/** 黑名单许可证数量 */
private Integer licenseBlackNum;
/** 高风险许可证数量 */
private Integer licenseHighNum;
/** 低风险许可证数量 */
private Integer licenseLowNum;
/** 中风险许可证数量 */
private Integer licenseMediumNum;
/** 许可证数 */
private Integer licenseNum;
/** 未审计许可证数量 */
private Integer licenseUnAuditNum;
/** 白名单许可证数量 */
private Integer licenseWhiteNum;
/** 项目id */
private Integer projectId;
/**
* 状态
* 0-未审计 1-未检测 2-排队中 3-检测中 4-检测暂停 5-检测完成 6-检测超时 7-手动停止 8-检测异常 9-已删除 10-拉取中 11-停止中 12-下载中
*/
private Integer status;
/** 任务id */
private Integer taskId;
/** 已审计漏洞数量 */
private Integer vulAuditNum;
/** 黑名单漏洞数量 */
private Integer vulBlackNum;
/** 高风险漏洞数量 */
private Integer vulHighNum;
/** 低风险漏洞数量 */
private Integer vulLowNum;
/** 中风险漏洞数量 */
private Integer vulMediumNum;
/** 漏洞数 */
private Integer vulNum;
/** 严重漏洞数量 */
private Integer vulSeriousNum;
/** 未审计漏洞数量 */
private Integer vulUnAuditNum;
/** 白名单漏洞数量 */
private Integer vulWhiteNum;
//xm-trace-id
private String xmTraceId;
}

View File

@ -3,6 +3,7 @@ package cd.casic.ci.process.process.service.report;
import cd.casic.ci.process.dto.req.report.ReportAssetTaskReq;
import cd.casic.ci.process.dto.req.report.ReportDeleteReq;
import cd.casic.ci.process.dto.resp.report.ReportResp;
import cd.casic.ci.process.dto.resp.report.ReportTaskResp;
import cd.casic.ci.process.process.dataObject.base.BaseIdPageReq;
import cd.casic.ci.process.process.dataObject.base.BaseIdReq;
import cd.casic.framework.commons.pojo.PageResult;
@ -28,4 +29,6 @@ public interface ReportService{
ResponseEntity<String> downLoadReport(@Valid BaseIdReq req) throws Exception;
ReportResp assetReportTask(@Valid ReportAssetTaskReq req) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException;
ReportTaskResp findByScaTaskId(String taskId) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException;
}

View File

@ -2,7 +2,9 @@ package cd.casic.ci.process.process.service.report.impl;
import cd.casic.ci.process.dto.req.report.ReportAssetTaskReq;
import cd.casic.ci.process.dto.req.report.ReportDeleteReq;
import cd.casic.ci.process.dto.resp.report.ImageLayerInfo;
import cd.casic.ci.process.dto.resp.report.ReportResp;
import cd.casic.ci.process.dto.resp.report.ReportTaskResp;
import cd.casic.ci.process.engine.context.ConstantContextHolder;
import cd.casic.ci.process.process.dataObject.base.BaseIdPageReq;
import cd.casic.ci.process.process.dataObject.base.BaseIdReq;
@ -18,6 +20,7 @@ import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
@ -161,6 +164,44 @@ public class ReportServiceImpl implements ReportService {
}
}
@Override
public ReportTaskResp findByScaTaskId(String taskId) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
RestTemplate restTemplate = getRestTemplateWithoutSANCheck();
String reportFindTaskUrl = ConstantContextHolder.getScaIp() + "/openapi/v1/task";
// 构建带有查询参数的 URL
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(reportFindTaskUrl).queryParam("taskId", taskId);
String urlWithParams = builder.toUriString();
HttpHeaders headers = createHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<String> requestEntity = new HttpEntity<>(headers);
log.info("根据taskId查询报告接口GET: " + urlWithParams);
ResponseEntity<JSONObject> jsonObjectResponseEntity = restTemplate.exchange(urlWithParams, HttpMethod.GET,requestEntity,JSONObject.class);
if (ObjectUtils.isEmpty(jsonObjectResponseEntity.getBody())){
throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"查询报告失败");
}
JSONObject response = jsonObjectResponseEntity.getBody();
String message = response.getString("message");
if ("success".equals(message)) {
ReportTaskResp taskResp = new ReportTaskResp();
log.info("===============根据taskId查询报告接口成功=================");
JSONObject data = response.getJSONObject("data");
setFindReportTaskResp(data, response.getString("xmTraceId"), taskResp);
return taskResp;
} else {
log.error("===============根据taskId查询报告接口失败=================");
throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(), "根据taskId查询报告失败");
}
}
private HttpHeaders createHeaders() {
HttpHeaders headers = new HttpHeaders();
@ -261,6 +302,74 @@ public class ReportServiceImpl implements ReportService {
}
private void setFindReportTaskResp(JSONObject data, String xmTraceId, ReportTaskResp taskResp) {
if (data == null) {
throw new IllegalArgumentException("data 不能为空");
}
taskResp.setApplicationId(data.getInteger("applicationId"));
taskResp.setComponentAuditNum(data.getInteger("componentAuditNum"));
taskResp.setComponentBlackNum(data.getInteger("componentBlackNum"));
taskResp.setComponentHighNum(data.getInteger("componentHighNum"));
taskResp.setComponentLowNum(data.getInteger("componentLowNum"));
taskResp.setComponentMediumNum(data.getInteger("componentMediumNum"));
taskResp.setComponentNormalNum(data.getInteger("componentNormalNum"));
taskResp.setComponentNum(data.getInteger("componentNum"));
taskResp.setComponentPoisonNum(data.getInteger("componentPoisonNum"));
taskResp.setComponentSeriousNum(data.getInteger("componentSeriousNum"));
taskResp.setComponentUnAuditNum(data.getInteger("componentUnAuditNum"));
taskResp.setComponentWhiteNum(data.getInteger("componentWhiteNum"));
taskResp.setDetectEndTime(data.getString("detectEndTime"));
taskResp.setDetectStartTime(data.getString("detectStartTime"));
taskResp.setDetectTime(data.getString("detectTime"));
// 镜像分层信息解析 JSONArray List<ImageLayerInfo>
JSONArray imageLayerArray = data.getJSONArray("imageLayerInfos");
List<ImageLayerInfo> imageLayerInfos = new ArrayList<>();
if (imageLayerArray != null && !imageLayerArray.isEmpty()) {
for (int i = 0; i < imageLayerArray.size(); i++) {
JSONObject layerObj = imageLayerArray.getJSONObject(i);
ImageLayerInfo layerInfo = new ImageLayerInfo();
layerInfo.setBasicLayer(layerObj.getString("basicLayer"));
layerInfo.setCommand(layerObj.getString("command"));
layerInfo.setCommandInstall(layerObj.getBoolean("commandInstall"));
layerInfo.setLayerId(layerObj.getString("layerId"));
layerInfo.setLayerIndex(layerObj.getInteger("layerIndex"));
imageLayerInfos.add(layerInfo);
}
}
taskResp.setImageLayerInfos(imageLayerInfos);
taskResp.setLicenseAuditNum(data.getInteger("licenseAuditNum"));
taskResp.setLicenseBlackNum(data.getInteger("licenseBlackNum"));
taskResp.setLicenseHighNum(data.getInteger("licenseHighNum"));
taskResp.setLicenseLowNum(data.getInteger("licenseLowNum"));
taskResp.setLicenseMediumNum(data.getInteger("licenseMediumNum"));
taskResp.setLicenseNum(data.getInteger("licenseNum"));
taskResp.setLicenseUnAuditNum(data.getInteger("licenseUnAuditNum"));
taskResp.setLicenseWhiteNum(data.getInteger("licenseWhiteNum"));
taskResp.setProjectId(data.getInteger("projectId"));
taskResp.setStatus(data.getInteger("status"));
taskResp.setTaskId(data.getInteger("taskId"));
taskResp.setVulAuditNum(data.getInteger("vulAuditNum"));
taskResp.setVulBlackNum(data.getInteger("vulBlackNum"));
taskResp.setVulHighNum(data.getInteger("vulHighNum"));
taskResp.setVulLowNum(data.getInteger("vulLowNum"));
taskResp.setVulMediumNum(data.getInteger("vulMediumNum"));
taskResp.setVulNum(data.getInteger("vulNum"));
taskResp.setVulSeriousNum(data.getInteger("vulSeriousNum"));
taskResp.setVulUnAuditNum(data.getInteger("vulUnAuditNum"));
taskResp.setVulWhiteNum(data.getInteger("vulWhiteNum"));
taskResp.setXmTraceId(xmTraceId);
}
public enum FileType {
// 文档类
XLSX("xlsx", "Excel", new byte[]{0x50, 0x4B, 0x03, 0x04}),