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

This commit is contained in:
luofu 2023-11-09 16:14:24 +08:00
commit 17922bef00
13 changed files with 173 additions and 229 deletions

View File

@ -1,6 +1,6 @@
package cn.axzo.msg.center.message.controller;
import cn.axzo.msg.center.message.domain.dto.MessageGroupNodeStatisticDTO;
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.param.MessageGroupNodeStatisticParam;
import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam;
@ -10,7 +10,7 @@ import cn.axzo.msg.center.service.pending.client.PendingMessageClient;
import cn.axzo.msg.center.service.pending.request.MessageGroupNodeStatisticRequest;
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.MessageGroupNodeResponse;
import cn.axzo.msg.center.service.pending.response.PendingMessageStatisticResponse;
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
import cn.azxo.framework.common.model.CommonResponse;
import cn.azxo.framework.common.model.Page;
@ -35,11 +35,11 @@ public class PendingMessageNewController implements PendingMessageClient {
private final PendingMessageNewService pendingMessageNewService;
@Override
public CommonResponse<List<MessageGroupNodeResponse>> groupStatistic(MessageGroupNodeStatisticRequest request) {
List<MessageGroupNodeStatisticDTO> groupNodes = pendingMessageNewService
public CommonResponse<List<PendingMessageStatisticResponse>> groupStatistic(MessageGroupNodeStatisticRequest request) {
List<PendingMessageStatisticDTO> groupNodes = pendingMessageNewService
.groupStatistic(MessageGroupNodeStatisticParam.from(request));
return CommonResponse.success(groupNodes.stream()
.map(MessageGroupNodeStatisticDTO::toResponse)
.map(PendingMessageStatisticDTO::toResponse)
.collect(Collectors.toList())
);
}

View File

@ -1,81 +0,0 @@
package cn.axzo.msg.center.message.domain.dto;
import cn.axzo.basics.common.model.IBaseTree;
import cn.axzo.core.utils.converter.BeanConverter;
import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO;
import cn.axzo.msg.center.service.pending.response.MessageGroupNodeResponse;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
/**
* @description
* 消息分类结点DTO
*
* @author cold_blade
* @date 2023/9/26
* @version 1.0
*/
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MessageGroupNodeStatisticDTO implements IBaseTree<MessageGroupNodeStatisticDTO, String>, Serializable {
private static final long serialVersionUID = 5171436359992401120L;
/**
* 树结点
*/
private GroupTreeNodeDTO treeNode;
/**
* 子节点列表
*/
private List<MessageGroupNodeStatisticDTO> nodeChildren;
/**
* 结点对应的代办数量
*/
private Integer pendingCount;
public static MessageGroupNodeStatisticDTO of(GroupTreeNodeDTO groupNode) {
return MessageGroupNodeStatisticDTO.builder()
.treeNode(groupNode)
.build();
}
public MessageGroupNodeResponse toResponse() {
MessageGroupNodeResponse response = new MessageGroupNodeResponse();
response.setCategory(treeNode.getCategory());
response.setNodeCode(treeNode.getNodeCode());
response.setNodeName(treeNode.getNodeName());
response.setParentNodeCode(treeNode.getParentNodeCode());
response.setPendingCount(this.pendingCount);
List<MessageGroupNodeResponse> children = this.nodeChildren.stream()
.map(MessageGroupNodeStatisticDTO::toResponse).collect(Collectors.toList());
response.setNodeChildren(children);
return response;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
@Override
public String getNodeCode() {
return treeNode.getNodeCode();
}
@Override
public String getParentNodeCode() {
return treeNode.getParentNodeCode();
}
}

View File

@ -0,0 +1,58 @@
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;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
/**
* @description
* 消息分类结点DTO
*
* @author cold_blade
* @date 2023/9/26
* @version 1.0
*/
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PendingMessageStatisticDTO implements Serializable {
private static final long serialVersionUID = 5171436359992401120L;
/**
* 树结点
*/
private GroupTreeNodeDTO treeNode;
/**
* 结点对应的代办数量
*/
private Integer pendingCount;
public static PendingMessageStatisticDTO of(GroupTreeNodeDTO groupNode) {
return PendingMessageStatisticDTO.builder()
.treeNode(groupNode)
.build();
}
public PendingMessageStatisticResponse toResponse() {
PendingMessageStatisticResponse response = new PendingMessageStatisticResponse();
response.setGroupCode(treeNode.getNodeCode());
response.setGroupName(treeNode.getNodeName());
response.setPendingCount(this.pendingCount);
return response;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -3,8 +3,7 @@ package cn.axzo.msg.center.message.domain.param;
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.PendingMessageRoleCategoryEnum;
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum;
import cn.axzo.msg.center.service.pending.request.MessageGroupNodeStatisticRequest;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
@ -31,34 +30,19 @@ public class MessageGroupNodeStatisticParam implements Serializable {
*/
private PersonDTO operator;
/**
* 业务方是否只关注特定身份的消息
* true:
* false:
* 应用终端类型
*/
private Boolean withIdentify;
private AppTerminalTypeEnum terminalType;
/**
* 消息的分类结点编码集合
*/
private Collection<String> groupNodeCodes;
/**
* 代办角色
* PROMOTER: 发起者
* EXECUTOR: 执行者
* 业务方是否只关注特定身份的消息
* true:
* false:
*/
private PendingMessageRoleCategoryEnum roleCategory;
/**
* 代办消息状态
* UNSENT: 未发送
* HAS_BEEN_SENT: 已发送
* COMPLETED: 已办
* RETRACT: 已撤回
* DELETED: 已删除
*/
private PendingMessageStateEnum msgState;
/**
* 消息标题
*/
private String title;
private Boolean withIdentify;
public static MessageGroupNodeStatisticParam from(MessageGroupNodeStatisticRequest request) {
MessageGroupNodeStatisticParam param = BeanConverter.convert(request, MessageGroupNodeStatisticParam.class);

View File

@ -1,6 +1,6 @@
package cn.axzo.msg.center.message.service;
import cn.axzo.msg.center.message.domain.dto.MessageGroupNodeStatisticDTO;
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.param.MessageGroupNodeStatisticParam;
import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam;
@ -21,7 +21,7 @@ import java.util.Optional;
*/
public interface PendingMessageNewService {
List<MessageGroupNodeStatisticDTO> groupStatistic(MessageGroupNodeStatisticParam param);
List<PendingMessageStatisticDTO> groupStatistic(MessageGroupNodeStatisticParam param);
/**
* 代办列表分页查询

View File

@ -5,10 +5,10 @@ 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.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.PendingMessageStatisticDTO;
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;
@ -28,7 +28,6 @@ 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.OrderFieldParseUtil;
import cn.axzo.msg.center.utils.TreeHelperUtil;
import cn.axzo.msg.center.utils.UUIDUtil;
import cn.azxo.framework.common.model.Page;
import com.alibaba.fastjson.JSON;
@ -44,7 +43,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@ -68,7 +67,8 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
private final MessageTemplateGroupService messageTemplateGroupService;
@Override
public List<MessageGroupNodeStatisticDTO> groupStatistic(MessageGroupNodeStatisticParam param) {
public List<PendingMessageStatisticDTO> groupStatistic(MessageGroupNodeStatisticParam param) {
// TODO: [cold_blade] [P0] 获取待统计的业务中心分类结点的编码
return param.getGroupNodeCodes().stream()
.flatMap(e -> statistic(e, param).stream())
.collect(Collectors.toList());
@ -184,35 +184,27 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
return pendingMessage;
}
private List<MessageGroupNodeStatisticDTO> statistic(String rootNodeCode, MessageGroupNodeStatisticParam param) {
private List<PendingMessageStatisticDTO> statistic(String rootNodeCode, MessageGroupNodeStatisticParam param) {
// TODO:[cold_blade] [P0] 异常捕获处理记忆功能实现
GroupTreeNodeDTO rootNode = messageGroupNodeService.queryRootNode(rootNodeCode)
.orElseThrow(() -> new ServiceException("groupNodeCode is invalid."));
MessageGroupNodeStatisticDTO rootWrapper = TreeHelperUtil.wrapper(rootNode, MessageGroupNodeStatisticDTO::of);
LinkedList<MessageGroupNodeStatisticDTO> stack = new LinkedList<>();
stack.push(rootWrapper);
MessageGroupNodeStatisticDTO wrapper;
while (!stack.isEmpty()) {
wrapper = stack.pop();
statistic(wrapper, param);
stack.addAll(wrapper.getNodeChildren());
}
// 外部传的是根节点但是前端希望只返回根节点的字节的
return rootWrapper.getNodeChildren();
int pendingCnt = doStatistic(rootNodeCode, param);
PendingMessageStatisticDTO dto = PendingMessageStatisticDTO.of(rootNode);
dto.setPendingCount(pendingCnt);
return Collections.emptyList();
}
private void statistic(MessageGroupNodeStatisticDTO groupNode, MessageGroupNodeStatisticParam param) {
List<String> templateCodes = messageTemplateGroupService.listMessageTemplateCodes(groupNode.getNodeCode());
private int doStatistic(String groupNodeCode, MessageGroupNodeStatisticParam param) {
List<String> templateCodes = messageTemplateGroupService.listMessageTemplateCodes(groupNodeCode);
if (CollectionUtils.isEmpty(templateCodes)) {
groupNode.setPendingCount(0);
return;
return 0;
}
LambdaQueryChainWrapper<PendingMessageRecord> query = pendingMessageRecordDao.lambdaQuery()
.in(PendingMessageRecord::getTemplateCode, templateCodes)
.like(StringUtils.isNotBlank(param.getTitle()), PendingMessageRecord::getTitle, param.getTitle())
.eq(Objects.nonNull(param.getMsgState()), PendingMessageRecord::getState, param.getMsgState())
.eq(PendingMessageRecord::getIsDelete, 0);
buildPersonCondition(query, param.getWithIdentify(), param.getRoleCategory(), param.getOperator());
groupNode.setPendingCount(query.count());
.eq(PendingMessageRecord::getState, PendingMessageStateEnum.HAS_BEEN_SENT);
buildPersonCondition(query, param.getWithIdentify(), PendingMessageRoleCategoryEnum.EXECUTOR, param.getOperator());
return query.count();
}
private void buildPersonCondition(LambdaQueryChainWrapper<PendingMessageRecord> query, Boolean withIdentify,

View File

@ -0,0 +1,37 @@
package cn.axzo.msg.center.service.enums;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @description
* 应用终端类型枚举
* @author cold_blade
* @date 2023/11/9
* @version 1.0
*/
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public enum AppTerminalTypeEnum {
/**
* B-安心筑企业版
*/
B_ENTERPRISE_APP("B-安心筑企业版"),
/**
* C-安心筑工人版
*/
C_WORKER_APP("C-安心筑工人版"),
/**
* CMS PC端
*/
CMS_WEB_PC("CMS PC端"),
/**
* OMS PC端
*/
OMS_WEB_PC("OMS PC端"),
;
private final String desc;
}

View File

@ -5,7 +5,7 @@ import cn.axzo.msg.center.service.pending.client.fallback.PendingMessageClientFa
import cn.axzo.msg.center.service.pending.request.MessageGroupNodeStatisticRequest;
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.MessageGroupNodeResponse;
import cn.axzo.msg.center.service.pending.response.PendingMessageStatisticResponse;
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
import cn.azxo.framework.common.model.CommonResponse;
import cn.azxo.framework.common.model.Page;
@ -33,7 +33,7 @@ import java.util.List;
public interface PendingMessageClient {
@PostMapping(value = "/pending-message/record/group/statistic", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<List<MessageGroupNodeResponse>> groupStatistic(@RequestBody @Valid
CommonResponse<List<PendingMessageStatisticResponse>> groupStatistic(@RequestBody @Valid
MessageGroupNodeStatisticRequest request);
/**

View File

@ -5,7 +5,7 @@ import cn.axzo.msg.center.service.pending.client.PendingMessageClient;
import cn.axzo.msg.center.service.pending.request.MessageGroupNodeStatisticRequest;
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.MessageGroupNodeResponse;
import cn.axzo.msg.center.service.pending.response.PendingMessageStatisticResponse;
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
import cn.azxo.framework.common.model.CommonResponse;
import cn.azxo.framework.common.model.Page;
@ -26,7 +26,7 @@ import java.util.List;
public class PendingMessageClientFallback implements PendingMessageClient {
@Override
public CommonResponse<List<MessageGroupNodeResponse>> groupStatistic(MessageGroupNodeStatisticRequest request) {
public CommonResponse<List<PendingMessageStatisticResponse>> groupStatistic(MessageGroupNodeStatisticRequest request) {
log.error("fall back while statistic pending message. req:{}", request);
return CommonResponse.error("fall back while statistic pending message");
}

View File

@ -1,13 +1,11 @@
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 cn.axzo.msg.center.service.enums.PendingMessageRoleCategoryEnum;
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Collection;
@ -41,34 +39,11 @@ public class MessageGroupNodeStatisticRequest implements Serializable {
/**
* 消息的分类结点编码集合
*/
@NotEmpty(message = "groupNodeCodes is required")
private Collection<String> groupNodeCodes;
/**
* 业务方是否只关注特定身份的消息
* true:
* false:
* 应用终端类型
*/
private Boolean withIdentify;
/**
* 代办角色
* PROMOTER: 发起者
* CREATOR: 创建者
* EXECUTOR: 执行者
*/
private PendingMessageRoleCategoryEnum roleCategory;
/**
* 代办消息状态
* UNSENT: 未发送
* HAS_BEEN_SENT: 已发送
* COMPLETED: 已办
* RETRACT: 已撤回
* DELETED: 已删除
*/
private PendingMessageStateEnum msgState;
/**
* 消息标题
*/
private String title;
private AppTerminalTypeEnum terminalType;
@Override
public String toString() {

View File

@ -1,60 +0,0 @@
package cn.axzo.msg.center.service.pending.response;
import cn.axzo.basics.common.model.IBaseTree;
import cn.axzo.msg.center.service.enums.MessageGroupNodeCategoryEnum;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* @description
*
* @author cold_blade
* @date 2023/9/23
* @version 1.0
*/
@Setter
@Getter
public class MessageGroupNodeResponse implements IBaseTree<MessageGroupNodeResponse, String>, Serializable {
private static final long serialVersionUID = 972200410809186003L;
/**
* 结点类型
* GENERAL_MESSAGE_CENTER: 消息中心
* GENERAL_MESSAGE_MODULE: 消息模块
* GENERAL_MESSAGE_CATEGORY: 消息分类
* PENDING_MESSAGE_CENTER: 待办中心
* PENDING_MESSAGE_MODULE: 待办模块
* PENDING_MESSAGE_CATEGORY: 待办分类
*/
private MessageGroupNodeCategoryEnum category;
/**
* 结点名称
*/
private String nodeName;
/**
* 结点编码
*/
private String nodeCode;
/**
* 父节点编码
*/
private String parentNodeCode;
/**
* 子节点列表
*/
private List<MessageGroupNodeResponse> nodeChildren;
/**
* 结点对应的代办数量
*/
private Integer pendingCount;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -0,0 +1,39 @@
package cn.axzo.msg.center.service.pending.response;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* @description
*
* @author cold_blade
* @date 2023/9/23
* @version 1.0
*/
@Setter
@Getter
public class PendingMessageStatisticResponse implements Serializable {
private static final long serialVersionUID = 972200410809186003L;
/**
* 分类名称
*/
private String groupName;
/**
* 分类编码
*/
private String groupCode;
/**
* 分类对应的代办数量
*/
private Integer pendingCount;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -1,6 +1,6 @@
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.BizCategoryEnum;
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
@ -24,7 +24,7 @@ import java.util.Date;
@Setter
@Getter
@TableName("pending_message_record")
public class PendingMessageRecord extends BaseEntity<PendingMessageRecord> implements Serializable {
public class PendingMessageRecord extends BaseEntityExt<PendingMessageRecord> implements Serializable {
private static final long serialVersionUID = 2184329278851311992L;