Merge remote-tracking branch 'origin/master'

This commit is contained in:
HopeLi 2025-07-08 18:01:13 +08:00
commit 8b24069dca
9 changed files with 123 additions and 6 deletions

View File

@ -1,26 +1,55 @@
package cd.casic.framework.commons.util.json.databind;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
/**
* 基于时间戳的 LocalDateTime 序列化器
*
* @author 老五
*/
public class TimestampLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
public class TimestampLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> implements ContextualSerializer {
public static final TimestampLocalDateTimeSerializer INSTANCE = new TimestampLocalDateTimeSerializer();
private DateTimeFormatter dateTimeFormatter = null;
public TimestampLocalDateTimeSerializer() {
}
public TimestampLocalDateTimeSerializer(DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
// LocalDateTime 对象转换为 Long 时间戳
gen.writeNumber(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
// // LocalDateTime 对象转换为 Long 时间戳
// gen.writeNumber(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
if (dateTimeFormatter != null) {
gen.writeString(value.format(dateTimeFormatter));
} else {
gen.writeNumber(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
}
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty property) throws JsonMappingException {
if (property != null) {
JsonFormat format = property.getAnnotation(JsonFormat.class);
if (format != null && !format.pattern().isEmpty()) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format.pattern());
return new TimestampLocalDateTimeSerializer(dateTimeFormatter);
}
}
return this;
}
}

View File

