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

This commit is contained in:
luofu 2023-10-24 15:23:19 +08:00
commit f2d4f89574
12 changed files with 242 additions and 25 deletions

View File

@ -6,6 +6,7 @@ import cn.axzo.msg.center.domain.dto.SearchModuleDTO;
import cn.axzo.msg.center.domain.dto.SyncModuleDataDTO;
import cn.axzo.msg.center.domain.dto.UpdateModuleDTO;
import cn.axzo.msg.center.domain.entity.MessageModule;
import cn.axzo.msg.center.domain.enums.ModuleBizTypeEnum;
import cn.axzo.msg.center.domain.enums.UserTypeEnum;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -51,4 +52,12 @@ public interface MessageModuleService {
* @return 对应的模块列表
*/
List<MessageModule> listByModuleName(String moduleName);
/**
* 通过bizType查询模块id列表
*
* @param bizType 业务类型
* @return 模块id列表
*/
List<Long> listModuleIdByBizType(ModuleBizTypeEnum bizType);
}

View File

@ -3,7 +3,11 @@ package cn.axzo.msg.center.inside.notices.service.impl;
import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum;
import cn.axzo.msg.center.api.enums.ReceiveTypeEnum;
import cn.axzo.msg.center.dal.MessageModuleDao;
import cn.axzo.msg.center.domain.dto.*;
import cn.axzo.msg.center.domain.dto.CreateModuleDTO;
import cn.axzo.msg.center.domain.dto.MsgModuleDTO;
import cn.axzo.msg.center.domain.dto.SearchModuleDTO;
import cn.axzo.msg.center.domain.dto.SyncModuleDataDTO;
import cn.axzo.msg.center.domain.dto.UpdateModuleDTO;
import cn.axzo.msg.center.domain.entity.MessageModule;
import cn.axzo.msg.center.domain.enums.ModuleBizTypeEnum;
import cn.axzo.msg.center.domain.enums.UserTypeEnum;
@ -20,7 +24,12 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
@ -179,4 +188,19 @@ public class MessageModuleServiceImpl implements MessageModuleService {
.filter(e -> Objects.equals(e.getModuleName(), moduleName))
.collect(Collectors.toList());
}
@Override
public List<Long> listModuleIdByBizType(ModuleBizTypeEnum bizType) {
if (Objects.isNull(bizType)) {
log.info("bizType is null.");
return Collections.emptyList();
}
return messageModuleDao.lambdaQuery()
.eq(MessageModule::getBizType, bizType.getCode())
.eq(MessageModule::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.select(MessageModule::getId)
.list().stream()
.map(MessageModule::getId)
.collect(Collectors.toList());
}
}

View File

@ -24,7 +24,13 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**

View File

@ -0,0 +1,46 @@
package cn.axzo.msg.center.message.service;
import cn.axzo.msg.center.api.request.CmsMsgQueryReq;
import cn.axzo.msg.center.api.response.MessageNewRes;
import cn.axzo.msg.center.service.dto.PersonDTO;
import cn.azxo.framework.common.model.Page;
import java.util.List;
/**
* 旧普通消息的相关接口
*
* @author cold_blade
* @date 2023/10/24
* @version 1.0
*/
public interface GeneralMessageOldService {
/**
* 统计未读的消息数量
* : 该接口作为IM进入旧消息模块的入口,需要过滤双发至IM的消息
*
* @param person 身份信息
* @return 未读消息数量
*/
int countUnread(PersonDTO person);
/**
* 统计未读的消息数量
* : 该接口作为IM进入旧消息模块的入口,需要过滤双发至IM的消息
*
* @param person 身份信息
* @param excludeMsgIds 待排除的消息记录id
* @return 未读消息数量
*/
int countUnread(PersonDTO person, List<Long> excludeMsgIds);
/**
* 分页查询旧的普通消息记录
* : 该接口作为IM进入旧消息模块的入口,需要过滤双发至IM的消息
*
* @param request 分页查询参数
* @return 过滤后的旧的普通消息记录
*/
Page<MessageNewRes> pageMsgInfo(CmsMsgQueryReq request);
}

View File

