From 8c9909994a53ec03e7a65bd21c6448d52c1a4aa8 Mon Sep 17 00:00:00 2001 From: luofu Date: Wed, 8 Nov 2023 15:52:25 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat(REQ-1507):=20=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E6=95=B0=E6=8D=AE=E6=A8=A1=E5=9E=8B=E7=9A=84?= =?UTF-8?q?=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 背景: https://jira.axzo.cn/browse/REQ-1507?goToView=1 修改: 1、消息路由数据模型的重构 影响: 无 --- .../domain/dto/MessageTemplateRouterDTO.java | 138 +++++++- .../service/MessageTemplateRouterService.java | 30 +- .../impl/MessageTemplateNewServiceImpl.java | 22 +- .../MessageTemplateRouterServiceImpl.java | 307 +++++++++++++++--- .../impl/RelationTemplateMapServiceImpl.java | 7 +- .../domain/entity/MessageRouteButton.java | 7 +- 6 files changed, 425 insertions(+), 86 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java index ea303bf0..f17ff7ac 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java @@ -1,8 +1,12 @@ package cn.axzo.msg.center.message.domain.dto; +import cn.axzo.basics.common.util.AssertUtil; +import cn.axzo.msg.center.domain.entity.MessageRouteButton; +import cn.axzo.msg.center.domain.entity.MessageRouteDetail; +import cn.axzo.msg.center.domain.entity.MessageRouterConfig; import cn.axzo.msg.center.service.enums.BizDetailShowStrategyEnum; -import cn.axzo.msg.center.service.enums.MessageCategoryEnum; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; +import cn.axzo.msg.center.service.enums.RouterCategoryEnum; import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -10,9 +14,15 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; +import java.util.Collections; import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; /** * @author cold_blade @@ -30,11 +40,30 @@ public class MessageTemplateRouterDTO implements Serializable { /** * 业务详情路由 */ - private BizDetailRouterDTO bizDetailRouter; + private MessageDetailRouterDTO detailRouter; /** * 按钮路由列表 */ - private List routeButtons; + private List btnRouters; + + public boolean isValid() { + return Objects.nonNull(detailRouter) + || CollectionUtils.isNotEmpty(btnRouters); + } + + public boolean isInValid() { + return !isValid(); + } + + public Optional fetchTemplateCode() { + if (Objects.nonNull(detailRouter)) { + return Optional.ofNullable(detailRouter.getTemplateCode()); + } + if (CollectionUtils.isNotEmpty(btnRouters)) { + return Optional.ofNullable(btnRouters.get(0).getTemplateCode()); + } + return Optional.empty(); + } @Override public String toString() { @@ -45,23 +74,55 @@ public class MessageTemplateRouterDTO implements Serializable { @Builder @NoArgsConstructor @AllArgsConstructor - public static class BizDetailRouterDTO implements Serializable { + public static class MessageDetailRouterDTO implements Serializable { private static final long serialVersionUID = -6332526731908737802L; /** - * 模板编码 + * 显示名称 + */ + private String name; + /** + * 模板code */ private String templateCode; /** * 业务详情展示策略 */ - private BizDetailShowStrategyEnum bizDetailShowStrategy; + private BizDetailShowStrategyEnum showStrategy; /** * 跳转路由的配置列表 */ private List routerConfigs; + public static MessageDetailRouterDTO from(MessageRouteDetail msgRouteDetail, + List routerConfigs) { + AssertUtil.notNull(msgRouteDetail, "msgRouteDetail can not be null"); + AssertUtil.notEmpty(routerConfigs, "routerConfigs can not be empty"); + + return MessageDetailRouterDTO.builder() + .name(msgRouteDetail.getName()) + .templateCode(msgRouteDetail.getTemplateCode()) + .showStrategy(msgRouteDetail.getShowStrategy()) + .routerConfigs(routerConfigs.stream().map(MessageRouterConfigDTO::from).collect(Collectors.toList())) + .build(); + } + + public MessageRouteDetail fetchMessageRouteDetail() { + return MessageRouteDetail.builder() + .name(this.name) + .showStrategy(this.showStrategy) + .templateCode(this.templateCode) + .build(); + } + + public List fetchMessageRouterConfigs() { + return CollectionUtils.isEmpty(this.routerConfigs) ? Collections.emptyList() : + this.routerConfigs.stream() + .map(MessageRouterConfigDTO::fetchMessageRouterConfig) + .collect(Collectors.toList()); + } + @Override public String toString() { return JSON.toJSONString(this); @@ -72,7 +133,7 @@ public class MessageTemplateRouterDTO implements Serializable { @Builder @NoArgsConstructor @AllArgsConstructor - public static class MessageTemplateRouteButtonDTO implements Serializable { + public static class MessageButtonRouterDTO implements Serializable { private static final long serialVersionUID = -7544674409859277745L; @@ -95,7 +156,7 @@ public class MessageTemplateRouterDTO implements Serializable { /** * 路由类型 */ - private MessageCategoryEnum category; + private RouterCategoryEnum category; /** * API地址,仅当按钮是接口调用类型时有值 */ @@ -109,6 +170,51 @@ public class MessageTemplateRouterDTO implements Serializable { */ private JSONObject style; + public static MessageButtonRouterDTO from(MessageRouteButton routeButton, + List routerConfigs) { + AssertUtil.notNull(routeButton, "msgRouteDetail can not be null"); + AssertUtil.notEmpty(routerConfigs, "routerConfigs can not be empty"); + + List configs = CollectionUtils.isEmpty(routerConfigs) ? Collections.emptyList() : + routerConfigs.stream().map(MessageRouterConfigDTO::from).collect(Collectors.toList()); + return MessageButtonRouterDTO.builder() + .name(routeButton.getName()) + .btnCode(routeButton.getBtnCode()) + .templateCode(routeButton.getTemplateCode()) + .source(routeButton.getSource()) + .category(routeButton.getCategory()) + .apiUrl(routeButton.getApiUrl()) + .style(routeButton.getStyle()) + .routerConfigs(configs) + .build(); + } + + public MessageRouteButton fetchMessageRouteButton() { + return MessageRouteButton.builder() + .name(this.name) + .btnCode(this.btnCode) + .templateCode(this.templateCode) + .source(this.source) + .category(this.category) + .apiUrl(this.apiUrl) + .style(this.style) + .build(); + } + + public List fetchMessageRouterConfigs() { + return CollectionUtils.isEmpty(this.routerConfigs) ? Collections.emptyList() : + this.routerConfigs.stream() + .map(MessageRouterConfigDTO::fetchMessageRouterConfig) + .collect(Collectors.toList()); + } + + public boolean isValid() { + if (RouterCategoryEnum.ACTION.equals(this.category)) { + return StringUtils.isNotBlank(apiUrl); + } + return CollectionUtils.isNotEmpty(routerConfigs); + } + @Override public String toString() { return JSON.toJSONString(this); @@ -136,6 +242,22 @@ public class MessageTemplateRouterDTO implements Serializable { */ private String url; + static MessageRouterConfigDTO from(MessageRouterConfig config) { + return MessageRouterConfigDTO.builder() + .routerCode(config.getRouterCode()) + .terminalType(config.getTerminalType()) + .url(config.getUrl()) + .build(); + } + + MessageRouterConfig fetchMessageRouterConfig() { + return MessageRouterConfig.builder() + .routerCode(this.routerCode) + .terminalType(this.terminalType) + .url(this.url) + .build(); + } + @Override public String toString() { return JSON.toJSONString(this); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateRouterService.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateRouterService.java index 36a7b02b..d295f678 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateRouterService.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateRouterService.java @@ -1,10 +1,11 @@ package cn.axzo.msg.center.message.service; -import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO; -import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO; +import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Optional; /** * @description @@ -14,30 +15,23 @@ import java.util.Map; * @date 2023/9/28 * @version 1.0 */ -public interface MessageTemplateRouterService {//TODO:[cold_blade] P0路由模型改版 +public interface MessageTemplateRouterService { /** - * 根据消息模板编码查询配置的路由列表 + * 根据消息模板编码查询配置的路由 * * @param templateCode 消息模板编码 - * @return 路由列表 + * @return 路由 */ - List queryByTemplateCode(String templateCode); + Optional queryByTemplateCode(String templateCode); /** - * 批量插入模板路由 + * 保存OR更新消息模板的路由 * - * @param routers 路由列表 + * @param router 路由配置 + * @param isUpdate 是否更新 */ - void batchInsert(List routers); - - /** - * 更新模板的路由信息 - * - * @param templateCode 模板编码 - * @param routers 路由列表 - */ - void updateTemplateRoutes(String templateCode, List routers); + void saveOrUpdate(MessageTemplateRouterDTO router, boolean isUpdate); /** * 根据消息模板编码查询配置的路由列表 @@ -45,5 +39,5 @@ public interface MessageTemplateRouterService {//TODO:[cold_blade] P0路由模 * @param templateCodes 消息模板编码列表 * @return 路由列表 */ - Map> groupByTemplateCode(List templateCodes); + Map groupByTemplateCode(Collection templateCodes); } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateNewServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateNewServiceImpl.java index 52089cf2..1eb7a425 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateNewServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateNewServiceImpl.java @@ -111,8 +111,9 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService // 获取模板关联分类的path列表 List groupNodePaths = messageTemplateGroupService.listMessageTemplateGroupPaths( Lists.newArrayList(templateCode)).getOrDefault(templateCode, Collections.emptyList()); - List routers = messageTemplateRouterService.queryByTemplateCode(templateCode); - return convert(baseTemplate, groupNodePaths, routers); + // TODO: [cold_blade] P0 +// List routers = messageTemplateRouterService.queryByTemplateCode(templateCode); + return convert(baseTemplate, groupNodePaths, Collections.emptyList()); } @Override @@ -143,8 +144,9 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService log.info("not find the [{}] template.", msgTemplateCode); return Optional.empty(); } - List routers = messageTemplateRouterService.queryByTemplateCode(msgTemplateCode); - return Optional.of(MessageTemplateDTO.from(msgBaseTemplate, routers)); + // TODO: [cold_blade] P0 +// List routers = messageTemplateRouterService.queryByTemplateCode(msgTemplateCode); + return Optional.of(MessageTemplateDTO.from(msgBaseTemplate, Collections.emptyList())); } @Override @@ -161,8 +163,10 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService log.info("not find the [{}] templates.", msgTemplateCodes); return Collections.emptyList(); } - Map> templateRouterMap = messageTemplateRouterService - .groupByTemplateCode(msgTemplateCodes); + // TODO: [cold_blade] P0 +// Map> templateRouterMap = messageTemplateRouterService +// .groupByTemplateCode(msgTemplateCodes); + Map> templateRouterMap = Collections.emptyMap(); return msgBaseTemplates.stream() .map(e -> MessageTemplateDTO.from(e, templateRouterMap.getOrDefault(e.getCode(), Collections.emptyList()))) .collect(Collectors.toList()); @@ -292,7 +296,8 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService .collect(Collectors.toList()); routers.addAll(btnRouters); } - messageTemplateRouterService.batchInsert(routers); + // TODO: [cold_blade] P0 +// messageTemplateRouterService.batchInsert(routers); } private void updateBaseTemplate(MessageTemplateSaveOrUpdateParam param) { @@ -336,7 +341,8 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService if (CollectionUtils.isNotEmpty(param.getRouters())) { routers.addAll(param.getRouters()); } - messageTemplateRouterService.updateTemplateRoutes(param.getTemplateCode(), routers); + // TODO: [cold_blade] P0 +// messageTemplateRouterService.updateTemplateRoutes(param.getTemplateCode(), routers); } private IPage pageQueryBaseTemplate(MessageTemplatePageRequest request) { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateRouterServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateRouterServiceImpl.java index bab7e237..2072ee0d 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateRouterServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateRouterServiceImpl.java @@ -1,21 +1,40 @@ package cn.axzo.msg.center.message.service.impl; -import cn.axzo.msg.center.dal.MessageTemplateRouterDao; -import cn.axzo.msg.center.domain.entity.MessageTemplateRouter; -import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO; +import cn.axzo.framework.core.util.MapUtil; +import cn.axzo.msg.center.dal.MessageRouteButtonDao; +import cn.axzo.msg.center.dal.MessageRouteDetailDao; +import cn.axzo.msg.center.dal.MessageRouterConfigDao; +import cn.axzo.msg.center.domain.entity.MessageRouteButton; +import cn.axzo.msg.center.domain.entity.MessageRouteDetail; +import cn.axzo.msg.center.domain.entity.MessageRouterConfig; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageButtonRouterDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageDetailRouterDTO; import cn.axzo.msg.center.message.service.MessageTemplateRouterService; -import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO; -import com.google.common.collect.Lists; +import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; +import cn.axzo.msg.center.service.enums.RouterCategoryEnum; +import cn.axzo.msg.center.utils.UUIDUtil; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; 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; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @description @@ -29,66 +48,258 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterService { - private final MessageTemplateRouterDao messageTemplateRouterDao; + private final MessageRouteDetailDao messageRouteDetailDao; + private final MessageRouteButtonDao messageRouteButtonDao; + private final MessageRouterConfigDao messageRouterConfigDao; @Override - public List queryByTemplateCode(String templateCode) { + public Optional queryByTemplateCode(String templateCode) { if (StringUtils.isBlank(templateCode)) { - log.warn("the template code is blank."); - return Collections.emptyList(); + log.info("templateCode is blank."); } - return listByTemplateCodes(Lists.newArrayList(templateCode)); + MessageTemplateRouterDTO router = MessageTemplateRouterDTO.builder() + .detailRouter(queryDetailRouter(templateCode)) + .btnRouters(listButtonRouters(templateCode)) + .build(); + return router.isValid() ? Optional.of(router) : Optional.empty(); } @Override - public void batchInsert(List routers) { - if (CollectionUtils.isEmpty(routers)) { + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdate(MessageTemplateRouterDTO router, boolean isUpdate) { + if (Objects.isNull(router) || router.isInValid()) { + log.info("invalid message template router. router:{}", router); return; } - List messageTemplateRouters = routers.stream() - .flatMap(e -> e.toMessageTemplateRouters().stream()) - .collect(Collectors.toList()); - messageTemplateRouterDao.saveBatch(messageTemplateRouters); - } - - @Override - public void updateTemplateRoutes(String templateCode, List routers) { - if (StringUtils.isBlank(templateCode) - || CollectionUtils.isEmpty(routers)) { - log.info("the param is invalid. templateCode:[{}], routers:{}", templateCode, routers); - return; + if (isUpdate) { + // 更新的逻辑为删除旧的重新创建 + remove(router.fetchTemplateCode().orElse(null)); } - // 移除之前的路由信息 - messageTemplateRouterDao.lambdaUpdate() - .eq(MessageTemplateRouter::getTemplateCode, templateCode) - .remove(); - // 创建信息的路由信息 - List newRouters = routers.stream() - .map(e -> RawMessageRouterDTO.from(e, templateCode)) - .collect(Collectors.toList()); - batchInsert(newRouters); + saveDetailRouter(router.getDetailRouter()); + batchSaveButtonRouter(router.getBtnRouters()); } @Override - public Map> groupByTemplateCode(List templateCodes) { + public Map groupByTemplateCode(Collection templateCodes) { if (CollectionUtils.isEmpty(templateCodes)) { + log.info("templateCodes is empty."); return Collections.emptyMap(); } - return listByTemplateCodes(templateCodes).stream() - .collect(Collectors.groupingBy(RawMessageRouterDTO::getTemplateCode)); + Set distinctTemplateCodes = Sets.newHashSet(templateCodes); + Map detailRouters = listDetailRoutersGroupingByTemplateCode(distinctTemplateCodes); + Map> buttonRouters = listButtonRoutersGroupingByTemplateCode(distinctTemplateCodes); + return distinctTemplateCodes.stream() + .filter(e -> detailRouters.containsKey(e) || buttonRouters.containsKey(e)) + .collect(Collectors.toMap(Function.identity(), e -> MessageTemplateRouterDTO.builder() + .detailRouter(detailRouters.get(e)) + .btnRouters(buttonRouters.get(e)) + .build()) + ); } - private List listByTemplateCodes(List templateCodes) { - // 根据模板编码进行分组 - Map> routers = messageTemplateRouterDao - .listByTemplateCode(templateCodes).stream() - .collect(Collectors.groupingBy(MessageTemplateRouter::getTemplateCode)); - return routers.values().stream() - .flatMap(e -> { - // 模板路由的按钮维度 - Map> btnMap = e.stream() - .collect(Collectors.groupingBy(MessageTemplateRouter::getName)); - return btnMap.values().stream().map(RawMessageRouterDTO::from); - }).collect(Collectors.toList()); + private MessageDetailRouterDTO queryDetailRouter(String templateCode) { + MessageRouteDetail msgRouteDetail = selectRouteDetail(templateCode); + if (Objects.isNull(msgRouteDetail)) { + return null; + } + List routerConfigs = listByRouterCode(msgRouteDetail.getTemplateCode()); + return MessageDetailRouterDTO.from(msgRouteDetail, routerConfigs); + } + + private Map listDetailRoutersGroupingByTemplateCode(Collection templateCodes) { + Map routeDetails = listRouteDetailsGroupingByTemplateCode(templateCodes); + if (MapUtil.isEmpty(routeDetails)) { + log.info("there is not any route detail. templateCodes:{}", templateCodes); + return Collections.emptyMap(); + } + Map> routerConfigs = groupingByRouterCode(templateCodes); + Map result = Maps.newHashMap(); + routeDetails.entrySet().stream() + .filter(e -> routerConfigs.containsKey(e.getKey())) + .forEach(e -> result.put(e.getKey(), MessageDetailRouterDTO.from(e.getValue(), routerConfigs.get(e.getKey())))); + return result; + } + + private List listButtonRouters(String templateCode) { + List routeButtons = messageRouteButtonDao.lambdaQuery() + .eq(MessageRouteButton::getTemplateCode, templateCode) + .list(); + if (CollectionUtils.isEmpty(routeButtons)) { + log.info("the is not any router button. templateCode:[{}]", templateCode); + return Collections.emptyList(); + } + List btnCodes = routeButtons.stream().map(MessageRouteButton::getBtnCode).collect(Collectors.toList()); + Map> btnRouterConfigs = groupingByRouterCode(btnCodes); + return routeButtons.stream() + .map(e -> MessageButtonRouterDTO.from(e, btnRouterConfigs.get(e.getBtnCode()))) + .collect(Collectors.toList()); + } + + private Map> listButtonRoutersGroupingByTemplateCode( + Collection templateCodes) { + List routeButtons = messageRouteButtonDao.lambdaQuery() + .in(MessageRouteButton::getTemplateCode, templateCodes) + .list(); + if (CollectionUtils.isEmpty(routeButtons)) { + log.info("the is not any router button. templateCodes:{}", templateCodes); + return Collections.emptyMap(); + } + Set btnCodes = routeButtons.stream().map(MessageRouteButton::getBtnCode).collect(Collectors.toSet()); + Map> btnRouterConfigs = groupingByRouterCode(btnCodes); + return routeButtons.stream() + .map(e -> MessageButtonRouterDTO.from(e, btnRouterConfigs.get(e.getBtnCode()))) + .collect(Collectors.groupingBy(MessageButtonRouterDTO::getTemplateCode)); + } + + private MessageRouteDetail selectRouteDetail(String templateCode) { + List msgRouteDetails = messageRouteDetailDao.lambdaQuery() + .eq(MessageRouteDetail::getTemplateCode, templateCode) + .orderByDesc(MessageRouteDetail::getId) + .list(); + if (CollectionUtils.isEmpty(msgRouteDetails)) { + return null; + } + if (msgRouteDetails.size() > 1) { + log.warn("there is some dirty data in table:[message_route_detail]"); + } + return msgRouteDetails.get(0); + } + + private Map listRouteDetailsGroupingByTemplateCode(Collection templateCodes) { + List msgRouteDetails = messageRouteDetailDao.lambdaQuery() + .in(MessageRouteDetail::getTemplateCode, templateCodes) + .orderByDesc(MessageRouteDetail::getId) + .list(); + if (CollectionUtils.isEmpty(msgRouteDetails)) { + return Collections.emptyMap(); + } + Map> groupingBy = msgRouteDetails.stream() + .collect(Collectors.groupingBy(MessageRouteDetail::getTemplateCode)); + Map result = Maps.newHashMap(); + for (List elem : groupingBy.values()) { + MessageRouteDetail detail = elem.get(0); + result.put(detail.getTemplateCode(), detail); + if (msgRouteDetails.size() > 1) { + log.warn("there is some dirty data in table:[message_route_detail]. templateCode:[{}]", + elem.get(0).getTemplateCode()); + } + } + return result; + } + + private List listByRouterCode(String routerCode) { + if (StringUtils.isBlank(routerCode)) { + log.info("routerCode is blank."); + return Collections.emptyList(); + } + return messageRouterConfigDao.lambdaQuery() + .eq(MessageRouterConfig::getRouterCode, routerCode) + .list(); + } + + private Map> groupingByRouterCode(Collection routerCodes) { + if (CollectionUtils.isEmpty(routerCodes)) { + log.info("routerCodes is empty."); + return Collections.emptyMap(); + } + return messageRouterConfigDao.lambdaQuery() + .in(MessageRouterConfig::getRouterCode, routerCodes) + .list().stream() + .collect(Collectors.groupingBy(MessageRouterConfig::getRouterCode)); + } + + private void saveDetailRouter(MessageDetailRouterDTO detailRouter) { + if (Objects.isNull(detailRouter)) { + log.info("detailRouter is null."); + return; + } + messageRouteDetailDao.save(detailRouter.fetchMessageRouteDetail()); + messageRouterConfigDao.saveBatch(detailRouter.fetchMessageRouterConfigs()); + } + + private void batchSaveButtonRouter(List buttonRouters) { + if (CollectionUtils.isEmpty(buttonRouters)) { + log.info("buttonRouters is empty."); + return; + } + List routeButtonWrappers = buttonRouters.stream() + .filter(MessageButtonRouterDTO::isValid) + .map(e -> MessageRouteButtonWrapper.of(e.fetchMessageRouteButton(), e)) + .collect(Collectors.toList()); + // 生成自定义按钮的唯一标识和顺序 + buildButtonCodeAndPriority(routeButtonWrappers); + // 保存模板对应的按钮路由 + List routeButtons = routeButtonWrappers.stream() + .map(MessageRouteButtonWrapper::getRouteButton) + .collect(Collectors.toList()); + messageRouteButtonDao.saveBatch(routeButtons); + List routerConfigs = routeButtonWrappers.stream() + .filter(e -> RouterCategoryEnum.JUMP.equals(e.getButtonRouter().getCategory())) + .flatMap(this::routerConfigStream) + .collect(Collectors.toList()); + messageRouterConfigDao.saveBatch(routerConfigs); + } + + private void buildButtonCodeAndPriority(List routeButtonWrappers) { + for (int i = 0; i < routeButtonWrappers.size(); i++) { + MessageRouteButton button = routeButtonWrappers.get(i).getRouteButton(); + if (RouterButtonSourceEnum.CUSTOM.equals(button.getSource())) { + // 这里仅对自定义的按钮设置按钮标识 + button.setBtnCode(UUIDUtil.uuidString()); + } + // 优先级默认从1开始 + button.setPriority(i + 1); + } + } + + private Stream routerConfigStream(MessageRouteButtonWrapper routeButtonWrapper) { + // 获取对应按钮的唯一标识 + String btnCode = routeButtonWrapper.getRouteButton().getBtnCode(); + // 转化为存储的数据模型 + List routerConfigs = routeButtonWrapper.buttonRouter.fetchMessageRouterConfigs(); + // 将按钮唯一标识与路由跳转配置进行映射 + routerConfigs.forEach(e -> e.setRouterCode(btnCode)); + return routerConfigs.stream(); + } + + private void remove(String templateCode) { + if (StringUtils.isBlank(templateCode)) { + log.info("===remove=== templateCode is blank."); + return; + } + Set routerCodes = Sets.newHashSet(); + // 查询对应模板的路由按钮 + Set btnCodes = messageRouteButtonDao.lambdaQuery() + .eq(MessageRouteButton::getTemplateCode, templateCode) + .select(MessageRouteButton::getBtnCode) + .list().stream().map(MessageRouteButton::getBtnCode).collect(Collectors.toSet()); + if (CollectionUtils.isNotEmpty(btnCodes)) { + // 逻辑删除该模板对应的路由按钮 + messageRouteButtonDao.lambdaUpdate().eq(MessageRouteButton::getTemplateCode, templateCode).remove(); + routerCodes.addAll(btnCodes); + } + // 逻辑删除业务详情路由 + boolean result = messageRouteDetailDao.lambdaUpdate() + .eq(MessageRouteDetail::getTemplateCode, templateCode) + .remove(); + if (result) { + routerCodes.add(templateCode); + } + if (CollectionUtils.isEmpty(routerCodes)) { + return; + } + // 逻辑删除该模板对应的路由按钮的URL相关配置 + messageRouterConfigDao.lambdaUpdate().in(MessageRouterConfig::getRouterCode, routerCodes).remove(); + } + + @Getter + @AllArgsConstructor + private static class MessageRouteButtonWrapper { + private MessageRouteButton routeButton; + private MessageButtonRouterDTO buttonRouter; + + static MessageRouteButtonWrapper of(MessageRouteButton routeButton, MessageButtonRouterDTO buttonRouter) { + return new MessageRouteButtonWrapper(routeButton, buttonRouter); + } } } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/RelationTemplateMapServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/RelationTemplateMapServiceImpl.java index 91bce7b6..874ebcac 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/RelationTemplateMapServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/RelationTemplateMapServiceImpl.java @@ -145,9 +145,10 @@ public class RelationTemplateMapServiceImpl implements RelationTemplateMapServic // 批量插入 messageBaseTemplateDao.saveBatch(wrappers.stream() .map(CreateNewTemplateAndMapWrapper::getBaseTemplate).collect(Collectors.toList())); - messageTemplateRouterService.batchInsert(wrappers.stream() - .filter(e -> CollectionUtils.isNotEmpty(e.getRouters())) - .flatMap(e -> e.getRouters().stream()).collect(Collectors.toList())); + // TODO: [cold_blade] P0 +// messageTemplateRouterService.batchInsert(wrappers.stream() +// .filter(e -> CollectionUtils.isNotEmpty(e.getRouters())) +// .flatMap(e -> e.getRouters().stream()).collect(Collectors.toList())); List groupNodes = Lists.newArrayList(param.getGroupNodeCode()); Map> templateGroupNodeMap = wrappers.stream() .map(CreateNewTemplateAndMapWrapper::getBaseTemplate) diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageRouteButton.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageRouteButton.java index 5bbb0cf1..c3a018d7 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageRouteButton.java +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageRouteButton.java @@ -3,6 +3,7 @@ package cn.axzo.msg.center.domain.entity; import cn.axzo.msg.center.domain.persistence.BaseEntityExt; import cn.axzo.msg.center.service.enums.MessageCategoryEnum; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; +import cn.axzo.msg.center.service.enums.RouterCategoryEnum; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.annotation.TableField; @@ -52,7 +53,7 @@ public class MessageRouteButton extends BaseEntityExt implem /** * 路由类型 */ - private MessageCategoryEnum category; + private RouterCategoryEnum category; /** * API地址,仅当按钮是接口调用类型时有值 */ @@ -62,6 +63,10 @@ public class MessageRouteButton extends BaseEntityExt implem */ @TableField(typeHandler = FastjsonTypeHandler.class) private JSONObject style; + /** + * 按钮优先级,数值越大优先级越低 + */ + private Integer priority; @Override public String toString() { From 5a0e6eb3ede45f6e0b5e881afc01351fab86815a Mon Sep 17 00:00:00 2001 From: luofu Date: Wed, 8 Nov 2023 16:11:00 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat(REQ-1507):=20=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E6=95=B0=E6=8D=AE=E6=A8=A1=E5=9E=8B=E7=9A=84?= =?UTF-8?q?=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 背景: https://jira.axzo.cn/browse/REQ-1507?goToView=1 修改: 1、消息路由数据模型的重构 影响: 无 --- .../domain/dto/MessageTemplateRouterDTO.java | 37 ++++++++------ .../MessageTemplateRouterServiceImpl.java | 50 +++++++++---------- 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java index f17ff7ac..1e20fb7c 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java @@ -40,15 +40,15 @@ public class MessageTemplateRouterDTO implements Serializable { /** * 业务详情路由 */ - private MessageDetailRouterDTO detailRouter; + private MessageRouteDetailDTO routeDetail; /** * 按钮路由列表 */ - private List btnRouters; + private List routeButtons; public boolean isValid() { - return Objects.nonNull(detailRouter) - || CollectionUtils.isNotEmpty(btnRouters); + return Objects.nonNull(routeDetail) + || CollectionUtils.isNotEmpty(routeButtons); } public boolean isInValid() { @@ -56,11 +56,11 @@ public class MessageTemplateRouterDTO implements Serializable { } public Optional fetchTemplateCode() { - if (Objects.nonNull(detailRouter)) { - return Optional.ofNullable(detailRouter.getTemplateCode()); + if (Objects.nonNull(routeDetail)) { + return Optional.ofNullable(routeDetail.getTemplateCode()); } - if (CollectionUtils.isNotEmpty(btnRouters)) { - return Optional.ofNullable(btnRouters.get(0).getTemplateCode()); + if (CollectionUtils.isNotEmpty(routeButtons)) { + return Optional.ofNullable(routeButtons.get(0).getTemplateCode()); } return Optional.empty(); } @@ -74,7 +74,7 @@ public class MessageTemplateRouterDTO implements Serializable { @Builder @NoArgsConstructor @AllArgsConstructor - public static class MessageDetailRouterDTO implements Serializable { + public static class MessageRouteDetailDTO implements Serializable { private static final long serialVersionUID = -6332526731908737802L; @@ -95,12 +95,12 @@ public class MessageTemplateRouterDTO implements Serializable { */ private List routerConfigs; - public static MessageDetailRouterDTO from(MessageRouteDetail msgRouteDetail, - List routerConfigs) { + public static MessageRouteDetailDTO from(MessageRouteDetail msgRouteDetail, + List routerConfigs) { AssertUtil.notNull(msgRouteDetail, "msgRouteDetail can not be null"); AssertUtil.notEmpty(routerConfigs, "routerConfigs can not be empty"); - return MessageDetailRouterDTO.builder() + return MessageRouteDetailDTO.builder() .name(msgRouteDetail.getName()) .templateCode(msgRouteDetail.getTemplateCode()) .showStrategy(msgRouteDetail.getShowStrategy()) @@ -133,7 +133,7 @@ public class MessageTemplateRouterDTO implements Serializable { @Builder @NoArgsConstructor @AllArgsConstructor - public static class MessageButtonRouterDTO implements Serializable { + public static class MessageRouteButtonDTO implements Serializable { private static final long serialVersionUID = -7544674409859277745L; @@ -169,15 +169,19 @@ public class MessageTemplateRouterDTO implements Serializable { * 按钮style配置 */ private JSONObject style; + /** + * 按钮优先级,数值越大优先级越低 + */ + private Integer priority; - public static MessageButtonRouterDTO from(MessageRouteButton routeButton, - List routerConfigs) { + public static MessageRouteButtonDTO from(MessageRouteButton routeButton, + List routerConfigs) { AssertUtil.notNull(routeButton, "msgRouteDetail can not be null"); AssertUtil.notEmpty(routerConfigs, "routerConfigs can not be empty"); List configs = CollectionUtils.isEmpty(routerConfigs) ? Collections.emptyList() : routerConfigs.stream().map(MessageRouterConfigDTO::from).collect(Collectors.toList()); - return MessageButtonRouterDTO.builder() + return MessageRouteButtonDTO.builder() .name(routeButton.getName()) .btnCode(routeButton.getBtnCode()) .templateCode(routeButton.getTemplateCode()) @@ -185,6 +189,7 @@ public class MessageTemplateRouterDTO implements Serializable { .category(routeButton.getCategory()) .apiUrl(routeButton.getApiUrl()) .style(routeButton.getStyle()) + .priority(routeButton.getPriority()) .routerConfigs(configs) .build(); } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateRouterServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateRouterServiceImpl.java index 2072ee0d..63ea7b55 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateRouterServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateRouterServiceImpl.java @@ -8,8 +8,8 @@ import cn.axzo.msg.center.domain.entity.MessageRouteButton; import cn.axzo.msg.center.domain.entity.MessageRouteDetail; import cn.axzo.msg.center.domain.entity.MessageRouterConfig; import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO; -import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageButtonRouterDTO; -import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageDetailRouterDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteButtonDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteDetailDTO; import cn.axzo.msg.center.message.service.MessageTemplateRouterService; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; @@ -58,8 +58,8 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe log.info("templateCode is blank."); } MessageTemplateRouterDTO router = MessageTemplateRouterDTO.builder() - .detailRouter(queryDetailRouter(templateCode)) - .btnRouters(listButtonRouters(templateCode)) + .routeDetail(queryDetailRouter(templateCode)) + .routeButtons(listButtonRouters(templateCode)) .build(); return router.isValid() ? Optional.of(router) : Optional.empty(); } @@ -75,8 +75,8 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe // 更新的逻辑为删除旧的重新创建 remove(router.fetchTemplateCode().orElse(null)); } - saveDetailRouter(router.getDetailRouter()); - batchSaveButtonRouter(router.getBtnRouters()); + saveDetailRouter(router.getRouteDetail()); + batchSaveButtonRouter(router.getRouteButtons()); } @Override @@ -86,41 +86,41 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe return Collections.emptyMap(); } Set distinctTemplateCodes = Sets.newHashSet(templateCodes); - Map detailRouters = listDetailRoutersGroupingByTemplateCode(distinctTemplateCodes); - Map> buttonRouters = listButtonRoutersGroupingByTemplateCode(distinctTemplateCodes); + Map detailRouters = listDetailRoutersGroupingByTemplateCode(distinctTemplateCodes); + Map> buttonRouters = listButtonRoutersGroupingByTemplateCode(distinctTemplateCodes); return distinctTemplateCodes.stream() .filter(e -> detailRouters.containsKey(e) || buttonRouters.containsKey(e)) .collect(Collectors.toMap(Function.identity(), e -> MessageTemplateRouterDTO.builder() - .detailRouter(detailRouters.get(e)) - .btnRouters(buttonRouters.get(e)) + .routeDetail(detailRouters.get(e)) + .routeButtons(buttonRouters.get(e)) .build()) ); } - private MessageDetailRouterDTO queryDetailRouter(String templateCode) { + private MessageRouteDetailDTO queryDetailRouter(String templateCode) { MessageRouteDetail msgRouteDetail = selectRouteDetail(templateCode); if (Objects.isNull(msgRouteDetail)) { return null; } List routerConfigs = listByRouterCode(msgRouteDetail.getTemplateCode()); - return MessageDetailRouterDTO.from(msgRouteDetail, routerConfigs); + return MessageRouteDetailDTO.from(msgRouteDetail, routerConfigs); } - private Map listDetailRoutersGroupingByTemplateCode(Collection templateCodes) { + private Map listDetailRoutersGroupingByTemplateCode(Collection templateCodes) { Map routeDetails = listRouteDetailsGroupingByTemplateCode(templateCodes); if (MapUtil.isEmpty(routeDetails)) { log.info("there is not any route detail. templateCodes:{}", templateCodes); return Collections.emptyMap(); } Map> routerConfigs = groupingByRouterCode(templateCodes); - Map result = Maps.newHashMap(); + Map result = Maps.newHashMap(); routeDetails.entrySet().stream() .filter(e -> routerConfigs.containsKey(e.getKey())) - .forEach(e -> result.put(e.getKey(), MessageDetailRouterDTO.from(e.getValue(), routerConfigs.get(e.getKey())))); + .forEach(e -> result.put(e.getKey(), MessageRouteDetailDTO.from(e.getValue(), routerConfigs.get(e.getKey())))); return result; } - private List listButtonRouters(String templateCode) { + private List listButtonRouters(String templateCode) { List routeButtons = messageRouteButtonDao.lambdaQuery() .eq(MessageRouteButton::getTemplateCode, templateCode) .list(); @@ -131,11 +131,11 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe List btnCodes = routeButtons.stream().map(MessageRouteButton::getBtnCode).collect(Collectors.toList()); Map> btnRouterConfigs = groupingByRouterCode(btnCodes); return routeButtons.stream() - .map(e -> MessageButtonRouterDTO.from(e, btnRouterConfigs.get(e.getBtnCode()))) + .map(e -> MessageRouteButtonDTO.from(e, btnRouterConfigs.get(e.getBtnCode()))) .collect(Collectors.toList()); } - private Map> listButtonRoutersGroupingByTemplateCode( + private Map> listButtonRoutersGroupingByTemplateCode( Collection templateCodes) { List routeButtons = messageRouteButtonDao.lambdaQuery() .in(MessageRouteButton::getTemplateCode, templateCodes) @@ -147,8 +147,8 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe Set btnCodes = routeButtons.stream().map(MessageRouteButton::getBtnCode).collect(Collectors.toSet()); Map> btnRouterConfigs = groupingByRouterCode(btnCodes); return routeButtons.stream() - .map(e -> MessageButtonRouterDTO.from(e, btnRouterConfigs.get(e.getBtnCode()))) - .collect(Collectors.groupingBy(MessageButtonRouterDTO::getTemplateCode)); + .map(e -> MessageRouteButtonDTO.from(e, btnRouterConfigs.get(e.getBtnCode()))) + .collect(Collectors.groupingBy(MessageRouteButtonDTO::getTemplateCode)); } private MessageRouteDetail selectRouteDetail(String templateCode) { @@ -208,7 +208,7 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe .collect(Collectors.groupingBy(MessageRouterConfig::getRouterCode)); } - private void saveDetailRouter(MessageDetailRouterDTO detailRouter) { + private void saveDetailRouter(MessageRouteDetailDTO detailRouter) { if (Objects.isNull(detailRouter)) { log.info("detailRouter is null."); return; @@ -217,13 +217,13 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe messageRouterConfigDao.saveBatch(detailRouter.fetchMessageRouterConfigs()); } - private void batchSaveButtonRouter(List buttonRouters) { + private void batchSaveButtonRouter(List buttonRouters) { if (CollectionUtils.isEmpty(buttonRouters)) { log.info("buttonRouters is empty."); return; } List routeButtonWrappers = buttonRouters.stream() - .filter(MessageButtonRouterDTO::isValid) + .filter(MessageRouteButtonDTO::isValid) .map(e -> MessageRouteButtonWrapper.of(e.fetchMessageRouteButton(), e)) .collect(Collectors.toList()); // 生成自定义按钮的唯一标识和顺序 @@ -296,9 +296,9 @@ public class MessageTemplateRouterServiceImpl implements MessageTemplateRouterSe @AllArgsConstructor private static class MessageRouteButtonWrapper { private MessageRouteButton routeButton; - private MessageButtonRouterDTO buttonRouter; + private MessageRouteButtonDTO buttonRouter; - static MessageRouteButtonWrapper of(MessageRouteButton routeButton, MessageButtonRouterDTO buttonRouter) { + static MessageRouteButtonWrapper of(MessageRouteButton routeButton, MessageRouteButtonDTO buttonRouter) { return new MessageRouteButtonWrapper(routeButton, buttonRouter); } } From 2cae6e9506d04c08aaf5dd0acfd1ffcc2e6bccc0 Mon Sep 17 00:00:00 2001 From: luofu Date: Thu, 9 Nov 2023 10:13:18 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat(REQ-1507):=20=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E6=95=B0=E6=8D=AE=E6=A8=A1=E5=9E=8B=E7=9A=84?= =?UTF-8?q?=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 背景: https://jira.axzo.cn/browse/REQ-1507?goToView=1 修改: 1、消息路由数据模型的重构 影响: 无 --- .../domain/dto/MessageTemplateDTO.java | 7 +- .../domain/dto/MessageTemplateRouterDTO.java | 65 ++++++++++ .../message/domain/dto/PendingMessageDTO.java | 7 +- .../domain/dto/RawMessageRouterDTO.java | 22 ---- .../domain/vo/GeneralMessagePushVO.java | 67 ++++++++--- .../impl/GeneralMessageServiceImpl.java | 16 +-- .../impl/MessageTemplateNewServiceImpl.java | 91 +++++++------- .../impl/PendingMessageNewServiceImpl.java | 26 +--- .../impl/RelationTemplateMapServiceImpl.java | 48 ++++---- .../msg/center/utils/MessageRouterUtil.java | 111 +++++++++++------- .../service/dto/MessageRouterButtonDTO.java | 18 ++- .../service/dto/MessageRouterTerminalDTO.java | 5 + .../service/enums/RouterCategoryEnum.java | 1 - .../response/PendingMessageResponse.java | 2 +- 14 files changed, 289 insertions(+), 197 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateDTO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateDTO.java index cdf59b8b..e411500a 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateDTO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateDTO.java @@ -5,7 +5,6 @@ import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO; import cn.axzo.msg.center.service.enums.MessageCategoryEnum; import cn.axzo.msg.center.service.enums.PushTerminalEnum; import cn.axzo.msg.center.utils.JSONObjectUtil; -import cn.axzo.msg.center.utils.MessageRouterUtil; import com.alibaba.fastjson.JSON; import lombok.AllArgsConstructor; import lombok.Builder; @@ -67,7 +66,7 @@ public class MessageTemplateDTO implements Serializable { /** * 模板路由信息 */ - private List routers; + private MessageTemplateRouterDTO msgTemplateRouter; /** * 推送终端 */ @@ -77,7 +76,7 @@ public class MessageTemplateDTO implements Serializable { */ private String minAppVersion; - public static MessageTemplateDTO from(MessageBaseTemplate baseTemplate, List routers) { + public static MessageTemplateDTO from(MessageBaseTemplate baseTemplate, MessageTemplateRouterDTO msgTemplateRouter) { // 业务详情展示策略 return MessageTemplateDTO.builder() .name(baseTemplate.getName()) @@ -87,7 +86,7 @@ public class MessageTemplateDTO implements Serializable { .msgCardContentItems(JSONObjectUtil.parseArray(baseTemplate.getCardContent(), MessageCardContentItemDTO.class)) .msgCategory(baseTemplate.getMsgCategory()) .icon(baseTemplate.getIcon()) - .routers(MessageRouterUtil.selectRouterButtons(routers)) + .msgTemplateRouter(msgTemplateRouter) .pushTerminals(JSON.parseArray(baseTemplate.getPushTerminal(), PushTerminalEnum.class)) .minAppVersion(baseTemplate.getMinAppVersion()) .build(); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java index 1e20fb7c..1600d115 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/MessageTemplateRouterDTO.java @@ -4,10 +4,15 @@ import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.msg.center.domain.entity.MessageRouteButton; import cn.axzo.msg.center.domain.entity.MessageRouteDetail; import cn.axzo.msg.center.domain.entity.MessageRouterConfig; +import cn.axzo.msg.center.service.dto.BizDetailShowStrategyDTO; +import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO; +import cn.axzo.msg.center.service.dto.MessageRouterTerminalDTO; import cn.axzo.msg.center.service.enums.BizDetailShowStrategyEnum; +import cn.axzo.msg.center.service.enums.ButtonStyleEnum; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; import cn.axzo.msg.center.service.enums.TerminalTypeEnum; +import cn.axzo.msg.center.utils.MessageRouterUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.AllArgsConstructor; @@ -108,6 +113,21 @@ public class MessageTemplateRouterDTO implements Serializable { .build(); } + public static MessageRouteDetailDTO from(BizDetailShowStrategyDTO bizDetailShowStrategy, String templateCode) { + AssertUtil.notNull(bizDetailShowStrategy, "btnRouter can not be null"); + AssertUtil.notEmpty(templateCode, "templateCode can not be empty"); + + List configs = bizDetailShowStrategy.getTerminals().stream() + .map(e -> MessageRouterConfigDTO.builder().url(e.getUrl()).terminalType(e.getTerminalType()).build()) + .collect(Collectors.toList()); + return MessageRouteDetailDTO.builder() + .name("详情") + .templateCode(templateCode) + .showStrategy(bizDetailShowStrategy.getShowStrategy()) + .routerConfigs(configs) + .build(); + } + public MessageRouteDetail fetchMessageRouteDetail() { return MessageRouteDetail.builder() .name(this.name) @@ -123,6 +143,13 @@ public class MessageTemplateRouterDTO implements Serializable { .collect(Collectors.toList()); } + public BizDetailShowStrategyDTO toBizDetailShowStrategyDTO() { + List terminals = this.routerConfigs.stream() + .map(e -> MessageRouterTerminalDTO.builder().terminalType(e.terminalType).url(e.url).build()) + .collect(Collectors.toList()); + return BizDetailShowStrategyDTO.builder().showStrategy(this.showStrategy).terminals(terminals).build(); + } + @Override public String toString() { return JSON.toJSONString(this); @@ -194,6 +221,28 @@ public class MessageTemplateRouterDTO implements Serializable { .build(); } + public static MessageRouteButtonDTO from(MessageRouterButtonDTO btnRouter, String templateCode) { + AssertUtil.notNull(btnRouter, "btnRouter can not be null"); + AssertUtil.notEmpty(templateCode, "templateCode can not be empty"); + + JSONObject style = CollectionUtils.isEmpty(btnRouter.getStyle()) ? null + : JSON.parseObject(JSON.toJSONString(btnRouter.getStyle())); + List routerConfigs = CollectionUtils.isEmpty(btnRouter.getTerminals()) ? null : + btnRouter.getTerminals().stream() + .map(e -> MessageRouterConfigDTO.builder().url(e.getUrl()).terminalType(e.getTerminalType()).build()) + .collect(Collectors.toList()); + return MessageRouteButtonDTO.builder() + .name(btnRouter.getDesc()) + .btnCode(btnRouter.getIdentityCode()) + .templateCode(templateCode) + .source(btnRouter.getSource()) + .category(btnRouter.getCategory()) + .apiUrl(btnRouter.getApiUrl()) + .routerConfigs(routerConfigs) + .style(style) + .build(); + } + public MessageRouteButton fetchMessageRouteButton() { return MessageRouteButton.builder() .name(this.name) @@ -220,6 +269,22 @@ public class MessageTemplateRouterDTO implements Serializable { return CollectionUtils.isNotEmpty(routerConfigs); } + public MessageRouterButtonDTO toMessageRouterButton() { + List terminals = CollectionUtils.isEmpty(this.routerConfigs) ? + Collections.emptyList() : this.routerConfigs.stream() + .map(e -> MessageRouterTerminalDTO.builder().terminalType(e.terminalType).url(e.url).build()) + .collect(Collectors.toList()); + return MessageRouterButtonDTO.builder() + .desc(this.name) + .category(this.category) + .identityCode(this.btnCode) + .source(this.source) + .style(MessageRouterUtil.parseButtonStyle(this.style)) + .apiUrl(this.apiUrl) + .terminals(terminals) + .build(); + } + @Override public String toString() { return JSON.toJSONString(this); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/PendingMessageDTO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/PendingMessageDTO.java index cc0e4727..ef75b6a6 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/PendingMessageDTO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/PendingMessageDTO.java @@ -2,7 +2,6 @@ package cn.axzo.msg.center.message.domain.dto; import cn.axzo.msg.center.domain.entity.PendingMessageRecord; import cn.axzo.msg.center.service.dto.IdentityDTO; -import cn.axzo.msg.center.service.dto.MessageRouterDTO; import cn.axzo.msg.center.service.dto.PersonDTO; import cn.axzo.msg.center.service.enums.BizCategoryEnum; import cn.axzo.msg.center.service.pending.response.PendingMessageResponse; @@ -16,7 +15,6 @@ import lombok.Setter; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.List; import java.util.Optional; /** @@ -86,7 +84,7 @@ public class PendingMessageDTO implements Serializable { /** * 路由信息,可为空 */ - private List routers; + private MessageTemplateRouterDTO msgTemplateRouter; /** * 参数及其对应的值的JSON串 */ @@ -141,7 +139,8 @@ public class PendingMessageDTO implements Serializable { .bizCategory(this.bizCategory) .createTimestamp(DateFormatUtil.toTimestamp(this.createTime)) .updateTimestamp(DateFormatUtil.toTimestamp(this.updateTime)) - .routers(this.routers) + // TODO:[cold_blade] [P0] +// .routers(this.routers) .routerParams(this.routerParams) .bizExtParams("{}") .build(); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/RawMessageRouterDTO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/RawMessageRouterDTO.java index 0b9bf193..78f5cd37 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/RawMessageRouterDTO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/RawMessageRouterDTO.java @@ -60,28 +60,6 @@ public class RawMessageRouterDTO implements Serializable { */ private List style; - public static RawMessageRouterDTO from(List msgTemplateRouters) { - MessageTemplateRouter router = msgTemplateRouters.get(0); - List terminals = msgTemplateRouters.stream() - .map(RawMessageRouterDTO::convert2Terminal) - .collect(Collectors.toList()); - return RawMessageRouterDTO.builder() - .desc(router.getName()) - .category(router.getCategory()) - .templateCode(router.getTemplateCode()) - .style(MessageRouterUtil.parseButtonStyle(router.getStyle())) - .terminals(terminals) - .build(); - } - - public static RawMessageRouterDTO from(BizDetailShowStrategyDTO showStrategy, String templateCode) { - return RawMessageRouterDTO.builder() - .desc("业务详情展示策略") - .category(RouterCategoryEnum.DETAIL) - .terminals(showStrategy.getTerminals()) - .templateCode(templateCode) - .build(); - } public static RawMessageRouterDTO from(MessageRouterButtonDTO router, String templateCode) { return RawMessageRouterDTO.builder() diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java index 5216d5b6..c5e74bf3 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java @@ -1,9 +1,11 @@ package cn.axzo.msg.center.message.domain.vo; import cn.axzo.msg.center.domain.entity.GeneralMessageRecord; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO; import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO; -import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO; +import cn.axzo.msg.center.service.enums.ButtonStyleEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; +import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists; import lombok.AllArgsConstructor; @@ -17,6 +19,7 @@ import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -80,19 +83,10 @@ public class GeneralMessagePushVO implements Serializable { private Long sendTimestamp; public static GeneralMessagePushVO from(GeneralMessageRecord record, String templateIcon, String orgIcon, - List routerButtons, + MessageTemplateRouterDTO msgTemplateRouter, List cardContentItems) { - CardButton cardDetailButton = CollectionUtils.isEmpty(routerButtons) ? null : routerButtons.stream() - .filter(e -> RouterCategoryEnum.DETAIL.equals(e.getCategory())) - .findFirst() - .map(CardButton::from) - .orElse(null); - List cardButtons = CollectionUtils.isEmpty(routerButtons) ? Collections.emptyList() : - routerButtons.stream() - .filter(e -> !RouterCategoryEnum.DETAIL.equals(e.getCategory())) - .filter(MessageRouterButtonDTO::isShowOnCard) - .map(CardButton::from) - .collect(Collectors.toList()); + CardButton cardDetailButton = parseDetailButton(msgTemplateRouter); + List cardButtons = parseCardButtons(msgTemplateRouter); List cardExtension = CollectionUtils.isEmpty(cardContentItems) ? Collections.emptyList() : cardContentItems.stream() .map(CardExtensionItem::from) @@ -117,6 +111,23 @@ public class GeneralMessagePushVO implements Serializable { .build(); } + private static CardButton parseDetailButton(MessageTemplateRouterDTO msgTemplateRouter) { + if (Objects.isNull(msgTemplateRouter) || Objects.isNull(msgTemplateRouter.getRouteDetail())) { + return null; + } + return CardButton.from(msgTemplateRouter.getRouteDetail()); + } + + private static List parseCardButtons(MessageTemplateRouterDTO msgTemplateRouter) { + if (Objects.isNull(msgTemplateRouter) + || CollectionUtils.isEmpty(msgTemplateRouter.getRouteButtons())) { + return Collections.emptyList(); + } + return msgTemplateRouter.getRouteButtons().stream() + .map(CardButton::from) + .collect(Collectors.toList()); + } + @Override public String toString() { return JSON.toJSONString(this); @@ -178,12 +189,34 @@ public class GeneralMessagePushVO implements Serializable { */ private List actionPaths; - static CardButton from(MessageRouterButtonDTO routerButton) { + static CardButton from(MessageTemplateRouterDTO.MessageRouteDetailDTO routeDetail) { return CardButton.builder() - .title(routerButton.getDesc()) + .title(routeDetail.getName()) + .action(RouterCategoryEnum.JUMP.name()) + .isHighlight(false) + .actionPaths(routeDetail.getRouterConfigs().stream() + .map(e -> new ButtonAction(e.getTerminalType().name(), e.getUrl())) + .collect(Collectors.toList()) + ).build(); + } + + static CardButton from(MessageTemplateRouterDTO.MessageRouteButtonDTO routerButton) { + List buttonStyles = Objects.isNull(routerButton.getStyle()) ? Collections.emptyList() : + JSON.parseArray(routerButton.getStyle().toJSONString(), ButtonStyleEnum.class); + if (RouterCategoryEnum.ACTION.equals(routerButton.getCategory())) { + return CardButton.builder() + .title(routerButton.getName()) + .action(routerButton.getCategory().name()) + .isHighlight(buttonStyles.stream().allMatch(ButtonStyleEnum.HIGH_LIGHT::equals)) + .actionPaths(Lists.newArrayList( + new ButtonAction(TerminalTypeEnum.WEB_VIEW.name(), routerButton.getApiUrl()))) + .build(); + } + return CardButton.builder() + .title(routerButton.getName()) .action(routerButton.getCategory().name()) - .isHighlight(routerButton.isHighlight()) - .actionPaths(routerButton.getTerminals().stream() + .isHighlight(buttonStyles.stream().allMatch(ButtonStyleEnum.HIGH_LIGHT::equals)) + .actionPaths(routerButton.getRouterConfigs().stream() .map(e -> new ButtonAction(e.getTerminalType().name(), e.getUrl())) .collect(Collectors.toList()) ).build(); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/GeneralMessageServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/GeneralMessageServiceImpl.java index 0ab4e86a..aa76d4bb 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/GeneralMessageServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/GeneralMessageServiceImpl.java @@ -14,7 +14,7 @@ import cn.axzo.msg.center.domain.entity.GeneralMessageRecord; import cn.axzo.msg.center.domain.enums.UserTypeEnum; import cn.axzo.msg.center.inside.notices.config.MessageSystemConfig; 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.dto.MessageTemplateRouterDTO; import cn.axzo.msg.center.message.domain.dto.SendImMessageDTO; import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO; import cn.axzo.msg.center.message.service.GeneralMessageOldService; @@ -23,7 +23,6 @@ import cn.axzo.msg.center.message.service.MessageSendTwiceRecordService; import cn.axzo.msg.center.message.service.MessageTemplateNewService; import cn.axzo.msg.center.service.dto.IdentityDTO; import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO; -import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO; import cn.axzo.msg.center.service.dto.PersonDTO; import cn.axzo.msg.center.service.enums.GeneralMessageStateEnum; import cn.axzo.msg.center.service.enums.IdentityTypeEnum; @@ -181,15 +180,9 @@ public class GeneralMessageServiceImpl implements GeneralMessageService { private GeneralMessagePushVO convert(GeneralMessageRecord record, MessageTemplateDTO template) { // 对应模板的路由列表 - List rawRouters = template.getRouters(); + MessageTemplateRouterDTO msgTemplateRouter = template.getMsgTemplateRouter(); // 解析路由地址 - List routers = rawRouters.stream() - .map(e -> MessageRouterUtil.parseAndConcatRouteUrl(e, record.getRouterParams())) - .collect(Collectors.toList()); - // 转化成客户端展示的数据模型 - List routerButtons = routers.stream() - .map(RawMessageRouterDTO::toMessageRouterButton) - .collect(Collectors.toList()); + msgTemplateRouter = MessageRouterUtil.parseAndConcatRouteUrl(msgTemplateRouter, record.getRouterParams()); // 获取模板卡片信息 List rawCardContentItems = template.getMsgCardContentItems(); List cardContentItems = rawCardContentItems; @@ -205,7 +198,8 @@ public class GeneralMessageServiceImpl implements GeneralMessageService { e.setValue(value); }); } - return GeneralMessagePushVO.from(record, template.getIcon(), messageSystemConfig.getOrgIcon(), routerButtons, cardContentItems); + return GeneralMessagePushVO + .from(record, template.getIcon(), messageSystemConfig.getOrgIcon(), msgTemplateRouter, cardContentItems); } private String parseString(String string, JSONObject params) { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateNewServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateNewServiceImpl.java index 1eb7a425..62104bfe 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateNewServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateNewServiceImpl.java @@ -9,18 +9,17 @@ import cn.axzo.msg.center.dal.MessageBaseTemplateDao; import cn.axzo.msg.center.domain.entity.MessageBaseTemplate; import cn.axzo.msg.center.message.domain.dto.GroupTreeNodePathDTO; 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.dto.MessageTemplateRouterDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteButtonDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteDetailDTO; import cn.axzo.msg.center.message.domain.param.MessageTemplateSaveOrUpdateParam; 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.dto.BizDetailShowStrategyDTO; import cn.axzo.msg.center.service.dto.MessageBaseTemplateDTO; import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO; -import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO; import cn.axzo.msg.center.service.enums.PushTerminalEnum; -import cn.axzo.msg.center.service.enums.RouterCategoryEnum; import cn.axzo.msg.center.service.enums.StatusEnum; import cn.axzo.msg.center.service.template.request.MessageTemplatePageRequest; import cn.axzo.msg.center.service.template.response.MessageTemplateDetailResponse; @@ -75,6 +74,7 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService @Override @Transactional(rollbackFor = Exception.class) public String createTemplate(MessageTemplateSaveOrUpdateParam param) { + // 参数检测 TODO:[cold_blade] [P0] // 创建模板基础数据 String templateCode = saveTemplate(param); // 创建模板的路由数据 @@ -111,9 +111,10 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService // 获取模板关联分类的path列表 List groupNodePaths = messageTemplateGroupService.listMessageTemplateGroupPaths( Lists.newArrayList(templateCode)).getOrDefault(templateCode, Collections.emptyList()); - // TODO: [cold_blade] P0 -// List routers = messageTemplateRouterService.queryByTemplateCode(templateCode); - return convert(baseTemplate, groupNodePaths, Collections.emptyList()); + // 获取模板配置的路由信息 + MessageTemplateRouterDTO msgTemplateRouter = messageTemplateRouterService.queryByTemplateCode(templateCode) + .orElse(null); + return convert(baseTemplate, groupNodePaths, msgTemplateRouter); } @Override @@ -144,9 +145,10 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService log.info("not find the [{}] template.", msgTemplateCode); return Optional.empty(); } - // TODO: [cold_blade] P0 -// List routers = messageTemplateRouterService.queryByTemplateCode(msgTemplateCode); - return Optional.of(MessageTemplateDTO.from(msgBaseTemplate, Collections.emptyList())); + // 获取模板的路由配置信息 + MessageTemplateRouterDTO msgTemplateRouter = messageTemplateRouterService.queryByTemplateCode(msgTemplateCode) + .orElse(null); + return Optional.of(MessageTemplateDTO.from(msgBaseTemplate, msgTemplateRouter)); } @Override @@ -163,12 +165,10 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService log.info("not find the [{}] templates.", msgTemplateCodes); return Collections.emptyList(); } - // TODO: [cold_blade] P0 -// Map> templateRouterMap = messageTemplateRouterService -// .groupByTemplateCode(msgTemplateCodes); - Map> templateRouterMap = Collections.emptyMap(); + Map templateRouterMap = messageTemplateRouterService + .groupByTemplateCode(msgTemplateCodes); return msgBaseTemplates.stream() - .map(e -> MessageTemplateDTO.from(e, templateRouterMap.getOrDefault(e.getCode(), Collections.emptyList()))) + .map(e -> MessageTemplateDTO.from(e, templateRouterMap.get(e.getCode()))) .collect(Collectors.toList()); } @@ -284,20 +284,11 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService } private void saveTemplateRouters(MessageTemplateSaveOrUpdateParam param, String templateCode) { - List routers = Lists.newArrayList(); - if (Objects.nonNull(param.getBizDetailShowStrategy()) - && CollectionUtils.isNotEmpty(param.getBizDetailShowStrategy().getTerminals())) { - routers.add(RawMessageRouterDTO.from(param.getBizDetailShowStrategy(), templateCode)); + MessageTemplateRouterDTO templateRouter = buildTemplateRouter(param, templateCode); + if (templateRouter.isValid()) { + // 模板配置了路由的场景 + messageTemplateRouterService.saveOrUpdate(templateRouter, false); } - // TODO: [cold_blade] P0 路由按钮需要解析并新增按钮标识 - if (CollectionUtils.isNotEmpty(param.getRouters())) { - List btnRouters = param.getRouters().stream() - .map(e -> RawMessageRouterDTO.from(e, templateCode)) - .collect(Collectors.toList()); - routers.addAll(btnRouters); - } - // TODO: [cold_blade] P0 -// messageTemplateRouterService.batchInsert(routers); } private void updateBaseTemplate(MessageTemplateSaveOrUpdateParam param) { @@ -327,22 +318,11 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService } private void updateTemplateRouters(MessageTemplateSaveOrUpdateParam param) { - // TODO: [cold_blade] P0 路由按钮需要解析并新增按钮标识 - List routers = Lists.newArrayList(); - if (Objects.nonNull(param.getBizDetailShowStrategy()) - && CollectionUtils.isNotEmpty(param.getBizDetailShowStrategy().getTerminals())) { - MessageRouterButtonDTO btn = MessageRouterButtonDTO.builder() - .desc(RouterCategoryEnum.DETAIL.getDesc()) - .category(RouterCategoryEnum.DETAIL) - .terminals(param.getBizDetailShowStrategy().getTerminals()) - .build(); - routers.add(btn); + MessageTemplateRouterDTO templateRouter = buildTemplateRouter(param, param.getTemplateCode()); + if (templateRouter.isValid()) { + // 模板修改了路由的场景 + messageTemplateRouterService.saveOrUpdate(templateRouter, true); } - if (CollectionUtils.isNotEmpty(param.getRouters())) { - routers.addAll(param.getRouters()); - } - // TODO: [cold_blade] P0 -// messageTemplateRouterService.updateTemplateRoutes(param.getTemplateCode(), routers); } private IPage pageQueryBaseTemplate(MessageTemplatePageRequest request) { @@ -407,13 +387,11 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService } private MessageTemplateDetailResponse convert(MessageBaseTemplate record, List groupNodePaths, - List routers) { + MessageTemplateRouterDTO msgTemplateRouter) { // 将path解析中解析出分类结点(路径叶结点)的编码 List groupNodeCodes = groupNodePaths.stream() .map(GroupTreeNodePathDTO::parseLeafNodeCode) .collect(Collectors.toList()); - // 按钮路由策略 - List msgRouterButtons = MessageRouterUtil.selectAndConvertRouterButtons(routers); return MessageTemplateDetailResponse.builder() .templateName(record.getName()) .category(MessageTemplateCategoryUtil.parentCategory(record.getMsgCategory())) @@ -424,12 +402,27 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService .msgContent(record.getContent()) .cardContentItems(JSONObjectUtil.parseArray(record.getCardContent(), MessageCardContentItemDTO.class)) .msgIcon(record.getIcon()) - .routers(msgRouterButtons) - // TODO: [cold_blade] P0 - .detailStrategy(null) + .detailStrategy(MessageRouterUtil.fetchBizDetailShowStrategy(msgTemplateRouter).orElse(null)) + .routers(MessageRouterUtil.fetchMessageRouterButtons(msgTemplateRouter)) .minAppVersion(record.getMinAppVersion()) .createTimestamp(record.getCreateAt().getTime()) .updateTimestamp(record.getUpdateAt().getTime()) .build(); } + + private MessageTemplateRouterDTO buildTemplateRouter(MessageTemplateSaveOrUpdateParam param, String templateCode) { + MessageTemplateRouterDTO templateRouter = MessageTemplateRouterDTO.builder().build(); + if (Objects.nonNull(param.getBizDetailShowStrategy()) + && CollectionUtils.isNotEmpty(param.getBizDetailShowStrategy().getTerminals())) { + MessageRouteDetailDTO detailRouter = MessageRouteDetailDTO.from(param.getBizDetailShowStrategy(), templateCode); + templateRouter.setRouteDetail(detailRouter); + } + if (CollectionUtils.isNotEmpty(param.getRouters())) { + List btnRouters = param.getRouters().stream() + .map(e -> MessageRouteButtonDTO.from(e, templateCode)) + .collect(Collectors.toList()); + templateRouter.setRouteButtons(btnRouters); + } + return templateRouter; + } } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/PendingMessageNewServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/PendingMessageNewServiceImpl.java index 7253c6b6..7878e114 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/PendingMessageNewServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/PendingMessageNewServiceImpl.java @@ -7,8 +7,8 @@ import cn.axzo.msg.center.dal.PendingMessageRecordDao; import cn.axzo.msg.center.domain.entity.PendingMessageRecord; import cn.axzo.msg.center.message.domain.dto.MessageGroupNodeStatisticDTO; import cn.axzo.msg.center.message.domain.dto.MessageTemplateDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO; import cn.axzo.msg.center.message.domain.dto.PendingMessageDTO; -import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO; import cn.axzo.msg.center.message.domain.param.MessageGroupNodeStatisticParam; import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam; import cn.axzo.msg.center.message.service.MessageGroupNodeService; @@ -17,7 +17,6 @@ import cn.axzo.msg.center.message.service.MessageTemplateNewService; import cn.axzo.msg.center.message.service.PendingMessageNewService; import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO; import cn.axzo.msg.center.service.dto.IdentityDTO; -import cn.axzo.msg.center.service.dto.MessageRouterDTO; import cn.axzo.msg.center.service.dto.PersonDTO; import cn.axzo.msg.center.service.dto.QueryOrderByDTO; import cn.axzo.msg.center.service.enums.IdentityTypeEnum; @@ -28,7 +27,6 @@ import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest; import cn.axzo.msg.center.service.pending.response.PendingMessageResponse; import cn.axzo.msg.center.utils.JSONObjectUtil; -import cn.axzo.msg.center.utils.MessageRouterUtil; import cn.axzo.msg.center.utils.OrderFieldParseUtil; import cn.axzo.msg.center.utils.TreeHelperUtil; import cn.axzo.msg.center.utils.UUIDUtil; @@ -46,7 +44,6 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.util.Collection; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Objects; @@ -167,20 +164,12 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService { List messageTemplates) { PendingMessageDTO pendingMessage = PendingMessageDTO.from(pendingMessageRecord); // 对应模板的路由列表 - List rawRouters = messageTemplates.stream() + MessageTemplateRouterDTO msgTemplateRouter = messageTemplates.stream() .filter(e -> Objects.equals(e.getCode(), pendingMessageRecord.getTemplateCode())) .findFirst() - .map(MessageTemplateDTO::getRouters) - .orElseGet(Collections::emptyList); - List routers = rawRouters.stream() - .map(e -> { - MessageRouterDTO router = e.toMessageRouter(terminalType); - // 视情况替换原始URL中的参数变量 - MessageRouterUtil.parseRouteUrl(router, pendingMessageRecord.getRouterParams()); - return router; - }) - .collect(Collectors.toList()); - pendingMessage.setRouters(routers); + .map(MessageTemplateDTO::getMsgTemplateRouter) + .orElse(null); + pendingMessage.setMsgTemplateRouter(msgTemplateRouter); // 获取模板卡片信息 String cardContent = messageTemplates.stream() .filter(e -> Objects.equals(e.getCode(), pendingMessageRecord.getTemplateCode())) @@ -316,9 +305,4 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService { record.setBizCategory(param.getBizCategory()); record.setBizExtParam(JSONObjectUtil.checkAndReturn(param.getBizExtParams())); } - - private static class GroupTreeNodeWrapper { - private GroupTreeNodeDTO treeNode; - private int pendingCnt; - } } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/RelationTemplateMapServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/RelationTemplateMapServiceImpl.java index 874ebcac..1ba96fa1 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/RelationTemplateMapServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/RelationTemplateMapServiceImpl.java @@ -12,19 +12,19 @@ import cn.axzo.msg.center.domain.entity.RelationTemplateMap; import cn.axzo.msg.center.inside.notices.service.MessageRelationService; import cn.axzo.msg.center.inside.notices.service.MessageRouterService; import cn.axzo.msg.center.inside.notices.service.MessageTemplateService; -import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteDetailDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouterConfigDTO; import cn.axzo.msg.center.message.domain.param.RelationTemplateMapInitParam; import cn.axzo.msg.center.message.service.MessageTemplateGroupService; import cn.axzo.msg.center.message.service.MessageTemplateRouterService; import cn.axzo.msg.center.message.service.RelationTemplateMapService; -import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO; -import cn.axzo.msg.center.service.dto.MessageRouterTerminalDTO; -import cn.axzo.msg.center.service.enums.ButtonStyleEnum; +import cn.axzo.msg.center.service.enums.BizDetailShowStrategyEnum; import cn.axzo.msg.center.service.enums.MessageCategoryEnum; import cn.axzo.msg.center.service.enums.PushTerminalEnum; -import cn.axzo.msg.center.service.enums.RouterCategoryEnum; import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import cn.axzo.msg.center.utils.JSONObjectUtil; +import cn.axzo.msg.center.utils.MessageRouterUtil; import cn.axzo.msg.center.utils.UUIDUtil; import com.google.common.collect.Lists; import lombok.AllArgsConstructor; @@ -171,12 +171,28 @@ public class RelationTemplateMapServiceImpl implements RelationTemplateMapServic .relationId(relationId) .build(); if (CollectionUtils.isNotEmpty(routers)) { - wrapper.setRouters(Lists.newArrayList( - RawMessageRouterDTO.from(convert(routers), baseTemplate.getCode()))); + wrapper.setMsgTemplateRouter(convert2MessageTemplateRouter(routers, baseTemplate.getCode())); } return wrapper; } + private MessageTemplateRouterDTO convert2MessageTemplateRouter(List routers, String templateCode) { + List routerConfigs = routers.stream() + .map(e -> MessageRouterConfigDTO.builder() + .routerCode(templateCode) + .terminalType(TerminalTypeEnum.codeOf(e.getRouterType().getCode())) + .url(e.getRouterUrl()) + .build()) + .collect(Collectors.toList()); + MessageRouteDetailDTO detailRouter = MessageRouteDetailDTO.builder() + .name(MessageRouterUtil.DETAIL_ROUTER_DESC) + .templateCode(templateCode) + .showStrategy(BizDetailShowStrategyEnum.JUMP_TO) + .routerConfigs(routerConfigs) + .build(); + return MessageTemplateRouterDTO.builder().routeDetail(detailRouter).build(); + } + private MessageBaseTemplate convert(MessageTemplate srcTemplate) { MessageBaseTemplate template = new MessageBaseTemplate(); template.setCode(UUIDUtil.uuidString()); @@ -191,22 +207,6 @@ public class RelationTemplateMapServiceImpl implements RelationTemplateMapServic return template; } - private MessageRouterButtonDTO convert(List routers) { - return MessageRouterButtonDTO.builder() - .style(Lists.newArrayList(ButtonStyleEnum.values())) - .desc("查看详情") - .category(RouterCategoryEnum.DETAIL) - .terminals(routers.stream().map(this::convert).collect(Collectors.toList())) - .build(); - } - - private MessageRouterTerminalDTO convert(MessageRouter router) { - return MessageRouterTerminalDTO.builder() - .url(router.getRouterUrl()) - .terminalType(TerminalTypeEnum.codeOf(router.getRouterType().getCode())) - .build(); - } - private Set getAllOriginalRelationIds() { return relationTemplateMapDao.lambdaQuery() .select(RelationTemplateMap::getOriginalRelationId) @@ -221,6 +221,6 @@ public class RelationTemplateMapServiceImpl implements RelationTemplateMapServic private static class CreateNewTemplateAndMapWrapper { private Long relationId; private MessageBaseTemplate baseTemplate; - private List routers; + private MessageTemplateRouterDTO msgTemplateRouter; } } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/utils/MessageRouterUtil.java b/inside-notices/src/main/java/cn/axzo/msg/center/utils/MessageRouterUtil.java index cdc88d3c..8e79be51 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/utils/MessageRouterUtil.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/utils/MessageRouterUtil.java @@ -1,12 +1,15 @@ package cn.axzo.msg.center.utils; +import cn.axzo.msg.center.common.utils.BeanConvertUtils; import cn.axzo.msg.center.common.utils.PlaceholderResolver; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteButtonDTO; +import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO.MessageRouteDetailDTO; import cn.axzo.msg.center.message.domain.dto.RawMessageRouterDTO; import cn.axzo.msg.center.service.dto.BizDetailShowStrategyDTO; import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO; import cn.axzo.msg.center.service.dto.MessageRouterDTO; import cn.axzo.msg.center.service.dto.MessageRouterTerminalDTO; -import cn.axzo.msg.center.service.enums.BizDetailShowStrategyEnum; import cn.axzo.msg.center.service.enums.ButtonStyleEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; import cn.axzo.msg.center.service.enums.TerminalTypeEnum; @@ -14,6 +17,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.util.Collections; @@ -21,6 +25,8 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; /** @@ -34,52 +40,54 @@ import java.util.stream.Collectors; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class MessageRouterUtil { + public static final String DETAIL_ROUTER_DESC = "查看详情"; + // 非法路由参数的定义 private static final String INVALID_ROUTER_PARAM = "null"; /** - * 获取业务展示详情策略 + * 获取业务详情路由策略 * - * @param showStrategy 展示策略 - * @param routers 路由列表 + * @param msgTemplateRouter 模板路由配置 * @return 业务展示详情策略 */ - public static Optional selectAndConvertBizDetailShowStrategy( - BizDetailShowStrategyEnum showStrategy, List routers) { - return routers.stream() - // 过滤掉非页面详情相关的路由 - .filter(e -> RouterCategoryEnum.DETAIL.equals(e.getCategory())) - .map(e -> BizDetailShowStrategyDTO.builder() - .terminals(e.getTerminals()) - // 兼容老数据,默认为跳转业务详情 - .showStrategy(Objects.nonNull(showStrategy) ? showStrategy : BizDetailShowStrategyEnum.JUMP_TO) - .build()) - .findFirst(); + public static Optional fetchBizDetailShowStrategy(MessageTemplateRouterDTO msgTemplateRouter) { + if (Objects.isNull(msgTemplateRouter)) { + return Optional.empty(); + } + return Optional.ofNullable(msgTemplateRouter.getRouteDetail()) + .map(MessageRouteDetailDTO::toBizDetailShowStrategyDTO); } /** * 获取业务按钮路由策略 * - * @param routers 路由列表 - * @return 业务展示详情策略 + * @param msgTemplateRouter 模板路由配置 + * @return 业务按钮路由策略 */ - public static List selectAndConvertRouterButtons(List routers) { - return selectRouterButtons(routers).stream() - .map(RawMessageRouterDTO::toMessageRouterButton) + public static List fetchMessageRouterButtons(MessageTemplateRouterDTO msgTemplateRouter) { + if (Objects.isNull(msgTemplateRouter)) { + return Collections.emptyList(); + } + if (CollectionUtils.isEmpty(msgTemplateRouter.getRouteButtons())) { + return Collections.emptyList(); + } + return msgTemplateRouter.getRouteButtons().stream() + .map(MessageRouteButtonDTO::toMessageRouterButton) .collect(Collectors.toList()); } /** - * 获取业务按钮路由策略 + * 解析按钮风格的存储模型 * - * @param routers 路由列表 - * @return 业务展示详情策略 + * @param styleObj 按钮style对象 + * @return 按钮style列表 */ - public static List selectRouterButtons(List routers) { - return routers.stream() - // 过滤掉页面详情相关的路由 - .filter(e -> !RouterCategoryEnum.DETAIL.equals(e.getCategory())) - .collect(Collectors.toList()); + public static List parseButtonStyle(JSONObject styleObj) { + if (Objects.isNull(styleObj)) { + return Collections.emptyList(); + } + return JSON.parseArray(styleObj.toJSONString(), ButtonStyleEnum.class); } /** @@ -130,24 +138,45 @@ public final class MessageRouterUtil { /** * 解析模板上配置的路由地址,将发送消息时的参数替换上去,并将路由参数追加到模板的路由地址后面,兼容APP端新老版本 * - * @param router 路由信息 + * @param msgTemplateRouter 路由信息 * @param routerParam 路由参数 - * @return RawMessageRouterDTO + * @return MessageTemplateRouterDTO */ - public static RawMessageRouterDTO parseAndConcatRouteUrl(RawMessageRouterDTO router, JSONObject routerParam) { + public static MessageTemplateRouterDTO parseAndConcatRouteUrl(MessageTemplateRouterDTO msgTemplateRouter, JSONObject routerParam) { // 路由参数有效 - if (Objects.nonNull(routerParam) && !routerParam.isEmpty()) { + if (Objects.nonNull(routerParam) && Objects.nonNull(msgTemplateRouter)) { // 拷贝一份,避免修改入参 - router = router.deepClone(); - router.getTerminals().forEach(e -> { - // 替换原始URL中的参数变量 - String routerUrl = PlaceholderResolver.getDefaultResolver().resolveByMap(e.getUrl(), routerParam); - // 将routerParam追加到原始的URL后面 - routerUrl = concatRouterParam(routerUrl, routerParam); - e.setUrl(routerUrl); - }); + msgTemplateRouter = BeanConvertUtils.copyBean(msgTemplateRouter, MessageTemplateRouterDTO.class); + if (Objects.nonNull(msgTemplateRouter.getRouteDetail())) { + // 编排业务详情路由 + msgTemplateRouter.getRouteDetail().getRouterConfigs() + .forEach(e -> concatRouterParam(e::getUrl, e::setUrl, routerParam)); + } + if (CollectionUtils.isNotEmpty(msgTemplateRouter.getRouteButtons())) { + // 编排路由按钮 + msgTemplateRouter.getRouteButtons().forEach(e -> { + if (StringUtils.isNotBlank(e.getApiUrl())) { + // API调用类型的按钮 + concatRouterParam(e::getApiUrl, e::setApiUrl, routerParam); + } + if (CollectionUtils.isNotEmpty(e.getRouterConfigs())) { + // 页面跳转类型的按钮 + e.getRouterConfigs() + .forEach(config -> concatRouterParam(config::getUrl, config::setUrl, routerParam)); + } + }); + } } - return router; + return msgTemplateRouter; + } + + private static void concatRouterParam(Supplier getUrlSupplier, Consumer setUrlConsumer, + JSONObject routerParam) { + // 替换原始URL中的参数变量 + String routerUrl = PlaceholderResolver.getDefaultResolver().resolveByMap(getUrlSupplier.get(), routerParam); + // 将routerParam追加到原始的URL后面 + routerUrl = concatRouterParam(routerUrl, routerParam); + setUrlConsumer.accept(routerUrl); } private static String concatRouterParam(String originalUrl, JSONObject routerParam) { diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/MessageRouterButtonDTO.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/MessageRouterButtonDTO.java index 21c00016..9a9bda2f 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/MessageRouterButtonDTO.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/MessageRouterButtonDTO.java @@ -13,6 +13,7 @@ import org.apache.commons.collections.CollectionUtils; import java.io.Serializable; import java.util.List; +import java.util.Optional; /** * @description @@ -42,7 +43,6 @@ public class MessageRouterButtonDTO implements Serializable { * 路由分类 * JUMP: 直接跳转 * ACTION: 接口调用 - * DETAIL: 页面详情 */ private RouterCategoryEnum category; /** @@ -58,9 +58,23 @@ public class MessageRouterButtonDTO implements Serializable { */ private List style; /** - * 路由终端列表,若当前按钮为ACTION,则只能配一个接口地址 + * 路由按钮的跳转url配置 */ private List terminals; + /** + * 当按钮类型为API调用时,该字段有值 + */ + private String apiUrl; + + public boolean isValid() { + if (CollectionUtils.isEmpty(terminals)) { + return false; + } + if (RouterCategoryEnum.ACTION.equals(category) && terminals.size() > 1) { + return false; + } + return terminals.stream().allMatch(MessageRouterTerminalDTO::isValid); + } public boolean isHighlight() { return CollectionUtils.isNotEmpty(style) diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/MessageRouterTerminalDTO.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/MessageRouterTerminalDTO.java index a660b78c..0d829319 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/MessageRouterTerminalDTO.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/MessageRouterTerminalDTO.java @@ -7,6 +7,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; @@ -46,6 +47,10 @@ public class MessageRouterTerminalDTO implements Serializable { .build(); } + public boolean isValid() { + return StringUtils.isNotBlank(url); + } + @Override public String toString() { return JSON.toJSONString(this); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/RouterCategoryEnum.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/RouterCategoryEnum.java index 33e4b405..fcae2ab9 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/RouterCategoryEnum.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/RouterCategoryEnum.java @@ -17,7 +17,6 @@ public enum RouterCategoryEnum { JUMP("直接跳转"), ACTION("接口调用"), - DETAIL("页面详情"), ; private final String desc; diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/PendingMessageResponse.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/PendingMessageResponse.java index a8461f70..55a303e3 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/PendingMessageResponse.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/PendingMessageResponse.java @@ -86,7 +86,7 @@ public class PendingMessageResponse implements Serializable { */ private Long updateTimestamp; /** - * 路由信息,可为空 + * 路由信息,可为空 TODO:[cold_blade] [P0] */ private List routers; /**