|
|
|
@ -40,11 +40,10 @@ import java.util.stream.Collectors; |
|
|
|
@Service |
|
|
|
@AllArgsConstructor |
|
|
|
public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, GroupMessage> implements IGroupMessageService { |
|
|
|
private IGroupService groupService; |
|
|
|
private IGroupMemberService groupMemberService; |
|
|
|
private RedisTemplate<String, Object> redisTemplate; |
|
|
|
private IMClient imClient; |
|
|
|
|
|
|
|
private final IGroupService groupService; |
|
|
|
private final IGroupMemberService groupMemberService; |
|
|
|
private final RedisTemplate<String, Object> redisTemplate; |
|
|
|
private final IMClient imClient; |
|
|
|
|
|
|
|
@Override |
|
|
|
public Long sendMessage(GroupMessageDTO dto) { |
|
|
|
@ -86,7 +85,6 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro |
|
|
|
return msg.getId(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public void recallMessage(Long id) { |
|
|
|
UserSession session = SessionContext.getSession(); |
|
|
|
@ -135,7 +133,6 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro |
|
|
|
log.info("撤回群聊消息,发送id:{},群聊id:{},内容:{}", session.getUserId(), msg.getGroupId(), msg.getContent()); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public void pullUnreadMessage() { |
|
|
|
UserSession session = SessionContext.getSession(); |
|
|
|
@ -145,10 +142,8 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro |
|
|
|
String key = String.join(":", RedisKey.IM_GROUP_READED_POSITION, member.getGroupId().toString(), session.getUserId().toString()); |
|
|
|
Integer maxReadedId = (Integer)redisTemplate.opsForValue().get(key); |
|
|
|
LambdaQueryWrapper<GroupMessage> wrapper = Wrappers.lambdaQuery(); |
|
|
|
wrapper.eq(GroupMessage::getGroupId, member.getGroupId()) |
|
|
|
.gt(GroupMessage::getSendTime, member.getCreatedTime()) |
|
|
|
.ne(GroupMessage::getSendId, session.getUserId()) |
|
|
|
.ne(GroupMessage::getStatus, MessageStatus.RECALL.code()); |
|
|
|
wrapper.eq(GroupMessage::getGroupId, member.getGroupId()).gt(GroupMessage::getSendTime, member.getCreatedTime()) |
|
|
|
.ne(GroupMessage::getSendId, session.getUserId()).ne(GroupMessage::getStatus, MessageStatus.RECALL.code()); |
|
|
|
if (maxReadedId != null) { |
|
|
|
wrapper.gt(GroupMessage::getId, maxReadedId); |
|
|
|
} |
|
|
|
@ -174,7 +169,6 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public List<GroupMessageVO> loadMessage(Long minId) { |
|
|
|
UserSession session = SessionContext.getSession(); |
|
|
|
@ -186,12 +180,8 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro |
|
|
|
// 只能拉取最近1个月的
|
|
|
|
Date minDate = DateTimeUtils.addMonths(new Date(), -1); |
|
|
|
LambdaQueryWrapper<GroupMessage> wrapper = Wrappers.lambdaQuery(); |
|
|
|
wrapper.gt(GroupMessage::getId, minId) |
|
|
|
.gt(GroupMessage::getSendTime, minDate) |
|
|
|
.in(GroupMessage::getGroupId, ids) |
|
|
|
.ne(GroupMessage::getStatus, MessageStatus.RECALL.code()) |
|
|
|
.orderByAsc(GroupMessage::getId) |
|
|
|
.last("limit 100"); |
|
|
|
wrapper.gt(GroupMessage::getId, minId).gt(GroupMessage::getSendTime, minDate).in(GroupMessage::getGroupId, ids) |
|
|
|
.ne(GroupMessage::getStatus, MessageStatus.RECALL.code()).orderByAsc(GroupMessage::getId).last("limit 100"); |
|
|
|
|
|
|
|
List<GroupMessage> messages = this.list(wrapper); |
|
|
|
// 转成vo
|
|
|
|
@ -203,8 +193,7 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro |
|
|
|
return vo; |
|
|
|
}).collect(Collectors.toList()); |
|
|
|
// 消息状态,数据库没有存群聊的消息状态,需要从redis取
|
|
|
|
List<String> keys = ids.stream() |
|
|
|
.map(id -> String.join(":", RedisKey.IM_GROUP_READED_POSITION, id.toString(), session.getUserId().toString())) |
|
|
|
List<String> keys = ids.stream().map(id -> String.join(":", RedisKey.IM_GROUP_READED_POSITION, id.toString(), session.getUserId().toString())) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
List<Object> sendPos = redisTemplate.opsForValue().multiGet(keys); |
|
|
|
int idx = 0; |
|
|
|
@ -225,16 +214,12 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro |
|
|
|
return vos; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public void readedMessage(Long groupId) { |
|
|
|
UserSession session = SessionContext.getSession(); |
|
|
|
// 取出最后的消息id
|
|
|
|
LambdaQueryWrapper<GroupMessage> wrapper = Wrappers.lambdaQuery(); |
|
|
|
wrapper.eq(GroupMessage::getGroupId, groupId) |
|
|
|
.orderByDesc(GroupMessage::getId) |
|
|
|
.last("limit 1") |
|
|
|
.select(GroupMessage::getId); |
|
|
|
wrapper.eq(GroupMessage::getGroupId, groupId).orderByDesc(GroupMessage::getId).last("limit 1").select(GroupMessage::getId); |
|
|
|
GroupMessage message = this.getOne(wrapper); |
|
|
|
if (Objects.isNull(message)) { |
|
|
|
return; |
|
|
|
@ -257,7 +242,6 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public List<GroupMessageVO> findHistoryMessage(Long groupId, Long page, Long size) { |
|
|
|
page = page > 0 ? page : 1; |
|
|
|
@ -271,17 +255,14 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro |
|
|
|
} |
|
|
|
// 查询聊天记录,只查询加入群聊时间之后的消息
|
|
|
|
QueryWrapper<GroupMessage> wrapper = new QueryWrapper<>(); |
|
|
|
wrapper.lambda().eq(GroupMessage::getGroupId, groupId) |
|
|
|
.gt(GroupMessage::getSendTime, member.getCreatedTime()) |
|
|
|
.ne(GroupMessage::getStatus, MessageStatus.RECALL.code()) |
|
|
|
.orderByDesc(GroupMessage::getId) |
|
|
|
.last("limit " + stIdx + "," + size); |
|
|
|
wrapper.lambda().eq(GroupMessage::getGroupId, groupId).gt(GroupMessage::getSendTime, member.getCreatedTime()) |
|
|
|
.ne(GroupMessage::getStatus, MessageStatus.RECALL.code()).orderByDesc(GroupMessage::getId).last("limit " + stIdx + "," + size); |
|
|
|
|
|
|
|
List<GroupMessage> messages = this.list(wrapper); |
|
|
|
List<GroupMessageVO> messageInfos = messages.stream().map(m -> BeanUtils.copyProperties(m, GroupMessageVO.class)).collect(Collectors.toList()); |
|
|
|
List<GroupMessageVO> messageInfos = |
|
|
|
messages.stream().map(m -> BeanUtils.copyProperties(m, GroupMessageVO.class)).collect(Collectors.toList()); |
|
|
|
log.info("拉取群聊记录,用户id:{},群聊id:{},数量:{}", userId, groupId, messageInfos.size()); |
|
|
|
return messageInfos; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|