@ -21,7 +21,7 @@ public class ShuiMuController {
private ShuiMuService shuiMuService;
@GetMapping("/getToken")
public CommonResult<String> getToken(){
return CommonResult.success(shuiMuService.getToken());
return CommonResult.success(shuiMuService.getToken().replace("Bearer ",""));
}
/**
* 获取编译环境

View File

@ -1,7 +1,11 @@
package cd.casic.ci.process.dto.resp.shuimu;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class ShuiMuTestProblemResp {
private String id;
@ -14,6 +18,9 @@ public class ShuiMuTestProblemResp {
private String testid;
private String testGroupId;
private String createAt;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
private String description;
private String cwe;
private String testGroupIdAndproblemId;

View File

@ -44,4 +44,6 @@ public class TestCaseManagerResp {
private LocalDateTime updateTime;
private Integer fileCount;
private String fileSize;
}

View File

@ -25,6 +25,7 @@ import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.util.CollectionUtils;
import java.io.File;
@ -137,7 +138,7 @@ public class AFLWorker extends DockerWorker {
}
return null;
}
@Async
public void afterTaskExecute(TaskRunContext context){
append(context,"开始拉取afl输出信息");
PipTask contextDef = (PipTask)context.getContextDef();

View File

@ -33,6 +33,10 @@ import org.springframework.web.util.UriComponentsBuilder;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import static cd.casic.ci.process.constant.ShuiMuUrlConstant.*;
@ -295,7 +299,15 @@ public class ShuiMuServiceImpl implements ShuiMuService {
ResponseEntity<String> exchange = restTemplate.exchange(uriString, HttpMethod.GET, entity, String.class, new HashMap<>());
JSONObject jsonObject = JSON.parseObject(exchange.getBody());
String data = jsonObject.getString("data");
return JSONArray.parseArray(data, ShuiMuTestProblemResp.class);
List<ShuiMuTestProblemResp> shuiMuTestProblemResps = JSONArray.parseArray(data, ShuiMuTestProblemResp.class);
shuiMuTestProblemResps.forEach(item ->{
String createAt = item.getCreateAt();
LocalDateTime date = Instant.ofEpochMilli(Long.parseLong(createAt))
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
item.setCreateTime(date);
});
return shuiMuTestProblemResps;
}
@Override
public ShuiMuProjectReportResp getProjectReport(String projectId) {

View File

@ -33,4 +33,5 @@ public interface TestCaseInfoService extends IService<TestCaseInfo> {
TestCaseInfoResp findById(String id);
List<String> findFileTypeList();
List<TestCaseInfoResp> findByManagerIds(List<String> idList);
}

View File

@ -13,6 +13,7 @@ import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants;
import cd.casic.framework.commons.pojo.PageResult;
import cd.casic.framework.security.dal.user.AdminUserDO;
import cd.casic.framework.tenant.core.service.AdminUserServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -24,6 +25,7 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
@ -138,6 +140,17 @@ public class TestCaseInfoServiceImpl extends ServiceImpl<TestCaseInfoDao, TestCa
return fileTypeList;
}
@Override
public List<TestCaseInfoResp> findByManagerIds(List<String> idList) {
if (CollectionUtils.isEmpty(idList)) {
return Collections.emptyList();
}
LambdaQueryWrapper<TestCaseInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.in(TestCaseInfo::getTestCaseManagerId,idList);
List<TestCaseInfo> testCaseInfos = testCaseInfoDao.selectList(wrapper);
return TestCaseInfoConverter.INSTANCE.toRespList(testCaseInfos);
}
private void setUserName(TestCaseInfoResp testCaseInfoResp) {
if (!StringUtils.isEmpty(testCaseInfoResp.getCreator())){

View File

@ -3,12 +3,14 @@ package cd.casic.ci.process.process.service.testCase.impl;
import cd.casic.ci.process.dto.req.testCase.TestCaseManagerQueryReq;
import cd.casic.ci.process.dto.req.testCase.TestCaseManagerReq;
import cd.casic.ci.process.dto.resp.testCase.TestCaseInfoResp;
import cd.casic.ci.process.dto.resp.testCase.TestCaseManagerResp;
import cd.casic.ci.process.process.converter.TestCaseManagerConverter;
import cd.casic.ci.process.process.dao.testCase.TestCaseInfoDao;
import cd.casic.ci.process.process.dao.testCase.TestCaseManagerDao;
import cd.casic.ci.process.process.dataObject.testCase.TestCaseInfo;
import cd.casic.ci.process.process.dataObject.testCase.TestCaseManager;
import cd.casic.ci.process.process.service.testCase.TestCaseInfoService;
import cd.casic.ci.process.process.service.testCase.TestCaseManagerService;
import cd.casic.ci.process.properties.TargetFileUploadProperties;
import cd.casic.framework.commons.exception.ServiceException;
@ -16,6 +18,8 @@ import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants;
import cd.casic.framework.commons.pojo.PageResult;
import cd.casic.framework.security.dal.user.AdminUserDO;
import cd.casic.framework.tenant.core.service.AdminUserServiceImpl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -27,10 +31,13 @@ import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author HopeLi
@ -55,6 +62,9 @@ public class TestCaseManagerServiceImpl extends ServiceImpl<TestCaseManagerDao,
@Resource
private TargetFileUploadProperties fileUploadProperties;
@Resource
private TestCaseInfoService testCaseInfoService;
@Override
public String create(TestCaseManagerReq req) {
TestCaseManager testCaseManager = TestCaseManagerConverter.INSTANCE.toBean(req);
@ -118,9 +128,14 @@ public class TestCaseManagerServiceImpl extends ServiceImpl<TestCaseManagerDao,
}
List<TestCaseManagerResp> respList = TestCaseManagerConverter.INSTANCE.toRespList(testCaseManagerPage.getRecords());
respList.forEach(this::setUserName);
List<String> list = respList.stream().map(TestCaseManagerResp::getId).toList();
List<TestCaseInfoResp> testCaseInfos = testCaseInfoService.findByManagerIds(list);
Map<String, List<TestCaseInfoResp>> collect = testCaseInfos.stream().collect(Collectors.groupingBy(TestCaseInfoResp::getTestCaseManagerId));
fullManagerFileInfo(respList,collect);
return new PageResult<>(respList,testCaseManagerPage.getTotal(),testCaseManagerPage.getCurrent(),testCaseManagerPage.getSize());
}
@Override
public TestCaseManagerResp findById(String id) {
TestCaseManager testCaseManager = testCaseManagerDao.selectById(id);
@ -190,4 +205,41 @@ public class TestCaseManagerServiceImpl extends ServiceImpl<TestCaseManagerDao,
}
}
}
private void fullManagerFileInfo(List<TestCaseManagerResp> respList,Map<String,List<TestCaseInfoResp>> caseInfoMap){
if (CollectionUtils.isEmpty(respList)||CollectionUtils.isEmpty(caseInfoMap)) {
return;
}
for (TestCaseManagerResp managerInfo : respList) {
List<TestCaseInfoResp> testCaseInfos = caseInfoMap.get(managerInfo.getId());
if (CollectionUtils.isEmpty(testCaseInfos)) {
continue;
}
Integer size = 0;
Integer fileCount = testCaseInfos.size();
for (TestCaseInfoResp testCaseInfo : testCaseInfos) {
JSONArray array= JSONArray.parseArray(testCaseInfo.getTestFileList());
if (!array.isEmpty()) {
JSONObject jsonObject = array.getJSONObject(0);
Integer fileSize = jsonObject.getInteger("size");
size+=fileSize;
}
}
managerInfo.setFileCount(fileCount);
managerInfo.setFileSize(getSizeStr(size));
}
}
private String getSizeStr(Integer size){
Integer devid=1;
int level = 0; // 0 -byte 1-kb 2-mb 3-gb
while (size/devid>=1024){
devid*=1024;
};
return switch (level) {
case 0 -> size / devid + "byte";
case 1 -> size / devid + "kb";
case 2 -> size / devid + "mb";
case 3 -> size / devid + "gb";
default -> size + "";
};
}
}