Commit af4290784e852ba0f673e848af75955f03eca7c4
1 parent
d16f8735
添加用户查询站内信分页列表数据,未读站内信数量。
Showing
6 changed files
with
99 additions
and
7 deletions
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
| ... | ... | @@ -145,6 +145,7 @@ public interface ErrorCodeConstants { |
| 145 | 145 | // ========== 站内信模版 1002023000 ========== |
| 146 | 146 | ErrorCode NOTIFY_TEMPLATE_NOT_EXISTS = new ErrorCode(1002023000, "站内信模版不存在"); |
| 147 | 147 | ErrorCode NOTIFY_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1002023001, "已经存在编码为【{}】的站内信模板"); |
| 148 | + ErrorCode NOTIFY_TEMPLATE_PARAM_MISS = new ErrorCode(1002023002, "模板参数({})缺失"); | |
| 148 | 149 | |
| 149 | 150 | // ========== 站内信 1002024000 ========== |
| 150 | 151 | ErrorCode NOTIFY_MESSAGE_NOT_EXISTS = new ErrorCode(1002024000, "站内信不存在"); | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notify/UserNotifyMessageController.java
| 1 | 1 | package cn.iocoder.yudao.module.system.controller.admin.notify; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 4 | +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | |
| 3 | 5 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | 7 | import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO; |
| ... | ... | @@ -23,6 +25,7 @@ import java.util.Collections; |
| 23 | 25 | import java.util.List; |
| 24 | 26 | |
| 25 | 27 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 28 | +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | |
| 26 | 29 | |
| 27 | 30 | /** |
| 28 | 31 | * 管理后台 - 站内信-消息中心 |
| ... | ... | @@ -42,6 +45,8 @@ public class UserNotifyMessageController { |
| 42 | 45 | @GetMapping("/page") |
| 43 | 46 | @ApiOperation("获得站内信分页") |
| 44 | 47 | public CommonResult<PageResult<NotifyMessageRespVO>> getNotifyMessagePage(@Valid NotifyMessagePageReqVO pageVO) { |
| 48 | + pageVO.setUserId(getLoginUserId()); | |
| 49 | + pageVO.setUserType(UserTypeEnum.ADMIN.getValue()); | |
| 45 | 50 | PageResult<NotifyMessageDO> pageResult = notifyMessageService.getNotifyMessagePage(pageVO); |
| 46 | 51 | return success(NotifyMessageConvert.INSTANCE.convertPage(pageResult)); |
| 47 | 52 | } |
| ... | ... | @@ -49,13 +54,22 @@ public class UserNotifyMessageController { |
| 49 | 54 | @GetMapping("/latest/list") |
| 50 | 55 | @ApiOperation("获得最新10站内信列表") |
| 51 | 56 | public CommonResult<List<NotifyMessageRespVO>> getNotifyLatestMessageList() { |
| 57 | + NotifyMessagePageReqVO reqVO = new NotifyMessagePageReqVO(); | |
| 58 | + reqVO.setUserId(getLoginUserId()); | |
| 59 | + reqVO.setUserType(UserTypeEnum.ADMIN.getValue()); | |
| 60 | + reqVO.setPageNo(1); | |
| 61 | + reqVO.setPageSize(10); | |
| 62 | + PageResult<NotifyMessageDO> pageResult = notifyMessageService.getNotifyMessagePage(reqVO); | |
| 63 | + if (CollUtil.isNotEmpty(pageResult.getList())) { | |
| 64 | + return success(NotifyMessageConvert.INSTANCE.convertList(pageResult.getList())); | |
| 65 | + } | |
| 52 | 66 | return success(Collections.emptyList()); |
| 53 | 67 | } |
| 54 | 68 | |
| 55 | 69 | @GetMapping("/unread/count") |
| 56 | 70 | @ApiOperation("获得未读站内信数量") |
| 57 | 71 | public CommonResult<Long> getUnreadNotifyMessageCount() { |
| 58 | - return success(1L); | |
| 72 | + return success(notifyMessageService.getUnreadNotifyMessageCount(getLoginUserId(), UserTypeEnum.ADMIN.getValue())); | |
| 59 | 73 | } |
| 60 | 74 | |
| 61 | 75 | @GetMapping("/read") | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/notify/vo/message/NotifyMessagePageReqVO.java
| ... | ... | @@ -24,4 +24,10 @@ public class NotifyMessagePageReqVO extends PageParam { |
| 24 | 24 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 25 | 25 | private Date[] createTime; |
| 26 | 26 | |
| 27 | + | |
| 28 | + @ApiModelProperty(value = "用户编号", hidden = true) | |
| 29 | + private Long userId; | |
| 30 | + | |
| 31 | + @ApiModelProperty(value = "用户类型", hidden = true) | |
| 32 | + private Integer userType; | |
| 27 | 33 | } | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/notify/NotifyMessageMapper.java
| 1 | 1 | package cn.iocoder.yudao.module.system.dal.mysql.notify; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | |
| 5 | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | |
| 6 | 6 | import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO; |
| 7 | 7 | import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyMessageDO; |
| 8 | +import cn.iocoder.yudao.module.system.enums.notify.NotifyReadStatusEnum; | |
| 8 | 9 | import org.apache.ibatis.annotations.Mapper; |
| 9 | 10 | |
| 11 | +import java.util.List; | |
| 12 | + | |
| 10 | 13 | /** |
| 11 | 14 | * 站内信 Mapper |
| 12 | 15 | * |
| ... | ... | @@ -20,6 +23,15 @@ public interface NotifyMessageMapper extends BaseMapperX<NotifyMessageDO> { |
| 20 | 23 | .likeIfPresent(NotifyMessageDO::getTitle, reqVO.getTitle()) |
| 21 | 24 | .eqIfPresent(NotifyMessageDO::getReadStatus, reqVO.getReadStatus()) |
| 22 | 25 | .betweenIfPresent(NotifyMessageDO::getCreateTime, reqVO.getCreateTime()) |
| 26 | + .eqIfPresent(NotifyMessageDO::getUserId, reqVO.getUserId()) | |
| 27 | + .eqIfPresent(NotifyMessageDO::getUserType, reqVO.getUserType()) | |
| 23 | 28 | .orderByDesc(NotifyMessageDO::getId)); |
| 24 | 29 | } |
| 30 | + | |
| 31 | + default Long selectUnreadCountByUserIdAndUserType(Long userId, Integer userType) { | |
| 32 | + return selectCount(new LambdaQueryWrapperX<NotifyMessageDO>() | |
| 33 | + .eq(NotifyMessageDO::getReadStatus, NotifyReadStatusEnum.UNREAD.getStatus()) | |
| 34 | + .eq(NotifyMessageDO::getUserId, userId) | |
| 35 | + .eq(NotifyMessageDO::getUserType, userType)); | |
| 36 | + } | |
| 25 | 37 | } | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notify/NotifyMessageService.java
| 1 | 1 | package cn.iocoder.yudao.module.system.service.notify; |
| 2 | 2 | |
| 3 | -import java.util.*; | |
| 4 | -import javax.validation.*; | |
| 5 | - | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 6 | 4 | import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessageCreateReqVO; |
| 7 | 5 | import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO; |
| 8 | 6 | import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessageUpdateReqVO; |
| 9 | 7 | import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyMessageDO; |
| 10 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 8 | + | |
| 9 | +import javax.validation.Valid; | |
| 10 | +import java.util.Collection; | |
| 11 | +import java.util.List; | |
| 11 | 12 | |
| 12 | 13 | /** |
| 13 | 14 | * 站内信 Service 接口 |
| ... | ... | @@ -62,4 +63,12 @@ public interface NotifyMessageService { |
| 62 | 63 | */ |
| 63 | 64 | PageResult<NotifyMessageDO> getNotifyMessagePage(NotifyMessagePageReqVO pageReqVO); |
| 64 | 65 | |
| 66 | + /** | |
| 67 | + * 统计用户未读站内信条数 | |
| 68 | + * | |
| 69 | + * @param userId 用户ID | |
| 70 | + * @param userType 用户类型 | |
| 71 | + * @return 返回未读站内信条数 | |
| 72 | + */ | |
| 73 | + Long getUnreadNotifyMessageCount(Long userId, Integer userType); | |
| 65 | 74 | } | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/notify/NotifyMessageServiceImpl.java
| 1 | 1 | package cn.iocoder.yudao.module.system.service.notify; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.framework.common.core.KeyValue; | |
| 3 | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 5 | import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessageCreateReqVO; |
| 5 | 6 | import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessagePageReqVO; |
| 6 | 7 | import cn.iocoder.yudao.module.system.controller.admin.notify.vo.message.NotifyMessageUpdateReqVO; |
| 7 | 8 | import cn.iocoder.yudao.module.system.convert.notify.NotifyMessageConvert; |
| 8 | 9 | import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyMessageDO; |
| 10 | +import cn.iocoder.yudao.module.system.dal.dataobject.notify.NotifyTemplateDO; | |
| 9 | 11 | import cn.iocoder.yudao.module.system.dal.mysql.notify.NotifyMessageMapper; |
| 12 | +import com.google.common.annotations.VisibleForTesting; | |
| 10 | 13 | import org.springframework.stereotype.Service; |
| 11 | 14 | import org.springframework.validation.annotation.Validated; |
| 12 | 15 | |
| 13 | 16 | import javax.annotation.Resource; |
| 14 | 17 | import java.util.Collection; |
| 15 | 18 | import java.util.List; |
| 19 | +import java.util.Map; | |
| 20 | +import java.util.stream.Collectors; | |
| 16 | 21 | |
| 17 | 22 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 18 | -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.NOTIFY_MESSAGE_NOT_EXISTS; | |
| 23 | +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; | |
| 19 | 24 | |
| 20 | 25 | /** |
| 21 | 26 | * 站内信 Service 实现类 |
| ... | ... | @@ -29,6 +34,39 @@ public class NotifyMessageServiceImpl implements NotifyMessageService { |
| 29 | 34 | @Resource |
| 30 | 35 | private NotifyMessageMapper notifyMessageMapper; |
| 31 | 36 | |
| 37 | + @Resource | |
| 38 | + private NotifyTemplateService notifyTemplateService; | |
| 39 | + | |
| 40 | + | |
| 41 | + @VisibleForTesting | |
| 42 | + public NotifyTemplateDO checkNotifyTemplateValid(String templateCode) { | |
| 43 | + // 获得站内信模板。考虑到效率,从缓存中获取 | |
| 44 | + NotifyTemplateDO template = notifyTemplateService.getNotifyTemplateByCodeFromCache(templateCode); | |
| 45 | + // 站内信模板不存在 | |
| 46 | + if (template == null) { | |
| 47 | + throw exception(NOTIFY_TEMPLATE_NOT_EXISTS); | |
| 48 | + } | |
| 49 | + return template; | |
| 50 | + } | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * 将参数模板,处理成有序的 KeyValue 数组 | |
| 54 | + * | |
| 55 | + * @param template 站内信模板 | |
| 56 | + * @param templateParams 原始参数 | |
| 57 | + * @return 处理后的参数 | |
| 58 | + */ | |
| 59 | + @VisibleForTesting | |
| 60 | + public List<KeyValue<String, Object>> buildTemplateParams(NotifyTemplateDO template, Map<String, Object> templateParams) { | |
| 61 | + return template.getParams().stream().map(key -> { | |
| 62 | + Object value = templateParams.get(key); | |
| 63 | + if (value == null) { | |
| 64 | + throw exception(NOTIFY_TEMPLATE_PARAM_MISS, key); | |
| 65 | + } | |
| 66 | + return new KeyValue<>(key, value); | |
| 67 | + }).collect(Collectors.toList()); | |
| 68 | + } | |
| 69 | + | |
| 32 | 70 | @Override |
| 33 | 71 | public Long createNotifyMessage(NotifyMessageCreateReqVO createReqVO) { |
| 34 | 72 | // 插入 |
| ... | ... | @@ -75,4 +113,16 @@ public class NotifyMessageServiceImpl implements NotifyMessageService { |
| 75 | 113 | public PageResult<NotifyMessageDO> getNotifyMessagePage(NotifyMessagePageReqVO pageReqVO) { |
| 76 | 114 | return notifyMessageMapper.selectPage(pageReqVO); |
| 77 | 115 | } |
| 116 | + | |
| 117 | + /** | |
| 118 | + * 统计用户未读站内信条数 | |
| 119 | + * | |
| 120 | + * @param userId 用户ID | |
| 121 | + * @param userType 用户类型 | |
| 122 | + * @return 返回未读站内信条数 | |
| 123 | + */ | |
| 124 | + @Override | |
| 125 | + public Long getUnreadNotifyMessageCount(Long userId, Integer userType) { | |
| 126 | + return notifyMessageMapper.selectUnreadCountByUserIdAndUserType(userId, userType); | |
| 127 | + } | |
| 78 | 128 | } | ... | ... |