fix(测试跟踪): 更新自定义字段选项后,模板里的选项没有同步更新
--bug=1013993 --user=陈建星 【测试跟踪】github #14654项目设置-模板管理-缺陷模板管理:系统自带的状态字段-添加了自定义字段应用到default缺陷模板中,新增字段未同步 https://www.tapd.cn/55049933/s/1186786
This commit is contained in:
parent
f488d8d977
commit
26502d8791
|
@ -17,5 +17,7 @@ public class CustomFieldDao extends CustomField {
|
||||||
|
|
||||||
private String customData;
|
private String customData;
|
||||||
|
|
||||||
|
private String originGlobalId;
|
||||||
|
|
||||||
private String key;
|
private String key;
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,12 +103,15 @@ public class CustomFieldService {
|
||||||
|
|
||||||
public void update(CustomField customField) {
|
public void update(CustomField customField) {
|
||||||
if (customField.getGlobal() != null && customField.getGlobal()) {
|
if (customField.getGlobal() != null && customField.getGlobal()) {
|
||||||
// 如果是全局字段,则创建对应工作空间字段
|
CustomFieldDao customFieldDao = new CustomFieldDao();
|
||||||
add(customField);
|
BeanUtils.copyBean(customFieldDao, customField);
|
||||||
|
customFieldDao.setOriginGlobalId(customField.getId());
|
||||||
|
// 如果是全局字段,则创建对应项目字段
|
||||||
|
add(customFieldDao);
|
||||||
if (StringUtils.equals(customField.getScene(), TemplateConstants.FieldTemplateScene.TEST_CASE.name())) {
|
if (StringUtils.equals(customField.getScene(), TemplateConstants.FieldTemplateScene.TEST_CASE.name())) {
|
||||||
testCaseTemplateService.handleSystemFieldCreate(customField);
|
testCaseTemplateService.handleSystemFieldCreate(customFieldDao);
|
||||||
} else {
|
} else {
|
||||||
issueTemplateService.handleSystemFieldCreate(customField);
|
issueTemplateService.handleSystemFieldCreate(customFieldDao);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
checkExist(customField);
|
checkExist(customField);
|
||||||
|
|
|
@ -21,7 +21,6 @@ import org.springframework.transaction.annotation.Transactional;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@ -72,17 +71,19 @@ public class CustomFieldTemplateService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<CustomFieldTemplate> getSystemFieldCreateTemplate(CustomField customField, String scene) {
|
public List<CustomFieldTemplate> getSystemFieldCreateTemplate(CustomFieldDao customField, String templateId) {
|
||||||
List<CustomField> globalField = customFieldService.getGlobalField(scene);
|
CustomFieldTemplateExample example = new CustomFieldTemplateExample();
|
||||||
for (int i = 0; i < globalField.size(); i++) {
|
example.createCriteria().andTemplateIdEqualTo(templateId);
|
||||||
// 替换全局的字段
|
// 获取全局模板的关联关系
|
||||||
if (StringUtils.equals(globalField.get(i).getName(), customField.getName())) {
|
List<CustomFieldTemplate> fieldTemplates = customFieldTemplateMapper.selectByExample(example);
|
||||||
globalField.set(i, customField);
|
for (int i = 0; i < fieldTemplates.size(); i++) {
|
||||||
|
// 将全局字段替换成项目下的字段
|
||||||
|
if (StringUtils.equals(fieldTemplates.get(i).getFieldId(), customField.getOriginGlobalId())) {
|
||||||
|
fieldTemplates.get(i).setFieldId(customField.getId());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
List<String> fieldIds = globalField.stream().map(CustomField::getId).collect(Collectors.toList());
|
return fieldTemplates;
|
||||||
return getFieldTemplateByFieldIds(fieldIds);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateFieldIdByTemplate(String templateId, String originId , String fieldId) {
|
public void updateFieldIdByTemplate(String templateId, String originId , String fieldId) {
|
||||||
|
@ -135,4 +136,24 @@ public class CustomFieldTemplateService {
|
||||||
String fieldId = customFieldTemplate.getFieldId();
|
String fieldId = customFieldTemplate.getFieldId();
|
||||||
return customFieldMapper.selectByPrimaryKey(fieldId);
|
return customFieldMapper.selectByPrimaryKey(fieldId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将原来全局字段与模板的关联
|
||||||
|
* 改为项目下字段与模板的关联
|
||||||
|
* @param customField
|
||||||
|
* @param templateIds
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int updateProjectTemplateGlobalField(CustomFieldDao customField, List<String> templateIds) {
|
||||||
|
if (CollectionUtils.isEmpty(templateIds)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
CustomFieldTemplateExample example = new CustomFieldTemplateExample();
|
||||||
|
example.createCriteria()
|
||||||
|
.andFieldIdEqualTo(customField.getOriginGlobalId())
|
||||||
|
.andTemplateIdIn(templateIds);
|
||||||
|
CustomFieldTemplate customFieldTemplate = new CustomFieldTemplate();
|
||||||
|
customFieldTemplate.setFieldId(customField.getId());
|
||||||
|
return customFieldTemplateMapper.updateByExampleSelective(customFieldTemplate, example);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,10 +26,8 @@ import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.Iterator;
|
import java.util.*;
|
||||||
import java.util.LinkedList;
|
import java.util.stream.Collectors;
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@ -89,7 +87,7 @@ public class IssueTemplateService extends TemplateBaseService {
|
||||||
public void update(UpdateIssueTemplateRequest request) {
|
public void update(UpdateIssueTemplateRequest request) {
|
||||||
if (request.getGlobal() != null && request.getGlobal()) {
|
if (request.getGlobal() != null && request.getGlobal()) {
|
||||||
String originId = request.getId();
|
String originId = request.getId();
|
||||||
// 如果是全局字段,则创建对应工作空间字段
|
// 如果是全局字段,则创建对应项目字段
|
||||||
String id = add(request);
|
String id = add(request);
|
||||||
projectService.updateIssueTemplate(originId, id, request.getProjectId());
|
projectService.updateIssueTemplate(originId, id, request.getProjectId());
|
||||||
} else {
|
} else {
|
||||||
|
@ -105,51 +103,58 @@ public class IssueTemplateService extends TemplateBaseService {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取该工作空间的系统模板
|
* 获取该项目下的系统模板
|
||||||
* - 如果没有,则创建该工作空间模板,并关联默认的字段
|
* - 如果没有,则创建该工项目模板,并关联默认的字段
|
||||||
* - 如果有,则更新原来关联的 fieldId
|
* - 如果有,则更新原来关联的 fieldId
|
||||||
*
|
*
|
||||||
* @param customField
|
* @param customField
|
||||||
*/
|
*/
|
||||||
public void handleSystemFieldCreate(CustomField customField) {
|
public void handleSystemFieldCreate(CustomFieldDao customField) {
|
||||||
IssueTemplate workspaceSystemTemplate = getWorkspaceSystemTemplate(customField.getProjectId());
|
|
||||||
if (workspaceSystemTemplate == null) {
|
|
||||||
createTemplateWithUpdateField(customField.getProjectId(), customField);
|
|
||||||
} else {
|
|
||||||
updateRelateWithUpdateField(workspaceSystemTemplate, customField);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private IssueTemplate getWorkspaceSystemTemplate(String workspaceId) {
|
|
||||||
IssueTemplateExample example = new IssueTemplateExample();
|
IssueTemplateExample example = new IssueTemplateExample();
|
||||||
example.createCriteria()
|
example.createCriteria()
|
||||||
.andProjectIdEqualTo(workspaceId)
|
.andGlobalEqualTo(true);
|
||||||
.andSystemEqualTo(true);
|
example.or(example.createCriteria()
|
||||||
|
.andProjectIdEqualTo(customField.getProjectId()));
|
||||||
List<IssueTemplate> issueTemplates = issueTemplateMapper.selectByExampleWithBLOBs(example);
|
List<IssueTemplate> issueTemplates = issueTemplateMapper.selectByExampleWithBLOBs(example);
|
||||||
if (CollectionUtils.isNotEmpty(issueTemplates)) {
|
|
||||||
return issueTemplates.get(0);
|
Map<Boolean, List<IssueTemplate>> templatesMap = issueTemplates.stream()
|
||||||
|
.collect(Collectors.groupingBy(IssueTemplate::getGlobal));
|
||||||
|
|
||||||
|
// 获取全局模板
|
||||||
|
List<IssueTemplate> globalTemplates = templatesMap.get(true);
|
||||||
|
// 获取当前工作空间下模板
|
||||||
|
List<IssueTemplate> projectTemplates = templatesMap.get(false);
|
||||||
|
|
||||||
|
globalTemplates.forEach(global -> {
|
||||||
|
List<IssueTemplate> projectTemplate = null;
|
||||||
|
if (CollectionUtils.isNotEmpty(projectTemplates)) {
|
||||||
|
projectTemplate = projectTemplates.stream()
|
||||||
|
.filter(i -> i.getName().equals(global.getName()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
// 如果没有项目级别的模板就创建
|
||||||
|
if (CollectionUtils.isEmpty(projectTemplate)) {
|
||||||
|
IssueTemplate template = new IssueTemplate();
|
||||||
|
BeanUtils.copyBean(template, global);
|
||||||
|
template.setId(UUID.randomUUID().toString());
|
||||||
|
template.setCreateTime(System.currentTimeMillis());
|
||||||
|
template.setUpdateTime(System.currentTimeMillis());
|
||||||
|
template.setCreateUser(SessionUtils.getUserId());
|
||||||
|
template.setGlobal(false);
|
||||||
|
template.setProjectId(customField.getProjectId());
|
||||||
|
issueTemplateMapper.insert(template);
|
||||||
|
|
||||||
|
List<CustomFieldTemplate> customFieldTemplate =
|
||||||
|
customFieldTemplateService.getSystemFieldCreateTemplate(customField, global.getId());
|
||||||
|
|
||||||
|
customFieldTemplateService.create(customFieldTemplate, template.getId(),
|
||||||
|
TemplateConstants.FieldTemplateScene.ISSUE.name());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (CollectionUtils.isNotEmpty(projectTemplates)) {
|
||||||
|
customFieldTemplateService.updateProjectTemplateGlobalField(customField,
|
||||||
|
projectTemplates.stream().map(IssueTemplate::getId).collect(Collectors.toList()));
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void createTemplateWithUpdateField(String projectId, CustomField customField) {
|
|
||||||
UpdateIssueTemplateRequest request = new UpdateIssueTemplateRequest();
|
|
||||||
IssueTemplate issueTemplate = new IssueTemplate();
|
|
||||||
issueTemplate.setName("default");
|
|
||||||
issueTemplate.setPlatform(TemplateConstants.IssueTemplatePlatform.metersphere.name());
|
|
||||||
issueTemplate.setGlobal(false);
|
|
||||||
issueTemplate.setSystem(true);
|
|
||||||
issueTemplate.setProjectId(projectId);
|
|
||||||
BeanUtils.copyBean(request, issueTemplate);
|
|
||||||
List<CustomFieldTemplate> systemFieldCreateTemplate =
|
|
||||||
customFieldTemplateService.getSystemFieldCreateTemplate(customField, TemplateConstants.FieldTemplateScene.ISSUE.name());
|
|
||||||
request.setCustomFields(systemFieldCreateTemplate);
|
|
||||||
add(request);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateRelateWithUpdateField(IssueTemplate template, CustomField customField) {
|
|
||||||
CustomField globalField = customFieldService.getGlobalFieldByName(customField.getName());
|
|
||||||
customFieldTemplateService.updateFieldIdByTemplate(template.getId(), globalField.getId(), customField.getId());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkExist(IssueTemplate issueTemplate) {
|
private void checkExist(IssueTemplate issueTemplate) {
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@ -101,45 +102,52 @@ public class TestCaseTemplateService extends TemplateBaseService {
|
||||||
* - 如果有,则更新原来关联的 fieldId
|
* - 如果有,则更新原来关联的 fieldId
|
||||||
* @param customField
|
* @param customField
|
||||||
*/
|
*/
|
||||||
public void handleSystemFieldCreate(CustomField customField) {
|
public void handleSystemFieldCreate(CustomFieldDao customField) {
|
||||||
TestCaseTemplateWithBLOBs workspaceSystemTemplate = getWorkspaceSystemTemplate(customField.getProjectId());
|
|
||||||
if (workspaceSystemTemplate == null) {
|
|
||||||
createTemplateWithUpdateField(customField.getProjectId(), customField);
|
|
||||||
} else {
|
|
||||||
updateRelateWithUpdateField(workspaceSystemTemplate, customField);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void createTemplateWithUpdateField(String projectId, CustomField customField) {
|
|
||||||
UpdateCaseFieldTemplateRequest request = new UpdateCaseFieldTemplateRequest();
|
|
||||||
TestCaseTemplate testCaseTemplate = new TestCaseTemplate();
|
|
||||||
testCaseTemplate.setName("default");
|
|
||||||
testCaseTemplate.setType(TemplateConstants.TestCaseTemplateScene.functional.name());
|
|
||||||
testCaseTemplate.setGlobal(false);
|
|
||||||
testCaseTemplate.setSystem(true);
|
|
||||||
testCaseTemplate.setProjectId(projectId);
|
|
||||||
BeanUtils.copyBean(request, testCaseTemplate);
|
|
||||||
List<CustomFieldTemplate> systemFieldCreateTemplate =
|
|
||||||
customFieldTemplateService.getSystemFieldCreateTemplate(customField, TemplateConstants.FieldTemplateScene.TEST_CASE.name());
|
|
||||||
request.setCustomFields(systemFieldCreateTemplate);
|
|
||||||
add(request);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateRelateWithUpdateField(TestCaseTemplateWithBLOBs template, CustomField customField) {
|
|
||||||
CustomField globalField = customFieldService.getGlobalFieldByName(customField.getName());
|
|
||||||
customFieldTemplateService.updateFieldIdByTemplate(template.getId(), globalField.getId(), customField.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
private TestCaseTemplateWithBLOBs getWorkspaceSystemTemplate(String workspaceId) {
|
|
||||||
TestCaseTemplateExample example = new TestCaseTemplateExample();
|
TestCaseTemplateExample example = new TestCaseTemplateExample();
|
||||||
example.createCriteria()
|
example.createCriteria()
|
||||||
.andProjectIdEqualTo(workspaceId)
|
.andGlobalEqualTo(true);
|
||||||
.andSystemEqualTo(true);
|
example.or(example.createCriteria()
|
||||||
|
.andProjectIdEqualTo(customField.getProjectId()));
|
||||||
List<TestCaseTemplateWithBLOBs> testCaseTemplates = testCaseTemplateMapper.selectByExampleWithBLOBs(example);
|
List<TestCaseTemplateWithBLOBs> testCaseTemplates = testCaseTemplateMapper.selectByExampleWithBLOBs(example);
|
||||||
if (CollectionUtils.isNotEmpty(testCaseTemplates)) {
|
|
||||||
return testCaseTemplates.get(0);
|
Map<Boolean, List<TestCaseTemplateWithBLOBs>> templatesMap = testCaseTemplates.stream()
|
||||||
|
.collect(Collectors.groupingBy(TestCaseTemplateWithBLOBs::getGlobal));
|
||||||
|
|
||||||
|
// 获取全局模板
|
||||||
|
List<TestCaseTemplateWithBLOBs> globalTemplates = templatesMap.get(true);
|
||||||
|
// 获取当前工作空间下模板
|
||||||
|
List<TestCaseTemplateWithBLOBs> projectTemplates = templatesMap.get(false);
|
||||||
|
|
||||||
|
globalTemplates.forEach(global -> {
|
||||||
|
List<TestCaseTemplateWithBLOBs> projectTemplate = null;
|
||||||
|
if (CollectionUtils.isNotEmpty(projectTemplates)) {
|
||||||
|
projectTemplate = projectTemplates.stream()
|
||||||
|
.filter(i -> i.getName().equals(global.getName()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
// 如果没有项目级别的模板就创建
|
||||||
|
if (CollectionUtils.isEmpty(projectTemplate)) {
|
||||||
|
TestCaseTemplateWithBLOBs template = new TestCaseTemplateWithBLOBs();
|
||||||
|
BeanUtils.copyBean(template, global);
|
||||||
|
template.setId(UUID.randomUUID().toString());
|
||||||
|
template.setCreateTime(System.currentTimeMillis());
|
||||||
|
template.setUpdateTime(System.currentTimeMillis());
|
||||||
|
template.setCreateUser(SessionUtils.getUserId());
|
||||||
|
template.setGlobal(false);
|
||||||
|
template.setProjectId(customField.getProjectId());
|
||||||
|
testCaseTemplateMapper.insert(template);
|
||||||
|
|
||||||
|
List<CustomFieldTemplate> customFieldTemplate =
|
||||||
|
customFieldTemplateService.getSystemFieldCreateTemplate(customField, global.getId());
|
||||||
|
|
||||||
|
customFieldTemplateService.create(customFieldTemplate, template.getId(),
|
||||||
|
TemplateConstants.FieldTemplateScene.TEST_CASE.name());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (CollectionUtils.isNotEmpty(projectTemplates)) {
|
||||||
|
customFieldTemplateService.updateProjectTemplateGlobalField(customField,
|
||||||
|
projectTemplates.stream().map(TestCaseTemplateWithBLOBs::getId).collect(Collectors.toList()));
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkExist(TestCaseTemplateWithBLOBs testCaseTemplate) {
|
private void checkExist(TestCaseTemplateWithBLOBs testCaseTemplate) {
|
||||||
|
|
Loading…
Reference in New Issue