fix(测试跟踪): 第三方平台缺陷部分字段同步出错
--bug=1015555 --user=陈建星 【测试跟踪】github#16508,缺陷管理-同步缺陷:执行缺陷同步之后,custom_field_issues表存储错误,导致缺陷列表处自定义字段展示错误 https://www.tapd.cn/55049933/s/1217621
This commit is contained in:
parent
c76be06b32
commit
393a829855
|
@ -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">
|
||||
|
|
|
@ -8,5 +8,6 @@ public class CustomFieldItemDTO {
|
|||
private String name;
|
||||
private Object value;
|
||||
private String type;
|
||||
private String key;
|
||||
private String customData;
|
||||
}
|
||||
|
|
|
@ -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("请在项目中配置缺陷模板");
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue