|
|
|
@ -37,8 +37,8 @@ import java.util.stream.Collectors; |
|
|
|
@Slf4j |
|
|
|
@Service |
|
|
|
@RequiredArgsConstructor |
|
|
|
public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper, PrivateMessage> implements |
|
|
|
PrivateMessageService { |
|
|
|
public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper, PrivateMessage> |
|
|
|
implements PrivateMessageService { |
|
|
|
|
|
|
|
private final FriendService friendService; |
|
|
|
private final IMClient imClient; |
|
|
|
@ -58,7 +58,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper, |
|
|
|
msg.setSendTime(new Date()); |
|
|
|
this.save(msg); |
|
|
|
// 过滤内容中的敏感词
|
|
|
|
if(MessageType.TEXT.code().equals(dto.getType())){ |
|
|
|
if (MessageType.TEXT.code().equals(dto.getType())) { |
|
|
|
msg.setContent(sensitiveFilterUtil.filter(dto.getContent())); |
|
|
|
} |
|
|
|
// 推送消息
|
|
|
|
@ -112,7 +112,6 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper, |
|
|
|
log.info("撤回私聊消息,发送id:{},接收id:{},内容:{}", msg.getSendId(), msg.getRecvId(), msg.getContent()); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public List<PrivateMessageVO> findHistoryMessage(Long friendId, Long page, Long size) { |
|
|
|
page = page > 0 ? page : 1; |
|
|
|
@ -120,17 +119,16 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper, |
|
|
|
Long userId = SessionContext.getSession().getUserId(); |
|
|
|
long stIdx = (page - 1) * size; |
|
|
|
QueryWrapper<PrivateMessage> wrapper = new QueryWrapper<>(); |
|
|
|
wrapper.lambda().and(wrap -> wrap.and( |
|
|
|
wp -> wp.eq(PrivateMessage::getSendId, userId) |
|
|
|
.eq(PrivateMessage::getRecvId, friendId)) |
|
|
|
.or(wp -> wp.eq(PrivateMessage::getRecvId, userId) |
|
|
|
.eq(PrivateMessage::getSendId, friendId))) |
|
|
|
.ne(PrivateMessage::getStatus, MessageStatus.RECALL.code()) |
|
|
|
.orderByDesc(PrivateMessage::getId) |
|
|
|
wrapper.lambda().and( |
|
|
|
wrap -> wrap.and(wp -> wp.eq(PrivateMessage::getSendId, userId).eq(PrivateMessage::getRecvId, friendId)) |
|
|
|
.or(wp -> wp.eq(PrivateMessage::getRecvId, userId).eq(PrivateMessage::getSendId, friendId))) |
|
|
|
.ne(PrivateMessage::getStatus, MessageStatus.RECALL.code()).orderByDesc(PrivateMessage::getId) |
|
|
|
.last("limit " + stIdx + "," + size); |
|
|
|
|
|
|
|
List<PrivateMessage> messages = this.list(wrapper); |
|
|
|
List<PrivateMessageVO> messageInfos = messages.stream().map(m -> BeanUtils.copyProperties(m, PrivateMessageVO.class)).collect(Collectors.toList()); |
|
|
|
List<PrivateMessageVO> messageInfos = |
|
|
|
messages.stream().map(m -> BeanUtils.copyProperties(m, PrivateMessageVO.class)) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
log.info("拉取聊天记录,用户id:{},好友id:{},数量:{}", userId, friendId, messageInfos.size()); |
|
|
|
return messageInfos; |
|
|
|
} |
|
|
|
@ -138,7 +136,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper, |
|
|
|
@Override |
|
|
|
public void pullOfflineMessage(Long minId) { |
|
|
|
UserSession session = SessionContext.getSession(); |
|
|
|
if(!imClient.isOnline(session.getUserId())){ |
|
|
|
if (!imClient.isOnline(session.getUserId())) { |
|
|
|
throw new GlobalException("网络连接失败,无法拉取离线消息"); |
|
|
|
} |
|
|
|
// 查询用户好友列表
|
|
|
|
@ -153,23 +151,19 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper, |
|
|
|
List<Long> friendIds = friends.stream().map(Friend::getFriendId).collect(Collectors.toList()); |
|
|
|
// 获取当前用户的消息
|
|
|
|
LambdaQueryWrapper<PrivateMessage> queryWrapper = Wrappers.lambdaQuery(); |
|
|
|
// 只能拉取最近3个月的3000条消息
|
|
|
|
Date minDate = DateUtils.addMonths(new Date(), -3); |
|
|
|
queryWrapper.gt(PrivateMessage::getId, minId) |
|
|
|
.ge(PrivateMessage::getSendTime, minDate) |
|
|
|
.ne(PrivateMessage::getStatus, MessageStatus.RECALL.code()) |
|
|
|
.and(wrap -> wrap.and( |
|
|
|
wp -> wp.eq(PrivateMessage::getSendId, session.getUserId()) |
|
|
|
.in(PrivateMessage::getRecvId, friendIds)) |
|
|
|
.or(wp -> wp.eq(PrivateMessage::getRecvId, session.getUserId()) |
|
|
|
.in(PrivateMessage::getSendId, friendIds))) |
|
|
|
.orderByDesc(PrivateMessage::getId) |
|
|
|
.last("limit 3000"); |
|
|
|
// 只能拉取最近3个月的消息,移动端只拉取一个月消息
|
|
|
|
int months = session.getTerminal().equals(IMTerminalType.APP.code()) ? 1 : 3; |
|
|
|
Date minDate = DateUtils.addMonths(new Date(), -months); |
|
|
|
queryWrapper.gt(PrivateMessage::getId, minId).ge(PrivateMessage::getSendTime, minDate) |
|
|
|
.ne(PrivateMessage::getStatus, MessageStatus.RECALL.code()).and(wrap -> wrap.and( |
|
|
|
wp -> wp.eq(PrivateMessage::getSendId, session.getUserId()).in(PrivateMessage::getRecvId, friendIds)) |
|
|
|
.or(wp -> wp.eq(PrivateMessage::getRecvId, session.getUserId()).in(PrivateMessage::getSendId, friendIds))) |
|
|
|
.orderByDesc(PrivateMessage::getId); |
|
|
|
List<PrivateMessage> messages = this.list(queryWrapper); |
|
|
|
// 消息顺序从小到大
|
|
|
|
CollectionUtil.reverse(messages); |
|
|
|
// 推送消息
|
|
|
|
for(PrivateMessage m:messages ){ |
|
|
|
for (PrivateMessage m : messages) { |
|
|
|
PrivateMessageVO vo = BeanUtils.copyProperties(m, PrivateMessageVO.class); |
|
|
|
IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>(); |
|
|
|
sendMessage.setSender(new IMUserInfo(m.getSendId(), IMTerminalType.WEB.code())); |
|
|
|
@ -214,34 +208,28 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper, |
|
|
|
imClient.sendPrivateMessage(sendMessage); |
|
|
|
// 修改消息状态为已读
|
|
|
|
LambdaUpdateWrapper<PrivateMessage> updateWrapper = Wrappers.lambdaUpdate(); |
|
|
|
updateWrapper.eq(PrivateMessage::getSendId, friendId) |
|
|
|
.eq(PrivateMessage::getRecvId, session.getUserId()) |
|
|
|
updateWrapper.eq(PrivateMessage::getSendId, friendId).eq(PrivateMessage::getRecvId, session.getUserId()) |
|
|
|
.eq(PrivateMessage::getStatus, MessageStatus.SENDED.code()) |
|
|
|
.set(PrivateMessage::getStatus, MessageStatus.READED.code()); |
|
|
|
this.update(updateWrapper); |
|
|
|
log.info("消息已读,接收方id:{},发送方id:{}", session.getUserId(), friendId); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public Long getMaxReadedId(Long friendId) { |
|
|
|
UserSession session = SessionContext.getSession(); |
|
|
|
LambdaQueryWrapper<PrivateMessage> wrapper = Wrappers.lambdaQuery(); |
|
|
|
wrapper.eq(PrivateMessage::getSendId, session.getUserId()) |
|
|
|
.eq(PrivateMessage::getRecvId, friendId) |
|
|
|
.eq(PrivateMessage::getStatus, MessageStatus.READED.code()) |
|
|
|
.orderByDesc(PrivateMessage::getId) |
|
|
|
.select(PrivateMessage::getId) |
|
|
|
.last("limit 1"); |
|
|
|
wrapper.eq(PrivateMessage::getSendId, session.getUserId()).eq(PrivateMessage::getRecvId, friendId) |
|
|
|
.eq(PrivateMessage::getStatus, MessageStatus.READED.code()).orderByDesc(PrivateMessage::getId) |
|
|
|
.select(PrivateMessage::getId).last("limit 1"); |
|
|
|
PrivateMessage message = this.getOne(wrapper); |
|
|
|
if(Objects.isNull(message)){ |
|
|
|
if (Objects.isNull(message)) { |
|
|
|
return -1L; |
|
|
|
} |
|
|
|
return message.getId(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void sendLoadingMessage(Boolean isLoadding){ |
|
|
|
private void sendLoadingMessage(Boolean isLoadding) { |
|
|
|
UserSession session = SessionContext.getSession(); |
|
|
|
PrivateMessageVO msgInfo = new PrivateMessageVO(); |
|
|
|
msgInfo.setType(MessageType.LOADING.code()); |
|
|
|
|