diff --git a/src/main/java/com/syzb/group/controller/admin/AdminGroupMessageController.java b/src/main/java/com/syzb/group/controller/admin/AdminGroupMessageController.java index 3f186f9..87a23eb 100644 --- a/src/main/java/com/syzb/group/controller/admin/AdminGroupMessageController.java +++ b/src/main/java/com/syzb/group/controller/admin/AdminGroupMessageController.java @@ -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> getPrivateChatList(@Validated @RequestBody @ApiParam(required = true) OnlyIdPageQuery query, + public CommonResult> getPrivateChatList(@Validated @RequestBody @ApiParam(required = true) PagePrivateChatQuery query, @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { - Pager page = adminGroupMessageService.getPrivateChatList(query, backendUserVO); + AppPager page = adminGroupMessageService.getPrivateChatList(query, backendUserVO); return CommonResult.success(page); } @ApiOperation("后台获取用户列表") @PostMapping("/admin/group/message/getCustomerList") - public CommonResult> getCustomerList(@Validated @RequestBody @ApiParam(required = true) OnlyIdPageQuery query, - @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { - Pager page = adminGroupMessageService.getCustomerList(query, backendUserVO); + public CommonResult> getCustomerList(@Validated @RequestBody @ApiParam(required = true) PageCustomerQuery query, + @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { + AppPager page = adminGroupMessageService.getCustomerList(query, backendUserVO); return CommonResult.success(page); } diff --git a/src/main/java/com/syzb/group/mapper/GroupMessageMapper.java b/src/main/java/com/syzb/group/mapper/GroupMessageMapper.java index b970eec..61056eb 100644 --- a/src/main/java/com/syzb/group/mapper/GroupMessageMapper.java +++ b/src/main/java/com/syzb/group/mapper/GroupMessageMapper.java @@ -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 { - @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 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 selectPrivateChatList(@Param("groupId") Integer groupId, @Param("userIds") String userIds); + "${ew.customSqlSegment}") + List 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" + diff --git a/src/main/java/com/syzb/group/query/PageCustomerQuery.java b/src/main/java/com/syzb/group/query/PageCustomerQuery.java new file mode 100644 index 0000000..d960d9e --- /dev/null +++ b/src/main/java/com/syzb/group/query/PageCustomerQuery.java @@ -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; + } +} diff --git a/src/main/java/com/syzb/group/service/admin/AdminGroupMessageService.java b/src/main/java/com/syzb/group/service/admin/AdminGroupMessageService.java index afaefbf..7e2613e 100644 --- a/src/main/java/com/syzb/group/service/admin/AdminGroupMessageService.java +++ b/src/main/java/com/syzb/group/service/admin/AdminGroupMessageService.java @@ -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 getPrivateChatList(OnlyIdPageQuery query, BackendUserVO backendUserVO) { - Integer groupId = query.getId(); + public AppPager 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 queryUserIdSet = null; + if (StrUtil.isNotEmpty(userId) && StrUtil.isNotEmpty(nickName)) { + LambdaQueryWrapper userWrapper = Wrappers.lambdaQuery() + .select(WxUser::getId) + .eq(StrUtil.isNotEmpty(userId), WxUser::getId, userId) + .like(StrUtil.isNotEmpty(nickName), WxUser::getNickName, nickName); + List wxUserList = wxUserMapper.selectList(userWrapper); + queryUserIdSet = wxUserList.stream().map(WxUser::getId).collect(Collectors.toSet()); + if (CollUtil.isEmpty(queryUserIdSet)) { + return AppPager.emptyPager(); + } + } QueryWrapper wrapper = Wrappers.query() .eq("rn", 1) - .orderByDesc("id"); - Page page = groupMessageMapper.selectPrivateChatPage(groupId, query.toPage(), wrapper); - List 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 list = groupMessageMapper.selectPrivateChatList(groupId, wrapper); + boolean hasNext = list.size() > size; + if (hasNext) { + list = list.subList(0, size); + } Map advisorMap = advisorInfoService.getAdvisorVoMap(); List 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 getCustomerList(OnlyIdPageQuery query, BackendUserVO backendUserVO) { - Integer groupId = query.getId(); + public AppPager 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 moduleIdSet = groupCommonService.getModuleIds(groupId); if (CollUtil.isEmpty(moduleIdSet)) { - return Pager.emptyPager(); + return AppPager.emptyPager(); } - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() - .select(ModuleUser::getUserId) - .in(ModuleUser::getModuleId, moduleIdSet) - .orderByDesc(ModuleUser::getCreateTime); - Page page = moduleUserMapper.selectPage(query.toPage(), wrapper); - if (CollUtil.isEmpty(page.getRecords())) { - return new Pager<>(Collections.emptyList(), page.getTotal()); - } - List userIdList = page.getRecords().stream().map(ModuleUser::getUserId).collect(Collectors.toList()); - String userIds = userIdList.stream().map(userId -> "'" + userId + "'").collect(Collectors.joining(",")); - List privateChatList = groupMessageMapper.selectPrivateChatList(groupId, userIds); - Map privateChatMap = privateChatList.stream().collect(Collectors.toMap(GroupMessage::getPrivateUserId, Functions.identity())); - Map advisorMap = advisorInfoService.getAdvisorVoMap(); - List voList = userIdList.stream().map(userId -> { - GroupMessage groupMessage = privateChatMap.get(userId); - if (groupMessage == null) { - return new GroupMessageVO(userId); + Set queryUserIdSet = null; + if (StrUtil.isNotEmpty(userId) && StrUtil.isNotEmpty(nickName)) { + LambdaQueryWrapper userWrapper = Wrappers.lambdaQuery() + .select(WxUser::getId) + .eq(StrUtil.isNotEmpty(userId), WxUser::getId, userId) + .like(StrUtil.isNotEmpty(nickName), WxUser::getNickName, nickName); + List 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 muWrapper = Wrappers.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 moduleUserList = moduleUserMapper.selectList(muWrapper); + if (CollUtil.isEmpty(moduleUserList)) { + return AppPager.emptyPager(); + } + boolean hasNext = moduleUserList.size() > size; + if (hasNext) { + moduleUserList = moduleUserList.subList(0, size); + } + Set userIdSet = moduleUserList.stream().map(ModuleUser::getUserId).collect(Collectors.toSet()); + List wxUserList = wxUserMapper.selectList(Wrappers.lambdaQuery() + .in(WxUser::getId, userIdSet)); + Map wxUserMap = wxUserList.stream().collect(Collectors.toMap(WxUser::getId, Function.identity())); + List 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) diff --git a/src/main/java/com/syzb/group/vo/GroupCustomerVO.java b/src/main/java/com/syzb/group/vo/GroupCustomerVO.java index ee09617..c6ff480 100644 --- a/src/main/java/com/syzb/group/vo/GroupCustomerVO.java +++ b/src/main/java/com/syzb/group/vo/GroupCustomerVO.java @@ -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; } diff --git a/src/main/java/com/syzb/group/vo/PagePrivateChatQuery.java b/src/main/java/com/syzb/group/vo/PagePrivateChatQuery.java new file mode 100644 index 0000000..bc4b230 --- /dev/null +++ b/src/main/java/com/syzb/group/vo/PagePrivateChatQuery.java @@ -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; + } +}