From 4e4c52d063e23e817688b66c06acb84349e82cd7 Mon Sep 17 00:00:00 2001 From: easonzhu Date: Wed, 19 Feb 2025 15:18:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../upchina/common/config/cache/CacheKey.java | 1 + .../java/com/upchina/common/vo/DateIdVO.java | 26 +++++++++++ .../group/mapper/GroupMessageMapper.java | 21 ++++++--- .../message/ListGroupMessageAppQuery.java | 12 ++++++ .../service/app/AppGroupMessageService.java | 14 ++++++ .../service/common/GroupCacheService.java | 43 +++++++++++++------ .../video/mapper/VideoLiveUserMapper.java | 8 ++-- 7 files changed, 103 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/upchina/common/vo/DateIdVO.java diff --git a/src/main/java/com/upchina/common/config/cache/CacheKey.java b/src/main/java/com/upchina/common/config/cache/CacheKey.java index bf7deac..eabc75f 100644 --- a/src/main/java/com/upchina/common/config/cache/CacheKey.java +++ b/src/main/java/com/upchina/common/config/cache/CacheKey.java @@ -355,6 +355,7 @@ public class CacheKey { public static final String GROUP_MESSAGE_DETAIL = "group_message_detail|"; public static final String USER_TOTAL_ONLINE = "user_total_online|"; public static final String TEMP_READ_LIST = "temp_read_list"; + public static final String GROUP_MESSAGE_DATE_ID_MAP = "group_message_date_id_map|"; } } diff --git a/src/main/java/com/upchina/common/vo/DateIdVO.java b/src/main/java/com/upchina/common/vo/DateIdVO.java new file mode 100644 index 0000000..3d1d346 --- /dev/null +++ b/src/main/java/com/upchina/common/vo/DateIdVO.java @@ -0,0 +1,26 @@ +package com.upchina.common.vo; + +import java.time.LocalDate; + +public class DateIdVO { + + private LocalDate date; + + private Integer id; + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } +} diff --git a/src/main/java/com/upchina/group/mapper/GroupMessageMapper.java b/src/main/java/com/upchina/group/mapper/GroupMessageMapper.java index 05faaac..72dcc1b 100644 --- a/src/main/java/com/upchina/group/mapper/GroupMessageMapper.java +++ b/src/main/java/com/upchina/group/mapper/GroupMessageMapper.java @@ -1,6 +1,9 @@ package com.upchina.group.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.upchina.common.vo.DateIdVO; import com.upchina.group.entity.GroupMessage; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -18,12 +21,12 @@ 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" + + @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" + "WHERE rn = 1") List selectPrivateChatList(@Param("groupId") Integer groupId); @@ -38,4 +41,10 @@ public interface GroupMessageMapper extends BaseMapper { "WHERE user_type = 2 AND create_time >= #{startTime} AND create_time < #{endTime} \n" + "GROUP BY group_id, interactive_type") List collectMessageMember(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); + + @Select("SELECT DATE(create_time) AS date, MAX(id) AS id \n" + + "FROM group_message \n" + + "${ew.customSqlSegment} \n" + + "GROUP BY DATE(create_time) \n") + List selectDateIdList(@Param(Constants.WRAPPER) Wrapper wrapper); } diff --git a/src/main/java/com/upchina/group/query/message/ListGroupMessageAppQuery.java b/src/main/java/com/upchina/group/query/message/ListGroupMessageAppQuery.java index 23f9460..befb87c 100644 --- a/src/main/java/com/upchina/group/query/message/ListGroupMessageAppQuery.java +++ b/src/main/java/com/upchina/group/query/message/ListGroupMessageAppQuery.java @@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import java.time.LocalDate; public class ListGroupMessageAppQuery { @@ -24,6 +25,9 @@ public class ListGroupMessageAppQuery { @ApiModelProperty("每页大小") private Integer size = 20; + @ApiModelProperty("日期 yyyy-MM-dd") + private LocalDate date; + public Integer getGroupId() { return groupId; } @@ -55,4 +59,12 @@ public class ListGroupMessageAppQuery { public void setSize(Integer size) { this.size = size; } + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } } \ No newline at end of file diff --git a/src/main/java/com/upchina/group/service/app/AppGroupMessageService.java b/src/main/java/com/upchina/group/service/app/AppGroupMessageService.java index 4b564e7..7fffd55 100644 --- a/src/main/java/com/upchina/group/service/app/AppGroupMessageService.java +++ b/src/main/java/com/upchina/group/service/app/AppGroupMessageService.java @@ -35,6 +35,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.time.LocalDate; import java.util.*; @Service @@ -69,6 +70,7 @@ public class AppGroupMessageService { Integer lastId = query.getLastId(); Integer type = query.getType(); Integer size = query.getSize(); + LocalDate date = query.getDate(); GroupVO groupVO = groupInfoService.getForApp(new OnlyIdQuery(groupId), null); if (groupVO == null) { throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR, "交易圈不存在"); @@ -83,6 +85,18 @@ public class AppGroupMessageService { if (lastId != null && lastId != 0) { sortedSet = sortedSet.tailSet(lastId, false); } + if (LocalDate.now().equals(date)) { + date = null; + } + if (date != null) { + TreeMap dateIdMap = groupCacheService.getDateIdMap(groupId, userId, msgType); + LocalDate floorDate = dateIdMap.floorKey(date); + if (floorDate == null) { + return AppPager.emptyPager(); + } + Integer maxId = dateIdMap.get(floorDate); + sortedSet = sortedSet.tailSet(maxId, true); + } List list = new ArrayList<>(size); Iterator it = sortedSet.iterator(); Map advisorMap = advisorInfoService.getAdvisorVoMap(); diff --git a/src/main/java/com/upchina/group/service/common/GroupCacheService.java b/src/main/java/com/upchina/group/service/common/GroupCacheService.java index f7cf1b5..755f3fb 100644 --- a/src/main/java/com/upchina/group/service/common/GroupCacheService.java +++ b/src/main/java/com/upchina/group/service/common/GroupCacheService.java @@ -9,6 +9,7 @@ import com.upchina.common.config.cache.CacheKey; import com.upchina.common.constant.IsOrNot; import com.upchina.common.entity.OnlineUser; import com.upchina.common.service.CacheService; +import com.upchina.common.vo.DateIdVO; import com.upchina.group.constant.GroupInteractiveType; import com.upchina.group.constant.GroupMessageUserType; import com.upchina.group.constant.QueryGroupMessageType; @@ -50,16 +51,9 @@ public class GroupCacheService { private IMap groupCache; public NavigableSet getMessageIdSet(Integer groupId, String userId, QueryGroupMessageType type) { - String cacheKey = buildMessageIdSetKey(userId, type); + String cacheKey = buildMessageIdSetKey(CacheKey.GroupKey.GROUP_MESSAGE_LIST, userId, type); return cacheService.get(groupCache, cacheKey, () -> { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() - .select(GroupMessage::getId) - .eq(GroupMessage::getGroupId, groupId) - .eq(!QueryGroupMessageType.PRIVATE.equals(type), GroupMessage::getInteractiveType, GroupInteractiveType.GROUP.value) - .in(QueryGroupMessageType.ADVISOR.equals(type), GroupMessage::getUserType, GroupMessageUserType.ADVISOR.value, GroupMessageUserType.ASSISTANT.value) - .eq(QueryGroupMessageType.CUSTOMER.equals(type), GroupMessage::getUserType, GroupMessageUserType.CUSTOMER.value) - .eq(QueryGroupMessageType.SELECTED.equals(type), GroupMessage::getIsRecommend, IsOrNot.IS.value) - .eq(QueryGroupMessageType.PRIVATE.equals(type), GroupMessage::getPrivateUserId, userId); + LambdaQueryWrapper wrapper = buildWrapper(groupId, userId, type); List objList = groupMessageMapper.selectObjs(wrapper); NavigableSet set = new TreeSet<>(Comparator.reverseOrder()); objList.stream().map(obj -> (Integer) obj).forEach(set::add); @@ -67,6 +61,28 @@ public class GroupCacheService { }); } + public TreeMap getDateIdMap(Integer groupId, String userId, QueryGroupMessageType type) { + String cacheKey = buildMessageIdSetKey(CacheKey.GroupKey.GROUP_MESSAGE_DATE_ID_MAP, userId, type); + return cacheService.get(groupCache, cacheKey, () -> { + LambdaQueryWrapper wrapper = buildWrapper(groupId, userId, type); + List dateIdList = groupMessageMapper.selectDateIdList(wrapper); + TreeMap map = new TreeMap<>(); + dateIdList.stream().forEach(vo -> map.put(vo.getDate(), vo.getId())); + return map; + }); + } + + private static LambdaQueryWrapper buildWrapper(Integer groupId, String userId, QueryGroupMessageType type) { + return Wrappers.lambdaQuery() + .select(GroupMessage::getId) + .eq(GroupMessage::getGroupId, groupId) + .eq(!QueryGroupMessageType.PRIVATE.equals(type), GroupMessage::getInteractiveType, GroupInteractiveType.GROUP.value) + .in(QueryGroupMessageType.ADVISOR.equals(type), GroupMessage::getUserType, GroupMessageUserType.ADVISOR.value, GroupMessageUserType.ASSISTANT.value) + .eq(QueryGroupMessageType.CUSTOMER.equals(type), GroupMessage::getUserType, GroupMessageUserType.CUSTOMER.value) + .eq(QueryGroupMessageType.SELECTED.equals(type), GroupMessage::getIsRecommend, IsOrNot.IS.value) + .eq(QueryGroupMessageType.PRIVATE.equals(type), GroupMessage::getPrivateUserId, userId); + } + public void removeMessage(GroupMessage message) { String privateUserId = message.getPrivateUserId(); Integer groupId = message.getGroupId(); @@ -92,7 +108,7 @@ public class GroupCacheService { private void removeMessage(Integer groupId, String userId, QueryGroupMessageType type, Integer messageId) { NavigableSet set = getMessageIdSet(groupId, userId, type); set.remove(messageId); - String cacheKey = buildMessageIdSetKey(userId, type); + String cacheKey = buildMessageIdSetKey(CacheKey.GroupKey.GROUP_MESSAGE_LIST, userId, type); groupCache.put(cacheKey, set); } @@ -121,7 +137,7 @@ public class GroupCacheService { private void addMessage(Integer groupId, String userId, QueryGroupMessageType type, Integer messageId) { NavigableSet set = getMessageIdSet(groupId, userId, type); set.add(messageId); - String cacheKey = buildMessageIdSetKey(userId, type); + String cacheKey = buildMessageIdSetKey(CacheKey.GroupKey.GROUP_MESSAGE_LIST, userId, type); groupCache.put(cacheKey, set); } @@ -155,8 +171,8 @@ public class GroupCacheService { }); } - private static String buildMessageIdSetKey(String userId, QueryGroupMessageType type) { - String cacheKey = CacheKey.GroupKey.GROUP_MESSAGE_LIST + type.value; + private static String buildMessageIdSetKey(String prefix, String userId, QueryGroupMessageType type) { + String cacheKey = prefix + type.value; if (QueryGroupMessageType.PRIVATE.equals(type)) { cacheKey += "|" + userId; } @@ -176,4 +192,5 @@ public class GroupCacheService { vo.setReadCount(groupMessageReadMapper.selectCount(wrapper).intValue()); } } + } \ No newline at end of file diff --git a/src/main/java/com/upchina/video/mapper/VideoLiveUserMapper.java b/src/main/java/com/upchina/video/mapper/VideoLiveUserMapper.java index 682162e..2be1753 100644 --- a/src/main/java/com/upchina/video/mapper/VideoLiveUserMapper.java +++ b/src/main/java/com/upchina/video/mapper/VideoLiveUserMapper.java @@ -63,7 +63,7 @@ public interface VideoLiveUserMapper extends EasyBaseMapper { "${ew.customSqlSegment}") > E selectVideoUserDetail(Page page, @Param(Constants.WRAPPER) Wrapper wrapper); - @Select("SELECT sr.sale_user_id, u.name as sale_user_name, u.staff_no, u.dept_id,\n" + + @Select("SELECT sr.sale_user_id, ud.name as sale_user_name, ul.staff_no, ud.dept_id,\n" + "ifnull(sr.count, 0) AS subscribe_user_count, \n" + "ifnull(sc.count, 0) AS browse_pro_people_count, \n" + "ifnull(op.amount, 0) AS sub_amount, \n" + @@ -97,8 +97,10 @@ public interface VideoLiveUserMapper extends EasyBaseMapper { "WHERE s.video_id = #{videoId} AND s.sale_user_id IS NOT NULL AND o.product_type = 3 AND o.pay_status = 2 \n" + "GROUP BY s.sale_user_id) oup \n" + "ON sr.sale_user_id = oup.sale_user_id \n" + - "JOIN user u \n" + - "ON sr.sale_user_id = u.id \n" + + "JOIN user_dept ud \n" + + "ON sr.sale_user_id = ud.user_id \n" + + "JOIN user_login ul \n" + + "ON ud.login_id = ul.login_id \n" + "${ew.customSqlSegment}") > E statisticSaleUserByVideo(Page page, @Param("videoId") Integer videoId,