feat(测试跟踪): 完成测试用例操作日志
This commit is contained in:
parent
cf61b0fb78
commit
ede3f0f4d6
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -51,5 +51,7 @@ public class TestCase implements Serializable {
|
|||
|
||||
private String stepModel;
|
||||
|
||||
private String createUser;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -21,5 +21,7 @@ public class TestCaseNode implements Serializable {
|
|||
|
||||
private Double pos;
|
||||
|
||||
private String createUser;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package io.metersphere.log.vo.definition;
|
||||
package io.metersphere.log.vo.api;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
|
@ -1,4 +1,4 @@
|
|||
package io.metersphere.log.vo.definition;
|
||||
package io.metersphere.log.vo.api;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
|
@ -1,4 +1,4 @@
|
|||
package io.metersphere.log.vo.definition;
|
||||
package io.metersphere.log.vo.api;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
|
@ -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", "预期结果");
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue