From 02321fbcb2b8a8e2f034be7873552e361958d4ad Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Sun, 3 Nov 2024 18:56:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B6=88=E6=81=AF=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/dto/system/message/MessageAddDto.java | 5 +- .../dto/system/message/MessageUpdateDto.java | 10 +- .../cn/bunny/dao/entity/system/Message.java | 3 - .../dao/entity/system/MessageReceived.java | 3 + .../dao/vo/system/message/MessageUserVo.java | 10 +- .../dao/vo/system/message/MessageVo.java | 21 ++- .../controller/MessageController.java | 30 +--- .../controller/MessageReceivedController.java | 29 ++- .../bunny/services/mapper/MessageMapper.java | 2 +- .../mapper/MessageReceivedMapper.java | 14 +- .../service/MessageReceivedService.java | 24 +++ .../services/service/MessageService.java | 24 --- .../impl/MessageReceivedServiceImpl.java | 151 +++++++++++++++- .../service/impl/MessageServiceImpl.java | 170 +++--------------- .../main/resources/mapper/MessageMapper.xml | 88 +++++---- .../mapper/MessageReceivedMapper.xml | 12 +- 16 files changed, 310 insertions(+), 286 deletions(-) diff --git a/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageAddDto.java b/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageAddDto.java index 88f6389..7dc7e0b 100644 --- a/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageAddDto.java +++ b/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageAddDto.java @@ -28,10 +28,9 @@ public class MessageAddDto { @Schema(name = "sendUserId", title = "发送人用户ID") private Long sendUserId; - @Schema(name = "messageType", title = "消息类型") - @NotBlank(message = "消息类型 不能为空") + @Schema(name = "messageTypeId", title = "消息类型") @NotNull(message = "消息类型 不能为空") - private String messageType; + private Long messageTypeId; @Schema(name = "cover", title = "封面") private String cover; diff --git a/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageUpdateDto.java b/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageUpdateDto.java index 48a858e..9a957ca 100644 --- a/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageUpdateDto.java +++ b/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageUpdateDto.java @@ -26,17 +26,19 @@ public class MessageUpdateDto { @NotBlank(message = "消息标题 不能为空") private String title; - @Schema(name = "receivedUserIds", title = "接收人用户ID") + @Schema(name = "receivedUserId", title = "接收人用户ID") + private Long receivedUserId; + + @Schema(name = "receivedUserIds", title = "接收人用户ID列表") private List receivedUserIds; @Schema(name = "sendUserId", title = "发送人用户ID") @NotNull(message = "发送人用户ID 不能为空") private Long sendUserId; - @Schema(name = "messageType", title = "消息类型") - @NotBlank(message = "消息类型 不能为空") + @Schema(name = "messageTypeId", title = "消息类型") @NotNull(message = "消息类型 不能为空") - private String messageType; + private Long messageTypeId; @Schema(name = "cover", title = "封面") private String cover; diff --git a/dao/src/main/java/cn/bunny/dao/entity/system/Message.java b/dao/src/main/java/cn/bunny/dao/entity/system/Message.java index ad351a4..6164a69 100644 --- a/dao/src/main/java/cn/bunny/dao/entity/system/Message.java +++ b/dao/src/main/java/cn/bunny/dao/entity/system/Message.java @@ -43,9 +43,6 @@ public class Message extends BaseEntity { @Schema(name = "editorType", title = "编辑器类型") private String editorType; - @Schema(name = "status", title = "0:未读 1:已读") - private Boolean status; - @Schema(name = "level", title = "消息等级") private String level; diff --git a/dao/src/main/java/cn/bunny/dao/entity/system/MessageReceived.java b/dao/src/main/java/cn/bunny/dao/entity/system/MessageReceived.java index 5e4f078..5e830bc 100644 --- a/dao/src/main/java/cn/bunny/dao/entity/system/MessageReceived.java +++ b/dao/src/main/java/cn/bunny/dao/entity/system/MessageReceived.java @@ -28,4 +28,7 @@ public class MessageReceived extends BaseEntity { @Schema(name = "messageId", title = "消息ID") private Long messageId; + @Schema(name = "status", title = "0:未读 1:已读") + private Boolean status; + } diff --git a/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageUserVo.java b/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageUserVo.java index 22605de..b7a2f9c 100644 --- a/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageUserVo.java +++ b/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageUserVo.java @@ -22,16 +22,20 @@ import java.time.LocalDateTime; @Schema(name = "MessageVo对象", title = "系统消息返回内容", description = "系统消息返回内容") public class MessageUserVo extends BaseVo { - @Schema(name = "id", title = "主键") - @JsonProperty("id") + @Schema(name = "id", title = "消息messageId") @JsonFormat(shape = JsonFormat.Shape.STRING) @JSONField(serializeUsing = ToStringSerializer.class) private Long id; + @Schema(name = "messageReceivedId", title = "用户消息表id") + @JsonFormat(shape = JsonFormat.Shape.STRING) + @JSONField(serializeUsing = ToStringSerializer.class) + private Long messageReceivedId; + @Schema(name = "title", title = "消息标题") private String title; - @Schema(name = "messageType", title = "sys:系统消息,user用户消息") + @Schema(name = "messageType", title = "消息类型") private String messageType; @Schema(name = "cover", title = "封面") diff --git a/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageVo.java b/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageVo.java index ab60851..504ac1e 100644 --- a/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageVo.java +++ b/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageVo.java @@ -3,12 +3,11 @@ package cn.bunny.dao.vo.system.message; import cn.bunny.dao.common.vo.BaseUserVo; import com.alibaba.fastjson2.annotation.JSONField; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; -import java.util.List; - @EqualsAndHashCode(callSuper = true) @Data @AllArgsConstructor @@ -17,6 +16,12 @@ import java.util.List; @Schema(name = "MessageVo对象", title = "系统消息返回内容", description = "系统消息返回内容") public class MessageVo extends BaseUserVo { + @Schema(name = "messageReceivedId", title = "用户消息表id") + @JsonProperty("id") + @JsonFormat(shape = JsonFormat.Shape.STRING) + @JSONField(serializeUsing = ToStringSerializer.class) + private Long messageReceivedId; + @Schema(name = "title", title = "消息标题") private String title; @@ -28,10 +33,16 @@ public class MessageVo extends BaseUserVo { @Schema(name = "sendNickname", title = "发送人昵称") private String sendNickname; - @Schema(name = "receivedUserIds", title = "接收人用户ID") - private List receivedUserIds; + @Schema(name = "receivedUserId", title = "接收人用户ID") + private String receivedUserId; - @Schema(name = "messageType", title = "sys:系统消息,user用户消息") + @Schema(name = "receivedUserNickname", title = "接收人用户昵称") + private String receivedUserNickname; + + @Schema(name = "messageTypeId", title = "消息类型id") + private String messageTypeId; + + @Schema(name = "messageType", title = "消息类型") private String messageType; @Schema(name = "cover", title = "封面") diff --git a/service/src/main/java/cn/bunny/services/controller/MessageController.java b/service/src/main/java/cn/bunny/services/controller/MessageController.java index 0412d09..7e25832 100644 --- a/service/src/main/java/cn/bunny/services/controller/MessageController.java +++ b/service/src/main/java/cn/bunny/services/controller/MessageController.java @@ -1,8 +1,6 @@ package cn.bunny.services.controller; -import cn.bunny.dao.dto.system.message.MessageAddDto; import cn.bunny.dao.dto.system.message.MessageDto; -import cn.bunny.dao.dto.system.message.MessageUpdateDto; import cn.bunny.dao.dto.system.message.MessageUserDto; import cn.bunny.dao.entity.system.Message; import cn.bunny.dao.pojo.result.PageResult; @@ -15,7 +13,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Mono; @@ -52,7 +49,7 @@ public class MessageController { } @Operation(summary = "分页查询用户消息", description = "分页查询用户消息") - @GetMapping("/noManage/getUserMessageList/{page}/{limit}") + @GetMapping("noManage/getUserMessageList/{page}/{limit}") public Mono>> getUserMessageList( @Parameter(name = "page", description = "当前页", required = true) @PathVariable("page") Integer page, @@ -65,33 +62,12 @@ public class MessageController { } @Operation(summary = "根据消息id查询消息详情", description = "根据消息id查询消息详情") - @GetMapping("/noManage/getMessageDetailById") + @GetMapping("noManage/getMessageDetailById") public Mono> getMessageDetailById(Long id) { MessageVo vo = messageService.getMessageDetailById(id); return Mono.just(Result.success(vo)); } - @Operation(summary = "添加系统消息", description = "添加系统消息") - @PostMapping("addMessage") - public Mono> addMessage(@Valid @RequestBody MessageAddDto dto) { - messageService.addMessage(dto); - return Mono.just(Result.success(ResultCodeEnum.ADD_SUCCESS)); - } - - @Operation(summary = "更新系统消息", description = "更新系统消息") - @PutMapping("updateMessage") - public Mono> updateMessage(@Valid @RequestBody MessageUpdateDto dto) { - messageService.updateMessage(dto); - return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS)); - } - - @Operation(summary = "用户将消息标为已读", description = "用户将消息标为已读") - @PutMapping("/noManage/updateUserMarkAsRead") - public Mono> updateUserMarkAsRead(@Valid @RequestBody List ids) { - messageService.updateUserMarkAsRead(ids); - return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS)); - } - @Operation(summary = "删除系统消息", description = "删除系统消息") @DeleteMapping("deleteMessage") public Mono> deleteMessage(@RequestBody List ids) { @@ -100,7 +76,7 @@ public class MessageController { } @Operation(summary = "用户删除消息", description = "用户删除消息") - @DeleteMapping("/noManage/deleteUserMessageByIds") + @DeleteMapping("noManage/deleteUserMessageByIds") public Mono> deleteUserMessageByIds(@RequestBody List ids) { messageService.deleteUserMessageByIds(ids); return Mono.just(Result.success(ResultCodeEnum.DELETE_SUCCESS)); diff --git a/service/src/main/java/cn/bunny/services/controller/MessageReceivedController.java b/service/src/main/java/cn/bunny/services/controller/MessageReceivedController.java index 9cc09d3..26259ce 100644 --- a/service/src/main/java/cn/bunny/services/controller/MessageReceivedController.java +++ b/service/src/main/java/cn/bunny/services/controller/MessageReceivedController.java @@ -1,14 +1,16 @@ package cn.bunny.services.controller; +import cn.bunny.dao.dto.system.message.MessageAddDto; +import cn.bunny.dao.dto.system.message.MessageUpdateDto; import cn.bunny.dao.pojo.result.Result; +import cn.bunny.dao.pojo.result.ResultCodeEnum; import cn.bunny.dao.vo.system.message.MessageReceivedWithUserVo; import cn.bunny.services.service.MessageReceivedService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Mono; import java.util.List; @@ -35,4 +37,25 @@ public class MessageReceivedController { List voList = messageReceivedService.getReceivedUserinfoByMessageId(messageId); return Mono.just(Result.success(voList)); } + + @Operation(summary = "添加系统消息", description = "添加系统消息") + @PostMapping("addMessage") + public Mono> addMessage(@Valid @RequestBody MessageAddDto dto) { + messageReceivedService.addMessage(dto); + return Mono.just(Result.success(ResultCodeEnum.ADD_SUCCESS)); + } + + @Operation(summary = "更新系统消息", description = "更新系统消息") + @PutMapping("updateMessage") + public Mono> updateMessage(@Valid @RequestBody MessageUpdateDto dto) { + messageReceivedService.updateMessage(dto); + return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS)); + } + + @Operation(summary = "用户将消息标为已读", description = "用户将消息标为已读") + @PutMapping("noManage/updateUserMarkAsRead") + public Mono> updateUserMarkAsRead(@Valid @RequestBody List ids) { + messageReceivedService.updateUserMarkAsRead(ids); + return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS)); + } } diff --git a/service/src/main/java/cn/bunny/services/mapper/MessageMapper.java b/service/src/main/java/cn/bunny/services/mapper/MessageMapper.java index 873e179..7b69e53 100644 --- a/service/src/main/java/cn/bunny/services/mapper/MessageMapper.java +++ b/service/src/main/java/cn/bunny/services/mapper/MessageMapper.java @@ -46,7 +46,7 @@ public interface MessageMapper extends BaseMapper { * @param dto 系统消息查询表单 * @return 系统消息分页结果 */ - IPage selectListByPageWithMessageUserDto(@Param("page") Page pageParams, @Param("dto") MessageUserDto dto, @Param("messageIds") List messageIds); + IPage selectListByPageWithMessageUserDto(@Param("page") Page pageParams, @Param("dto") MessageUserDto dto, @Param("userId") Long userId); /** * 根据消息id查询消息详情 diff --git a/service/src/main/java/cn/bunny/services/mapper/MessageReceivedMapper.java b/service/src/main/java/cn/bunny/services/mapper/MessageReceivedMapper.java index 37bcbb3..328e515 100644 --- a/service/src/main/java/cn/bunny/services/mapper/MessageReceivedMapper.java +++ b/service/src/main/java/cn/bunny/services/mapper/MessageReceivedMapper.java @@ -19,32 +19,24 @@ import java.util.List; public interface MessageReceivedMapper extends BaseMapper { /** - * 根据发送者id批量删除消息接受者 + * 根据id批量删除 * * @param userIds 发送用户ID */ void deleteBatchIdsWithPhysics(List userIds); /** - * 根据消息Id物理删除接受者消息 + * 根据消息Id物理删除 * * @param ids 消息id */ void deleteBatchIdsByMessageIdsWithPhysics(List ids); /** - * 根据发送者id批量删除消息接受者 + * 根据发送者id批量删除 * * @param messageId 消息id * @return 消息接收人用户名等信息 */ List selectUserinfoListByMessageId(Long messageId); - - /** - * 根据当前用户id删除消息接受表中数据 - * - * @param ids 消息列表 - * @param userId 用户id - */ - void deleteBatchIdsByMessageIdsAndUserIdWithPhysics(List ids, Long userId); } diff --git a/service/src/main/java/cn/bunny/services/service/MessageReceivedService.java b/service/src/main/java/cn/bunny/services/service/MessageReceivedService.java index 6ee77b0..10945dc 100644 --- a/service/src/main/java/cn/bunny/services/service/MessageReceivedService.java +++ b/service/src/main/java/cn/bunny/services/service/MessageReceivedService.java @@ -1,8 +1,11 @@ package cn.bunny.services.service; +import cn.bunny.dao.dto.system.message.MessageAddDto; +import cn.bunny.dao.dto.system.message.MessageUpdateDto; import cn.bunny.dao.entity.system.MessageReceived; import cn.bunny.dao.vo.system.message.MessageReceivedWithUserVo; import com.baomidou.mybatisplus.extension.service.IService; +import jakarta.validation.Valid; import java.util.List; @@ -30,4 +33,25 @@ public interface MessageReceivedService extends IService { * @return 消息接收人用户名等信息 */ List getReceivedUserinfoByMessageId(Long messageId); + + /** + * * 添加系统消息 + * + * @param dto 添加表单 + */ + void addMessage(@Valid MessageAddDto dto); + + /** + * 用户将消息标为已读 + * + * @param ids 消息id列表 + */ + void updateUserMarkAsRead(List ids); + + /** + * * 更新系统消息 + * + * @param dto 更新表单 + */ + void updateMessage(@Valid MessageUpdateDto dto); } diff --git a/service/src/main/java/cn/bunny/services/service/MessageService.java b/service/src/main/java/cn/bunny/services/service/MessageService.java index 32fb4e4..ae75ea3 100644 --- a/service/src/main/java/cn/bunny/services/service/MessageService.java +++ b/service/src/main/java/cn/bunny/services/service/MessageService.java @@ -1,8 +1,6 @@ package cn.bunny.services.service; -import cn.bunny.dao.dto.system.message.MessageAddDto; import cn.bunny.dao.dto.system.message.MessageDto; -import cn.bunny.dao.dto.system.message.MessageUpdateDto; import cn.bunny.dao.dto.system.message.MessageUserDto; import cn.bunny.dao.entity.system.Message; import cn.bunny.dao.pojo.result.PageResult; @@ -10,7 +8,6 @@ import cn.bunny.dao.vo.system.message.MessageUserVo; import cn.bunny.dao.vo.system.message.MessageVo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import jakarta.validation.Valid; import java.util.List; @@ -31,20 +28,6 @@ public interface MessageService extends IService { */ PageResult getMessageList(Page pageParams, MessageDto dto); - /** - * * 添加系统消息 - * - * @param dto 添加表单 - */ - void addMessage(@Valid MessageAddDto dto); - - /** - * * 更新系统消息 - * - * @param dto 更新表单 - */ - void updateMessage(@Valid MessageUpdateDto dto); - /** * * 删除|批量删除系统消息类型 * @@ -69,13 +52,6 @@ public interface MessageService extends IService { */ MessageVo getMessageDetailById(Long id); - /** - * 用户将消息标为已读 - * - * @param ids 消息id列表 - */ - void updateUserMarkAsRead(List ids); - /** * 用户删除消息 * diff --git a/service/src/main/java/cn/bunny/services/service/impl/MessageReceivedServiceImpl.java b/service/src/main/java/cn/bunny/services/service/impl/MessageReceivedServiceImpl.java index 01b3382..5d7d548 100644 --- a/service/src/main/java/cn/bunny/services/service/impl/MessageReceivedServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/impl/MessageReceivedServiceImpl.java @@ -1,12 +1,23 @@ package cn.bunny.services.service.impl; +import cn.bunny.common.service.context.BaseContext; import cn.bunny.common.service.exception.BunnyException; +import cn.bunny.dao.common.entity.BaseEntity; +import cn.bunny.dao.dto.system.message.MessageAddDto; +import cn.bunny.dao.dto.system.message.MessageUpdateDto; +import cn.bunny.dao.entity.system.Message; import cn.bunny.dao.entity.system.MessageReceived; import cn.bunny.dao.pojo.result.ResultCodeEnum; import cn.bunny.dao.vo.system.message.MessageReceivedWithUserVo; +import cn.bunny.services.factory.UserFactory; +import cn.bunny.services.mapper.MessageMapper; import cn.bunny.services.mapper.MessageReceivedMapper; +import cn.bunny.services.mapper.UserMapper; import cn.bunny.services.service.MessageReceivedService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.validation.Valid; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,15 +35,13 @@ import java.util.List; @Transactional public class MessageReceivedServiceImpl extends ServiceImpl implements MessageReceivedService { - /** - * 根据发送者id批量删除消息接受者 - * - * @param sendUserIds 发送用户ID - */ - @Override - public void deleteBatchIdsWithPhysics(List sendUserIds) { - baseMapper.deleteBatchIdsWithPhysics(sendUserIds); - } + @Autowired + private UserMapper userMapper; + + @Autowired + private MessageMapper messageMapper; + @Autowired + private UserFactory userFactory; /** * 根据消息id获取接收人信息 @@ -47,4 +56,128 @@ public class MessageReceivedServiceImpl extends ServiceImpl receivedUserIds = dto.getReceivedUserIds(); + if (receivedUserIds.isEmpty()) { + receivedUserIds = userMapper.selectList(null).stream().map(BaseEntity::getId).toList(); + } + + // 从之前保存的消息中获取消息id,保存到消息接收表中 + List receivedList = receivedUserIds.stream().map(id -> { + MessageReceived messageReceived = new MessageReceived(); + messageReceived.setMessageId(message.getId()); + messageReceived.setReceivedUserId(id); + messageReceived.setStatus(false); + return messageReceived; + }).toList(); + + saveBatch(receivedList); + } + + + /** + * 更新系统消息 + * + * @param dto 系统消息更新 + */ + @Override + public void updateMessage(@Valid MessageUpdateDto dto) { + // 如果发送人为空设置当前登录的人的ID + Long sendUserId = dto.getSendUserId(); + if (sendUserId == null) dto.setSendUserId(BaseContext.getUserId()); + + // 如果接收人为空默认接收全部人 + List receivedUserIds = dto.getReceivedUserIds(); + if (receivedUserIds.isEmpty()) { + receivedUserIds = userMapper.selectList(null).stream().map(BaseEntity::getId).toList(); + } + + // 设置封面返回内容 + String cover = dto.getCover(); + dto.setCover(userFactory.checkGetUserAvatar(cover)); + + // 更新内容 + Message message = new Message(); + BeanUtils.copyProperties(dto, message); + message.setMessageType(dto.getMessageTypeId().toString()); + messageMapper.updateById(message); + + // 保存消息和用户之间关联数据 + List receivedList = receivedUserIds.stream().map(id -> { + MessageReceived messageReceived = new MessageReceived(); + messageReceived.setMessageId(dto.getId()); + messageReceived.setReceivedUserId(id); + + // 当更新的时当前消息用户表是否已读 + if (id.equals(dto.getReceivedUserId())) { + messageReceived.setStatus(dto.getStatus()); + } + return messageReceived; + }).toList(); + + // 删除这个消息id下所有用户消息关系内容 + baseMapper.deleteBatchIdsByMessageIdsWithPhysics(List.of(dto.getId())); + + // 插入接收者和消息表 + saveBatch(receivedList); + } + + /** + * 用户将消息标为已读 + * 将消息表中满足id条件全部标为已读 + * + * @param ids 消息id列表 + */ + @Override + public void updateUserMarkAsRead(List ids) { + // 判断ids是否为空 + if (ids.isEmpty()) { + throw new BunnyException(ResultCodeEnum.REQUEST_IS_EMPTY); + } + + // 更新表中消息状态 + List messageList = ids.stream().map(id -> { + MessageReceived messageReceived = new MessageReceived(); + messageReceived.setId(id); + messageReceived.setStatus(true); + return messageReceived; + }).toList(); + + updateBatchById(messageList); + } + + /** + * 根据发送者id批量删除消息接受者 + * + * @param sendUserIds 发送用户ID + */ + @Override + public void deleteBatchIdsWithPhysics(List sendUserIds) { + baseMapper.deleteBatchIdsWithPhysics(sendUserIds); + } } diff --git a/service/src/main/java/cn/bunny/services/service/impl/MessageServiceImpl.java b/service/src/main/java/cn/bunny/services/service/impl/MessageServiceImpl.java index b18501a..e2cf5b1 100644 --- a/service/src/main/java/cn/bunny/services/service/impl/MessageServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/impl/MessageServiceImpl.java @@ -2,10 +2,7 @@ package cn.bunny.services.service.impl; import cn.bunny.common.service.context.BaseContext; import cn.bunny.common.service.exception.BunnyException; -import cn.bunny.dao.common.entity.BaseEntity; -import cn.bunny.dao.dto.system.message.MessageAddDto; import cn.bunny.dao.dto.system.message.MessageDto; -import cn.bunny.dao.dto.system.message.MessageUpdateDto; import cn.bunny.dao.dto.system.message.MessageUserDto; import cn.bunny.dao.entity.system.Message; import cn.bunny.dao.entity.system.MessageReceived; @@ -16,20 +13,17 @@ import cn.bunny.dao.vo.system.message.MessageVo; import cn.bunny.services.factory.UserFactory; import cn.bunny.services.mapper.MessageMapper; import cn.bunny.services.mapper.MessageReceivedMapper; -import cn.bunny.services.mapper.UserMapper; -import cn.bunny.services.service.MessageReceivedService; import cn.bunny.services.service.MessageService; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import jakarta.validation.Valid; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; import java.util.List; /** @@ -44,15 +38,9 @@ import java.util.List; @Transactional public class MessageServiceImpl extends ServiceImpl implements MessageService { - @Autowired - private UserMapper userMapper; - @Autowired private UserFactory userFactory; - @Autowired - private MessageReceivedService messageReceivedService; - @Autowired private MessageReceivedMapper messageReceivedMapper; @@ -77,43 +65,25 @@ public class MessageServiceImpl extends ServiceImpl impl vo.setCover(cover); return vo; }).toList(); - return PageResult.builder() - .list(voList) - .pageNo(page.getCurrent()) - .pageSize(page.getSize()) - .total(page.getTotal()) + return PageResult.builder().list(voList).pageNo(page.getCurrent()) + .pageSize(page.getSize()).total(page.getTotal()) .build(); } /** * 分页查询用户消息 - * 用户在主页查询内容为:是否已读和消息类型 - * 为了方便用户之后进入消息详情页面查询,按照消息类型查询消息 - * 也可以查询消息是否已读 - * 节省带宽的情况下传给前端消息详情等内容 + * 查询用户消息关系表,找到当前用户所有的消息 + * 拿到用户消息关系表中数据只要MessageId + * 根据MessageId分页查询消息表 * * @param pageParams 系统消息返回列表 - * @param dto 用户消息查询内容" + * @param dto 用户消息查询内容 * @return 分页结果 */ @Override public PageResult getUserMessageList(Page pageParams, MessageUserDto dto) { - // 查询当前用户需要接收的消息id - List messageReceivedList = messageReceivedMapper.selectList(Wrappers.lambdaQuery().eq(MessageReceived::getReceivedUserId, BaseContext.getUserId())); - List messageIds = messageReceivedList.stream().map(MessageReceived::getMessageId).toList(); - - // 消息为空直接返回 - if (messageIds.isEmpty()) { - return PageResult.builder() - .list(new ArrayList<>()) - .pageNo(pageParams.getCurrent()) - .pageSize(pageParams.getSize()) - .total(pageParams.getTotal()) - .build(); - } - // 根据消息所有包含匹配当前消息Id的列表 - IPage page = baseMapper.selectListByPageWithMessageUserDto(pageParams, dto, messageIds); + IPage page = baseMapper.selectListByPageWithMessageUserDto(pageParams, dto, BaseContext.getUserId()); List voList = page.getRecords().stream().map(messageVo -> { MessageUserVo vo = new MessageUserVo(); BeanUtils.copyProperties(messageVo, vo); @@ -125,11 +95,8 @@ public class MessageServiceImpl extends ServiceImpl impl return vo; }).toList(); - return PageResult.builder() - .list(voList) - .pageNo(page.getCurrent()) - .pageSize(page.getSize()) - .total(page.getTotal()) + return PageResult.builder().list(voList).pageNo(page.getCurrent()) + .pageSize(page.getSize()).total(page.getTotal()) .build(); } @@ -143,39 +110,21 @@ public class MessageServiceImpl extends ServiceImpl impl @Override public MessageVo getMessageDetailById(Long id) { // 将消息设为已读 - Message message = new Message(); - message.setId(id); - message.setStatus(true); - updateById(message); + MessageReceived messageReceived = new MessageReceived(); + messageReceived.setReceivedUserId(BaseContext.getUserId()); + messageReceived.setMessageId(id); + messageReceived.setStatus(true); + + // 更新满足条件的消息用户表 + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate() + .eq(MessageReceived::getMessageId, id) + .eq(MessageReceived::getReceivedUserId, BaseContext.getUserId()); + messageReceivedMapper.update(messageReceived, wrapper); // 返回详情内容给前端 return baseMapper.selectMessageVoById(id); } - /** - * 用户将消息标为已读 - * 将消息表中满足id条件全部标为已读 - * - * @param ids 消息id列表 - */ - @Override - public void updateUserMarkAsRead(List ids) { - // 判断ids是否为空 - if (ids.isEmpty()) { - throw new BunnyException(ResultCodeEnum.REQUEST_IS_EMPTY); - } - - // 更新表中消息状态 - List messageList = ids.stream().map(id -> { - Message message = new Message(); - message.setId(id); - message.setStatus(true); - return message; - }).toList(); - - updateBatchById(messageList); - } - /** * 用户删除消息 * @@ -188,85 +137,8 @@ public class MessageServiceImpl extends ServiceImpl impl throw new BunnyException(ResultCodeEnum.REQUEST_IS_EMPTY); } - // 删除消息表中数据 - baseMapper.deleteBatchIdsWithPhysics(ids); - // 根据当前用户id删除消息接受表中数据 - Long userId = BaseContext.getUserId(); - messageReceivedMapper.deleteBatchIdsByMessageIdsAndUserIdWithPhysics(ids, userId); - } - - /** - * 添加系统消息 - * 判断发送消息的接收人是否为空,如果为空默认是所有用户都是接受者 - * 之后要将消息的接受者要保存在,消息接收表中,在这之前是没有消息id的 - * 先要保存消息内容,之后获取到保存消息的id - * 将消息的id和接收者的id构建成map插入到消息接收表中 - * - * @param dto 系统消息添加 - */ - @Override - public void addMessage(@Valid MessageAddDto dto) { - // 如果发送人为空设置当前登录的人的ID - if (dto.getSendUserId() == null) dto.setSendUserId(BaseContext.getUserId()); - - // 先保存消息数据,之后拿到保存消息的id - Message message = new Message(); - BeanUtils.copyProperties(dto, message); - save(message); - - // 如果接收人为空默认接收全部人 - List receivedUserIds = dto.getReceivedUserIds(); - if (receivedUserIds.isEmpty()) { - receivedUserIds = userMapper.selectList(null).stream().map(BaseEntity::getId).toList(); - } - - // 从之前保存的消息中获取消息id,保存到消息接收表中 - List receivedList = receivedUserIds.stream().map(id -> { - MessageReceived messageReceived = new MessageReceived(); - messageReceived.setMessageId(message.getId()); - messageReceived.setReceivedUserId(id); - return messageReceived; - }).toList(); - - messageReceivedService.saveBatch(receivedList); - } - - /** - * 更新系统消息 - * - * @param dto 系统消息更新 - */ - @Override - public void updateMessage(@Valid MessageUpdateDto dto) { - // 如果发送人为空设置当前登录的人的ID - Long sendUserId = dto.getSendUserId(); - if (sendUserId == null) dto.setSendUserId(BaseContext.getUserId()); - - // 如果接收人为空默认接收全部人 - List receivedUserIds = dto.getReceivedUserIds(); - if (receivedUserIds.isEmpty()) { - receivedUserIds = userMapper.selectList(null).stream().map(BaseEntity::getId).toList(); - } - - // 更新内容 - Message message = new Message(); - BeanUtils.copyProperties(dto, message); - updateById(message); - - // 保存消息和用户之间关联数据 - List receivedList = receivedUserIds.stream().map(id -> { - MessageReceived messageReceived = new MessageReceived(); - messageReceived.setMessageId(dto.getId()); - messageReceived.setReceivedUserId(id); - return messageReceived; - }).toList(); - - // 删除这个消息接受下所有发送者 - messageReceivedMapper.deleteBatchIdsByMessageIdsWithPhysics(List.of(dto.getId())); - - // 插入接收者和消息表 - messageReceivedService.saveBatch(receivedList); + messageReceivedMapper.deleteBatchIdsWithPhysics(ids); } /** diff --git a/service/src/main/resources/mapper/MessageMapper.xml b/service/src/main/resources/mapper/MessageMapper.xml index 9fe8fff..b22f09d 100644 --- a/service/src/main/resources/mapper/MessageMapper.xml +++ b/service/src/main/resources/mapper/MessageMapper.xml @@ -17,28 +17,49 @@ - - id - , create_time, update_time, create_user, update_user, is_deleted, title, send_user_id, message_type, content, cover, summary, editor_type, status,level,extra + id, create_time, update_time, create_user, update_user, is_deleted, title, send_user_id, message_type, content, cover, summary, editor_type, level,extra - + SELECT + message.id, + message.title, + message.cover, + message.summary, + message.level, + message.extra, + message.update_time, + message_received.id AS message_received_id, + message_received.status AS status, + message_type.message_type AS message_type + FROM sys_message message + LEFT JOIN sys_user create_user ON create_user.id = message.create_user + LEFT JOIN sys_user update_user ON update_user.id = message.update_user + LEFT JOIN sys_message_type message_type ON message_type.id = message.message_type + INNER JOIN sys_message_received message_received ON message_received.received_user_id = #{userId} + AND message.id = message_received.message_id message.is_deleted = 0 - - and message.id in - - #{id} - - - and message.status = #{dto.status} + and message_received.status = #{dto.status} - and message.message_type = #{dto.messageType} + and message_type.message_type = #{dto.messageType} and message.title like CONCAT('%',#{dto.title},'%') diff --git a/service/src/main/resources/mapper/MessageReceivedMapper.xml b/service/src/main/resources/mapper/MessageReceivedMapper.xml index 5d0083d..dabd2ad 100644 --- a/service/src/main/resources/mapper/MessageReceivedMapper.xml +++ b/service/src/main/resources/mapper/MessageReceivedMapper.xml @@ -18,7 +18,7 @@ delete from sys_message_received - where received_user_id in + where id in #{id} @@ -34,16 +34,6 @@ - - - delete - from sys_message_received where - received_user_id = #{userId} and received_user_id in - - #{id} - - -