fix: 优化im搜索

This commit is contained in:
misworga831 2023-10-16 11:49:42 +08:00
parent 7c64e1f11d
commit b30909942a
6 changed files with 108 additions and 45 deletions

View File

@ -0,0 +1,47 @@
package cn.lili.modules.im.entity.dto;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.modules.im.entity.dos.ImTalk;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author paulG
* @since 2023/2/6
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class IMTalkQueryParams {
@ApiModelProperty("用户1 id")
private String userId1;
@ApiModelProperty("用户2 id")
private String userId2;
@ApiModelProperty("用户1 name")
private String name1;
@ApiModelProperty("用户2 name")
private String name2;
@ApiModelProperty("关键字")
private String userName;
public QueryWrapper<ImTalk> queryWrapper() {
QueryWrapper<ImTalk> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(CharSequenceUtil.isNotEmpty(userId1), "user_id1", this.userId1);
queryWrapper.eq(CharSequenceUtil.isNotEmpty(userId2), "user_id2", this.userId2);
queryWrapper.eq(CharSequenceUtil.isNotEmpty(name1), "name1", this.name1);
queryWrapper.eq(CharSequenceUtil.isNotEmpty(name2), "name2", this.name2);
queryWrapper.nested(CharSequenceUtil.isNotEmpty(userName), i -> i.like("name1", userName).or().like("name2", userName));
return queryWrapper;
}
}

View File

