|
|
@@ -64,17 +64,18 @@ public class TabService {
|
|
|
TabParam tabParam = this.requestCoverToParam(request);
|
|
|
|
|
|
List<TabProto> tabProtos = new ArrayList<>();
|
|
|
+ Set<String> tabs = new HashSet<>();
|
|
|
|
|
|
- List<TabProto> personalizationTabs = this.personalizationTab(tabParam);
|
|
|
+ List<TabProto> personalizationTabs = this.personalizationTab(tabParam, tabs);
|
|
|
|
|
|
String invalidTabCacheKey = String.format(userInvalidTabCache, tabParam.getUnionId());
|
|
|
Set<String> invalidTabCache = Optional.ofNullable(redisTemplate.opsForSet().members(invalidTabCacheKey)).orElse(new HashSet<>());
|
|
|
- personalizationTabs =personalizationTabs.stream()
|
|
|
+ personalizationTabs = personalizationTabs.stream()
|
|
|
.filter(i -> !invalidTabCache.contains(i.getKey()))
|
|
|
.limit(Math.min(personalizationTabs.size(), personalizationTabSize))
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
- tabProtos.addAll(this.territoryTab(tabParam));
|
|
|
+ tabProtos.addAll(this.territoryTab(tabParam, tabs));
|
|
|
tabProtos.addAll(personalizationTabs);
|
|
|
|
|
|
return TabResponse.newBuilder()
|
|
|
@@ -83,26 +84,26 @@ public class TabService {
|
|
|
.build();
|
|
|
}
|
|
|
|
|
|
- private List<TabProto> territoryTab(TabParam tabParam) {
|
|
|
+ private List<TabProto> territoryTab(TabParam tabParam, Set<String> tabs) {
|
|
|
List<TabProto> tabProtos = new ArrayList<>();
|
|
|
// 非中国地域不返回地域Tab
|
|
|
if (isChinaRegion(tabParam.getProvinceCode())) {
|
|
|
String province = tabParam.getProvince().replaceAll("省$", "");
|
|
|
- List<TabProto> provinceTab = this.buildTabProto(Collections.singletonList(province), TabSource.other, TabType.territory);
|
|
|
+ List<TabProto> provinceTab = this.buildTabProto(Collections.singletonList(province), TabSource.other, TabType.territory, tabs);
|
|
|
tabProtos.addAll(provinceTab);
|
|
|
}
|
|
|
return tabProtos;
|
|
|
}
|
|
|
|
|
|
- private List<TabProto> personalizationTab(TabParam tabParam) {
|
|
|
- List<TabProto> tabProtos = new ArrayList<>();
|
|
|
+ private List<TabProto> personalizationTab(TabParam tabParam, Set<String> tabs) {
|
|
|
+
|
|
|
+ List<TabProto> defaultTab = this.buildTabProto(homepageDefaultTab, TabSource.default_hot, TabType.personalization, tabs);
|
|
|
+ List<TabProto> tabProtos = new ArrayList<>(defaultTab);
|
|
|
|
|
|
if (StringUtils.isBlank(tabParam.getUnionId())) {
|
|
|
log.error("unionId is empty");
|
|
|
return tabProtos;
|
|
|
}
|
|
|
- List<TabProto> defaultTab = this.buildTabProto(homepageDefaultTab, TabSource.default_hot, TabType.personalization);
|
|
|
- tabProtos.addAll(defaultTab);
|
|
|
|
|
|
String key = String.format(personalizationTabCondidateFormat, tabParam.getUnionId());
|
|
|
String value = redisTemplate.opsForValue().get(key);
|
|
|
@@ -121,10 +122,10 @@ public class TabService {
|
|
|
|
|
|
log.info("tabCollect: {}", JSON.toJSONString(tabCollect));
|
|
|
|
|
|
- List<TabProto> profileTab = this.buildTabProto(tabCollect.get(0), TabSource.profile, TabType.personalization);
|
|
|
- List<TabProto> shareCate2Tab = this.buildTabProto(tabCollect.get(1), TabSource.share_cate2, TabType.personalization);
|
|
|
- List<TabProto> returnCate2Tab = this.buildTabProto(tabCollect.get(2), TabSource.return_cate2, TabType.personalization);
|
|
|
- List<TabProto> defaultHotTab = this.buildTabProto(tabCollect.get(3), TabSource.default_hot, TabType.personalization);
|
|
|
+ List<TabProto> profileTab = this.buildTabProto(tabCollect.get(0), TabSource.profile, TabType.personalization, tabs);
|
|
|
+ List<TabProto> shareCate2Tab = this.buildTabProto(tabCollect.get(1), TabSource.share_cate2, TabType.personalization, tabs);
|
|
|
+ List<TabProto> returnCate2Tab = this.buildTabProto(tabCollect.get(2), TabSource.return_cate2, TabType.personalization, tabs);
|
|
|
+ List<TabProto> defaultHotTab = this.buildTabProto(tabCollect.get(3), TabSource.default_hot, TabType.personalization, tabs);
|
|
|
|
|
|
// 默认兜底Tab
|
|
|
tabProtos.addAll(0, defaultHotTab);
|
|
|
@@ -134,7 +135,7 @@ public class TabService {
|
|
|
return tabProtos;
|
|
|
}
|
|
|
|
|
|
- private List<TabProto> buildTabProto(List<String> tabNames, TabSource source, TabType type) {
|
|
|
+ private List<TabProto> buildTabProto(List<String> tabNames, TabSource source, TabType type, Set<String> tabs) {
|
|
|
if (CollectionUtils.isEmpty(tabNames)) {
|
|
|
return Collections.emptyList();
|
|
|
}
|
|
|
@@ -143,6 +144,9 @@ public class TabService {
|
|
|
if (StringUtils.isBlank(tabName)) {
|
|
|
continue;
|
|
|
}
|
|
|
+ if (tabs.contains(tabName)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
tabProtos.add(
|
|
|
TabProto.newBuilder()
|
|
|
.setKey(tabName)
|
|
|
@@ -151,6 +155,7 @@ public class TabService {
|
|
|
.setType(type.getType())
|
|
|
.build()
|
|
|
);
|
|
|
+ tabs.add(tabName);
|
|
|
}
|
|
|
return tabProtos;
|
|
|
}
|