fix(项目设置): 修复缺陷更新时通知不能解析处理人的问题
--bug=1015711 --user=刘瑞斌 [项目设置]github #16751消息设置设置新建缺陷的接收人是处理人,在消息通知时没有@处理人。 https://www.tapd.cn/55049933/s/1224126 Closes #16751
This commit is contained in:
parent
dbf7538009
commit
fa26824c9e
|
@ -2,10 +2,12 @@ package io.metersphere.notice.sender;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import io.metersphere.api.service.ApiAutomationService;
|
import io.metersphere.api.service.ApiAutomationService;
|
||||||
import io.metersphere.api.service.ApiDefinitionService;
|
import io.metersphere.api.service.ApiDefinitionService;
|
||||||
import io.metersphere.api.service.ApiTestCaseService;
|
import io.metersphere.api.service.ApiTestCaseService;
|
||||||
|
import io.metersphere.base.domain.CustomField;
|
||||||
import io.metersphere.base.domain.TestCaseReview;
|
import io.metersphere.base.domain.TestCaseReview;
|
||||||
import io.metersphere.commons.constants.NoticeConstants;
|
import io.metersphere.commons.constants.NoticeConstants;
|
||||||
import io.metersphere.commons.constants.NotificationConstants;
|
import io.metersphere.commons.constants.NotificationConstants;
|
||||||
|
@ -14,10 +16,12 @@ import io.metersphere.notice.domain.MessageDetail;
|
||||||
import io.metersphere.notice.domain.Receiver;
|
import io.metersphere.notice.domain.Receiver;
|
||||||
import io.metersphere.notice.domain.UserDetail;
|
import io.metersphere.notice.domain.UserDetail;
|
||||||
import io.metersphere.performance.service.PerformanceTestService;
|
import io.metersphere.performance.service.PerformanceTestService;
|
||||||
|
import io.metersphere.service.CustomFieldService;
|
||||||
import io.metersphere.service.UserService;
|
import io.metersphere.service.UserService;
|
||||||
import io.metersphere.track.service.TestCaseReviewService;
|
import io.metersphere.track.service.TestCaseReviewService;
|
||||||
import io.metersphere.track.service.TestCaseService;
|
import io.metersphere.track.service.TestCaseService;
|
||||||
import io.metersphere.track.service.TestPlanService;
|
import io.metersphere.track.service.TestPlanService;
|
||||||
|
import org.apache.commons.beanutils.BeanMap;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.commons.lang3.time.DateFormatUtils;
|
import org.apache.commons.lang3.time.DateFormatUtils;
|
||||||
|
@ -55,24 +59,14 @@ public abstract class AbstractNoticeSender implements NoticeSender {
|
||||||
@Resource
|
@Resource
|
||||||
@Lazy
|
@Lazy
|
||||||
private TestCaseReviewService testCaseReviewService;
|
private TestCaseReviewService testCaseReviewService;
|
||||||
|
@Resource
|
||||||
|
private CustomFieldService customFieldService;
|
||||||
|
|
||||||
|
private ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
|
||||||
protected String getContext(MessageDetail messageDetail, NoticeModel noticeModel) {
|
protected String getContext(MessageDetail messageDetail, NoticeModel noticeModel) {
|
||||||
// 如果有自定义字段
|
// 如果有自定义字段
|
||||||
if (noticeModel.getParamMap().containsKey("customFields")) {
|
handleCustomFields(noticeModel);
|
||||||
String customFields = (String) noticeModel.getParamMap().get("customFields");
|
|
||||||
JSONArray array = JSON.parseArray(customFields);
|
|
||||||
if (CollectionUtils.isNotEmpty(array)) {
|
|
||||||
for (Object o : array) {
|
|
||||||
JSONObject jsonObject = JSON.parseObject(o.toString());
|
|
||||||
String name = jsonObject.getString("name");
|
|
||||||
Object value = jsonObject.getObject("value", Object.class);
|
|
||||||
noticeModel.getParamMap().put(name, value); // 处理人
|
|
||||||
if (StringUtils.equals(jsonObject.getString("name"), "处理人")) {
|
|
||||||
noticeModel.getParamMap().put("processor", value); // 处理人
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理 userIds 中包含的特殊值
|
// 处理 userIds 中包含的特殊值
|
||||||
noticeModel.setReceivers(getRealUserIds(messageDetail, noticeModel, messageDetail.getEvent()));
|
noticeModel.setReceivers(getRealUserIds(messageDetail, noticeModel, messageDetail.getEvent()));
|
||||||
|
@ -112,6 +106,39 @@ public abstract class AbstractNoticeSender implements NoticeSender {
|
||||||
return getContent(context, noticeModel.getParamMap());
|
return getContent(context, noticeModel.getParamMap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleCustomFields(NoticeModel noticeModel) {
|
||||||
|
if (!noticeModel.getParamMap().containsKey("fields")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Object customFields = noticeModel.getParamMap().get("fields");
|
||||||
|
List<Object> fields;
|
||||||
|
if (customFields instanceof String) {
|
||||||
|
fields = objectMapper.readValue((String) customFields, new TypeReference<>() {
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
fields = (List<Object>) customFields;
|
||||||
|
}
|
||||||
|
if (CollectionUtils.isNotEmpty(fields)) {
|
||||||
|
for (Object o : fields) {
|
||||||
|
Map jsonObject = new BeanMap(o);
|
||||||
|
String id = (String) jsonObject.get("id");
|
||||||
|
CustomField customField = customFieldService.get(id);
|
||||||
|
Object value = jsonObject.get("value");
|
||||||
|
if (value instanceof String && StringUtils.isNotEmpty((String) value)) {
|
||||||
|
String v = StringUtils.unwrap((String) value, "\"");
|
||||||
|
noticeModel.getParamMap().put(customField.getName(), v); // 处理人
|
||||||
|
if (StringUtils.equals(customField.getName(), "处理人")) {
|
||||||
|
noticeModel.getParamMap().put("processor", v); // 处理人
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
LogUtil.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected String getContent(String template, Map<String, Object> context) {
|
protected String getContent(String template, Map<String, Object> context) {
|
||||||
// 处理 null
|
// 处理 null
|
||||||
context.forEach((k, v) -> {
|
context.forEach((k, v) -> {
|
||||||
|
|
|
@ -66,8 +66,7 @@ public class IssuesController {
|
||||||
@PostMapping(value = "/add", consumes = {"multipart/form-data"})
|
@PostMapping(value = "/add", consumes = {"multipart/form-data"})
|
||||||
@RequiresPermissions(PermissionConstants.PROJECT_TRACK_ISSUE_READ_CREATE)
|
@RequiresPermissions(PermissionConstants.PROJECT_TRACK_ISSUE_READ_CREATE)
|
||||||
@MsAuditLog(module = OperLogModule.TRACK_BUG, type = OperLogConstants.CREATE, content = "#msClass.getLogDetails(#issuesRequest)", msClass = IssuesService.class)
|
@MsAuditLog(module = OperLogModule.TRACK_BUG, type = OperLogConstants.CREATE, content = "#msClass.getLogDetails(#issuesRequest)", msClass = IssuesService.class)
|
||||||
@SendNotice(taskType = NoticeConstants.TaskType.DEFECT_TASK, target = "#issuesRequest",
|
@SendNotice(taskType = NoticeConstants.TaskType.DEFECT_TASK, event = NoticeConstants.Event.CREATE, subject = "缺陷通知")
|
||||||
event = NoticeConstants.Event.CREATE, subject = "缺陷通知")
|
|
||||||
public IssuesWithBLOBs addIssues(@RequestPart(value = "request") IssuesUpdateRequest issuesRequest, @RequestPart(value = "file", required = false) List<MultipartFile> files) {
|
public IssuesWithBLOBs addIssues(@RequestPart(value = "request") IssuesUpdateRequest issuesRequest, @RequestPart(value = "file", required = false) List<MultipartFile> files) {
|
||||||
return issuesService.addIssues(issuesRequest, files);
|
return issuesService.addIssues(issuesRequest, files);
|
||||||
}
|
}
|
||||||
|
@ -75,10 +74,9 @@ public class IssuesController {
|
||||||
@PostMapping(value = "/update")
|
@PostMapping(value = "/update")
|
||||||
@RequiresPermissions(PermissionConstants.PROJECT_TRACK_ISSUE_READ_EDIT)
|
@RequiresPermissions(PermissionConstants.PROJECT_TRACK_ISSUE_READ_EDIT)
|
||||||
@MsAuditLog(module = OperLogModule.TRACK_BUG, type = OperLogConstants.UPDATE, beforeEvent = "#msClass.getLogDetails(#issuesRequest.id)", content = "#msClass.getLogDetails(#issuesRequest.id)", msClass = IssuesService.class)
|
@MsAuditLog(module = OperLogModule.TRACK_BUG, type = OperLogConstants.UPDATE, beforeEvent = "#msClass.getLogDetails(#issuesRequest.id)", content = "#msClass.getLogDetails(#issuesRequest.id)", msClass = IssuesService.class)
|
||||||
@SendNotice(taskType = NoticeConstants.TaskType.DEFECT_TASK, target = "#issuesRequest",
|
@SendNotice(taskType = NoticeConstants.TaskType.DEFECT_TASK, event = NoticeConstants.Event.UPDATE, subject = "缺陷通知")
|
||||||
event = NoticeConstants.Event.UPDATE, subject = "缺陷通知")
|
public IssuesWithBLOBs updateIssues(@RequestPart(value = "request") IssuesUpdateRequest issuesRequest) {
|
||||||
public void updateIssues(@RequestPart(value = "request") IssuesUpdateRequest issuesRequest) {
|
return issuesService.updateIssues(issuesRequest);
|
||||||
issuesService.updateIssues(issuesRequest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/get/case/{refType}/{id}")
|
@GetMapping("/get/case/{refType}/{id}")
|
||||||
|
|
|
@ -32,7 +32,6 @@ import io.metersphere.track.request.issues.PlatformIssueTypeRequest;
|
||||||
import io.metersphere.track.request.testcase.AuthUserIssueRequest;
|
import io.metersphere.track.request.testcase.AuthUserIssueRequest;
|
||||||
import io.metersphere.track.request.testcase.IssuesRequest;
|
import io.metersphere.track.request.testcase.IssuesRequest;
|
||||||
import io.metersphere.track.request.testcase.IssuesUpdateRequest;
|
import io.metersphere.track.request.testcase.IssuesUpdateRequest;
|
||||||
import io.metersphere.track.request.testcase.TestCaseBatchRequest;
|
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.collections.MapUtils;
|
import org.apache.commons.collections.MapUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
@ -142,13 +141,15 @@ public class IssuesService {
|
||||||
return issues;
|
return issues;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateIssues(IssuesUpdateRequest issuesRequest) {
|
public IssuesWithBLOBs updateIssues(IssuesUpdateRequest issuesRequest) {
|
||||||
List<AbstractIssuePlatform> platformList = getUpdatePlatforms(issuesRequest);
|
List<AbstractIssuePlatform> platformList = getUpdatePlatforms(issuesRequest);
|
||||||
platformList.forEach(platform -> {
|
platformList.forEach(platform -> {
|
||||||
platform.updateIssue(issuesRequest);
|
platform.updateIssue(issuesRequest);
|
||||||
});
|
});
|
||||||
customFieldIssuesService.editFields(issuesRequest.getId(), issuesRequest.getEditFields());
|
customFieldIssuesService.editFields(issuesRequest.getId(), issuesRequest.getEditFields());
|
||||||
customFieldIssuesService.addFields(issuesRequest.getId(), issuesRequest.getAddFields());
|
customFieldIssuesService.addFields(issuesRequest.getId(), issuesRequest.getAddFields());
|
||||||
|
|
||||||
|
return getIssue(issuesRequest.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveFollows(String issueId, List<String> follows) {
|
public void saveFollows(String issueId, List<String> follows) {
|
||||||
|
|
Loading…
Reference in New Issue