Commit 74622346 authored by 盖献康's avatar 盖献康

Merge branch 'dev' into 'master'

Dev - master 3.0

See merge request !236
parents ac5a8d55 11766c2f
......@@ -7,6 +7,7 @@ import com.ruoyi.mapper.TaskMapper;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class DataStatisticsUtils {
......@@ -31,7 +32,7 @@ public class DataStatisticsUtils {
isPass = false;
}
if(passed == ReviewStandard.NO_PASSED) {
if(Objects.equals(passed, ReviewStandard.NO_PASSED)) {
isPass = false;
}
......@@ -62,7 +63,7 @@ public class DataStatisticsUtils {
isPass = false;
}
if(passed == ReviewStandard.NO_PASSED) {
if(Objects.equals(passed, ReviewStandard.NO_PASSED)) {
isPass = true;
}
......@@ -106,7 +107,7 @@ public class DataStatisticsUtils {
continue;
}
if(detailsIsPass(reviewDetails, resultMap) == ReviewStandard.PASSED) {
if(Objects.equals(detailsIsPass(reviewDetails, resultMap), ReviewStandard.PASSED)) {
detailsPass = detailsPass + 1;
}
}
......@@ -124,7 +125,7 @@ public class DataStatisticsUtils {
List<ReviewDetails> details = getDetailsByStandard(standard);
for(ReviewDetails reviewDetails : details) {
if(detailsIsPass(reviewDetails, resultMap) == ReviewStandard.NO_PASSED) {
if(Objects.equals(detailsIsPass(reviewDetails, resultMap), ReviewStandard.NO_PASSED)) {
detailsNoPass = detailsNoPass + 1;
}
}
......
package com.ruoyi.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@ApiModel
@TableName(value ="t_task_file_relation")
@Data
@Accessors(chain = true)
public class TaskFileRelation {
@ApiModelProperty("任务id")
@TableId(type = IdType.ASSIGN_ID)
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long taskId;
@ApiModelProperty("路径")
private String url;
@ApiModelProperty("文件名称")
private String name;
}
......@@ -21,7 +21,11 @@ public class TestRecords {
private Long id;
@ApiModelProperty("关联项目id")
private String taskId;
private String projectId;
@ApiModelProperty("关联任务id")
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long taskId;
@ApiModelProperty("用例名称")
private String usecase;
......@@ -44,9 +48,9 @@ public class TestRecords {
@ApiModelProperty("测试结果")
private String testResult;
@ApiModelProperty("测试结果描述")
private String testResultDescription;
@ApiModelProperty("修复建议")
private String remediation;
@ApiModelProperty("漏洞危害")
private String loophole;
@ApiModelProperty("测试详情")
private String testDetails;
}
......@@ -7,7 +7,10 @@ import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 测试用例
......@@ -15,6 +18,9 @@ import lombok.Data;
*/
@TableName(value ="t_test_usecase")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TestUseCase implements Serializable {
/**
* 主键
......@@ -90,6 +96,9 @@ public class TestUseCase implements Serializable {
@ApiModelProperty("用例ID")
private String caseId;
@ApiModelProperty("标准条款ID")
private Long reviewStandardId;
/**
* 返回用例在矩阵中的坐标
* @return
......
......@@ -160,4 +160,9 @@ public class InspectionReportPdfVO {
*/
private String sampleNumberSummary;
/**
* 品牌图片
*/
private String brandImage;
}
package com.ruoyi.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 可显示用例
* @author gxk
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OptionalUseCasesVO {
@ApiModelProperty("禁用")
private Boolean disabled;
@ApiModelProperty("值")
private Long key;
@ApiModelProperty("键")
private String label;
@ApiModelProperty("标准ID")
private Long standardId;
}
package com.ruoyi.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "首页数量统计")
public class QuantityStatisticsVO {
@ApiModelProperty("支持标准数量")
private Long standardQuantity;
@ApiModelProperty("测试用例数量")
private Long numberUseCases;
@ApiModelProperty("任务数量")
private Long numberTasks;
@ApiModelProperty("检验报告数量")
private Long numberReports;
@ApiModelProperty("检验员数量")
private Long numberInspectors;
@ApiModelProperty("车企数量")
private Long numberCompanies;
@ApiModelProperty("整车样品数量")
private Long numberVehicleSamples;
@ApiModelProperty("零部件样品数量")
private Long numberComponentSamples;
@ApiModelProperty("测试方法数量")
private Long numberMethods;
@ApiModelProperty("场景数量")
private Long numberScenes;
@ApiModelProperty("已完成任务数量")
private Integer completedTaskNumber;
@ApiModelProperty("执行中任务数量")
private Integer executeTasksNumber;
@ApiModelProperty("已完成任务占比")
private Integer completedTaskProportion;
@ApiModelProperty("执行中任务任务占比")
private Integer executeTaskProportion;
}
package com.ruoyi.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "首页标准类别统计")
public class StandardCategoryStatisticsVO {
@ApiModelProperty("类别数量")
private Long value;
@ApiModelProperty("类别名称")
private String name;
}
......@@ -2,12 +2,26 @@ package com.ruoyi.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.domain.ModelTestTask;
import com.ruoyi.web.response.ResultCountResponse;
import com.ruoyi.web.response.TaskFindResponse;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 车型试验Mapper层
* @author gxk
*/
@Repository
public interface ModelTestTaskMapper extends BaseMapper<ModelTestTask> {
// 查询pending状态下的所有任务
List<ModelTestTask> findByStatus();
// 根据总任务列表查询子任务
List<ModelTestTask> findByTaskList(@Param("responses") List<TaskFindResponse> responses);
// 根据子任务列表查询进度
List<ResultCountResponse> testAnswerCount(@Param("responses")List<TaskFindResponse> responses);
}
package com.ruoyi.mapper;
import com.ruoyi.domain.vo.QuantityStatisticsVO;
import com.ruoyi.domain.vo.StandardCategoryStatisticsVO;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface StatisticsHomeMapper {
// 数量统计
public QuantityStatisticsVO selectQuantityStatistics(QuantityStatisticsVO quantityStatisticsHome);
// 标准类别统计
public List<StandardCategoryStatisticsVO> selectStandardCategoryStatistics();
}
package com.ruoyi.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.domain.TaskFileRelation;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface TaskFileRelationMapper extends BaseMapper<TaskFileRelation> {
List<TaskFileRelation> findByTaskId(@Param("taskId") Long taskId);
}
......@@ -37,6 +37,8 @@ public interface TaskMapper extends BaseMapper<Task> {
Long findTaskName(@Param("taskName") String taskName);
Task findByName(@Param("taskName") String taskName);
/**
* 通过总任务ID,获取企业文件数据
* @param taskId
......
......@@ -2,8 +2,13 @@ package com.ruoyi.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.domain.TestRecords;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface TestRecordsMapper extends BaseMapper<TestRecords> {
List<TestRecords> findByTaskId(@Param("id") String id);
}
......@@ -2,6 +2,7 @@ package com.ruoyi.mapper;
import com.ruoyi.domain.TestUseCase;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.domain.vo.OptionalUseCasesVO;
import com.ruoyi.domain.vo.TestUsecaseVO;
import com.ruoyi.web.request.TestUserCaseRequest;
import org.springframework.stereotype.Repository;
......@@ -31,6 +32,13 @@ public interface TestUseCaseMapper extends BaseMapper<TestUseCase> {
* @return
*/
List<TestUsecaseVO> selectListByTaskId(Long id);
/**
* 查询测试用例列表
* @return
*/
List<OptionalUseCasesVO> selectOptionalUsecase();
}
......
package com.ruoyi.scheduledTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleAtFixedRate(new ScheduledTask(),0,5, TimeUnit.SECONDS);
}
}
package com.ruoyi.scheduledTask;
import com.ruoyi.domain.ModelTestTask;
import com.ruoyi.mapper.ModelTestTaskMapper;
import com.ruoyi.service.TestRecordsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component;
import org.springframework.scheduling.annotation.Scheduled;
import java.util.*;
@Component
@EnableAsync
public class ScheduledTask implements Runnable{
@Autowired
private TestRecordsService testRecordsService;
@Autowired
private ModelTestTaskMapper modelTestTaskMapper;
@Scheduled(fixedDelay = 5000)
@Override
public void run() {
List<ModelTestTask> modelList = modelTestTaskMapper.findByStatus();
for (ModelTestTask testTask : modelList) {
if (testTask.getTestSchemeId() != null) {
testRecordsService.sendPost(testTask.getTestSchemeId(),testTask.getId());
}
}
}
}
package com.ruoyi.scheduledTask;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.scheduling.annotation.SchedulingConfiguration;
@Configuration
@ConditionalOnExpression(value = "${task.scheduling}")
@Import(SchedulingConfiguration.class)
public class TaskEnableSchedulingConfig {
}
......@@ -5,10 +5,8 @@ import com.ruoyi.domain.ReviewStandard;
import com.ruoyi.web.request.ReviewFindListRequest;
import com.ruoyi.web.request.ReviewStandardListByPageRequest;
import com.ruoyi.web.request.ReviewStandardListRequest;
import com.ruoyi.web.response.ReviewStandardInspectionContentResponse;
import com.ruoyi.web.response.ReviewStandardListResponse;
import com.ruoyi.web.response.ReviewStandardResponse;
import com.ruoyi.web.response.ReviewStandardTestInspectionContentResponse;
import com.ruoyi.web.request.ReviewStandardSaveStandardUsecaseRequest;
import com.ruoyi.web.response.*;
import java.util.List;
......@@ -59,4 +57,17 @@ public interface ReviewStandardService extends IService<ReviewStandard> {
// 标准-要点-细则
List<ReviewStandard> findDetailsList(ReviewFindListRequest request);
/**
* 选择标准-测试用例
* @param standardId
* @return
*/
ReviewStandardStandardUsecaseResponse selectStandardUsecase(Long standardId);
/**
* 保存 标准-检验内容-用例
* @param request
*/
void saveStandardUsecase(ReviewStandardSaveStandardUsecaseRequest request);
}
package com.ruoyi.service;
import com.ruoyi.domain.vo.QuantityStatisticsVO;
import com.ruoyi.domain.vo.StandardCategoryStatisticsVO;
import java.util.List;
public interface StatisticsHomeService {
// 数量统计
public QuantityStatisticsVO selectQuantityStatistics(QuantityStatisticsVO quantityStatisticsHome);
// 标准类别统计
public List<StandardCategoryStatisticsVO> selectStandardCategoryStatistics();
}
package com.ruoyi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.domain.TaskFileRelation;
import java.util.List;
public interface TaskFileRelationService extends IService<TaskFileRelation> {
List<TaskFileRelation> findByTaskId(Long taskId);
}
......@@ -3,5 +3,27 @@ package com.ruoyi.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.domain.TestRecords;
import java.util.List;
public interface TestRecordsService extends IService<TestRecords> {
/**
* 根据项目id获取用例
* @param id
* @return
*/
List<TestRecords> findByTaskId(String id);
/**
* 发送请求
* @param id
*/
void sendPost(String id,Long taskId);
/**
* 单个任务发送请求
* @param id
* @param taskId
*/
void singleSendPost(String id,Long taskId);
}
package com.ruoyi.service.impl;
import cn.hutool.core.util.StrUtil;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.ruoyi.common.core.domain.entity.SysDictData;
......@@ -70,26 +71,24 @@ public class PdfTemplateManagementServiceImpl implements PdfTemplateManagementSe
ByteArrayOutputStream bos = null;
try {
// 模板绝对路径--服务器
String fileName = "/template/receipt_template_02_27.pdf";
String fileName = "/template/receipt_template_03_27.pdf";
// 读取现有模板内容
reader = new PdfReader(fileName);
// 创建输出流
bos = new ByteArrayOutputStream();
// 实例化PdfStamper准备编辑pdf内容
ps = new PdfStamper(reader, bos);
// 获取表单所有元素
AcroFields fields = ps.getAcroFields();
// 设置具体字体格式的编码, 不设置的话中文可能不会显示
BaseFont bf = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
fields.addSubstitutionFont(bf);
// 测试数据
InspectionReportPdfVO inspectionReportPdfVO = requireData(taskId);
// 渲染数据
renderData(fields, inspectionReportPdfVO);
renderData(fields, inspectionReportPdfVO, ps);
//必须要调用这个,否则文档不会生成的
ps.setFormFlattening(true);
......@@ -106,7 +105,12 @@ public class PdfTemplateManagementServiceImpl implements PdfTemplateManagementSe
}
}
assert bos != null;
return uploadMinio(bos, "检验报告_" + taskId);
// 名字
return uploadMinio(bos, "整车信息安全检验报告-" + getReportName());
}
private String getReportName() {
return DateUtils.parseDateToStr("yyyyMMddHHmm", new Date());
}
/**
......@@ -172,7 +176,7 @@ public class PdfTemplateManagementServiceImpl implements PdfTemplateManagementSe
document.close();
// 上传到Minio
return uploadMinio(outputStream, "企业留档文件_" + taskId);
return uploadMinio(outputStream, "企业留档文件-" + getReportName());
}
/**
......@@ -252,8 +256,9 @@ public class PdfTemplateManagementServiceImpl implements PdfTemplateManagementSe
* 渲染数据
* @param fields
*/
private void renderData(AcroFields fields, InspectionReportPdfVO inspectionReportPdfVO) throws Exception {
private void renderData(AcroFields fields, InspectionReportPdfVO inspectionReportPdfVO, PdfStamper ps) throws Exception {
// 取出当前对象所有属性,并赋值到模板里
// 文本域
Class<? extends InspectionReportPdfVO> aClass = inspectionReportPdfVO.getClass();
Field[] declaredFields = aClass.getDeclaredFields();
for (Field field : declaredFields) {
......@@ -266,6 +271,15 @@ public class PdfTemplateManagementServiceImpl implements PdfTemplateManagementSe
fields.setField(key, value);
}
}
// 图片域
// 样品
String url = inspectionReportPdfVO.getBrandImage();
if (StrUtil.isNotBlank(url)) {
if (url.startsWith(",")) {
url = inspectionReportPdfVO.getBrandImage().substring(1);
}
addImageToPdf("brand", fields, ps, "http://49.232.167.247:22038" + url.split(",")[0]);
}
}
......@@ -314,7 +328,7 @@ public class PdfTemplateManagementServiceImpl implements PdfTemplateManagementSe
// 获取操作的页面
PdfContentByte under = stamper.getOverContent(pageNo);
// 根据域的大小缩放图片
image.scaleToFit(signRect.getWidth() * 2, signRect.getHeight());
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 添加图片并设置位置(个人通过此设置使得图片垂直水平居中,可参考,具体情况已实际为准)
image.setAbsolutePosition(x, y);
under.addImage(image);
......
......@@ -24,6 +24,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* @author wangfei
......@@ -83,6 +84,18 @@ public class ReviewEnterpriseArchiveServiceImpl extends ServiceImpl<ReviewEnterp
throw new ServiceException("新增文件名称重复,请检查", HttpStatus.ERROR);
} else {
reviewEnterpriseArchiveService.save(reviewEnterpriseArchive);
ReviewEnterpriseArchiveFindByTaskIdRequest request = new ReviewEnterpriseArchiveFindByTaskIdRequest();
request.setTaskId(reviewEnterpriseArchive.getTaskId());
List<ReviewEnterpriseArchive> list = reviewEnterpriseArchiveMapper.findEnterpriseArchiveByTaskId(request);
if (list != null && list.size() != 0) {
for (ReviewEnterpriseArchive archive : list) {
if (!Objects.equals(archive.getEnterpriseName(), reviewEnterpriseArchive.getEnterpriseName())) {
archive.setEnterpriseName(reviewEnterpriseArchive.getEnterpriseName());
}
}
reviewEnterpriseArchiveService.updateBatchById(list);
}
}
return reviewEnterpriseArchive.getId();
......
package com.ruoyi.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.SnowflakeUtil;
import com.ruoyi.domain.*;
import com.ruoyi.mapper.ReviewDetailsMapper;
import com.ruoyi.mapper.ReviewKeyPointMapper;
import com.ruoyi.mapper.ReviewStandardMapper;
import com.ruoyi.domain.vo.OptionalUseCasesVO;
import com.ruoyi.mapper.*;
import com.ruoyi.service.*;
import com.ruoyi.web.request.ReviewFindListRequest;
import com.ruoyi.web.request.ReviewStandardListByPageRequest;
import com.ruoyi.web.request.ReviewStandardListRequest;
import com.ruoyi.web.response.ReviewStandardInspectionContentResponse;
import com.ruoyi.web.response.ReviewStandardListResponse;
import com.ruoyi.web.response.ReviewStandardResponse;
import com.ruoyi.web.response.ReviewStandardTestInspectionContentResponse;
import com.ruoyi.web.request.ReviewStandardSaveStandardUsecaseRequest;
import com.ruoyi.web.response.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -21,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Transactional
@Service
......@@ -44,6 +44,9 @@ public class ReviewStandardServiceImpl extends ServiceImpl<ReviewStandardMapper,
@Autowired
private ReviewDetailsMapper reviewDetailsMapper;
@Autowired
private TestUseCaseMapper testUseCaseMapper;
/**
* 查询所有审查 标准、要点、细则、场景 并组织成树状结构返回
* @param standardId 关联到标准库中的id
......@@ -140,6 +143,37 @@ public class ReviewStandardServiceImpl extends ServiceImpl<ReviewStandardMapper,
return buildStandard(standardList,keyPointListTree);
}
/**
* 选择 标准-用例
* @param standardId
* @return
*/
@Override
public ReviewStandardStandardUsecaseResponse selectStandardUsecase(Long standardId) {
ReviewStandardStandardUsecaseResponse response = new ReviewStandardStandardUsecaseResponse();
// 查询当前所有的测试用例
List<OptionalUseCasesVO> testUseCases = testUseCaseMapper.selectOptionalUsecase();
// 查看此标准下所有的测试用例
List<TestUseCase> usecaseRelationList = testUseCaseMapper.selectList(new QueryWrapper<TestUseCase>().eq("review_standard_id", standardId));
// 此标准还可以选择的用例
List<OptionalUseCasesVO> optionalUseCasesVOList = testUseCases.stream().filter(a -> !a.getStandardId().equals(standardId)).collect(Collectors.toList());
optionalUseCasesVOList.stream().forEach(obj -> obj.setDisabled(false));
response.setOptionalUseCasesList(optionalUseCasesVOList);
response.setSelectedUseCaseList(usecaseRelationList.stream().map(TestUseCase::getId).collect(Collectors.toList()));
return response;
}
/**
* 保存 标准-用例
* @param request
*/
@Override
public void saveStandardUsecase(ReviewStandardSaveStandardUsecaseRequest request) {
testUseCaseMapper.update(
TestUseCase.builder().reviewStandardId(request.getStandardId()).build(),
new UpdateWrapper<TestUseCase>().in("id", request.getUsecaseIdList()));
}
/**
* 将审查 标准、要点、细则、场景 按照父子关系拆分写入到各自的表中
* @param reviewStandardList
......
package com.ruoyi.service.impl;
import com.ruoyi.domain.vo.QuantityStatisticsVO;
import com.ruoyi.domain.vo.StandardCategoryStatisticsVO;
import com.ruoyi.mapper.StatisticsHomeMapper;
import com.ruoyi.service.StatisticsHomeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public class StatisticsHomeServiceImpl implements StatisticsHomeService {
@Autowired
private StatisticsHomeMapper statisticsHomeMapper;
@Override
public QuantityStatisticsVO selectQuantityStatistics(QuantityStatisticsVO quantityStatisticsHome){
QuantityStatisticsVO quantityStatisticsVO = statisticsHomeMapper.selectQuantityStatistics(quantityStatisticsHome);
quantityStatisticsVO.setExecuteTaskProportion(percentageCalculation(quantityStatisticsVO.getExecuteTasksNumber(),quantityStatisticsVO.getCompletedTaskNumber()));
quantityStatisticsVO.setCompletedTaskProportion(percentageCalculation(quantityStatisticsVO.getCompletedTaskNumber(),quantityStatisticsVO.getExecuteTasksNumber()));
return quantityStatisticsVO;
}
@Override
public List<StandardCategoryStatisticsVO> selectStandardCategoryStatistics(){
return statisticsHomeMapper.selectStandardCategoryStatistics();
}
// 计算百分比
public int percentageCalculation(Integer a, Integer b){
int total = a+b;
if(total == 0){
return 0;
}else {
float c = (float)a/total;
return Math.round(c*100);
}
}
}
......@@ -28,9 +28,13 @@ public class StrategyModelTestTaskPending implements StrategyModelTestTask, Init
@Autowired
private ModelTestTaskMapper modelTestTaskMapper;
@Autowired
private StrategyModelTestTaskNew strategyModelTestTaskNew;
@Override
public List<ModelTestTaskViewResponse> doView(ModelTestTask modelTestTask) {
throw new ServiceException("能查看一个进行中的任务", HttpStatus.ERROR);
List<ModelTestTaskViewResponse> list = strategyModelTestTaskNew.getTestScheme(modelTestTask.getId());
return list;
}
@Override
......
package com.ruoyi.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.domain.ResultFileRelation;
import com.ruoyi.domain.TaskFileRelation;
import com.ruoyi.mapper.ResultFileRelationMapper;
import com.ruoyi.mapper.TaskFileRelationMapper;
import com.ruoyi.service.ResultFileRelationService;
import com.ruoyi.service.TaskFileRelationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Transactional
@Service
public class TaskFileRelationServiceImpl extends ServiceImpl<TaskFileRelationMapper, TaskFileRelation> implements TaskFileRelationService {
@Autowired
private TaskFileRelationMapper taskFileRelationMapper;
@Override
public List<TaskFileRelation> findByTaskId(Long taskId) {
return taskFileRelationMapper.findByTaskId(taskId);
}
}
......@@ -8,10 +8,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.domain.ReviewStandard;
import com.ruoyi.service.ReviewStandardService;
import com.ruoyi.web.request.*;
import com.ruoyi.web.response.ReviewStandardInspectionContentResponse;
import com.ruoyi.web.response.ReviewStandardListResponse;
import com.ruoyi.web.response.ReviewStandardResponse;
import com.ruoyi.web.response.ReviewStandardTestInspectionContentResponse;
import com.ruoyi.web.response.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.skywalking.apm.toolkit.trace.Tag;
......@@ -72,6 +69,32 @@ public class ReviewStandardController extends BaseController {
return R.ok(response);
}
/**
* 查询 标准-检验内容-用例
* @param request
* @return
*/
@Anonymous
@ApiOperation("查询 标准-检验内容-用例")
@PostMapping("/test/getStandardUsecase")
public R<ReviewStandardStandardUsecaseResponse> getStandardUsecase(@Validated @RequestBody ReviewStandardStandardUsecaseRequest request) {
ReviewStandardStandardUsecaseResponse response = reviewStandardService.selectStandardUsecase(request.getStandardId());
return R.ok(response);
}
/**
* 保存 标准-检验内容-用例
* @param request
* @return
*/
@Anonymous
@ApiOperation("保存 标准-检验内容-用例")
@PostMapping("/test/saveStandardUsecase")
public R<Boolean> saveStandardUsecase(@Validated @RequestBody ReviewStandardSaveStandardUsecaseRequest request) {
reviewStandardService.saveStandardUsecase(request);
return R.ok(true);
}
@ApiOperation("查询标注要求列表")
@Trace
@Tags({@Tag(key = "param", value = "arg[0]"), @Tag(key = "result", value = "returnedObj")})
......
package com.ruoyi.web;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.domain.vo.QuantityStatisticsVO;
import com.ruoyi.domain.vo.StandardCategoryStatisticsVO;
import com.ruoyi.service.StatisticsHomeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
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 java.util.List;
@Api(tags = {"首页统计"})
@RestController
@RequestMapping("/home/statistics")
public class StatisticsHomeController {
@Autowired
private StatisticsHomeService statisticsHomeService;
@ApiOperation("首页数量统计")
@PostMapping("/quantityStatistics")
public R<QuantityStatisticsVO> selectQuantityStatistics(@Validated @RequestBody QuantityStatisticsVO quantityStatisticsHome){
return R.ok(statisticsHomeService.selectQuantityStatistics(quantityStatisticsHome));
}
@ApiOperation("首页标准分类占比")
@PostMapping("/standardCategory")
public R<List<StandardCategoryStatisticsVO>> selectStandardCategoryStatistics(){
return R.ok(statisticsHomeService.selectStandardCategoryStatistics());
}
}
package com.ruoyi.web.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 保存标准用例请求DTO
* @author gxk
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("保存标准用例请求DTO")
public class ReviewStandardSaveStandardUsecaseRequest {
@ApiModelProperty("标准ID")
@NotNull(message = "标准ID不能为空")
private Long standardId;
@ApiModelProperty("用例ID集合")
private List<Long> usecaseIdList;
}
package com.ruoyi.web.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 标准-用例 请求
* @author gxk
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("标准-用例 请求")
public class ReviewStandardStandardUsecaseRequest {
@ApiModelProperty("标准ID")
private Long standardId;
}
......@@ -2,6 +2,7 @@ package com.ruoyi.web.request;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.domain.TaskFileRelation;
import com.ruoyi.domain.TaskSampleRelation;
import com.ruoyi.domain.TaskUserRelation;
import io.swagger.annotations.Api;
......@@ -65,4 +66,7 @@ public class TaskCreateRequest {
@ApiModelProperty("选择的测试场景")
private List<Long> testScenarioList;
@ApiModelProperty("上传的文件")
private List<TaskFileRelation> fileList;
}
......@@ -3,6 +3,7 @@ package com.ruoyi.web.request;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.domain.TaskFileRelation;
import com.ruoyi.domain.TaskSampleRelation;
import com.ruoyi.domain.TaskUserRelation;
import io.swagger.annotations.ApiModel;
......@@ -69,4 +70,7 @@ public class TaskEditRequest {
@ApiModelProperty("选择的测试场景")
private List<Long> testScenarioList;
@ApiModelProperty("上传的文件")
private List<TaskFileRelation> fileList;
}
package com.ruoyi.web.response;
import com.ruoyi.domain.vo.OptionalUseCasesVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 标准-用例 返回 DTO
* @author gxk
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("标准-用例 返回 DTO")
public class ReviewStandardStandardUsecaseResponse {
@ApiModelProperty("可选择用例")
private List<OptionalUseCasesVO> optionalUseCasesList;
@ApiModelProperty("已选择用例")
private List<Long> selectedUseCaseList;
}
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.domain.Sample;
import com.ruoyi.domain.TaskFileRelation;
import com.ruoyi.domain.TaskSampleRelation;
import com.ruoyi.domain.TaskUserRelation;
import io.swagger.annotations.ApiModel;
......@@ -130,4 +131,7 @@ public class TaskGetInfoResponse {
@ApiModelProperty("测试场景")
private List<Long> testScenarioList;
@ApiModelProperty("上传的文件")
private List<TaskFileRelation> fileList;
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.mapper.ModelTestTaskMapper">
<resultMap id="BaseResultMap" type="com.ruoyi.domain.ModelTestTask">
<id property="id" column="id" jdbcType="BIGINT"/>
<result property="taskNo" column="task_no" jdbcType="VARCHAR"/>
<result property="taskStatus" column="task_status" jdbcType="VARCHAR"/>
<result property="taskInitiator" column="task_initiator" jdbcType="VARCHAR"/>
<result property="taskInitiatorDept" column="task_initiator_dept" jdbcType="VARCHAR"/>
<result property="taskResult" column="task_result" jdbcType="VARCHAR"/>
<result property="taskBeginTime" column="task_begin_time" jdbcType="TIMESTAMP"/>
<result property="taskEndTime" column="task_end_time" jdbcType="TIMESTAMP"/>
<result property="testCase" column="test_case" typeHandler="com.ruoyi.common.StandardJsonTypeHandler"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="leaderId" column="leader_id" jdbcType="BIGINT"/>
<result property="leader" column="leader" jdbcType="VARCHAR"/>
<result property="standardId" column="standard_id" jdbcType="BIGINT"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="standardNo" column="standard_no" jdbcType="VARCHAR"/>
<result property="submitId" column="submit_id" jdbcType="BIGINT"/>
<result property="submitName" column="submit_name" jdbcType="VARCHAR"/>
<result property="imagesUrl" column="images_url" jdbcType="VARCHAR"/>
<result property="details" column="details" jdbcType="INTEGER"/>
<result property="standards" column="standards" jdbcType="INTEGER"/>
<result property="testSchemeId" column="test_scheme_id" jdbcType="VARCHAR"/>
</resultMap>
<select id="findByStatus" resultType="com.ruoyi.domain.ModelTestTask">
SELECT id,task_no,task_status,task_initiator,task_initiator_dept,task_result,task_begin_time,task_end_time,test_case,create_time,leader_id,leader,standard_id,name,standard_no,submit_id,submit_name,images_url,details,standards,test_scheme_id
FROM t_model_test_task WHERE task_status = 'PENDING'
</select>
<select id="findByTaskList" resultType="com.ruoyi.domain.ModelTestTask">
SELECT id,task_no,task_status,task_initiator,task_initiator_dept,task_result,task_begin_time,task_end_time,test_case,create_time,leader_id,leader,standard_id,name,standard_no,submit_id,submit_name,images_url,details,standards,test_scheme_id
FROM t_model_test_task
WHERE id IN
<foreach collection="responses" item="task" open="(" separator="," close=")">
#{task.modelTestTaskId}
</foreach>
</select>
<select id="testAnswerCount" resultType="com.ruoyi.web.response.ResultCountResponse">
<foreach item="task" collection="responses" separator="UNION ALL">
SELECT
#{task.modelTestTaskId} AS taskId,
(IFNULL(
(SELECT COUNT(*) FROM t_test_records WHERE task_id = #{task.modelTestTaskId}),
0
) /
IFNULL(
(SELECT COUNT(*) FROM t_task_scenario_relation tsr
INNER JOIN t_test_scenario tts ON tts.id = tsr.test_scenario_id
INNER JOIN t_test_usecase ttu ON tts.id = ttu.test_scenario_id
WHERE tsr.task_id = #{task.id}),
1
)) * 90 AS schedule,
tm.task_status AS taskStatus
from t_model_test_task tm where tm.id = #{task.modelTestTaskId}
</foreach>
group by taskId
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.mapper.StatisticsHomeMapper">
<select id="selectQuantityStatistics" resultType="com.ruoyi.domain.vo.QuantityStatisticsVO" parameterType="com.ruoyi.domain.vo.QuantityStatisticsVO">
SELECT
( SELECT count( id ) FROM t_standard ) AS standardQuantity,
( SELECT count( id ) FROM t_test_usecase ) AS numberUseCases,
( SELECT count( id ) FROM t_task ) AS numberTasks,
( SELECT count( id ) FROM t_automobile_enterprise WHERE deleted = 0 ) AS numberCompanies,
(
SELECT
count( su.user_id )
FROM
sys_user su
LEFT JOIN sys_user_role sur ON sur.user_id = su.user_id
WHERE
sur.role_id = 106
) AS numberInspectors,
( SELECT count( id ) FROM t_sample WHERE flag = '0' AND deleted = 0 ) AS numberVehicleSamples,
( SELECT count( id ) FROM t_sample WHERE flag = '1' AND deleted = 0 ) AS numberComponentSamples,
( SELECT count( id ) FROM t_test_scenario ) AS numberScenes,
( SELECT count( id ) FROM t_test_type ) AS numberMethods,
( SELECT count( id ) FROM t_task WHERE vehicle_information_url IS NOT NULL ) AS numberReports,
( SELECT count( id ) FROM t_task WHERE task_status = 'FINISH' ) AS completedTaskNumber,
( SELECT count( id ) FROM t_task WHERE task_status = 'NEW' OR task_status = 'PENDING' ) AS executeTasksNumber
</select>
<select id="selectStandardCategoryStatistics" resultType="com.ruoyi.domain.vo.StandardCategoryStatisticsVO">
SELECT
count( id ) AS value,
standard_type AS name
FROM
t_standard
GROUP BY
standard_type
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.mapper.TaskFileRelationMapper">
<resultMap id="BaseResultMap" type="com.ruoyi.domain.TaskFileRelation">
<result property="taskId" column="task_id" jdbcType="BIGINT"/>
<result property="url" column="url" jdbcType="VARCHAR"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
</resultMap>
<select id="findByTaskId" resultType="com.ruoyi.domain.TaskFileRelation">
select task_id,url,name from t_task_file_relation
where task_id = #{taskId}
</select>
</mapper>
......@@ -311,14 +311,15 @@
GROUP_CONCAT(distinct s.sample_sender) AS sampleSender,
GROUP_CONCAT(distinct DATE_FORMAT(s.delivery_date, '%Y-%m-%d')) AS sampleDeliveryDate,
count(s.id) AS sampleQuantity,
sum(s.number_of_samples) AS sampleSum,
CONVERT(sum(s.number_of_samples), UNSIGNED) AS sampleSum,
GROUP_CONCAT(distinct DATE_FORMAT(s.manufacture_date, '%Y-%m-%d')) AS sampleDeliveryDate,
t.product_model AS vehicleType,
t.product_model AS vehicleModel,
t.id AS taskNumber,
GROUP_CONCAT(distinct s.sample_number) AS sampleNumberSummary,
GROUP_CONCAT(distinct s.identification_code) AS vehicleIdentificationNumber,
t.task_list AS inspectionItem,
DATE_FORMAT(t.create_time, '%Y-%m-%d') AS productionDate
DATE_FORMAT(t.create_time, '%Y-%m-%d') AS productionDate,
GROUP_CONCAT(distinct s.trademark) AS brandImage
from
t_task t
left join t_task_sample_relation tsr on t.id = tsr.task_id
......@@ -328,6 +329,19 @@
where t.id = #{taskId}
group by t.id
</select>
<select id="findByName" resultType="com.ruoyi.domain.Task">
SELECT id, system_review_task_id, car_review_task_id,model_test_task_id,
task_status,run_status,task_no,task_name,confidentiality_level,
product_name,product_model,
entrusted_unit,entrusted_unit_address,entrusted_unit_phone,
entrusted_unit_code,vehicle_sample_information,part_sample_information,
task_initiator_id,task_initiator,task_initiator_dept,
task_begin_time,task_end_time,create_time,
leader_id,leader,standard_id,name,
standard_no,file,task_list
FROM t_task
WHERE task_name = #{taskName}
</select>
</mapper>
......@@ -6,17 +6,23 @@
<resultMap id="BaseResultMap" type="com.ruoyi.domain.TestRecords">
<id property="id" column="id" jdbcType="BIGINT"/>
<result property="taskId" column="task_id" jdbcType="VARCHAR"/>
<result property="projectId" column="project_id" jdbcType="VARCHAR"/>
<result property="taskId" column="task_id" jdbcType="BIGINT"/>
<result property="usecase" column="usecase" jdbcType="VARCHAR"/>
<result property="usecaseId" column="usecase_id" jdbcType="VARCHAR"/>
<result property="testTime" column="test_time" jdbcType="TIMESTAMP"/>
<result property="description" column="description" jdbcType="VARCHAR"/>
<result property="description" column="description" jdbcType="LONGNVARCHAR"/>
<result property="riskLevel" column="risk_level" jdbcType="VARCHAR"/>
<result property="testMethod" column="test_method" jdbcType="VARCHAR"/>
<result property="testMethod" column="test_method" jdbcType="LONGNVARCHAR"/>
<result property="testResult" column="test_result" jdbcType="VARCHAR"/>
<result property="testResultDescription" column="test_result_description" jdbcType="VARCHAR"/>
<result property="loophole" column="loophole" jdbcType="VARCHAR"/>
<result property="remediation" column="remediation" jdbcType="VARCHAR"/>
<result property="testDetails" column="test_details" jdbcType="LONGNVARCHAR"/>
</resultMap>
<select id="findByTaskId" resultType="com.ruoyi.domain.TestRecords">
SELECT id, project_id, task_id, usecase, usecase_id, test_time, description, risk_level, test_method, test_result, remediation, test_details
FROM t_test_records
WHERE project_id = #{id}
</select>
</mapper>
......@@ -76,4 +76,13 @@
where
mtt.id = #{id}
</select>
<select id="selectOptionalUsecase" resultType="com.ruoyi.domain.vo.OptionalUseCasesVO">
select
id AS `key`,
CONCAT('(', usecase_no, ')', name) AS label,
review_standard_id AS standardId
from
t_test_usecase
</select>
</mapper>
......@@ -147,4 +147,8 @@ minio:
url: ${MINIO_URL}
accessKey: ${MINIO_ACCESSKEY}
secretKey: ${MINIO_SECRETKEY}
bucketName: vehicle-quality-review-oss
\ No newline at end of file
bucketName: vehicle-quality-review-oss
# 定时任务开启状态
task:
scheduling: true
\ No newline at end of file
......@@ -149,4 +149,9 @@ minio:
url: http://49.232.167.247:22038
accessKey: lB7WhZYiQwLzhHPutRGn
secretKey: 7XMWpLm6p4d20OFe9uXKifEyhF3cp4sTCowI2fhJ
bucketName: vehicle-quality-review-oss
\ No newline at end of file
bucketName: vehicle-quality-review-oss
# 定时任务开启状态
task:
scheduling: true
\ No newline at end of file
package com.ruoyi;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.domain.TestRecords;
import com.ruoyi.domain.vo.CaseResultVO;
import com.ruoyi.domain.vo.StepResultVO;
import com.ruoyi.mapper.TestRecordsMapper;
import com.ruoyi.service.TestRecordsService;
import com.ruoyi.service.impl.TestRecordsServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.*;
@SpringBootTest
public class TestRecordsTest {
@Autowired
private TestRecordsService testRecordsService;
@Autowired
private TestRecordsMapper testRecordsMapper;
@Test
public void test() {
Map<String, Object> map = new HashMap<>();
map.put("id", "project_items;27");
map.put("verbose", "ALL");
//以post形式请求接口
String result= HttpUtil.post("https://10.12.48.78:8090/DescribeProjectTestResult",JSONObject.toJSONString(map));
JSONObject jsonObject = JSONObject.parseObject(result);
// 获取关联项目id
String projectId = (String) jsonObject.get("id");
// 获取项目用例结果列表
List<CaseResultVO> caseResultVOS = jsonObject.getList("case_result_list", CaseResultVO.class);
// 获取本地存储的列表
List<TestRecords> recordsList = testRecordsService.findByTaskId("project_items;29");
List<TestRecords> list = new ArrayList<>();
if (caseResultVOS.size() != 0 && caseResultVOS != null) {
for (CaseResultVO caseResultVO : caseResultVOS) {
// 检查 usecaseId 是否在 recordsList 中存在
boolean exists = false;
if (recordsList.size() != 0 && recordsList != null) {
for (TestRecords records : recordsList) {
if (Objects.equals(caseResultVO.getId(), records.getUsecaseId())) {
exists = true;
break;
}
}
}
if ((Objects.equals(caseResultVO.getStatus(), "PASSED") || Objects.equals(caseResultVO.getStatus(), "FAILED")) && !exists) {
TestRecords testRecords = new TestRecords();
testRecords.setProjectId(projectId);
testRecords.setUsecase(caseResultVO.getName());
testRecords.setUsecaseId(caseResultVO.getId());
testRecords.setDescription(caseResultVO.getDescription());
testRecords.setRiskLevel(caseResultVO.getRisk_level());
testRecords.setTestResult(caseResultVO.getStatus());
testRecords.setRemediation(caseResultVO.getRemediation());
List<StepResultVO> stepResultVOS = caseResultVO.getStep_result_list();
if (stepResultVOS.size() != 0 && stepResultVOS != null) {
List<String> stepList = new ArrayList<>();
for (StepResultVO stepResultVO :stepResultVOS) {
String stepName = stepResultVO.getName();
stepList.add(stepName);
}
testRecords.setTestMethod(StringUtils.join(stepList,","));
}
list.add(testRecords);
}
}
testRecordsService.saveBatch(list);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment