feat(REQ-1465): 消息模板分页查询接口实现

背景:
  https://jira.axzo.cn/browse/REQ-1465?goToView=1

修改:
  1、消息模板分页查询接口实现

影响:
  无
This commit is contained in:
luofu 2023-10-17 10:26:02 +08:00
parent 4cbc8a127d
commit 23014760bf
11 changed files with 149 additions and 7 deletions

View File

@ -6,6 +6,7 @@ import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.util.Collection;
@ -40,6 +41,15 @@ public class GroupTreeNodePathDTO implements Serializable {
*/
private String nodeCodePath;
public static String parseLeafNodeCode(String nodeCodePath) {
if (StringUtils.isBlank(nodeCodePath)) {
return null;
}
String[] nodeCodes = nodeCodePath.split(NODE_CODE_PATH_SPLITER);
// 最后一个为叶节点的结点编码
return nodeCodes[nodeCodes.length - 1];
}
public static GroupTreeNodePathDTO of(String nodeCode, Collection<GroupTreeNodeDTO> nodes) {
String nodeNamePath = formatPath(GroupTreeNodeDTO::getNodeName, nodes, NODE_NAME_PATH_SPLITER);
String nodeCodePath = formatPath(GroupTreeNodeDTO::getNodeCode, nodes, NODE_CODE_PATH_SPLITER);

View File

@ -18,10 +18,10 @@ public interface MessageGroupNodeService {
/**
* 获取分类结点叶结点名称的路径
*
* @param leafGroupNodeCodes 分类结点叶结点的编码列表
* @param groupNodeCodePaths 分类结点叶结点的编码列表
* @return 分类结点叶结点名称的路径
*/
Map<String, String> leafGroupNodeNamePaths(Collection<String> leafGroupNodeCodes);
Map<String, String> groupNodeNamePaths(Collection<String> groupNodeCodePaths);
/**
* 获取分类结点叶结点编码的路径

View File

@ -2,6 +2,7 @@ package cn.axzo.msg.center.message.service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 消息模板分类管理
@ -27,4 +28,12 @@ public interface MessageTemplateGroupService {
* @param groupNodeCodes 分类结点编码列表
*/
void templateGroup(String templateNode, Collection<String> groupNodeCodes);
/**
* 通过消息模板编码查询其关联的分类的path
*
* @param templateCodes 消息模板编码集合
* @return 模板编码与分类的path列表的映射关系
*/
Map<String, List<String>> listMessageTemplateGroupPaths(Collection<String> templateCodes);
}

View File

@ -2,6 +2,9 @@ package cn.axzo.msg.center.message.service;
import cn.axzo.msg.center.message.domain.dto.MessageTemplateDTO;
import cn.axzo.msg.center.message.domain.param.MessageTemplateCreateParam;
import cn.axzo.msg.center.service.template.request.MessageTemplatePageRequest;
import cn.axzo.msg.center.service.template.response.MessageTemplatePageResponse;
import cn.azxo.framework.common.model.Page;
import java.util.List;
import java.util.Optional;
@ -37,4 +40,12 @@ public interface MessageTemplateNewService {
* @return 模板信息
*/
List<MessageTemplateDTO> listByTemplateCodes(List<String> msgTemplateCodes);
/**
* 分页查询模板数据
*
* @param request 分页请求参数
* @return 模板数据列表
*/
Page<MessageTemplatePageResponse> page(MessageTemplatePageRequest request);
}

View File

@ -28,12 +28,13 @@ public class MessageGroupNodeServiceImpl implements MessageGroupNodeService {
private final MessageGroupTreeNodeCacheService messageGroupTreeNodeCacheService;
@Override
public Map<String, String> leafGroupNodeNamePaths(Collection<String> leafGroupNodeCodes) {
if (CollectionUtils.isEmpty(leafGroupNodeCodes)) {
public Map<String, String> groupNodeNamePaths(Collection<String> groupNodeCodePaths) {
if (CollectionUtils.isEmpty(groupNodeCodePaths)) {
log.info("leafGroupNodeCodes is empty.");
return Collections.emptyMap();
}
return leafGroupNodeCodes.stream()
return groupNodeCodePaths.stream()
.map(GroupTreeNodePathDTO::parseLeafNodeCode)
.map(messageGroupTreeNodeCacheService::queryLeafNodePath)
.filter(Optional::isPresent)
.map(Optional::get)

View File

@ -1,5 +1,6 @@
package cn.axzo.msg.center.message.service.impl;
import cn.axzo.msg.center.common.enums.TableIsDeleteEnum;
import cn.axzo.msg.center.dal.MessageTemplateGroupDao;
import cn.axzo.msg.center.domain.entity.MessageTemplateGroup;
import cn.axzo.msg.center.message.service.MessageGroupNodeService;
@ -60,4 +61,17 @@ public class MessageTemplateGroupServiceImpl implements MessageTemplateGroupServ
}).collect(Collectors.toList());
messageTemplateGroupDao.saveBatch(rows);
}
@Override
public Map<String, List<String>> listMessageTemplateGroupPaths(Collection<String> templateCodes) {
if (CollectionUtils.isEmpty(templateCodes)) {
return Collections.emptyMap();
}
return messageTemplateGroupDao.lambdaQuery()
.in(MessageTemplateGroup::getTemplateCode, templateCodes)
.eq(MessageTemplateGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.list().stream()
.collect(Collectors.groupingBy(MessageTemplateGroup::getTemplateCode,
Collectors.mapping(MessageTemplateGroup::getPath, Collectors.toList())));
}
}

View File

@ -2,17 +2,24 @@ package cn.axzo.msg.center.message.service.impl;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.msg.center.common.enums.ServiceErrorCodeEnum;
import cn.axzo.msg.center.common.utils.PageHelperUtil;
import cn.axzo.msg.center.common.utils.RedisUtil;
import cn.axzo.msg.center.dal.MessageBaseTemplateDao;
import cn.axzo.msg.center.domain.entity.MessageBaseTemplate;
import cn.axzo.msg.center.message.domain.dto.MessageTemplateDTO;
import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO;
import cn.axzo.msg.center.message.domain.param.MessageTemplateCreateParam;
import cn.axzo.msg.center.message.service.MessageGroupNodeService;
import cn.axzo.msg.center.message.service.MessageTemplateGroupService;
import cn.axzo.msg.center.message.service.MessageTemplateNewService;
import cn.axzo.msg.center.message.service.MessageTemplateRouterService;
import cn.axzo.msg.center.service.template.request.MessageTemplatePageRequest;
import cn.axzo.msg.center.service.template.response.MessageTemplatePageResponse;
import cn.axzo.msg.center.utils.JSONObjectUtil;
import cn.axzo.msg.center.utils.UUIDUtil;
import cn.azxo.framework.common.model.Page;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
@ -20,6 +27,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@ -44,6 +52,7 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
private static final int RETRY_CNT_MAX = 3;
private final MessageBaseTemplateDao messageBaseTemplateDao;
private final MessageGroupNodeService messageGroupNodeService;
private final MessageTemplateGroupService messageTemplateGroupService;
private final MessageTemplateRouterService messageTemplateRouterService;
@ -98,6 +107,48 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
.collect(Collectors.toList());
}
@Override
public Page<MessageTemplatePageResponse> page(MessageTemplatePageRequest request) {
List<String> templateCodes = Lists.newArrayList();
if (StringUtils.isNotBlank(request.getGroupNodeCode())) {
templateCodes = messageTemplateGroupService.listMessageTemplateCodes(request.getGroupNodeCode());
if (CollectionUtils.isEmpty(templateCodes)) {
// 入参中的分类没有关联任何模板,直接返回查询结果
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
}
}
if (StringUtils.isNotBlank(request.getTemplateCode())) {
if (CollectionUtils.isNotEmpty(templateCodes)
&& !templateCodes.contains(request.getTemplateCode())) {
// 分页查询的入参中没指定的模板编码与分类映射的模板编码无交集
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
}
// 取两者的交集
templateCodes = Lists.newArrayList(request.getTemplateCode());
}
IPage<MessageBaseTemplate> pageRequest = request.toPage();
IPage<MessageBaseTemplate> result = messageBaseTemplateDao.lambdaQuery()
.like(StringUtils.isNotBlank(request.getTemplateName()),
MessageBaseTemplate::getName, request.getTemplateName())
.in(CollectionUtils.isNotEmpty(templateCodes),
MessageBaseTemplate::getCode, request.getTemplateCode())
.eq(Objects.nonNull(request.getCategory()), MessageBaseTemplate::getMsgCategory, request.getCategory())
.eq(Objects.nonNull(request.getStatus()), MessageBaseTemplate::getStatus, request.getStatus())
.page(pageRequest);
if (CollectionUtils.isEmpty(result.getRecords())) {
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
}
templateCodes = result.getRecords().stream().map(MessageBaseTemplate::getCode).collect(Collectors.toList());
Map<String, List<String>> groupNodePaths = messageTemplateGroupService
.listMessageTemplateGroupPaths(templateCodes);
Map<String, String> codeNameMap = messageGroupNodeService.groupNodeNamePaths(groupNodePaths.values().stream()
.flatMap(Collection::stream).collect(Collectors.toList()));
List<MessageTemplatePageResponse> records = result.getRecords().stream()
.map(e -> convert(e, groupNodePaths, codeNameMap))
.collect(Collectors.toList());
return Page.toPage(request.getPage(), request.getPageSize(), result.getTotal(), records);
}
private String saveTemplate(MessageTemplateCreateParam param) {
String templateCode = UUIDUtil.uuidString();
MessageBaseTemplate template = convert(param);
@ -150,6 +201,23 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
return template;
}
private MessageTemplatePageResponse convert(MessageBaseTemplate record, Map<String, List<String>> groupNodePaths,
Map<String, String> codeNameMap) {
MessageTemplatePageResponse response = new MessageTemplatePageResponse();
response.setTemplateName(record.getName());
response.setTemplateCode(record.getCode());
response.setTitle(record.getTitle());
response.setContent(record.getContent());
response.setCategory(record.getMsgCategory());
response.setStatus(record.getStatus());
List<String> nodeNamePaths = groupNodePaths.getOrDefault(record.getCode(), Collections.emptyList()).stream()
.filter(codeNameMap::containsKey)
.map(codeNameMap::get)
.collect(Collectors.toList());
response.setGroupNodeNamePaths(nodeNamePaths);
return response;
}
private void saveTemplateRouters(MessageTemplateCreateParam param, String templateCode) {
if (CollectionUtils.isEmpty(param.getRouters())) {
return;

View File

@ -1,5 +1,6 @@
package cn.axzo.msg.center.service.template.request;
import cn.axzo.basics.common.page.PageRequest;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.StatusEnum;
import com.alibaba.fastjson.JSON;
@ -15,7 +16,7 @@ import java.io.Serializable;
*/
@Setter
@Getter
public class MessageTemplatePageRequest implements Serializable {
public class MessageTemplatePageRequest extends PageRequest implements Serializable {
private static final long serialVersionUID = 3501567663122621175L;

View File

@ -7,6 +7,7 @@ import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* @author cold_blade
@ -44,7 +45,7 @@ public class MessageTemplatePageResponse implements Serializable {
/**
* 分类路径eg发薪管理/发薪提醒/提醒工人
*/
private String groupNodePath;
private List<String> groupNodeNamePaths;
/**
* 模板状态
* ENABLE: 启用

View File

@ -0,0 +1,20 @@
package cn.axzo.msg.center.common.utils;
import cn.azxo.framework.common.model.Page;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.util.Collections;
/**
* @author cold_blade
* @date 2023/10/16
* @version 1.0
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class PageHelperUtil {
public static <T> Page<T> emptyPage(Long pageNum, Long pageSize) {
return Page.toPage(pageNum, pageSize, 0L, Collections.emptyList());
}
}

View File

@ -2,6 +2,7 @@ package cn.axzo.msg.center.domain.entity;
import cn.axzo.msg.center.domain.persistence.BaseEntity;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.StatusEnum;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
@ -51,6 +52,12 @@ public class MessageBaseTemplate extends BaseEntity<MessageBaseTemplate> impleme
* 模板icon
*/
private String icon;
/**
* 模板状态
* ENABLE: 启用
* DISABLE: 禁用
*/
private StatusEnum status;
/**
* 推送终端配置 JSON字串
*/