From f5330a97ba90f78b40ea0525e9857100e6c0f867 Mon Sep 17 00:00:00 2001 From: luofu Date: Mon, 13 Nov 2023 17:33:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(REQ-1507):=20=E5=BE=85=E5=8A=9E=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E6=9F=A5=E8=AF=A2=E5=8F=8A=E7=BB=9F=E8=AE=A1=E7=9A=84?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= 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、待办分页查询及统计的相关接口实现; 影响: 无 --- .../PendingMessageNewController.java | 7 +++ .../domain/dto/GroupTreeNodePathDTO.java | 8 +++- .../domain/dto/MessageTemplateRouterDTO.java | 3 +- .../dto/PendingMessageStatisticDTO.java | 18 ++++--- .../param/MessageGroupNodeStatisticParam.java | 15 ++++++ .../service/MessageGroupNodeService.java | 17 +++++-- .../MessageGroupTreeNodeCacheService.java | 8 ++++ .../service/MessageTemplateGroupService.java | 6 +-- .../service/PendingMessageNewService.java | 16 ++++++- .../impl/MessageGroupNodeServiceImpl.java | 15 +++++- .../MessageGroupTreeNodeCacheServiceImpl.java | 13 ++++- .../impl/MessageTemplateGroupServiceImpl.java | 8 ++-- .../impl/MessageTemplateNewServiceImpl.java | 5 +- .../impl/PendingMessageNewServiceImpl.java | 45 +++++++++++------- .../msg/center/utils/MessageRouterUtil.java | 2 +- .../service/enums/RouterCategoryEnum.java | 2 + .../pending/client/PendingMessageClient.java | 17 ++++++- .../PendingMessageClientFallback.java | 11 ++++- ...PendingMessageCountUncompletedRequest.java | 47 +++++++++++++++++++ 19 files changed, 216 insertions(+), 47 deletions(-) create mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/PendingMessageCountUncompletedRequest.java diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/PendingMessageNewController.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/PendingMessageNewController.java index 314a620e..0256f1dc 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/PendingMessageNewController.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/PendingMessageNewController.java @@ -7,6 +7,7 @@ import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam; import cn.axzo.msg.center.message.service.PendingMessageNewService; import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import cn.axzo.msg.center.service.pending.client.PendingMessageClient; +import cn.axzo.msg.center.service.pending.request.PendingMessageCountUncompletedRequest; import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest; import cn.axzo.msg.center.service.pending.request.PendingMessagePushRequest; import cn.axzo.msg.center.service.pending.request.PendingMessageStatisticRequest; @@ -44,6 +45,12 @@ public class PendingMessageNewController implements PendingMessageClient { ); } + @Override + public CommonResponse countUncompleted(PendingMessageCountUncompletedRequest request) { + Integer count = pendingMessageNewService.countUncompleted(MessageGroupNodeStatisticParam.from(request)); + return CommonResponse.success(count); + } + @Override public CommonResponse> pageQuery(PendingMessagePageRequest request) { return CommonResponse.success(pendingMessageNewService.pageQuery(request)); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/GroupTreeNodePathDTO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/GroupTreeNodePathDTO.java index 3f0318a6..f1e61fa7 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/GroupTreeNodePathDTO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/GroupTreeNodePathDTO.java @@ -32,6 +32,10 @@ public class GroupTreeNodePathDTO implements Serializable { * 结点编码 */ private String nodeCode; + /** + * 结点名称 + */ + private String nodeName; /** * 结点名称格式的路径 */ @@ -50,10 +54,10 @@ public class GroupTreeNodePathDTO implements Serializable { return nodeCodes[nodeCodes.length - 1]; } - public static GroupTreeNodePathDTO of(String nodeCode, Collection nodes) { + public static GroupTreeNodePathDTO of(GroupTreeNodeDTO node, Collection nodes) { String nodeNamePath = formatPath(GroupTreeNodeDTO::getNodeName, nodes, NODE_NAME_PATH_SPLITER); String nodeCodePath = formatPath(GroupTreeNodeDTO::getNodeCode, nodes, NODE_CODE_PATH_SPLITER); - return new GroupTreeNodePathDTO(nodeCode, nodeNamePath, nodeCodePath); + return new GroupTreeNodePathDTO(node.getNodeCode(), node.getNodeName(), nodeNamePath, nodeCodePath); } private static String formatPath(Function pathFunc, Collection nodes, 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 b0c73636..c9a9cf41 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 @@ -14,7 +14,6 @@ import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import cn.axzo.msg.center.utils.MessageRouterUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -121,7 +120,7 @@ public class MessageTemplateRouterDTO implements Serializable { .map(e -> MessageRouterConfigDTO.builder().url(e.getUrl()).terminalType(e.getTerminalType()).build()) .collect(Collectors.toList()); return MessageRouteDetailDTO.builder() - .name("详情") + .name(MessageRouterUtil.DETAIL_ROUTER_DESC) .templateCode(templateCode) .showStrategy(bizDetailShowStrategy.getShowStrategy()) .routerConfigs(configs) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/PendingMessageStatisticDTO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/PendingMessageStatisticDTO.java index 63a84776..f58c19a0 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/PendingMessageStatisticDTO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/dto/PendingMessageStatisticDTO.java @@ -1,6 +1,5 @@ package cn.axzo.msg.center.message.domain.dto; -import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO; import cn.axzo.msg.center.service.pending.response.PendingMessageStatisticResponse; import com.alibaba.fastjson.JSON; import lombok.AllArgsConstructor; @@ -29,24 +28,29 @@ public class PendingMessageStatisticDTO implements Serializable { private static final long serialVersionUID = 5171436359992401120L; /** - * 树结点 + * 叶结点编码 */ - private GroupTreeNodeDTO treeNode; + private String leafNodeCode; + /** + * 叶节点名称 + */ + private String leafNodeName; /** * 结点对应的代办数量 */ private Integer pendingCount; - public static PendingMessageStatisticDTO of(GroupTreeNodeDTO groupNode) { + public static PendingMessageStatisticDTO of(GroupTreeNodePathDTO groupNode) { return PendingMessageStatisticDTO.builder() - .treeNode(groupNode) + .leafNodeName(groupNode.getNodeName()) + .leafNodeCode(groupNode.getNodeCode()) .build(); } public PendingMessageStatisticResponse toResponse() { PendingMessageStatisticResponse response = new PendingMessageStatisticResponse(); - response.setGroupCode(treeNode.getNodeCode()); - response.setGroupName(treeNode.getNodeName()); + response.setGroupCode(this.leafNodeCode); + response.setGroupName(this.leafNodeName); response.setPendingCount(this.pendingCount); return response; } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageGroupNodeStatisticParam.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageGroupNodeStatisticParam.java index cb123567..e44bf725 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageGroupNodeStatisticParam.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageGroupNodeStatisticParam.java @@ -4,6 +4,7 @@ import cn.axzo.core.utils.converter.BeanConverter; import cn.axzo.msg.center.service.dto.IdentityDTO; import cn.axzo.msg.center.service.dto.PersonDTO; import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum; +import cn.axzo.msg.center.service.pending.request.PendingMessageCountUncompletedRequest; import cn.axzo.msg.center.service.pending.request.PendingMessageStatisticRequest; import com.alibaba.fastjson.JSON; import lombok.Getter; @@ -58,6 +59,20 @@ public class MessageGroupNodeStatisticParam implements Serializable { return param; } + public static MessageGroupNodeStatisticParam from(PendingMessageCountUncompletedRequest request) { + MessageGroupNodeStatisticParam param = BeanConverter.convert(request, MessageGroupNodeStatisticParam.class); + IdentityDTO identity = IdentityDTO.builder() + .id(request.getIdentityId()) + .type(request.getIdentityType()) + .build(); + PersonDTO person = PersonDTO.builder() + .id(request.getPersonId()) + .identity(identity) + .build(); + param.setOperator(person); + return param; + } + @Override public String toString() { return JSON.toJSONString(this); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageGroupNodeService.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageGroupNodeService.java index ea9a733c..353980a9 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageGroupNodeService.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageGroupNodeService.java @@ -1,5 +1,6 @@ package cn.axzo.msg.center.message.service; +import cn.axzo.msg.center.message.domain.dto.GroupTreeNodePathDTO; import cn.axzo.msg.center.message.domain.param.MessageGroupNodeSaveOrUpdateParam; import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO; import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum; @@ -37,12 +38,20 @@ public interface MessageGroupNodeService { Map leafGroupNodeCodePaths(Collection leafGroupNodeCodes); /** - * 根据结点编码查询结点信息 + * 获取分类结点(叶结点)编码的路径 * - * @param rootNodeCode 结点编码 - * @return 结点信息 + * @param leafNodeCode 分类结点(根结点)的编码 + * @return 分类结点(叶结点)编码的路径 */ - Optional queryRootNode(String rootNodeCode); + Optional queryLeafGroupNodeCodePath(String leafNodeCode); + + /** + * 获取分类结点(叶结点)编码的路径 + * + * @param rootNodeCodes 分类结点(根结点)的编码列表 + * @return 分类结点(叶结点)编码的路径 + */ + List leafGroupNodeCodePathsByRootNodeCodes(Collection rootNodeCodes); /** * 新增结点 diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageGroupTreeNodeCacheService.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageGroupTreeNodeCacheService.java index dca2c097..aa950a1c 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageGroupTreeNodeCacheService.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageGroupTreeNodeCacheService.java @@ -46,6 +46,14 @@ public interface MessageGroupTreeNodeCacheService { */ Optional queryLeafNodePath(String leafNodeCode); + /** + * 获取根节点对应的所有叶结点对应的树的路径 + * + * @param rootNodeCode 根结点编码 + * @return 路径 + */ + List listLeafNodePaths(String rootNodeCode); + /** * 刷新缓存 */ diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateGroupService.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateGroupService.java index 0cd3bf30..600edc31 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateGroupService.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/MessageTemplateGroupService.java @@ -14,12 +14,12 @@ import java.util.Map; public interface MessageTemplateGroupService { /** - * 通过分组结点编码查询关联的模板编码列表 + * 通过分组结点编码路径查询关联的模板编码列表 * - * @param groupNodeCode 分组结点编码 + * @param leafNodePathCodes 分组结点编码路径列表 * @return 模板编码列表 */ - List listMessageTemplateCodes(String groupNodeCode); + List listMessageTemplateCodes(Collection leafNodePathCodes); /** * 模板关联分类 diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/PendingMessageNewService.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/PendingMessageNewService.java index 22f77c5d..bbccfb8d 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/PendingMessageNewService.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/PendingMessageNewService.java @@ -1,7 +1,7 @@ package cn.axzo.msg.center.message.service; -import cn.axzo.msg.center.message.domain.dto.PendingMessageStatisticDTO; import cn.axzo.msg.center.message.domain.dto.PendingMessageDTO; +import cn.axzo.msg.center.message.domain.dto.PendingMessageStatisticDTO; import cn.axzo.msg.center.message.domain.param.MessageGroupNodeStatisticParam; import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam; import cn.axzo.msg.center.service.enums.TerminalTypeEnum; @@ -21,8 +21,22 @@ import java.util.Optional; */ public interface PendingMessageNewService { + /** + * 分类统计待办的待处理状态的数量 + * + * @param param 统计入参 + * @return 分类信息及其对应的待处理的待办数量列表 + */ List groupStatistic(MessageGroupNodeStatisticParam param); + /** + * 统计个人在某个应用终端的待处理的待办数量 + * + * @param param 统计入参 + * @return 待处理的待办数量 + */ + Integer countUncompleted(MessageGroupNodeStatisticParam param); + /** * 代办列表分页查询 * diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupNodeServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupNodeServiceImpl.java index e619245b..9e802cd9 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupNodeServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupNodeServiceImpl.java @@ -76,8 +76,19 @@ public class MessageGroupNodeServiceImpl implements MessageGroupNodeService { } @Override - public Optional queryRootNode(String rootNodeCode) { - return messageGroupTreeNodeCacheService.queryRootNode(rootNodeCode); + public Optional queryLeafGroupNodeCodePath(String leafNodeCode) { + return messageGroupTreeNodeCacheService.queryLeafNodePath(leafNodeCode); + } + + @Override + public List leafGroupNodeCodePathsByRootNodeCodes(Collection rootNodeCodes) { + if (CollectionUtils.isEmpty(rootNodeCodes)) { + log.info("rootNodeCodes is empty."); + return Collections.emptyList(); + } + return rootNodeCodes.stream() + .flatMap(e -> messageGroupTreeNodeCacheService.listLeafNodePaths(e).stream()) + .collect(Collectors.toList()); } @Override diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupTreeNodeCacheServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupTreeNodeCacheServiceImpl.java index 798d1e4d..f2eb24c5 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupTreeNodeCacheServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupTreeNodeCacheServiceImpl.java @@ -82,6 +82,17 @@ public class MessageGroupTreeNodeCacheServiceImpl implements MessageGroupTreeNod .findFirst(); } + @Override + public List listLeafNodePaths(String rootNodeCode) { + if (StringUtils.isBlank(rootNodeCode)) { + log.info("leafNodeCode is blank."); + return Collections.emptyList(); + } + return getLeafTreeNodePathsCache().stream() + .filter(e -> e.getNodeCodePath().startsWith(rootNodeCode)) + .collect(Collectors.toList()); + } + @Override public synchronized void refreshCache() { // 清除redis中的缓存标识 @@ -175,7 +186,7 @@ public class MessageGroupTreeNodeCacheServiceImpl implements MessageGroupTreeNod pathNodeStack.push(node); if (CollectionUtils.isEmpty(node.getNodeChildren())) { // 当前结点为树的叶结点(逻辑上的,有可能不是业务维度的叶结点) - paths.add(GroupTreeNodePathDTO.of(node.getNodeCode(), reverseStack(pathNodeStack))); + paths.add(GroupTreeNodePathDTO.of(node, reverseStack(pathNodeStack))); pathNodeStack.pop(); } else { stack.addAll(node.getNodeChildren()); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateGroupServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateGroupServiceImpl.java index d7d1045d..8dfca50e 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateGroupServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageTemplateGroupServiceImpl.java @@ -37,13 +37,13 @@ public class MessageTemplateGroupServiceImpl implements MessageTemplateGroupServ private final MessageTemplateGroupDao messageTemplateGroupDao; @Override - public List listMessageTemplateCodes(String groupNodeCode) { - if (StringUtils.isBlank(groupNodeCode)) { - log.info("groupNodeCode is blank."); + public List listMessageTemplateCodes(Collection leafNodePathCodes) { + if (CollectionUtils.isEmpty(leafNodePathCodes)) { + log.info("groupNodePathCodes is empty."); return Collections.emptyList(); } return messageTemplateGroupDao.lambdaQuery() - .like(MessageTemplateGroup::getPath, groupNodeCode) + .in(MessageTemplateGroup::getPath, leafNodePathCodes) .eq(MessageTemplateGroup::getIsDelete, 0) .list().stream() .map(MessageTemplateGroup::getTemplateCode) 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 81b75654..c38fd658 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 @@ -329,7 +329,10 @@ public class MessageTemplateNewServiceImpl implements MessageTemplateNewService private IPage pageQueryBaseTemplate(MessageTemplatePageRequest request) { List templateCodes = Lists.newArrayList(); if (StringUtils.isNotBlank(request.getGroupNodeCode())) { - templateCodes = messageTemplateGroupService.listMessageTemplateCodes(request.getGroupNodeCode()); + Optional nodePath = messageGroupNodeService.queryLeafGroupNodeCodePath(request.getGroupNodeCode()); + templateCodes = nodePath + .map(v -> messageTemplateGroupService.listMessageTemplateCodes(Lists.newArrayList(v.getNodeCodePath()))) + .orElseGet(Collections::emptyList); if (CollectionUtils.isEmpty(templateCodes)) { // 入参中的分类没有关联任何模板,直接返回查询结果 return null; 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 359d9324..ab35f5b9 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 @@ -8,6 +8,7 @@ import cn.axzo.msg.center.common.exception.ServiceException; import cn.axzo.msg.center.common.utils.PlaceholderResolver; import cn.axzo.msg.center.dal.PendingMessageRecordDao; import cn.axzo.msg.center.domain.entity.PendingMessageRecord; +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.MessageTemplateRouterDTO; import cn.axzo.msg.center.message.domain.dto.PendingMessageDTO; @@ -18,7 +19,6 @@ 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.PendingMessageNewService; -import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO; import cn.axzo.msg.center.service.dto.IdentityDTO; import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO; import cn.axzo.msg.center.service.dto.PersonDTO; @@ -78,11 +78,20 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService { public List groupStatistic(MessageGroupNodeStatisticParam param) { List groupTreeRootNodeCodes = messageGroupNodeService .listGroupTreeRootNodeCodes(MessageGroupCategoryEnum.PENDING, param.getTerminalType()); - return groupTreeRootNodeCodes.stream() - .flatMap(e -> statistic(e, param).stream()) + List leafNodePaths = messageGroupNodeService.leafGroupNodeCodePathsByRootNodeCodes(groupTreeRootNodeCodes); + return leafNodePaths.parallelStream() + .map(e -> statistic(e, param)) .collect(Collectors.toList()); } + @Override + public Integer countUncompleted(MessageGroupNodeStatisticParam param) { + List groupTreeRootNodeCodes = messageGroupNodeService + .listGroupTreeRootNodeCodes(MessageGroupCategoryEnum.PENDING, param.getTerminalType()); + List leafNodePaths = messageGroupNodeService.leafGroupNodeCodePathsByRootNodeCodes(groupTreeRootNodeCodes); + return doStatistic(leafNodePaths, param); + } + @Override public Page pageQuery(PendingMessagePageRequest request) { PersonDTO operator = PersonDTO.from(request.getPersonId(), request.getIdentityId(), request.getIdentityType()); @@ -99,8 +108,10 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService { buildPersonCondition(query, request.getWithIdentify(), request.getRoleCategory(), operator); // 模板的分类,对代办进行分组过滤 if (StringUtils.isNotBlank(request.getGroupNodeCode())) { - List templateCodes = messageTemplateGroupService - .listMessageTemplateCodes(request.getGroupNodeCode()); + Optional nodePath = messageGroupNodeService.queryLeafGroupNodeCodePath(request.getGroupNodeCode()); + List templateCodes = nodePath + .map(v -> messageTemplateGroupService.listMessageTemplateCodes(Lists.newArrayList(v.getNodeCodePath()))) + .orElseGet(Collections::emptyList); query.in(CollectionUtils.isNotEmpty(templateCodes), PendingMessageRecord::getTemplateCode, templateCodes); } // 构建排序条件 @@ -211,19 +222,21 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService { return pendingMessage; } - private List statistic(String rootNodeCode, MessageGroupNodeStatisticParam param) { - // TODO:[cold_blade] [P0] 异常捕获处理功能实现 - GroupTreeNodeDTO rootNode = messageGroupNodeService.queryRootNode(rootNodeCode) - .orElseThrow(() -> new ServiceException("groupNodeCode is invalid.")); - // 外部传的是根节点,但是前端希望只返回根节点的字节的 - int pendingCnt = doStatistic(rootNodeCode, param); - PendingMessageStatisticDTO dto = PendingMessageStatisticDTO.of(rootNode); - dto.setPendingCount(pendingCnt); - return Collections.emptyList(); + private PendingMessageStatisticDTO statistic(GroupTreeNodePathDTO leafNodePath, MessageGroupNodeStatisticParam param) { + PendingMessageStatisticDTO dto = PendingMessageStatisticDTO.of(leafNodePath); + dto.setPendingCount(doStatistic(leafNodePath, param)); + return dto; } - private int doStatistic(String groupNodeCode, MessageGroupNodeStatisticParam param) { - List templateCodes = messageTemplateGroupService.listMessageTemplateCodes(groupNodeCode); + private int doStatistic(GroupTreeNodePathDTO leafNodePath, MessageGroupNodeStatisticParam param) { + return doStatistic(Lists.newArrayList(leafNodePath), param); + } + + private int doStatistic(Collection groupNodePaths, MessageGroupNodeStatisticParam param) { + List groupNodePathCodes = groupNodePaths.stream() + .map(GroupTreeNodePathDTO::getNodeCodePath) + .collect(Collectors.toList()); + List templateCodes = messageTemplateGroupService.listMessageTemplateCodes(groupNodePathCodes); if (CollectionUtils.isEmpty(templateCodes)) { return 0; } 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 802583a3..f0294ea8 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 @@ -42,7 +42,7 @@ import java.util.stream.Collectors; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class MessageRouterUtil { - public static final String DETAIL_ROUTER_DESC = "查看详情"; + public static final String DETAIL_ROUTER_DESC = "详情"; /** * 获取业务详情路由策略 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 fcae2ab9..6e5f7aaf 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,6 +17,8 @@ public enum RouterCategoryEnum { JUMP("直接跳转"), ACTION("接口调用"), + @Deprecated + DETAIL("查看详情"), ; private final String desc; diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/PendingMessageClient.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/PendingMessageClient.java index 8baa74e8..e1adfc5f 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/PendingMessageClient.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/PendingMessageClient.java @@ -2,6 +2,7 @@ package cn.axzo.msg.center.service.pending.client; import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import cn.axzo.msg.center.service.pending.client.fallback.PendingMessageClientFallback; +import cn.axzo.msg.center.service.pending.request.PendingMessageCountUncompletedRequest; import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest; import cn.axzo.msg.center.service.pending.request.PendingMessagePushRequest; import cn.axzo.msg.center.service.pending.request.PendingMessageStatisticRequest; @@ -12,7 +13,6 @@ import cn.azxo.framework.common.model.Page; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -33,10 +33,25 @@ import java.util.List; fallback = PendingMessageClientFallback.class) public interface PendingMessageClient { + /** + * 分类统计待办的待处理状态的数量 + * + * @param request 统计入参 + * @return 分类信息及其对应的待处理的待办数量列表 + */ @PostMapping(value = "/pending-message/record/group/statistic", produces = {MediaType.APPLICATION_JSON_VALUE}) CommonResponse> groupStatistic(@RequestBody @Valid PendingMessageStatisticRequest request); + /** + * 统计个人在某个应用终端的待处理的待办数量 + * + * @param request 统计入参 + * @return 待处理的待办数量 + */ + @PostMapping(value = "/pending-message/record/count/uncompleted", produces = {MediaType.APPLICATION_JSON_VALUE}) + CommonResponse countUncompleted(@RequestBody PendingMessageCountUncompletedRequest request); + /** * 代办列表分页查询 * diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/fallback/PendingMessageClientFallback.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/fallback/PendingMessageClientFallback.java index 060bb9df..1a00e8cb 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/fallback/PendingMessageClientFallback.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/fallback/PendingMessageClientFallback.java @@ -2,11 +2,12 @@ package cn.axzo.msg.center.service.pending.client.fallback; import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import cn.axzo.msg.center.service.pending.client.PendingMessageClient; -import cn.axzo.msg.center.service.pending.request.PendingMessageStatisticRequest; +import cn.axzo.msg.center.service.pending.request.PendingMessageCountUncompletedRequest; import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest; import cn.axzo.msg.center.service.pending.request.PendingMessagePushRequest; -import cn.axzo.msg.center.service.pending.response.PendingMessageStatisticResponse; +import cn.axzo.msg.center.service.pending.request.PendingMessageStatisticRequest; import cn.axzo.msg.center.service.pending.response.PendingMessageResponse; +import cn.axzo.msg.center.service.pending.response.PendingMessageStatisticResponse; import cn.azxo.framework.common.model.CommonResponse; import cn.azxo.framework.common.model.Page; import lombok.extern.slf4j.Slf4j; @@ -31,6 +32,12 @@ public class PendingMessageClientFallback implements PendingMessageClient { return CommonResponse.error("fall back while statistic pending message"); } + @Override + public CommonResponse countUncompleted(PendingMessageCountUncompletedRequest request) { + log.error("fall back while counting pending message. req:{}", request); + return CommonResponse.error("fall back while counting pending message"); + } + @Override public CommonResponse> pageQuery(PendingMessagePageRequest request) { log.error("fall back while page querying pending message. req:{}", request); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/PendingMessageCountUncompletedRequest.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/PendingMessageCountUncompletedRequest.java new file mode 100644 index 00000000..bd90e47f --- /dev/null +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/PendingMessageCountUncompletedRequest.java @@ -0,0 +1,47 @@ +package cn.axzo.msg.center.service.pending.request; + +import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum; +import cn.axzo.msg.center.service.enums.IdentityTypeEnum; +import com.alibaba.fastjson.JSON; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @description + * + * @author cold_blade + * @date 2023/11/13 + * @version 1.0 + */ +@Setter +@Getter +public class PendingMessageCountUncompletedRequest implements Serializable { + + private static final long serialVersionUID = 4714687359949832971L; + + /** + * 当前登录账户的自然id(前端不care) + */ + @NotNull(message = "personId is required") + private Long personId; + /** + * 当前登录账户的身份id(前端不care) + */ + private Long identityId; + /** + * 当前登录账户的身份类型(前端不care) + */ + private IdentityTypeEnum identityType; + /** + * 应用终端类型 + */ + private AppTerminalTypeEnum terminalType; + + @Override + public String toString() { + return JSON.toJSONString(this); + } +}