重构私聊列表和用户列表

This commit is contained in:
easonzhu 2025-03-02 22:32:20 +08:00
parent a81705ba10
commit 651f1528f6
6 changed files with 251 additions and 53 deletions

View File

@ -1,15 +1,16 @@
package com.syzb.group.controller.admin;
import com.syzb.common.handler.BizException;
import com.syzb.common.query.OnlyIdPageQuery;
import com.syzb.common.result.AppPager;
import com.syzb.common.result.CommonResult;
import com.syzb.common.result.Pager;
import com.syzb.common.result.ResponseStatus;
import com.syzb.common.vo.BackendUserVO;
import com.syzb.common.vo.OnlyIdVO;
import com.syzb.group.query.PageCustomerQuery;
import com.syzb.group.query.message.*;
import com.syzb.group.service.admin.AdminGroupMessageService;
import com.syzb.group.vo.GroupCustomerVO;
import com.syzb.group.vo.PagePrivateChatQuery;
import com.syzb.group.vo.message.GroupMessageVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -58,17 +59,17 @@ public class AdminGroupMessageController {
@ApiOperation("后台获取私聊列表")
@PostMapping("/admin/group/message/getPrivateChatList")
public CommonResult<Pager<GroupMessageVO>> getPrivateChatList(@Validated @RequestBody @ApiParam(required = true) OnlyIdPageQuery query,
public CommonResult<AppPager<GroupMessageVO>> getPrivateChatList(@Validated @RequestBody @ApiParam(required = true) PagePrivateChatQuery query,
@RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) {
Pager<GroupMessageVO> page = adminGroupMessageService.getPrivateChatList(query, backendUserVO);
AppPager<GroupMessageVO> page = adminGroupMessageService.getPrivateChatList(query, backendUserVO);
return CommonResult.success(page);
}
@ApiOperation("后台获取用户列表")
@PostMapping("/admin/group/message/getCustomerList")
public CommonResult<Pager<GroupMessageVO>> getCustomerList(@Validated @RequestBody @ApiParam(required = true) OnlyIdPageQuery query,
@RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) {
Pager<GroupMessageVO> page = adminGroupMessageService.getCustomerList(query, backendUserVO);
public CommonResult<AppPager<GroupCustomerVO>> getCustomerList(@Validated @RequestBody @ApiParam(required = true) PageCustomerQuery query,
@RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) {
AppPager<GroupCustomerVO> page = adminGroupMessageService.getCustomerList(query, backendUserVO);
return CommonResult.success(page);
}

View File

@ -2,9 +2,7 @@ package com.syzb.group.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.syzb.common.vo.DateIdVO;
import com.syzb.group.entity.GroupMessage;
import org.apache.ibatis.annotations.Param;
@ -23,23 +21,14 @@ import java.util.List;
*/
public interface GroupMessageMapper extends BaseMapper<GroupMessage> {
@Select("SELECT id \n" +
"FROM ( \n" +
" SELECT id, ROW_NUMBER() OVER (PARTITION BY private_user_id ORDER BY id DESC) as rn \n" +
" FROM group_message \n" +
" WHERE group_id = #{groupId} AND interactive_type = 2 and private_user_id is not null \n" +
") t \n" +
"${ew.customSqlSegment}")
<E extends IPage<GroupMessage>> E selectPrivateChatPage(@Param("groupId") Integer groupId, Page<?> page, @Param(Constants.WRAPPER) Wrapper<?> wrapper);
@Select("SELECT id, private_user_id \n" +
"FROM ( \n" +
" SELECT id, private_user_id, ROW_NUMBER() OVER (PARTITION BY private_user_id ORDER BY id DESC) as rn \n" +
" FROM group_message \n" +
" WHERE group_id = #{groupId} AND interactive_type = 2 and private_user_id in (${userIds}) \n" +
" WHERE group_id = #{groupId} AND interactive_type = 2 and private_user_id is not null \n" +
") t \n" +
"WHERE rn = 1")
List<GroupMessage> selectPrivateChatList(@Param("groupId") Integer groupId, @Param("userIds") String userIds);
"${ew.customSqlSegment}")
List<GroupMessage> selectPrivateChatList(@Param("groupId") Integer groupId, @Param(Constants.WRAPPER) Wrapper<?> wrapper);
@Select("SELECT group_id, interactive_type, user_type, COUNT(0) AS id \n" +
"FROM group_message \n" +

View File

@ -0,0 +1,77 @@
package com.syzb.group.query;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
public class PageCustomerQuery {
@ApiModelProperty("交易圈ID")
@NotNull
private Integer groupId;
@ApiModelProperty("数量")
@NotNull
private Integer size;
@ApiModelProperty("用户ID")
private String userId;
@ApiModelProperty("昵称")
private String nickName;
@ApiModelProperty("上一页最后加入时间")
private LocalDateTime lastJoinTime;
@ApiModelProperty("上一页最后ID")
private Integer lastId;
public Integer getGroupId() {
return groupId;
}
public void setGroupId(Integer groupId) {
this.groupId = groupId;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public LocalDateTime getLastJoinTime() {
return lastJoinTime;
}
public void setLastJoinTime(LocalDateTime lastJoinTime) {
this.lastJoinTime = lastJoinTime;
}
public Integer getLastId() {
return lastId;
}
public void setLastId(Integer lastId) {
this.lastId = lastId;
}
}

View File

@ -6,8 +6,6 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.base.Functions;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.map.IMap;
import com.syzb.advisor.service.AdvisorInfoService;
@ -18,9 +16,7 @@ import com.syzb.common.config.cache.CacheKey;
import com.syzb.common.constant.IsOrNot;
import com.syzb.common.constant.ProductType;
import com.syzb.common.handler.BizException;
import com.syzb.common.query.OnlyIdPageQuery;
import com.syzb.common.result.AppPager;
import com.syzb.common.result.Pager;
import com.syzb.common.result.ResponseStatus;
import com.syzb.common.service.CommentBlackService;
import com.syzb.common.state.StateMachine;
@ -33,18 +29,24 @@ import com.syzb.group.entity.GroupMessageRead;
import com.syzb.group.mapper.GroupInfoMapper;
import com.syzb.group.mapper.GroupMessageMapper;
import com.syzb.group.mapper.GroupMessageReadMapper;
import com.syzb.group.query.PageCustomerQuery;
import com.syzb.group.query.message.*;
import com.syzb.group.service.common.GroupCacheService;
import com.syzb.group.service.common.GroupCommonService;
import com.syzb.group.service.common.GroupMessageService;
import com.syzb.group.vo.GroupCustomerVO;
import com.syzb.group.vo.PagePrivateChatQuery;
import com.syzb.group.vo.message.GroupMessageReadVO;
import com.syzb.group.vo.message.GroupMessageVO;
import com.syzb.rbac.entity.WxUser;
import com.syzb.rbac.mapper.WxUserMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
@ -89,6 +91,9 @@ public class AdminGroupMessageService {
@Resource
private ModuleUserMapper moduleUserMapper;
@Resource
private WxUserMapper wxUserMapper;
@Transactional(rollbackFor = Exception.class)
public OnlyIdVO sendAdvisorMessage(SendGroupMessageAdminQuery query, BackendUserVO backendUser) {
GroupInfo group = groupInfoMapper.selectById(query.getGroupId());
@ -184,45 +189,94 @@ public class AdminGroupMessageService {
return new AppPager<>(voList, hasNext);
}
public Pager<GroupMessageVO> getPrivateChatList(OnlyIdPageQuery query, BackendUserVO backendUserVO) {
Integer groupId = query.getId();
public AppPager<GroupMessageVO> getPrivateChatList(PagePrivateChatQuery query, BackendUserVO backendUserVO) {
Integer groupId = query.getGroupId();
Integer size = query.getSize();
String userId = query.getUserId();
String nickName = query.getNickName();
Integer lastId = query.getLastId();
Set<String> queryUserIdSet = null;
if (StrUtil.isNotEmpty(userId) && StrUtil.isNotEmpty(nickName)) {
LambdaQueryWrapper<WxUser> userWrapper = Wrappers.<WxUser>lambdaQuery()
.select(WxUser::getId)
.eq(StrUtil.isNotEmpty(userId), WxUser::getId, userId)
.like(StrUtil.isNotEmpty(nickName), WxUser::getNickName, nickName);
List<WxUser> wxUserList = wxUserMapper.selectList(userWrapper);
queryUserIdSet = wxUserList.stream().map(WxUser::getId).collect(Collectors.toSet());
if (CollUtil.isEmpty(queryUserIdSet)) {
return AppPager.emptyPager();
}
}
QueryWrapper<GroupMessage> wrapper = Wrappers.<GroupMessage>query()
.eq("rn", 1)
.orderByDesc("id");
Page<GroupMessage> page = groupMessageMapper.selectPrivateChatPage(groupId, query.toPage(), wrapper);
List<GroupMessage> list = page.getRecords();
.in(queryUserIdSet != null, "private_user_id", queryUserIdSet)
.lt(lastId != null, "id", lastId)
.orderByDesc("id")
.last("limit " + (size + 1));
System.out.println(wrapper.getCustomSqlSegment());
List<GroupMessage> list = groupMessageMapper.selectPrivateChatList(groupId, wrapper);
boolean hasNext = list.size() > size;
if (hasNext) {
list = list.subList(0, size);
}
Map<Integer, AdvisorBasicVO> advisorMap = advisorInfoService.getAdvisorVoMap();
List<GroupMessageVO> voList = list.stream().map(GroupMessage::getId).map(id -> groupCacheService.getMessage(id, advisorMap)).collect(Collectors.toList());
return new Pager<>(voList, page.getTotal());
return new AppPager<>(voList, hasNext);
}
public Pager<GroupMessageVO> getCustomerList(OnlyIdPageQuery query, BackendUserVO backendUserVO) {
Integer groupId = query.getId();
public AppPager<GroupCustomerVO> getCustomerList(PageCustomerQuery query, BackendUserVO backendUserVO) {
Integer groupId = query.getGroupId();
Integer size = query.getSize();
String userId = query.getUserId();
String nickName = query.getNickName();
LocalDateTime lastJoinTime = query.getLastJoinTime();
Integer lastId = query.getLastId();
Set<Integer> moduleIdSet = groupCommonService.getModuleIds(groupId);
if (CollUtil.isEmpty(moduleIdSet)) {
return Pager.emptyPager();
return AppPager.emptyPager();
}
LambdaQueryWrapper<ModuleUser> wrapper = Wrappers.<ModuleUser>lambdaQuery()
.select(ModuleUser::getUserId)
.in(ModuleUser::getModuleId, moduleIdSet)
.orderByDesc(ModuleUser::getCreateTime);
Page<ModuleUser> page = moduleUserMapper.selectPage(query.toPage(), wrapper);
if (CollUtil.isEmpty(page.getRecords())) {
return new Pager<>(Collections.emptyList(), page.getTotal());
}
List<String> userIdList = page.getRecords().stream().map(ModuleUser::getUserId).collect(Collectors.toList());
String userIds = userIdList.stream().map(userId -> "'" + userId + "'").collect(Collectors.joining(","));
List<GroupMessage> privateChatList = groupMessageMapper.selectPrivateChatList(groupId, userIds);
Map<String, GroupMessage> privateChatMap = privateChatList.stream().collect(Collectors.toMap(GroupMessage::getPrivateUserId, Functions.identity()));
Map<Integer, AdvisorBasicVO> advisorMap = advisorInfoService.getAdvisorVoMap();
List<GroupMessageVO> voList = userIdList.stream().map(userId -> {
GroupMessage groupMessage = privateChatMap.get(userId);
if (groupMessage == null) {
return new GroupMessageVO(userId);
Set<String> queryUserIdSet = null;
if (StrUtil.isNotEmpty(userId) && StrUtil.isNotEmpty(nickName)) {
LambdaQueryWrapper<WxUser> userWrapper = Wrappers.<WxUser>lambdaQuery()
.select(WxUser::getId)
.eq(StrUtil.isNotEmpty(userId), WxUser::getId, userId)
.like(StrUtil.isNotEmpty(nickName), WxUser::getNickName, nickName);
List<WxUser> wxUserList = wxUserMapper.selectList(userWrapper);
queryUserIdSet = wxUserList.stream().map(WxUser::getId).collect(Collectors.toSet());
if (CollUtil.isEmpty(queryUserIdSet)) {
return AppPager.emptyPager();
}
return groupCacheService.getMessage(groupMessage.getId(), advisorMap);
}
LambdaQueryWrapper<ModuleUser> muWrapper = Wrappers.<ModuleUser>lambdaQuery()
.in(ModuleUser::getModuleId, moduleIdSet)
.in(queryUserIdSet != null, ModuleUser::getUserId, queryUserIdSet)
.orderByDesc(ModuleUser::getCreateTime, ModuleUser::getId);
if (lastJoinTime != null && lastId != null) {
muWrapper.and(w1 -> w1.lt(ModuleUser::getCreateTime, lastJoinTime).or(w2 -> w2.eq(ModuleUser::getCreateTime, lastJoinTime).lt(ModuleUser::getId, lastId)));
}
muWrapper.last("limit " + (size + 1));
List<ModuleUser> moduleUserList = moduleUserMapper.selectList(muWrapper);
if (CollUtil.isEmpty(moduleUserList)) {
return AppPager.emptyPager();
}
boolean hasNext = moduleUserList.size() > size;
if (hasNext) {
moduleUserList = moduleUserList.subList(0, size);
}
Set<String> userIdSet = moduleUserList.stream().map(ModuleUser::getUserId).collect(Collectors.toSet());
List<WxUser> wxUserList = wxUserMapper.selectList(Wrappers.<WxUser>lambdaQuery()
.in(WxUser::getId, userIdSet));
Map<String, WxUser> wxUserMap = wxUserList.stream().collect(Collectors.toMap(WxUser::getId, Function.identity()));
List<GroupCustomerVO> list = moduleUserList.stream().map(moduleUser -> {
GroupCustomerVO vo = new GroupCustomerVO(moduleUser);
WxUser wxUser = wxUserMap.get(moduleUser.getUserId());
if (wxUser != null) {
vo.setNickName(wxUser.getNickName());
vo.setHeadPicUrl(wxUser.getImgUrl());
}
return vo;
}).collect(Collectors.toList());
return new Pager<>(voList, page.getTotal());
return new AppPager<>(list, hasNext);
}
@Transactional(rollbackFor = Exception.class)

View File

@ -7,6 +7,9 @@ import java.time.LocalDateTime;
public class GroupCustomerVO {
@ApiModelProperty("ID")
private Integer id;
@ApiModelProperty("用户ID")
private String userId;
@ -38,11 +41,20 @@ public class GroupCustomerVO {
private LocalDateTime lastChatTime;
public GroupCustomerVO(ModuleUser moduleUser) {
this.id = moduleUser.getId();
this.userId = moduleUser.getUserId();
this.joinTime = moduleUser.getCreateTime();
this.expireTime = moduleUser.getEndTime();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserId() {
return userId;
}

View File

@ -0,0 +1,65 @@
package com.syzb.group.vo;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotNull;
public class PagePrivateChatQuery {
@ApiModelProperty("交易圈ID")
@NotNull
private Integer groupId;
@ApiModelProperty("数量")
@NotNull
private Integer size;
@ApiModelProperty("用户ID")
private String userId;
@ApiModelProperty("昵称")
private String nickName;
@ApiModelProperty("上一页最后ID")
private Integer lastId;
public Integer getGroupId() {
return groupId;
}
public void setGroupId(Integer groupId) {
this.groupId = groupId;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public Integer getLastId() {
return lastId;
}
public void setLastId(Integer lastId) {
this.lastId = lastId;
}
}