REQ-2135: 支持查询分类及子分类的模版

This commit is contained in:
yanglin 2024-03-26 18:22:19 +08:00
parent 3630d12b3b
commit e16b25bd0a
8 changed files with 72 additions and 12 deletions

View File

@ -21,6 +21,8 @@ import java.util.Optional;
*/
public interface MessageGroupNodeService {
Optional<String> getNodePath(String groupNodeCode);
/**
* 获取分类结点叶结点名称的路径
*

View File

@ -21,6 +21,14 @@ public interface MessageTemplateGroupService {
*/
List<String> listMessageTemplateCodes(Collection<String> leafNodePathCodes);
/**
* 通过分组结点编码路径查询关联的模板编码列表, 包含子节点
*
* @param groupNodeCode 分组结点编码路径列表
* @return 模板编码列表
*/
List<String> listMessageTemplateCodesWithChildren(String groupNodeCode);
/**
* 通过分组结点编码路径查询关联的模板编码列表
*

View File

@ -45,6 +45,26 @@ public class MessageGroupNodeServiceImpl implements MessageGroupNodeService {
private final PendingMessageBizConfig pendingMessageBizConfig;
private final MessageGroupTreeNodeCacheService messageGroupTreeNodeCacheService;
@Override
public Optional<String> getNodePath(String groupNodeCode) {
GroupTreeNodeDTO node = messageGroupTreeNodeCacheService
.queryNode(groupNodeCode)
.orElse(null);
if (node == null) {
return Optional.empty();
}
StringBuilder buf = new StringBuilder();
GroupTreeNodeDTO current = node;
while (current != null) {
if (buf.length() != 0) {
buf.append(":");
}
buf.append(current.getNodeCode());
current = current.getParentNode();
}
return Optional.of(buf.toString());
}
@Override
public Map<String, String> groupNodeNamePaths(Collection<String> groupNodeCodePaths) {
if (CollectionUtils.isEmpty(groupNodeCodePaths)) {

View File

@ -46,6 +46,25 @@ public class MessageTemplateGroupServiceImpl implements MessageTemplateGroupServ
.collect(Collectors.toList());
}
@Override
public List<String> listMessageTemplateCodesWithChildren(String groupNodeCode) {
if (StringUtils.isBlank(groupNodeCode)) {
return Collections.emptyList();
}
String path = messageGroupNodeService
.getNodePath(groupNodeCode)
.orElse(null);
if (path == null) {
return Collections.emptyList();
}
return messageTemplateGroupDao.lambdaQuery()
.eq(MessageTemplateGroup::getIsDelete, 0)
.likeRight(MessageTemplateGroup::getPath, path)
.list().stream()
.map(MessageTemplateGroup::getTemplateCode)
.collect(Collectors.toList());
}
@Override
public Map<String, List<String>> groupingByMessageTemplateCodes(Collection<String> leafNodePathCodes) {
if (CollectionUtils.isEmpty(leafNodePathCodes)) {

View File

@ -182,7 +182,7 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
@Override
public Page<MessageTemplatePageResponse> page(MessageTemplatePageRequest request) {
IPage<MessageBaseTemplate> result = pageQueryBaseTemplate(request);
IPage<MessageBaseTemplate> result = pageQueryBaseTemplate(request, true);
if (Objects.isNull(result)
|| CollectionUtils.isEmpty(result.getRecords())) {
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
@ -202,7 +202,7 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
@Override
public Page<MessageBaseTemplateDTO> pageBaseTemplate(MessageTemplatePageRequest request) {
IPage<MessageBaseTemplate> result = pageQueryBaseTemplate(request);
IPage<MessageBaseTemplate> result = pageQueryBaseTemplate(request, false);
if (Objects.isNull(result)
|| CollectionUtils.isEmpty(result.getRecords())) {
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
@ -378,13 +378,18 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
}
}
private IPage<MessageBaseTemplate> pageQueryBaseTemplate(MessageTemplatePageRequest request) {
private IPage<MessageBaseTemplate> pageQueryBaseTemplate(
MessageTemplatePageRequest request, boolean includeChildren) {
List<String> templateCodes = Lists.newArrayList();
if (StringUtils.isNotBlank(request.getGroupNodeCode())) {
Optional<GroupTreeNodePathDTO> nodePath = messageGroupNodeService.queryLeafGroupNodeCodePath(request.getGroupNodeCode());
templateCodes = nodePath
.map(v -> messageTemplateGroupService.listMessageTemplateCodes(Lists.newArrayList(v.getNodeCodePath())))
.orElseGet(Collections::emptyList);
if (!includeChildren) {
Optional<GroupTreeNodePathDTO> nodePath = messageGroupNodeService.queryLeafGroupNodeCodePath(request.getGroupNodeCode());
templateCodes = nodePath
.map(v -> messageTemplateGroupService.listMessageTemplateCodes(Lists.newArrayList(v.getNodeCodePath())))
.orElseGet(Collections::emptyList);
} else {
templateCodes = messageTemplateGroupService.listMessageTemplateCodesWithChildren(request.getGroupNodeCode());
}
if (CollectionUtils.isEmpty(templateCodes)) {
// 入参中的分类没有关联任何模板,直接返回查询结果
return null;

View File

@ -27,6 +27,7 @@ import cn.axzo.msg.center.service.pending.response.PushPendingMessageDTO;
import cn.axzo.msg.center.service.util.JSONUtils;
import cn.axzo.msg.center.utils.DateFormatUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableMap;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -350,8 +351,8 @@ public class TodoManager {
.set(Todo::getState, PendingMessageStateEnum.COMPLETED));
TodoRequestContext ctx = TodoRequestContext.create("firePresetButtonPressed")
.addLogContent("presetButtonType", request.getPresetButtonType());
// isCompleted 可以排除是抄送待办的情况
boolean isAdvancedOrCompleted = advanceResult.isAdvanced() || todo.isCompleted();
// isExecCompleted 可以排除是抄送待办的情况
boolean isAdvancedOrCompleted = advanceResult.isAdvanced() || todo.isExecCompleted();
// 支持重复发mq消息
if (isAdvancedOrCompleted) {
sendMqMessageOnPresetButtonPressed(ctx, request, todo);
@ -383,7 +384,8 @@ public class TodoManager {
message.setExecutorWorkspaceId(todo.getOrgId());
message.setExecutorWorkspaceName(todo.getOrgName());
try {
mqProducer.send(MqMessageRecord.builder(MqMessageType.TODO_PRESET_BUTTON_PRESSED, message)
mqProducer.send(MqMessageRecord
.builder(MqMessageType.TODO_PRESET_BUTTON_PRESSED, message)
.targetId(todo.getId())
.operatorId(request.getOperatorId())
.shardingKey(todo.getTemplateCode())
@ -393,10 +395,12 @@ public class TodoManager {
// 打印requestNo, 生产快速定位错误日志
log.warn("预设按钮点击发送事件失败. requestNo={}, request={}", ctx.getRequestNo(), request, e);
// 表记录中的字段也会记录requestNo, 这里重复记录requestNo, 这样能更快的找到
String errorMessage = Throwables.getStackTraceAsString(e);
ctx.addLogContent("mqMessage", ImmutableMap.of(
"isSuccess", "false",
"request", request,
"requestNo", ctx.getRequestNo(),
"failReason", e.getMessage()));
"stacktrace", StringUtils.abbreviate(errorMessage, 1536)));
}
}

View File

@ -34,6 +34,8 @@ public class PresetButtonPressedRequest {
private Long operatorId;
private Long operatorName;
@Override
public String toString() {
return JSON.toJSONString(this);

View File

@ -153,7 +153,7 @@ public class Todo extends BaseEntityExt<Todo> {
/**
* 执行待办是否已经完成(处理)
*/
public boolean isCompleted() {
public boolean isExecCompleted() {
return type == TodoType.EXECUTABLE && state == PendingMessageStateEnum.COMPLETED;
}
}