1、站内信相关查询移除redis中查询状态,改为已读后新增一条message_readinfo,相关方法逻辑修改,移除无用方法;2、全局GlobalExceptionHandler捕获BindException时丢出错误值而不是堆栈异常;

This commit is contained in:
gaoqr
2024-07-16 10:51:07 +08:00
parent aa09d8e96c
commit 0e3a2a33d2
14 changed files with 249 additions and 276 deletions
@@ -4,7 +4,6 @@ import com.cf.imes.framework.common.enums.UserTypeEnum;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessageRespVO;
import com.cf.imes.module.system.dal.dataobject.notify.NotifyMessageDO;
@@ -19,10 +18,6 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import static com.cf.imes.framework.common.pojo.CommonResult.success;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@@ -51,7 +46,7 @@ public class NotifyMessageController {
@Operation(summary = "获得站内信分页")
@PreAuthorize("@ss.hasPermission('system:notify-message:query')")
public CommonResult<PageResult<NotifyMessageRespVO>> getNotifyMessagePage(@Valid NotifyMessagePageReqVO pageVO) {
PageResult<NotifyMessageDO> pageResult = notifyMessageService.getNotifyMessagePage(pageVO);
PageResult<NotifyMessageDO> pageResult = notifyMessageService.getMyMyNotifyMessagePage(pageVO);
return success(BeanUtils.toBean(pageResult, NotifyMessageRespVO.class));
}
@@ -59,18 +54,11 @@ public class NotifyMessageController {
@GetMapping("/my-page")
@Operation(summary = "获得我的站内信分页")
public CommonResult<PageResult<NotifyMessageRespVO>> getMyMyNotifyMessagePage(@Valid NotifyMessageMyPageReqVO pageVO) {
Long loginUserId = getLoginUserId();
if(!Objects.isNull(pageVO.getReadStatus())) {
return success(notifyMessageService.getPageResultByRead(pageVO));
}
PageResult<NotifyMessageDO> pageResult = notifyMessageService.getMyMyNotifyMessagePage(pageVO,
loginUserId, UserTypeEnum.ADMIN.getValue());
public CommonResult<PageResult<NotifyMessageRespVO>> getMyMyNotifyMessagePage(@Valid NotifyMessagePageReqVO pageVO) {
pageVO.setUserId(getLoginUserId());
pageVO.setUserType(UserTypeEnum.ADMIN.getValue());
PageResult<NotifyMessageDO> pageResult = notifyMessageService.getMyMyNotifyMessagePage(pageVO);
PageResult<NotifyMessageRespVO> respVOPageResult = BeanUtils.toBean(pageResult, NotifyMessageRespVO.class);
Set<String> messageRead = notifyMessageService.getMessageRead(pageResult.getList().stream().map(e -> String.valueOf(e.getId())).collect(Collectors.toSet()), loginUserId);
respVOPageResult.getList().forEach(e->{
e.setReadStatus(messageRead.contains(e.getId().toString()));
});
return success(respVOPageResult);
}
@@ -89,19 +77,9 @@ public class NotifyMessageController {
return success(Boolean.TRUE);
}
@GetMapping("/get-unread-list")
@Operation(summary = "获取当前用户的最新站内信列表,默认 10 条")
@Parameter(name = "size", description = "10")
public CommonResult<List<NotifyMessageRespVO>> getUnreadNotifyMessageList(
@RequestParam(name = "size", defaultValue = "10") Integer size) {
List<NotifyMessageDO> list = notifyMessageService.getUnreadNotifyMessageList(
getLoginUserId(), UserTypeEnum.ADMIN.getValue(), size);
return success(BeanUtils.toBean(list, NotifyMessageRespVO.class));
}
@GetMapping("/get-unread-count")
@Operation(summary = "获得当前用户的未读站内信数量")
public CommonResult<Long> getUnreadNotifyMessageCount() {
public CommonResult<Integer> getUnreadNotifyMessageCount() {
return success(notifyMessageService.getUnreadNotifyMessageCount(
getLoginUserId(), UserTypeEnum.ADMIN.getValue()));
}
@@ -1,27 +0,0 @@
package com.cf.imes.module.system.controller.admin.notify.vo.message;
import com.cf.imes.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 站内信分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class NotifyMessageMyPageReqVO extends PageParam {
@Schema(description = "是否已读", example = "true")
private Boolean readStatus;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
@@ -33,4 +33,6 @@ public class NotifyMessagePageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "是否已读", example = "true")
private Boolean readStatus;
}
@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
import org.springframework.data.annotation.Transient;
import java.time.LocalDateTime;
import java.util.Map;
@@ -88,12 +89,14 @@ public class NotifyMessageDO extends BaseDO {
// ========= 读取相关字段 =========
/**
* 是否已读 现在这个状态存在redis中,所以先注释此字段
* 是否已读
*/
/*private Boolean readStatus;*/
@Transient
private Boolean readStatus;
/**
* 阅读时间
*/
@Transient
private LocalDateTime readTime;
}
@@ -0,0 +1,51 @@
package com.cf.imes.module.system.dal.dataobject.notify;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.time.LocalDateTime;
/**
* @author Gqr
* @since 2024/7/15 14:46
*/
@TableName(value = "system_notify_message_readinfo")
@KeySequence("system_notify_message_readinfo_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class NotifyMessageReadInfoDO {
/**
* 主键,自增
*/
@TableId
private Long id;
/**
* 组织id
*/
private Long organId;
/**
* 站内信消息id
*/
private Long messageId;
/**
* 阅读时间
*/
private LocalDateTime readTime;
/**
* 用户id
*/
private Long userId;
}
@@ -1,71 +1,40 @@
package com.cf.imes.module.system.dal.mysql.notify;
import com.cf.imes.framework.common.pojo.PageResult;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.query.QueryWrapperX;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO;
import com.cf.imes.module.system.dal.dataobject.notify.NotifyMessageDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
@Mapper
public interface NotifyMessageMapper extends BaseMapperX<NotifyMessageDO> {
/**
* 分页查询我的站内信
*
* @param page 分页信息
* @param pageReqVO 请求参数
* @return
*/
IPage<NotifyMessageDO> getMyMyNotifyMessage(@Param("page") IPage page, @Param("reqVo") NotifyMessagePageReqVO pageReqVO);
default PageResult<NotifyMessageDO> selectPage(NotifyMessagePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<NotifyMessageDO>()
.eqIfPresent(NotifyMessageDO::getUserId, reqVO.getUserId())
.eqIfPresent(NotifyMessageDO::getUserType, reqVO.getUserType())
.likeIfPresent(NotifyMessageDO::getTemplateCode, reqVO.getTemplateCode())
.eqIfPresent(NotifyMessageDO::getTemplateType, reqVO.getTemplateType())
.betweenIfPresent(NotifyMessageDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(NotifyMessageDO::getId));
}
default PageResult<NotifyMessageDO> selectPage(NotifyMessageMyPageReqVO reqVO, Long userId, Integer userType) {
return selectPage(reqVO, new LambdaQueryWrapperX<NotifyMessageDO>()
//.eqIfPresent(NotifyMessageDO::getReadStatus, reqVO.getReadStatus())
.betweenIfPresent(NotifyMessageDO::getCreateTime, reqVO.getCreateTime())
.in(NotifyMessageDO::getUserId, Arrays.asList(userId, 0L))
.eq(NotifyMessageDO::getUserType, userType)
.orderByDesc(NotifyMessageDO::getId));
}
default int updateListRead(Collection<Long> ids, Long userId, Integer userType) {
return update(new NotifyMessageDO().setReadTime(LocalDateTime.now()),
new LambdaQueryWrapperX<NotifyMessageDO>()
.in(NotifyMessageDO::getId, ids)
.eq(NotifyMessageDO::getUserId, userId)
.eq(NotifyMessageDO::getUserType, userType));
//.eq(NotifyMessageDO::getReadStatus, false));
}
default int updateListRead(Long userId, Integer userType) {
return update(new NotifyMessageDO().setReadTime(LocalDateTime.now()),
new LambdaQueryWrapperX<NotifyMessageDO>()
.eq(NotifyMessageDO::getUserId, userId)
.eq(NotifyMessageDO::getUserType, userType));
//.eq(NotifyMessageDO::getReadStatus, false));
}
default List<NotifyMessageDO> selectUnreadListByUserIdAndUserType(Long userId, Integer userType, Integer size) {
return selectList(new QueryWrapperX<NotifyMessageDO>() // 由于要使用 limitN 语句,所以只能用 QueryWrapperX
.in("user_id", Arrays.asList(userId, 0L))
.eq("user_type", userType)
.eq("read_status", false)
.orderByDesc("id").limitN(size));
}
default Long selectUnreadCountByUserIdAndUserType(Long userId, Integer userType) {
return selectCount(new LambdaQueryWrapperX<NotifyMessageDO>()
//.eq(NotifyMessageDO::getReadStatus, false)
.in(NotifyMessageDO::getUserId, Arrays.asList(userId, 0L))
.eq(NotifyMessageDO::getUserType, userType));
}
/**
* 统计未读消息数量
*
* @param userId 用户id
* @param userType 接受用户类型
* @return
*/
Integer getUnreadNotifyMessageCount(@Param("userId") Long userId, @Param("userType") Integer userType);
/**
* 获取未读消息id列表
*
* @param userId
* @param userType
* @return
*/
List<Long> getUnreadNotifyMessageIds(@Param("userId") Long userId, @Param("userType") Integer userType);
}
@@ -0,0 +1,9 @@
package com.cf.imes.module.system.dal.mysql.notify;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.module.system.dal.dataobject.notify.NotifyMessageReadInfoDO;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface NotifyMessageReadInfoMapper extends BaseMapperX<NotifyMessageReadInfoDO> {
}
@@ -0,0 +1,20 @@
package com.cf.imes.module.system.service.notify;
import java.time.LocalDateTime;
/**
* 站内信阅读信息 Service 接口
*
* @author Gqr
* @since 2024/7/15 15:28
*/
public interface NotifyMessageReadInfoService {
/**
* 获取任一站内信阅读信息
*
* @param messageId 消息id
* @param userId 用户id
* @return
*/
LocalDateTime getAny(Long messageId, Long userId);
}
@@ -0,0 +1,31 @@
package com.cf.imes.module.system.service.notify;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cf.imes.module.system.dal.dataobject.notify.NotifyMessageReadInfoDO;
import com.cf.imes.module.system.dal.mysql.notify.NotifyMessageReadInfoMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
/**
* @author Gqr
* @since 2024/7/15 15:29
*/
@Service
@Slf4j
public class NotifyMessageReadInfoServiceImpl implements NotifyMessageReadInfoService {
@Resource
private NotifyMessageReadInfoMapper notifyMessageReadInfoMapper;
@Override
public LocalDateTime getAny(Long messageId, Long userId) {
NotifyMessageReadInfoDO one = notifyMessageReadInfoMapper.selectOne(new LambdaQueryWrapper<NotifyMessageReadInfoDO>()
.eq(NotifyMessageReadInfoDO::getMessageId, messageId)
.eq(NotifyMessageReadInfoDO::getUserId, userId)
.select(NotifyMessageReadInfoDO::getReadTime));
return one != null ? one.getReadTime() : null;
}
}
@@ -1,16 +1,12 @@
package com.cf.imes.module.system.service.notify;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessageRespVO;
import com.cf.imes.module.system.dal.dataobject.notify.NotifyMessageDO;
import com.cf.imes.module.system.dal.dataobject.notify.NotifyTemplateDO;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 站内信 Service 接口
@@ -19,8 +15,6 @@ import java.util.Set;
*/
public interface NotifyMessageService {
String NOTIFY_MESSAGE_KEY = "notify-message:";
/**
* 创建站内信
*
@@ -34,23 +28,13 @@ public interface NotifyMessageService {
Long createNotifyMessage(Long userId, Integer userType,
NotifyTemplateDO template, String templateContent, Map<String, Object> templateParams);
/**
* 获得站内信分页
*
* @param pageReqVO 分页查询
* @return 站内信分页
*/
PageResult<NotifyMessageDO> getNotifyMessagePage(NotifyMessagePageReqVO pageReqVO);
/**
* 获得【我的】站内信分页
*
* @param pageReqVO 分页查询
* @param userId 用户编号
* @param userType 用户类型
* @return 站内信分页
*/
PageResult<NotifyMessageDO> getMyMyNotifyMessagePage(NotifyMessageMyPageReqVO pageReqVO, Long userId, Integer userType);
PageResult<NotifyMessageDO> getMyMyNotifyMessagePage(NotifyMessagePageReqVO pageReqVO);
/**
* 获得站内信
@@ -60,16 +44,6 @@ public interface NotifyMessageService {
*/
NotifyMessageDO getNotifyMessage(Long id);
/**
* 获得【我的】未读站内信列表
*
* @param userId 用户编号
* @param userType 用户类型
* @param size 数量
* @return 站内信列表
*/
List<NotifyMessageDO> getUnreadNotifyMessageList(Long userId, Integer userType, Integer size);
/**
* 统计用户未读站内信条数
*
@@ -77,7 +51,7 @@ public interface NotifyMessageService {
* @param userType 用户类型
* @return 返回未读站内信条数
*/
Long getUnreadNotifyMessageCount(Long userId, Integer userType);
Integer getUnreadNotifyMessageCount(Long userId, Integer userType);
/**
* 标记站内信为已读
@@ -97,19 +71,4 @@ public interface NotifyMessageService {
* @return 更新到的条数
*/
int updateAllNotifyMessageRead(Long userId, Integer userType);
/**
* 获取用户的站内信以读
* @param messageIds
* @param userId
* @return
*/
Set<String> getMessageRead(Collection<String> messageIds, Long userId);
/**
* 查询已读或未读站内信分页
* @param pageVO
* @return
*/
PageResult<NotifyMessageRespVO> getPageResultByRead(NotifyMessageMyPageReqVO pageVO);
}
@@ -1,27 +1,21 @@
package com.cf.imes.module.system.service.notify;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessageRespVO;
import com.cf.imes.module.system.dal.dataobject.notify.NotifyMessageDO;
import com.cf.imes.module.system.dal.dataobject.notify.NotifyMessageReadInfoDO;
import com.cf.imes.module.system.dal.dataobject.notify.NotifyTemplateDO;
import com.cf.imes.module.system.dal.mysql.notify.NotifyMessageMapper;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import com.cf.imes.module.system.dal.mysql.notify.NotifyMessageReadInfoMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* 站内信 Service 实现类
@@ -30,13 +24,14 @@ import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.ge
*/
@Service
@Validated
@Slf4j
public class NotifyMessageServiceImpl implements NotifyMessageService {
@Resource
private NotifyMessageMapper notifyMessageMapper;
@Resource
private StringRedisTemplate stringRedisTemplate;
private NotifyMessageReadInfoMapper notifyMessageReadInfoMapper;
@Override
public Long createNotifyMessage(Long userId, Integer userType,
@@ -50,13 +45,10 @@ public class NotifyMessageServiceImpl implements NotifyMessageService {
}
@Override
public PageResult<NotifyMessageDO> getNotifyMessagePage(NotifyMessagePageReqVO pageReqVO) {
return notifyMessageMapper.selectPage(pageReqVO);
}
@Override
public PageResult<NotifyMessageDO> getMyMyNotifyMessagePage(NotifyMessageMyPageReqVO pageReqVO, Long userId, Integer userType) {
return notifyMessageMapper.selectPage(pageReqVO, userId, userType);
public PageResult<NotifyMessageDO> getMyMyNotifyMessagePage(NotifyMessagePageReqVO pageReqVO) {
PageDTO page = new PageDTO(pageReqVO.getPageNo(), pageReqVO.getPageSize());
IPage<NotifyMessageDO> myMyNotifyMessage = notifyMessageMapper.getMyMyNotifyMessage(page, pageReqVO);
return new PageResult<>(myMyNotifyMessage.getRecords(), myMyNotifyMessage.getTotal());
}
@Override
@@ -65,104 +57,32 @@ public class NotifyMessageServiceImpl implements NotifyMessageService {
}
@Override
public List<NotifyMessageDO> getUnreadNotifyMessageList(Long userId, Integer userType, Integer size) {
return notifyMessageMapper.selectUnreadListByUserIdAndUserType(userId, userType, size);
}
@Override
public Long getUnreadNotifyMessageCount(Long userId, Integer userType) {
List<NotifyMessageDO> notifyMessageDOS = notifyMessageMapper.selectList(new LambdaQueryWrapperX<NotifyMessageDO>()
.eq(NotifyMessageDO::getUserType, userType)
.in(NotifyMessageDO::getUserId, Arrays.asList(userId, 0L))
.select(NotifyMessageDO::getId)
);
if(CollUtil.isEmpty(notifyMessageDOS)) {
return 0L;
}
Set<String> messageIds = notifyMessageDOS.stream().map(e->e.getId().toString()).collect(Collectors.toSet());
Set<String> set = bitGet(messageIds, userId);
messageIds.removeAll(set);
return (long) messageIds.size();
//return notifyMessageMapper.selectUnreadCountByUserIdAndUserType(userId, userType);
public Integer getUnreadNotifyMessageCount(Long userId, Integer userType) {
return notifyMessageMapper.getUnreadNotifyMessageCount(userId, userType);
}
@Override
public int updateNotifyMessageRead(Collection<Long> ids, Long userId, Integer userType) {
bitset(ids.stream().map(Object::toString).collect(Collectors.toSet()), userId);
List<NotifyMessageReadInfoDO> batchInsertReadInfoList = ids.stream().map(messageId -> NotifyMessageReadInfoDO.builder().messageId(messageId).userId(userId).build()).toList();
Boolean insertBatch = notifyMessageReadInfoMapper.insertBatch(batchInsertReadInfoList);
if (!insertBatch) {
log.error("[updateNotifyMessageRead][新增站内信消息阅读信息失败]");
return 0;
}
return 1;
//return notifyMessageMapper.updateListRead(ids, userId, userType);
}
@Override
public int updateAllNotifyMessageRead(Long userId, Integer userType) {
List<NotifyMessageDO> notifyMessageDOS = notifyMessageMapper.selectList(new LambdaQueryWrapperX<NotifyMessageDO>()
.in(NotifyMessageDO::getUserId, Arrays.asList(userId, 0))
.eq(NotifyMessageDO::getUserType, 2)
.select(NotifyMessageDO::getId)
);
if (CollUtil.isNotEmpty(notifyMessageDOS)) {
Set<String> messageIds = notifyMessageDOS.stream().map(e -> String.valueOf(e.getId())).collect(Collectors.toSet());
bitset(messageIds, userId);
List<Long> messageIds = notifyMessageMapper.getUnreadNotifyMessageIds(userId, userType);
if (CollUtil.isNotEmpty(messageIds)) {
List<NotifyMessageReadInfoDO> batchInsertReadInfoList = messageIds.stream().map(messageId -> NotifyMessageReadInfoDO.builder().messageId(messageId).userId(userId).build()).toList();
Boolean insertBatch = notifyMessageReadInfoMapper.insertBatch(batchInsertReadInfoList);
if (!insertBatch) {
log.error("[updateAllNotifyMessageRead][新增站内信消息阅读信息失败]");
return 0;
}
}
return 1;
//return notifyMessageMapper.updateListRead(userId, userType);
}
@Override
public Set<String> getMessageRead(Collection<String> messageIds, Long userId) {
return bitGet(messageIds,userId);
}
@Override
public PageResult<NotifyMessageRespVO> getPageResultByRead(NotifyMessageMyPageReqVO pageVO) {
Boolean readStatus = pageVO.getReadStatus();
Long userId = getLoginUserId();
List<NotifyMessageDO> notifyMessageDOS = notifyMessageMapper.selectList(new LambdaQueryWrapperX<NotifyMessageDO>()
.eq(NotifyMessageDO::getUserType, 2)
.in(NotifyMessageDO::getUserId, Arrays.asList(userId, 0L))
.betweenIfPresent(NotifyMessageDO::getCreateTime, pageVO.getCreateTime())
);
Set<String> messageIds = notifyMessageDOS.stream().map(e -> e.getId().toString()).collect(Collectors.toSet());
Set<String> set = bitGet(messageIds, userId);
List<NotifyMessageRespVO> respVOS = notifyMessageDOS.stream()
.filter(f -> readStatus ? set.contains(f.getId().toString()): !set.contains(f.getId().toString()))
.skip((long) (pageVO.getPageNo() - 1) * pageVO.getPageSize())
.limit(pageVO.getPageSize())
.map(e -> {
NotifyMessageRespVO respVO = BeanUtils.toBean(e, NotifyMessageRespVO.class);
respVO.setReadStatus(readStatus);
return respVO;
})
.toList();
return new PageResult<>(respVOS, (long)respVOS.size());
}
private Boolean bitset(Collection<String> keys, Long userId) {
return stringRedisTemplate.execute((RedisCallback<Boolean>) connection -> {
AtomicReference<Boolean> flag = new AtomicReference<>(false);
keys.forEach(key -> flag.set(connection.setBit(joinKey(key).getBytes(StandardCharsets.UTF_8), userId, true)));
return flag.get();
}
);
}
private Set<String> bitGet(Collection<String> keys, Long userId) {
return stringRedisTemplate.execute((RedisCallback<Set<String>>)connection -> {
Set<String> set = new HashSet<>();
keys.forEach(key->{
Boolean bit = connection.getBit(joinKey(key).getBytes(StandardCharsets.UTF_8), userId);
if(bit) {
set.add(key);
}
});
return set;
});
}
private String joinKey(String key) {
return NOTIFY_MESSAGE_KEY + key;
}
}
@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.cf.imes.module.system.dal.mysql.notify.NotifyMessageMapper">
<resultMap id="messageMap" type="com.cf.imes.module.system.dal.dataobject.notify.NotifyMessageDO">
<result property="templateParams" column="template_params" javaType="java.util.Map" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
</resultMap>
<select id="getMyMyNotifyMessage" resultMap="messageMap">
select distinct m.*,
coalesce(r.id is not null, true) as readStatus
, r.read_time readTime
from system_notify_message m
left join system_notify_message_readinfo r on r.message_id = m.id
<where>
<if test="reqVo.readStatus != null and reqVo.readStatus">
r.id is not null
</if>
<if test="reqVo.readStatus != null and !reqVo.readStatus">
r.id is null
</if>
<if test="reqVo.createTime != null">
and m.create_time between #{reqVo.createTime[0]} and #{reqVo.createTime[1]}
</if>
<if test="reqVo.userType != null">
and m.user_type = #{reqVo.userType}
</if>
<if test="reqVo.templateCode != null and reqVo.templateCode != ''">
and m.template_code = #{reqVo.templateCode}
</if>
<if test="reqVo.templateType != null">
and m.template_type = #{reqVo.templateType}
</if>
and m.user_id in (#{reqVo.userId},0)
</where>
order by m.id desc
</select>
<select id="getUnreadNotifyMessageCount" resultType="java.lang.Integer">
select count(distinct m.id)
from system_notify_message m
left join system_notify_message_readinfo r on r.message_id = m.id
where r.id is null
and m.user_id in (#{userId}, 0)
and m.user_type = #{userType}
</select>
<select id="getUnreadNotifyMessageIds" resultType="java.lang.Long">
select m.id
from system_notify_message m
left join system_notify_message_readinfo r on r.message_id = m.id
where r.id is null
and m.user_id in (#{userId}, 0)
and m.user_type = #{userType}
</select>
</mapper>
@@ -5,7 +5,6 @@ import com.cf.imes.framework.common.enums.UserTypeEnum;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.enums.SqlConstants;
import com.cf.imes.framework.test.core.ut.BaseDbUnitTest;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessageMyPageReqVO;
import com.cf.imes.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO;
import com.cf.imes.module.system.dal.dataobject.notify.NotifyMessageDO;
import com.cf.imes.module.system.dal.dataobject.notify.NotifyTemplateDO;
@@ -17,7 +16,6 @@ import org.springframework.context.annotation.Import;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import static cn.hutool.core.util.RandomUtil.randomEle;
@@ -101,7 +99,7 @@ public class NotifyMessageServiceImplTest extends BaseDbUnitTest {
reqVO.setCreateTime(buildBetweenTime(2022, 1, 1, 2022, 1, 10));
// 调用
PageResult<NotifyMessageDO> pageResult = notifyMessageService.getNotifyMessagePage(reqVO);
PageResult<NotifyMessageDO> pageResult = notifyMessageService.getMyMyNotifyMessagePage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
@@ -144,12 +142,14 @@ public class NotifyMessageServiceImplTest extends BaseDbUnitTest {
// 准备参数
Long userId = 1L;
Integer userType = UserTypeEnum.ADMIN.getValue();
NotifyMessageMyPageReqVO reqVO = new NotifyMessageMyPageReqVO();
NotifyMessagePageReqVO reqVO = new NotifyMessagePageReqVO();
reqVO.setReadStatus(true);
reqVO.setCreateTime(buildBetweenTime(2022, 1, 1, 2022, 1, 10));
reqVO.setUserId(userId);
reqVO.setUserType(userType);
// 调用
PageResult<NotifyMessageDO> pageResult = notifyMessageService.getMyMyNotifyMessagePage(reqVO, userId, userType);
PageResult<NotifyMessageDO> pageResult = notifyMessageService.getMyMyNotifyMessagePage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
@@ -163,7 +163,6 @@ public class NotifyMessageServiceImplTest extends BaseDbUnitTest {
NotifyMessageDO dbNotifyMessage = randomPojo(NotifyMessageDO.class, o -> { // 等会查询到
o.setUserId(1L);
o.setUserType(UserTypeEnum.ADMIN.getValue());
//o.setReadStatus(false);
o.setTemplateParams(randomTemplateParams());
});
notifyMessageMapper.insert(dbNotifyMessage);
@@ -176,13 +175,17 @@ public class NotifyMessageServiceImplTest extends BaseDbUnitTest {
// 准备参数
Long userId = 1L;
Integer userType = UserTypeEnum.ADMIN.getValue();
Integer size = 10;
NotifyMessagePageReqVO reqVO = new NotifyMessagePageReqVO();
reqVO.setReadStatus(false);
reqVO.setPageSize(10);
reqVO.setPageNo(1);
reqVO.setUserId(userId);
reqVO.setUserType(userType);
// 调用
List<NotifyMessageDO> list = notifyMessageService.getUnreadNotifyMessageList(userId, userType, size);
PageResult<NotifyMessageDO> pageResult = notifyMessageService.getMyMyNotifyMessagePage(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbNotifyMessage, list.get(0));
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbNotifyMessage, pageResult.getList().get(0));
}
@Test