@ -6,15 +6,19 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* @author chc * @author chc
* @since 2022/6/2114:46 * @since 2022/6/2114:46
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel @ApiModel
public class ImQueryParams extends PageVO { public class ImQueryParams extends PageVO {
private static final long serialVersionUID = 5792718094087541134L;
@ApiModelProperty("用户Id") @ApiModelProperty("用户Id")
private String memberId; private String memberId;

View File

@ -1,12 +1,13 @@
package cn.lili.modules.im.entity.dto; package cn.lili.modules.im.entity.dto;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.im.entity.dos.ImMessage; import cn.lili.modules.im.entity.dos.ImMessage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* MessageQueryParams * MessageQueryParams
@ -15,8 +16,12 @@ import lombok.Data;
* @version v1.0 * @version v1.0
* 2022-01-20 17:16 * 2022-01-20 17:16
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class MessageQueryParams extends PageVO { public class MessageQueryParams extends PageVO {
private static final long serialVersionUID = 3504156704697214077L;
/** /**
* 聊天窗口 * 聊天窗口
*/ */
@ -31,7 +36,7 @@ public class MessageQueryParams extends PageVO {
private Integer num; private Integer num;
public LambdaQueryWrapper<ImMessage> initQueryWrapper() { public LambdaQueryWrapper<ImMessage> initQueryWrapper() {
if (StringUtils.isEmpty(talkId)) { if (CharSequenceUtil.isEmpty(talkId)) {
throw new ServiceException(ResultCode.ERROR); throw new ServiceException(ResultCode.ERROR);
} }
if (num == null || num > 50) { if (num == null || num > 50) {
@ -40,7 +45,7 @@ public class MessageQueryParams extends PageVO {
LambdaQueryWrapper<ImMessage> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ImMessage> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ImMessage::getTalkId, talkId); lambdaQueryWrapper.eq(ImMessage::getTalkId, talkId);
if (StringUtils.isNotEmpty(lastMessageId)) { if (CharSequenceUtil.isNotEmpty(lastMessageId)) {
lambdaQueryWrapper.lt(ImMessage::getId, lastMessageId); lambdaQueryWrapper.lt(ImMessage::getId, lastMessageId);
} }
lambdaQueryWrapper.orderByDesc(ImMessage::getCreateTime); lambdaQueryWrapper.orderByDesc(ImMessage::getCreateTime);

View File

@ -1,6 +1,7 @@
package cn.lili.modules.im.service; package cn.lili.modules.im.service;
import cn.lili.modules.im.entity.dos.ImTalk; import cn.lili.modules.im.entity.dos.ImTalk;
import cn.lili.modules.im.entity.dto.IMTalkQueryParams;
import cn.lili.modules.im.entity.vo.ImTalkVO; import cn.lili.modules.im.entity.vo.ImTalkVO;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
@ -45,13 +46,13 @@ public interface ImTalkService extends IService<ImTalk> {
/** /**
* 获取用户聊天列表 * 获取用户聊天列表
* @return * @return 用户聊天列表
*/ */
List<ImTalkVO> getUserTalkList(); List<ImTalkVO> getUserTalkList(IMTalkQueryParams imTalkQueryParams);
/** /**
* 获取商家聊天列表 * 获取商家聊天列表
* @return * @return 商家聊天列表
*/ */
List<ImTalkVO> getStoreTalkList(); List<ImTalkVO> getStoreTalkList(IMTalkQueryParams imTalkQueryParams);
} }

View File

@ -1,5 +1,6 @@
package cn.lili.modules.im.serviceimpl; package cn.lili.modules.im.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
@ -7,6 +8,7 @@ import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.enums.UserEnums;
import cn.lili.modules.im.entity.dos.ImMessage; import cn.lili.modules.im.entity.dos.ImMessage;
import cn.lili.modules.im.entity.dos.ImTalk; import cn.lili.modules.im.entity.dos.ImTalk;
import cn.lili.modules.im.entity.dto.IMTalkQueryParams;
import cn.lili.modules.im.entity.vo.ImTalkVO; import cn.lili.modules.im.entity.vo.ImTalkVO;
import cn.lili.modules.im.mapper.ImTalkMapper; import cn.lili.modules.im.mapper.ImTalkMapper;
import cn.lili.modules.im.service.ImMessageService; import cn.lili.modules.im.service.ImMessageService;
@ -173,13 +175,16 @@ public class ImTalkServiceImpl extends ServiceImpl<ImTalkMapper, ImTalk> impleme
} }
@Override @Override
public List<ImTalkVO> getUserTalkList() { public List<ImTalkVO> getUserTalkList(IMTalkQueryParams imTalkQueryParams) {
AuthUser authUser = UserContext.getCurrentUser(); AuthUser authUser = UserContext.getCurrentUser();
if (authUser == null) { if (authUser == null) {
throw new ServiceException(ResultCode.USER_NOT_LOGIN); throw new ServiceException(ResultCode.USER_NOT_LOGIN);
} }
LambdaQueryWrapper<ImTalk> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ImTalk> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.and(wq -> wq.eq(ImTalk::getUserId1, authUser.getId()).or().eq(ImTalk::getUserId2, authUser.getId())); queryWrapper.and(wq -> wq.eq(ImTalk::getUserId1, authUser.getId()).or().eq(ImTalk::getUserId2, authUser.getId()));
if (CharSequenceUtil.isNotEmpty(imTalkQueryParams.getUserName())) {
queryWrapper.and(wq -> wq.ne(ImTalk::getUserId1, authUser.getId()).like(ImTalk::getName1, imTalkQueryParams.getUserName()).or().ne(ImTalk::getUserId2, authUser.getId()).like(ImTalk::getName2, imTalkQueryParams.getUserName()));
}
queryWrapper.orderByDesc(ImTalk::getLastTalkTime); queryWrapper.orderByDesc(ImTalk::getLastTalkTime);
List<ImTalk> imTalks = this.list(queryWrapper); List<ImTalk> imTalks = this.list(queryWrapper);
List<ImTalkVO> imTalkVOList = imTalks.stream().map(imTalk -> new ImTalkVO(imTalk, authUser.getId())).collect(Collectors.toList()); List<ImTalkVO> imTalkVOList = imTalks.stream().map(imTalk -> new ImTalkVO(imTalk, authUser.getId())).collect(Collectors.toList());
@ -188,27 +193,27 @@ public class ImTalkServiceImpl extends ServiceImpl<ImTalkMapper, ImTalk> impleme
} }
@Override @Override
public List<ImTalkVO> getStoreTalkList() { public List<ImTalkVO> getStoreTalkList(IMTalkQueryParams imTalkQueryParams) {
AuthUser authUser = UserContext.getCurrentUser(); AuthUser authUser = UserContext.getCurrentUser();
if (authUser == null) { if (authUser == null) {
throw new ServiceException(ResultCode.STORE_NOT_LOGIN_ERROR); throw new ServiceException(ResultCode.STORE_NOT_LOGIN_ERROR);
} }
LambdaQueryWrapper<ImTalk> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ImTalk> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.and(wq->{ queryWrapper.and(wq -> wq.eq(ImTalk::getUserId1, authUser.getStoreId()).or().eq(ImTalk::getUserId2, authUser.getStoreId()));
wq.eq(ImTalk::getUserId1, authUser.getStoreId()).or().eq(ImTalk::getUserId2,authUser.getStoreId()); if (CharSequenceUtil.isNotEmpty(imTalkQueryParams.getUserName())) {
}); queryWrapper.and(wq -> wq.ne(ImTalk::getUserId1, authUser.getStoreId()).like(ImTalk::getName1, imTalkQueryParams.getUserName()).or().ne(ImTalk::getUserId2, authUser.getStoreId()).like(ImTalk::getName2, imTalkQueryParams.getUserName()));
}
queryWrapper.orderByDesc(ImTalk::getLastTalkTime); queryWrapper.orderByDesc(ImTalk::getLastTalkTime);
List<ImTalk> imTalks = this.list(queryWrapper); List<ImTalk> imTalks = this.list(queryWrapper);
List<ImTalkVO> imTalkVOList = imTalks.stream().map(imTalk -> { List<ImTalkVO> imTalkVOList = imTalks.stream().map(imTalk -> new ImTalkVO(imTalk, authUser.getStoreId())).collect(Collectors.toList());
return new ImTalkVO(imTalk, authUser.getStoreId());
}).collect(Collectors.toList());
getUnread(imTalkVOList); getUnread(imTalkVOList);
return imTalkVOList; return imTalkVOList;
} }
/** /**
* 获取未读消息数量 * 获取未读消息数量
*
* @param imTalkVOList 消息列表 * @param imTalkVOList 消息列表
*/ */
private void getUnread(List<ImTalkVO> imTalkVOList) { private void getUnread(List<ImTalkVO> imTalkVOList) {

View File

@ -4,6 +4,7 @@ import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.im.entity.dos.ImTalk; import cn.lili.modules.im.entity.dos.ImTalk;
import cn.lili.modules.im.entity.dto.IMTalkQueryParams;
import cn.lili.modules.im.entity.vo.ImTalkVO; import cn.lili.modules.im.entity.vo.ImTalkVO;
import cn.lili.modules.im.service.ImTalkService; import cn.lili.modules.im.service.ImTalkService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@ -58,14 +59,14 @@ public class ImTalkController {
@GetMapping("/list") @GetMapping("/list")
@ApiOperation(value = "分页获取用户聊天") @ApiOperation(value = "分页获取用户聊天")
public ResultMessage<List<ImTalkVO>> getUserTalkList() { public ResultMessage<List<ImTalkVO>> getUserTalkList(IMTalkQueryParams imTalkQueryParams) {
return ResultUtil.data(imTalkService.getUserTalkList()); return ResultUtil.data(imTalkService.getUserTalkList(imTalkQueryParams));
} }
@GetMapping("/store/list") @GetMapping("/store/list")
@ApiOperation(value = "分页获取商家聊天") @ApiOperation(value = "分页获取商家聊天")
public ResultMessage<List<ImTalkVO>> getStoreTalkList() { public ResultMessage<List<ImTalkVO>> getStoreTalkList(IMTalkQueryParams imTalkQueryParams) {
return ResultUtil.data(imTalkService.getStoreTalkList()); return ResultUtil.data(imTalkService.getStoreTalkList(imTalkQueryParams));
} }
@DeleteMapping(value = "/{id}") @DeleteMapping(value = "/{id}")