diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/MessageModuleService.java b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/MessageModuleService.java index dd3a1d80..722352dc 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/MessageModuleService.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/MessageModuleService.java @@ -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 listByModuleName(String moduleName); + + /** + * 通过bizType查询模块id列表 + * + * @param bizType 业务类型 + * @return 模块id列表 + */ + List listModuleIdByBizType(ModuleBizTypeEnum bizType); } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/impl/MessageModuleServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/impl/MessageModuleServiceImpl.java index bd25ab5c..8c19edc4 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/impl/MessageModuleServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/impl/MessageModuleServiceImpl.java @@ -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 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()); + } } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/impl/MessageRelationServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/impl/MessageRelationServiceImpl.java index 6d1cc362..808943a9 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/impl/MessageRelationServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/service/impl/MessageRelationServiceImpl.java @@ -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; /** diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/GeneralMessageOldService.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/GeneralMessageOldService.java new file mode 100644 index 00000000..b4049ed6 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/GeneralMessageOldService.java @@ -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 excludeMsgIds); + + /** + * 分页查询旧的普通消息记录 + * 注: 该接口作为IM进入旧消息模块的入口,需要过滤双发至IM的消息 + * + * @param request 分页查询参数 + * @return 过滤后的旧的普通消息记录 + */ + Page pageMsgInfo(CmsMsgQueryReq request); +} diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/GeneralMessageOldServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/GeneralMessageOldServiceImpl.java new file mode 100644 index 00000000..d204dc6d --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/GeneralMessageOldServiceImpl.java @@ -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 sendTwiceMsgIds = messageSendTwiceRecordService.listByPerson(person.getId()); + return countUnread(person, sendTwiceMsgIds); + } + + @Override + public int countUnread(PersonDTO person, List excludeMsgIds) { + List moduleIds = messageModuleService.listModuleIdByBizType(ModuleBizTypeEnum.CONSTRUCTION); + List 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 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 pageResult = messageCoreService.listMsgInfo(request); + return Page.toPage(request.getPage(), request.getPageSize(), pageResult.getTotalCount(), pageResult.getData()); + } +} 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 9e8692ef..bdd38787 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 @@ -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 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 sendTwiceMsgIds = messageSendTwiceRecordService.listByPerson(request.getPersonId()); + // 分页查询最新一条数据 + Page 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 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; + } } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/utils/PersonIdentityUtil.java b/inside-notices/src/main/java/cn/axzo/msg/center/utils/PersonIdentityUtil.java index aef338c5..62fa1be7 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/utils/PersonIdentityUtil.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/utils/PersonIdentityUtil.java @@ -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; + } + } } diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/api/enums/MsgStateEnum.java b/msg-center-api/src/main/java/cn/axzo/msg/center/api/enums/MsgStateEnum.java index 2ff96325..382f97ad 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/api/enums/MsgStateEnum.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/api/enums/MsgStateEnum.java @@ -49,4 +49,11 @@ public enum MsgStateEnum { COMPLETE ); } + + public static List unreadStates() { + return Lists.newArrayList( + HAS_BEEN_SENT, + RECEIVED + ); + } } \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/api/request/CmsMsgQueryReq.java b/msg-center-api/src/main/java/cn/axzo/msg/center/api/request/CmsMsgQueryReq.java index 3cd15dd9..1fd8b3c5 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/api/request/CmsMsgQueryReq.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/api/request/CmsMsgQueryReq.java @@ -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 excludeMsgIds; } diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PersonDTO.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PersonDTO.java index fad40f2d..33a108a0 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PersonDTO.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PersonDTO.java @@ -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); diff --git a/msg-center-dal/src/main/resources/mapper/MessageRecordMapper.xml b/msg-center-dal/src/main/resources/mapper/MessageRecordMapper.xml index 702365eb..a04d7b4a 100644 --- a/msg-center-dal/src/main/resources/mapper/MessageRecordMapper.xml +++ b/msg-center-dal/src/main/resources/mapper/MessageRecordMapper.xml @@ -66,7 +66,12 @@ #{item} - + + and record.id not in + + #{item} + + and record.create_at > DATE_FORMAT((CURDATE() - INTERVAL 3 YEAR),'%Y-%m-%d') order by record.create_at desc,record.id desc diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/dto/CmsMsgQueryReqDTO.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/dto/CmsMsgQueryReqDTO.java index 186f47cd..f00d7205 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/dto/CmsMsgQueryReqDTO.java +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/dto/CmsMsgQueryReqDTO.java @@ -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 excludeMsgIds; }