diff --git a/framework/commons/src/main/java/cd/casic/framework/commons/util/json/databind/TimestampLocalDateTimeSerializer.java b/framework/commons/src/main/java/cd/casic/framework/commons/util/json/databind/TimestampLocalDateTimeSerializer.java index 394fc66a..dfd7b99a 100644 --- a/framework/commons/src/main/java/cd/casic/framework/commons/util/json/databind/TimestampLocalDateTimeSerializer.java +++ b/framework/commons/src/main/java/cd/casic/framework/commons/util/json/databind/TimestampLocalDateTimeSerializer.java @@ -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 { +public class TimestampLocalDateTimeSerializer extends JsonSerializer 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; + } } diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/ShuiMuController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/ShuiMuController.java index 20b7b396..adc9893f 100644 --- a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/ShuiMuController.java +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/ShuiMuController.java @@ -21,7 +21,7 @@ public class ShuiMuController { private ShuiMuService shuiMuService; @GetMapping("/getToken") public CommonResult getToken(){ - return CommonResult.success(shuiMuService.getToken()); + return CommonResult.success(shuiMuService.getToken().replace("Bearer ","")); } /** * 获取编译环境 diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/shuimu/ShuiMuTestProblemResp.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/shuimu/ShuiMuTestProblemResp.java index f925912b..5bc881d4 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/shuimu/ShuiMuTestProblemResp.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/shuimu/ShuiMuTestProblemResp.java @@ -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; diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/testCase/TestCaseManagerResp.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/testCase/TestCaseManagerResp.java index 1b9e5bdd..0f47c142 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/testCase/TestCaseManagerResp.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/testCase/TestCaseManagerResp.java @@ -44,4 +44,6 @@ public class TestCaseManagerResp { private LocalDateTime updateTime; + private Integer fileCount; + private String fileSize; } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLWorker.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLWorker.java index b847f502..cc1dcaa3 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLWorker.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/engine/worker/afl/AFLWorker.java @@ -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(); diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/impl/ShuiMuServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/impl/ShuiMuServiceImpl.java index 75456b7f..e1645417 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/impl/ShuiMuServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/shuimu/impl/ShuiMuServiceImpl.java @@ -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 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 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) { diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/TestCaseInfoService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/TestCaseInfoService.java index 76c3d244..5a017ff8 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/TestCaseInfoService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/TestCaseInfoService.java @@ -33,4 +33,5 @@ public interface TestCaseInfoService extends IService { TestCaseInfoResp findById(String id); List findFileTypeList(); + List findByManagerIds(List idList); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseInfoServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseInfoServiceImpl.java index aef2ca96..0634edcd 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseInfoServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseInfoServiceImpl.java @@ -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 findByManagerIds(List idList) { + if (CollectionUtils.isEmpty(idList)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(TestCaseInfo::getTestCaseManagerId,idList); + List testCaseInfos = testCaseInfoDao.selectList(wrapper); + return TestCaseInfoConverter.INSTANCE.toRespList(testCaseInfos); + } + private void setUserName(TestCaseInfoResp testCaseInfoResp) { if (!StringUtils.isEmpty(testCaseInfoResp.getCreator())){ diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseManagerServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseManagerServiceImpl.java index e658cc29..32c94c9e 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseManagerServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/testCase/impl/TestCaseManagerServiceImpl.java @@ -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 respList = TestCaseManagerConverter.INSTANCE.toRespList(testCaseManagerPage.getRecords()); respList.forEach(this::setUserName); + List list = respList.stream().map(TestCaseManagerResp::getId).toList(); + List testCaseInfos = testCaseInfoService.findByManagerIds(list); + Map> 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 respList,Map> caseInfoMap){ + if (CollectionUtils.isEmpty(respList)||CollectionUtils.isEmpty(caseInfoMap)) { + return; + } + for (TestCaseManagerResp managerInfo : respList) { + List 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 + ""; + }; + } }