feat(接口测试): 测试计划整体执行,重跑逻辑
--task=1016918 --user=陈建星 失败重跑 https://www.tapd.cn/55049933/s/1609836
This commit is contained in:
parent
87eabd9129
commit
fa013cfe97
|
@ -1,11 +1,8 @@
|
|||
package io.metersphere.system.domain;
|
||||
|
||||
import io.metersphere.validation.groups.Created;
|
||||
import io.metersphere.validation.groups.Updated;
|
||||
import io.metersphere.validation.groups.*;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import jakarta.validation.constraints.Size;
|
||||
import jakarta.validation.constraints.*;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
@ -80,6 +77,10 @@ public class ExecTask implements Serializable {
|
|||
@NotNull(message = "{exec_task.deleted.not_blank}", groups = {Created.class})
|
||||
private Boolean deleted;
|
||||
|
||||
@Schema(description = "是否是并行执行", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "{exec_task.parallel.not_blank}", groups = {Created.class})
|
||||
private Boolean parallel;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public enum Column {
|
||||
|
@ -94,12 +95,13 @@ public class ExecTask implements Serializable {
|
|||
triggerMode("trigger_mode", "triggerMode", "VARCHAR", false),
|
||||
projectId("project_id", "projectId", "VARCHAR", false),
|
||||
organizationId("organization_id", "organizationId", "VARCHAR", false),
|
||||
integrated("integrated", "integrated", "BIT", false),
|
||||
createTime("create_time", "createTime", "BIGINT", false),
|
||||
createUser("create_user", "createUser", "VARCHAR", false),
|
||||
startTime("start_time", "startTime", "BIGINT", false),
|
||||
endTime("end_time", "endTime", "BIGINT", false),
|
||||
integrated("integrated", "integrated", "BIT", false),
|
||||
deleted("deleted", "deleted", "BIT", false);
|
||||
deleted("deleted", "deleted", "BIT", false),
|
||||
parallel("parallel", "parallel", "BIT", false);
|
||||
|
||||
private static final String BEGINNING_DELIMITER = "`";
|
||||
|
||||
|
|
|
@ -574,6 +574,76 @@ public class ExecTaskExample {
|
|||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdIsNull() {
|
||||
addCriterion("resource_id is null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdIsNotNull() {
|
||||
addCriterion("resource_id is not null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdEqualTo(String value) {
|
||||
addCriterion("resource_id =", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdNotEqualTo(String value) {
|
||||
addCriterion("resource_id <>", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdGreaterThan(String value) {
|
||||
addCriterion("resource_id >", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdGreaterThanOrEqualTo(String value) {
|
||||
addCriterion("resource_id >=", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdLessThan(String value) {
|
||||
addCriterion("resource_id <", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdLessThanOrEqualTo(String value) {
|
||||
addCriterion("resource_id <=", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdLike(String value) {
|
||||
addCriterion("resource_id like", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdNotLike(String value) {
|
||||
addCriterion("resource_id not like", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdIn(List<String> values) {
|
||||
addCriterion("resource_id in", values, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdNotIn(List<String> values) {
|
||||
addCriterion("resource_id not in", values, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdBetween(String value1, String value2) {
|
||||
addCriterion("resource_id between", value1, value2, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdNotBetween(String value1, String value2) {
|
||||
addCriterion("resource_id not between", value1, value2, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andTriggerModeIsNull() {
|
||||
addCriterion("trigger_mode is null");
|
||||
return (Criteria) this;
|
||||
|
@ -784,6 +854,66 @@ public class ExecTaskExample {
|
|||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedIsNull() {
|
||||
addCriterion("integrated is null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedIsNotNull() {
|
||||
addCriterion("integrated is not null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedEqualTo(Boolean value) {
|
||||
addCriterion("integrated =", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedNotEqualTo(Boolean value) {
|
||||
addCriterion("integrated <>", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedGreaterThan(Boolean value) {
|
||||
addCriterion("integrated >", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedGreaterThanOrEqualTo(Boolean value) {
|
||||
addCriterion("integrated >=", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedLessThan(Boolean value) {
|
||||
addCriterion("integrated <", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedLessThanOrEqualTo(Boolean value) {
|
||||
addCriterion("integrated <=", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedIn(List<Boolean> values) {
|
||||
addCriterion("integrated in", values, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedNotIn(List<Boolean> values) {
|
||||
addCriterion("integrated not in", values, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedBetween(Boolean value1, Boolean value2) {
|
||||
addCriterion("integrated between", value1, value2, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedNotBetween(Boolean value1, Boolean value2) {
|
||||
addCriterion("integrated not between", value1, value2, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andCreateTimeIsNull() {
|
||||
addCriterion("create_time is null");
|
||||
return (Criteria) this;
|
||||
|
@ -1034,136 +1164,6 @@ public class ExecTaskExample {
|
|||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedIsNull() {
|
||||
addCriterion("integrated is null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedIsNotNull() {
|
||||
addCriterion("integrated is not null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedEqualTo(Boolean value) {
|
||||
addCriterion("integrated =", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedNotEqualTo(Boolean value) {
|
||||
addCriterion("integrated <>", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedGreaterThan(Boolean value) {
|
||||
addCriterion("integrated >", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedGreaterThanOrEqualTo(Boolean value) {
|
||||
addCriterion("integrated >=", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedLessThan(Boolean value) {
|
||||
addCriterion("integrated <", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedLessThanOrEqualTo(Boolean value) {
|
||||
addCriterion("integrated <=", value, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedIn(List<Boolean> values) {
|
||||
addCriterion("integrated in", values, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedNotIn(List<Boolean> values) {
|
||||
addCriterion("integrated not in", values, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedBetween(Boolean value1, Boolean value2) {
|
||||
addCriterion("integrated between", value1, value2, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andIntegratedNotBetween(Boolean value1, Boolean value2) {
|
||||
addCriterion("integrated not between", value1, value2, "integrated");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdIsNull() {
|
||||
addCriterion("resource_id is null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdIsNotNull() {
|
||||
addCriterion("resource_id is not null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdEqualTo(String value) {
|
||||
addCriterion("resource_id =", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdNotEqualTo(String value) {
|
||||
addCriterion("resource_id <>", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdGreaterThan(String value) {
|
||||
addCriterion("resource_id >", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdGreaterThanOrEqualTo(String value) {
|
||||
addCriterion("resource_id >=", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdLessThan(String value) {
|
||||
addCriterion("resource_id <", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdLessThanOrEqualTo(String value) {
|
||||
addCriterion("resource_id <=", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdLike(String value) {
|
||||
addCriterion("resource_id like", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdNotLike(String value) {
|
||||
addCriterion("resource_id not like", value, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdIn(List<String> values) {
|
||||
addCriterion("resource_id in", values, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdNotIn(List<String> values) {
|
||||
addCriterion("resource_id not in", values, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdBetween(String value1, String value2) {
|
||||
addCriterion("resource_id between", value1, value2, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andResourceIdNotBetween(String value1, String value2) {
|
||||
addCriterion("resource_id not between", value1, value2, "resourceId");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andDeletedIsNull() {
|
||||
addCriterion("deleted is null");
|
||||
return (Criteria) this;
|
||||
|
@ -1223,6 +1223,66 @@ public class ExecTaskExample {
|
|||
addCriterion("deleted not between", value1, value2, "deleted");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelIsNull() {
|
||||
addCriterion("parallel is null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelIsNotNull() {
|
||||
addCriterion("parallel is not null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelEqualTo(Boolean value) {
|
||||
addCriterion("parallel =", value, "parallel");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelNotEqualTo(Boolean value) {
|
||||
addCriterion("parallel <>", value, "parallel");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelGreaterThan(Boolean value) {
|
||||
addCriterion("parallel >", value, "parallel");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelGreaterThanOrEqualTo(Boolean value) {
|
||||
addCriterion("parallel >=", value, "parallel");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelLessThan(Boolean value) {
|
||||
addCriterion("parallel <", value, "parallel");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelLessThanOrEqualTo(Boolean value) {
|
||||
addCriterion("parallel <=", value, "parallel");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelIn(List<Boolean> values) {
|
||||
addCriterion("parallel in", values, "parallel");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelNotIn(List<Boolean> values) {
|
||||
addCriterion("parallel not in", values, "parallel");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelBetween(Boolean value1, Boolean value2) {
|
||||
addCriterion("parallel between", value1, value2, "parallel");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andParallelNotBetween(Boolean value1, Boolean value2) {
|
||||
addCriterion("parallel not between", value1, value2, "parallel");
|
||||
return (Criteria) this;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Criteria extends GeneratedCriteria {
|
||||
|
|
|
@ -91,6 +91,9 @@ public class ExecTaskItem implements Serializable {
|
|||
@Schema(description = "异常信息")
|
||||
private String errorMessage;
|
||||
|
||||
@Schema(description = "是否是重跑任务项")
|
||||
private Boolean rerun;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public enum Column {
|
||||
|
@ -113,7 +116,8 @@ public class ExecTaskItem implements Serializable {
|
|||
collectionId("collection_id", "collectionId", "VARCHAR", false),
|
||||
deleted("deleted", "deleted", "BIT", false),
|
||||
caseId("case_id", "caseId", "VARCHAR", false),
|
||||
errorMessage("error_message", "errorMessage", "VARCHAR", false);
|
||||
errorMessage("error_message", "errorMessage", "VARCHAR", false),
|
||||
rerun("rerun", "rerun", "BIT", false);
|
||||
|
||||
private static final String BEGINNING_DELIMITER = "`";
|
||||
|
||||
|
|
|
@ -1473,6 +1473,66 @@ public class ExecTaskItemExample {
|
|||
addCriterion("error_message not between", value1, value2, "errorMessage");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunIsNull() {
|
||||
addCriterion("rerun is null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunIsNotNull() {
|
||||
addCriterion("rerun is not null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunEqualTo(Boolean value) {
|
||||
addCriterion("rerun =", value, "rerun");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunNotEqualTo(Boolean value) {
|
||||
addCriterion("rerun <>", value, "rerun");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunGreaterThan(Boolean value) {
|
||||
addCriterion("rerun >", value, "rerun");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunGreaterThanOrEqualTo(Boolean value) {
|
||||
addCriterion("rerun >=", value, "rerun");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunLessThan(Boolean value) {
|
||||
addCriterion("rerun <", value, "rerun");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunLessThanOrEqualTo(Boolean value) {
|
||||
addCriterion("rerun <=", value, "rerun");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunIn(List<Boolean> values) {
|
||||
addCriterion("rerun in", values, "rerun");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunNotIn(List<Boolean> values) {
|
||||
addCriterion("rerun not in", values, "rerun");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunBetween(Boolean value1, Boolean value2) {
|
||||
addCriterion("rerun between", value1, value2, "rerun");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andRerunNotBetween(Boolean value1, Boolean value2) {
|
||||
addCriterion("rerun not between", value1, value2, "rerun");
|
||||
return (Criteria) this;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Criteria extends GeneratedCriteria {
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
<result column="deleted" jdbcType="BIT" property="deleted" />
|
||||
<result column="case_id" jdbcType="VARCHAR" property="caseId" />
|
||||
<result column="error_message" jdbcType="VARCHAR" property="errorMessage" />
|
||||
<result column="rerun" jdbcType="BIT" property="rerun" />
|
||||
</resultMap>
|
||||
<sql id="Example_Where_Clause">
|
||||
<where>
|
||||
|
@ -84,7 +85,7 @@
|
|||
<sql id="Base_Column_List">
|
||||
id, task_id, resource_id, resource_name, task_origin, `status`, `result`, resource_pool_id,
|
||||
resource_pool_node, resource_type, project_id, organization_id, thread_id, start_time,
|
||||
end_time, executor, collection_id, deleted, case_id, error_message
|
||||
end_time, executor, collection_id, deleted, case_id, error_message, rerun
|
||||
</sql>
|
||||
<select id="selectByExample" parameterType="io.metersphere.system.domain.ExecTaskItemExample" resultMap="BaseResultMap">
|
||||
select
|
||||
|
@ -123,14 +124,16 @@
|
|||
resource_type, project_id, organization_id,
|
||||
thread_id, start_time, end_time,
|
||||
executor, collection_id, deleted,
|
||||
case_id, error_message)
|
||||
case_id, error_message, rerun
|
||||
)
|
||||
values (#{id,jdbcType=VARCHAR}, #{taskId,jdbcType=VARCHAR}, #{resourceId,jdbcType=VARCHAR},
|
||||
#{resourceName,jdbcType=VARCHAR}, #{taskOrigin,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR},
|
||||
#{result,jdbcType=VARCHAR}, #{resourcePoolId,jdbcType=VARCHAR}, #{resourcePoolNode,jdbcType=VARCHAR},
|
||||
#{resourceType,jdbcType=VARCHAR}, #{projectId,jdbcType=VARCHAR}, #{organizationId,jdbcType=VARCHAR},
|
||||
#{threadId,jdbcType=VARCHAR}, #{startTime,jdbcType=BIGINT}, #{endTime,jdbcType=BIGINT},
|
||||
#{executor,jdbcType=VARCHAR}, #{collectionId,jdbcType=VARCHAR}, #{deleted,jdbcType=BIT},
|
||||
#{caseId,jdbcType=VARCHAR}, #{errorMessage,jdbcType=VARCHAR})
|
||||
#{caseId,jdbcType=VARCHAR}, #{errorMessage,jdbcType=VARCHAR}, #{rerun,jdbcType=BIT}
|
||||
)
|
||||
</insert>
|
||||
<insert id="insertSelective" parameterType="io.metersphere.system.domain.ExecTaskItem">
|
||||
insert into exec_task_item
|
||||
|
@ -195,6 +198,9 @@
|
|||
<if test="errorMessage != null">
|
||||
error_message,
|
||||
</if>
|
||||
<if test="rerun != null">
|
||||
rerun,
|
||||
</if>
|
||||
</trim>
|
||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||
<if test="id != null">
|
||||
|
@ -257,6 +263,9 @@
|
|||
<if test="errorMessage != null">
|
||||
#{errorMessage,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="rerun != null">
|
||||
#{rerun,jdbcType=BIT},
|
||||
</if>
|
||||
</trim>
|
||||
</insert>
|
||||
<select id="countByExample" parameterType="io.metersphere.system.domain.ExecTaskItemExample" resultType="java.lang.Long">
|
||||
|
@ -328,6 +337,9 @@
|
|||
<if test="record.errorMessage != null">
|
||||
error_message = #{record.errorMessage,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="record.rerun != null">
|
||||
rerun = #{record.rerun,jdbcType=BIT},
|
||||
</if>
|
||||
</set>
|
||||
<if test="_parameter != null">
|
||||
<include refid="Update_By_Example_Where_Clause" />
|
||||
|
@ -354,7 +366,8 @@
|
|||
collection_id = #{record.collectionId,jdbcType=VARCHAR},
|
||||
deleted = #{record.deleted,jdbcType=BIT},
|
||||
case_id = #{record.caseId,jdbcType=VARCHAR},
|
||||
error_message = #{record.errorMessage,jdbcType=VARCHAR}
|
||||
error_message = #{record.errorMessage,jdbcType=VARCHAR},
|
||||
rerun = #{record.rerun,jdbcType=BIT}
|
||||
<if test="_parameter != null">
|
||||
<include refid="Update_By_Example_Where_Clause" />
|
||||
</if>
|
||||
|
@ -419,6 +432,9 @@
|
|||
<if test="errorMessage != null">
|
||||
error_message = #{errorMessage,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="rerun != null">
|
||||
rerun = #{rerun,jdbcType=BIT},
|
||||
</if>
|
||||
</set>
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
</update>
|
||||
|
@ -442,14 +458,15 @@
|
|||
collection_id = #{collectionId,jdbcType=VARCHAR},
|
||||
deleted = #{deleted,jdbcType=BIT},
|
||||
case_id = #{caseId,jdbcType=VARCHAR},
|
||||
error_message = #{errorMessage,jdbcType=VARCHAR}
|
||||
error_message = #{errorMessage,jdbcType=VARCHAR},
|
||||
rerun = #{rerun,jdbcType=BIT}
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
</update>
|
||||
<insert id="batchInsert" parameterType="map">
|
||||
insert into exec_task_item
|
||||
(id, task_id, resource_id, resource_name, task_origin, `status`, `result`, resource_pool_id,
|
||||
resource_pool_node, resource_type, project_id, organization_id, thread_id, start_time,
|
||||
end_time, executor, collection_id, deleted, case_id, error_message)
|
||||
end_time, executor, collection_id, deleted, case_id, error_message, rerun)
|
||||
values
|
||||
<foreach collection="list" item="item" separator=",">
|
||||
(#{item.id,jdbcType=VARCHAR}, #{item.taskId,jdbcType=VARCHAR}, #{item.resourceId,jdbcType=VARCHAR},
|
||||
|
@ -458,7 +475,8 @@
|
|||
#{item.resourceType,jdbcType=VARCHAR}, #{item.projectId,jdbcType=VARCHAR}, #{item.organizationId,jdbcType=VARCHAR},
|
||||
#{item.threadId,jdbcType=VARCHAR}, #{item.startTime,jdbcType=BIGINT}, #{item.endTime,jdbcType=BIGINT},
|
||||
#{item.executor,jdbcType=VARCHAR}, #{item.collectionId,jdbcType=VARCHAR}, #{item.deleted,jdbcType=BIT},
|
||||
#{item.caseId,jdbcType=VARCHAR}, #{item.errorMessage,jdbcType=VARCHAR})
|
||||
#{item.caseId,jdbcType=VARCHAR}, #{item.errorMessage,jdbcType=VARCHAR}, #{item.rerun,jdbcType=BIT}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
<insert id="batchInsertSelective" parameterType="map">
|
||||
|
@ -531,6 +549,9 @@
|
|||
<if test="'error_message'.toString() == column.value">
|
||||
#{item.errorMessage,jdbcType=VARCHAR}
|
||||
</if>
|
||||
<if test="'rerun'.toString() == column.value">
|
||||
#{item.rerun,jdbcType=BIT}
|
||||
</if>
|
||||
</foreach>
|
||||
)
|
||||
</foreach>
|
||||
|
|
|
@ -9,16 +9,17 @@
|
|||
<result column="case_count" jdbcType="BIGINT" property="caseCount" />
|
||||
<result column="result" jdbcType="VARCHAR" property="result" />
|
||||
<result column="task_type" jdbcType="VARCHAR" property="taskType" />
|
||||
<result column="resource_id" jdbcType="VARCHAR" property="resourceId" />
|
||||
<result column="trigger_mode" jdbcType="VARCHAR" property="triggerMode" />
|
||||
<result column="project_id" jdbcType="VARCHAR" property="projectId" />
|
||||
<result column="organization_id" jdbcType="VARCHAR" property="organizationId" />
|
||||
<result column="integrated" jdbcType="BIT" property="integrated" />
|
||||
<result column="create_time" jdbcType="BIGINT" property="createTime" />
|
||||
<result column="create_user" jdbcType="VARCHAR" property="createUser" />
|
||||
<result column="start_time" jdbcType="BIGINT" property="startTime" />
|
||||
<result column="end_time" jdbcType="BIGINT" property="endTime" />
|
||||
<result column="integrated" jdbcType="BIT" property="integrated" />
|
||||
<result column="resource_id" jdbcType="VARCHAR" property="resourceId" />
|
||||
<result column="deleted" jdbcType="BIT" property="deleted" />
|
||||
<result column="parallel" jdbcType="BIT" property="parallel" />
|
||||
</resultMap>
|
||||
<sql id="Example_Where_Clause">
|
||||
<where>
|
||||
|
@ -79,9 +80,9 @@
|
|||
</where>
|
||||
</sql>
|
||||
<sql id="Base_Column_List">
|
||||
id, num, task_name, `status`, case_count, `result`, task_type, trigger_mode, project_id,
|
||||
organization_id, create_time, create_user, start_time, end_time, integrated, resource_id,
|
||||
deleted
|
||||
id, num, task_name, `status`, case_count, `result`, task_type, resource_id, trigger_mode,
|
||||
project_id, organization_id, integrated, create_time, create_user, start_time, end_time,
|
||||
deleted, parallel
|
||||
</sql>
|
||||
<select id="selectByExample" parameterType="io.metersphere.system.domain.ExecTaskExample" resultMap="BaseResultMap">
|
||||
select
|
||||
|
@ -116,16 +117,16 @@
|
|||
<insert id="insert" parameterType="io.metersphere.system.domain.ExecTask">
|
||||
insert into exec_task (id, num, task_name,
|
||||
`status`, case_count, `result`,
|
||||
task_type, trigger_mode, project_id,
|
||||
organization_id, create_time, create_user,
|
||||
start_time, end_time, integrated,
|
||||
resource_id, deleted)
|
||||
task_type, resource_id, trigger_mode,
|
||||
project_id, organization_id, integrated,
|
||||
create_time, create_user, start_time,
|
||||
end_time, deleted, parallel)
|
||||
values (#{id,jdbcType=VARCHAR}, #{num,jdbcType=BIGINT}, #{taskName,jdbcType=VARCHAR},
|
||||
#{status,jdbcType=VARCHAR}, #{caseCount,jdbcType=BIGINT}, #{result,jdbcType=VARCHAR},
|
||||
#{taskType,jdbcType=VARCHAR}, #{triggerMode,jdbcType=VARCHAR}, #{projectId,jdbcType=VARCHAR},
|
||||
#{organizationId,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, #{createUser,jdbcType=VARCHAR},
|
||||
#{startTime,jdbcType=BIGINT}, #{endTime,jdbcType=BIGINT}, #{integrated,jdbcType=BIT},
|
||||
#{resourceId,jdbcType=VARCHAR}, #{deleted,jdbcType=BIT})
|
||||
#{taskType,jdbcType=VARCHAR}, #{resourceId,jdbcType=VARCHAR}, #{triggerMode,jdbcType=VARCHAR},
|
||||
#{projectId,jdbcType=VARCHAR}, #{organizationId,jdbcType=VARCHAR}, #{integrated,jdbcType=BIT},
|
||||
#{createTime,jdbcType=BIGINT}, #{createUser,jdbcType=VARCHAR}, #{startTime,jdbcType=BIGINT},
|
||||
#{endTime,jdbcType=BIGINT}, #{deleted,jdbcType=BIT}, #{parallel,jdbcType=BIT})
|
||||
</insert>
|
||||
<insert id="insertSelective" parameterType="io.metersphere.system.domain.ExecTask">
|
||||
insert into exec_task
|
||||
|
@ -151,6 +152,9 @@
|
|||
<if test="taskType != null">
|
||||
task_type,
|
||||
</if>
|
||||
<if test="resourceId != null">
|
||||
resource_id,
|
||||
</if>
|
||||
<if test="triggerMode != null">
|
||||
trigger_mode,
|
||||
</if>
|
||||
|
@ -160,6 +164,9 @@
|
|||
<if test="organizationId != null">
|
||||
organization_id,
|
||||
</if>
|
||||
<if test="integrated != null">
|
||||
integrated,
|
||||
</if>
|
||||
<if test="createTime != null">
|
||||
create_time,
|
||||
</if>
|
||||
|
@ -172,15 +179,12 @@
|
|||
<if test="endTime != null">
|
||||
end_time,
|
||||
</if>
|
||||
<if test="integrated != null">
|
||||
integrated,
|
||||
</if>
|
||||
<if test="resourceId != null">
|
||||
resource_id,
|
||||
</if>
|
||||
<if test="deleted != null">
|
||||
deleted,
|
||||
</if>
|
||||
<if test="parallel != null">
|
||||
parallel,
|
||||
</if>
|
||||
</trim>
|
||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||
<if test="id != null">
|
||||
|
@ -204,6 +208,9 @@
|
|||
<if test="taskType != null">
|
||||
#{taskType,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="resourceId != null">
|
||||
#{resourceId,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="triggerMode != null">
|
||||
#{triggerMode,jdbcType=VARCHAR},
|
||||
</if>
|
||||
|
@ -213,6 +220,9 @@
|
|||
<if test="organizationId != null">
|
||||
#{organizationId,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="integrated != null">
|
||||
#{integrated,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="createTime != null">
|
||||
#{createTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
|
@ -225,15 +235,12 @@
|
|||
<if test="endTime != null">
|
||||
#{endTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="integrated != null">
|
||||
#{integrated,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="resourceId != null">
|
||||
#{resourceId,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="deleted != null">
|
||||
#{deleted,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="parallel != null">
|
||||
#{parallel,jdbcType=BIT},
|
||||
</if>
|
||||
</trim>
|
||||
</insert>
|
||||
<select id="countByExample" parameterType="io.metersphere.system.domain.ExecTaskExample" resultType="java.lang.Long">
|
||||
|
@ -266,6 +273,9 @@
|
|||
<if test="record.taskType != null">
|
||||
task_type = #{record.taskType,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="record.resourceId != null">
|
||||
resource_id = #{record.resourceId,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="record.triggerMode != null">
|
||||
trigger_mode = #{record.triggerMode,jdbcType=VARCHAR},
|
||||
</if>
|
||||
|
@ -275,6 +285,9 @@
|
|||
<if test="record.organizationId != null">
|
||||
organization_id = #{record.organizationId,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="record.integrated != null">
|
||||
integrated = #{record.integrated,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="record.createTime != null">
|
||||
create_time = #{record.createTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
|
@ -287,15 +300,12 @@
|
|||
<if test="record.endTime != null">
|
||||
end_time = #{record.endTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="record.integrated != null">
|
||||
integrated = #{record.integrated,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="record.resourceId != null">
|
||||
resource_id = #{record.resourceId,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="record.deleted != null">
|
||||
deleted = #{record.deleted,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="record.parallel != null">
|
||||
parallel = #{record.parallel,jdbcType=BIT},
|
||||
</if>
|
||||
</set>
|
||||
<if test="_parameter != null">
|
||||
<include refid="Update_By_Example_Where_Clause" />
|
||||
|
@ -310,16 +320,17 @@
|
|||
case_count = #{record.caseCount,jdbcType=BIGINT},
|
||||
`result` = #{record.result,jdbcType=VARCHAR},
|
||||
task_type = #{record.taskType,jdbcType=VARCHAR},
|
||||
resource_id = #{record.resourceId,jdbcType=VARCHAR},
|
||||
trigger_mode = #{record.triggerMode,jdbcType=VARCHAR},
|
||||
project_id = #{record.projectId,jdbcType=VARCHAR},
|
||||
organization_id = #{record.organizationId,jdbcType=VARCHAR},
|
||||
integrated = #{record.integrated,jdbcType=BIT},
|
||||
create_time = #{record.createTime,jdbcType=BIGINT},
|
||||
create_user = #{record.createUser,jdbcType=VARCHAR},
|
||||
start_time = #{record.startTime,jdbcType=BIGINT},
|
||||
end_time = #{record.endTime,jdbcType=BIGINT},
|
||||
integrated = #{record.integrated,jdbcType=BIT},
|
||||
resource_id = #{record.resourceId,jdbcType=VARCHAR},
|
||||
deleted = #{record.deleted,jdbcType=BIT}
|
||||
deleted = #{record.deleted,jdbcType=BIT},
|
||||
parallel = #{record.parallel,jdbcType=BIT}
|
||||
<if test="_parameter != null">
|
||||
<include refid="Update_By_Example_Where_Clause" />
|
||||
</if>
|
||||
|
@ -345,6 +356,9 @@
|
|||
<if test="taskType != null">
|
||||
task_type = #{taskType,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="resourceId != null">
|
||||
resource_id = #{resourceId,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="triggerMode != null">
|
||||
trigger_mode = #{triggerMode,jdbcType=VARCHAR},
|
||||
</if>
|
||||
|
@ -354,6 +368,9 @@
|
|||
<if test="organizationId != null">
|
||||
organization_id = #{organizationId,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="integrated != null">
|
||||
integrated = #{integrated,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="createTime != null">
|
||||
create_time = #{createTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
|
@ -366,15 +383,12 @@
|
|||
<if test="endTime != null">
|
||||
end_time = #{endTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="integrated != null">
|
||||
integrated = #{integrated,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="resourceId != null">
|
||||
resource_id = #{resourceId,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="deleted != null">
|
||||
deleted = #{deleted,jdbcType=BIT},
|
||||
</if>
|
||||
<if test="parallel != null">
|
||||
parallel = #{parallel,jdbcType=BIT},
|
||||
</if>
|
||||
</set>
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
</update>
|
||||
|
@ -386,31 +400,33 @@
|
|||
case_count = #{caseCount,jdbcType=BIGINT},
|
||||
`result` = #{result,jdbcType=VARCHAR},
|
||||
task_type = #{taskType,jdbcType=VARCHAR},
|
||||
resource_id = #{resourceId,jdbcType=VARCHAR},
|
||||
trigger_mode = #{triggerMode,jdbcType=VARCHAR},
|
||||
project_id = #{projectId,jdbcType=VARCHAR},
|
||||
organization_id = #{organizationId,jdbcType=VARCHAR},
|
||||
integrated = #{integrated,jdbcType=BIT},
|
||||
create_time = #{createTime,jdbcType=BIGINT},
|
||||
create_user = #{createUser,jdbcType=VARCHAR},
|
||||
start_time = #{startTime,jdbcType=BIGINT},
|
||||
end_time = #{endTime,jdbcType=BIGINT},
|
||||
integrated = #{integrated,jdbcType=BIT},
|
||||
resource_id = #{resourceId,jdbcType=VARCHAR},
|
||||
deleted = #{deleted,jdbcType=BIT}
|
||||
deleted = #{deleted,jdbcType=BIT},
|
||||
parallel = #{parallel,jdbcType=BIT}
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
</update>
|
||||
<insert id="batchInsert" parameterType="map">
|
||||
insert into exec_task
|
||||
(id, num, task_name, `status`, case_count, `result`, task_type, trigger_mode, project_id,
|
||||
organization_id, create_time, create_user, start_time, end_time, integrated, resource_id,
|
||||
deleted)
|
||||
(id, num, task_name, `status`, case_count, `result`, task_type, resource_id, trigger_mode,
|
||||
project_id, organization_id, integrated, create_time, create_user, start_time,
|
||||
end_time, deleted, parallel)
|
||||
values
|
||||
<foreach collection="list" item="item" separator=",">
|
||||
(#{item.id,jdbcType=VARCHAR}, #{item.num,jdbcType=BIGINT}, #{item.taskName,jdbcType=VARCHAR},
|
||||
#{item.status,jdbcType=VARCHAR}, #{item.caseCount,jdbcType=BIGINT}, #{item.result,jdbcType=VARCHAR},
|
||||
#{item.taskType,jdbcType=VARCHAR}, #{item.triggerMode,jdbcType=VARCHAR}, #{item.projectId,jdbcType=VARCHAR},
|
||||
#{item.organizationId,jdbcType=VARCHAR}, #{item.createTime,jdbcType=BIGINT}, #{item.createUser,jdbcType=VARCHAR},
|
||||
#{item.startTime,jdbcType=BIGINT}, #{item.endTime,jdbcType=BIGINT}, #{item.integrated,jdbcType=BIT},
|
||||
#{item.resourceId,jdbcType=VARCHAR}, #{item.deleted,jdbcType=BIT})
|
||||
#{item.taskType,jdbcType=VARCHAR}, #{item.resourceId,jdbcType=VARCHAR}, #{item.triggerMode,jdbcType=VARCHAR},
|
||||
#{item.projectId,jdbcType=VARCHAR}, #{item.organizationId,jdbcType=VARCHAR}, #{item.integrated,jdbcType=BIT},
|
||||
#{item.createTime,jdbcType=BIGINT}, #{item.createUser,jdbcType=VARCHAR}, #{item.startTime,jdbcType=BIGINT},
|
||||
#{item.endTime,jdbcType=BIGINT}, #{item.deleted,jdbcType=BIT}, #{item.parallel,jdbcType=BIT}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
<insert id="batchInsertSelective" parameterType="map">
|
||||
|
@ -444,6 +460,9 @@
|
|||
<if test="'task_type'.toString() == column.value">
|
||||
#{item.taskType,jdbcType=VARCHAR}
|
||||
</if>
|
||||
<if test="'resource_id'.toString() == column.value">
|
||||
#{item.resourceId,jdbcType=VARCHAR}
|
||||
</if>
|
||||
<if test="'trigger_mode'.toString() == column.value">
|
||||
#{item.triggerMode,jdbcType=VARCHAR}
|
||||
</if>
|
||||
|
@ -453,6 +472,9 @@
|
|||
<if test="'organization_id'.toString() == column.value">
|
||||
#{item.organizationId,jdbcType=VARCHAR}
|
||||
</if>
|
||||
<if test="'integrated'.toString() == column.value">
|
||||
#{item.integrated,jdbcType=BIT}
|
||||
</if>
|
||||
<if test="'create_time'.toString() == column.value">
|
||||
#{item.createTime,jdbcType=BIGINT}
|
||||
</if>
|
||||
|
@ -465,15 +487,12 @@
|
|||
<if test="'end_time'.toString() == column.value">
|
||||
#{item.endTime,jdbcType=BIGINT}
|
||||
</if>
|
||||
<if test="'integrated'.toString() == column.value">
|
||||
#{item.integrated,jdbcType=BIT}
|
||||
</if>
|
||||
<if test="'resource_id'.toString() == column.value">
|
||||
#{item.resourceId,jdbcType=VARCHAR}
|
||||
</if>
|
||||
<if test="'deleted'.toString() == column.value">
|
||||
#{item.deleted,jdbcType=BIT}
|
||||
</if>
|
||||
<if test="'parallel'.toString() == column.value">
|
||||
#{item.parallel,jdbcType=BIT}
|
||||
</if>
|
||||
</foreach>
|
||||
)
|
||||
</foreach>
|
||||
|
|
|
@ -83,6 +83,10 @@ CREATE INDEX idx_case_id ON exec_task_item(case_id);
|
|||
ALTER TABLE exec_task_item ADD collection_id varchar(50) NULL COMMENT '测试集ID';
|
||||
-- 任务项添加异常信息字段
|
||||
ALTER TABLE exec_task_item ADD error_message varchar(50) NULL COMMENT '异常信息';
|
||||
-- 任务项添加重跑字段
|
||||
ALTER TABLE exec_task_item ADD rerun bit(1) DEFAULT 0 NULL COMMENT '是否是重跑任务项';
|
||||
-- 任务添加串并行字段
|
||||
ALTER TABLE exec_task ADD parallel bit(1) DEFAULT 1 NOT NULL COMMENT '是否是并行执行';
|
||||
|
||||
-- set innodb lock wait timeout to default
|
||||
SET SESSION innodb_lock_wait_timeout = DEFAULT;
|
||||
|
|
|
@ -71,5 +71,5 @@ public class GetRunScriptRequest implements Serializable {
|
|||
/**
|
||||
* 是否是任务失败重跑
|
||||
*/
|
||||
private Boolean rerun;
|
||||
private Boolean rerun = false;
|
||||
}
|
||||
|
|
|
@ -127,5 +127,5 @@ public class TaskInfo implements Serializable {
|
|||
/**
|
||||
* 是否是任务失败重跑
|
||||
*/
|
||||
private Boolean rerun;
|
||||
private Boolean rerun = false;
|
||||
}
|
||||
|
|
|
@ -44,6 +44,10 @@ public class ExecutionQueue implements Serializable {
|
|||
* {@link io.metersphere.sdk.constants.ApiExecuteResourceType}
|
||||
*/
|
||||
private String resourceType;
|
||||
/**
|
||||
* 是否是重跑
|
||||
*/
|
||||
private Boolean rerun = false;
|
||||
|
||||
/**
|
||||
* 运行模式配置
|
||||
|
|
|
@ -39,9 +39,11 @@ public class TestPlanExecutionQueue {
|
|||
private boolean isLastOne = false;
|
||||
// 是否执行完毕
|
||||
private boolean executeFinish = false;
|
||||
// 是否是重新执行
|
||||
private boolean rerun = false;
|
||||
|
||||
public TestPlanExecutionQueue(long pos, String createUser, long createTime, String queueId, String queueType, String parentQueueId, String parentQueueType, String sourceID, String runMode,
|
||||
String executionSource, String prepareReportId, String taskId) {
|
||||
String executionSource, String prepareReportId, String taskId, boolean rerun) {
|
||||
this.pos = pos;
|
||||
this.createUser = createUser;
|
||||
this.createTime = createTime;
|
||||
|
@ -54,5 +56,6 @@ public class TestPlanExecutionQueue {
|
|||
this.executionSource = executionSource;
|
||||
this.prepareReportId = prepareReportId;
|
||||
this.taskId = taskId;
|
||||
this.rerun = rerun;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -267,8 +267,8 @@ public class ApiBatchRunBaseService {
|
|||
}
|
||||
}
|
||||
|
||||
public List<ExecTaskItem> getExecTaskItemByTaskIdAndCollectionId(String taskId, String collectionId) {
|
||||
List<ExecTaskItem> execTaskItems = extExecTaskItemMapper.selectExecInfoByTaskIdAndCollectionId(taskId, collectionId)
|
||||
public List<ExecTaskItem> getExecTaskItemByTaskIdAndCollectionId(String taskId, String collectionId, boolean rerun) {
|
||||
List<ExecTaskItem> execTaskItems = extExecTaskItemMapper.selectExecInfoByTaskIdAndCollectionId(taskId, collectionId, rerun)
|
||||
.stream().sorted(Comparator.comparing(ExecTaskItem::getId)).toList();
|
||||
return execTaskItems;
|
||||
}
|
||||
|
|
|
@ -35,12 +35,14 @@ import io.metersphere.sdk.constants.TaskItemErrorMessage;
|
|||
import io.metersphere.sdk.dto.api.task.GetRunScriptRequest;
|
||||
import io.metersphere.sdk.dto.api.task.TaskBatchRequestDTO;
|
||||
import io.metersphere.sdk.dto.api.task.TaskItem;
|
||||
import io.metersphere.sdk.exception.MSException;
|
||||
import io.metersphere.sdk.util.BeanUtils;
|
||||
import io.metersphere.sdk.util.CommonBeanFactory;
|
||||
import io.metersphere.sdk.util.JSON;
|
||||
import io.metersphere.sdk.util.LogUtils;
|
||||
import io.metersphere.system.domain.ExecTask;
|
||||
import io.metersphere.system.domain.ExecTaskItem;
|
||||
import io.metersphere.system.domain.ExecTaskItemExample;
|
||||
import io.metersphere.system.mapper.ExecTaskItemMapper;
|
||||
import io.metersphere.system.mapper.ExecTaskMapper;
|
||||
import io.metersphere.system.uid.IDGenerator;
|
||||
|
@ -578,4 +580,15 @@ public class ApiCommonService {
|
|||
execTaskItem.setThreadId(request.getThreadId());
|
||||
execTaskItemMapper.updateByPrimaryKeySelective(execTaskItem);
|
||||
}
|
||||
|
||||
public ExecTaskItem getRerunTaskItem(String id) {
|
||||
ExecTaskItemExample example = new ExecTaskItemExample();
|
||||
example.createCriteria().andTaskIdEqualTo(id).andRerunEqualTo(true);
|
||||
List<ExecTaskItem> execTaskItems = execTaskItemMapper.selectByExample(example);
|
||||
if (org.apache.commons.collections4.CollectionUtils.isEmpty(execTaskItems)) {
|
||||
throw new MSException("No test cases to rerun");
|
||||
}
|
||||
ExecTaskItem execTaskItem = execTaskItems.getFirst();
|
||||
return execTaskItem;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,18 +1,16 @@
|
|||
package io.metersphere.api.service.rerun;
|
||||
|
||||
import io.metersphere.api.service.ApiCommonService;
|
||||
import io.metersphere.api.service.definition.ApiTestCaseRunService;
|
||||
import io.metersphere.sdk.constants.ExecTaskType;
|
||||
import io.metersphere.system.domain.ExecTask;
|
||||
import io.metersphere.system.domain.ExecTaskItem;
|
||||
import io.metersphere.system.invoker.TaskRerunServiceInvoker;
|
||||
import io.metersphere.system.mapper.ExecTaskItemMapper;
|
||||
import io.metersphere.system.service.TaskRerunService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: jianxing
|
||||
* @CreateTime: 2024-02-06 20:47
|
||||
|
@ -23,15 +21,15 @@ public class ApiCaseRerunService implements TaskRerunService {
|
|||
@Resource
|
||||
private ApiTestCaseRunService apiTestCaseRunService;
|
||||
@Resource
|
||||
private ExecTaskItemMapper execTaskItemMapper;
|
||||
private ApiCommonService apiCommonService;
|
||||
|
||||
public ApiCaseRerunService() {
|
||||
TaskRerunServiceInvoker.register(ExecTaskType.API_CASE, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rerun(ExecTask execTask, List<String> taskItemIds, String userId) {
|
||||
ExecTaskItem execTaskItem = execTaskItemMapper.selectByPrimaryKey(taskItemIds.getFirst());
|
||||
public void rerun(ExecTask execTask, String userId) {
|
||||
ExecTaskItem execTaskItem = apiCommonService.getRerunTaskItem(execTask.getId());
|
||||
apiTestCaseRunService.runRun(execTask, execTaskItem, userId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
package io.metersphere.api.service.rerun;
|
||||
|
||||
import io.metersphere.api.service.ApiCommonService;
|
||||
import io.metersphere.api.service.scenario.ApiScenarioRunService;
|
||||
import io.metersphere.sdk.constants.ExecTaskType;
|
||||
import io.metersphere.system.domain.ExecTask;
|
||||
import io.metersphere.system.domain.ExecTaskItem;
|
||||
import io.metersphere.system.invoker.TaskRerunServiceInvoker;
|
||||
import io.metersphere.system.mapper.ExecTaskItemMapper;
|
||||
import io.metersphere.system.service.TaskRerunService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
@ -23,15 +23,15 @@ public class ApiScenarioRerunService implements TaskRerunService {
|
|||
@Resource
|
||||
private ApiScenarioRunService apiScenarioRunService;
|
||||
@Resource
|
||||
private ExecTaskItemMapper execTaskItemMapper;
|
||||
private ApiCommonService apiCommonService;
|
||||
|
||||
public ApiScenarioRerunService() {
|
||||
TaskRerunServiceInvoker.register(ExecTaskType.API_SCENARIO, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rerun(ExecTask execTask, List<String> taskItemIds, String userId) {
|
||||
ExecTaskItem execTaskItem = execTaskItemMapper.selectByPrimaryKey(taskItemIds.getFirst());
|
||||
public void rerun(ExecTask execTask, String userId) {
|
||||
ExecTaskItem execTaskItem = apiCommonService.getRerunTaskItem(execTask.getId());
|
||||
apiScenarioRunService.runRun(execTask, execTaskItem, userId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,6 @@ import io.metersphere.system.domain.ExecTask;
|
|||
import io.metersphere.system.service.TaskRerunService;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
|
@ -29,7 +28,10 @@ public class TaskRerunServiceInvoker {
|
|||
return EnumValidator.validateEnum(ExecTaskType.class, execTaskType);
|
||||
}
|
||||
|
||||
public static void rerun(ExecTask execTask, List<String> taskItemIds, String userId) {
|
||||
getTaskRerunService(getExecTaskType(execTask.getTaskType())).rerun(execTask, taskItemIds, userId);
|
||||
public static void rerun(ExecTask execTask, String userId) {
|
||||
TaskRerunService taskRerunService = getTaskRerunService(getExecTaskType(execTask.getTaskType()));
|
||||
if (taskRerunService != null) {
|
||||
taskRerunService.rerun(execTask, userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ public interface ExtExecTaskItemMapper {
|
|||
|
||||
List<ExecTaskItem> selectExecInfoByTaskIdAndResourceIds(@Param("taskId") String taskId, @Param("resourceIds") List<String> resourceIds);
|
||||
|
||||
List<ExecTaskItem> selectExecInfoByTaskIdAndCollectionId(@Param("taskId") String taskId, @Param("collectionId") String collectionId);
|
||||
List<ExecTaskItem> selectExecInfoByTaskIdAndCollectionId(@Param("taskId") String taskId, @Param("collectionId") String collectionId, @Param("rerun") boolean rerun);
|
||||
|
||||
Boolean hasErrorItem(@Param("taskId") String taskId);
|
||||
|
||||
|
@ -64,8 +64,6 @@ public interface ExtExecTaskItemMapper {
|
|||
|
||||
long getUnDeleteScenarioExecCount(@Param("projectId") String projectId, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("resourceTypes") List<String> resourceTypes);
|
||||
|
||||
List<String> selectRerunIds(@Param("taskId") String taskId);
|
||||
|
||||
void resetRerunTaskItem(@Param("taskId") String taskId, @Param("userId") String userId);
|
||||
|
||||
void deleteRerunTaskItemReportRelation(@Param("taskId") String taskId);
|
||||
|
|
|
@ -33,6 +33,9 @@
|
|||
SELECT id, resource_id
|
||||
FROM exec_task_item
|
||||
WHERE task_id = #{taskId} and collection_id = #{collectionId}
|
||||
<if test="rerun != null and rerun == true">
|
||||
and rerun = true
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<select id="selectItemByTaskIds" resultType="io.metersphere.system.domain.ExecTaskItem">
|
||||
|
@ -320,10 +323,6 @@
|
|||
</if>
|
||||
</select>
|
||||
|
||||
<select id="selectRerunIds" resultType="java.lang.String">
|
||||
select id from exec_task_item where task_id = #{taskId} and `result` = 'ERROR' and deleted = false
|
||||
</select>
|
||||
|
||||
<update id="resetRerunTaskItem">
|
||||
UPDATE exec_task_item
|
||||
SET `status` = 'PENDING',
|
||||
|
@ -333,9 +332,9 @@
|
|||
thread_id = null,
|
||||
start_time = null,
|
||||
end_time = null,
|
||||
collection_id = null,
|
||||
error_message = null,
|
||||
executor = #{userId}
|
||||
executor = #{userId},
|
||||
rerun = true
|
||||
WHERE
|
||||
deleted = false
|
||||
and task_id = #{taskId}
|
||||
|
|
|
@ -528,6 +528,7 @@ public class BaseTaskHubService {
|
|||
List<ExecTaskItem> items = extExecTaskItemMapper.selectPoolNodeByIds(ids);
|
||||
|
||||
return items.stream()
|
||||
.filter(item -> StringUtils.isNotBlank(item.getResourcePoolNode()))
|
||||
.collect(Collectors.groupingBy(ExecTaskItem::getResourcePoolNode))
|
||||
.entrySet()
|
||||
.stream()
|
||||
|
@ -599,13 +600,6 @@ public class BaseTaskHubService {
|
|||
throw new MSException(Translator.get("no_permission_to_resource"));
|
||||
}
|
||||
|
||||
// 查询待执行的任务项
|
||||
List<String> taskItemIds = extExecTaskItemMapper.selectRerunIds(execTask.getId());
|
||||
|
||||
if (CollectionUtils.isEmpty(taskItemIds)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 更新任务状态
|
||||
execTask.setStatus(ExecStatus.RERUNNING.name());
|
||||
execTask.setCreateUser(userId);
|
||||
|
@ -626,7 +620,7 @@ public class BaseTaskHubService {
|
|||
// 更新任务项状态等
|
||||
extExecTaskItemMapper.resetRerunTaskItem(execTask.getId(), userId);
|
||||
|
||||
TaskRerunServiceInvoker.rerun(execTask, taskItemIds, userId);
|
||||
TaskRerunServiceInvoker.rerun(execTask, userId);
|
||||
}
|
||||
|
||||
private void handleStopTaskAsync(List<String> ids) {
|
||||
|
|
|
@ -1,16 +1,18 @@
|
|||
package io.metersphere.system.service;
|
||||
|
||||
import io.metersphere.system.domain.ExecTask;
|
||||
|
||||
import java.util.List;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
/**
|
||||
* @Author: jianxing
|
||||
* @CreateTime: 2024-02-06 20:47
|
||||
*/
|
||||
@Service
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public interface TaskRerunService {
|
||||
/**
|
||||
* 任务重跑
|
||||
*/
|
||||
void rerun(ExecTask execTask, List<String> taskItemIds, String userId);
|
||||
void rerun(ExecTask execTask, String userId);
|
||||
}
|
||||
|
|
|
@ -73,4 +73,6 @@ public interface ExtTestPlanReportMapper {
|
|||
void deleteGroupReport(@Param("id") String id);
|
||||
|
||||
List<TestPlanReport> getChildrenReport(@Param("reportId") String reportId);
|
||||
|
||||
void resetRerunReport(@Param("reportId") String reportId);
|
||||
}
|
||||
|
|
|
@ -552,4 +552,8 @@
|
|||
<select id="getChildrenReport" resultType="io.metersphere.plan.domain.TestPlanReport">
|
||||
select id from test_plan_report where parent_id = #{reportId} and id != #{reportId}
|
||||
</select>
|
||||
|
||||
<update id="resetRerunReport">
|
||||
update test_plan_report set exec_status = 'RUNNING', end_time = null where id = #{reportId} or parent_id = #{reportId}
|
||||
</update>
|
||||
</mapper>
|
|
@ -76,7 +76,7 @@ public class PlanRunTestPlanApiCaseService {
|
|||
String collectionId = collection.getId();
|
||||
String execQueueId = taskId + "_" + collectionId;
|
||||
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId);
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId, testPlanExecutionQueue.isRerun());
|
||||
if (CollectionUtils.isEmpty(execTaskItems)) {
|
||||
return true;
|
||||
}
|
||||
|
@ -85,6 +85,7 @@ public class PlanRunTestPlanApiCaseService {
|
|||
ExecutionQueue queue = apiBatchRunBaseService.getExecutionQueue(runModeConfig, ApiExecuteResourceType.PLAN_RUN_API_CASE.name(),
|
||||
testPlanExecutionQueue.getTaskId(), userId);
|
||||
queue.setQueueId(execQueueId);
|
||||
queue.setRerun(testPlanExecutionQueue.isRerun());
|
||||
queue.setParentQueueId(testPlanExecutionQueue.getQueueId());
|
||||
apiExecutionQueueService.insertQueue(queue);
|
||||
|
||||
|
@ -114,13 +115,15 @@ public class PlanRunTestPlanApiCaseService {
|
|||
|
||||
TestPlan testPlan = testPlanMapper.selectByPrimaryKey(testPlanId);
|
||||
TaskBatchRequestDTO taskRequest = apiTestCaseBatchRunService.getTaskBatchRequestDTO(testPlan.getProjectId(), runModeConfig);
|
||||
taskRequest.getTaskInfo().setTaskId(testPlanExecutionQueue.getTaskId());
|
||||
taskRequest.getTaskInfo().setTaskId(taskId);
|
||||
taskRequest.getTaskInfo().setParentQueueId(testPlanExecutionQueue.getQueueId());
|
||||
taskRequest.getTaskInfo().setSetId(execSetId);
|
||||
taskRequest.getTaskInfo().setRerun(testPlanExecutionQueue.isRerun());
|
||||
taskRequest.getTaskInfo().setUserId(userId);
|
||||
taskRequest.getTaskInfo().setResourceType(ApiExecuteResourceType.PLAN_RUN_API_CASE.name());
|
||||
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(testPlanExecutionQueue.getTaskId(), collection.getId());
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(testPlanExecutionQueue.getTaskId(),
|
||||
collection.getId(), testPlanExecutionQueue.isRerun());
|
||||
SubListUtils.dealForSubList(execTaskItems, ApiBatchRunBaseService.BATCH_TASK_ITEM_SIZE, subExecTaskItems -> {
|
||||
List<TaskItem> taskItems = subExecTaskItems
|
||||
.stream()
|
||||
|
@ -166,6 +169,7 @@ public class PlanRunTestPlanApiCaseService {
|
|||
taskRequest.getTaskInfo().setResourceType(ApiExecuteResourceType.PLAN_RUN_API_CASE.name());
|
||||
taskRequest.getTaskInfo().setQueueId(queue.getQueueId());
|
||||
taskRequest.getTaskInfo().setUserId(queue.getUserId());
|
||||
taskRequest.getTaskInfo().setRerun(queue.getRerun());
|
||||
taskRequest.getTaskInfo().setParentQueueId(queue.getParentQueueId());
|
||||
taskRequest.getTaskItem().setRequestCount(1L);
|
||||
taskRequest.getTaskItem().setId(queueDetail.getTaskItemId());
|
||||
|
@ -183,8 +187,6 @@ public class PlanRunTestPlanApiCaseService {
|
|||
ApiReport apiReport = apiTestCaseRunService.getApiReport(apiTestCase, request);
|
||||
apiReport.setEnvironmentId(apiBatchRunBaseService.getEnvId(request.getRunModeConfig(), testPlanReportApiCase.getEnvironmentId()));
|
||||
apiReport.setTestPlanCaseId(testPlanReportApiCase.getTestPlanApiCaseId());
|
||||
// 报告ID预生成
|
||||
apiReport.setId(testPlanReportApiCase.getApiCaseExecuteReportId());
|
||||
// 标记是测试计划整体执行
|
||||
apiReport.setPlan(true);
|
||||
apiReportService.insertApiReport(apiReport);
|
||||
|
|
|
@ -72,7 +72,7 @@ public class PlanRunTestPlanApiScenarioService {
|
|||
String collectionId = collection.getId();
|
||||
String execQueueId = taskId + "_" + collectionId;
|
||||
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId);
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId, testPlanExecutionQueue.isRerun());
|
||||
if (CollectionUtils.isEmpty(execTaskItems)) {
|
||||
return true;
|
||||
}
|
||||
|
@ -81,6 +81,7 @@ public class PlanRunTestPlanApiScenarioService {
|
|||
ExecutionQueue queue = apiBatchRunBaseService.getExecutionQueue(runModeConfig, ApiExecuteResourceType.PLAN_RUN_API_SCENARIO.name(),
|
||||
testPlanExecutionQueue.getTaskId(), userId);
|
||||
queue.setQueueId(execQueueId);
|
||||
queue.setRerun(testPlanExecutionQueue.isRerun());
|
||||
queue.setParentQueueId(testPlanExecutionQueue.getQueueId());
|
||||
apiExecutionQueueService.insertQueue(queue);
|
||||
|
||||
|
@ -113,9 +114,11 @@ public class PlanRunTestPlanApiScenarioService {
|
|||
taskRequest.getTaskInfo().setParentQueueId(testPlanExecutionQueue.getQueueId());
|
||||
taskRequest.getTaskInfo().setSetId(execSetId);
|
||||
taskRequest.getTaskInfo().setUserId(userId);
|
||||
taskRequest.getTaskInfo().setRerun(testPlanExecutionQueue.isRerun());
|
||||
taskRequest.getTaskInfo().setResourceType(ApiExecuteResourceType.PLAN_RUN_API_SCENARIO.name());
|
||||
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(testPlanExecutionQueue.getTaskId(), collection.getId());
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(testPlanExecutionQueue.getTaskId(),
|
||||
collection.getId(), testPlanExecutionQueue.isRerun());
|
||||
SubListUtils.dealForSubList(execTaskItems, ApiBatchRunBaseService.BATCH_TASK_ITEM_SIZE, subExecTaskItems -> {
|
||||
List<TaskItem> taskItems = subExecTaskItems
|
||||
.stream()
|
||||
|
@ -141,16 +144,13 @@ public class PlanRunTestPlanApiScenarioService {
|
|||
// 初始化报告
|
||||
ApiScenarioReport apiScenarioReport = apiScenarioRunService.getScenarioReport(apiScenario, request);
|
||||
apiScenarioReport.setName(testPlanReportApiScenario.getApiScenarioName() + "_" + DateUtils.getTimeString(System.currentTimeMillis()));
|
||||
apiScenarioReport.setTestPlanScenarioId(testPlanReportApiScenario.getTestPlanApiScenarioId());
|
||||
// 报告预生成,方便停止测试计划时直接更新报告状态
|
||||
apiScenarioReport.setId(testPlanReportApiScenario.getApiScenarioExecuteReportId());
|
||||
apiScenarioReport.setEnvironmentId(apiBatchRunBaseService.getEnvId(request.getRunModeConfig(), testPlanReportApiScenario.getEnvironmentId()));
|
||||
apiScenarioReport.setPlan(true);
|
||||
apiScenarioReport.setTestPlanScenarioId(testPlanReportApiScenario.getTestPlanApiScenarioId());
|
||||
apiScenarioReportService.insertApiScenarioReport(apiScenarioReport);
|
||||
return apiScenarioRunService.initApiScenarioReportDetail(request.getTaskItem().getId(), apiScenario.getId(), apiScenarioReport.getId());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 执行串行的下一个任务
|
||||
*
|
||||
|
@ -176,6 +176,7 @@ public class PlanRunTestPlanApiScenarioService {
|
|||
taskRequest.getTaskInfo().setTaskId(queue.getTaskId());
|
||||
taskRequest.getTaskInfo().setQueueId(queue.getQueueId());
|
||||
taskRequest.getTaskInfo().setUserId(queue.getUserId());
|
||||
taskRequest.getTaskInfo().setRerun(queue.getRerun());
|
||||
taskRequest.getTaskInfo().setParentQueueId(queue.getParentQueueId());
|
||||
taskRequest.getTaskInfo().setResourceType(ApiExecuteResourceType.PLAN_RUN_API_SCENARIO.name());
|
||||
|
||||
|
|
|
@ -30,7 +30,6 @@ import io.metersphere.sdk.util.SubListUtils;
|
|||
import io.metersphere.sdk.util.Translator;
|
||||
import io.metersphere.system.domain.ExecTask;
|
||||
import io.metersphere.system.domain.ExecTaskItem;
|
||||
import io.metersphere.system.mapper.ExtExecTaskItemMapper;
|
||||
import io.metersphere.system.service.BaseTaskHubService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
|
@ -74,8 +73,6 @@ public class TestPlanApiCaseBatchRunService {
|
|||
@Resource
|
||||
private BaseTaskHubService baseTaskHubService;
|
||||
@Resource
|
||||
private ExtExecTaskItemMapper extExecTaskItemMapper;
|
||||
@Resource
|
||||
private TestPlanService testPlanService;
|
||||
|
||||
/**
|
||||
|
@ -197,7 +194,7 @@ public class TestPlanApiCaseBatchRunService {
|
|||
// 初始化执行队列
|
||||
ExecutionQueue queue = apiBatchRunBaseService.initExecutionQueue(taskId, taskId + '_' + collectionId, runModeConfig, ApiExecuteResourceType.TEST_PLAN_API_CASE.name(), parentQueueId, parentSetId, userId);
|
||||
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId);
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId, false);
|
||||
|
||||
apiBatchRunBaseService.initQueueDetail(queue, execTaskItems);
|
||||
|
||||
|
@ -232,7 +229,7 @@ public class TestPlanApiCaseBatchRunService {
|
|||
taskRequest.getTaskInfo().setParentSetId(parentSetId);
|
||||
}
|
||||
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId);
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId, false);
|
||||
|
||||
SubListUtils.dealForSubList(execTaskItems, ApiBatchRunBaseService.BATCH_TASK_ITEM_SIZE, subExecTaskItems -> {
|
||||
List<TaskItem> taskItems = subExecTaskItems
|
||||
|
|
|
@ -205,7 +205,7 @@ public class TestPlanApiScenarioBatchRunService {
|
|||
// 初始化执行队列
|
||||
ExecutionQueue queue = apiBatchRunBaseService.initExecutionQueue(taskId, taskId + '_' + collectionId, runModeConfig, ApiExecuteResourceType.TEST_PLAN_API_SCENARIO.name(), parentQueueId, parentSetId, userId);
|
||||
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId);
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId, false);
|
||||
|
||||
apiBatchRunBaseService.initQueueDetail(queue, execTaskItems);
|
||||
|
||||
|
@ -239,7 +239,7 @@ public class TestPlanApiScenarioBatchRunService {
|
|||
taskRequest.getTaskInfo().setParentSetId(parentSetId);
|
||||
}
|
||||
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId);
|
||||
List<ExecTaskItem> execTaskItems = apiBatchRunBaseService.getExecTaskItemByTaskIdAndCollectionId(taskId, collectionId, false);
|
||||
SubListUtils.dealForSubList(execTaskItems, ApiBatchRunBaseService.BATCH_TASK_ITEM_SIZE, subExecTaskItems -> {
|
||||
List<TaskItem> taskItems = subExecTaskItems
|
||||
.stream()
|
||||
|
|
|
@ -2,6 +2,7 @@ package io.metersphere.plan.service;
|
|||
|
||||
import com.esotericsoftware.minlog.Log;
|
||||
import io.metersphere.api.domain.ApiReportRelateTask;
|
||||
import io.metersphere.api.domain.ApiReportRelateTaskExample;
|
||||
import io.metersphere.api.mapper.ApiReportRelateTaskMapper;
|
||||
import io.metersphere.api.service.ApiBatchRunBaseService;
|
||||
import io.metersphere.api.service.ApiCommonService;
|
||||
|
@ -23,6 +24,7 @@ import io.metersphere.system.service.BaseTaskHubService;
|
|||
import io.metersphere.system.uid.IDGenerator;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.BooleanUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
|
@ -32,6 +34,7 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static io.metersphere.plan.service.TestPlanExecuteSupportService.*;
|
||||
|
||||
|
@ -80,6 +83,8 @@ public class TestPlanExecuteService {
|
|||
private ApiBatchRunBaseService apiBatchRunBaseService;
|
||||
@Resource
|
||||
private ApiReportRelateTaskMapper apiReportRelateTaskMapper;
|
||||
@Resource
|
||||
private ExtTestPlanReportMapper extTestPlanReportMapper;
|
||||
|
||||
// 停止测试计划的执行
|
||||
public void stopTestPlanRunning(String testPlanReportId) {
|
||||
|
@ -168,7 +173,8 @@ public class TestPlanExecuteService {
|
|||
request.getRunMode(),
|
||||
request.getExecutionSource(),
|
||||
reportId,
|
||||
IDGenerator.nextStr()
|
||||
IDGenerator.nextStr(),
|
||||
false
|
||||
);
|
||||
|
||||
testPlanExecuteSupportService.setRedisForList(
|
||||
|
@ -210,7 +216,8 @@ public class TestPlanExecuteService {
|
|||
runMode,
|
||||
TaskTriggerMode.BATCH.name(),
|
||||
IDGenerator.nextStr(),
|
||||
IDGenerator.nextStr()
|
||||
IDGenerator.nextStr(),
|
||||
false
|
||||
)
|
||||
);
|
||||
}
|
||||
|
@ -253,7 +260,7 @@ public class TestPlanExecuteService {
|
|||
extTestPlanApiScenarioMapper.countByPlanIds(childPlanIds);
|
||||
}
|
||||
// 初始化任务
|
||||
ExecTask execTask = initExecTask(executionQueue.getTaskId(), caseTotal, testPlan, project, executionQueue.getCreateUser(), executionQueue.getExecutionSource(), executionQueue.getPrepareReportId());
|
||||
ExecTask execTask = initExecTask(executionQueue, caseTotal, testPlan, project);
|
||||
|
||||
// 预生成计划组报告
|
||||
Map<String, String> reportMap = testPlanReportService.genReportByExecution(executionQueue.getPrepareReportId(), execTask.getId(), genReportRequest, executionQueue.getCreateUser());
|
||||
|
@ -276,7 +283,8 @@ public class TestPlanExecuteService {
|
|||
executionQueue.getRunMode(),
|
||||
executionQueue.getExecutionSource(),
|
||||
reportMap.get(child.getId()),
|
||||
executionQueue.getTaskId()
|
||||
executionQueue.getTaskId(),
|
||||
executionQueue.isRerun()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
@ -309,7 +317,7 @@ public class TestPlanExecuteService {
|
|||
Integer caseTotal = extTestPlanApiCaseMapper.countByPlanIds(List.of(testPlan.getId())) +
|
||||
extTestPlanApiScenarioMapper.countByPlanIds(List.of(testPlan.getId()));
|
||||
// 初始化任务
|
||||
ExecTask execTask = initExecTask(executionQueue.getTaskId(), caseTotal, testPlan, project, executionQueue.getCreateUser(), executionQueue.getExecutionSource(), executionQueue.getPrepareReportId());
|
||||
ExecTask execTask = initExecTask(executionQueue, caseTotal, testPlan, project);
|
||||
|
||||
Map<String, String> reportMap = testPlanReportService.genReportByExecution(executionQueue.getPrepareReportId(), execTask.getId(), genReportRequest, executionQueue.getCreateUser());
|
||||
executionQueue.setPrepareReportId(reportMap.get(executionQueue.getSourceID()));
|
||||
|
@ -319,21 +327,22 @@ public class TestPlanExecuteService {
|
|||
}
|
||||
}
|
||||
|
||||
private ExecTask initExecTask(String taskId, int caseSize, TestPlan testPlan, Project project, String userId, String triggerMode, String reportId) {
|
||||
ExecTask execTask = apiCommonService.newExecTask(project.getId(), userId);
|
||||
execTask.setId(taskId);
|
||||
private ExecTask initExecTask(TestPlanExecutionQueue executionQueue, int caseSize, TestPlan testPlan, Project project) {
|
||||
ExecTask execTask = apiCommonService.newExecTask(project.getId(), executionQueue.getCreateUser());
|
||||
execTask.setId(executionQueue.getTaskId());
|
||||
execTask.setCaseCount(Long.valueOf(caseSize));
|
||||
execTask.setTaskName(testPlan.getName());
|
||||
execTask.setOrganizationId(project.getOrganizationId());
|
||||
execTask.setTriggerMode(triggerMode);
|
||||
execTask.setTriggerMode(executionQueue.getExecutionSource());
|
||||
execTask.setParallel(StringUtils.equals(executionQueue.getRunMode(), ApiBatchRunMode.PARALLEL.name()));
|
||||
execTask.setTaskType(StringUtils.equalsIgnoreCase(testPlan.getType(), TestPlanConstants.TEST_PLAN_TYPE_PLAN) ? ExecTaskType.TEST_PLAN.name() : ExecTaskType.TEST_PLAN_GROUP.name());
|
||||
execTask.setResourceId(testPlan.getId());
|
||||
baseTaskHubService.insertExecTask(execTask);
|
||||
|
||||
// 创建报告和任务的关联关系
|
||||
ApiReportRelateTask apiReportRelateTask = new ApiReportRelateTask();
|
||||
apiReportRelateTask.setReportId(reportId);
|
||||
apiReportRelateTask.setTaskResourceId(taskId);
|
||||
apiReportRelateTask.setReportId(executionQueue.getPrepareReportId());
|
||||
apiReportRelateTask.setTaskResourceId(execTask.getId());
|
||||
apiReportRelateTaskMapper.insertSelective(apiReportRelateTask);
|
||||
return execTask;
|
||||
}
|
||||
|
@ -376,7 +385,8 @@ public class TestPlanExecuteService {
|
|||
runMode,
|
||||
executionQueue.getExecutionSource(),
|
||||
executionQueue.getPrepareReportId(),
|
||||
executionQueue.getTaskId())
|
||||
executionQueue.getTaskId(),
|
||||
executionQueue.isRerun())
|
||||
);
|
||||
}
|
||||
LogUtils.info("测试计划执行节点 --- 队列ID[{}],队列类型[{}],父队列ID[{}],父队列类型[{}],执行模式[{}]", queueId, queueType, executionQueue.getParentQueueId(), executionQueue.getParentQueueType(), runMode);
|
||||
|
@ -401,6 +411,110 @@ public class TestPlanExecuteService {
|
|||
}
|
||||
}
|
||||
|
||||
public String testPlanOrGroupRerun(ExecTask execTask, String userId) {
|
||||
String taskId = execTask.getId();
|
||||
ApiReportRelateTaskExample example = new ApiReportRelateTaskExample();
|
||||
example.createCriteria().andTaskResourceIdEqualTo(taskId);
|
||||
List<ApiReportRelateTask> apiReportRelateTasks = apiReportRelateTaskMapper.selectByExample(example);
|
||||
String reportId;
|
||||
if (CollectionUtils.isNotEmpty(apiReportRelateTasks)) {
|
||||
reportId = apiReportRelateTasks.getFirst().getReportId();
|
||||
} else {
|
||||
// 报告被删除,生成虚拟ID
|
||||
reportId = IDGenerator.nextStr();
|
||||
}
|
||||
|
||||
String queueId = IDGenerator.nextStr();
|
||||
TestPlanExecutionQueue singleExecuteRootQueue = new TestPlanExecutionQueue(
|
||||
0,
|
||||
userId,
|
||||
System.currentTimeMillis(),
|
||||
queueId,
|
||||
QUEUE_PREFIX_TEST_PLAN_BATCH_EXECUTE,
|
||||
null,
|
||||
null,
|
||||
execTask.getResourceId(),
|
||||
BooleanUtils.isTrue(execTask.getParallel()) ? ApiBatchRunMode.PARALLEL.name() : ApiBatchRunMode.SERIAL.name(),
|
||||
TaskTriggerMode.MANUAL.name(),
|
||||
reportId,
|
||||
taskId,
|
||||
true
|
||||
);
|
||||
|
||||
testPlanExecuteSupportService.setRedisForList(
|
||||
testPlanExecuteSupportService.genQueueKey(queueId, QUEUE_PREFIX_TEST_PLAN_BATCH_EXECUTE), List.of(JSON.toJSONString(singleExecuteRootQueue)));
|
||||
TestPlanExecutionQueue nextQueue = testPlanExecuteSupportService.getNextQueue(queueId, QUEUE_PREFIX_TEST_PLAN_BATCH_EXECUTE);
|
||||
LogUtils.info("测试计划(组)重跑!计划报告[{}] , 资源ID[{}]", singleExecuteRootQueue.getPrepareReportId(), singleExecuteRootQueue.getSourceID());
|
||||
doTestPlanOrGroupRerun(nextQueue);
|
||||
return reportId;
|
||||
}
|
||||
|
||||
private String doTestPlanOrGroupRerun(TestPlanExecutionQueue executionQueue) {
|
||||
TestPlan testPlan = testPlanMapper.selectByPrimaryKey(executionQueue.getSourceID());
|
||||
if (testPlan == null || StringUtils.equalsIgnoreCase(testPlan.getStatus(), TestPlanConstants.TEST_PLAN_STATUS_ARCHIVED)) {
|
||||
throw new MSException("test_plan.error");
|
||||
}
|
||||
|
||||
String prepareReportId = executionQueue.getPrepareReportId();
|
||||
|
||||
// 更新计划组以及子计划的状态为 RUNNING
|
||||
extTestPlanReportMapper.resetRerunReport(prepareReportId);
|
||||
|
||||
if (StringUtils.equalsIgnoreCase(testPlan.getType(), TestPlanConstants.TEST_PLAN_TYPE_GROUP)) {
|
||||
List<TestPlan> children = testPlanService.selectNotArchivedChildren(testPlan.getId());
|
||||
long pos = 0;
|
||||
List<TestPlanExecutionQueue> childrenQueue = new ArrayList<>();
|
||||
String queueType = QUEUE_PREFIX_TEST_PLAN_GROUP_EXECUTE;
|
||||
String queueId = prepareReportId;
|
||||
|
||||
TestPlanReportExample example = new TestPlanReportExample();
|
||||
example.createCriteria().andParentIdEqualTo(prepareReportId);
|
||||
Map<String, String> planReportMap = testPlanReportMapper.selectByExample(example).stream().
|
||||
collect(Collectors.toMap(TestPlanReport::getTestPlanId, TestPlanReport::getId));
|
||||
|
||||
for (TestPlan child : children) {
|
||||
childrenQueue.add(
|
||||
new TestPlanExecutionQueue(
|
||||
pos++,
|
||||
executionQueue.getCreateUser(),
|
||||
System.currentTimeMillis(),
|
||||
queueId,
|
||||
queueType,
|
||||
executionQueue.getQueueId(),
|
||||
executionQueue.getQueueType(),
|
||||
child.getId(),
|
||||
executionQueue.getRunMode(),
|
||||
executionQueue.getExecutionSource(),
|
||||
planReportMap.get(child.getId()) == null ? IDGenerator.nextStr() : planReportMap.get(child.getId()),
|
||||
executionQueue.getTaskId(),
|
||||
executionQueue.isRerun()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
LogUtils.info("计划组重跑 --- 队列ID[{}],队列类型[{}]", queueId, queueType);
|
||||
if (CollectionUtils.isEmpty(childrenQueue)) {
|
||||
//本次的测试计划组执行完成
|
||||
this.testPlanGroupQueueFinish(queueId, queueType);
|
||||
} else {
|
||||
testPlanExecuteSupportService.setRedisForList(testPlanExecuteSupportService.genQueueKey(queueId, queueType), childrenQueue.stream().map(JSON::toJSONString).toList());
|
||||
|
||||
if (StringUtils.equalsIgnoreCase(executionQueue.getRunMode(), ApiBatchRunMode.SERIAL.name())) {
|
||||
//串行
|
||||
TestPlanExecutionQueue nextQueue = testPlanExecuteSupportService.getNextQueue(queueId, queueType);
|
||||
executeTestPlan(nextQueue);
|
||||
} else {
|
||||
//并行
|
||||
childrenQueue.forEach(childQueue -> executeTestPlan(childQueue));
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
this.executeTestPlan(executionQueue);
|
||||
}
|
||||
return prepareReportId;
|
||||
}
|
||||
|
||||
//执行测试集 -- 回调:collectionExecuteQueueFinish
|
||||
private void executeByTestPlanCollection(TestPlanExecutionQueue executionQueue) {
|
||||
TestPlanCollection parentCollection = testPlanCollectionMapper.selectByPrimaryKey(executionQueue.getSourceID());
|
||||
|
@ -429,7 +543,8 @@ public class TestPlanExecuteService {
|
|||
runMode,
|
||||
executionQueue.getExecutionSource(),
|
||||
executionQueue.getPrepareReportId(),
|
||||
executionQueue.getTaskId()) {{
|
||||
executionQueue.getTaskId(),
|
||||
executionQueue.isRerun()) {{
|
||||
this.setTestPlanCollectionJson(JSON.toJSONString(collection));
|
||||
}}
|
||||
);
|
||||
|
|
|
@ -550,7 +550,6 @@ public class TestPlanReportService {
|
|||
// 接口执行时才更新结果
|
||||
reportApiCase.setApiCaseExecuteResult(null);
|
||||
reportApiCase.setApiCaseExecuteUser(null);
|
||||
reportApiCase.setApiCaseExecuteReportId(IDGenerator.nextStr());
|
||||
}
|
||||
reportApiCase.setApiCaseBugCount(bugCountMap.containsKey(reportApiCase.getTestPlanApiCaseId()) ? bugCountMap.get(reportApiCase.getTestPlanApiCaseId()) : 0);
|
||||
}
|
||||
|
@ -593,7 +592,6 @@ public class TestPlanReportService {
|
|||
// 接口执行时才更新结果
|
||||
reportApiScenario.setApiScenarioExecuteResult(null);
|
||||
reportApiScenario.setApiScenarioExecuteUser(null);
|
||||
reportApiScenario.setApiScenarioExecuteReportId(IDGenerator.nextStr());
|
||||
}
|
||||
reportApiScenario.setApiScenarioBugCount(bugCountMap.containsKey(reportApiScenario.getTestPlanApiScenarioId()) ? bugCountMap.get(reportApiScenario.getTestPlanApiScenarioId()) : 0);
|
||||
}
|
||||
|
|
|
@ -1,17 +1,16 @@
|
|||
package io.metersphere.plan.service.rerun;
|
||||
|
||||
import io.metersphere.api.service.ApiCommonService;
|
||||
import io.metersphere.plan.service.TestPlanApiCaseService;
|
||||
import io.metersphere.sdk.constants.ExecTaskType;
|
||||
import io.metersphere.system.domain.ExecTask;
|
||||
import io.metersphere.system.domain.ExecTaskItem;
|
||||
import io.metersphere.system.invoker.TaskRerunServiceInvoker;
|
||||
import io.metersphere.system.mapper.ExecTaskItemMapper;
|
||||
import io.metersphere.system.service.TaskRerunService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: jianxing
|
||||
|
@ -23,15 +22,15 @@ public class TestPlanApiCaseRerunService implements TaskRerunService {
|
|||
@Resource
|
||||
private TestPlanApiCaseService testPlanApiCaseService;
|
||||
@Resource
|
||||
private ExecTaskItemMapper execTaskItemMapper;
|
||||
private ApiCommonService apiCommonService;
|
||||
|
||||
public TestPlanApiCaseRerunService() {
|
||||
TaskRerunServiceInvoker.register(ExecTaskType.TEST_PLAN_API_CASE, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rerun(ExecTask execTask, List<String> taskItemIds, String userId) {
|
||||
ExecTaskItem execTaskItem = execTaskItemMapper.selectByPrimaryKey(taskItemIds.getFirst());
|
||||
public void rerun(ExecTask execTask, String userId) {
|
||||
ExecTaskItem execTaskItem = apiCommonService.getRerunTaskItem(execTask.getId());
|
||||
testPlanApiCaseService.runRun(execTask, execTaskItem, userId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,18 +1,16 @@
|
|||
package io.metersphere.plan.service.rerun;
|
||||
|
||||
import io.metersphere.api.service.ApiCommonService;
|
||||
import io.metersphere.plan.service.TestPlanApiScenarioService;
|
||||
import io.metersphere.sdk.constants.ExecTaskType;
|
||||
import io.metersphere.system.domain.ExecTask;
|
||||
import io.metersphere.system.domain.ExecTaskItem;
|
||||
import io.metersphere.system.invoker.TaskRerunServiceInvoker;
|
||||
import io.metersphere.system.mapper.ExecTaskItemMapper;
|
||||
import io.metersphere.system.service.TaskRerunService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: jianxing
|
||||
* @CreateTime: 2024-02-06 20:47
|
||||
|
@ -23,15 +21,16 @@ public class TestPlanApiScenarioRerunService implements TaskRerunService {
|
|||
@Resource
|
||||
private TestPlanApiScenarioService testPlanApiScenarioService;
|
||||
@Resource
|
||||
private ExecTaskItemMapper execTaskItemMapper;
|
||||
private ApiCommonService apiCommonService;
|
||||
|
||||
|
||||
public TestPlanApiScenarioRerunService() {
|
||||
TaskRerunServiceInvoker.register(ExecTaskType.TEST_PLAN_API_SCENARIO, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rerun(ExecTask execTask, List<String> taskItemIds, String userId) {
|
||||
ExecTaskItem execTaskItem = execTaskItemMapper.selectByPrimaryKey(taskItemIds.getFirst());
|
||||
public void rerun(ExecTask execTask, String userId) {
|
||||
ExecTaskItem execTaskItem = apiCommonService.getRerunTaskItem(execTask.getId());
|
||||
testPlanApiScenarioService.runRun(execTask, execTaskItem, userId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
package io.metersphere.plan.service.rerun;
|
||||
|
||||
import io.metersphere.plan.service.TestPlanExecuteService;
|
||||
import io.metersphere.sdk.constants.ExecTaskType;
|
||||
import io.metersphere.system.domain.ExecTask;
|
||||
import io.metersphere.system.invoker.TaskRerunServiceInvoker;
|
||||
import io.metersphere.system.service.TaskRerunService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
/**
|
||||
* @Author: jianxing
|
||||
* @CreateTime: 2024-02-06 20:47
|
||||
*/
|
||||
@Service
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public class TestPlanGroupRerunService implements TaskRerunService {
|
||||
@Resource
|
||||
private TestPlanExecuteService testPlanExecuteService;
|
||||
|
||||
public TestPlanGroupRerunService() {
|
||||
TaskRerunServiceInvoker.register(ExecTaskType.TEST_PLAN_GROUP, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rerun(ExecTask execTask, String userId) {
|
||||
Thread.startVirtualThread(() -> testPlanExecuteService.testPlanOrGroupRerun(execTask, userId));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package io.metersphere.plan.service.rerun;
|
||||
|
||||
import io.metersphere.plan.service.TestPlanExecuteService;
|
||||
import io.metersphere.sdk.constants.ExecTaskType;
|
||||
import io.metersphere.system.domain.ExecTask;
|
||||
import io.metersphere.system.invoker.TaskRerunServiceInvoker;
|
||||
import io.metersphere.system.service.TaskRerunService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
/**
|
||||
* @Author: jianxing
|
||||
* @CreateTime: 2024-02-06 20:47
|
||||
*/
|
||||
@Service
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public class TestPlanRerunService implements TaskRerunService {
|
||||
@Resource
|
||||
private TestPlanExecuteService testPlanExecuteService;
|
||||
|
||||
public TestPlanRerunService() {
|
||||
TaskRerunServiceInvoker.register(ExecTaskType.TEST_PLAN, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rerun(ExecTask execTask, String userId) {
|
||||
Thread.startVirtualThread(() -> testPlanExecuteService.testPlanOrGroupRerun(execTask, userId));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue