feat(测试跟踪): 完成测试用例操作日志

This commit is contained in:
fit2-zhao 2021-05-17 18:57:21 +08:00 committed by fit2-zhao
parent cf61b0fb78
commit ede3f0f4d6
27 changed files with 467 additions and 53 deletions

View File

@ -38,7 +38,7 @@ import io.metersphere.job.sechedule.TestPlanTestJob;
import io.metersphere.log.utils.ReflexObjectUtil;
import io.metersphere.log.vo.DetailColumn;
import io.metersphere.log.vo.OperatingLogDetails;
import io.metersphere.log.vo.definition.AutomationReference;
import io.metersphere.log.vo.api.AutomationReference;
import io.metersphere.service.ScheduleService;
import io.metersphere.service.SystemParameterService;
import io.metersphere.track.dto.TestPlanDTO;

View File

@ -36,7 +36,7 @@ import io.metersphere.job.sechedule.SwaggerUrlImportJob;
import io.metersphere.log.utils.ReflexObjectUtil;
import io.metersphere.log.vo.DetailColumn;
import io.metersphere.log.vo.OperatingLogDetails;
import io.metersphere.log.vo.definition.DefinitionReference;
import io.metersphere.log.vo.api.DefinitionReference;
import io.metersphere.service.FileService;
import io.metersphere.service.ScheduleService;
import io.metersphere.service.SystemParameterService;

View File

@ -18,7 +18,7 @@ import io.metersphere.i18n.Translator;
import io.metersphere.log.utils.ReflexObjectUtil;
import io.metersphere.log.vo.DetailColumn;
import io.metersphere.log.vo.OperatingLogDetails;
import io.metersphere.log.vo.definition.ModuleReference;
import io.metersphere.log.vo.api.ModuleReference;
import io.metersphere.service.NodeTreeService;
import io.metersphere.service.ProjectService;
import io.metersphere.track.service.TestPlanApiCaseService;

View File

@ -17,7 +17,7 @@ import io.metersphere.i18n.Translator;
import io.metersphere.log.utils.ReflexObjectUtil;
import io.metersphere.log.vo.DetailColumn;
import io.metersphere.log.vo.OperatingLogDetails;
import io.metersphere.log.vo.definition.ModuleReference;
import io.metersphere.log.vo.api.ModuleReference;
import io.metersphere.service.NodeTreeService;
import io.metersphere.service.ProjectService;
import io.metersphere.track.service.TestPlanProjectService;

View File

@ -27,7 +27,7 @@ import io.metersphere.i18n.Translator;
import io.metersphere.log.utils.ReflexObjectUtil;
import io.metersphere.log.vo.DetailColumn;
import io.metersphere.log.vo.OperatingLogDetails;
import io.metersphere.log.vo.definition.ModuleReference;
import io.metersphere.log.vo.api.ModuleReference;
import io.metersphere.track.service.TestPlanReportService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

View File

@ -27,7 +27,7 @@ import io.metersphere.i18n.Translator;
import io.metersphere.log.utils.ReflexObjectUtil;
import io.metersphere.log.vo.DetailColumn;
import io.metersphere.log.vo.OperatingLogDetails;
import io.metersphere.log.vo.definition.DefinitionReference;
import io.metersphere.log.vo.api.DefinitionReference;
import io.metersphere.service.FileService;
import io.metersphere.service.QuotaService;
import io.metersphere.service.UserService;

View File

@ -1,8 +1,7 @@
package io.metersphere.base.domain;
import lombok.Data;
import java.io.Serializable;
import lombok.Data;
@Data
public class OperatingLog implements Serializable {

View File

@ -1,11 +1,10 @@
package io.metersphere.base.domain;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.io.Serializable;
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)

View File

@ -51,5 +51,7 @@ public class TestCase implements Serializable {
private String stepModel;
private String createUser;
private static final long serialVersionUID = 1L;
}

View File

@ -1673,6 +1673,76 @@ public class TestCaseExample {
addCriterion("step_model not between", value1, value2, "stepModel");
return (Criteria) this;
}
public Criteria andCreateUserIsNull() {
addCriterion("create_user is null");
return (Criteria) this;
}
public Criteria andCreateUserIsNotNull() {
addCriterion("create_user is not null");
return (Criteria) this;
}
public Criteria andCreateUserEqualTo(String value) {
addCriterion("create_user =", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserNotEqualTo(String value) {
addCriterion("create_user <>", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserGreaterThan(String value) {
addCriterion("create_user >", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserGreaterThanOrEqualTo(String value) {
addCriterion("create_user >=", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserLessThan(String value) {
addCriterion("create_user <", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserLessThanOrEqualTo(String value) {
addCriterion("create_user <=", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserLike(String value) {
addCriterion("create_user like", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserNotLike(String value) {
addCriterion("create_user not like", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserIn(List<String> values) {
addCriterion("create_user in", values, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserNotIn(List<String> values) {
addCriterion("create_user not in", values, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserBetween(String value1, String value2) {
addCriterion("create_user between", value1, value2, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserNotBetween(String value1, String value2) {
addCriterion("create_user not between", value1, value2, "createUser");
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {

View File

@ -21,5 +21,7 @@ public class TestCaseNode implements Serializable {
private Double pos;
private String createUser;
private static final long serialVersionUID = 1L;
}

View File

@ -623,6 +623,76 @@ public class TestCaseNodeExample {
addCriterion("pos not between", value1, value2, "pos");
return (Criteria) this;
}
public Criteria andCreateUserIsNull() {
addCriterion("create_user is null");
return (Criteria) this;
}
public Criteria andCreateUserIsNotNull() {
addCriterion("create_user is not null");
return (Criteria) this;
}
public Criteria andCreateUserEqualTo(String value) {
addCriterion("create_user =", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserNotEqualTo(String value) {
addCriterion("create_user <>", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserGreaterThan(String value) {
addCriterion("create_user >", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserGreaterThanOrEqualTo(String value) {
addCriterion("create_user >=", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserLessThan(String value) {
addCriterion("create_user <", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserLessThanOrEqualTo(String value) {
addCriterion("create_user <=", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserLike(String value) {
addCriterion("create_user like", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserNotLike(String value) {
addCriterion("create_user not like", value, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserIn(List<String> values) {
addCriterion("create_user in", values, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserNotIn(List<String> values) {
addCriterion("create_user not in", values, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserBetween(String value1, String value2) {
addCriterion("create_user between", value1, value2, "createUser");
return (Criteria) this;
}
public Criteria andCreateUserNotBetween(String value1, String value2) {
addCriterion("create_user not between", value1, value2, "createUser");
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {

View File

@ -3,9 +3,8 @@ package io.metersphere.base.mapper;
import io.metersphere.base.domain.OperatingLog;
import io.metersphere.base.domain.OperatingLogExample;
import io.metersphere.base.domain.OperatingLogWithBLOBs;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface OperatingLogMapper {
long countByExample(OperatingLogExample example);

View File

@ -25,6 +25,7 @@
<result column="status" jdbcType="VARCHAR" property="status" />
<result column="custom_num" jdbcType="VARCHAR" property="customNum" />
<result column="step_model" jdbcType="VARCHAR" property="stepModel" />
<result column="create_user" jdbcType="VARCHAR" property="createUser" />
</resultMap>
<resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="io.metersphere.base.domain.TestCaseWithBLOBs">
<result column="prerequisite" jdbcType="LONGVARCHAR" property="prerequisite" />
@ -95,7 +96,7 @@
<sql id="Base_Column_List">
id, node_id, node_path, project_id, `name`, `type`, maintainer, priority, `method`,
create_time, update_time, test_id, sort, num, other_test_name, review_status, tags,
demand_id, demand_name, follow_people, `status`, custom_num, step_model
demand_id, demand_name, follow_people, `status`, custom_num, step_model, create_user
</sql>
<sql id="Blob_Column_List">
prerequisite, remark, steps, step_description, expected_result, custom_fields
@ -156,9 +157,10 @@
sort, num, other_test_name,
review_status, tags, demand_id,
demand_name, follow_people, `status`,
custom_num, step_model, prerequisite,
remark, steps, step_description,
expected_result, custom_fields)
custom_num, step_model, create_user,
prerequisite, remark, steps,
step_description, expected_result,
custom_fields)
values (#{id,jdbcType=VARCHAR}, #{nodeId,jdbcType=VARCHAR}, #{nodePath,jdbcType=VARCHAR},
#{projectId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR},
#{maintainer,jdbcType=VARCHAR}, #{priority,jdbcType=VARCHAR}, #{method,jdbcType=VARCHAR},
@ -166,9 +168,10 @@
#{sort,jdbcType=INTEGER}, #{num,jdbcType=INTEGER}, #{otherTestName,jdbcType=VARCHAR},
#{reviewStatus,jdbcType=VARCHAR}, #{tags,jdbcType=VARCHAR}, #{demandId,jdbcType=VARCHAR},
#{demandName,jdbcType=VARCHAR}, #{followPeople,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR},
#{customNum,jdbcType=VARCHAR}, #{stepModel,jdbcType=VARCHAR}, #{prerequisite,jdbcType=LONGVARCHAR},
#{remark,jdbcType=LONGVARCHAR}, #{steps,jdbcType=LONGVARCHAR}, #{stepDescription,jdbcType=LONGVARCHAR},
#{expectedResult,jdbcType=LONGVARCHAR}, #{customFields,jdbcType=LONGVARCHAR})
#{customNum,jdbcType=VARCHAR}, #{stepModel,jdbcType=VARCHAR}, #{createUser,jdbcType=VARCHAR},
#{prerequisite,jdbcType=LONGVARCHAR}, #{remark,jdbcType=LONGVARCHAR}, #{steps,jdbcType=LONGVARCHAR},
#{stepDescription,jdbcType=LONGVARCHAR}, #{expectedResult,jdbcType=LONGVARCHAR},
#{customFields,jdbcType=LONGVARCHAR})
</insert>
<insert id="insertSelective" parameterType="io.metersphere.base.domain.TestCaseWithBLOBs">
insert into test_case
@ -242,6 +245,9 @@
<if test="stepModel != null">
step_model,
</if>
<if test="createUser != null">
create_user,
</if>
<if test="prerequisite != null">
prerequisite,
</if>
@ -331,6 +337,9 @@
<if test="stepModel != null">
#{stepModel,jdbcType=VARCHAR},
</if>
<if test="createUser != null">
#{createUser,jdbcType=VARCHAR},
</if>
<if test="prerequisite != null">
#{prerequisite,jdbcType=LONGVARCHAR},
</if>
@ -429,6 +438,9 @@
<if test="record.stepModel != null">
step_model = #{record.stepModel,jdbcType=VARCHAR},
</if>
<if test="record.createUser != null">
create_user = #{record.createUser,jdbcType=VARCHAR},
</if>
<if test="record.prerequisite != null">
prerequisite = #{record.prerequisite,jdbcType=LONGVARCHAR},
</if>
@ -477,6 +489,7 @@
`status` = #{record.status,jdbcType=VARCHAR},
custom_num = #{record.customNum,jdbcType=VARCHAR},
step_model = #{record.stepModel,jdbcType=VARCHAR},
create_user = #{record.createUser,jdbcType=VARCHAR},
prerequisite = #{record.prerequisite,jdbcType=LONGVARCHAR},
remark = #{record.remark,jdbcType=LONGVARCHAR},
steps = #{record.steps,jdbcType=LONGVARCHAR},
@ -511,7 +524,8 @@
follow_people = #{record.followPeople,jdbcType=VARCHAR},
`status` = #{record.status,jdbcType=VARCHAR},
custom_num = #{record.customNum,jdbcType=VARCHAR},
step_model = #{record.stepModel,jdbcType=VARCHAR}
step_model = #{record.stepModel,jdbcType=VARCHAR},
create_user = #{record.createUser,jdbcType=VARCHAR}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -585,6 +599,9 @@
<if test="stepModel != null">
step_model = #{stepModel,jdbcType=VARCHAR},
</if>
<if test="createUser != null">
create_user = #{createUser,jdbcType=VARCHAR},
</if>
<if test="prerequisite != null">
prerequisite = #{prerequisite,jdbcType=LONGVARCHAR},
</if>
@ -630,6 +647,7 @@
`status` = #{status,jdbcType=VARCHAR},
custom_num = #{customNum,jdbcType=VARCHAR},
step_model = #{stepModel,jdbcType=VARCHAR},
create_user = #{createUser,jdbcType=VARCHAR},
prerequisite = #{prerequisite,jdbcType=LONGVARCHAR},
remark = #{remark,jdbcType=LONGVARCHAR},
steps = #{steps,jdbcType=LONGVARCHAR},
@ -661,7 +679,8 @@
follow_people = #{followPeople,jdbcType=VARCHAR},
`status` = #{status,jdbcType=VARCHAR},
custom_num = #{customNum,jdbcType=VARCHAR},
step_model = #{stepModel,jdbcType=VARCHAR}
step_model = #{stepModel,jdbcType=VARCHAR},
create_user = #{createUser,jdbcType=VARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>

View File

@ -10,6 +10,7 @@
<result column="create_time" jdbcType="BIGINT" property="createTime" />
<result column="update_time" jdbcType="BIGINT" property="updateTime" />
<result column="pos" jdbcType="DOUBLE" property="pos" />
<result column="create_user" jdbcType="VARCHAR" property="createUser" />
</resultMap>
<sql id="Example_Where_Clause">
<where>
@ -70,7 +71,7 @@
</where>
</sql>
<sql id="Base_Column_List">
id, project_id, `name`, parent_id, `level`, create_time, update_time, pos
id, project_id, `name`, parent_id, `level`, create_time, update_time, pos, create_user
</sql>
<select id="selectByExample" parameterType="io.metersphere.base.domain.TestCaseNodeExample" resultMap="BaseResultMap">
select
@ -105,10 +106,12 @@
<insert id="insert" parameterType="io.metersphere.base.domain.TestCaseNode">
insert into test_case_node (id, project_id, `name`,
parent_id, `level`, create_time,
update_time, pos)
update_time, pos, create_user
)
values (#{id,jdbcType=VARCHAR}, #{projectId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR},
#{parentId,jdbcType=VARCHAR}, #{level,jdbcType=INTEGER}, #{createTime,jdbcType=BIGINT},
#{updateTime,jdbcType=BIGINT}, #{pos,jdbcType=DOUBLE})
#{updateTime,jdbcType=BIGINT}, #{pos,jdbcType=DOUBLE}, #{createUser,jdbcType=VARCHAR}
)
</insert>
<insert id="insertSelective" parameterType="io.metersphere.base.domain.TestCaseNode">
insert into test_case_node
@ -137,6 +140,9 @@
<if test="pos != null">
pos,
</if>
<if test="createUser != null">
create_user,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
@ -163,6 +169,9 @@
<if test="pos != null">
#{pos,jdbcType=DOUBLE},
</if>
<if test="createUser != null">
#{createUser,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<select id="countByExample" parameterType="io.metersphere.base.domain.TestCaseNodeExample" resultType="java.lang.Long">
@ -198,6 +207,9 @@
<if test="record.pos != null">
pos = #{record.pos,jdbcType=DOUBLE},
</if>
<if test="record.createUser != null">
create_user = #{record.createUser,jdbcType=VARCHAR},
</if>
</set>
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
@ -212,7 +224,8 @@
`level` = #{record.level,jdbcType=INTEGER},
create_time = #{record.createTime,jdbcType=BIGINT},
update_time = #{record.updateTime,jdbcType=BIGINT},
pos = #{record.pos,jdbcType=DOUBLE}
pos = #{record.pos,jdbcType=DOUBLE},
create_user = #{record.createUser,jdbcType=VARCHAR}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -241,6 +254,9 @@
<if test="pos != null">
pos = #{pos,jdbcType=DOUBLE},
</if>
<if test="createUser != null">
create_user = #{createUser,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
@ -252,7 +268,8 @@
`level` = #{level,jdbcType=INTEGER},
create_time = #{createTime,jdbcType=BIGINT},
update_time = #{updateTime,jdbcType=BIGINT},
pos = #{pos,jdbcType=DOUBLE}
pos = #{pos,jdbcType=DOUBLE},
create_user = #{createUser,jdbcType=VARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>

View File

@ -3,6 +3,7 @@ package io.metersphere.excel.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.metersphere.base.domain.TestCase;
import io.metersphere.base.domain.TestCaseWithBLOBs;
import io.metersphere.commons.constants.TestCaseConstants;
import io.metersphere.commons.utils.BeanUtils;
@ -35,6 +36,25 @@ public class TestCaseDataIgnoreErrorListener extends EasyExcelListener<TestCaseE
Set<String> userIds;
private List<String> names = new LinkedList<>();
private List<String> ids = new LinkedList<>();
public List<String> getNames() {
return this.names;
}
public List<String> getIds() {
return this.ids;
}
public void setNames(List<String> names) {
this.names = names;
}
public void setIds(List<String> ids) {
this.ids = ids;
}
public boolean isUpdated() {
return isUpdated;
}
@ -142,6 +162,8 @@ public class TestCaseDataIgnoreErrorListener extends EasyExcelListener<TestCaseE
.map(item -> this.convert2TestCase(item))
.collect(Collectors.toList());
testCaseService.saveImportData(result, projectId);
this.setNames(result.stream().map(TestCase::getName).collect(Collectors.toList()));
this.setIds(result.stream().map(TestCase::getId).collect(Collectors.toList()));
this.isUpdated = true;
}
@ -150,6 +172,8 @@ public class TestCaseDataIgnoreErrorListener extends EasyExcelListener<TestCaseE
.map(item -> this.convert2TestCaseForUpdate(item))
.collect(Collectors.toList());
testCaseService.updateImportDataCarryId(result2, projectId);
this.setNames(result2.stream().map(TestCase::getName).collect(Collectors.toList()));
this.setIds(result2.stream().map(TestCase::getId).collect(Collectors.toList()));
this.isUpdated = true;
updateList.clear();
}

View File

@ -3,6 +3,7 @@ package io.metersphere.excel.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.metersphere.base.domain.TestCase;
import io.metersphere.base.domain.TestCaseWithBLOBs;
import io.metersphere.commons.constants.TestCaseConstants;
import io.metersphere.commons.utils.BeanUtils;
@ -35,6 +36,9 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
Set<String> userIds;
private List<String> names = new LinkedList<>();
private List<String> ids = new LinkedList<>();
public boolean isUpdated() {
return isUpdated;
}
@ -70,9 +74,9 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
//增加字数校验每一层不能超过100字
for (int i = 0; i < nodes.length; i++) {
String nodeStr = nodes[i];
if(StringUtils.isNotEmpty(nodeStr)){
if(nodeStr.trim().length()>100){
stringBuilder.append(Translator.get("module") + Translator.get("test_track.length_less_than") + "100:"+nodeStr);
if (StringUtils.isNotEmpty(nodeStr)) {
if (nodeStr.trim().length() > 100) {
stringBuilder.append(Translator.get("module") + Translator.get("test_track.length_less_than") + "100:" + nodeStr);
break;
}
}
@ -148,6 +152,22 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
return stringBuilder.toString();
}
public List<String> getNames() {
return this.names;
}
public List<String> getIds() {
return this.ids;
}
public void setNames(List<String> names) {
this.names = names;
}
public void setIds(List<String> ids) {
this.ids = ids;
}
@Override
public void saveData() {
@ -156,12 +176,14 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
return;
}
if (!(list.size() == 0)){
if (!(list.size() == 0)) {
Collections.reverse(list); //因为saveImportData里面是先分配最大的ID这个ID应该先发给list中最后的数据所以要reverse
List<TestCaseWithBLOBs> result = list.stream()
.map(item -> this.convert2TestCase(item))
.collect(Collectors.toList());
testCaseService.saveImportData(result, projectId);
this.setNames(result.stream().map(TestCase::getName).collect(Collectors.toList()));
this.setIds(result.stream().map(TestCase::getId).collect(Collectors.toList()));
this.isUpdated = true;
}
@ -171,6 +193,8 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
.collect(Collectors.toList());
testCaseService.updateImportDataCarryId(result2, projectId);
this.isUpdated = true;
this.setNames(result2.stream().map(TestCase::getName).collect(Collectors.toList()));
this.setIds(result2.stream().map(TestCase::getId).collect(Collectors.toList()));
updateList.clear();
}
@ -208,10 +232,11 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
testCase.setSteps(steps);
}
return testCase;
}
}
/**
* 将Excel中的数据对象转换为用于更新操作的用例数据对象
*
* @param data
* @return
*/
@ -242,10 +267,10 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
}
/**
* 调整tags格式便于前端进行解析
* 例如对于标签1标签2将调整为:["标签1","标签2"]
* 调整tags格式便于前端进行解析
* 例如对于标签1标签2将调整为:["标签1","标签2"]
*/
public String modifyTagPattern(TestCaseExcelData data){
public String modifyTagPattern(TestCaseExcelData data) {
String tags = data.getTags();
try {
if (StringUtils.isNotBlank(tags)) {
@ -338,7 +363,7 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
if (!StringUtils.isEmpty(errMsg)) {
//如果errMsg只有"update testcase"说明用例待更新
if (!errMsg.equals(updateMsg)){
if (!errMsg.equals(updateMsg)) {
ExcelErrData excelErrData = new ExcelErrData(testCaseExcelData, rowIndex,
Translator.get("number") + " " + rowIndex + " " + Translator.get("row") + Translator.get("error")
+ "" + errMsg);

View File

@ -229,6 +229,19 @@ public class MsLogAspect {
msOperLog.setOperUser(SessionUtils.getUserId());
}
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 特殊情况处理
if (StringUtils.isEmpty(msOperLog.getOperTitle())) {
Object title = request.getAttribute("ms-req-title");
if (title != null) {
msOperLog.setOperTitle(title.toString());
}
}
if (StringUtils.isEmpty(msOperLog.getSourceId())) {
Object sourceId = request.getAttribute("ms-req-source-id");
if (sourceId != null) {
msOperLog.setSourceId(sourceId.toString());
}
}
String path = request.getServletPath();
msOperLog.setOperPath(path);

View File

@ -1,4 +1,4 @@
package io.metersphere.log.vo.definition;
package io.metersphere.log.vo.api;
import java.util.LinkedHashMap;
import java.util.Map;

View File

@ -1,4 +1,4 @@
package io.metersphere.log.vo.definition;
package io.metersphere.log.vo.api;
import java.util.LinkedHashMap;
import java.util.Map;

View File

@ -1,4 +1,4 @@
package io.metersphere.log.vo.definition;
package io.metersphere.log.vo.api;
import java.util.LinkedHashMap;
import java.util.Map;

View File

@ -0,0 +1,31 @@
package io.metersphere.log.vo.track;
import java.util.LinkedHashMap;
import java.util.Map;
public class TestCaseReference {
public static Map<String, String> testCaseColumns = new LinkedHashMap<>();
static {
testCaseColumns.clear();
testCaseColumns.put("name", "用例名称");
testCaseColumns.put("createUser", "创建人");
testCaseColumns.put("nodePath", "用例模块");
testCaseColumns.put("type", "用例类型");
testCaseColumns.put("maintainer", "责任人");
testCaseColumns.put("principal", "责任人");
testCaseColumns.put("priority", "用例等级");
testCaseColumns.put("method", "请求类型");
testCaseColumns.put("prerequisite", "前置条件");
testCaseColumns.put("remark", "评论");
testCaseColumns.put("steps", "用例步骤");
testCaseColumns.put("other_test_name", "其他名称");
testCaseColumns.put("review_status", "评审状态");
testCaseColumns.put("tags", "标签");
testCaseColumns.put("demand_name", "需求名称");
testCaseColumns.put("follow_people", "关注人");
testCaseColumns.put("status", "用例状态");
testCaseColumns.put("step_description", "步骤描述");
testCaseColumns.put("expected_result", "预期结果");
}
}

View File

@ -6,11 +6,13 @@ import io.metersphere.base.domain.FileMetadata;
import io.metersphere.base.domain.Project;
import io.metersphere.base.domain.TestCase;
import io.metersphere.base.domain.TestCaseWithBLOBs;
import io.metersphere.commons.constants.OperLogConstants;
import io.metersphere.commons.constants.RoleConstants;
import io.metersphere.commons.utils.PageUtils;
import io.metersphere.commons.utils.Pager;
import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.excel.domain.ExcelResponse;
import io.metersphere.log.annotation.MsAuditLog;
import io.metersphere.service.CheckPermissionService;
import io.metersphere.service.FileService;
import io.metersphere.track.dto.TestCaseDTO;
@ -29,8 +31,10 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.UUID;
@RequestMapping("/test/case")
@RestController
@ -64,7 +68,7 @@ public class TestCaseController {
return testCaseService.listTestCaseForMinder(request);
}
/*jenkins项目下所有接口和性能测试用例*/
/*jenkins项目下所有接口和性能测试用例*/
@GetMapping("/list/method/{projectId}")
public List<TestCaseDTO> listByMethod(@PathVariable String projectId) {
QueryTestCaseRequest request = new QueryTestCaseRequest();
@ -95,13 +99,13 @@ public class TestCaseController {
@PostMapping("/relate/{goPage}/{pageSize}")
public Pager<List<TestCase>> getTestCaseRelateList(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody QueryTestCaseRequest request) {
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
return PageUtils.setPageInfo(page,testCaseService.getTestCaseRelateList(request));
return PageUtils.setPageInfo(page, testCaseService.getTestCaseRelateList(request));
}
@PostMapping("/relate/issue/{goPage}/{pageSize}")
public Pager<List<TestCaseDTO>> getTestCaseIssueRelateList(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody QueryTestCaseRequest request) {
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
return PageUtils.setPageInfo(page,testCaseService.getTestCaseIssueRelateList(request));
return PageUtils.setPageInfo(page, testCaseService.getTestCaseIssueRelateList(request));
}
@PostMapping("/reviews/case/{goPage}/{pageSize}")
@ -124,24 +128,29 @@ public class TestCaseController {
@PostMapping(value = "/add", consumes = {"multipart/form-data"})
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.CREATE, title = "#request.name", content = "#msClass.getLogDetails(#request.id)", msClass = TestCaseService.class)
public String addTestCase(@RequestPart("request") EditTestCaseRequest request, @RequestPart(value = "file") List<MultipartFile> files) {
request.setId(UUID.randomUUID().toString());
return testCaseService.save(request, files);
}
@PostMapping(value = "/edit", consumes = {"multipart/form-data"})
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.UPDATE, beforeEvent = "#msClass.getLogDetails(#request.id)", title = "#request.name", content = "#msClass.getLogDetails(#request.id)", msClass = TestCaseService.class)
public String editTestCase(@RequestPart("request") EditTestCaseRequest request, @RequestPart(value = "file") List<MultipartFile> files) {
return testCaseService.edit(request, files);
}
@PostMapping(value = "/edit/testPlan", consumes = {"multipart/form-data"})
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.UPDATE, beforeEvent = "#msClass.getLogBeforeDetails(#request.id)", title = "#request.name", content = "#msClass.getLogDetails(#request.id)", msClass = TestCaseService.class)
public String editTestCaseByTestPlan(@RequestPart("request") EditTestCaseRequest request, @RequestPart(value = "file") List<MultipartFile> files) {
return testCaseService.editTestCase(request, files);
}
@PostMapping("/delete/{testCaseId}")
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.DELETE, beforeEvent = "#msClass.getLogDetails(#testCaseId)", msClass = TestCaseService.class)
public int deleteTestCase(@PathVariable String testCaseId) {
checkPermissionService.checkTestCaseOwner(testCaseId);
return testCaseService.deleteTestCase(testCaseId);
@ -149,16 +158,18 @@ public class TestCaseController {
@PostMapping("/import/{projectId}/{userId}")
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
public ExcelResponse testCaseImport(MultipartFile file, @PathVariable String projectId, @PathVariable String userId) {
@MsAuditLog(module = "track_test_case", type = OperLogConstants.IMPORT, project = "#projectId")
public ExcelResponse testCaseImport(MultipartFile file, @PathVariable String projectId, @PathVariable String userId, HttpServletRequest request) {
checkPermissionService.checkProjectOwner(projectId);
return testCaseService.testCaseImport(file, projectId, userId);
return testCaseService.testCaseImport(file, projectId, userId, request);
}
@PostMapping("/importIgnoreError/{projectId}/{userId}")
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
public ExcelResponse testCaseImportIgnoreError(MultipartFile file, @PathVariable String projectId, @PathVariable String userId) {
@MsAuditLog(module = "track_test_case", type = OperLogConstants.IMPORT, project = "#projectId")
public ExcelResponse testCaseImportIgnoreError(MultipartFile file, @PathVariable String projectId, @PathVariable String userId, HttpServletRequest request) {
checkPermissionService.checkProjectOwner(projectId);
return testCaseService.testCaseImportIgnoreError(file, projectId, userId);
return testCaseService.testCaseImportIgnoreError(file, projectId, userId, request);
}
@GetMapping("/export/template")
@ -175,18 +186,21 @@ public class TestCaseController {
@PostMapping("/export/testcase")
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.EXPORT, sourceId = "#request.id", title = "#request.name", project = "#request.projectId")
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)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.BATCH_UPDATE, beforeEvent = "#msClass.getLogDetails(#request.ids)", content = "#msClass.getLogDetails(#request.ids)", msClass = TestCaseService.class)
public void editTestCaseBath(@RequestBody TestCaseBatchRequest request) {
testCaseService.editTestCaseBath(request);
}
@PostMapping("/batch/delete")
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.BATCH_DEL, beforeEvent = "#msClass.getLogDetails(#request.ids)", msClass = TestCaseService.class)
public void deleteTestCaseBath(@RequestBody TestCaseBatchRequest request) {
testCaseService.deleteTestCaseBath(request);
}
@ -215,12 +229,15 @@ public class TestCaseController {
}
@PostMapping("/save")
@MsAuditLog(module = "track_test_case", type = OperLogConstants.CREATE, title = "#request.name", content = "#msClass.getLogDetails(#request.id)", msClass = TestCaseService.class)
public TestCaseWithBLOBs saveTestCase(@RequestBody TestCaseWithBLOBs testCaseWithBLOBs) {
testCaseWithBLOBs.setId(UUID.randomUUID().toString());
return testCaseService.addTestCase(testCaseWithBLOBs);
}
@PostMapping("/minder/edit")
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.BATCH_UPDATE, project = "#request.projectId", beforeEvent = "#msClass.getLogDetails(#request.ids)", content = "#msClass.getLogDetails(#request.ids)", msClass = TestCaseService.class)
public void minderEdit(@RequestBody TestCaseMinderEditRequest request) {
testCaseService.minderEdit(request);
}

View File

@ -1,7 +1,9 @@
package io.metersphere.track.controller;
import io.metersphere.base.domain.TestCaseNode;
import io.metersphere.commons.constants.OperLogConstants;
import io.metersphere.commons.constants.RoleConstants;
import io.metersphere.log.annotation.MsAuditLog;
import io.metersphere.service.CheckPermissionService;
import io.metersphere.track.dto.TestCaseNodeDTO;
import io.metersphere.track.request.testcase.DragNodeRequest;
@ -71,18 +73,21 @@ public class TestCaseNodeController {
@PostMapping("/add")
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.CREATE, title = "#node.name", content = "#msClass.getLogDetails(#node)", msClass = TestCaseNodeService.class)
public String addNode(@RequestBody TestCaseNode node) {
return testCaseNodeService.addNode(node);
}
@PostMapping("/edit")
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.UPDATE, beforeEvent = "#msClass.getLogDetails(#node)", title = "#node.name", content = "#msClass.getLogDetails(#node)", msClass = TestCaseNodeService.class)
public int editNode(@RequestBody DragNodeRequest node) {
return testCaseNodeService.editNode(node);
}
@PostMapping("/delete")
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.DELETE, beforeEvent = "#msClass.getLogDetails(#nodeIds)", msClass = TestCaseNodeService.class)
public int deleteNode(@RequestBody List<String> nodeIds) {
//nodeIds 包含删除节点ID及其所有子节点ID
return testCaseNodeService.deleteNode(nodeIds);
@ -90,6 +95,7 @@ public class TestCaseNodeController {
@PostMapping("/drag")
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
@MsAuditLog(module = "track_test_case", type = OperLogConstants.UPDATE, beforeEvent = "#msClass.getLogDetails(#node)", title = "#node.name", content = "#msClass.getLogDetails(#node)", msClass = TestCaseNodeService.class)
public void dragNode(@RequestBody DragNodeRequest node) {
testCaseNodeService.dragNode(node);
}

View File

@ -1,6 +1,7 @@
package io.metersphere.track.service;
import com.alibaba.fastjson.JSON;
import com.google.common.util.concurrent.AtomicDouble;
import io.metersphere.base.domain.*;
import io.metersphere.base.mapper.*;
@ -12,6 +13,10 @@ import io.metersphere.commons.exception.MSException;
import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.exception.ExcelException;
import io.metersphere.i18n.Translator;
import io.metersphere.log.utils.ReflexObjectUtil;
import io.metersphere.log.vo.DetailColumn;
import io.metersphere.log.vo.OperatingLogDetails;
import io.metersphere.log.vo.api.ModuleReference;
import io.metersphere.service.NodeTreeService;
import io.metersphere.track.dto.TestCaseDTO;
import io.metersphere.track.dto.TestCaseNodeDTO;
@ -72,6 +77,7 @@ public class TestCaseNodeService extends NodeTreeService<TestCaseNodeDTO> {
node.setCreateTime(System.currentTimeMillis());
node.setUpdateTime(System.currentTimeMillis());
node.setId(UUID.randomUUID().toString());
node.setCreateUser(SessionUtils.getUserId());
double pos = getNextLevelPos(node.getProjectId(), node.getLevel(), node.getParentId());
node.setPos(pos);
testCaseNodeMapper.insertSelective(node);
@ -114,6 +120,7 @@ public class TestCaseNodeService extends NodeTreeService<TestCaseNodeDTO> {
if (count <= 0) {
TestCaseNode record = new TestCaseNode();
record.setId(UUID.randomUUID().toString());
record.setCreateUser(SessionUtils.getUserId());
record.setName("默认模块");
record.setPos(1.0);
record.setLevel(1);
@ -581,4 +588,46 @@ public class TestCaseNodeService extends NodeTreeService<TestCaseNodeDTO> {
}
}
public String getLogDetails(List<String> ids) {
TestCaseNodeExample example = new TestCaseNodeExample();
example.createCriteria().andIdIn(ids);
List<TestCaseNode> nodes = testCaseNodeMapper.selectByExample(example);
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(nodes)) {
List<String> names = nodes.stream().map(TestCaseNode::getName).collect(Collectors.toList());
OperatingLogDetails details = new OperatingLogDetails(JSON.toJSONString(ids), nodes.get(0).getProjectId(), String.join(",", names), nodes.get(0).getCreateUser(), new LinkedList<>());
return JSON.toJSONString(details);
}
return null;
}
public String getLogDetails(TestCaseNode node) {
TestCaseNode module = null;
if (StringUtils.isNotEmpty(node.getId())) {
module = testCaseNodeMapper.selectByPrimaryKey(node.getId());
}
if (module == null && StringUtils.isNotEmpty(node.getName())) {
TestCaseNodeExample example = new TestCaseNodeExample();
TestCaseNodeExample.Criteria criteria = example.createCriteria();
criteria.andNameEqualTo(node.getName()).andProjectIdEqualTo(node.getProjectId());
if (StringUtils.isNotEmpty(node.getParentId())) {
criteria.andParentIdEqualTo(node.getParentId());
} else {
criteria.andParentIdIsNull();
}
if (StringUtils.isNotEmpty(node.getId())) {
criteria.andIdNotEqualTo(node.getId());
}
List<TestCaseNode> list = testCaseNodeMapper.selectByExample(example);
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(list)) {
module = list.get(0);
}
}
if (module != null) {
List<DetailColumn> columns = ReflexObjectUtil.getColumns(module, ModuleReference.moduleColumns);
OperatingLogDetails details = new OperatingLogDetails(JSON.toJSONString(module.getId()), module.getProjectId(), module.getCreateUser(), columns);
return JSON.toJSONString(details);
}
return null;
}
}

View File

@ -24,6 +24,10 @@ import io.metersphere.excel.listener.TestCaseDataIgnoreErrorListener;
import io.metersphere.excel.listener.TestCaseDataListener;
import io.metersphere.excel.utils.EasyExcelExporter;
import io.metersphere.i18n.Translator;
import io.metersphere.log.utils.ReflexObjectUtil;
import io.metersphere.log.vo.DetailColumn;
import io.metersphere.log.vo.OperatingLogDetails;
import io.metersphere.log.vo.track.TestCaseReference;
import io.metersphere.service.FileService;
import io.metersphere.service.ProjectService;
import io.metersphere.track.dto.TestCaseDTO;
@ -44,6 +48,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.IOException;
@ -115,7 +120,7 @@ public class TestCaseService {
public TestCaseWithBLOBs addTestCase(TestCaseWithBLOBs testCase) {
testCase.setName(testCase.getName());
checkTestCaseExist(testCase);
testCase.setId(UUID.randomUUID().toString());
testCase.setId(testCase.getId());
testCase.setCreateTime(System.currentTimeMillis());
testCase.setUpdateTime(System.currentTimeMillis());
checkTestCustomNum(testCase);
@ -123,6 +128,7 @@ public class TestCaseService {
testCase.setReviewStatus(TestCaseReviewStatus.Prepare.name());
testCase.setDemandId(testCase.getDemandId());
testCase.setDemandName(testCase.getDemandName());
testCase.setCreateUser(SessionUtils.getUserId());
this.setNode(testCase);
testCaseMapper.insert(testCase);
return testCase;
@ -387,7 +393,7 @@ public class TestCaseService {
}
public ExcelResponse testCaseImport(MultipartFile multipartFile, String projectId, String userId) {
public ExcelResponse testCaseImport(MultipartFile multipartFile, String projectId, String userId, HttpServletRequest request) {
ExcelResponse excelResponse = new ExcelResponse();
boolean isUpdated = false; //判断是否更新了用例
@ -417,16 +423,24 @@ public class TestCaseService {
excelResponse.setErrList(errList);
}
if (errList.isEmpty()) {
List<String> names = new LinkedList<>();
List<String> ids = new LinkedList<>();
if (CollectionUtils.isNotEmpty(xmindParser.getNodePaths())) {
testCaseNodeService.createNodes(xmindParser.getNodePaths(), projectId);
}
if (CollectionUtils.isNotEmpty(xmindParser.getTestCase())) {
Collections.reverse(xmindParser.getTestCase());
this.saveImportData(xmindParser.getTestCase(), projectId);
names = xmindParser.getTestCase().stream().map(TestCase::getName).collect(Collectors.toList());
ids = xmindParser.getTestCase().stream().map(TestCase::getId).collect(Collectors.toList());
}
if (CollectionUtils.isNotEmpty(xmindParser.getUpdateTestCase())) {
this.updateImportData(xmindParser.getUpdateTestCase(), projectId);
names.addAll(xmindParser.getUpdateTestCase().stream().map(TestCase::getName).collect(Collectors.toList()));
ids.addAll(xmindParser.getUpdateTestCase().stream().map(TestCase::getId).collect(Collectors.toList()));
}
request.setAttribute("ms-req-title", String.join(",", names));
request.setAttribute("ms-req-source-id", JSON.toJSONString(ids));
}
xmindParser.clear();
} catch (Exception e) {
@ -449,6 +463,8 @@ public class TestCaseService {
TestCaseDataListener easyExcelListener = new TestCaseDataListener(clazz, projectId, testCaseNames, userIds);
//读取excel数据
EasyExcelFactory.read(multipartFile.getInputStream(), clazz, easyExcelListener).sheet().doRead();
request.setAttribute("ms-req-title", String.join(",", easyExcelListener.getNames()));
request.setAttribute("ms-req-source-id", JSON.toJSONString(easyExcelListener.getIds()));
errList = easyExcelListener.getErrList();
isUpdated = easyExcelListener.isUpdated();
@ -639,8 +655,16 @@ public class TestCaseService {
public void testCaseExport(HttpServletResponse response, TestCaseBatchRequest request) {
try {
EasyExcelExporter easyExcelExporter = new EasyExcelExporter(new TestCaseExcelDataFactory().getExcelDataByLocal());
easyExcelExporter.export(response, generateTestCaseExcel(request),
List<TestCaseExcelData> datas = generateTestCaseExcel(request);
easyExcelExporter.export(response, datas,
Translator.get("test_case_import_template_name"), Translator.get("test_case_import_template_sheet"));
if (CollectionUtils.isNotEmpty(datas)) {
List<String> names = datas.stream().map(TestCaseExcelData::getName).collect(Collectors.toList());
request.setName(String.join(",", names));
List<String> ids = request.getIds();
request.setId(JSON.toJSONString(ids));
}
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
MSException.throwException(e);
@ -1031,7 +1055,7 @@ public class TestCaseService {
extTestCaseMapper.updateTestCaseCustomNumByProjectId(projectId);
}
public ExcelResponse testCaseImportIgnoreError(MultipartFile multipartFile, String projectId, String userId) {
public ExcelResponse testCaseImportIgnoreError(MultipartFile multipartFile, String projectId, String userId, HttpServletRequest request) {
ExcelResponse excelResponse = new ExcelResponse();
boolean isUpdated = false; //判断是否更新了用例
@ -1062,9 +1086,14 @@ public class TestCaseService {
}
List<TestCaseWithBLOBs> continueCaseList = xmindParser.getContinueValidatedCase();
if (CollectionUtils.isNotEmpty(continueCaseList) || CollectionUtils.isNotEmpty(xmindParser.getUpdateTestCase())) {
List<String> names = new LinkedList<>();
List<String> ids = new LinkedList<>();
if (CollectionUtils.isNotEmpty(xmindParser.getUpdateTestCase())) {
continueCaseList.removeAll(xmindParser.getUpdateTestCase());
this.updateImportData(xmindParser.getUpdateTestCase(), projectId);
names = xmindParser.getTestCase().stream().map(TestCase::getName).collect(Collectors.toList());
ids = xmindParser.getTestCase().stream().map(TestCase::getId).collect(Collectors.toList());
}
List<String> nodePathList = xmindParser.getValidatedNodePath();
if (CollectionUtils.isNotEmpty(nodePathList)) {
@ -1073,7 +1102,13 @@ public class TestCaseService {
if (CollectionUtils.isNotEmpty(continueCaseList)) {
Collections.reverse(continueCaseList);
this.saveImportData(continueCaseList, projectId);
names.addAll(continueCaseList.stream().map(TestCase::getName).collect(Collectors.toList()));
ids.addAll(continueCaseList.stream().map(TestCase::getId).collect(Collectors.toList()));
}
request.setAttribute("ms-req-title", String.join(",", names));
request.setAttribute("ms-req-source-id", JSON.toJSONString(ids));
}
xmindParser.clear();
} catch (Exception e) {
@ -1096,7 +1131,8 @@ public class TestCaseService {
//读取excel数据
EasyExcelFactory.read(multipartFile.getInputStream(), clazz, easyExcelListener).sheet().doRead();
request.setAttribute("ms-req-title", String.join(",", easyExcelListener.getNames()));
request.setAttribute("ms-req-source-id", JSON.toJSONString(easyExcelListener.getIds()));
errList = easyExcelListener.getErrList();
isUpdated = easyExcelListener.isUpdated();
} catch (Exception e) {
@ -1115,4 +1151,38 @@ public class TestCaseService {
return excelResponse;
}
public String getLogDetails(String id) {
TestCaseWithBLOBs bloBs = testCaseMapper.selectByPrimaryKey(id);
if (bloBs != null) {
List<DetailColumn> columns = ReflexObjectUtil.getColumns(bloBs, TestCaseReference.testCaseColumns);
OperatingLogDetails details = new OperatingLogDetails(JSON.toJSONString(id), bloBs.getProjectId(), bloBs.getName(), bloBs.getCreateUser(), columns);
return JSON.toJSONString(details);
}
return null;
}
public String getLogBeforeDetails(String id) {
TestPlanTestCaseWithBLOBs bloBs = testPlanTestCaseMapper.selectByPrimaryKey(id);
if (bloBs != null) {
String testCaseId = testPlanTestCaseMapper.selectByPrimaryKey(id).getCaseId();
TestCaseWithBLOBs testCaseWithBLOBs = testCaseMapper.selectByPrimaryKey(testCaseId);
List<DetailColumn> columns = ReflexObjectUtil.getColumns(bloBs, TestCaseReference.testCaseColumns);
OperatingLogDetails details = new OperatingLogDetails(JSON.toJSONString(testCaseWithBLOBs.getId()), testCaseWithBLOBs.getProjectId(), testCaseWithBLOBs.getName(), testCaseWithBLOBs.getCreateUser(), columns);
return JSON.toJSONString(details);
}
return null;
}
public String getLogDetails(List<String> ids) {
if (CollectionUtils.isNotEmpty(ids)) {
TestCaseExample example = new TestCaseExample();
example.createCriteria().andIdIn(ids);
List<TestCase> definitions = testCaseMapper.selectByExample(example);
List<String> names = definitions.stream().map(TestCase::getName).collect(Collectors.toList());
OperatingLogDetails details = new OperatingLogDetails(JSON.toJSONString(ids), definitions.get(0).getProjectId(), String.join(",", names), definitions.get(0).getCreateUser(), new LinkedList<>());
return JSON.toJSONString(details);
}
return null;
}
}

View File

@ -41,13 +41,13 @@ CREATE TABLE `operating_log` (
`oper_method` varchar(500) DEFAULT NULL COMMENT 'operating method',
`create_user` varchar(100) DEFAULT NULL COMMENT 'source create u',
`oper_user` varchar(50) DEFAULT NULL COMMENT 'operating user id',
`source_id` varchar(2000) DEFAULT NULL COMMENT 'operating source id',
`source_id` varchar(6000) DEFAULT NULL COMMENT 'operating source id',
`oper_type` varchar(100) DEFAULT NULL COMMENT 'operating type',
`oper_module` varchar(64) DEFAULT NULL COMMENT 'operating module',
`oper_title` varchar(2000) DEFAULT NULL COMMENT 'operating title',
`oper_title` varchar(6000) DEFAULT NULL COMMENT 'operating title',
`oper_path` varchar(500) DEFAULT NULL COMMENT 'operating path',
`oper_content` longtext COMMENT 'operating content',
`oper_params` longtext COMMENT 'operating parrams',
`oper_params` longtext COMMENT 'operating params',
`oper_time` bigint(13) NOT NULL COMMENT 'Update timestamp',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
@ -58,3 +58,5 @@ ALTER TABLE api_module ADD create_user VARCHAR(100) NULL;
ALTER TABLE api_scenario ADD create_user VARCHAR(100) NULL;
ALTER TABLE api_scenario_module ADD create_user VARCHAR(100) NULL;
ALTER TABLE api_scenario_report ADD create_user VARCHAR(100) NULL;
ALTER TABLE test_case_node ADD create_user VARCHAR(100) NULL;
ALTER TABLE test_case ADD create_user VARCHAR(100) NULL;