diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueProjectCategoryDictDao.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueProjectCategoryDictDao.java index fcf13cfd4d..ec76ffd7b4 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueProjectCategoryDictDao.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueProjectCategoryDictDao.java @@ -61,4 +61,15 @@ public interface IssueProjectCategoryDictDao extends BaseDao selectCategoryList(@Param("cstegoryIdList") List cstegoryIdList); + + /** + * @Description 根据客户Id、类别名称、类型查询单个类别 默认查询二级分类 + * @param customerId + * @param categoryName + * @param categoryType + * @return com.epmet.entity.IssueProjectCategoryDictEntity + * @author wangc + * @date 2020.12.10 13:37 + */ + IssueProjectCategoryDictEntity selectSingleByCustomerIdAndCategoryNameAndCategoryType(@Param("customerId")String customerId,@Param("categoryName")String categoryName,@Param("categoryType")String categoryType); } \ No newline at end of file diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueProjectTagDictDao.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueProjectTagDictDao.java index 5e615fca25..88c196a8d7 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueProjectTagDictDao.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/dao/IssueProjectTagDictDao.java @@ -71,4 +71,15 @@ public interface IssueProjectTagDictDao extends BaseDao */ List selectTagListByCustomer(@Param("customerId") String customerId); + + /** + * @Description 根据类别查询客户下标签 + * @param categories + * @param isDefault + * @param customerId + * @return java.util.List + * @author wangc + * @date 2020.12.10 10:07 + */ + List selectTagByCategory(@Param("categories") List categories,@Param("isDefault") String isDefault,@Param("customerId") String customerId); } \ No newline at end of file diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/redis/IssueProjectTagDictRedis.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/redis/IssueProjectTagDictRedis.java index 4bcaf18866..18ebfdd206 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/redis/IssueProjectTagDictRedis.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/redis/IssueProjectTagDictRedis.java @@ -20,8 +20,13 @@ package com.epmet.redis; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.constant.GovIssueRedisKeys; +import com.epmet.dao.IssueProjectCategoryDictDao; +import com.epmet.dao.IssueProjectTagDictDao; import com.epmet.dto.result.IssueCategoryTagResultDTO; +import com.epmet.entity.IssueProjectCategoryDictEntity; +import com.epmet.entity.IssueProjectTagDictEntity; import com.epmet.utils.ModuleConstants; +import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; @@ -51,6 +56,10 @@ public class IssueProjectTagDictRedis { private RedisUtils redisUtils; @Autowired private RedisTemplate redisTemplate; + @Autowired + private IssueProjectTagDictDao poolDao; + @Autowired + private IssueProjectCategoryDictDao categoryDictDao; public void delete(Object[] ids) { } @@ -74,66 +83,103 @@ public class IssueProjectTagDictRedis { * @author wangc * @date 2020.12.09 11:16 */ - public List getTagsOrderByRank(String customerId,List category){ - if(StringUtils.isBlank(customerId)) { + public Map> getTagsOrderByRank(String customerId,List category) { + if (StringUtils.isBlank(customerId)) { log.error("customerId can not be null when obtain govern tags."); return null; } + IssueProjectCategoryDictEntity otherCategory = categoryDictDao.selectSingleByCustomerIdAndCategoryNameAndCategoryType(customerId, ModuleConstants.CATEGORY_NAME_OTHERS, null); + boolean ifOther = null == otherCategory ? false : (!CollectionUtils.isEmpty(category) && category.size() == NumConstant.ONE && category.contains(otherCategory.getId()) ? true : false); Set keys; - if(CollectionUtils.isEmpty(category)) - keys = redisUtils.keys(GovIssueRedisKeys.getGovernmentTagKey(customerId,null)); - else keys = category.stream().map(key -> {return GovIssueRedisKeys.getGovernmentTagKey(customerId,key);}).collect(Collectors.toSet()); - - List>> heatTuple = redisTemplate.executePipelined(new RedisCallback>>() { - @Nullable - @Override - public Set> doInRedis(RedisConnection connection) throws DataAccessException { - connection.openPipeline(); - keys.forEach(key -> { - connection.zSetCommands().zRangeByScoreWithScores(redisTemplate.getKeySerializer().serialize(key), NumConstant.ZERO_L, (long) (NumConstant.ONE_NEG)); + if (CollectionUtils.isEmpty(category) || ifOther) + keys = redisUtils.keys(GovIssueRedisKeys.getGovernmentTagKey(customerId, null)); + else keys = category.stream().map(key -> { + return GovIssueRedisKeys.getGovernmentTagKey(customerId, key); + }).collect(Collectors.toSet()); + //如果keys集合为空,说明缓存中没有当前客户的标签排行信息,直接进行补偿 + if (!CollectionUtils.isEmpty(keys)){ + keys.remove(GovIssueRedisKeys.getGovernmentTagKey(customerId,ModuleConstants.CUSTOMIZED_TAG_CATEGORY_NAME)); + List>> heatTuple = redisTemplate.executePipelined(new RedisCallback>>() { + @Nullable + @Override + public Set> doInRedis(RedisConnection connection) throws DataAccessException { + connection.openPipeline(); + keys.forEach(key -> { + connection.zSetCommands().zRangeByScoreWithScores(redisTemplate.getKeySerializer().serialize(key), NumConstant.ZERO_L, (long) (NumConstant.ONE_NEG)); + }); + return null; + } + }, redisTemplate.getValueSerializer()); + //热度Map 分数为key + Map> heatMap = new HashMap<>(); + if (!CollectionUtils.isEmpty(heatTuple)) { + heatTuple.forEach(tupleSet -> { + tupleSet.forEach(tuple -> { + Double heatScore = tuple.getScore(); + List queue = heatMap.get(heatScore); + if (CollectionUtils.isEmpty(queue)) queue = new LinkedList<>(); + queue.add(parseObject(tuple.getValue(), IssueCategoryTagResultDTO.class)); + heatMap.put(heatScore,queue); + }); }); - return null; + List defaultResult = new LinkedList<>(); + heatMap.keySet().stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()).forEach(count -> { + defaultResult.addAll(heatMap.get(count)); + }); + Map> result = new HashMap<>(); + result.put(ModuleConstants.DEFAULT_TAG_CATEGORY_NAME,defaultResult); + Set> customizedTuples = redisUtils.zReverseRangeWithScores(GovIssueRedisKeys.getGovernmentTagKey(customerId, null), NumConstant.ZERO_L, (long) (NumConstant.ONE_NEG)); + if(!CollectionUtils.isEmpty(customizedTuples)){ + Map> customizedHeatMap = new HashMap<>(); + customizedTuples.forEach(tuple -> { + List queue = customizedHeatMap.get(tuple.getValue()); + if((CollectionUtils.isEmpty(queue))) queue = new LinkedList<>(); + queue.add(parseObject(tuple.getValue(), IssueCategoryTagResultDTO.class)); + heatMap.put((Double) tuple.getValue(),queue); + }); + List customizedResult = new LinkedList<>(); + customizedHeatMap.keySet().stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()).forEach(count -> { + customizedResult.addAll(customizedHeatMap.get(count)); + }); + result.put(ModuleConstants.CUSTOMIZED_TAG_CATEGORY_NAME,customizedResult); + } + return result; + } - },redisTemplate.getValueSerializer()); - //热度Map 分数为key - Map> heatMap = new HashMap<>(); - if(!CollectionUtils.isEmpty(heatTuple)){ - heatTuple.forEach(tupleSet -> { - tupleSet.forEach( tuple -> { - IssueCategoryTagResultDTO entity = parseObject(tuple.getValue(),IssueCategoryTagResultDTO.class); - Double heatScore = tuple.getScore(); - List queue = heatMap.get(heatScore); - if(CollectionUtils.isEmpty(queue)) queue = new LinkedList<>(); - queue.add(entity); - } ); - }); - List result = new LinkedList<>(); - heatMap.keySet().stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()).forEach(count -> { - result.addAll(heatMap.get(count)); - }); - return result; } + log.warn("fetch customer govern tag cache blankly,customerId:{},now begin compensation...", customerId); - if(CollectionUtils.isEmpty(keys) || !keys.iterator().next().contains(ModuleConstants.CUSTOMIZED_TAG_CATEGORY_ID)) { - log.warn("fetch customer govern tag cache blankly , customerId:{} , now begin compensation...", customerId); - - List compensate = compensate(customerId, category); + Map> compensate = compensate(customerId, category, ifOther); if (CollectionUtils.isEmpty(compensate)) { - log.error("compensation failure or there is no default tag data in database !!"); + log.error("compensation failure or there is no default tag data in database!!"); return null; } else { - log.warn("compensation completed !!"); + log.warn("compensation completed!!"); return compensate; } - }return null; } - public List compensate(String customerId,List category){ + /** + * @Description category为空,则补偿全部,返回全部 + * category不为空,则补偿集合中的类别标签以及自定义标签 + * category为"customize",只补偿自定义标签 + * 只需查询标签库(issue_project_tag_dict)中的issueUseCount和projectUseCount即可 + * @param customerId + * @param category + * @return java.util.List + * @author wangc + * @date 2020.12.10 09:34 + */ + public Map> compensate(String customerId,List category,boolean ifOther){ //TODO 补偿机制 + List _default = poolDao.selectTagByCategory(ifOther || CollectionUtils.isEmpty(category) ? null : category, NumConstant.ZERO_STR, customerId);//默认 + List _customized = poolDao.selectTagByCategory(null,NumConstant.ONE_STR,customerId);//自定义 + + return null; } diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueTagsServiceImpl.java b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueTagsServiceImpl.java index 3b54780a02..1b7d4ed8b1 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueTagsServiceImpl.java +++ b/epmet-module/gov-issue/gov-issue-server/src/main/java/com/epmet/service/impl/IssueTagsServiceImpl.java @@ -149,7 +149,7 @@ public class IssueTagsServiceImpl extends BaseServiceImpl + + \ No newline at end of file diff --git a/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueProjectTagDictDao.xml b/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueProjectTagDictDao.xml index 7aeeac687d..6815000576 100644 --- a/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueProjectTagDictDao.xml +++ b/epmet-module/gov-issue/gov-issue-server/src/main/resources/mapper/IssueProjectTagDictDao.xml @@ -70,5 +70,37 @@ DEL_FLAG = '0' AND CUSTOMER_ID = #{customerId} + + \ No newline at end of file