Commit df7d2edf6da9aa7eb1d38ac686b747545f27908e

Authored by 云中非
1 parent 37fa55ac

fix: 修复接收消息通知的用户被删除后,通知接收人为空

1、消息接收者用户名从属性“receiverName”取
@@ -21,6 +21,7 @@ public class SysNoticeUserDTO extends TenantDTO { @@ -21,6 +21,7 @@ public class SysNoticeUserDTO extends TenantDTO {
21 private String receiverId; 21 private String receiverId;
22 @ApiModelProperty(value = "接收者") 22 @ApiModelProperty(value = "接收者")
23 private UserDTO user; 23 private UserDTO user;
  24 + private String receiverName;
24 @ApiModelProperty(value = "通知ID") 25 @ApiModelProperty(value = "通知ID")
25 private String noticeId; 26 private String noticeId;
26 @ApiModelProperty(value = "阅读状态 0:未读 1:已读") 27 @ApiModelProperty(value = "阅读状态 0:未读 1:已读")
@@ -22,6 +22,7 @@ public class SysNoticeUser extends TenantBaseEntity { @@ -22,6 +22,7 @@ public class SysNoticeUser extends TenantBaseEntity {
22 private static final long serialVersionUID = -5421685500963791707L; 22 private static final long serialVersionUID = -5421685500963791707L;
23 /** 接收者ID */ 23 /** 接收者ID */
24 private String receiverId; 24 private String receiverId;
  25 + private String receiverName;
25 /** 通知ID */ 26 /** 通知ID */
26 private String noticeId; 27 private String noticeId;
27 /** 阅读状态 0:未读 1:已读 */ 28 /** 阅读状态 0:未读 1:已读 */
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 4 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
5 import com.baomidou.mybatisplus.core.metadata.IPage; 5 import com.baomidou.mybatisplus.core.metadata.IPage;
6 import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; 6 import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
  7 +import lombok.RequiredArgsConstructor;
7 import org.apache.commons.lang3.StringUtils; 8 import org.apache.commons.lang3.StringUtils;
8 import org.springframework.stereotype.Service; 9 import org.springframework.stereotype.Service;
9 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; 10 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
@@ -14,6 +15,7 @@ import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData; @@ -14,6 +15,7 @@ import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
14 import org.thingsboard.server.dao.yunteng.entities.SysNoticeUser; 15 import org.thingsboard.server.dao.yunteng.entities.SysNoticeUser;
15 import org.thingsboard.server.dao.yunteng.entities.User; 16 import org.thingsboard.server.dao.yunteng.entities.User;
16 import org.thingsboard.server.dao.yunteng.mapper.SysNoticeUserMapper; 17 import org.thingsboard.server.dao.yunteng.mapper.SysNoticeUserMapper;
  18 +import org.thingsboard.server.dao.yunteng.mapper.UserMapper;
17 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; 19 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
18 import org.thingsboard.server.dao.yunteng.service.SysNoticeUserService; 20 import org.thingsboard.server.dao.yunteng.service.SysNoticeUserService;
19 21
@@ -29,93 +31,101 @@ import java.util.stream.Collectors; @@ -29,93 +31,101 @@ import java.util.stream.Collectors;
29 * @date: 2021/12/2-20:43 31 * @date: 2021/12/2-20:43
30 */ 32 */
31 @Service 33 @Service
  34 +@RequiredArgsConstructor
32 public class SysNoticeUserServiceImpl 35 public class SysNoticeUserServiceImpl
33 - extends AbstractBaseService<SysNoticeUserMapper, SysNoticeUser>  
34 - implements SysNoticeUserService { 36 + extends AbstractBaseService<SysNoticeUserMapper, SysNoticeUser>
  37 + implements SysNoticeUserService {
  38 + private final UserMapper userMapper;
35 39
36 - @Override  
37 - public YtPageData<SysNoticeUserDTO> page(Map<String, Object> queryMap) {  
38 - return getPage(queryMap);  
39 - } 40 + @Override
  41 + public YtPageData<SysNoticeUserDTO> page(Map<String, Object> queryMap) {
  42 + return getPage(queryMap);
  43 + }
40 44
41 - @Override  
42 - public YtPageData<SysNoticeUserDTO> pageByNoticeId(Map<String, Object> queryMap) {  
43 - return getPage(queryMap);  
44 - } 45 + @Override
  46 + public YtPageData<SysNoticeUserDTO> pageByNoticeId(Map<String, Object> queryMap) {
  47 + return getPage(queryMap);
  48 + }
45 49
46 - @Override  
47 - public YtPageData<SysNoticeUserDTO> read(Map<String, Object> queryMap, String currentUserId) {  
48 - queryMap.put("creator", currentUserId);  
49 - return getPage(queryMap);  
50 - } 50 + @Override
  51 + public YtPageData<SysNoticeUserDTO> read(Map<String, Object> queryMap, String currentUserId) {
  52 + queryMap.put("creator", currentUserId);
  53 + return getPage(queryMap);
  54 + }
51 55
52 - @Override  
53 - public SysNoticeUserDTO get(String id, String tenantId) {  
54 - SysNoticeUser sysNoticeUser = baseMapper.get(id, tenantId).getEntity(SysNoticeUser.class);  
55 - if (!FastIotConstants.ReadState.READ.equals(sysNoticeUser.getReadStatus())  
56 - || sysNoticeUser.getReadDate() == null) {  
57 - // 设置已读  
58 - sysNoticeUser.setReadStatus(FastIotConstants.ReadState.READ);  
59 - sysNoticeUser.setReadDate(LocalDateTime.now());  
60 - baseMapper.update(  
61 - null,  
62 - new LambdaUpdateWrapper<SysNoticeUser>()  
63 - .eq(SysNoticeUser::getId, sysNoticeUser.getId())  
64 - .set(SysNoticeUser::getReadStatus, sysNoticeUser.getReadStatus())  
65 - .set(SysNoticeUser::getReadDate, sysNoticeUser.getReadDate())); 56 + @Override
  57 + public SysNoticeUserDTO get(String id, String tenantId) {
  58 + SysNoticeUser sysNoticeUser = baseMapper.get(id, tenantId).getEntity(SysNoticeUser.class);
  59 + if (!FastIotConstants.ReadState.READ.equals(sysNoticeUser.getReadStatus())
  60 + || sysNoticeUser.getReadDate() == null) {
  61 + // 设置已读
  62 + sysNoticeUser.setReadStatus(FastIotConstants.ReadState.READ);
  63 + sysNoticeUser.setReadDate(LocalDateTime.now());
  64 + baseMapper.update(
  65 + null,
  66 + new LambdaUpdateWrapper<SysNoticeUser>()
  67 + .eq(SysNoticeUser::getId, sysNoticeUser.getId())
  68 + .set(SysNoticeUser::getReadStatus, sysNoticeUser.getReadStatus())
  69 + .set(SysNoticeUser::getReadDate, sysNoticeUser.getReadDate()));
  70 + }
  71 + return sysNoticeUser.getDTO(SysNoticeUserDTO.class);
66 } 72 }
67 - return sysNoticeUser.getDTO(SysNoticeUserDTO.class);  
68 - }  
69 73
70 - @Override  
71 - public void saveSysNoticeUser(  
72 - List<String> userIds, String tenantId, String noticeId, String status) {  
73 - List<SysNoticeUser> sysNoticeUserList = new ArrayList<>();  
74 - userIds.forEach(  
75 - userId -> {  
76 - SysNoticeUser sysNoticeUser = new SysNoticeUser();  
77 - sysNoticeUser.setNoticeId(noticeId);  
78 - sysNoticeUser.setStatus(status);  
79 - sysNoticeUser.setTenantId(tenantId);  
80 - sysNoticeUser.setReadStatus(FastIotConstants.ReadState.UNREAD);  
81 - sysNoticeUser.setReceiverId(userId);  
82 - sysNoticeUserList.add(sysNoticeUser);  
83 - });  
84 - insertBatch(sysNoticeUserList, sysNoticeUserList.size());  
85 - } 74 + @Override
  75 + public void saveSysNoticeUser(
  76 + List<String> userIds, String tenantId, String noticeId, String status) {
  77 + List<User> userList = userMapper
  78 + .selectList(
  79 + new LambdaQueryWrapper<User>().in(User::getId, userIds))
  80 + .stream()
  81 + .collect(Collectors.toList());
  82 + List<SysNoticeUser> sysNoticeUserList = new ArrayList<>();
  83 + userList.forEach(
  84 + user -> {
  85 + SysNoticeUser sysNoticeUser = new SysNoticeUser();
  86 + sysNoticeUser.setNoticeId(noticeId);
  87 + sysNoticeUser.setStatus(status);
  88 + sysNoticeUser.setTenantId(tenantId);
  89 + sysNoticeUser.setReadStatus(FastIotConstants.ReadState.UNREAD);
  90 + sysNoticeUser.setReceiverId(user.getId());
  91 + sysNoticeUser.setReceiverName(user.getRealName());
  92 + sysNoticeUserList.add(sysNoticeUser);
  93 + });
  94 + insertBatch(sysNoticeUserList, sysNoticeUserList.size());
  95 + }
86 96
87 - @Override  
88 - public List<String> getSysNoticeUserIdsByNoticeId(String noticeId) {  
89 - if (StringUtils.isAllEmpty(noticeId)) {  
90 - throw new YtDataValidationException(ErrorMessage.INTERNAL_ERROR.name()); 97 + @Override
  98 + public List<String> getSysNoticeUserIdsByNoticeId(String noticeId) {
  99 + if (StringUtils.isAllEmpty(noticeId)) {
  100 + throw new YtDataValidationException(ErrorMessage.INTERNAL_ERROR.name());
  101 + }
  102 + return baseMapper
  103 + .selectList(
  104 + new LambdaQueryWrapper<SysNoticeUser>().eq(SysNoticeUser::getNoticeId, noticeId))
  105 + .stream()
  106 + .map(SysNoticeUser::getId)
  107 + .collect(Collectors.toList());
91 } 108 }
92 - return baseMapper  
93 - .selectList(  
94 - new LambdaQueryWrapper<SysNoticeUser>().eq(SysNoticeUser::getNoticeId, noticeId))  
95 - .stream()  
96 - .map(SysNoticeUser::getId)  
97 - .collect(Collectors.toList());  
98 - }  
99 109
100 - @Override  
101 - public boolean updateSysNoticeUsersStatusByNoticeId(String id, String status) {  
102 - if (StringUtils.isAllEmpty(id) || StringUtils.isAllEmpty(status)) {  
103 - throw new YtDataValidationException(ErrorMessage.INTERNAL_ERROR.name()); 110 + @Override
  111 + public boolean updateSysNoticeUsersStatusByNoticeId(String id, String status) {
  112 + if (StringUtils.isAllEmpty(id) || StringUtils.isAllEmpty(status)) {
  113 + throw new YtDataValidationException(ErrorMessage.INTERNAL_ERROR.name());
  114 + }
  115 + return baseMapper.updateSysNoticeUsersStatusByNoticeId(id, status);
104 } 116 }
105 - return baseMapper.updateSysNoticeUsersStatusByNoticeId(id, status);  
106 - }  
107 117
108 - @Override  
109 - public boolean deleteNoticUserByNoticeId(List<String> noticeId) { 118 + @Override
  119 + public boolean deleteNoticUserByNoticeId(List<String> noticeId) {
110 120
111 - return baseMapper.delete(  
112 - new LambdaQueryWrapper<SysNoticeUser>().in(SysNoticeUser::getNoticeId, noticeId))  
113 - > 0;  
114 - } 121 + return baseMapper.delete(
  122 + new LambdaQueryWrapper<SysNoticeUser>().in(SysNoticeUser::getNoticeId, noticeId))
  123 + > 0;
  124 + }
115 125
116 - private YtPageData<SysNoticeUserDTO> getPage(Map<String, Object> queryMap) {  
117 - IPage<SysNoticeUser> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);  
118 - IPage<SysNoticeUserDTO> pageDto = baseMapper.page(page, queryMap);  
119 - return getPageData(pageDto, SysNoticeUserDTO.class);  
120 - } 126 + private YtPageData<SysNoticeUserDTO> getPage(Map<String, Object> queryMap) {
  127 + IPage<SysNoticeUser> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);
  128 + IPage<SysNoticeUserDTO> pageDto = baseMapper.page(page, queryMap);
  129 + return getPageData(pageDto, SysNoticeUserDTO.class);
  130 + }
121 } 131 }
@@ -13,6 +13,7 @@ @@ -13,6 +13,7 @@
13 <result property="updateTime" column="update_time"/> 13 <result property="updateTime" column="update_time"/>
14 <result property="tenantId" column="tenant_id"/> 14 <result property="tenantId" column="tenant_id"/>
15 <result property="id" column="id"/> 15 <result property="id" column="id"/>
  16 + <result property="receiverName" column="receiver_name"/>
16 <association property="user" column="receiver_id" 17 <association property="user" column="receiver_id"
17 javaType="org.thingsboard.server.common.data.yunteng.dto.UserDTO"> 18 javaType="org.thingsboard.server.common.data.yunteng.dto.UserDTO">
18 <result property="realName" column="real_name"/> 19 <result property="realName" column="real_name"/>
@@ -37,7 +38,7 @@ @@ -37,7 +38,7 @@
37 </sql> 38 </sql>
38 39
39 <sql id="columns"> 40 <sql id="columns">
40 - SELECT snu.receiver_id receiver_id, 41 + SELECT snu.receiver_id receiver_id,snu.receiver_name,
41 snu.notice_id notice_id, 42 snu.notice_id notice_id,
42 snu.read_status read_status, 43 snu.read_status read_status,
43 snu.read_date read_date, 44 snu.read_date read_date,