Merge branch 'feature/REQ-1507' of axzsource.com:universal/infrastructure/backend/msg-center-plat into dev

This commit is contained in:
luofu 2023-11-06 18:16:57 +08:00
commit 17110f049d
11 changed files with 182 additions and 80 deletions

View File

@ -1,10 +1,12 @@
package cn.axzo.msg.center.message.domain.dto;
import cn.axzo.msg.center.domain.entity.MessageBaseTemplate;
import cn.axzo.msg.center.service.dto.BizDetailShowStrategyDTO;
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;
@ -63,6 +65,10 @@ public class MessageTemplateDTO implements Serializable {
* 模板icon
*/
private String icon;
/**
* 业务详情展示策略
*/
private BizDetailShowStrategyDTO bizDetailShowStrategy;
/**
* 模板路由信息
*/
@ -77,6 +83,9 @@ public class MessageTemplateDTO implements Serializable {
private String minAppVersion;
public static MessageTemplateDTO from(MessageBaseTemplate baseTemplate, List<RawMessageRouterDTO> routers) {
// 业务详情展示策略
BizDetailShowStrategyDTO bizDetailShowStrategy = MessageRouterUtil.selectAndConvertBizDetailShowStrategy(
baseTemplate.getBizDetailShowStrategy(), routers).orElse(null);
return MessageTemplateDTO.builder()
.name(baseTemplate.getName())
.code(baseTemplate.getCode())
@ -84,8 +93,9 @@ public class MessageTemplateDTO implements Serializable {
.content(baseTemplate.getContent())
.msgCardContentItems(JSONObjectUtil.parseArray(baseTemplate.getCardContent(), MessageCardContentItemDTO.class))
.msgCategory(baseTemplate.getMsgCategory())
.bizDetailShowStrategy(bizDetailShowStrategy)
.icon(baseTemplate.getIcon())
.routers(routers)
.routers(MessageRouterUtil.selectRouterButtons(routers))
.pushTerminals(JSON.parseArray(baseTemplate.getPushTerminal(), PushTerminalEnum.class))
.minAppVersion(baseTemplate.getMinAppVersion())
.build();

View File

@ -1,6 +1,7 @@
package cn.axzo.msg.center.message.domain.dto;
import cn.axzo.msg.center.domain.entity.MessageTemplateRouter;
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;
@ -73,6 +74,15 @@ public class RawMessageRouterDTO implements Serializable {
.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()
.desc(router.getDesc())

View File

@ -1,5 +1,6 @@
package cn.axzo.msg.center.message.domain.param;
import cn.axzo.msg.center.service.dto.BizDetailShowStrategyDTO;
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
@ -32,54 +33,63 @@ public class MessageTemplateSaveOrUpdateParam implements Serializable {
private static final long serialVersionUID = 6657624182580261353L;
/**
* 模板名称
*/
private String templateName;
/**
* 模板编码
*/
private String templateCode;
/**
* 消息分类树的叶结点的结点编码列表
*/
private List<String> leafGroupNodes;
/**
* 所属消息类型
* GENERAL_MESSAGE: 普通消息
* PENDING_MESSAGE: 待办消息
*/
private MessageCategoryEnum msgCategory;
/**
* 模板标题
*/
private String title;
/**
* 模板类容
*/
private String content;
/**
* 消息卡片信息标签列表
*/
private List<MessageCardContentItemDTO> msgCardContentItems;
/**
* 模板icon
*/
private String icon;
/**
* 操作者自然人id
* 操作者的自然人id
*/
private Long operatorId;
/**
* 路由列表
* 模板名称
*/
private List<MessageRouterButtonDTO> routers;
private String templateName;
/**
* 消息类型
* GENERAL_MESSAGE: 通知
* BIZ_PENDING_MESSAGE: 业务待办
* APPROVAL_PENDING_MESSAGE: 审批待办
*/
private MessageCategoryEnum msgCategory;
/**
* 消息分类树的叶结点的结点编码列表
*/
private List<String> leafGroupNodes;
/**
* 推送终端配置
* B_ENTERPRISE_APP: B-安心筑企业版
* C_WORKER_APP: C-安心筑工人版
*/
private List<PushTerminalEnum> pushTerminals;
/**
* 该模板最低支持的APP版本号
*/
private String minAppVersion;
/**
* 消息标题
*/
private String title;
/**
* 消息内容
*/
private String content;
/**
* 消息图标
*/
private String icon;
/**
* 消息卡片信息标签列表可为空
*/
private List<MessageCardContentItemDTO> msgCardContentItems;
/**
* 业务详情展示策略
*/
private BizDetailShowStrategyDTO bizDetailShowStrategy;
/**
* 路由策略列表
*/
private List<MessageRouterButtonDTO> routers;
public static MessageTemplateSaveOrUpdateParam from(MessageTemplateCreateRequest request) {
return MessageTemplateSaveOrUpdateParam.builder()
@ -93,6 +103,7 @@ public class MessageTemplateSaveOrUpdateParam implements Serializable {
.operatorId(request.getOperatorId())
.routers(request.getRouters())
.pushTerminals(request.getPushTerminals())
.bizDetailShowStrategy(request.getDetailStrategy())
.build();
}
@ -108,6 +119,7 @@ public class MessageTemplateSaveOrUpdateParam implements Serializable {
.operatorId(request.getOperatorId())
.routers(request.getRouters())
.pushTerminals(request.getPushTerminals())
.bizDetailShowStrategy(request.getDetailStrategy())
.build();
}

View File

@ -15,15 +15,18 @@ 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;
import cn.axzo.msg.center.service.template.response.MessageTemplatePageResponse;
import cn.axzo.msg.center.utils.JSONObjectUtil;
import cn.axzo.msg.center.utils.MessageRouterUtil;
import cn.axzo.msg.center.utils.UUIDUtil;
import cn.azxo.framework.common.model.Page;
import com.alibaba.fastjson.JSON;
@ -315,18 +318,27 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
template.setCardContent(JSONObjectUtil.toJSONString(param.getMsgCardContentItems()));
template.setIcon(param.getIcon());
template.setPushTerminal(JSONObjectUtil.toJSONString(param.getPushTerminals()));
if (Objects.nonNull(param.getBizDetailShowStrategy())) {
template.setBizDetailShowStrategy(param.getBizDetailShowStrategy().getShowStrategy());
}
template.setMinAppVersion(param.getMinAppVersion());
template.setCreatorId(param.getOperatorId());
template.setUpdaterId(param.getOperatorId());
return template;
}
private void saveTemplateRouters(MessageTemplateSaveOrUpdateParam param, String templateCode) {
if (CollectionUtils.isEmpty(param.getRouters())) {
return;
List<RawMessageRouterDTO> routers = Lists.newArrayList();
if (Objects.nonNull(param.getBizDetailShowStrategy())
&& CollectionUtils.isNotEmpty(param.getBizDetailShowStrategy().getTerminals())) {
routers.add(RawMessageRouterDTO.from(param.getBizDetailShowStrategy(), templateCode));
}
if (CollectionUtils.isNotEmpty(param.getRouters())) {
List<RawMessageRouterDTO> btnRouters = param.getRouters().stream()
.map(e -> RawMessageRouterDTO.from(e, templateCode))
.collect(Collectors.toList());
routers.addAll(btnRouters);
}
List<RawMessageRouterDTO> routers = param.getRouters().stream()
.map(e -> RawMessageRouterDTO.from(e, templateCode))
.collect(Collectors.toList());
messageTemplateRouterService.batchInsert(routers);
}
@ -344,6 +356,10 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
JSONObjectUtil.toJSONString(param.getMsgCardContentItems()))
.set(StringUtils.isNotBlank(param.getContent()), MessageBaseTemplate::getContent, param.getContent())
.set(StringUtils.isNotBlank(param.getIcon()), MessageBaseTemplate::getIcon, param.getIcon())
.set(StringUtils.isNotBlank(param.getMinAppVersion()), MessageBaseTemplate::getMinAppVersion,
param.getMinAppVersion())
.set(Objects.nonNull(param.getBizDetailShowStrategy()), MessageBaseTemplate::getBizDetailShowStrategy,
param.getBizDetailShowStrategy().getShowStrategy())
.update();
}
@ -355,10 +371,20 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
}
private void updateTemplateRouters(MessageTemplateSaveOrUpdateParam param) {
if (CollectionUtils.isEmpty(param.getRouters())) {
return;
List<MessageRouterButtonDTO> 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);
}
messageTemplateRouterService.updateTemplateRoutes(param.getTemplateCode(), param.getRouters());
if (CollectionUtils.isNotEmpty(param.getRouters())) {
routers.addAll(param.getRouters());
}
messageTemplateRouterService.updateTemplateRoutes(param.getTemplateCode(), routers);
}
private MessageBaseTemplateDTO convert(MessageBaseTemplate record) {
@ -398,10 +424,11 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
List<String> groupNodeCodes = groupNodePaths.stream()
.map(GroupTreeNodePathDTO::parseLeafNodeCode)
.collect(Collectors.toList());
// 转化为页面相关的数据模型
List<MessageRouterButtonDTO> routerButtons = routers.stream()
.map(RawMessageRouterDTO::toMessageRouterButton)
.collect(Collectors.toList());
// 按钮路由策略
List<MessageRouterButtonDTO> msgRouterButtons = MessageRouterUtil.selectAndConvertRouterButtons(routers);
// 业务详情展示策略
BizDetailShowStrategyDTO bizDetailShowStrategy = MessageRouterUtil.selectAndConvertBizDetailShowStrategy(
record.getBizDetailShowStrategy(), routers).orElse(null);
return MessageTemplateDetailResponse.builder()
.templateName(record.getName())
.category(record.getMsgCategory())
@ -411,7 +438,9 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService
.msgContent(record.getContent())
.cardContentItems(JSONObjectUtil.parseArray(record.getCardContent(), MessageCardContentItemDTO.class))
.msgIcon(record.getIcon())
.routers(routerButtons)
.routers(msgRouterButtons)
.detailStrategy(bizDetailShowStrategy)
.minAppVersion(record.getMinAppVersion())
.createTimestamp(record.getCreateAt().getTime())
.updateTimestamp(record.getUpdateAt().getTime())
.build();

View File

@ -2,8 +2,11 @@ package cn.axzo.msg.center.utils;
import cn.axzo.msg.center.common.utils.PlaceholderResolver;
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;
@ -17,6 +20,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
@ -33,6 +37,51 @@ public final class MessageRouterUtil {
// 非法路由参数的定义
private static final String INVALID_ROUTER_PARAM = "null";
/**
* 获取业务展示详情策略
*
* @param showStrategy 展示策略
* @param routers 路由列表
* @return 业务展示详情策略
*/
public static Optional<BizDetailShowStrategyDTO> selectAndConvertBizDetailShowStrategy(
BizDetailShowStrategyEnum showStrategy, List<RawMessageRouterDTO> 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();
}
/**
* 获取业务按钮路由策略
*
* @param routers 路由列表
* @return 业务展示详情策略
*/
public static List<MessageRouterButtonDTO> selectAndConvertRouterButtons(List<RawMessageRouterDTO> routers) {
return selectRouterButtons(routers).stream()
.map(RawMessageRouterDTO::toMessageRouterButton)
.collect(Collectors.toList());
}
/**
* 获取业务按钮路由策略
*
* @param routers 路由列表
* @return 业务展示详情策略
*/
public static List<RawMessageRouterDTO> selectRouterButtons(List<RawMessageRouterDTO> routers) {
return routers.stream()
// 过滤掉页面详情相关的路由
.filter(e -> !RouterCategoryEnum.DETAIL.equals(e.getCategory()))
.collect(Collectors.toList());
}
/**
* 根据指定的终端类型选取合适的路由
*
@ -46,27 +95,9 @@ public final class MessageRouterUtil {
}
return rawMessageRouter.getTerminals().stream()
.filter(e -> Objects.equals(terminalType, e.getTerminalType()))
// 若没有匹配的默认选择第一个然后由前端去进行最终判断
.findFirst().orElseGet(() -> rawMessageRouter.getTerminals().get(0));
}
/**
* 根据指定的终端类型选取合适的路由
*
* @param rawMessageRouter 原始的模板路由策略
* @param excludeTerminalType 待排除的终端类型
* @return 合适的路由数据
*/
public static List<MessageRouterTerminalDTO> selectWithout(RawMessageRouterDTO rawMessageRouter,
TerminalTypeEnum excludeTerminalType) {
if (RouterCategoryEnum.ACTION.equals(rawMessageRouter.getCategory())) {
// 如果配置路由是API调用这与终端无关
return rawMessageRouter.getTerminals();
}
return rawMessageRouter.getTerminals().stream()
.filter(e -> !Objects.equals(excludeTerminalType, e.getTerminalType()))
// 若没有匹配的默认选择第一个然后由前端去进行最终判断
.collect(Collectors.toList());
.findFirst()
// 优先选择H5没有则选择第一个元素
.orElseGet(() -> selectH5(rawMessageRouter).orElseGet(() -> rawMessageRouter.getTerminals().get(0)));
}
/**
@ -146,4 +177,10 @@ public final class MessageRouterUtil {
}
return JSON.parseArray(style, ButtonStyleEnum.class);
}
private static Optional<MessageRouterTerminalDTO> selectH5(RawMessageRouterDTO rawMessageRouter) {
return rawMessageRouter.getTerminals().stream()
.filter(e -> Objects.equals(TerminalTypeEnum.WEB_VIEW, e.getTerminalType()))
.findFirst();
}
}

View File

@ -21,7 +21,7 @@ import java.util.List;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MessageDetailShowStrategyDTO implements Serializable {
public class BizDetailShowStrategyDTO implements Serializable {
private static final long serialVersionUID = -3496745332397525305L;

View File

@ -16,11 +16,11 @@ import lombok.Getter;
public enum BizDetailShowStrategyEnum {
/**
* 内嵌H5展示
* 内嵌展示
*/
INLINE,
/**
* 跳转至业务详情页展示
* 跳转展示
*/
JUMP_TO;
}

View File

@ -1,7 +1,7 @@
package cn.axzo.msg.center.service.template.request;
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
import cn.axzo.msg.center.service.dto.MessageDetailShowStrategyDTO;
import cn.axzo.msg.center.service.dto.BizDetailShowStrategyDTO;
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
@ -82,7 +82,7 @@ public class MessageTemplateCreateRequest implements Serializable {
/**
* 详情展示策略
*/
private MessageDetailShowStrategyDTO detailStrategy;
private BizDetailShowStrategyDTO detailStrategy;
/**
* 路由策略列表
*/

View File

@ -1,7 +1,7 @@
package cn.axzo.msg.center.service.template.request;
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
import cn.axzo.msg.center.service.dto.MessageDetailShowStrategyDTO;
import cn.axzo.msg.center.service.dto.BizDetailShowStrategyDTO;
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
import com.alibaba.fastjson.JSON;
@ -73,7 +73,7 @@ public class MessageTemplateUpdateRequest implements Serializable {
/**
* 详情展示策略
*/
private MessageDetailShowStrategyDTO detailStrategy;
private BizDetailShowStrategyDTO detailStrategy;
/**
* 路由策略列表
*/

View File

@ -1,7 +1,7 @@
package cn.axzo.msg.center.service.template.response;
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
import cn.axzo.msg.center.service.dto.MessageDetailShowStrategyDTO;
import cn.axzo.msg.center.service.dto.BizDetailShowStrategyDTO;
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.PushTerminalEnum;
@ -12,7 +12,6 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
import java.util.List;
@ -74,7 +73,7 @@ public class MessageTemplateDetailResponse implements Serializable {
/**
* 详情展示策略
*/
private MessageDetailShowStrategyDTO detailStrategy;
private BizDetailShowStrategyDTO detailStrategy;
/**
* 路由策略列表
*/

View File

@ -1,6 +1,7 @@
package cn.axzo.msg.center.domain.entity;
import cn.axzo.msg.center.domain.persistence.BaseEntity;
import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
import cn.axzo.msg.center.service.enums.BizDetailShowStrategyEnum;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.StatusEnum;
import com.alibaba.fastjson.JSON;
@ -20,7 +21,7 @@ import java.io.Serializable;
@Setter
@Getter
@TableName("message_base_template")
public class MessageBaseTemplate extends BaseEntity<MessageBaseTemplate> implements Serializable {
public class MessageBaseTemplate extends BaseEntityExt<MessageBaseTemplate> implements Serializable {
private static final long serialVersionUID = -880409106378455813L;
@ -66,6 +67,10 @@ public class MessageBaseTemplate extends BaseEntity<MessageBaseTemplate> impleme
* APP最小版本支持可不配
*/
private String minAppVersion;
/**
* 业务详情展示策略
*/
private BizDetailShowStrategyEnum bizDetailShowStrategy;
/**
* 创建者自然人id
*/