feat(项目设置): 模板支持设置系统字段默认值

This commit is contained in:
AgAngle 2023-11-09 17:15:41 +08:00 committed by Craftsman
parent 51aa8771b4
commit af79281e22
21 changed files with 378 additions and 139 deletions

View File

@ -39,6 +39,10 @@ public class TemplateCustomField implements Serializable {
@Schema(description = "默认值")
private String defaultValue;
@Schema(description = "", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "{template_custom_field.system_field.not_blank}", groups = {Created.class})
private Boolean systemField;
private static final long serialVersionUID = 1L;
public enum Column {
@ -48,7 +52,8 @@ public class TemplateCustomField implements Serializable {
required("required", "required", "BIT", false),
pos("pos", "pos", "INTEGER", false),
apiFieldId("api_field_id", "apiFieldId", "VARCHAR", false),
defaultValue("default_value", "defaultValue", "VARCHAR", false);
defaultValue("default_value", "defaultValue", "VARCHAR", false),
systemField("system_field", "systemField", "BIT", false);
private static final String BEGINNING_DELIMITER = "`";

View File

@ -573,6 +573,66 @@ public class TemplateCustomFieldExample {
addCriterion("default_value not between", value1, value2, "defaultValue");
return (Criteria) this;
}
public Criteria andSystemFieldIsNull() {
addCriterion("system_field is null");
return (Criteria) this;
}
public Criteria andSystemFieldIsNotNull() {
addCriterion("system_field is not null");
return (Criteria) this;
}
public Criteria andSystemFieldEqualTo(Boolean value) {
addCriterion("system_field =", value, "systemField");
return (Criteria) this;
}
public Criteria andSystemFieldNotEqualTo(Boolean value) {
addCriterion("system_field <>", value, "systemField");
return (Criteria) this;
}
public Criteria andSystemFieldGreaterThan(Boolean value) {
addCriterion("system_field >", value, "systemField");
return (Criteria) this;
}
public Criteria andSystemFieldGreaterThanOrEqualTo(Boolean value) {
addCriterion("system_field >=", value, "systemField");
return (Criteria) this;
}
public Criteria andSystemFieldLessThan(Boolean value) {
addCriterion("system_field <", value, "systemField");
return (Criteria) this;
}
public Criteria andSystemFieldLessThanOrEqualTo(Boolean value) {
addCriterion("system_field <=", value, "systemField");
return (Criteria) this;
}
public Criteria andSystemFieldIn(List<Boolean> values) {
addCriterion("system_field in", values, "systemField");
return (Criteria) this;
}
public Criteria andSystemFieldNotIn(List<Boolean> values) {
addCriterion("system_field not in", values, "systemField");
return (Criteria) this;
}
public Criteria andSystemFieldBetween(Boolean value1, Boolean value2) {
addCriterion("system_field between", value1, value2, "systemField");
return (Criteria) this;
}
public Criteria andSystemFieldNotBetween(Boolean value1, Boolean value2) {
addCriterion("system_field not between", value1, value2, "systemField");
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {

View File

@ -9,6 +9,7 @@
<result column="pos" jdbcType="INTEGER" property="pos" />
<result column="api_field_id" jdbcType="VARCHAR" property="apiFieldId" />
<result column="default_value" jdbcType="VARCHAR" property="defaultValue" />
<result column="system_field" jdbcType="BIT" property="systemField" />
</resultMap>
<sql id="Example_Where_Clause">
<where>
@ -69,7 +70,7 @@
</where>
</sql>
<sql id="Base_Column_List">
id, field_id, template_id, required, pos, api_field_id, default_value
id, field_id, template_id, required, pos, api_field_id, default_value, system_field
</sql>
<select id="selectByExample" parameterType="io.metersphere.system.domain.TemplateCustomFieldExample" resultMap="BaseResultMap">
select
@ -104,10 +105,10 @@
<insert id="insert" parameterType="io.metersphere.system.domain.TemplateCustomField">
insert into template_custom_field (id, field_id, template_id,
required, pos, api_field_id,
default_value)
default_value, system_field)
values (#{id,jdbcType=VARCHAR}, #{fieldId,jdbcType=VARCHAR}, #{templateId,jdbcType=VARCHAR},
#{required,jdbcType=BIT}, #{pos,jdbcType=INTEGER}, #{apiFieldId,jdbcType=VARCHAR},
#{defaultValue,jdbcType=VARCHAR})
#{defaultValue,jdbcType=VARCHAR}, #{systemField,jdbcType=BIT})
</insert>
<insert id="insertSelective" parameterType="io.metersphere.system.domain.TemplateCustomField">
insert into template_custom_field
@ -133,6 +134,9 @@
<if test="defaultValue != null">
default_value,
</if>
<if test="systemField != null">
system_field,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
@ -156,6 +160,9 @@
<if test="defaultValue != null">
#{defaultValue,jdbcType=VARCHAR},
</if>
<if test="systemField != null">
#{systemField,jdbcType=BIT},
</if>
</trim>
</insert>
<select id="countByExample" parameterType="io.metersphere.system.domain.TemplateCustomFieldExample" resultType="java.lang.Long">
@ -188,6 +195,9 @@
<if test="record.defaultValue != null">
default_value = #{record.defaultValue,jdbcType=VARCHAR},
</if>
<if test="record.systemField != null">
system_field = #{record.systemField,jdbcType=BIT},
</if>
</set>
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
@ -201,7 +211,8 @@
required = #{record.required,jdbcType=BIT},
pos = #{record.pos,jdbcType=INTEGER},
api_field_id = #{record.apiFieldId,jdbcType=VARCHAR},
default_value = #{record.defaultValue,jdbcType=VARCHAR}
default_value = #{record.defaultValue,jdbcType=VARCHAR},
system_field = #{record.systemField,jdbcType=BIT}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -227,6 +238,9 @@
<if test="defaultValue != null">
default_value = #{defaultValue,jdbcType=VARCHAR},
</if>
<if test="systemField != null">
system_field = #{systemField,jdbcType=BIT},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
@ -237,17 +251,19 @@
required = #{required,jdbcType=BIT},
pos = #{pos,jdbcType=INTEGER},
api_field_id = #{apiFieldId,jdbcType=VARCHAR},
default_value = #{defaultValue,jdbcType=VARCHAR}
default_value = #{defaultValue,jdbcType=VARCHAR},
system_field = #{systemField,jdbcType=BIT}
where id = #{id,jdbcType=VARCHAR}
</update>
<insert id="batchInsert" parameterType="map">
insert into template_custom_field
(id, field_id, template_id, required, pos, api_field_id, default_value)
(id, field_id, template_id, required, pos, api_field_id, default_value, system_field
)
values
<foreach collection="list" item="item" separator=",">
(#{item.id,jdbcType=VARCHAR}, #{item.fieldId,jdbcType=VARCHAR}, #{item.templateId,jdbcType=VARCHAR},
#{item.required,jdbcType=BIT}, #{item.pos,jdbcType=INTEGER}, #{item.apiFieldId,jdbcType=VARCHAR},
#{item.defaultValue,jdbcType=VARCHAR})
#{item.defaultValue,jdbcType=VARCHAR}, #{item.systemField,jdbcType=BIT})
</foreach>
</insert>
<insert id="batchInsertSelective" parameterType="map">
@ -281,6 +297,9 @@
<if test="'default_value'.toString() == column.value">
#{item.defaultValue,jdbcType=VARCHAR}
</if>
<if test="'system_field'.toString() == column.value">
#{item.systemField,jdbcType=BIT}
</if>
</foreach>
)
</foreach>

View File

@ -397,9 +397,10 @@ CREATE TABLE IF NOT EXISTS template_custom_field(
`field_id` VARCHAR(50) NOT NULL COMMENT '字段ID' ,
`template_id` VARCHAR(50) NOT NULL COMMENT '模版ID' ,
`required` BIT NOT NULL DEFAULT 0 COMMENT '是否必填' ,
`system_field` BIT NOT NULL DEFAULT 0 COMMENT '是否是系统字段' ,
`pos` INT NOT NULL DEFAULT 0 COMMENT '排序字段' ,
`api_field_id` VARCHAR(255) COMMENT 'api字段名' ,
`default_value` VARCHAR(500) COMMENT '默认值' ,
`default_value` VARCHAR(1500) COMMENT '默认值' ,
PRIMARY KEY (id)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4

View File

@ -205,8 +205,8 @@ VALUES ((select id from custom_field where name = 'functional_priority'), 'P3',
-- 初始化组织功能用例模板
INSERT INTO template (id,name,remark,internal,update_time,create_time,create_user,scope_type,scope_id,enable_third_part, scene)
VALUES (UUID_SHORT(), 'functional_default', '', 1, UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, 'admin', 'ORGANIZATION', '100001', 0, 'FUNCTIONAL');
INSERT INTO template_custom_field(id, field_id, template_id, required, pos, api_field_id, default_value)
VALUES(UUID_SHORT(), (select id from custom_field where name = 'functional_priority'), (select id from template where name = 'functional_default'), 1, 0, NULL, NULL);
INSERT INTO template_custom_field(id, field_id, template_id, required, pos, system_field, api_field_id, default_value)
VALUES(UUID_SHORT(), (select id from custom_field where name = 'functional_priority'), (select id from template where name = 'functional_default'), 1, 0, 0, NULL, NULL);
-- 初始化默认项目版本
INSERT INTO project_version (id, project_id, name, description, status, latest, publish_time, start_time, end_time, create_time, create_user) VALUES (UUID_SHORT(), '100001100001', 'v1.0', NULL, 'open', 1, UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, 'admin');
@ -228,12 +228,12 @@ VALUES ((select id from custom_field where name = 'functional_priority' and scop
INSERT INTO template (id,name,remark,internal,update_time,create_time,create_user,scope_type,scope_id,enable_third_part, scene, ref_id)
VALUES (UUID_SHORT(), 'functional_default', '', 1, UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, 'admin', 'PROJECT', '100001100001', 0, 'FUNCTIONAL',
(SELECT id FROM (SELECT * FROM template) t where name = 'functional_default'));
INSERT INTO template_custom_field(id, field_id, template_id, required, pos, api_field_id, default_value)
INSERT INTO template_custom_field(id, field_id, template_id, required, pos, system_field, api_field_id, default_value)
VALUES(
UUID_SHORT(),
(select id from custom_field where name = 'functional_priority' and scope_id = '100001100001'),
(select id from template where name = 'functional_default' and scope_id = '100001100001'),
1, 0, NULL, null
1, 0, 0, NULL, null
);
-- 初始化组织缺陷模板

View File

@ -232,6 +232,16 @@ permission.system_organization_project_member.add=添加成员
permission.system_organization_project_member.delete=删除成员
permission.system_operation_log.name=日志
permission.organization_operation_log.name=日志
# template
permission.system_template_custom_field.name=模板和字段的关联关系
template_custom_field.exist=模板和字段的关联关系已存在
template_custom_field.id.not_blank=ID不能为空
template_custom_field.id.length_range=ID长度必须在{min}和{max}之间
template_custom_field.field_id.not_blank=字段ID不能为空
template_custom_field.field_id.length_range=字段ID长度必须在{min}和{max}之间
template_custom_field.template_id.not_blank=模版ID不能为空
template_custom_field.template_id.length_range=模版ID长度必须在{min}和{max}之间
template_custom_field.default_value.length_range=默认值长度必须小于{max}
permission.organization_custom_field.name=自定义字段
permission.organization_template.name=模板
permission.system_organization_template.enable=启用项目模板

View File

@ -234,6 +234,16 @@ permission.system_organization_project_member.add=Add member
permission.system_organization_project_member.delete=Delete member
permission.system_operation_log.name=Operation log
permission.organization_operation_log.name=Operation log
permission.system_template_custom_field.name=模板和字段的关联关系
template_custom_field.exist=模板和字段的关联关系 already exists
template_custom_field.id.not_blank=id cannot be empty
template_custom_field.id.length_range=id length must be between {min} and {max}
template_custom_field.field_id.not_blank=fieldId cannot be empty
template_custom_field.field_id.length_range=fieldId length must be between {min} and {max}
template_custom_field.template_id.not_blank=templateId cannot be empty
template_custom_field.template_id.length_range=templateId length must be between {min} and {max}
template_custom_field.default_value.length_range=default value length must be less than{max}
permission.organization_custom_field.name=Custom Field
permission.organization_template.name=Template
permission.system_organization_template.enable=Enable project templates

View File

@ -234,6 +234,16 @@ permission.system_organization_project_member.add=添加成员
permission.system_organization_project_member.delete=删除成员
permission.system_operation_log.name=日志
permission.organization_operation_log.name=日志
# template
permission.system_template_custom_field.name=模板和字段的关联关系
template_custom_field.exist=模板和字段的关联关系已存在
template_custom_field.id.not_blank=ID不能为空
template_custom_field.id.length_range=ID长度必须在{min}和{max}之间
template_custom_field.field_id.not_blank=字段ID不能为空
template_custom_field.field_id.length_range=字段ID长度必须在{min}和{max}之间
template_custom_field.template_id.not_blank=模版ID不能为空
template_custom_field.template_id.length_range=模版ID长度必须在{min}和{max}之间
template_custom_field.default_value.length_range=默认值长度必须小于{max}
permission.organization_custom_field.name=自定义字段
permission.organization_template.name=模板
permission.system_organization_template.enable=启用项目模板

View File

@ -234,6 +234,16 @@ permission.system_organization_project_member.add=添加成员
permission.system_organization_project_member.delete=删除成员
permission.system_operation_log.name=日志
permission.organization_operation_log.name=日志
# template
permission.system_template_custom_field.name=模板和字段的關聯關係
template_custom_field.exist=模板和字段的關聯關係已存在
template_custom_field.id.not_blank=ID不能為空
template_custom_field.id.length_range=ID長度必須在{min}和{max}之間
template_custom_field.field_id.not_blank=字段ID不能為空
template_custom_field.field_id.length_range=字段ID長度必須在{min}和{max}之間
template_custom_field.template_id.not_blank=模版ID不能為空
template_custom_field.template_id.length_range=模版ID長度必須在{min}和{max}之間
template_custom_field.default_value.length_range=默認值長度必須小於{max}
permission.organization_custom_field.name=自定義字段
permission.organization_template.name=模板
permission.system_organization_template.enable=啟用項目模板

View File

@ -4,10 +4,9 @@ import io.metersphere.project.dto.ProjectTemplateDTO;
import io.metersphere.project.service.ProjectTemplateLogService;
import io.metersphere.project.service.ProjectTemplateService;
import io.metersphere.sdk.constants.PermissionConstants;
import io.metersphere.system.domain.Template;
import io.metersphere.system.dto.sdk.TemplateDTO;
import io.metersphere.system.dto.sdk.request.TemplateUpdateRequest;
import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.system.domain.Template;
import io.metersphere.system.log.annotation.Log;
import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.utils.SessionUtils;
@ -56,22 +55,17 @@ public class ProjectTemplateController {
@PostMapping("/add")
@Operation(summary = "创建模版")
@RequiresPermissions(PermissionConstants.PROJECT_TEMPLATE_ADD)
@Log(type = OperationLogType.UPDATE, expression = "#msClass.addLog(#request)", msClass = ProjectTemplateLogService.class)
@Log(type = OperationLogType.ADD, expression = "#msClass.addLog(#request)", msClass = ProjectTemplateLogService.class)
public Template add(@Validated({Created.class}) @RequestBody TemplateUpdateRequest request) {
Template template = new Template();
BeanUtils.copyBean(template, request);
template.setCreateUser(SessionUtils.getUserId());
return projectTemplateservice.add(template, request.getCustomFields());
return projectTemplateservice.add(request, SessionUtils.getUserId());
}
@PostMapping("/update")
@Operation(summary = "更新模版")
@RequiresPermissions(PermissionConstants.PROJECT_TEMPLATE_UPDATE)
@Log(type = OperationLogType.ADD, expression = "#msClass.updateLog(#request)", msClass = ProjectTemplateLogService.class)
@Log(type = OperationLogType.UPDATE, expression = "#msClass.updateLog(#request)", msClass = ProjectTemplateLogService.class)
public Template update(@Validated({Updated.class}) @RequestBody TemplateUpdateRequest request) {
Template template = new Template();
BeanUtils.copyBean(template, request);
return projectTemplateservice.update(template, request.getCustomFields());
return projectTemplateservice.update(request);
}
@GetMapping("/delete/{id}")

View File

@ -16,8 +16,8 @@ import io.metersphere.sdk.util.Translator;
import io.metersphere.system.domain.*;
import io.metersphere.system.dto.ProjectDTO;
import io.metersphere.system.dto.sdk.TemplateDTO;
import io.metersphere.system.dto.sdk.request.TemplateCustomFieldRequest;
import io.metersphere.system.mapper.CustomFieldOptionMapper;
import io.metersphere.system.dto.sdk.request.TemplateUpdateRequest;
import io.metersphere.system.service.BaseTemplateService;
import io.metersphere.system.service.PlatformPluginService;
import io.metersphere.system.service.PluginLoadService;
@ -296,26 +296,28 @@ public class ProjectTemplateService extends BaseTemplateService {
return super.getTemplateDTO(template);
}
@Override
public Template add(Template template, List<TemplateCustomFieldRequest> customFields) {
public Template add(TemplateUpdateRequest request, String creator) {
Template template = BeanUtils.copyBean(new Template(), request);
template.setCreateUser(creator);
checkProjectResourceExist(template);
checkProjectTemplateEnable(template.getScopeId(), template.getScene());
template.setScopeType(TemplateScopeType.PROJECT.name());
template.setRefId(null);
return super.add(template, customFields);
return super.add(template, request.getCustomFields(), request.getSystemFields());
}
public void checkProjectResourceExist(Template template) {
projectService.checkResourceExist(template.getScopeId());
}
@Override
public Template update(Template template, List<TemplateCustomFieldRequest> customFields) {
public Template update(TemplateUpdateRequest request) {
Template template = new Template();
BeanUtils.copyBean(template, request);
Template originTemplate = super.getWithCheck(template.getId());
checkProjectTemplateEnable(originTemplate.getScopeId(), originTemplate.getScene());
template.setScopeId(originTemplate.getScopeId());
checkProjectResourceExist(originTemplate);
return super.update(template, customFields);
return super.update(template, request.getCustomFields(), request.getSystemFields());
}
@Override

View File

@ -7,15 +7,17 @@ import io.metersphere.sdk.constants.OrganizationParameterConstants;
import io.metersphere.sdk.constants.PermissionConstants;
import io.metersphere.sdk.constants.TemplateScene;
import io.metersphere.sdk.constants.TemplateScopeType;
import io.metersphere.system.dto.sdk.TemplateCustomFieldDTO;
import io.metersphere.system.dto.sdk.TemplateDTO;
import io.metersphere.system.dto.sdk.request.TemplateCustomFieldRequest;
import io.metersphere.system.dto.sdk.request.TemplateUpdateRequest;
import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.system.base.BasePluginTestService;
import io.metersphere.system.base.BaseTest;
import io.metersphere.system.controller.OrganizationTemplateControllerTests;
import io.metersphere.system.controller.param.TemplateUpdateRequestDefinition;
import io.metersphere.system.domain.*;
import io.metersphere.system.domain.CustomField;
import io.metersphere.system.domain.OrganizationParameter;
import io.metersphere.system.domain.Template;
import io.metersphere.system.dto.sdk.TemplateDTO;
import io.metersphere.system.dto.sdk.request.TemplateCustomFieldRequest;
import io.metersphere.system.dto.sdk.request.TemplateUpdateRequest;
import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.mapper.OrganizationParameterMapper;
import io.metersphere.system.mapper.TemplateMapper;
@ -109,6 +111,7 @@ public class ProjectTemplateControllerTests extends BaseTest {
request.setEnableThirdPart(true);
request.setScopeId(DEFAULT_PROJECT_ID);
request.setCustomFields(List.of(templateCustomFieldRequest));
request.setSystemFields(OrganizationTemplateControllerTests.getTemplateSystemCustomFieldRequests());
MvcResult mvcResult = this.requestPostWithOkAndReturn(DEFAULT_ADD, request);
@ -119,11 +122,12 @@ public class ProjectTemplateControllerTests extends BaseTest {
request.setId(template.getId());
TemplateUpdateRequest copyRequest = BeanUtils.copyBean(new TemplateUpdateRequest(), request);
copyRequest.setCustomFields(null);
copyRequest.setSystemFields(null);
Assertions.assertEquals(copyRequest, BeanUtils.copyBean(new TemplateUpdateRequest(), template));
Assertions.assertEquals(template.getCreateUser(), ADMIN.getValue());
Assertions.assertEquals(template.getInternal(), false);
Assertions.assertEquals(template.getScopeType(), TemplateScopeType.PROJECT.name());
assertTemplateCustomFields(request, template);
OrganizationTemplateControllerTests.assertTemplateCustomFields(request, template);
// @@重名校验异常
assertErrorCode(this.requestPost(DEFAULT_ADD, request), TEMPLATE_EXIST);
@ -140,6 +144,8 @@ public class ProjectTemplateControllerTests extends BaseTest {
// 插入另一条数据用户更新时重名校验
request.setScopeId(DEFAULT_PROJECT_ID);
request.setCustomFields(null);
request.setSystemFields(null);
MvcResult anotherMvcResult = this.requestPostWithOkAndReturn(DEFAULT_ADD, request);
this.anotherTemplateField = templateMapper.selectByPrimaryKey(getResultData(anotherMvcResult, Template.class).getId());
@ -151,20 +157,6 @@ public class ProjectTemplateControllerTests extends BaseTest {
requestPostPermissionTest(PermissionConstants.PROJECT_TEMPLATE_ADD, DEFAULT_ADD, request);
}
private void assertTemplateCustomFields(TemplateUpdateRequest request, Template template) {
List<TemplateCustomField> templateCustomFields = baseTemplateCustomFieldService.getByTemplateId(template.getId());
Assertions.assertEquals(templateCustomFields.size(), request.getCustomFields().size());
for (int i = 0; i < templateCustomFields.size(); i++) {
TemplateCustomField templateCustomField = templateCustomFields.get(i);
TemplateCustomFieldRequest customFieldRequest = request.getCustomFields().get(i);
Assertions.assertEquals(templateCustomField.getFieldId(), customFieldRequest.getFieldId());
Assertions.assertEquals(templateCustomField.getTemplateId(), template.getId());
Assertions.assertEquals(templateCustomField.getRequired(), customFieldRequest.getRequired());
Assertions.assertEquals(templateCustomField.getApiFieldId(), customFieldRequest.getApiFieldId());
Assertions.assertEquals(templateCustomField.getDefaultValue(), customFieldRequest.getDefaultValue());
}
}
private TemplateCustomFieldRequest getTemplateCustomFieldRequest(String scene) {
List<CustomField> customFields = baseCustomFieldService.getByScopeIdAndScene(DEFAULT_PROJECT_ID, scene);
CustomField customField = customFields.stream()
@ -194,6 +186,8 @@ public class ProjectTemplateControllerTests extends BaseTest {
request.setScene(TemplateScene.UI.name());
request.setEnableThirdPart(true);
request.setCustomFields(new ArrayList<>(0));
request.setSystemFields(OrganizationTemplateControllerTests.getTemplateSystemCustomFieldRequests());
request.getSystemFields().get(0).setDefaultValue("update");
this.requestPostWithOk(DEFAULT_UPDATE, request);
Template template = templateMapper.selectByPrimaryKey(request.getId());
// 校验请求成功数据
@ -205,18 +199,18 @@ public class ProjectTemplateControllerTests extends BaseTest {
Assertions.assertEquals(template.getScopeType(), TemplateScopeType.PROJECT.name());
Assertions.assertEquals(template.getScene(), scene);
Assertions.assertEquals(template.getEnableThirdPart(), request.getEnableThirdPart());
assertTemplateCustomFields(request, template);
OrganizationTemplateControllerTests.assertTemplateCustomFields(request, template);
// 带字段的更新
TemplateCustomFieldRequest templateCustomFieldRequest = getTemplateCustomFieldRequest(scene);
request.setCustomFields(List.of(templateCustomFieldRequest));
this.requestPostWithOk(DEFAULT_UPDATE, request);
assertTemplateCustomFields(request, template);
OrganizationTemplateControllerTests.assertTemplateCustomFields(request, template);
// 不更新字段
request.setCustomFields(null);
this.requestPostWithOk(DEFAULT_UPDATE, request);
Assertions.assertEquals(baseTemplateCustomFieldService.getByTemplateId(template.getId()).size(), 1);
Assertions.assertEquals(baseTemplateCustomFieldService.getByTemplateId(template.getId()).size(), 3);
// @校验是否开启项目模板
changeOrgTemplateEnable(true);
@ -342,19 +336,7 @@ public class ProjectTemplateControllerTests extends BaseTest {
.andReturn();
// 校验数据是否正确
TemplateDTO templateDTO = getResultData(mvcResult, TemplateDTO.class);
Template template = templateMapper.selectByPrimaryKey(templateDTO.getId());
Assertions.assertEquals(template, BeanUtils.copyBean(new Template(), templateDTO));
List<TemplateCustomFieldDTO> customFields = templateDTO.getCustomFields();
List<TemplateCustomField> templateCustomFields = baseTemplateCustomFieldService.getByTemplateId(template.getId());
for (int i = 0; i < customFields.size(); i++) {
TemplateCustomFieldDTO customFieldDTO = customFields.get(i);
TemplateCustomField templateCustomField = templateCustomFields.get(i);
Assertions.assertEquals(customFieldDTO.getFieldId(), templateCustomField.getFieldId());
Assertions.assertEquals(customFieldDTO.getApiFieldId(), templateCustomField.getApiFieldId());
Assertions.assertEquals(customFieldDTO.getRequired(), templateCustomField.getRequired());
Assertions.assertEquals(templateCustomField.getTemplateId(), template.getId());
Assertions.assertEquals(customFieldDTO.getFieldName(), "用例等级");
}
OrganizationTemplateControllerTests.assertGetTemplateDTO(templateDTO);
// @@校验权限
requestGetPermissionTest(PermissionConstants.PROJECT_TEMPLATE_READ, DEFAULT_GET, templateDTO.getId());

View File

@ -1,15 +1,14 @@
package io.metersphere.system.controller;
import io.metersphere.sdk.constants.PermissionConstants;
import io.metersphere.system.domain.Template;
import io.metersphere.system.dto.sdk.TemplateDTO;
import io.metersphere.system.dto.sdk.request.TemplateUpdateRequest;
import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.system.utils.SessionUtils;
import io.metersphere.system.domain.Template;
import io.metersphere.system.log.annotation.Log;
import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.service.OrganizationTemplateLogService;
import io.metersphere.system.service.OrganizationTemplateService;
import io.metersphere.system.utils.SessionUtils;
import io.metersphere.validation.groups.Created;
import io.metersphere.validation.groups.Updated;
import io.swagger.v3.oas.annotations.Operation;
@ -57,10 +56,7 @@ public class OrganizationTemplateController {
@RequiresPermissions(PermissionConstants.ORGANIZATION_TEMPLATE_ADD)
@Log(type = OperationLogType.UPDATE, expression = "#msClass.addLog(#request)", msClass = OrganizationTemplateLogService.class)
public Template add(@Validated({Created.class}) @RequestBody TemplateUpdateRequest request) {
Template template = new Template();
BeanUtils.copyBean(template, request);
template.setCreateUser(SessionUtils.getUserId());
return organizationTemplateService.add(template, request.getCustomFields());
return organizationTemplateService.add(request, SessionUtils.getUserId());
}
@PostMapping("/update")
@ -68,9 +64,7 @@ public class OrganizationTemplateController {
@RequiresPermissions(PermissionConstants.ORGANIZATION_TEMPLATE_UPDATE)
@Log(type = OperationLogType.ADD, expression = "#msClass.updateLog(#request)", msClass = OrganizationTemplateLogService.class)
public Template update(@Validated({Updated.class}) @RequestBody TemplateUpdateRequest request) {
Template template = new Template();
BeanUtils.copyBean(template, request);
return organizationTemplateService.update(template, request.getCustomFields());
return organizationTemplateService.update(request);
}
@GetMapping("/delete/{id}")

View File

@ -8,6 +8,8 @@ import java.util.List;
@Data
public class TemplateDTO extends Template {
@Schema(description = "相关的自定义字段")
@Schema(description = "模板关联的自定义字段")
List<TemplateCustomFieldDTO> customFields;
@Schema(description = "系统字段配置")
List<TemplateCustomFieldDTO> systemFields;
}

View File

@ -0,0 +1,20 @@
package io.metersphere.system.dto.sdk.request;
import io.metersphere.validation.groups.Created;
import io.metersphere.validation.groups.Updated;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Data
public class TemplateSystemCustomFieldRequest {
@Schema(title = "字段ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{custom_field.id.not_blank}", groups = {Created.class})
@Size(min = 1, max = 50, message = "{template_custom_field.field_id.length_range}", groups = {Created.class, Updated.class})
private String fieldId;
@Schema(title = "默认值")
private Object defaultValue;
}

View File

@ -44,4 +44,8 @@ public class TemplateUpdateRequest {
@Valid
@Schema(title = "自定义字段Id列表")
private List<TemplateCustomFieldRequest> customFields;
@Valid
@Schema(title = "系统字段列表")
private List<TemplateSystemCustomFieldRequest> systemFields;
}

View File

@ -1,14 +1,15 @@
package io.metersphere.system.service;
import io.metersphere.system.dto.sdk.request.TemplateCustomFieldRequest;
import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.system.domain.CustomField;
import io.metersphere.system.domain.TemplateCustomField;
import io.metersphere.system.domain.TemplateCustomFieldExample;
import io.metersphere.system.dto.CustomFieldDao;
import io.metersphere.system.dto.sdk.request.TemplateCustomFieldRequest;
import io.metersphere.system.mapper.TemplateCustomFieldMapper;
import io.metersphere.system.resolver.field.AbstractCustomFieldResolver;
import io.metersphere.system.resolver.field.CustomFieldResolverFactory;
import io.metersphere.system.uid.IDGenerator;
import jakarta.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
@ -17,7 +18,6 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import io.metersphere.system.uid.IDGenerator;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
@ -35,7 +35,16 @@ public class BaseTemplateCustomFieldService {
public void deleteByTemplateId(String templateId) {
TemplateCustomFieldExample example = new TemplateCustomFieldExample();
example.createCriteria().andTemplateIdEqualTo(templateId);
example.createCriteria()
.andTemplateIdEqualTo(templateId);
templateCustomFieldMapper.deleteByExample(example);
}
public void deleteByTemplateIdAndSystem(String templateId, boolean isSystem) {
TemplateCustomFieldExample example = new TemplateCustomFieldExample();
example.createCriteria()
.andTemplateIdEqualTo(templateId)
.andSystemFieldEqualTo(isSystem);
templateCustomFieldMapper.deleteByExample(example);
}
@ -48,11 +57,10 @@ public class BaseTemplateCustomFieldService {
templateCustomFieldMapper.deleteByExample(example);
}
public void addByTemplateId(String id, List<TemplateCustomFieldRequest> customFieldRequests) {
public void addCustomFieldByTemplateId(String id, List<TemplateCustomFieldRequest> customFieldRequests) {
if (CollectionUtils.isEmpty(customFieldRequests)) {
return;
}
// 过滤下不存在的字段
List<String> ids = customFieldRequests.stream().map(TemplateCustomFieldRequest::getFieldId).toList();
Set<String> fieldIdSet = baseCustomFieldService.getByIds(ids)
@ -62,18 +70,28 @@ public class BaseTemplateCustomFieldService {
customFieldRequests = customFieldRequests.stream()
.filter(item -> fieldIdSet.contains(item.getFieldId()))
.toList();
this.addByTemplateId(id, customFieldRequests, false);
}
public void addSystemFieldByTemplateId(String id, List<TemplateCustomFieldRequest> customFieldRequests) {
if (CollectionUtils.isEmpty(customFieldRequests)) {
return;
}
this.addByTemplateId(id, customFieldRequests, true);
}
private void addByTemplateId(String templateId, List<TemplateCustomFieldRequest> customFieldRequests, boolean isSystem) {
AtomicReference<Integer> pos = new AtomicReference<>(0);
List<TemplateCustomField> templateCustomFields = customFieldRequests.stream().map(field -> {
TemplateCustomField templateCustomField = new TemplateCustomField();
templateCustomField.setId(IDGenerator.nextStr());
BeanUtils.copyBean(templateCustomField, field);
templateCustomField.setTemplateId(id);
templateCustomField.setTemplateId(templateId);
templateCustomField.setPos(pos.getAndSet(pos.get() + 1));
templateCustomField.setDefaultValue(parseDefaultValue(field));
templateCustomField.setDefaultValue(isSystem ? field.getDefaultValue().toString() : parseDefaultValue(field));
templateCustomField.setSystemField(isSystem);
return templateCustomField;
}).toList();
if (templateCustomFields.size() > 0) {
templateCustomFieldMapper.batchInsert(templateCustomFields);
}

View File

@ -13,6 +13,7 @@ import io.metersphere.system.domain.TemplateExample;
import io.metersphere.system.dto.sdk.TemplateCustomFieldDTO;
import io.metersphere.system.dto.sdk.TemplateDTO;
import io.metersphere.system.dto.sdk.request.TemplateCustomFieldRequest;
import io.metersphere.system.dto.sdk.request.TemplateSystemCustomFieldRequest;
import io.metersphere.system.mapper.TemplateMapper;
import io.metersphere.system.resolver.field.AbstractCustomFieldResolver;
import io.metersphere.system.resolver.field.CustomFieldResolverFactory;
@ -20,6 +21,7 @@ import io.metersphere.system.uid.IDGenerator;
import io.metersphere.system.utils.ServiceUtils;
import jakarta.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -109,41 +111,54 @@ public class BaseTemplateService {
return customField;
}));
// 封装字段信息
List<TemplateCustomFieldDTO> fieldDTOS = templateCustomFields.stream().map(i -> {
CustomField customField = fieldMap.get(i.getFieldId());
TemplateCustomFieldDTO templateCustomFieldDTO = new TemplateCustomFieldDTO();
BeanUtils.copyBean(templateCustomFieldDTO, i);
templateCustomFieldDTO.setFieldName(customField.getName());
AbstractCustomFieldResolver customFieldResolver = CustomFieldResolverFactory.getResolver(customField.getType());
Object defaultValue = null;
try {
defaultValue = customFieldResolver.parse2Value(i.getDefaultValue());
} catch (Exception e) {
LogUtils.error(e);
}
templateCustomFieldDTO.setDefaultValue(defaultValue);
return templateCustomFieldDTO;
}).toList();
// 封装自定义字段信息
List<TemplateCustomFieldDTO> fieldDTOS = templateCustomFields.stream()
.filter(i -> !BooleanUtils.isTrue(i.getSystemField()))
.map(i -> {
CustomField customField = fieldMap.get(i.getFieldId());
TemplateCustomFieldDTO templateCustomFieldDTO = new TemplateCustomFieldDTO();
BeanUtils.copyBean(templateCustomFieldDTO, i);
templateCustomFieldDTO.setFieldName(customField.getName());
AbstractCustomFieldResolver customFieldResolver = CustomFieldResolverFactory.getResolver(customField.getType());
Object defaultValue = null;
try {
defaultValue = customFieldResolver.parse2Value(i.getDefaultValue());
} catch (Exception e) {
LogUtils.error(e);
}
templateCustomFieldDTO.setDefaultValue(defaultValue);
return templateCustomFieldDTO;
}).toList();
// 封装系统字段信息
List<TemplateCustomFieldDTO> systemFieldDTOS = templateCustomFields.stream()
.filter(i -> BooleanUtils.isTrue(i.getSystemField()))
.map(i -> {
TemplateCustomFieldDTO templateCustomFieldDTO = new TemplateCustomFieldDTO();
templateCustomFieldDTO.setFieldId(i.getFieldId());
templateCustomFieldDTO.setDefaultValue(i.getDefaultValue());
return templateCustomFieldDTO;
}).toList();
TemplateDTO templateDTO = BeanUtils.copyBean(new TemplateDTO(), template);
templateDTO.setCustomFields(fieldDTOS);
templateDTO.setSystemFields(systemFieldDTOS);
return templateDTO;
}
public Template add(Template template, List<TemplateCustomFieldRequest> customFields) {
protected Template add(Template template, List<TemplateCustomFieldRequest> customFields, List<TemplateSystemCustomFieldRequest> systemFields) {
template.setInternal(false);
return this.baseAdd(template, customFields);
return this.baseAdd(template, customFields, systemFields);
}
public Template baseAdd(Template template, List<TemplateCustomFieldRequest> customFields) {
public Template baseAdd(Template template, List<TemplateCustomFieldRequest> customFields, List<TemplateSystemCustomFieldRequest> systemFields) {
checkAddExist(template);
template.setId(IDGenerator.nextStr());
template.setCreateTime(System.currentTimeMillis());
template.setUpdateTime(System.currentTimeMillis());
templateMapper.insert(template);
baseTemplateCustomFieldService.deleteByTemplateId(template.getId());
baseTemplateCustomFieldService.addByTemplateId(template.getId(), customFields);
baseTemplateCustomFieldService.addCustomFieldByTemplateId(template.getId(), customFields);
baseTemplateCustomFieldService.addSystemFieldByTemplateId(template.getId(), parse2TemplateCustomFieldRequests(systemFields));
return template;
}
@ -154,7 +169,7 @@ public class BaseTemplateService {
.orElseThrow(() -> new MSException(TEMPLATE_SCENE_ILLEGAL));
}
public Template update(Template template, List<TemplateCustomFieldRequest> customFields) {
protected Template update(Template template, List<TemplateCustomFieldRequest> customFields, List<TemplateSystemCustomFieldRequest> systemFields) {
checkResourceExist(template.getId());
checkUpdateExist(template);
template.setUpdateTime(System.currentTimeMillis());
@ -166,13 +181,31 @@ public class BaseTemplateService {
template.setCreateTime(null);
// customFields null 则不修改
if (customFields != null) {
baseTemplateCustomFieldService.deleteByTemplateId(template.getId());
baseTemplateCustomFieldService.addByTemplateId(template.getId(), customFields);
baseTemplateCustomFieldService.deleteByTemplateIdAndSystem(template.getId(), false);
baseTemplateCustomFieldService.addCustomFieldByTemplateId(template.getId(), customFields);
}
if (systemFields != null) {
// 系统字段
baseTemplateCustomFieldService.deleteByTemplateIdAndSystem(template.getId(), true);
baseTemplateCustomFieldService.addSystemFieldByTemplateId(template.getId(), parse2TemplateCustomFieldRequests(systemFields));
}
templateMapper.updateByPrimaryKeySelective(template);
return template;
}
private List<TemplateCustomFieldRequest> parse2TemplateCustomFieldRequests(List<TemplateSystemCustomFieldRequest> systemFields) {
if (CollectionUtils.isEmpty(systemFields)) {
return List.of();
}
List<TemplateCustomFieldRequest> templateCustomFieldRequests = systemFields.stream().map(systemFiled -> {
TemplateCustomFieldRequest templateCustomFieldRequest = new TemplateCustomFieldRequest();
BeanUtils.copyBean(templateCustomFieldRequest, systemFiled);
templateCustomFieldRequest.setRequired(false);
return templateCustomFieldRequest;
}).toList();
return templateCustomFieldRequests;
}
public void delete(String id) {
Template template = checkResourceExist(id);
checkInternal(template);
@ -182,6 +215,7 @@ public class BaseTemplateService {
/**
* 校验时候是内置模板
*
* @param template
*/
protected void checkInternal(Template template) {
@ -269,6 +303,7 @@ public class BaseTemplateService {
* 初始化功能用例模板
* 创建组织的时候调用初始化组织模板
* 创建项目的时候调用初始化项目模板
*
* @param scopeId
* @param scopeType
*/
@ -284,19 +319,21 @@ public class BaseTemplateService {
templateCustomFieldRequest.setFieldId(customField.getId());
return templateCustomFieldRequest;
}).toList();
baseTemplateCustomFieldService.addByTemplateId(template.getId(), templateCustomFieldRequests);
baseTemplateCustomFieldService.addCustomFieldByTemplateId(template.getId(), templateCustomFieldRequests);
}
/**
* 初始化缺陷模板
* 创建组织的时候调用初始化组织模板
* 创建项目的时候调用初始化项目模板
*
* @param scopeId
* @param scopeType
*/
public void initBugDefaultTemplate(String scopeId, TemplateScopeType scopeType) {
this.initDefaultTemplate(scopeId, "bug_default", scopeType, TemplateScene.BUG);
}
public void initApiDefaultTemplate(String scopeId, TemplateScopeType scopeType) {
this.initDefaultTemplate(scopeId, "api_default", scopeType, TemplateScene.API);
}

View File

@ -7,6 +7,7 @@ import io.metersphere.sdk.constants.TemplateScopeType;
import io.metersphere.system.dto.sdk.request.TemplateCustomFieldRequest;
import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.system.domain.*;
import io.metersphere.system.dto.sdk.request.TemplateSystemCustomFieldRequest;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
@ -107,7 +108,7 @@ public class CreateTemplateResourceService implements CreateProjectResourceServi
List<TemplateCustomFieldRequest> templateCustomFieldRequests = templateCustomFields.stream()
.map(templateCustomField -> BeanUtils.copyBean(new TemplateCustomFieldRequest(), templateCustomField))
.toList();
addRefProjectTemplate(projectId, template, templateCustomFieldRequests);
addRefProjectTemplate(projectId, template, templateCustomFieldRequests, null);
});
}
@ -199,12 +200,13 @@ public class CreateTemplateResourceService implements CreateProjectResourceServi
* @param orgTemplate
* @param customFields
*/
public void addRefProjectTemplate(String projectId, Template orgTemplate, List<TemplateCustomFieldRequest> customFields) {
public void addRefProjectTemplate(String projectId, Template orgTemplate, List<TemplateCustomFieldRequest> customFields,
List<TemplateSystemCustomFieldRequest> systemCustomFields) {
Template template = BeanUtils.copyBean(new Template(), orgTemplate);
template.setScopeId(projectId);
template.setRefId(orgTemplate.getId());
template.setScopeType(TemplateScopeType.PROJECT.name());
List<TemplateCustomFieldRequest> refCustomFields = baseTemplateService.getRefTemplateCustomFieldRequest(projectId, customFields);
baseTemplateService.baseAdd(template, refCustomFields);
baseTemplateService.baseAdd(template, refCustomFields, systemCustomFields);
}
}

View File

@ -10,6 +10,8 @@ import io.metersphere.sdk.util.SubListUtils;
import io.metersphere.system.domain.OrganizationParameter;
import io.metersphere.system.domain.Template;
import io.metersphere.system.domain.TemplateExample;
import io.metersphere.system.dto.sdk.request.TemplateSystemCustomFieldRequest;
import io.metersphere.system.dto.sdk.request.TemplateUpdateRequest;
import io.metersphere.system.mapper.BaseProjectMapper;
import io.metersphere.system.mapper.ExtOrganizationTemplateMapper;
import jakarta.annotation.Resource;
@ -52,15 +54,16 @@ public class OrganizationTemplateService extends BaseTemplateService {
return super.getTemplateDTO(template);
}
@Override
public Template add(Template template, List<TemplateCustomFieldRequest> customFields) {
public Template add(TemplateUpdateRequest request, String creator) {
Template template = BeanUtils.copyBean(new Template(), request);
template.setCreateUser(creator);
checkOrgResourceExist(template);
checkOrganizationTemplateEnable(template.getScopeId(), template.getScene());
template.setScopeType(TemplateScopeType.ORGANIZATION.name());
template.setRefId(null);
template = super.add(template, customFields);
template = super.add(template, request.getCustomFields(), request.getSystemFields());
// 同步创建项目级别模板
addRefProjectTemplate(template, customFields);
addRefProjectTemplate(template, request.getCustomFields(), request.getSystemFields());
return template;
}
@ -73,7 +76,7 @@ public class OrganizationTemplateService extends BaseTemplateService {
* @param orgTemplate
* @param customFields
*/
public void addRefProjectTemplate(Template orgTemplate, List<TemplateCustomFieldRequest> customFields) {
public void addRefProjectTemplate(Template orgTemplate, List<TemplateCustomFieldRequest> customFields, List<TemplateSystemCustomFieldRequest> systemFields) {
String orgId = orgTemplate.getScopeId();
List<String> projectIds = baseProjectMapper.getProjectIdByOrgId(orgId);
Template template = BeanUtils.copyBean(new Template(), orgTemplate);
@ -82,7 +85,7 @@ public class OrganizationTemplateService extends BaseTemplateService {
template.setRefId(orgTemplate.getId());
template.setScopeType(TemplateScopeType.PROJECT.name());
List<TemplateCustomFieldRequest> refCustomFields = getRefTemplateCustomFieldRequest(projectId, customFields);
super.baseAdd(template, refCustomFields);
super.baseAdd(template, refCustomFields, systemFields);
});
}
@ -90,15 +93,17 @@ public class OrganizationTemplateService extends BaseTemplateService {
OrganizationService.checkResourceExist(template.getScopeId());
}
@Override
public Template update(Template template, List<TemplateCustomFieldRequest> customFields) {
public Template update(TemplateUpdateRequest request) {
Template template = new Template();
BeanUtils.copyBean(template, request);
Template originTemplate = super.getWithCheck(template.getId());
checkOrganizationTemplateEnable(originTemplate.getScopeId(), originTemplate.getScene());
template.setScopeId(originTemplate.getScopeId());
checkOrgResourceExist(originTemplate);
updateRefProjectTemplate(template, customFields);
updateRefProjectTemplate(template, request.getCustomFields(), request.getSystemFields());
template.setRefId(null);
return super.update(template, customFields);
return super.update(template, request.getCustomFields(), request.getSystemFields());
}
/**
@ -110,7 +115,7 @@ public class OrganizationTemplateService extends BaseTemplateService {
* @param orgTemplate
* @param customFields
*/
public void updateRefProjectTemplate(Template orgTemplate, List<TemplateCustomFieldRequest> customFields) {
public void updateRefProjectTemplate(Template orgTemplate, List<TemplateCustomFieldRequest> customFields, List<TemplateSystemCustomFieldRequest> systemFields) {
List<Template> projectTemplates = getByRefId(orgTemplate.getId());
Template template = BeanUtils.copyBean(new Template(), orgTemplate);
projectTemplates.forEach(projectTemplate -> {
@ -118,7 +123,7 @@ public class OrganizationTemplateService extends BaseTemplateService {
template.setScopeId(projectTemplate.getScopeId());
template.setRefId(orgTemplate.getId());
List<TemplateCustomFieldRequest> refCustomFields = getRefTemplateCustomFieldRequest(projectTemplate.getScopeId(), customFields);
super.update(template, refCustomFields);
super.update(template, refCustomFields, systemFields);
});
}

View File

@ -4,9 +4,11 @@ import io.metersphere.sdk.constants.OrganizationParameterConstants;
import io.metersphere.sdk.constants.PermissionConstants;
import io.metersphere.sdk.constants.TemplateScene;
import io.metersphere.sdk.constants.TemplateScopeType;
import io.metersphere.sdk.util.CommonBeanFactory;
import io.metersphere.system.dto.sdk.TemplateCustomFieldDTO;
import io.metersphere.system.dto.sdk.TemplateDTO;
import io.metersphere.system.dto.sdk.request.TemplateCustomFieldRequest;
import io.metersphere.system.dto.sdk.request.TemplateSystemCustomFieldRequest;
import io.metersphere.system.dto.sdk.request.TemplateUpdateRequest;
import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.system.base.BaseCustomFieldTestService;
@ -97,6 +99,7 @@ public class OrganizationTemplateControllerTests extends BaseTest {
request.setEnableThirdPart(true);
request.setScopeId(DEFAULT_ORGANIZATION_ID);
request.setCustomFields(List.of(templateCustomFieldRequest));
request.setSystemFields(getTemplateSystemCustomFieldRequests());
MvcResult mvcResult = this.requestPostWithOkAndReturn(DEFAULT_ADD, request);
@ -107,12 +110,13 @@ public class OrganizationTemplateControllerTests extends BaseTest {
request.setId(template.getId());
TemplateUpdateRequest copyRequest = BeanUtils.copyBean(new TemplateUpdateRequest(), request);
copyRequest.setCustomFields(null);
copyRequest.setSystemFields(null);
Assertions.assertEquals(copyRequest, BeanUtils.copyBean(new TemplateUpdateRequest(), template));
Assertions.assertEquals(template.getCreateUser(), ADMIN.getValue());
Assertions.assertEquals(template.getInternal(), false);
Assertions.assertEquals(template.getScopeType(), TemplateScopeType.ORGANIZATION.name());
assertTemplateCustomFields(request, template);
assertRefTemplate(template);
assertRefTemplate(template, request);
// @@重名校验异常
assertErrorCode(this.requestPost(DEFAULT_ADD, request), TEMPLATE_EXIST);
@ -130,6 +134,8 @@ public class OrganizationTemplateControllerTests extends BaseTest {
// 插入另一条数据用户更新时重名校验
request.setScopeId(DEFAULT_ORGANIZATION_ID);
request.setCustomFields(null);
request.setSystemFields(null);
MvcResult anotherMvcResult = this.requestPostWithOkAndReturn(DEFAULT_ADD, request);
this.anotherTemplateField = templateMapper.selectByPrimaryKey(getResultData(anotherMvcResult, Template.class).getId());
@ -141,12 +147,25 @@ public class OrganizationTemplateControllerTests extends BaseTest {
requestPostPermissionTest(PermissionConstants.ORGANIZATION_TEMPLATE_ADD, DEFAULT_ADD, request);
}
public static List<TemplateSystemCustomFieldRequest> getTemplateSystemCustomFieldRequests() {
TemplateSystemCustomFieldRequest nameField = new TemplateSystemCustomFieldRequest();
nameField.setFieldId("name");
nameField.setDefaultValue("name default");
TemplateSystemCustomFieldRequest descriptionField = new TemplateSystemCustomFieldRequest();
descriptionField.setFieldId("description");
descriptionField.setDefaultValue("description default");
List<TemplateSystemCustomFieldRequest> systemFields = new ArrayList<>();
systemFields.add(nameField);
systemFields.add(descriptionField);
return systemFields;
}
/**
* 校验变更组织模板时有没有同步变更项目模板
*
* @param template
*/
private void assertRefTemplate(Template template) {
private void assertRefTemplate(Template template, TemplateUpdateRequest originRequest) {
List<Template> refTemplates = organizationTemplateService.getByRefId(template.getId());
refTemplates.forEach(refTemplate -> {
Assertions.assertEquals(refTemplate.getEnableThirdPart(), template.getEnableThirdPart());
@ -156,6 +175,15 @@ public class OrganizationTemplateControllerTests extends BaseTest {
Assertions.assertEquals(refTemplate.getInternal(), template.getInternal());
Assertions.assertEquals(refTemplate.getCreateUser(), template.getCreateUser());
Assertions.assertEquals(refTemplate.getScopeType(), TemplateScopeType.PROJECT.name());
List<TemplateCustomField> templateCustomFields = baseTemplateCustomFieldService.getByTemplateId(template.getId());
List<TemplateCustomField> systemFields = templateCustomFields.stream().filter(TemplateCustomField::getSystemField).toList();
for (int i = 0; i < systemFields.size(); i++) {
TemplateCustomField templateCustomField = systemFields.get(i);
TemplateSystemCustomFieldRequest customFieldRequest = originRequest.getSystemFields().get(i);
Assertions.assertEquals(templateCustomField.getFieldId(), customFieldRequest.getFieldId());
Assertions.assertEquals(templateCustomField.getDefaultValue(), customFieldRequest.getDefaultValue());
}
});
}
@ -174,11 +202,14 @@ public class OrganizationTemplateControllerTests extends BaseTest {
}
}
private void assertTemplateCustomFields(TemplateUpdateRequest request, Template template) {
public static void assertTemplateCustomFields(TemplateUpdateRequest request, Template template) {
BaseTemplateCustomFieldService baseTemplateCustomFieldService = CommonBeanFactory.getBean(BaseTemplateCustomFieldService.class);
List<TemplateCustomField> templateCustomFields = baseTemplateCustomFieldService.getByTemplateId(template.getId());
Assertions.assertEquals(templateCustomFields.size(), request.getCustomFields().size());
for (int i = 0; i < templateCustomFields.size(); i++) {
TemplateCustomField templateCustomField = templateCustomFields.get(i);
Assertions.assertEquals(templateCustomFields.size(), request.getCustomFields().size() + request.getSystemFields().size());
List<TemplateCustomField> systemFields = templateCustomFields.stream().filter(TemplateCustomField::getSystemField).toList();
List<TemplateCustomField> customFields = templateCustomFields.stream().filter(field -> !field.getSystemField()).toList();
for (int i = 0; i < customFields.size(); i++) {
TemplateCustomField templateCustomField = customFields.get(i);
TemplateCustomFieldRequest customFieldRequest = request.getCustomFields().get(i);
Assertions.assertEquals(templateCustomField.getFieldId(), customFieldRequest.getFieldId());
Assertions.assertEquals(templateCustomField.getTemplateId(), template.getId());
@ -186,6 +217,13 @@ public class OrganizationTemplateControllerTests extends BaseTest {
Assertions.assertEquals(templateCustomField.getApiFieldId(), customFieldRequest.getApiFieldId());
Assertions.assertEquals(templateCustomField.getDefaultValue(), customFieldRequest.getDefaultValue());
}
for (int i = 0; i < systemFields.size(); i++) {
TemplateCustomField templateCustomField = systemFields.get(i);
TemplateSystemCustomFieldRequest customFieldRequest = request.getSystemFields().get(i);
Assertions.assertEquals(templateCustomField.getFieldId(), customFieldRequest.getFieldId());
Assertions.assertEquals(templateCustomField.getTemplateId(), template.getId());
Assertions.assertEquals(templateCustomField.getDefaultValue(), customFieldRequest.getDefaultValue());
}
}
private TemplateCustomFieldRequest getTemplateCustomFieldRequest(String scene) {
@ -217,6 +255,8 @@ public class OrganizationTemplateControllerTests extends BaseTest {
request.setScene(TemplateScene.UI.name());
request.setEnableThirdPart(true);
request.setCustomFields(new ArrayList<>(0));
request.setSystemFields(getTemplateSystemCustomFieldRequests());
request.getSystemFields().get(0).setDefaultValue("update");
this.requestPostWithOk(DEFAULT_UPDATE, request);
Template template = templateMapper.selectByPrimaryKey(request.getId());
// 校验请求成功数据
@ -229,7 +269,7 @@ public class OrganizationTemplateControllerTests extends BaseTest {
Assertions.assertEquals(template.getScene(), scene);
Assertions.assertEquals(template.getEnableThirdPart(), request.getEnableThirdPart());
assertTemplateCustomFields(request, template);
assertRefTemplate(template);
assertRefTemplate(template, request);
// 带字段的更新
TemplateCustomFieldRequest templateCustomFieldRequest = getTemplateCustomFieldRequest(scene);
@ -240,7 +280,7 @@ public class OrganizationTemplateControllerTests extends BaseTest {
// 不更新字段
request.setCustomFields(null);
this.requestPostWithOk(DEFAULT_UPDATE, request);
Assertions.assertEquals(baseTemplateCustomFieldService.getByTemplateId(template.getId()).size(), 1);
Assertions.assertEquals(baseTemplateCustomFieldService.getByTemplateId(template.getId()).size(), 3);
// @校验是否开启组织模板
changeOrgTemplateEnable(false);
@ -306,13 +346,21 @@ public class OrganizationTemplateControllerTests extends BaseTest {
.andReturn();
// 校验数据是否正确
TemplateDTO templateDTO = getResultData(mvcResult, TemplateDTO.class);
Template template = templateMapper.selectByPrimaryKey(templateDTO.getId());
assertGetTemplateDTO(templateDTO);
// @@校验权限
requestGetPermissionTest(PermissionConstants.ORGANIZATION_TEMPLATE_READ, DEFAULT_GET, templateDTO.getId());
}
public static void assertGetTemplateDTO(TemplateDTO templateDTO) {
Template template = CommonBeanFactory.getBean(TemplateMapper.class).selectByPrimaryKey(templateDTO.getId());
Assertions.assertEquals(template, BeanUtils.copyBean(new Template(), templateDTO));
List<TemplateCustomField> templateCustomFields = CommonBeanFactory.getBean(BaseTemplateCustomFieldService.class).getByTemplateId(template.getId());
List<TemplateCustomFieldDTO> customFields = templateDTO.getCustomFields();
List<TemplateCustomField> templateCustomFields = baseTemplateCustomFieldService.getByTemplateId(template.getId());
List<TemplateCustomField> customTemplateFields = templateCustomFields.stream().filter(field -> !field.getSystemField()).toList();
for (int i = 0; i < customFields.size(); i++) {
TemplateCustomFieldDTO customFieldDTO = customFields.get(i);
TemplateCustomField templateCustomField = templateCustomFields.get(i);
TemplateCustomField templateCustomField = customTemplateFields.get(i);
Assertions.assertEquals(customFieldDTO.getFieldId(), templateCustomField.getFieldId());
Assertions.assertEquals(customFieldDTO.getApiFieldId(), templateCustomField.getApiFieldId());
Assertions.assertEquals(customFieldDTO.getRequired(), templateCustomField.getRequired());
@ -320,8 +368,14 @@ public class OrganizationTemplateControllerTests extends BaseTest {
Assertions.assertEquals(customFieldDTO.getFieldName(), "用例等级");
}
// @@校验权限
requestGetPermissionTest(PermissionConstants.ORGANIZATION_TEMPLATE_READ, DEFAULT_GET, templateDTO.getId());
List<TemplateCustomFieldDTO> systemFields = templateDTO.getSystemFields();
List<TemplateCustomField> systemTemplateFields = templateCustomFields.stream().filter(TemplateCustomField::getSystemField).toList();
for (int i = 0; i < systemFields.size(); i++) {
TemplateCustomFieldDTO customFieldDTO = systemFields.get(i);
TemplateCustomField templateCustomField = systemTemplateFields.get(i);
Assertions.assertEquals(customFieldDTO.getFieldId(), templateCustomField.getFieldId());
Assertions.assertEquals(customFieldDTO.getDefaultValue(), templateCustomField.getDefaultValue());
}
}
@Test