fix(测试跟踪): 第三方平台缺陷部分字段同步出错

--bug=1015555 --user=陈建星 【测试跟踪】github#16508,缺陷管理-同步缺陷:执行缺陷同步之后,custom_field_issues表存储错误,导致缺陷列表处自定义字段展示错误 https://www.tapd.cn/55049933/s/1217621
This commit is contained in:
chenjianxing 2022-08-02 15:59:14 +08:00 committed by jianxing
parent c76be06b32
commit 393a829855
8 changed files with 46 additions and 22 deletions

View File

@ -130,16 +130,13 @@
<select id="getIssueCustomField" resultType="io.metersphere.dto.CustomFieldItemDTO">
select cfi.field_id as id,
cf.type,
cft.custom_data,
cf.name,
case cf.type
when 'richText' then cfi.text_value
when 'textarea' then cfi.text_value
else cfi.value end as value
from custom_field_issues cfi
join custom_field_template cft on cfi.field_id = cft.field_id
join custom_field cf on cf.id = cft.field_id
join project on project.id = cf.project_id and project.issue_template_id = cft.template_id
join custom_field cf on cf.id = cfi.field_id
where cfi.resource_id = #{issueId}
</select>
<select id="getPlatformIssueByIds" resultType="io.metersphere.base.domain.IssuesDao">

View File

@ -8,5 +8,6 @@ public class CustomFieldItemDTO {
private String name;
private Object value;
private String type;
private String key;
private String customData;
}

View File

@ -233,10 +233,10 @@ public class IssueTemplateService extends TemplateBaseService {
if (StringUtils.isNotBlank(issueTemplateId)) {
issueTemplate = issueTemplateMapper.selectByPrimaryKey(issueTemplateId);
if (issueTemplate == null) {
issueTemplate = getDefaultTemplate(project.getWorkspaceId());
issueTemplate = getDefaultTemplate(projectId);
}
} else {
issueTemplate = getDefaultTemplate(project.getWorkspaceId());
issueTemplate = getDefaultTemplate(projectId);
}
if (!project.getPlatform().equals(issueTemplate.getPlatform())) {
MSException.throwException("请在项目中配置缺陷模板");

View File

@ -241,10 +241,10 @@ public class TestCaseTemplateService extends TemplateBaseService {
if (StringUtils.isNotBlank(caseTemplateId)) {
caseTemplate = testCaseTemplateMapper.selectByPrimaryKey(caseTemplateId);
if (caseTemplate == null) {
caseTemplate = getDefaultTemplate(project.getWorkspaceId());
caseTemplate = getDefaultTemplate(projectId);
}
} else {
caseTemplate = getDefaultTemplate(project.getWorkspaceId());
caseTemplate = getDefaultTemplate(projectId);
}
BeanUtils.copyBean(caseTemplateDao, caseTemplate);
List<CustomFieldDao> result = customFieldService.getCustomFieldByTemplateId(caseTemplate.getId());

View File

@ -1381,6 +1381,9 @@ public class UserService {
public UserDTO.PlatformInfo getCurrentPlatformInfo(String workspaceId) {
User user = userMapper.selectByPrimaryKey(SessionUtils.getUserId());
if (user == null) {
return null;
}
String platformInfoStr = user.getPlatformInfo();
if (StringUtils.isBlank(workspaceId) || StringUtils.isBlank(platformInfoStr) || platformInfoStr.equals("null")) {
return null;

View File

@ -464,6 +464,14 @@ public abstract class AbstractIssuePlatform implements IssuesPlatform {
} else {
item.setValue(null);
}
} else {
try {
if (item.getValue() != null) {
item.setValue(JSONObject.parse(item.getValue().toString()));
}
} catch (Exception e) {
LogUtil.error(e);
}
}
});
return customFields;
@ -514,20 +522,29 @@ public abstract class AbstractIssuePlatform implements IssuesPlatform {
protected void mergeCustomField(IssuesWithBLOBs issues, String defaultCustomField) {
if (StringUtils.isNotBlank(defaultCustomField)) {
List<CustomFieldItemDTO> customFields = extIssuesMapper.getIssueCustomField(issues.getId());
JSONArray issueFields = JSONArray.parseArray(JSON.toJSONString(customFields));
Set<String> ids = issueFields.stream().map(i -> ((JSONObject) i).getString("id")).collect(Collectors.toSet());
JSONArray defaultFields = JSONArray.parseArray(defaultCustomField);
defaultFields.forEach(item -> { // 如果自定义字段里没有模板新加的字段就把新字段加上
String id = ((JSONObject) item).getString("id");
Map<String, CustomFieldItemDTO> fieldMap = customFields.stream()
.collect(Collectors.toMap(CustomFieldItemDTO::getId, i -> i));
List<CustomFieldItemDTO> defaultFields = JSONArray.parseArray(defaultCustomField, CustomFieldItemDTO.class);
for (CustomFieldItemDTO defaultField : defaultFields) {
String id = defaultField.getId();
if (StringUtils.isBlank(id)) {
id = ((JSONObject) item).getString("key");
((JSONObject) item).put("id", id);
defaultField.setId(defaultField.getKey());
}
if (!ids.contains(id)) {
issueFields.add(item);
if (fieldMap.keySet().contains(id)) {
// 设置第三方平台的属性名称
fieldMap.get(id).setCustomData(defaultField.getCustomData());
} else {
// 如果自定义字段里没有模板新加的字段就把新字段加上
customFields.add(defaultField);
}
});
issues.setCustomFields(issueFields.toJSONString());
}
// 过滤没有配置第三方字段名称的字段不需要更新
customFields = customFields.stream()
.filter(i -> StringUtils.isNotBlank(i.getCustomData()))
.collect(Collectors.toList());
issues.setCustomFields(JSONObject.toJSONString(customFields));
}
}

View File

@ -375,9 +375,11 @@ export default {
getIssuePartTemplateWithProject((template, project) => {
this.currentProject = project;
this.init(template, data);
this.getDataInfoAsync(data);
});
});
},
getDataInfoAsync(data) {
if (data && data.id) {
this.$get('/issues/follow/' + data.id, response => {
this.form.follows = response.data;

View File

@ -527,7 +527,7 @@ export function getCustomFieldValue(row, field, members) {
}
}
return val;
} else if (field.type === 'multipleInput') {
} else if (field.type === 'multipleInput' && item.value instanceof Array) {
let val = '';
item.value.forEach(i => {
val += i + ' ';
@ -595,7 +595,11 @@ export function parseCustomFilesForList(data) {
export function parseCustomFilesForItem(data) {
if (data.value) {
data.value = JSON.parse(data.value);
try {
data.value = JSON.parse(data.value);
} catch (e) {
window.console.error(e);
}
}
if (data.textValue) {
data.value = data.textValue;