@ -0,0 +1,82 @@
package cn.axzo.msg.center.message.service.impl;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.core.domain.PageResult;
import cn.axzo.msg.center.api.enums.MsgStateEnum;
import cn.axzo.msg.center.api.enums.MsgTypeEnum;
import cn.axzo.msg.center.api.request.CmsMsgQueryReq;
import cn.axzo.msg.center.api.response.MessageNewRes;
import cn.axzo.msg.center.common.enums.TableIsDeleteEnum;
import cn.axzo.msg.center.dal.MessageRecordDao;
import cn.axzo.msg.center.domain.entity.MessageRecord;
import cn.axzo.msg.center.domain.enums.ModuleBizTypeEnum;
import cn.axzo.msg.center.inside.notices.service.MessageCoreService;
import cn.axzo.msg.center.inside.notices.service.MessageModuleService;
import cn.axzo.msg.center.inside.notices.service.MessageRelationService;
import cn.axzo.msg.center.message.service.GeneralMessageOldService;
import cn.axzo.msg.center.message.service.MessageSendTwiceRecordService;
import cn.axzo.msg.center.service.dto.PersonDTO;
import cn.axzo.msg.center.utils.PersonIdentityUtil;
import cn.azxo.framework.common.model.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
/**
* @author cold_blade
* @date 2023/10/24
* @version 1.0
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class GeneralMessageOldServiceImpl implements GeneralMessageOldService {
private final MessageRecordDao messageRecordDao;
private final MessageCoreService messageCoreService;
private final MessageModuleService messageModuleService;
private final MessageRelationService messageRelationService;
private final MessageSendTwiceRecordService messageSendTwiceRecordService;
@Override
public int countUnread(PersonDTO person) {
AssertUtil.isTrue(Objects.nonNull(person) && person.isValid(),
"session 异常, 无法执行消息统计查询!, person : " + person);
List<Long> sendTwiceMsgIds = messageSendTwiceRecordService.listByPerson(person.getId());
return countUnread(person, sendTwiceMsgIds);
}
@Override
public int countUnread(PersonDTO person, List<Long> excludeMsgIds) {
List<Long> moduleIds = messageModuleService.listModuleIdByBizType(ModuleBizTypeEnum.CONSTRUCTION);
List<Long> relationIds = messageRelationService.listRelationIds(moduleIds);
if (CollectionUtils.isEmpty(relationIds)) {
log.info("the is not any valid relation id.");
return 0;
}
return messageRecordDao.lambdaQuery()
.eq(MessageRecord::getType, MsgTypeEnum.GENERAL_MESSAGE)
.in(MessageRecord::getState, MsgStateEnum.unreadStates())
.eq(MessageRecord::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.eq(MessageRecord::getToId, person.getIdentity().getId())
.eq(MessageRecord::getReceiveType, PersonIdentityUtil.toReceiveType(person.getIdentity().getType()))
.in(MessageRecord::getRelationId, relationIds)
// 排除双发记录表中的数据
.notIn(CollectionUtils.isNotEmpty(excludeMsgIds), MessageRecord::getId, excludeMsgIds)
.count();
}
@Override
public Page<MessageNewRes> pageMsgInfo(CmsMsgQueryReq request) {
log.info("start to page query general message. request:{}", request);
if (CollectionUtils.isEmpty(request.getExcludeMsgIds())) {
request.setExcludeMsgIds(messageSendTwiceRecordService.listByPerson(request.getPersonId()));
}
PageResult<MessageNewRes> pageResult = messageCoreService.listMsgInfo(request);
return Page.toPage(request.getPage(), request.getPageSize(), pageResult.getTotalCount(), pageResult.getData());
}
}

View File

@ -1,12 +1,10 @@
package cn.axzo.msg.center.message.service.impl;
import cn.axzo.core.domain.PageResult;
import cn.axzo.im.center.api.feign.MessageApi;
import cn.axzo.im.center.api.vo.req.MessageInfo;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import cn.axzo.msg.center.api.request.CmsMsgQueryReq;
import cn.axzo.msg.center.api.response.MessageNewRes;
import cn.axzo.msg.center.api.response.MessageTotalRes;
import cn.axzo.msg.center.common.exception.ServiceException;
import cn.axzo.msg.center.common.utils.PlaceholderResolver;
import cn.axzo.msg.center.dal.GeneralMessageRecordDao;
@ -16,7 +14,9 @@ import cn.axzo.msg.center.inside.notices.service.MessageRecordService;
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.vo.GeneralMessagePushVO;
import cn.axzo.msg.center.message.service.GeneralMessageOldService;
import cn.axzo.msg.center.message.service.GeneralMessageService;
import cn.axzo.msg.center.message.service.MessageSendTwiceRecordService;
import cn.axzo.msg.center.message.service.MessageTemplateNewService;
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
import cn.axzo.msg.center.service.dto.MessageRouterButtonDTO;
@ -30,6 +30,7 @@ import cn.axzo.msg.center.service.general.response.GeneralMessageOldDataStatisti
import cn.axzo.msg.center.utils.MessageRouterUtil;
import cn.axzo.msg.center.utils.PersonIdentityUtil;
import cn.axzo.msg.center.utils.UUIDUtil;
import cn.azxo.framework.common.model.Page;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.ImmutableMap;
@ -67,7 +68,9 @@ public class GeneralMessageServiceImpl implements GeneralMessageService {
private final MessageApi messageApi;
private final MessageRecordService messageRecordService;
private final GeneralMessageRecordDao generalMessageRecordDao;
private final GeneralMessageOldService generalMessageOldService;
private final MessageTemplateNewService messageTemplateNewService;
private final MessageSendTwiceRecordService messageSendTwiceRecordService;
@Override
public String batchSendMessage(GeneralMessageSendRequest request) {
@ -84,23 +87,17 @@ public class GeneralMessageServiceImpl implements GeneralMessageService {
@Override
public GeneralMessageOldDataStatisticResponse statisticOldData(GeneralMessageOldDataStatisticRequest request) {
// TODO: [cold_blade] [P0] 统计旧数据接口实现
UserTypeEnum userType = PersonIdentityUtil.toUserType(request.getIdentityType());
CmsMsgQueryReq req = new CmsMsgQueryReq();
req.setMsgType(MessageCategoryEnum.GENERAL_MESSAGE.getCode());
// 这里查询消息中心全部状态的数据
req.setMsgStatus(0);
req.setPage(1L);
req.setPageSize(1L);
// TODO: [cold_blade] [P0] 需要排除IM中的消息
PageResult<MessageNewRes> result = messageRecordService.pageMsgInfo(req, request.getPersonId(),
request.getIdentityId(), userType);
MessageTotalRes res = messageRecordService.statisticsMsg4Total(request.getPersonId(),
request.getIdentityId(), userType);
MessageNewRes msg = CollectionUtils.isNotEmpty(result.getData()) ? result.getData().get(0) : null;
// 查询双发的消息记录
List<Long> sendTwiceMsgIds = messageSendTwiceRecordService.listByPerson(request.getPersonId());
// 分页查询最新一条数据
Page<MessageNewRes> result = generalMessageOldService.pageMsgInfo(build(request, sendTwiceMsgIds));
// 统计旧的未读普通消息数量
int count = generalMessageOldService.countUnread(PersonDTO.from(request.getPersonId(), request.getIdentityId(),
request.getIdentityType()), sendTwiceMsgIds);
// 编排组合成界面展示的数据结构
MessageNewRes msg = CollectionUtils.isNotEmpty(result.getList()) ? result.getList().get(0) : null;
return GeneralMessageOldDataStatisticResponse.builder()
.unreadCount(res.getMsgTotal())
.unreadCount(count)
.latestMsgSendTimestamp(Optional.ofNullable(msg).map(v -> v.getCreateAt().getTime()).orElse(null))
.latestMsgContent(Optional.ofNullable(msg).map(MessageNewRes::getContent).orElse(null))
.build();
@ -197,4 +194,19 @@ public class GeneralMessageServiceImpl implements GeneralMessageService {
}
return PlaceholderResolver.getDefaultResolver().resolveByMap(string, params);
}
private CmsMsgQueryReq build(GeneralMessageOldDataStatisticRequest request, List<Long> excludeMsgIds) {
UserTypeEnum userType = PersonIdentityUtil.toUserType(request.getIdentityType());
CmsMsgQueryReq req = new CmsMsgQueryReq();
req.setMsgType(MessageCategoryEnum.GENERAL_MESSAGE.getCode());
// 这里查询消息中心全部状态的数据
req.setMsgStatus(0);
req.setPage(1L);
req.setPageSize(1L);
req.setPersonId(request.getPersonId());
req.setIdentityId(request.getIdentityId());
req.setUserType(userType.getValue());
req.setExcludeMsgIds(excludeMsgIds);
return req;
}
}

View File

@ -43,4 +43,17 @@ public class PersonIdentityUtil {
return Optional.empty();
}
}
public static ReceiveTypeEnum toReceiveType(IdentityTypeEnum identityType) {
switch (identityType) {
case WORKER:
return ReceiveTypeEnum.CM_WORKER;
case WORKER_LEADER:
return ReceiveTypeEnum.CM_LEADER;
case PRACTITIONER:
return ReceiveTypeEnum.CMP_USER;
default:
return ReceiveTypeEnum.NOT_IDENTITY;
}
}
}

View File

@ -49,4 +49,11 @@ public enum MsgStateEnum {
COMPLETE
);
}
public static List<MsgStateEnum> unreadStates() {
return Lists.newArrayList(
HAS_BEEN_SENT,
RECEIVED
);
}
}

View File

@ -4,6 +4,7 @@ import cn.axzo.basics.common.page.PageRequest;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @author : liuchuntao
@ -58,7 +59,8 @@ public class CmsMsgQueryReq extends PageRequest {
*
*/
private Long identityId;
/**
* 待排除的消息id
*/
private List<Long> excludeMsgIds;
}

View File

@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.util.Objects;
/**
* @description
@ -46,6 +47,11 @@ public class PersonDTO implements Serializable {
.build();
}
public boolean isValid() {
return Objects.nonNull(id) && id > 0
&& Objects.nonNull(identity) && identity.isValid();
}
@Override
public String toString() {
return JSON.toJSONString(this);

View File

@ -66,7 +66,12 @@
#{item}
</foreach>
</if>
<if test="req.excludeMsgIds != null and req.excludeMsgIds.size > 0">
and record.id not in
<foreach close=")" collection="req.excludeMsgIds" index="index" item="item" open="(" separator=",">
#{item}
</foreach>
</if>
and record.create_at > DATE_FORMAT((CURDATE() - INTERVAL 3 YEAR),'%Y-%m-%d')
order by record.create_at desc,record.id desc
</select>

View File

@ -4,6 +4,7 @@ import cn.axzo.basics.common.page.PageRequest;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class CmsMsgQueryReqDTO extends PageRequest {
@ -34,4 +35,8 @@ public class CmsMsgQueryReqDTO extends PageRequest {
* 待办消息模块类型Id - 针对待办使用
*/
private Long moduleId;
/**
* 待排除的消息id
*/
private List<Long> excludeMsgIds;
}