Commit 31427855 by Future

已读接口、读者接口新增

parent 4df4aa53
......@@ -61,8 +61,6 @@ public class NormalChatAction {
@Autowired
private ImConversationService imConversationService;
@Autowired
private AsyncPush systemPush;
@Autowired
private ImConversationMembersService imConversationMembersService;
@Autowired
private ImMessageService imMessageService;
......
......@@ -2,6 +2,8 @@ package com.wecloud.im.controller;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.friend.param.ImFriendApplyDto;
import com.wecloud.im.param.ClientInfoParam;
import com.wecloud.im.param.GetClientInfoParam;
import com.wecloud.im.param.GetOnlineStatusParam;
import com.wecloud.im.param.add.ImClientDeviceInfoAdd;
......@@ -10,9 +12,12 @@ import com.wecloud.im.param.add.ImClientHeadPortraitAndNicknameUpdate;
import com.wecloud.im.param.add.ImClientNicknameAdd;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.vo.ClientInfoVo;
import com.wecloud.im.vo.GetInfoListVo;
import com.wecloud.im.vo.ImOnlineStatusVo;
import com.wecloud.im.vo.MyInfoVo;
import com.wecloud.im.ws.cache.UserStateCacheManager;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.core.validator.groups.Add;
......@@ -52,6 +57,16 @@ public class ImClientController extends BaseController {
@Autowired
private ImApplicationService imApplicationService;
/**
* 查询我的信息
*/
@PostMapping("/myInfo")
@ApiOperation(value = "查询我的信息")
public ApiResult<MyInfoVo> myInfo() {
MyInfoVo myInfo = imClientService.getMyInfo();
return ApiResult.ok(myInfo);
}
@PostMapping("/infoList")
@ApiOperation(value = "根据id获取Client的头像昵称")
......@@ -59,6 +74,19 @@ public class ImClientController extends BaseController {
return imClientService.getInfoList(getClientInfoParam);
}
/**
* 查询用户信息 用户可能是好友、陌生人、被拉黑名单的人
*/
@PostMapping("/clientInfo")
@ApiOperation(value = "查询用户信息 用户可能是好友、陌生人、被拉黑名单的人")
public ApiResult<ClientInfoVo> getClientInfo(@RequestBody ClientInfoParam param) {
if(param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
ClientInfoVo clientInfoVo = imClientService.getClientInfo(param);
return ApiResult.ok(clientInfoVo);
}
/**
* 添加或修改推送设备信息
......
package com.wecloud.im.controller;
import com.wecloud.im.param.ImMsgReadStatusUpdate;
import com.wecloud.im.param.MsgReadStatusUpdateParam;
import com.wecloud.im.param.ImMsgReceivedStatusUpdate;
import com.wecloud.im.service.ImInboxService;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
......@@ -44,8 +44,17 @@ public class ImInboxController extends BaseController {
*/
@PostMapping("/msgReadUpdate")
@ApiOperation(value = "消息修改为已读状态")
public ApiResult<Boolean> updateInMsgReadUpdate(@RequestBody ImMsgReadStatusUpdate imMsgReadStatusUpdate) throws Exception {
return imInboxService.updateImMsgRead(imMsgReadStatusUpdate);
public ApiResult<Boolean> updateInMsgReadUpdate(@RequestBody MsgReadStatusUpdateParam msgReadStatusUpdateParam) throws Exception {
return imInboxService.updateImMsgRead(msgReadStatusUpdateParam);
}
/**
* 整个会话消息修改为已读状态
*/
@PostMapping("/updateMsgReadStatusByConversation")
@ApiOperation(value = "整个会话消息修改为已读状态")
public ApiResult<Boolean> updateMsgReadStatusByConversation(@RequestBody MsgReadStatusUpdateParam msgReadStatusUpdateParam) throws Exception {
return ApiResult.ok(imInboxService.updateMsgReadStatusByConversation(msgReadStatusUpdateParam));
}
//
......
package com.wecloud.im.controller;
import com.wecloud.im.param.GetReadersParam;
import com.wecloud.im.param.ImHistoryMessagePageParam;
import com.wecloud.im.param.add.ImMsgRecall;
import com.wecloud.im.param.add.ImMsgUpdate;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.vo.ImMessageOfflineListVo;
import com.wecloud.im.vo.OfflineMsgDto;
import com.wecloud.im.vo.ReaderList;
import com.wecloud.im.vo.ReaderVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
......@@ -77,6 +80,16 @@ public class ImMessageController extends BaseController {
return ApiResult.ok(paging);
}
/**
* 查询某个消息已读client列表和未读client
*/
@PostMapping("/getReaders")
@ApiOperation(value = "查询某个消息已读client列表和未读client")
public ApiResult<ReaderList> getReaders(@Validated @RequestBody GetReadersParam param) {
ReaderList readerList = imMessageService.getReaders(param);
return ApiResult.ok(readerList);
}
//
// /**
// * 添加消息存储表
......
package com.wecloud.im.enums;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
/**
* @Author wenzhida
* @Date 2022/2/15 13:57
* @Description 与client关系枚举
*/
public enum RelationEnum implements BaseEnum {
/**
* 1-陌生人
*/
STRANGER(1, "陌生人"),
/**
* 2-好友
*/
FRIEND(2, "好友"),
/**
* 3-被我拉黑
*/
BE_BLACK(3, "被我拉黑");
RelationEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
private final Integer code;
private final String desc;
@Override
public Integer getCode() {
return this.code;
}
@Override
public String getDesc() {
return this.desc;
}
}
......@@ -46,6 +46,10 @@ public class ImFriend extends BaseEntity {
@ApiModelProperty("好友请求说明")
private String requestRemark;
/**
* 好友关系状态
* @see com.wecloud.im.enums.FriendStateEnum
*/
@ApiModelProperty("好友关系状态")
private Integer state;
......
......@@ -10,7 +10,6 @@ import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.model.request.PushVO;
import com.wecloud.im.ws.sender.AsyncPush;
import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.pushserver.client.model.constant.MqConstant;
import com.wecloud.pushserver.client.model.dto.PushDTO;
......@@ -31,9 +30,6 @@ public class FriendEventSender {
private ChannelSender channelSender;
@Autowired
private AsyncPush systemPush;
@Autowired
private ImApplicationService imApplicationService;
@Autowired
......@@ -96,7 +92,7 @@ public class FriendEventSender {
PushVO pushVO = new PushVO();
pushVO.setTitle(FRIEND_APPROVE_TITLE);
pushVO.setSubTitle(isAgree? FRIEND_APPROVE_TITLE_AGREE : FRIEND_APPROVE_TITLE_REJECT);
pushVO.setSubTitle(isAgree ? FRIEND_APPROVE_TITLE_AGREE : FRIEND_APPROVE_TITLE_REJECT);
PushDTO pushDTO = mqSender.buildPushDto(pushVO, receiveClient, app);
mqSender.sendAsync(MqConstant.Topic.IM_MSG_TOPIC, MqConstant.Tag.IM_MSG_TAG, pushDTO);
}
......
......@@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.param.GetReadersParam;
import com.wecloud.im.param.ImHistoryMessagePageParam;
import com.wecloud.im.param.ImMessagePageParam;
import com.wecloud.im.param.ImMessageQueryVo;
import com.wecloud.im.vo.OfflineMsgDto;
import com.wecloud.im.vo.ReaderVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
......@@ -75,4 +77,13 @@ public interface ImMessageMapper extends BaseMapper<ImMessage> {
* @return
*/
OfflineMsgDto getLastMsgByConversationId(@Param("conversationId") Long conversationId);
/**
* 获取一条消息已读人员和未读人员
* @param currentClientId
* @param param
* @return
*/
List<ReaderVo> getReaders(@Param("currentClientId") Long currentClientId, @Param("param") GetReadersParam param);
}
package com.wecloud.im.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/2/15 11:14
* @Description 获取client信息入参
*/
@Data
public class ClientInfoParam implements Serializable {
private static final long serialVersionUID = 4061204250751318983L;
@ApiModelProperty("会话id")
private Long conversationId;
@ApiModelProperty("clientId")
private String clientId;
}
package com.wecloud.im.param;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* @Author wenzhida
* @Date 2022/2/15 20:45
* @Description 获取某条消息已读人员入参
*/
@Getter
@Setter
@ApiModel(value = "获取某条消息已读人员入参")
public class GetReadersParam extends BaseEntity {
private static final long serialVersionUID = -2415497107453497807L;
@ApiModelProperty("会话id")
private Long conversationId;
@ApiModelProperty("消息id")
private Long msgId;
}
......@@ -19,9 +19,12 @@ import java.util.List;
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "ImMsgReadStatusUpdate")
public class ImMsgReadStatusUpdate extends BaseEntity {
public class MsgReadStatusUpdateParam extends BaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("会话id")
private Long conversationId;
@ApiModelProperty("消息id数组,可以传入单个或多个, 如接收离线消息列表时可以批量修改 则传入多个")
private List<Long> msgIds;
......
package com.wecloud.im.service;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.param.ClientInfoParam;
import com.wecloud.im.param.GetClientInfoParam;
import com.wecloud.im.param.ImClientPageParam;
import com.wecloud.im.param.ImClientQueryVo;
......@@ -9,10 +10,13 @@ import com.wecloud.im.param.add.ImClientDeviceInfoAdd;
import com.wecloud.im.param.add.ImClientHeadPortraitAdd;
import com.wecloud.im.param.add.ImClientHeadPortraitAndNicknameUpdate;
import com.wecloud.im.param.add.ImClientNicknameAdd;
import com.wecloud.im.vo.ClientInfoVo;
import com.wecloud.im.vo.GetInfoListVo;
import com.wecloud.im.vo.MyInfoVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
......@@ -24,6 +28,12 @@ import java.util.List;
*/
public interface ImClientService extends BaseService<ImClient> {
/**
* 查询我的信息
* @return
*/
MyInfoVo getMyInfo();
boolean updateHeadPortrait(ImClientHeadPortraitAdd imClientHeadPortraitAdd) throws Exception;
boolean updateHeadAndNickname(ImClientHeadPortraitAndNicknameUpdate imClientHeadPortraitAndNicknameUpdate);
......@@ -38,6 +48,13 @@ public interface ImClientService extends BaseService<ImClient> {
*/
ApiResult<List<GetInfoListVo>> getInfoList(GetClientInfoParam getClientInfoParam) throws Exception;
/**
* 获取群里成员信息
* @param param
* @return
*/
ClientInfoVo getClientInfo(ClientInfoParam param);
boolean updateNickname(ImClientNicknameAdd imClientNicknameAdd) throws Exception;
......
......@@ -2,7 +2,7 @@ package com.wecloud.im.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.param.ImMsgReadStatusUpdate;
import com.wecloud.im.param.MsgReadStatusUpdateParam;
import com.wecloud.im.param.ImMsgReceivedStatusUpdate;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.BaseService;
......@@ -82,6 +82,13 @@ public interface ImInboxService extends BaseService<ImInbox> {
*
* @return
*/
ApiResult<Boolean> updateImMsgRead(ImMsgReadStatusUpdate imMsgReadStatusUpdate) throws JsonProcessingException;
ApiResult<Boolean> updateImMsgRead(MsgReadStatusUpdateParam msgReadStatusUpdateParam) throws JsonProcessingException;
/**
* 整个会话消息修改为已读状态
* @param msgReadStatusUpdateParam
* @return
*/
Boolean updateMsgReadStatusByConversation(MsgReadStatusUpdateParam msgReadStatusUpdateParam);
}
......@@ -4,6 +4,7 @@ import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.GetReadersParam;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImHistoryMessagePageParam;
import com.wecloud.im.param.add.ImMsgRecall;
......@@ -11,6 +12,7 @@ import com.wecloud.im.param.add.ImMsgSendToOnlineClient;
import com.wecloud.im.param.add.ImMsgUpdate;
import com.wecloud.im.vo.ImMessageOfflineListVo;
import com.wecloud.im.vo.OfflineMsgDto;
import com.wecloud.im.vo.ReaderList;
import com.wecloud.im.ws.model.request.ReceiveDataVO;
import com.wecloud.im.ws.model.request.ReceiveVO;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
......@@ -112,39 +114,11 @@ public interface ImMessageService extends BaseService<ImMessage> {
*/
boolean saveImMessage(ImMessage imMessage) throws Exception;
// /**
// * 修改
// *
// * @param imMessage
// * @return
// * @throws Exception
// */
// boolean updateImMessage(ImMessage imMessage) throws Exception;
//
// /**
// * 删除
// *
// * @param id
// * @return
// * @throws Exception
// */
// boolean deleteImMessage(Long id) throws Exception;
//
// /**
// * 根据ID获取查询对象
// *
// * @param id
// * @return
// * @throws Exception
// */
// ImMessageQueryVo getImMessageById(Long id) throws Exception;
//
// /**
// * 获取分页对象
// *
// * @param imMessagePageParam
// * @return
// * @throws Exception
// */
// Paging<ImMessageQueryVo> getImMessagePageList(ImMessagePageParam imMessagePageParam) throws Exception;
/**
* 获取读取人员
* @param param
* @return
*/
ReaderList getReaders(GetReadersParam param);
}
......@@ -13,6 +13,7 @@ import com.wecloud.im.param.add.ImClientBlacklistUpdate;
import com.wecloud.im.service.ImClientBlacklistService;
import com.wecloud.im.service.ImClientService;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
......@@ -53,19 +54,22 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> addImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
ImClient client = imClientService.getCurentClient();
ImClient client1 = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
if (client == null) {
throw new BusinessException("当前用户登录信息失效");
}
ImClient beBlacker = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, client.getFkAppid())
.eq(ImClient::getClientId, imClientBlacklistUpdate.getClientIdBePrevent()));
if (beBlacker == null) {
throw new BusinessException("查无用户信息");
}
ImClientBlacklist imClientBlacklist = new ImClientBlacklist();
imClientBlacklist.setId(SnowflakeUtil.getId());
imClientBlacklist.setCreateTime(new Date());
imClientBlacklist.setFkAppid(client.getFkAppid());
imClientBlacklist.setFkClientIdPrevent(client.getId());
imClientBlacklist.setFkClientIdBePrevent(client1.getId());
boolean save = this.save(imClientBlacklist);
imClientBlacklist.setFkClientIdBePrevent(beBlacker.getId());
this.save(imClientBlacklist);
return ApiResult.ok();
}
......@@ -75,17 +79,20 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
public ApiResult<Boolean> removeImClientBlacklist(ImClientBlacklistUpdate imClientBlacklistUpdate) throws Exception {
// 操作者
ImClient client = imClientService.getCurentClient();
if (client == null) {
throw new BusinessException("当前用户登录信息失效");
}
// 被拉黑者
ImClient client1 = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
ImClient beBlacker = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, client.getFkAppid())
.eq(ImClient::getClientId, imClientBlacklistUpdate.getClientIdBePrevent()));
if (beBlacker == null) {
throw new BusinessException("查无用户信息");
}
// 删除
boolean remove = this.remove(new QueryWrapper<ImClientBlacklist>().lambda()
this.remove(new QueryWrapper<ImClientBlacklist>().lambda()
.eq(ImClientBlacklist::getFkClientIdPrevent, client.getId())
.eq(ImClientBlacklist::getFkClientIdBePrevent, client1.getId()));
.eq(ImClientBlacklist::getFkClientIdBePrevent, beBlacker.getId()));
return ApiResult.ok();
}
......
......@@ -5,9 +5,16 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImClientBlacklist;
import com.wecloud.im.enums.FriendStateEnum;
import com.wecloud.im.enums.RelationEnum;
import com.wecloud.im.friend.entity.ImFriend;
import com.wecloud.im.friend.service.ImFriendService;
import com.wecloud.im.mapper.ImClientMapper;
import com.wecloud.im.param.ClientInfoParam;
import com.wecloud.im.param.GetClientInfoParam;
import com.wecloud.im.param.ImClientPageParam;
import com.wecloud.im.param.ImClientQueryVo;
......@@ -17,8 +24,11 @@ import com.wecloud.im.param.add.ImClientHeadPortraitAdd;
import com.wecloud.im.param.add.ImClientHeadPortraitAndNicknameUpdate;
import com.wecloud.im.param.add.ImClientNicknameAdd;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientBlacklistService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.vo.ClientInfoVo;
import com.wecloud.im.vo.GetInfoListVo;
import com.wecloud.im.vo.MyInfoVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
......@@ -27,6 +37,7 @@ import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken;
import io.geekidea.springbootplus.framework.shiro.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
......@@ -35,6 +46,7 @@ import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
......@@ -53,6 +65,23 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Autowired
private ImApplicationService imApplicationService;
@Autowired
private ImFriendService imFriendService;
@Autowired
private ImClientBlacklistService imClientBlacklistService;
@Override
public MyInfoVo getMyInfo() {
ImClient currentClient = this.getCurentClient();
if (currentClient == null) {
throw new BusinessException("当前用户登录信息失效");
}
MyInfoVo myInfoVo = new MyInfoVo();
BeanUtils.copyProperties(currentClient, myInfoVo);
return myInfoVo;
}
@Override
@Transactional(rollbackFor = Exception.class)
......@@ -124,6 +153,32 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
}
@Override
public ClientInfoVo getClientInfo(ClientInfoParam param) {
ImClient currentClient = this.getCurentClient();
if (currentClient == null) {
throw new BusinessException("当前用户登录信息失效");
}
List<GetInfoListVo> infoList = imClientMapper.getInfoList(currentClient.getFkAppid(), param.getConversationId(),
Lists.newArrayList(param.getClientId()));
if (CollectionUtils.isEmpty(infoList)) {
throw new BusinessException("群内未查询到该用户信息");
}
ClientInfoVo clientInfoVo = new ClientInfoVo();
BeanUtils.copyProperties(infoList.get(0), clientInfoVo);
clientInfoVo.setRelation(RelationEnum.STRANGER.getCode());
// 查询该好友与自己关系: 陌生人、好友、被拉黑名单
ImFriend imFriend = imFriendService.getByKey(currentClient.getId(), clientInfoVo.getId());
if (imFriend != null && FriendStateEnum.CONFORM.getCode().equals(imFriend.getState())) {
clientInfoVo.setRelation(RelationEnum.FRIEND.getCode());
}
// 查询是否被拉黑
if (imClientBlacklistService.isBeBlack(currentClient.getId(), clientInfoVo.getId())) {
clientInfoVo.setRelation(RelationEnum.BE_BLACK.getCode());
}
return clientInfoVo;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateNickname(ImClientNicknameAdd imClientNicknameAdd) throws Exception {
ImClient curentClient = getCurentClient();
......
package com.wecloud.im.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Maps;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversationMembers;
......@@ -8,8 +9,8 @@ import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mapper.ImInboxMapper;
import com.wecloud.im.param.ImMsgReadStatusUpdate;
import com.wecloud.im.param.ImMsgReceivedStatusUpdate;
import com.wecloud.im.param.MsgReadStatusUpdateParam;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
......@@ -23,6 +24,7 @@ import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -31,6 +33,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
* 消息收件箱表 服务实现类
......@@ -109,9 +112,9 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
// 是否同时修改为已读状态
if (imMsgReceivedUpdate.getReadStatus()) {
ImMsgReadStatusUpdate imMsgReadStatusUpdate = new ImMsgReadStatusUpdate();
imMsgReadStatusUpdate.setMsgIds(imMsgReceivedUpdate.getMsgIds());
this.updateImMsgRead(imMsgReadStatusUpdate);
MsgReadStatusUpdateParam msgReadStatusUpdateParam = new MsgReadStatusUpdateParam();
msgReadStatusUpdateParam.setMsgIds(imMsgReceivedUpdate.getMsgIds());
this.updateImMsgRead(msgReadStatusUpdateParam);
}
return ApiResult.ok();
......@@ -132,11 +135,11 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> updateImMsgRead(ImMsgReadStatusUpdate imMsgReadStatusUpdate) {
public ApiResult<Boolean> updateImMsgRead(MsgReadStatusUpdateParam msgReadStatusUpdateParam) {
ImClient curentClient = imClientService.getCurentClient();
// 修改已读状态
Long aLong = imInboxMapper.updateImMsgReadByIds(curentClient.getId(), imMsgReadStatusUpdate.getMsgIds());
Long aLong = imInboxMapper.updateImMsgReadByIds(curentClient.getId(), msgReadStatusUpdateParam.getMsgIds());
// 根据appKey查询appid
ImApplication application = imApplicationService.getCacheById(curentClient.getFkAppid());
......@@ -144,12 +147,34 @@ public class ImInboxServiceImpl extends BaseServiceImpl<ImInboxMapper, ImInbox>
// 内容
HashMap<String, String> contentMap = new HashMap<>();
contentMap.put("receiverId", curentClient.getClientId());
sendMsgStatus(curentClient, MsgTypeEnum.CLIENT_READ_MSG, contentMap, imMsgReadStatusUpdate.getMsgIds());
sendMsgStatus(curentClient, MsgTypeEnum.CLIENT_READ_MSG, contentMap, msgReadStatusUpdateParam.getMsgIds());
return ApiResult.ok();
}
@Override
public Boolean updateMsgReadStatusByConversation(MsgReadStatusUpdateParam msgReadStatusUpdateParam) {
ImClient currentClient = imClientService.getCurentClient();
// 获取该用户该会话所有未读消息 msgId 列表
List<ImInbox> imInboxList = this.list(new QueryWrapper<ImInbox>().lambda()
.eq(ImInbox::getFkConversationId, msgReadStatusUpdateParam.getConversationId())
.notIn(ImInbox::getReceiver, currentClient.getId()));
if (CollectionUtils.isEmpty(imInboxList)) {
return true;
}
List<Long> msgIds = imInboxList.stream().map(i -> i.getFkMsgId()).collect(Collectors.toList());
// 修改已读状态
imInboxMapper.updateImMsgReadByIds(currentClient.getId(), msgIds);
// 内容
HashMap<String, String> contentMap = Maps.newHashMap();
contentMap.put("receiverId", currentClient.getClientId());
sendMsgStatus(currentClient, MsgTypeEnum.CLIENT_READ_MSG, contentMap, msgIds);
return null;
}
/**
* 下发状态类型消息
*
......
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.wecloud.im.entity.ImApiMessageOnlineSend;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
......@@ -14,6 +15,7 @@ import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.enums.ChatTypeEnum;
import com.wecloud.im.mapper.ImMessageMapper;
import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.GetReadersParam;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImHistoryMessagePageParam;
import com.wecloud.im.param.add.ImMsgRecall;
......@@ -27,6 +29,8 @@ import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.thousandchat.service.ThousandChatService;
import com.wecloud.im.vo.ImMessageOfflineListVo;
import com.wecloud.im.vo.OfflineMsgDto;
import com.wecloud.im.vo.ReaderList;
import com.wecloud.im.vo.ReaderVo;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.model.request.PushVO;
......@@ -37,6 +41,7 @@ import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
......@@ -319,30 +324,37 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
public boolean saveImMessage(ImMessage imMessage) throws Exception {
return super.save(imMessage);
}
//
// @Transactional(rollbackFor = Exception.class)
// @Override
// public boolean updateImMessage(ImMessage imMessage) throws Exception {
// return super.updateById(imMessage);
// }
//
// @Transactional(rollbackFor = Exception.class)
// @Override
// public boolean deleteImMessage(Long id) throws Exception {
// return super.removeById(id);
// }
//
// @Override
// public ImMessageQueryVo getImMessageById(Long id) throws Exception {
// return imMessageMapper.getImMessageById(id);
// }
//
// @Override
// public Paging<ImMessageQueryVo> getImMessagePageList(ImMessagePageParam imMessagePageParam) throws Exception {
// Page<ImMessageQueryVo> page = new PageInfo<>(imMessagePageParam, OrderItem.desc(getLambdaColumn(ImMessage::getCreateTime)));
// IPage<ImMessageQueryVo> iPage = imMessageMapper.getImMessagePageList(page, imMessagePageParam);
// return new Paging<ImMessageQueryVo>(iPage);
// }
/**
* 获取读取人员
*
* @param param
* @return
*/
@Override
public ReaderList getReaders(GetReadersParam param) {
ImClient currentClient = imClientService.getCurentClient();
if (currentClient == null) {
throw new BusinessException("当前用户登录信息失效");
}
List<ReaderVo> readerVos = imMessageMapper.getReaders(currentClient.getId(), param);
if (CollectionUtils.isEmpty(readerVos)) {
return null;
}
List<ReaderVo> readList = Lists.newArrayList();
List<ReaderVo> unReadList = Lists.newArrayList();
for (ReaderVo readerVo : readerVos) {
if (readerVo.getReadMsgStatus() == 0) {
unReadList.add(readerVo);
} else {
readList.add(readerVo);
}
}
ReaderList readerList = new ReaderList();
readerList.setReadList(readList);
readerList.setUnReadList(unReadList);
return readerList;
}
@Override
public Paging<OfflineMsgDto> getHistoryMsgConversationId(ImHistoryMessagePageParam imHistoryMessagePageParam) throws Exception {
......@@ -376,7 +388,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
for (ImConversation imConversation : myImConversationList) {
//万人群 暂时跳过,后面统一处理
if(ChatTypeEnum.THOUSAND_GROUP.getCode().equals(imConversation.getChatType())) {
if (ChatTypeEnum.THOUSAND_GROUP.getCode().equals(imConversation.getChatType())) {
thousandConversations.add(imConversation);
continue;
}
......@@ -394,7 +406,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
imMessageOfflineListVoList.add(imMessageOfflineListVo);
}
// 万人群的部分
if(CollectionUtils.isNotEmpty(thousandConversations)) {
if (CollectionUtils.isNotEmpty(thousandConversations)) {
List<ImMessageOfflineListVo> offlineMsgs = thousandChatService.findOfflineMsgs(thousandConversations);
imMessageOfflineListVoList.addAll(offlineMsgs);
}
......
package com.wecloud.im.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/2/15 11:29
* @Description
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "ClientInfoVo")
public class ClientInfoVo implements Serializable {
private static final long serialVersionUID = 1474979499551389791L;
@ApiModelProperty("client主键id")
private Long id;
@ApiModelProperty("会话中client的备注名")
private String clientRemarkName;
@ApiModelProperty("头像")
private String headPortrait;
@ApiModelProperty("主昵称")
private String nickname;
@ApiModelProperty("clientId")
private String clientId;
@ApiModelProperty("client自己的自定义扩展属性")
private String clientAttributes;
@ApiModelProperty("会话成员列表的自定义扩展属性")
private String memberAttributes;
/**
* 与我关系
* @see com.wecloud.im.enums.RelationEnum
*/
@ApiModelProperty("与我关系 1-陌生人 2-好友 3-被我拉黑")
private Integer relation;
}
......@@ -11,6 +11,8 @@ import java.io.Serializable;
@Accessors(chain = true)
@ApiModel(value = "GetInfoListVo")
public class GetInfoListVo implements Serializable {
@ApiModelProperty("client主键id")
private Long id;
@ApiModelProperty("会话中client的备注名")
private String clientRemarkName;
@ApiModelProperty("头像")
......
package com.wecloud.im.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* @Author wenzhida
* @Date 2022/2/15 16:22
* @Description 我的信息
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "我的信息")
public class MyInfoVo implements Serializable {
private static final long serialVersionUID = -5423843620435586377L;
@ApiModelProperty("主键id")
private Long id;
@ApiModelProperty("clientId")
private String clientId;
@ApiModelProperty("最后离线时间")
private Date lastOfflineTime;
@ApiModelProperty("头像")
private String headPortrait;
@ApiModelProperty("主昵称")
private String nickname;
@ApiModelProperty("可选 自定义属性,供开发者扩展使用。")
private String attributes;
}
package com.wecloud.im.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
/**
* @Author wenzhida
* @Date 2022/2/15 20:54
* @Description 已读client展示VO
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "已读client展示VO")
public class ReaderList implements Serializable {
private static final long serialVersionUID = 4658402570720540541L;
@ApiModelProperty("已读人员列表")
private List<ReaderVo> readList;
@ApiModelProperty("未读人员列表")
private List<ReaderVo> unReadList;
}
package com.wecloud.im.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/2/15 20:54
* @Description 读者VO
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "读者VO")
public class ReaderVo implements Serializable {
private static final long serialVersionUID = 4390952170006190474L;
@ApiModelProperty("client主键id")
private Long id;
@ApiModelProperty("头像")
private String headPortrait;
@ApiModelProperty("主昵称")
private String nickname;
@ApiModelProperty("clientId")
private String clientId;
@ApiModelProperty("是否已读 0-否 1-是")
private Integer readMsgStatus;
}
......@@ -23,6 +23,7 @@
<select id="getInfoList" resultType="com.wecloud.im.vo.GetInfoListVo">
SELECT
im_client.id AS id,
im_client.client_id AS clientId,
im_client.head_portrait AS headPortrait,
im_client.nickname,
......
......@@ -24,7 +24,6 @@
UPDATE im_inbox
SET `im_inbox`.`update_time` = NOW(),
`im_inbox`.`read_msg_status` = 1,
`im_inbox`.`receiver_time` = NOW(),
`im_inbox`.`read_time` = NOW()
WHERE
im_inbox.receiver = #{clientId}
......
......@@ -119,4 +119,16 @@
ORDER BY create_time DESC LIMIT 1
</select>
<select id="getReaders" resultType="com.wecloud.im.vo.ReaderVo">
SELECT client.id as id,
client.head_portrait as headPortrait,
client.nickname as nickname,
client.client_id as clientId,
inbox.read_msg_status as readMsgStatus
FROM `im_inbox` inbox LEFT JOIN im_client client on inbox.receiver = client.id
WHERE inbox.fk_conversation_id = #{param.conversationId}
and inbox.fk_msg_id = #{param.msgId}
and inbox.receiver != #{currentClientId}
</select>
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment