diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java index e8cec08991..ba34e7ff6a 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java @@ -15,10 +15,12 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactor import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ZSetOperations; import org.springframework.data.redis.support.atomic.RedisAtomicLong; import org.springframework.stereotype.Component; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -276,16 +278,33 @@ public class RedisUtils { } /** - * @Description 获取key集合与多个集合的并集 + * @Description 获取key集合与多个集合的交集 * @param key * @param otherKeys * @author zxc */ - public Set sUnion(String key, Collection otherKeys) { - return redisTemplate.opsForSet().union(key, otherKeys); + public Set intersect(String key, Collection otherKeys) { + return redisTemplate.opsForSet().intersect(key, otherKeys); } + /** + * @Description 获取集合(set) + * @param key + * @author zxc + */ public Set sMembers(String key){ return redisTemplate.opsForSet().members(key); } + + /** + * @Description 获取 zset 中带score的集合 + * @param key + * @param start + * @param end + * @author zxc + */ + public Set> zReverseRangeWithScores(String key, long start, long end) { + Set> typedTuples = redisTemplate.opsForZSet().reverseRangeWithScores(key, start, end); + return typedTuples; + } } diff --git a/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/dto/result/TagRankResultDTO.java b/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/dto/result/TagRankResultDTO.java new file mode 100644 index 0000000000..5763ecddbd --- /dev/null +++ b/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/dto/result/TagRankResultDTO.java @@ -0,0 +1,30 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author zxc + * @CreateTime 2020/6/3 19:38 + */ +@Data +public class TagRankResultDTO implements Serializable { + + private static final long serialVersionUID = 4107657623174653243L; + + /** + * zSet排序 + */ + private Double score; + + /** + * 标签Id + */ + private String tagId; + + /** + * 标签名字 + */ + private String tagName; +} diff --git a/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/redis/TagRedis.java b/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/redis/TagRedis.java index 9de49830ba..48dcb2a23c 100644 --- a/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/redis/TagRedis.java +++ b/epmet-module/gov-voice/gov-voice-server/src/main/java/com/epmet/redis/TagRedis.java @@ -24,14 +24,17 @@ import com.epmet.dto.form.CorrelationTagListFormDTO; import com.epmet.dto.form.TagCascadeListFormDTO; import com.epmet.dto.result.CorrelationTagListResultDTO; import com.epmet.dto.result.TagInfoResultDTO; +import com.epmet.dto.result.TagRankResultDTO; import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; @Component public class TagRedis { @@ -56,6 +59,7 @@ public class TagRedis { List tagIdList = formDto.getTagIdList(); Set objects ; Collection keys = new ArrayList<>(); + //当查询关联标签数量大于1条时 if (tagIdList.size() > 1){ for (int i = NumConstant.ONE; i < tagIdList.size(); i++) { String tagId = tagIdList.get(i); @@ -63,8 +67,9 @@ public class TagRedis { keys.add(tagId); } String key = TagConstant.GOV_RETAG_KEY+customerId+TagConstant.COLON+tagIdList.get(0); - objects = redisUtils.sUnion(key, keys); + objects = redisUtils.intersect(key, keys); }else { + // 查询关联标签数量 等于1条时 String key = TagConstant.GOV_RETAG_KEY+customerId+TagConstant.COLON+tagIdList.get(0); objects = redisUtils.sMembers(key); } @@ -72,12 +77,37 @@ public class TagRedis { if (objects.size()==NumConstant.ZERO){ return resultList; } - ObjectMapper objectMapper = new ObjectMapper(); + //转换DTO for (Object object : objects) { - CorrelationTagListResultDTO correlationTag = objectMapper.convertValue(object, CorrelationTagListResultDTO.class); - resultList.add(correlationTag); + resultList.add(objectToDTO(object,CorrelationTagListResultDTO.class)); + } + //级联标签排序 + //1.取出 zset 中的有序标签,根据级联标签,筛选有序标签 + List resultEquals = new ArrayList<>(); + if (resultList.size() > NumConstant.ZERO) { + long start = 0; + long end = -1; + String customerKey = TagConstant.GOV_TAG_KEY + customerId; + Set> typedTuples = redisUtils.zReverseRangeWithScores(customerKey, start, end); + for (CorrelationTagListResultDTO correlationTagList : resultList) { + for (ZSetOperations.TypedTuple typedTuple : typedTuples) { + TagRankResultDTO tagRank = objectToDTO(typedTuple.getValue(), TagRankResultDTO.class); + tagRank.setScore(typedTuple.getScore()); + if (correlationTagList.getTagId().equals(tagRank.getTagId())){ + resultEquals.add(tagRank); + } + } + } + } + // 根据标签使用顺序倒叙 + List collect = resultEquals.stream().sorted(Comparator.comparing(TagRankResultDTO::getScore).reversed()).collect(Collectors.toList()); + List realResult = new ArrayList<>(); + for (TagRankResultDTO tagRankResultDTO : collect) { + CorrelationTagListResultDTO correlation = new CorrelationTagListResultDTO(); + BeanUtils.copyProperties(tagRankResultDTO,correlation); + realResult.add(correlation); } - return resultList; + return realResult; } @@ -95,10 +125,8 @@ public class TagRedis { return new ArrayList<>(); } List result = new ArrayList(); - ObjectMapper objectMapper = new ObjectMapper(); for (Object object : objects) { - TagInfoResultDTO tagInfoResultDto = objectMapper.convertValue(object, TagInfoResultDTO.class); - result.add(tagInfoResultDto); + result.add(objectToDTO(object,TagInfoResultDTO.class)); } return result; } @@ -117,16 +145,14 @@ public class TagRedis { return new ArrayList<>(); } List result = new ArrayList(); - ObjectMapper objectMapper = new ObjectMapper(); for (Object object : objects) { - TagInfoResultDTO tagInfoResultDto = objectMapper.convertValue(object, TagInfoResultDTO.class); - result.add(tagInfoResultDto); + result.add(objectToDTO(object,TagInfoResultDTO.class)); } return result; } /** - * @Description + * @Description 获取居民端级联标签——按照使用次数倒序 * @param formDto * @author zxc */ @@ -135,6 +161,7 @@ public class TagRedis { String gridId = formDto.getGridId(); Set objects ; Collection keys = new ArrayList<>(); + //当 级联标签大于1条的时候 if (tagIdList.size() > 1){ for (int i = NumConstant.ONE; i < tagIdList.size(); i++) { String tagId = tagIdList.get(i); @@ -142,8 +169,9 @@ public class TagRedis { keys.add(tagId); } String key = TagConstant.GRID_RETAG_KEY+gridId+TagConstant.COLON+tagIdList.get(0); - objects = redisUtils.sUnion(key, keys); + objects = redisUtils.intersect(key, keys); }else { + //当级联标签为一条时 String key = TagConstant.GRID_RETAG_KEY+gridId+TagConstant.COLON+tagIdList.get(0); objects = redisUtils.sMembers(key); } @@ -151,12 +179,49 @@ public class TagRedis { if (objects.size()==NumConstant.ZERO){ return resultList; } - ObjectMapper objectMapper = new ObjectMapper(); + //转换DTO for (Object object : objects) { - TagInfoResultDTO tagInfo = objectMapper.convertValue(object, TagInfoResultDTO.class); - resultList.add(tagInfo); + resultList.add(objectToDTO(object, TagInfoResultDTO.class)); + } + //级联标签排序 + //1.取出 zset 中的有序标签,根据级联标签,筛选有序标签 + List resultEquals = new ArrayList<>(); + if (resultList.size() > NumConstant.ZERO) { + long start = 0; + long end = -1; + String customerKey = TagConstant.GRID_TAG_KEY+formDto.getGridId(); + Set> typedTuples = redisUtils.zReverseRangeWithScores(customerKey, start, end); + for (TagInfoResultDTO tagInfo : resultList) { + for (ZSetOperations.TypedTuple typedTuple : typedTuples) { + TagRankResultDTO tagRank = objectToDTO(typedTuple.getValue(), TagRankResultDTO.class); + tagRank.setScore(typedTuple.getScore()); + if (tagInfo.getTagId().equals(tagRank.getTagId())){ + resultEquals.add(tagRank); + } + } + } + } + // 根据标签使用顺序倒叙 + List collect = resultEquals.stream().sorted(Comparator.comparing(TagRankResultDTO::getScore).reversed()).collect(Collectors.toList()); + List tagInfoResultList = new ArrayList<>(); + for (TagRankResultDTO tagRankResultDTO : collect) { + TagInfoResultDTO tagInfoResult = new TagInfoResultDTO(); + BeanUtils.copyProperties(tagRankResultDTO,tagInfoResult); + tagInfoResultList.add(tagInfoResult); } - return resultList; + return tagInfoResultList; + } + + /** + * @Description Object 转换 DTO + * @param o + * @param tClass + * @author zxc + */ + public T objectToDTO(Object o,Class tClass){ + ObjectMapper objectMapper = new ObjectMapper(); + T t = objectMapper.convertValue(o, tClass); + return t; } } \ No newline at end of file