Merge branch 'v1.1' of https://github.com/metersphere/server into v1.1
This commit is contained in:
commit
c20e4c4e8c
|
@ -16,7 +16,6 @@ import org.apache.shiro.authz.annotation.RequiresRoles;
|
|||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
|
|
|
@ -16,9 +16,8 @@ import org.apache.shiro.authz.annotation.RequiresRoles;
|
|||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
@RequestMapping(value = "/api")
|
||||
|
@ -95,7 +94,7 @@ public class APITestController {
|
|||
|
||||
@PostMapping(value = "/import", consumes = {"multipart/form-data"})
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public ApiTest testCaseImport(@RequestPart(value = "file", required = false) MultipartFile file, @RequestPart("request") ApiTestImportRequest request) {
|
||||
public ApiTest testCaseImport(@RequestPart(value = "file", required = false) MultipartFile file, @RequestPart("request") ApiTestImportRequest request) {
|
||||
return apiTestService.apiTestImport(file, request);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,7 @@
|
|||
package io.metersphere.api.dto.parse.postman;
|
||||
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class PostmanItem {
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode;
|
|||
@Data
|
||||
public class ExtractRegex extends ExtractCommon {
|
||||
private String useHeaders;
|
||||
|
||||
public ExtractRegex() {
|
||||
setType(ExtractType.REGEX);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package io.metersphere.api.jmeter;
|
||||
|
||||
import io.github.ningyu.jmeter.plugin.dubbo.sample.ProviderService;
|
||||
import io.metersphere.api.service.APIReportService;
|
||||
import io.metersphere.api.service.APITestService;
|
||||
import io.metersphere.commons.constants.APITestStatus;
|
||||
|
|
|
@ -10,11 +10,10 @@ import org.apache.jmeter.visualizers.backend.BackendListener;
|
|||
import org.apache.jorphan.collections.HashTree;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Service
|
||||
public class JMeterService {
|
||||
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
package io.metersphere.api.parse;
|
||||
|
||||
import io.metersphere.commons.constants.ApiImportPlatform;
|
||||
import io.metersphere.commons.constants.FileType;
|
||||
import io.metersphere.performance.parse.EngineSourceParser;
|
||||
import io.metersphere.performance.parse.xml.XmlEngineSourceParse;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class ApiImportParserFactory {
|
||||
|
|
|
@ -7,8 +7,8 @@ import io.metersphere.api.dto.parse.ApiImport;
|
|||
import io.metersphere.api.dto.parse.postman.*;
|
||||
import io.metersphere.api.dto.scenario.Body;
|
||||
import io.metersphere.api.dto.scenario.KeyValue;
|
||||
import io.metersphere.api.dto.scenario.request.HttpRequest;
|
||||
import io.metersphere.api.dto.scenario.Scenario;
|
||||
import io.metersphere.api.dto.scenario.request.HttpRequest;
|
||||
import io.metersphere.api.dto.scenario.request.Request;
|
||||
import io.metersphere.commons.constants.MsRequestBodyType;
|
||||
import io.metersphere.commons.constants.PostmanRequestBodyMode;
|
||||
|
|
|
@ -6,8 +6,8 @@ import io.metersphere.api.dto.ApiTestImportRequest;
|
|||
import io.metersphere.api.dto.parse.ApiImport;
|
||||
import io.metersphere.api.dto.scenario.Body;
|
||||
import io.metersphere.api.dto.scenario.KeyValue;
|
||||
import io.metersphere.api.dto.scenario.request.HttpRequest;
|
||||
import io.metersphere.api.dto.scenario.Scenario;
|
||||
import io.metersphere.api.dto.scenario.request.HttpRequest;
|
||||
import io.metersphere.api.dto.scenario.request.Request;
|
||||
import io.metersphere.commons.constants.MsRequestBodyType;
|
||||
import io.metersphere.commons.constants.SwaggerParameterType;
|
||||
|
@ -64,7 +64,8 @@ public class Swagger2Parser extends ApiImportAbstractParser {
|
|||
Scenario scenario = Optional.ofNullable(scenarioMap.get(tag)).orElse(new Scenario());
|
||||
List<Request> requests = Optional.ofNullable(scenario.getRequests()).orElse(new ArrayList<>());
|
||||
requests.add(request);
|
||||
scenario.setRequests(requests);scenario.setName(tag);
|
||||
scenario.setRequests(requests);
|
||||
scenario.setName(tag);
|
||||
scenarioMap.put(tag, scenario);
|
||||
});
|
||||
} else {
|
||||
|
@ -86,7 +87,7 @@ public class Swagger2Parser extends ApiImportAbstractParser {
|
|||
List<Parameter> parameters = operation.getParameters();
|
||||
|
||||
for (Parameter parameter : parameters) {
|
||||
switch (parameter.getIn()){
|
||||
switch (parameter.getIn()) {
|
||||
// case SwaggerParameterType.PATH:
|
||||
// parsePathParameters(parameter, request);
|
||||
// break;
|
||||
|
@ -137,7 +138,7 @@ public class Swagger2Parser extends ApiImportAbstractParser {
|
|||
ArrayModel arrayModel = (ArrayModel) bodyParameter.getSchema();
|
||||
Property items = arrayModel.getItems();
|
||||
if (items instanceof RefProperty) {
|
||||
RefProperty refProperty = (RefProperty) items;
|
||||
RefProperty refProperty = (RefProperty) items;
|
||||
Model model = definitions.get(refProperty.getSimpleRef());
|
||||
JSONArray propertyList = new JSONArray();
|
||||
propertyList.add(getBodyJSONObjectParameters(model.getProperties(), definitions));
|
||||
|
@ -155,11 +156,11 @@ public class Swagger2Parser extends ApiImportAbstractParser {
|
|||
if (value instanceof ObjectProperty) {
|
||||
ObjectProperty objectProperty = (ObjectProperty) value;
|
||||
jsonObject.put(key, getBodyJSONObjectParameters(objectProperty.getProperties(), definitions));
|
||||
} else if (value instanceof ArrayProperty) {
|
||||
} else if (value instanceof ArrayProperty) {
|
||||
ArrayProperty arrayProperty = (ArrayProperty) value;
|
||||
Property items = arrayProperty.getItems();
|
||||
if (items instanceof RefProperty) {
|
||||
RefProperty refProperty = (RefProperty) items;
|
||||
RefProperty refProperty = (RefProperty) items;
|
||||
Model model = definitions.get(refProperty.getSimpleRef());
|
||||
JSONArray propertyList = new JSONArray();
|
||||
propertyList.add(getBodyJSONObjectParameters(model.getProperties(), definitions));
|
||||
|
|
|
@ -12,19 +12,16 @@ import io.metersphere.base.mapper.ext.ExtApiTestReportMapper;
|
|||
import io.metersphere.commons.constants.APITestStatus;
|
||||
import io.metersphere.commons.exception.MSException;
|
||||
import io.metersphere.commons.utils.ServiceUtils;
|
||||
import io.metersphere.commons.utils.SessionUtils;
|
||||
import io.metersphere.dto.DashboardTestDTO;
|
||||
import io.metersphere.i18n.Translator;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
@Service
|
||||
|
|
|
@ -34,9 +34,7 @@ import org.springframework.util.CollectionUtils;
|
|||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
|
|
@ -21,7 +21,7 @@ public class ApiTestEnvironmentService {
|
|||
private ApiTestEnvironmentMapper apiTestEnvironmentMapper;
|
||||
|
||||
public List<ApiTestEnvironmentWithBLOBs> list(String projectId) {
|
||||
ApiTestEnvironmentExample example =new ApiTestEnvironmentExample();
|
||||
ApiTestEnvironmentExample example = new ApiTestEnvironmentExample();
|
||||
example.createCriteria().andProjectIdEqualTo(projectId);
|
||||
return apiTestEnvironmentMapper.selectByExampleWithBLOBs(example);
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ public class ApiTestEnvironmentService {
|
|||
return apiTestEnvironmentWithBLOBs.getId();
|
||||
}
|
||||
|
||||
private void checkEnvironmentExist (ApiTestEnvironmentWithBLOBs environment) {
|
||||
private void checkEnvironmentExist(ApiTestEnvironmentWithBLOBs environment) {
|
||||
if (environment.getName() != null) {
|
||||
ApiTestEnvironmentExample example = new ApiTestEnvironmentExample();
|
||||
ApiTestEnvironmentExample.Criteria criteria = example.createCriteria();
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
package io.metersphere.commons.constants;
|
||||
|
||||
public enum ApiImportPlatform {
|
||||
public enum ApiImportPlatform {
|
||||
Metersphere, Postman, Swagger2
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
package io.metersphere.commons.constants;
|
||||
|
||||
public enum ReportTriggerMode {
|
||||
MANUAL,SCHEDULE,API
|
||||
public enum ReportTriggerMode {
|
||||
MANUAL, SCHEDULE, API
|
||||
}
|
||||
|
|
|
@ -1,14 +1,24 @@
|
|||
package io.metersphere.commons.exception;
|
||||
|
||||
public class MSException extends RuntimeException{
|
||||
public class MSException extends RuntimeException {
|
||||
|
||||
private MSException(String message) { super(message); }
|
||||
private MSException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
private MSException(Throwable t) { super(t); }
|
||||
private MSException(Throwable t) {
|
||||
super(t);
|
||||
}
|
||||
|
||||
public static void throwException(String message) { throw new MSException(message); }
|
||||
public static void throwException(String message) {
|
||||
throw new MSException(message);
|
||||
}
|
||||
|
||||
public static MSException getException(String message) { throw new MSException(message); }
|
||||
public static MSException getException(String message) {
|
||||
throw new MSException(message);
|
||||
}
|
||||
|
||||
public static void throwException(Throwable t) { throw new MSException(t); }
|
||||
public static void throwException(Throwable t) {
|
||||
throw new MSException(t);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ public class MathUtils {
|
|||
/**
|
||||
* 获取百分比
|
||||
* 保留一位小数
|
||||
*
|
||||
* @param value
|
||||
* @return
|
||||
*/
|
||||
|
|
|
@ -7,9 +7,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
|
|||
import org.springframework.context.MessageSource;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
|
||||
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
|
||||
|
||||
import javax.validation.Validator;
|
||||
|
||||
|
@ -31,6 +29,7 @@ public class I18nConfig {
|
|||
|
||||
/**
|
||||
* JSR-303校验国际化
|
||||
*
|
||||
* @param messageSource
|
||||
* @return
|
||||
*/
|
||||
|
@ -43,7 +42,7 @@ public class I18nConfig {
|
|||
}
|
||||
|
||||
@Bean
|
||||
public Validator validator(LocalValidatorFactoryBean localValidatorFactoryBean){
|
||||
public Validator validator(LocalValidatorFactoryBean localValidatorFactoryBean) {
|
||||
return localValidatorFactoryBean.getValidator();
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@ import com.fit2cloud.quartz.service.QuartzManageService;
|
|||
import com.fit2cloud.quartz.util.QuartzBeanFactory;
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package io.metersphere.controller;
|
||||
|
||||
import io.metersphere.service.ScheduleService;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ import io.metersphere.commons.constants.ParamConstants;
|
|||
import io.metersphere.commons.constants.RoleConstants;
|
||||
import io.metersphere.ldap.domain.LdapInfo;
|
||||
import io.metersphere.service.SystemParameterService;
|
||||
import org.apache.shiro.authz.annotation.Logical;
|
||||
import org.apache.shiro.authz.annotation.RequiresRoles;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.GetMapping;
|
|||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -34,7 +35,7 @@ public class UserRoleController {
|
|||
|
||||
@GetMapping("/all/{userId}")
|
||||
@RequiresRoles(RoleConstants.ADMIN)
|
||||
public List<Map<String,Object>> getUserRole(@PathVariable("userId") String userId) {
|
||||
public List<Map<String, Object>> getUserRole(@PathVariable("userId") String userId) {
|
||||
return userRoleService.getUserRole(userId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ package io.metersphere.controller.request.member;
|
|||
import io.metersphere.base.domain.User;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -11,6 +12,6 @@ import java.util.Map;
|
|||
@Setter
|
||||
public class UserRequest extends User {
|
||||
|
||||
private List<Map<String,Object>> roles = new ArrayList<>();
|
||||
private List<Map<String, Object>> roles = new ArrayList<>();
|
||||
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import io.metersphere.base.domain.Role;
|
|||
import io.metersphere.base.domain.UserRole;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Getter
|
||||
|
|
|
@ -11,9 +11,10 @@ public class ExcelErrData<T> {
|
|||
|
||||
private String errMsg;
|
||||
|
||||
public ExcelErrData(){}
|
||||
public ExcelErrData() {
|
||||
}
|
||||
|
||||
public ExcelErrData(T t, Integer rowNum,String errMsg){
|
||||
public ExcelErrData(T t, Integer rowNum, String errMsg) {
|
||||
this.t = t;
|
||||
this.rowNum = rowNum;
|
||||
this.errMsg = errMsg;
|
||||
|
|
|
@ -3,6 +3,7 @@ package io.metersphere.excel.domain;
|
|||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class ExcelResponse<T> {
|
||||
|
||||
|
|
|
@ -13,12 +13,12 @@ import javax.validation.constraints.Pattern;
|
|||
public class TestCaseExcelData {
|
||||
|
||||
@NotBlank(message = "{cannot_be_null}")
|
||||
@Length(max=50)
|
||||
@Length(max = 50)
|
||||
@ExcelProperty("{test_case_name}")
|
||||
private String name;
|
||||
|
||||
@NotBlank(message = "{cannot_be_null}")
|
||||
@Length(max=1000)
|
||||
@Length(max = 1000)
|
||||
@ExcelProperty("{test_case_module}")
|
||||
@ColumnWidth(30)
|
||||
@Pattern(regexp = "^(?!.*//).*$", message = "{incorrect_format}")
|
||||
|
@ -45,21 +45,21 @@ public class TestCaseExcelData {
|
|||
|
||||
@ColumnWidth(50)
|
||||
@ExcelProperty("{test_case_prerequisite}")
|
||||
@Length(min=0, max=1000)
|
||||
@Length(min = 0, max = 1000)
|
||||
private String prerequisite;
|
||||
|
||||
@ColumnWidth(50)
|
||||
@ExcelProperty("{test_case_remark}")
|
||||
@Length(max=1000)
|
||||
@Length(max = 1000)
|
||||
private String remark;
|
||||
|
||||
@ColumnWidth(50)
|
||||
@ExcelProperty("{test_case_step_desc}")
|
||||
@Length(max=1000)
|
||||
@Length(max = 1000)
|
||||
private String stepDesc;
|
||||
|
||||
@ColumnWidth(50)
|
||||
@ExcelProperty("{test_case_step_result}")
|
||||
@Length(max=1000)
|
||||
@Length(max = 1000)
|
||||
private String stepResult;
|
||||
}
|
||||
|
|
|
@ -11,10 +11,12 @@ import io.metersphere.excel.utils.EasyExcelI18nTranslator;
|
|||
import io.metersphere.excel.utils.ExcelValidateHelper;
|
||||
import io.metersphere.i18n.Translator;
|
||||
|
||||
import java.lang.reflect.*;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.*;
|
||||
|
||||
public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
||||
public abstract class EasyExcelListener<T> extends AnalysisEventListener<T> {
|
||||
|
||||
protected List<ExcelErrData<T>> errList = new ArrayList<>();
|
||||
|
||||
|
@ -29,7 +31,7 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
|
||||
protected Class<T> clazz;
|
||||
|
||||
public EasyExcelListener(){
|
||||
public EasyExcelListener() {
|
||||
Type type = getClass().getGenericSuperclass();
|
||||
this.clazz = (Class<T>) ((ParameterizedType) type).getActualTypeArguments()[0];
|
||||
//防止多线程修改运行时类注解后,saveOriginalExcelProperty保存的是修改后的值
|
||||
|
@ -61,7 +63,7 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
|
||||
if (!StringUtils.isEmpty(errMsg)) {
|
||||
ExcelErrData excelErrData = new ExcelErrData(t, rowIndex,
|
||||
Translator.get("number")+ " " + rowIndex + " " + Translator.get("row") + Translator.get("error")
|
||||
Translator.get("number") + " " + rowIndex + " " + Translator.get("row") + Translator.get("error")
|
||||
+ ":" + errMsg);
|
||||
errList.add(excelErrData);
|
||||
} else {
|
||||
|
@ -77,6 +79,7 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
/**
|
||||
* 可重写该方法
|
||||
* 自定义校验规则
|
||||
*
|
||||
* @param data
|
||||
* @param errMsg
|
||||
* @return
|
||||
|
@ -98,18 +101,19 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
|
||||
|
||||
/**
|
||||
* 校验excel头部
|
||||
* @param headMap 传入excel的头部(第一行数据)数据的index,name
|
||||
* @param context
|
||||
*/
|
||||
* 校验excel头部
|
||||
*
|
||||
* @param headMap 传入excel的头部(第一行数据)数据的index,name
|
||||
* @param context
|
||||
*/
|
||||
@Override
|
||||
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
|
||||
if (clazz != null){
|
||||
if (clazz != null) {
|
||||
try {
|
||||
Set<String> fieldNameSet = getFieldNameSet(clazz);
|
||||
Collection<String> values = headMap.values();
|
||||
for (String key : fieldNameSet) {
|
||||
if (!values.contains(key)){
|
||||
if (!values.contains(key)) {
|
||||
throw new ExcelAnalysisException(Translator.get("missing_header_information") + ":" + key);
|
||||
}
|
||||
}
|
||||
|
@ -121,17 +125,17 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
}
|
||||
|
||||
/**
|
||||
* @description: 获取注解里ExcelProperty的value
|
||||
* @description: 获取注解里ExcelProperty的value
|
||||
*/
|
||||
public Set<String> getFieldNameSet(Class clazz) throws NoSuchFieldException {
|
||||
Set<String> result = new HashSet<>();
|
||||
Field field;
|
||||
Field[] fields = clazz.getDeclaredFields();
|
||||
for (int i = 0; i < fields.length ; i++) {
|
||||
for (int i = 0; i < fields.length; i++) {
|
||||
field = clazz.getDeclaredField(fields[i].getName());
|
||||
field.setAccessible(true);
|
||||
ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
|
||||
if(excelProperty != null){
|
||||
if (excelProperty != null) {
|
||||
StringBuilder value = new StringBuilder();
|
||||
for (String v : excelProperty.value()) {
|
||||
value.append(v);
|
||||
|
@ -146,7 +150,7 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
return errList;
|
||||
}
|
||||
|
||||
public void close () {
|
||||
public void close() {
|
||||
this.easyExcelI18nTranslator.resetExcelProperty();
|
||||
}
|
||||
}
|
|
@ -42,7 +42,7 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
|
|||
|
||||
if (nodePath != null) {
|
||||
String[] nodes = nodePath.split("/");
|
||||
if ( nodes.length > TestCaseConstants.MAX_NODE_DEPTH + 1) {
|
||||
if (nodes.length > TestCaseConstants.MAX_NODE_DEPTH + 1) {
|
||||
stringBuilder.append(Translator.get("test_case_node_level_tip") +
|
||||
TestCaseConstants.MAX_NODE_DEPTH + Translator.get("test_case_node_level"));
|
||||
}
|
||||
|
@ -122,7 +122,7 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
|
|||
String pattern = "(^\\d+)(\\.)?";
|
||||
int index = stepDesc.length > stepRes.length ? stepDesc.length : stepRes.length;
|
||||
|
||||
for (int i = 0; i < index; i++){
|
||||
for (int i = 0; i < index; i++) {
|
||||
|
||||
JSONObject step = new JSONObject();
|
||||
step.put("num", i + 1);
|
||||
|
|
|
@ -1,24 +1,14 @@
|
|||
package io.metersphere.excel.utils;
|
||||
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import io.metersphere.commons.utils.LogUtil;
|
||||
import io.metersphere.excel.domain.TestCaseExcelData;
|
||||
import io.metersphere.exception.ExcelException;
|
||||
import io.metersphere.i18n.Translator;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.Proxy;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class EasyExcelExporter {
|
||||
|
||||
|
|
|
@ -33,12 +33,12 @@ public class EasyExcelI18nTranslator {
|
|||
private void readExcelProperty(Class clazz, BiConsumer<String, Map<String, Object>> operate) {
|
||||
Field field;
|
||||
Field[] fields = clazz.getDeclaredFields();
|
||||
for (int i = 0; i < fields.length ; i++) {
|
||||
for (int i = 0; i < fields.length; i++) {
|
||||
try {
|
||||
field = clazz.getDeclaredField(fields[i].getName());
|
||||
field.setAccessible(true);
|
||||
ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
|
||||
if(excelProperty != null){
|
||||
if (excelProperty != null) {
|
||||
InvocationHandler invocationHandler = Proxy.getInvocationHandler(excelProperty);
|
||||
Field fieldValue = invocationHandler.getClass().getDeclaredField("memberValues");
|
||||
fieldValue.setAccessible(true);
|
||||
|
@ -51,7 +51,7 @@ public class EasyExcelI18nTranslator {
|
|||
}
|
||||
|
||||
operate.accept(field.getName(), memberValues);
|
||||
|
||||
|
||||
}
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
|
@ -64,7 +64,7 @@ public class EasyExcelI18nTranslator {
|
|||
|
||||
public void saveOriginalExcelProperty() {
|
||||
readExcelProperty(clazz, (fieldName, memberValues) -> {
|
||||
List<String> values = Arrays.asList((String [])memberValues.get("value"));
|
||||
List<String> values = Arrays.asList((String[]) memberValues.get("value"));
|
||||
List<String> copyValues = new ArrayList<>();
|
||||
values.forEach(value -> {
|
||||
copyValues.add(value);
|
||||
|
@ -74,11 +74,11 @@ public class EasyExcelI18nTranslator {
|
|||
}
|
||||
|
||||
public void translateExcelProperty() {
|
||||
readExcelProperty(TestCaseExcelData.class, (fieldName, memberValues) -> {
|
||||
String [] values = (String[]) memberValues.get("value");
|
||||
readExcelProperty(TestCaseExcelData.class, (fieldName, memberValues) -> {
|
||||
String[] values = (String[]) memberValues.get("value");
|
||||
for (int j = 0; j < values.length; j++) {
|
||||
if (Pattern.matches("^\\{.+\\}$", values[j])) {
|
||||
values[j] = Translator.get(values[j].substring(1, values[j].length() - 1));
|
||||
values[j] = Translator.get(values[j].substring(1, values[j].length() - 1));
|
||||
}
|
||||
}
|
||||
memberValues.put("value", values);
|
||||
|
@ -87,7 +87,7 @@ public class EasyExcelI18nTranslator {
|
|||
|
||||
public void resetExcelProperty() {
|
||||
readExcelProperty(clazz, (fieldName, memberValues) -> {
|
||||
String [] values = (String[]) memberValues.get("value");
|
||||
String[] values = (String[]) memberValues.get("value");
|
||||
List<String> list = excelPropertyMap.get(fieldName);
|
||||
for (int j = 0; j < values.length; j++) {
|
||||
values[j] = list.get(j);
|
||||
|
|
|
@ -2,7 +2,6 @@ package io.metersphere.excel.utils;
|
|||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.Resource;
|
||||
|
@ -20,7 +19,7 @@ public class ExcelValidateHelper {
|
|||
@Resource
|
||||
Validator validator;
|
||||
|
||||
public static <T> String validateEntity(T obj) throws NoSuchFieldException {
|
||||
public static <T> String validateEntity(T obj) throws NoSuchFieldException {
|
||||
StringBuilder result = new StringBuilder();
|
||||
Set<ConstraintViolation<T>> set = excelValidateHelper.validator.validate(obj, Default.class);
|
||||
if (set != null && !set.isEmpty()) {
|
||||
|
@ -28,7 +27,7 @@ public class ExcelValidateHelper {
|
|||
Field declaredField = obj.getClass().getDeclaredField(cv.getPropertyPath().toString());
|
||||
ExcelProperty annotation = declaredField.getAnnotation(ExcelProperty.class);
|
||||
//拼接错误信息,包含当前出错数据的标题名字+错误信息
|
||||
result.append(annotation.value()[0]+cv.getMessage()).append("; ");
|
||||
result.append(annotation.value()[0] + cv.getMessage()).append("; ");
|
||||
}
|
||||
}
|
||||
return result.toString();
|
||||
|
|
|
@ -7,11 +7,11 @@ public class ExcelException extends RuntimeException {
|
|||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public ExcelException(String message, Exception e){
|
||||
public ExcelException(String message, Exception e) {
|
||||
super(message, e);
|
||||
}
|
||||
|
||||
public ExcelException(String message){
|
||||
public ExcelException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ public abstract class MsScheduleJob implements Job {
|
|||
this.userId = jobDataMap.getString("userId");
|
||||
this.expression = jobDataMap.getString("expression");
|
||||
|
||||
LogUtil.info(jobKey.getGroup()+ " Running: " + resourceId);
|
||||
LogUtil.info(jobKey.getGroup() + " Running: " + resourceId);
|
||||
LogUtil.info("CronExpression: " + expression);
|
||||
businessExecute(context);
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 添加 simpleJob
|
||||
*
|
||||
* @param jobKey
|
||||
* @param triggerKey
|
||||
* @param cls
|
||||
|
@ -22,7 +23,7 @@ public class ScheduleManager {
|
|||
* @throws SchedulerException
|
||||
*/
|
||||
public void addSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class<? extends Job> cls, int repeatIntervalTime,
|
||||
JobDataMap jobDataMap) throws SchedulerException {
|
||||
JobDataMap jobDataMap) throws SchedulerException {
|
||||
|
||||
JobBuilder jobBuilder = JobBuilder.newJob(cls).withIdentity(jobKey);
|
||||
|
||||
|
@ -58,6 +59,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 添加 cronJob
|
||||
*
|
||||
* @param jobKey
|
||||
* @param triggerKey
|
||||
* @param jobClass
|
||||
|
@ -102,6 +104,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 修改 cronTrigger
|
||||
*
|
||||
* @param triggerKey
|
||||
* @param cron
|
||||
* @throws SchedulerException
|
||||
|
@ -149,6 +152,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 修改simpleTrigger触发器的触发时间
|
||||
*
|
||||
* @param triggerKey
|
||||
* @param repeatIntervalTime
|
||||
* @throws SchedulerException
|
||||
|
@ -199,12 +203,10 @@ public class ScheduleManager {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @Title:
|
||||
* @Description: 根据job和trigger删除任务
|
||||
*
|
||||
* @param jobKey
|
||||
* @param triggerKey
|
||||
* @Title:
|
||||
* @Description: 根据job和trigger删除任务
|
||||
*/
|
||||
public void removeJob(JobKey jobKey, TriggerKey triggerKey) {
|
||||
|
||||
|
@ -248,6 +250,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 新增或者修改 simpleJob
|
||||
*
|
||||
* @param jobKey
|
||||
* @param triggerKey
|
||||
* @param clz
|
||||
|
@ -256,7 +259,7 @@ public class ScheduleManager {
|
|||
* @throws SchedulerException
|
||||
*/
|
||||
public void addOrUpdateSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class clz,
|
||||
int intervalTime, JobDataMap jobDataMap) throws SchedulerException {
|
||||
int intervalTime, JobDataMap jobDataMap) throws SchedulerException {
|
||||
|
||||
if (scheduler.checkExists(triggerKey)) {
|
||||
modifySimpleJobTime(triggerKey, intervalTime);
|
||||
|
@ -273,6 +276,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 添加或修改 cronJob
|
||||
*
|
||||
* @param jobKey
|
||||
* @param triggerKey
|
||||
* @param jobClass
|
||||
|
|
|
@ -13,7 +13,10 @@ import io.metersphere.service.UserService;
|
|||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.shiro.SecurityUtils;
|
||||
import org.springframework.ldap.core.DirContextOperations;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
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 javax.annotation.Resource;
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ public class Person {
|
|||
|
||||
@Id
|
||||
private Name id;
|
||||
@DnAttribute(value="uid",index = 0)
|
||||
@DnAttribute(value = "uid", index = 0)
|
||||
private String uid;
|
||||
@Attribute(name = "cn")
|
||||
private String commonName;
|
||||
|
|
|
@ -55,7 +55,6 @@ public class LdapService {
|
|||
getMappingAttr("email", dirContextOperations);
|
||||
|
||||
|
||||
|
||||
return dirContextOperations;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ public class AppStartListener implements ApplicationListener<ApplicationReadyEve
|
|||
System.out.println("================= 应用启动 =================");
|
||||
|
||||
try {
|
||||
Thread.sleep(5*60*1000);
|
||||
Thread.sleep(5 * 60 * 1000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
|
|
@ -10,13 +10,12 @@ import org.springframework.stereotype.Service;
|
|||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Service
|
||||
public class FileService {
|
||||
@Resource
|
||||
|
|
|
@ -129,7 +129,7 @@ public class ProjectService {
|
|||
projectMapper.updateByPrimaryKeySelective(project);
|
||||
}
|
||||
|
||||
private void checkProjectExist (Project project) {
|
||||
private void checkProjectExist(Project project) {
|
||||
if (project.getName() != null) {
|
||||
ProjectExample example = new ProjectExample();
|
||||
example.createCriteria()
|
||||
|
|
|
@ -5,6 +5,7 @@ import io.metersphere.base.mapper.RoleMapper;
|
|||
import io.metersphere.base.mapper.ext.ExtRoleMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ import java.util.UUID;
|
|||
@Service
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public class ScheduleService {
|
||||
|
||||
|
||||
@Resource
|
||||
private ScheduleMapper scheduleMapper;
|
||||
@Resource
|
||||
|
|
|
@ -13,6 +13,7 @@ import org.apache.commons.lang3.BooleanUtils;
|
|||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.mail.javamail.JavaMailSenderImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.mail.MessagingException;
|
||||
import java.util.*;
|
||||
|
|
|
@ -18,7 +18,6 @@ import org.apache.commons.collections4.CollectionUtils;
|
|||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
|
|
@ -33,8 +33,8 @@ public class UserRoleService {
|
|||
return extUserRoleMapper.getWorkspaceMemberRoles(workspaceId, userId);
|
||||
}
|
||||
|
||||
public List<Map<String,Object>> getUserRole(String userId) {
|
||||
List<Map<String,Object>> list = new ArrayList<>();
|
||||
public List<Map<String, Object>> getUserRole(String userId) {
|
||||
List<Map<String, Object>> list = new ArrayList<>();
|
||||
UserRoleExample userRoleExample = new UserRoleExample();
|
||||
userRoleExample.createCriteria().andUserIdEqualTo(userId);
|
||||
List<UserRole> userRoles = userRoleMapper.selectByExample(userRoleExample);
|
||||
|
|
|
@ -26,7 +26,6 @@ import org.springframework.util.CollectionUtils;
|
|||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
|
|
@ -62,40 +62,40 @@ public class TestCaseController {
|
|||
}
|
||||
|
||||
@PostMapping("/list")
|
||||
public List<TestCase> getTestCaseByNodeId(@RequestBody List<String> nodeIds){
|
||||
public List<TestCase> getTestCaseByNodeId(@RequestBody List<String> nodeIds) {
|
||||
return testCaseService.getTestCaseByNodeId(nodeIds);
|
||||
}
|
||||
|
||||
@PostMapping("/name")
|
||||
public List<TestCase> getTestCaseNames(@RequestBody QueryTestCaseRequest request){
|
||||
public List<TestCase> getTestCaseNames(@RequestBody QueryTestCaseRequest request) {
|
||||
return testCaseService.getTestCaseNames(request);
|
||||
}
|
||||
|
||||
@GetMapping("/get/{testCaseId}")
|
||||
public TestCaseWithBLOBs getTestCase(@PathVariable String testCaseId){
|
||||
public TestCaseWithBLOBs getTestCase(@PathVariable String testCaseId) {
|
||||
return testCaseService.getTestCase(testCaseId);
|
||||
}
|
||||
|
||||
@GetMapping("/project/{testCaseId}")
|
||||
public Project getProjectByTestCaseId(@PathVariable String testCaseId){
|
||||
public Project getProjectByTestCaseId(@PathVariable String testCaseId) {
|
||||
return testCaseService.getProjectByTestCaseId(testCaseId);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void addTestCase(@RequestBody TestCaseWithBLOBs testCase){
|
||||
public void addTestCase(@RequestBody TestCaseWithBLOBs testCase) {
|
||||
testCaseService.addTestCase(testCase);
|
||||
}
|
||||
|
||||
@PostMapping("/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void editTestCase(@RequestBody TestCaseWithBLOBs testCase){
|
||||
public void editTestCase(@RequestBody TestCaseWithBLOBs testCase) {
|
||||
testCaseService.editTestCase(testCase);
|
||||
}
|
||||
|
||||
@PostMapping("/delete/{testCaseId}")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int deleteTestCase(@PathVariable String testCaseId){
|
||||
public int deleteTestCase(@PathVariable String testCaseId) {
|
||||
return testCaseService.deleteTestCase(testCaseId);
|
||||
}
|
||||
|
||||
|
@ -107,24 +107,25 @@ public class TestCaseController {
|
|||
|
||||
@GetMapping("/export/template")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void testCaseTemplateExport(HttpServletResponse response){
|
||||
public void testCaseTemplateExport(HttpServletResponse response) {
|
||||
testCaseService.testCaseTemplateExport(response);
|
||||
}
|
||||
|
||||
@PostMapping("/export/testcase")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void testCaseExport( HttpServletResponse response,@RequestBody TestCaseBatchRequest request){
|
||||
testCaseService.testCaseExport(response,request);
|
||||
public void testCaseExport(HttpServletResponse response, @RequestBody TestCaseBatchRequest request) {
|
||||
testCaseService.testCaseExport(response, request);
|
||||
}
|
||||
|
||||
@PostMapping("/batch/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void editTestCaseBath(@RequestBody TestCaseBatchRequest request){
|
||||
public void editTestCaseBath(@RequestBody TestCaseBatchRequest request) {
|
||||
testCaseService.editTestCaseBath(request);
|
||||
}
|
||||
|
||||
@PostMapping("/batch/delete")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void deleteTestCaseBath(@RequestBody TestCaseBatchRequest request){
|
||||
public void deleteTestCaseBath(@RequestBody TestCaseBatchRequest request) {
|
||||
testCaseService.deleteTestCaseBath(request);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,42 +21,43 @@ public class TestCaseNodeController {
|
|||
TestCaseNodeService testCaseNodeService;
|
||||
|
||||
@GetMapping("/list/{projectId}")
|
||||
public List<TestCaseNodeDTO> getNodeByProjectId(@PathVariable String projectId){
|
||||
public List<TestCaseNodeDTO> getNodeByProjectId(@PathVariable String projectId) {
|
||||
return testCaseNodeService.getNodeTreeByProjectId(projectId);
|
||||
}
|
||||
|
||||
/*模块列表列表*/
|
||||
@GetMapping("/list/all/plan/{planId}")
|
||||
public List<TestCaseNodeDTO> getAllNodeByPlanId(@PathVariable String planId){
|
||||
public List<TestCaseNodeDTO> getAllNodeByPlanId(@PathVariable String planId) {
|
||||
return testCaseNodeService.getAllNodeByPlanId(planId);
|
||||
}
|
||||
|
||||
@GetMapping("/list/plan/{planId}")
|
||||
public List<TestCaseNodeDTO> getNodeByPlanId(@PathVariable String planId){
|
||||
public List<TestCaseNodeDTO> getNodeByPlanId(@PathVariable String planId) {
|
||||
return testCaseNodeService.getNodeByPlanId(planId);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public String addNode(@RequestBody TestCaseNode node){
|
||||
public String addNode(@RequestBody TestCaseNode node) {
|
||||
return testCaseNodeService.addNode(node);
|
||||
}
|
||||
|
||||
@PostMapping("/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int editNode(@RequestBody DragNodeRequest node){
|
||||
public int editNode(@RequestBody DragNodeRequest node) {
|
||||
return testCaseNodeService.editNode(node);
|
||||
}
|
||||
|
||||
@PostMapping("/delete")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int deleteNode(@RequestBody List<String> nodeIds){
|
||||
public int deleteNode(@RequestBody List<String> nodeIds) {
|
||||
//nodeIds 包含删除节点ID及其所有子节点ID
|
||||
return testCaseNodeService.deleteNode(nodeIds);
|
||||
}
|
||||
|
||||
@PostMapping("/drag")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void dragNode(@RequestBody DragNodeRequest node){
|
||||
public void dragNode(@RequestBody DragNodeRequest node) {
|
||||
testCaseNodeService.dragNode(node);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@ package io.metersphere.track.controller;
|
|||
import io.metersphere.base.domain.TestCaseReport;
|
||||
import io.metersphere.commons.constants.RoleConstants;
|
||||
import io.metersphere.track.request.testCaseReport.CreateReportRequest;
|
||||
import io.metersphere.track.dto.TestCaseReportMetricDTO;
|
||||
import io.metersphere.track.service.TestCaseReportService;
|
||||
import org.apache.shiro.authz.annotation.Logical;
|
||||
import org.apache.shiro.authz.annotation.RequiresRoles;
|
||||
|
@ -25,25 +24,25 @@ public class TestCaseReportController {
|
|||
}
|
||||
|
||||
@GetMapping("/get/{id}")
|
||||
public TestCaseReport get(@PathVariable String id){
|
||||
public TestCaseReport get(@PathVariable String id) {
|
||||
return testCaseReportService.getTestCaseReport(id);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public String addByTemplateId(@RequestBody CreateReportRequest request){
|
||||
public String addByTemplateId(@RequestBody CreateReportRequest request) {
|
||||
return testCaseReportService.addTestCaseReportByTemplateId(request);
|
||||
}
|
||||
|
||||
@PostMapping("/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void edit(@RequestBody TestCaseReport TestCaseReport){
|
||||
public void edit(@RequestBody TestCaseReport TestCaseReport) {
|
||||
testCaseReportService.editTestCaseReport(TestCaseReport);
|
||||
}
|
||||
|
||||
@PostMapping("/delete/{id}")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int delete(@PathVariable String id){
|
||||
public int delete(@PathVariable String id) {
|
||||
return testCaseReportService.deleteTestCaseReport(id);
|
||||
}
|
||||
|
||||
|
|
|
@ -24,25 +24,25 @@ public class TestCaseReportTemplateController {
|
|||
}
|
||||
|
||||
@GetMapping("/get/{id}")
|
||||
public TestCaseReportTemplate get(@PathVariable String id){
|
||||
public TestCaseReportTemplate get(@PathVariable String id) {
|
||||
return testCaseReportTemplateService.getTestCaseReportTemplate(id);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void add(@RequestBody TestCaseReportTemplate testCaseReportTemplate){
|
||||
public void add(@RequestBody TestCaseReportTemplate testCaseReportTemplate) {
|
||||
testCaseReportTemplateService.addTestCaseReportTemplate(testCaseReportTemplate);
|
||||
}
|
||||
|
||||
@PostMapping("/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void edit(@RequestBody TestCaseReportTemplate testCaseReportTemplate){
|
||||
public void edit(@RequestBody TestCaseReportTemplate testCaseReportTemplate) {
|
||||
testCaseReportTemplateService.editTestCaseReportTemplate(testCaseReportTemplate);
|
||||
}
|
||||
|
||||
@PostMapping("/delete/{id}")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int delete(@PathVariable String id){
|
||||
public int delete(@PathVariable String id) {
|
||||
return testCaseReportTemplateService.deleteTestCaseReportTemplate(id);
|
||||
}
|
||||
|
||||
|
|
|
@ -63,41 +63,41 @@ public class TestPlanController {
|
|||
}
|
||||
|
||||
@PostMapping("/get/{testPlanId}")
|
||||
public TestPlan getTestPlan(@PathVariable String testPlanId){
|
||||
public TestPlan getTestPlan(@PathVariable String testPlanId) {
|
||||
return testPlanService.getTestPlan(testPlanId);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void addTestPlan(@RequestBody TestPlan testPlan){
|
||||
public void addTestPlan(@RequestBody TestPlan testPlan) {
|
||||
testPlanService.addTestPlan(testPlan);
|
||||
}
|
||||
|
||||
@PostMapping("/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void editTestPlan(@RequestBody TestPlan testPlan){
|
||||
public void editTestPlan(@RequestBody TestPlan testPlan) {
|
||||
testPlanService.editTestPlan(testPlan);
|
||||
}
|
||||
|
||||
@PostMapping("/edit/status/{planId}")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void editTestPlanStatus(@PathVariable String planId){
|
||||
public void editTestPlanStatus(@PathVariable String planId) {
|
||||
testPlanService.editTestPlanStatus(planId);
|
||||
}
|
||||
|
||||
@PostMapping("/delete/{testPlanId}")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int deleteTestPlan(@PathVariable String testPlanId){
|
||||
public int deleteTestPlan(@PathVariable String testPlanId) {
|
||||
return testPlanService.deleteTestPlan(testPlanId);
|
||||
}
|
||||
|
||||
@PostMapping("/relevance")
|
||||
public void testPlanRelevance(@RequestBody PlanCaseRelevanceRequest request){
|
||||
public void testPlanRelevance(@RequestBody PlanCaseRelevanceRequest request) {
|
||||
testPlanService.testPlanRelevance(request);
|
||||
}
|
||||
|
||||
@GetMapping("/get/metric/{planId}")
|
||||
public TestCaseReportMetricDTO getMetric(@PathVariable String planId){
|
||||
public TestCaseReportMetricDTO getMetric(@PathVariable String planId) {
|
||||
return testPlanService.getMetric(planId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,14 +2,13 @@ package io.metersphere.track.controller;
|
|||
|
||||
import com.github.pagehelper.Page;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import io.metersphere.base.domain.TestPlanTestCase;
|
||||
import io.metersphere.base.domain.TestPlanTestCaseWithBLOBs;
|
||||
import io.metersphere.commons.constants.RoleConstants;
|
||||
import io.metersphere.commons.utils.PageUtils;
|
||||
import io.metersphere.commons.utils.Pager;
|
||||
import io.metersphere.track.dto.TestPlanCaseDTO;
|
||||
import io.metersphere.track.request.testcase.TestPlanCaseBatchRequest;
|
||||
import io.metersphere.track.request.testplancase.QueryTestPlanCaseRequest;
|
||||
import io.metersphere.track.dto.TestPlanCaseDTO;
|
||||
import io.metersphere.track.service.TestPlanTestCaseService;
|
||||
import org.apache.shiro.authz.annotation.Logical;
|
||||
import org.apache.shiro.authz.annotation.RequiresRoles;
|
||||
|
@ -17,7 +16,6 @@ import org.springframework.web.bind.annotation.*;
|
|||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@RequestMapping("/test/plan/case")
|
||||
|
|
|
@ -7,9 +7,12 @@ import io.metersphere.track.dto.TestPlanDTO;
|
|||
public abstract class ReportComponent {
|
||||
protected String componentId;
|
||||
protected TestPlanDTO testPlan;
|
||||
|
||||
public ReportComponent(TestPlanDTO testPlan) {
|
||||
this.testPlan = testPlan;
|
||||
}
|
||||
|
||||
public abstract void readRecord(TestPlanCaseDTO testCase);
|
||||
|
||||
public abstract void afterBuild(TestCaseReportMetricDTO testCaseReportMetric);
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import java.util.List;
|
|||
|
||||
public class ReportFailureResultComponent extends ReportComponent {
|
||||
private List<TestPlanCaseDTO> failureTestCases = new ArrayList<>();
|
||||
|
||||
public ReportFailureResultComponent(TestPlanDTO testPlan) {
|
||||
super(testPlan);
|
||||
componentId = "4";
|
||||
|
|
|
@ -55,7 +55,7 @@ public class ReportResultComponent extends ReportComponent {
|
|||
});
|
||||
|
||||
for (TestCaseReportModuleResultDTO moduleResult : moduleResultMap.values()) {
|
||||
moduleResult.setPassRate(MathUtils.getPercentWithDecimal(moduleResult.getPassCount()*1.0f/moduleResult.getCaseCount()));
|
||||
moduleResult.setPassRate(MathUtils.getPercentWithDecimal(moduleResult.getPassCount() * 1.0f / moduleResult.getCaseCount()));
|
||||
if (moduleResult.getCaseCount() <= 0) {
|
||||
moduleResultMap.remove(moduleResult.getModuleId());
|
||||
}
|
||||
|
@ -69,9 +69,9 @@ public class ReportResultComponent extends ReportComponent {
|
|||
|
||||
List<TestCaseNodeDTO> children = rootNode.getChildren();
|
||||
|
||||
if(children != null) {
|
||||
if (children != null) {
|
||||
Iterator<TestCaseNodeDTO> iterator = children.iterator();
|
||||
while(iterator.hasNext()){
|
||||
while (iterator.hasNext()) {
|
||||
getChildIds(iterator.next(), childIds);
|
||||
}
|
||||
}
|
||||
|
@ -95,7 +95,8 @@ public class ReportResultComponent extends ReportComponent {
|
|||
if (StringUtils.isNotBlank(testCase.getIssues())) {
|
||||
if (JSON.parseObject(testCase.getIssues()).getBoolean("hasIssues")) {
|
||||
moduleResult.setIssuesCount(moduleResult.getIssuesCount() + 1);
|
||||
};
|
||||
}
|
||||
;
|
||||
}
|
||||
moduleResultMap.put(rootNodeId, moduleResult);
|
||||
return;
|
||||
|
|
|
@ -1,9 +1,5 @@
|
|||
package io.metersphere.track.dto;
|
||||
|
||||
import io.metersphere.track.domain.ReportBaseInfoComponent;
|
||||
import io.metersphere.track.domain.ReportFailureResultComponent;
|
||||
import io.metersphere.track.domain.ReportResultChartComponent;
|
||||
import io.metersphere.track.domain.ReportResultComponent;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package io.metersphere.track.dto;
|
||||
|
||||
import io.metersphere.base.domain.TestPlan;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ import java.util.Map;
|
|||
@Setter
|
||||
public class QueryTestCaseRequest extends TestCase {
|
||||
|
||||
private String name;
|
||||
private String name;
|
||||
|
||||
private List<String> nodeIds;
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ public class TestCaseNodeService {
|
|||
}
|
||||
|
||||
private void validateNode(TestCaseNode node) {
|
||||
if(node.getLevel() > TestCaseConstants.MAX_NODE_DEPTH){
|
||||
if (node.getLevel() > TestCaseConstants.MAX_NODE_DEPTH) {
|
||||
throw new RuntimeException(Translator.get("test_case_node_level_tip")
|
||||
+ TestCaseConstants.MAX_NODE_DEPTH + Translator.get("test_case_node_level"));
|
||||
}
|
||||
|
@ -97,7 +97,7 @@ public class TestCaseNodeService {
|
|||
|
||||
nodes.forEach(node -> {
|
||||
Integer level = node.getLevel();
|
||||
if( nodeLevelMap.containsKey(level) ){
|
||||
if (nodeLevelMap.containsKey(level)) {
|
||||
nodeLevelMap.get(level).add(node);
|
||||
} else {
|
||||
List<TestCaseNode> testCaseNodes = new ArrayList<>();
|
||||
|
@ -114,25 +114,26 @@ public class TestCaseNodeService {
|
|||
|
||||
/**
|
||||
* 递归构建节点树
|
||||
*
|
||||
* @param nodeLevelMap
|
||||
* @param rootNode
|
||||
* @return
|
||||
*/
|
||||
private TestCaseNodeDTO buildNodeTree(Map<Integer,List<TestCaseNode>> nodeLevelMap, TestCaseNode rootNode) {
|
||||
private TestCaseNodeDTO buildNodeTree(Map<Integer, List<TestCaseNode>> nodeLevelMap, TestCaseNode rootNode) {
|
||||
|
||||
TestCaseNodeDTO nodeTree = new TestCaseNodeDTO();
|
||||
BeanUtils.copyBean(nodeTree, rootNode);
|
||||
nodeTree.setLabel(rootNode.getName());
|
||||
|
||||
List<TestCaseNode> lowerNodes = nodeLevelMap.get(rootNode.getLevel() + 1);
|
||||
if(lowerNodes == null){
|
||||
if (lowerNodes == null) {
|
||||
return nodeTree;
|
||||
}
|
||||
|
||||
List<TestCaseNodeDTO> children = Optional.ofNullable(nodeTree.getChildren()).orElse(new ArrayList<>());
|
||||
|
||||
lowerNodes.forEach(node -> {
|
||||
if (node.getParentId() != null && node.getParentId().equals(rootNode.getId())){
|
||||
if (node.getParentId() != null && node.getParentId().equals(rootNode.getId())) {
|
||||
children.add(buildNodeTree(nodeLevelMap, node));
|
||||
nodeTree.setChildren(children);
|
||||
}
|
||||
|
@ -150,7 +151,7 @@ public class TestCaseNodeService {
|
|||
StringBuilder path = new StringBuilder(testCase.getNodePath());
|
||||
List<String> pathLists = Arrays.asList(path.toString().split("/"));
|
||||
pathLists.set(request.getLevel(), request.getName());
|
||||
path.delete( 0, path.length());
|
||||
path.delete(0, path.length());
|
||||
for (int i = 1; i < pathLists.size(); i++) {
|
||||
path = path.append("/").append(pathLists.get(i));
|
||||
}
|
||||
|
@ -175,6 +176,7 @@ public class TestCaseNodeService {
|
|||
/**
|
||||
* 获取当前计划下
|
||||
* 有关联数据的节点
|
||||
*
|
||||
* @param planId
|
||||
* @return
|
||||
*/
|
||||
|
@ -207,9 +209,9 @@ public class TestCaseNodeService {
|
|||
List<TestCaseNodeDTO> nodeTrees = getNodeTrees(nodes);
|
||||
|
||||
Iterator<TestCaseNodeDTO> iterator = nodeTrees.iterator();
|
||||
while(iterator.hasNext()){
|
||||
while (iterator.hasNext()) {
|
||||
TestCaseNodeDTO rootNode = iterator.next();
|
||||
if(pruningTree(rootNode, dataNodeIds)){
|
||||
if (pruningTree(rootNode, dataNodeIds)) {
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
@ -219,26 +221,27 @@ public class TestCaseNodeService {
|
|||
|
||||
/**
|
||||
* 去除没有数据的节点
|
||||
*
|
||||
* @param rootNode
|
||||
* @param nodeIds
|
||||
* @return 是否剪枝
|
||||
* */
|
||||
*/
|
||||
public boolean pruningTree(TestCaseNodeDTO rootNode, List<String> nodeIds) {
|
||||
|
||||
List<TestCaseNodeDTO> children = rootNode.getChildren();
|
||||
|
||||
if(children == null || children.isEmpty()){
|
||||
if (children == null || children.isEmpty()) {
|
||||
//叶子节点,并且该节点无数据
|
||||
if(!nodeIds.contains(rootNode.getId())){
|
||||
if (!nodeIds.contains(rootNode.getId())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if(children != null) {
|
||||
if (children != null) {
|
||||
Iterator<TestCaseNodeDTO> iterator = children.iterator();
|
||||
while(iterator.hasNext()){
|
||||
while (iterator.hasNext()) {
|
||||
TestCaseNodeDTO subNode = iterator.next();
|
||||
if(pruningTree(subNode, nodeIds)){
|
||||
if (pruningTree(subNode, nodeIds)) {
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
@ -293,7 +296,8 @@ public class TestCaseNodeService {
|
|||
hasNode = true;
|
||||
createNodeByPathIterator(pathIterator, "/" + rootNodeName, nodeTree,
|
||||
pathMap, projectId, 2);
|
||||
};
|
||||
}
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -309,18 +313,19 @@ public class TestCaseNodeService {
|
|||
|
||||
/**
|
||||
* 根据目标节点路径,创建相关节点
|
||||
*
|
||||
* @param pathIterator 遍历子路径
|
||||
* @param path 当前路径
|
||||
* @param treeNode 当前节点
|
||||
* @param pathMap 记录节点路径对应的nodeId
|
||||
* @param path 当前路径
|
||||
* @param treeNode 当前节点
|
||||
* @param pathMap 记录节点路径对应的nodeId
|
||||
*/
|
||||
private void createNodeByPathIterator(Iterator<String> pathIterator, String path, TestCaseNodeDTO treeNode,
|
||||
Map<String, String> pathMap, String projectId, Integer level) {
|
||||
Map<String, String> pathMap, String projectId, Integer level) {
|
||||
|
||||
List<TestCaseNodeDTO> children = treeNode.getChildren();
|
||||
|
||||
if (children == null || children.isEmpty() || !pathIterator.hasNext()) {
|
||||
pathMap.put(path , treeNode.getId());
|
||||
pathMap.put(path, treeNode.getId());
|
||||
if (pathIterator.hasNext()) {
|
||||
createNodeByPath(pathIterator, pathIterator.next().trim(), treeNode, projectId, level, path, pathMap);
|
||||
}
|
||||
|
@ -336,7 +341,8 @@ public class TestCaseNodeService {
|
|||
hasNode = true;
|
||||
createNodeByPathIterator(pathIterator, path + "/" + child.getName(),
|
||||
child, pathMap, projectId, level + 1);
|
||||
};
|
||||
}
|
||||
;
|
||||
}
|
||||
|
||||
//若子节点中不包含该目标节点,则在该节点下创建
|
||||
|
@ -347,10 +353,9 @@ public class TestCaseNodeService {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param pathIterator 迭代器,遍历子节点
|
||||
* @param nodeName 当前节点
|
||||
* @param pNode 父节点
|
||||
* @param nodeName 当前节点
|
||||
* @param pNode 父节点
|
||||
*/
|
||||
private void createNodeByPath(Iterator<String> pathIterator, String nodeName,
|
||||
TestCaseNodeDTO pNode, String projectId, Integer level,
|
||||
|
@ -467,7 +472,7 @@ public class TestCaseNodeService {
|
|||
}
|
||||
|
||||
List<TestCaseNodeDTO> children = rootNode.getChildren();
|
||||
if (children != null && children.size() > 0){
|
||||
if (children != null && children.size() > 0) {
|
||||
for (int i = 0; i < children.size(); i++) {
|
||||
buildUpdateTestCase(children.get(i), testCases, updateNodes, rootPath + '/', rootNode.getId(), level + 1);
|
||||
}
|
||||
|
|
|
@ -1,23 +1,22 @@
|
|||
package io.metersphere.track.service;
|
||||
|
||||
import io.metersphere.base.domain.*;
|
||||
import io.metersphere.base.mapper.*;
|
||||
import io.metersphere.base.mapper.ext.ExtTestCaseMapper;
|
||||
import io.metersphere.base.domain.TestCaseReport;
|
||||
import io.metersphere.base.domain.TestCaseReportExample;
|
||||
import io.metersphere.base.domain.TestCaseReportTemplate;
|
||||
import io.metersphere.base.domain.TestPlan;
|
||||
import io.metersphere.base.mapper.TestCaseReportMapper;
|
||||
import io.metersphere.base.mapper.TestCaseReportTemplateMapper;
|
||||
import io.metersphere.base.mapper.TestPlanMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtTestPlanMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtTestPlanTestCaseMapper;
|
||||
import io.metersphere.commons.constants.TestPlanTestCaseStatus;
|
||||
import io.metersphere.commons.utils.BeanUtils;
|
||||
import io.metersphere.track.request.testCaseReport.CreateReportRequest;
|
||||
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
|
||||
import io.metersphere.track.request.testplancase.QueryTestPlanCaseRequest;
|
||||
import io.metersphere.track.dto.*;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Service
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
|
@ -37,7 +36,7 @@ public class TestCaseReportService {
|
|||
|
||||
public List<TestCaseReport> listTestCaseReport(TestCaseReport request) {
|
||||
TestCaseReportExample example = new TestCaseReportExample();
|
||||
if ( StringUtils.isNotBlank(request.getName()) ) {
|
||||
if (StringUtils.isNotBlank(request.getName())) {
|
||||
example.createCriteria().andNameEqualTo(request.getName());
|
||||
}
|
||||
return testCaseReportMapper.selectByExample(example);
|
||||
|
|
|
@ -26,11 +26,11 @@ public class TestCaseReportTemplateService {
|
|||
TestCaseReportTemplateExample example = new TestCaseReportTemplateExample();
|
||||
TestCaseReportTemplateExample.Criteria criteria1 = example.createCriteria();
|
||||
TestCaseReportTemplateExample.Criteria criteria2 = example.createCriteria();
|
||||
if ( StringUtils.isNotBlank(request.getName()) ) {
|
||||
if (StringUtils.isNotBlank(request.getName())) {
|
||||
criteria1.andNameLike("%" + request.getName() + "%");
|
||||
criteria2.andNameLike("%" + request.getName() + "%");
|
||||
}
|
||||
if ( StringUtils.isNotBlank(request.getWorkspaceId()) ) {
|
||||
if (StringUtils.isNotBlank(request.getWorkspaceId())) {
|
||||
criteria1.andWorkspaceIdEqualTo(request.getWorkspaceId());
|
||||
}
|
||||
if (request.getQueryDefault() != null) {
|
||||
|
@ -55,7 +55,7 @@ public class TestCaseReportTemplateService {
|
|||
testCaseReportTemplateMapper.updateByPrimaryKeyWithBLOBs(testCaseReportTemplate);
|
||||
}
|
||||
|
||||
private void checkCaseReportTemplateExist (TestCaseReportTemplate testCaseReportTemplate) {
|
||||
private void checkCaseReportTemplateExist(TestCaseReportTemplate testCaseReportTemplate) {
|
||||
TestCaseReportTemplateExample example = new TestCaseReportTemplateExample();
|
||||
example.createCriteria()
|
||||
.andNameEqualTo(testCaseReportTemplate.getName())
|
||||
|
|
|
@ -250,7 +250,7 @@ public class TestCaseService {
|
|||
if (!testCases.isEmpty()) {
|
||||
AtomicInteger sort = new AtomicInteger();
|
||||
AtomicInteger num = new AtomicInteger();
|
||||
num.set(getNextNum(projectId)+testCases.size());
|
||||
num.set(getNextNum(projectId) + testCases.size());
|
||||
testCases.forEach(testcase -> {
|
||||
testcase.setNodeId(nodePathMap.get(testcase.getNodePath()));
|
||||
testcase.setSort(sort.getAndIncrement());
|
||||
|
@ -431,6 +431,7 @@ public class TestCaseService {
|
|||
|
||||
/**
|
||||
* 获取项目下一个num (页面展示的ID)
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private int getNextNum(String projectId) {
|
||||
|
@ -438,7 +439,7 @@ public class TestCaseService {
|
|||
if (testCase == null) {
|
||||
return 100001;
|
||||
} else {
|
||||
return Optional.ofNullable(testCase.getNum()+1).orElse(100001);
|
||||
return Optional.ofNullable(testCase.getNum() + 1).orElse(100001);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
package io.metersphere.track.service;
|
||||
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import io.metersphere.base.domain.*;
|
||||
import io.metersphere.base.mapper.*;
|
||||
import io.metersphere.base.mapper.TestCaseMapper;
|
||||
import io.metersphere.base.mapper.TestCaseReportMapper;
|
||||
import io.metersphere.base.mapper.TestPlanMapper;
|
||||
import io.metersphere.base.mapper.TestPlanTestCaseMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtProjectMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtTestPlanMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtTestPlanTestCaseMapper;
|
||||
|
@ -16,15 +18,15 @@ import io.metersphere.commons.user.SessionUser;
|
|||
import io.metersphere.commons.utils.MathUtils;
|
||||
import io.metersphere.commons.utils.ServiceUtils;
|
||||
import io.metersphere.commons.utils.SessionUtils;
|
||||
import io.metersphere.controller.request.ProjectRequest;
|
||||
import io.metersphere.controller.request.member.QueryMemberRequest;
|
||||
import io.metersphere.dto.ProjectDTO;
|
||||
import io.metersphere.i18n.Translator;
|
||||
import io.metersphere.track.Factory.ReportComponentFactory;
|
||||
import io.metersphere.track.domain.ReportComponent;
|
||||
import io.metersphere.track.dto.*;
|
||||
import io.metersphere.track.dto.TestCaseReportMetricDTO;
|
||||
import io.metersphere.track.dto.TestPlanCaseDTO;
|
||||
import io.metersphere.track.dto.TestPlanDTO;
|
||||
import io.metersphere.track.dto.TestPlanDTOWithMetric;
|
||||
import io.metersphere.track.request.testcase.PlanCaseRelevanceRequest;
|
||||
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
|
||||
import io.metersphere.i18n.Translator;
|
||||
import io.metersphere.track.request.testplancase.QueryTestPlanCaseRequest;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.ibatis.session.ExecutorType;
|
||||
|
@ -35,10 +37,8 @@ import org.springframework.stereotype.Service;
|
|||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@Service
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
|
@ -75,7 +75,8 @@ public class TestPlanService {
|
|||
public void addTestPlan(TestPlan testPlan) {
|
||||
if (getTestPlanByName(testPlan.getName()).size() > 0) {
|
||||
MSException.throwException(Translator.get("plan_name_already_exists"));
|
||||
};
|
||||
}
|
||||
;
|
||||
testPlan.setId(UUID.randomUUID().toString());
|
||||
testPlan.setStatus(TestPlanStatus.Prepare.name());
|
||||
testPlan.setCreateTime(System.currentTimeMillis());
|
||||
|
@ -100,7 +101,7 @@ public class TestPlanService {
|
|||
return testPlanMapper.updateByPrimaryKeySelective(testPlan);
|
||||
}
|
||||
|
||||
private void checkTestPlanExist (TestPlan testPlan) {
|
||||
private void checkTestPlanExist(TestPlan testPlan) {
|
||||
if (testPlan.getName() != null) {
|
||||
TestPlanExample example = new TestPlanExample();
|
||||
example.createCriteria()
|
||||
|
@ -142,8 +143,8 @@ public class TestPlanService {
|
|||
|
||||
Map<String, TestCaseWithBLOBs> testCaseMap =
|
||||
testCaseMapper.selectByExampleWithBLOBs(testCaseExample)
|
||||
.stream()
|
||||
.collect(Collectors.toMap(TestCase::getId, testcase -> testcase));
|
||||
.stream()
|
||||
.collect(Collectors.toMap(TestCase::getId, testcase -> testcase));
|
||||
|
||||
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
|
||||
TestPlanTestCaseMapper batchMapper = sqlSession.getMapper(TestPlanTestCaseMapper.class);
|
||||
|
@ -193,7 +194,7 @@ public class TestPlanService {
|
|||
public List<TestPlanDTOWithMetric> listRelateAllPlan() {
|
||||
SessionUser user = SessionUtils.getUser();
|
||||
|
||||
QueryTestPlanRequest request = new QueryTestPlanRequest();
|
||||
QueryTestPlanRequest request = new QueryTestPlanRequest();
|
||||
request.setPrincipal(user.getId());
|
||||
request.setWorkspaceId(SessionUtils.getCurrentWorkspaceId());
|
||||
request.setPlanIds(extTestPlanTestCaseMapper.findRelateTestPlanId(user.getId(), SessionUtils.getCurrentWorkspaceId()));
|
||||
|
@ -231,8 +232,8 @@ public class TestPlanService {
|
|||
}
|
||||
});
|
||||
}
|
||||
testPlan.setPassRate(MathUtils.getPercentWithDecimal(testPlan.getTested() == 0 ? 0 : testPlan.getPassed()*1.0/testPlan.getTested()));
|
||||
testPlan.setTestRate(MathUtils.getPercentWithDecimal(testPlan.getTotal() == 0 ? 0 : testPlan.getTested()*1.0/testPlan.getTotal()));
|
||||
testPlan.setPassRate(MathUtils.getPercentWithDecimal(testPlan.getTested() == 0 ? 0 : testPlan.getPassed() * 1.0 / testPlan.getTested()));
|
||||
testPlan.setTestRate(MathUtils.getPercentWithDecimal(testPlan.getTotal() == 0 ? 0 : testPlan.getTested() * 1.0 / testPlan.getTotal()));
|
||||
});
|
||||
|
||||
return testPlans;
|
||||
|
@ -263,7 +264,7 @@ public class TestPlanService {
|
|||
List<ReportComponent> components = ReportComponentFactory.createComponents(componentIds.toJavaList(String.class), testPlan);
|
||||
|
||||
List<TestPlanCaseDTO> testPlanTestCases = listTestCaseByPlanId(planId);
|
||||
for (TestPlanCaseDTO testCase: testPlanTestCases) {
|
||||
for (TestPlanCaseDTO testCase : testPlanTestCases) {
|
||||
components.forEach(component -> {
|
||||
component.readRecord(testCase);
|
||||
});
|
||||
|
@ -287,7 +288,7 @@ public class TestPlanService {
|
|||
TestPlan testPlan = new TestPlan();
|
||||
testPlan.setId(planId);
|
||||
|
||||
for (String status: statusList){
|
||||
for (String status : statusList) {
|
||||
if (StringUtils.equals(status, TestPlanTestCaseStatus.Prepare.name())
|
||||
|| StringUtils.equals(status, TestPlanTestCaseStatus.Underway.name())) {
|
||||
testPlan.setStatus(TestPlanStatus.Underway.name());
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
package io.metersphere.track.service;
|
||||
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import io.metersphere.base.domain.*;
|
||||
import io.metersphere.base.domain.TestPlan;
|
||||
import io.metersphere.base.domain.TestPlanTestCaseExample;
|
||||
import io.metersphere.base.domain.TestPlanTestCaseWithBLOBs;
|
||||
import io.metersphere.base.domain.User;
|
||||
import io.metersphere.base.mapper.TestPlanTestCaseMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtTestPlanTestCaseMapper;
|
||||
import io.metersphere.commons.constants.TestPlanTestCaseStatus;
|
||||
|
@ -9,11 +12,9 @@ import io.metersphere.commons.user.SessionUser;
|
|||
import io.metersphere.commons.utils.BeanUtils;
|
||||
import io.metersphere.commons.utils.ServiceUtils;
|
||||
import io.metersphere.commons.utils.SessionUtils;
|
||||
import io.metersphere.controller.request.OrderRequest;
|
||||
import io.metersphere.controller.request.member.QueryMemberRequest;
|
||||
import io.metersphere.service.UserService;
|
||||
import io.metersphere.track.dto.TestPlanCaseDTO;
|
||||
import io.metersphere.track.dto.TestPlanDTO;
|
||||
import io.metersphere.track.request.testcase.TestPlanCaseBatchRequest;
|
||||
import io.metersphere.track.request.testplancase.QueryTestPlanCaseRequest;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
|
Loading…
Reference in New Issue