|
@@ -3,6 +3,7 @@ package com.tzld.longarticle.recommend.server.service;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
|
|
|
import com.tzld.longarticle.recommend.server.model.*;
|
|
|
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleUserGroupRepository;
|
|
|
import com.tzld.longarticle.recommend.server.repository.crawler.PublishContentSortLogRepository;
|
|
|
import com.tzld.longarticle.recommend.server.repository.crawler.PublishSortLogRepository;
|
|
|
import com.tzld.longarticle.recommend.server.repository.entity.crawler.PublishContentSortLog;
|
|
@@ -13,6 +14,7 @@ import com.tzld.longarticle.recommend.server.service.rank.RankService;
|
|
|
import com.tzld.longarticle.recommend.server.service.recall.RecallParam;
|
|
|
import com.tzld.longarticle.recommend.server.service.recall.RecallResult;
|
|
|
import com.tzld.longarticle.recommend.server.service.recall.RecallService;
|
|
|
+import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
|
|
|
import com.tzld.longarticle.recommend.server.util.DateUtils;
|
|
|
import com.tzld.longarticle.recommend.server.util.JSONUtils;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
@@ -23,12 +25,15 @@ import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
+import java.time.LocalDate;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import static com.tzld.longarticle.recommend.server.service.SceneConstants.FWH_COLD_START;
|
|
|
+
|
|
|
/**
|
|
|
* @author dyp
|
|
|
*/
|
|
@@ -46,6 +51,8 @@ public class RecommendService {
|
|
|
private PublishSortLogRepository publishSortLogRepository;
|
|
|
@Autowired
|
|
|
AccountIndexAvgViewCountService accountIndexAvgViewCountService;
|
|
|
+ @Autowired
|
|
|
+ private ArticleUserGroupRepository articleUserGroupRepository;
|
|
|
|
|
|
@ApolloJsonValue("${accountStrategyConfig:{}}")
|
|
|
private Map<String, String> accountStrategyConfigMap;
|
|
@@ -55,7 +62,7 @@ public class RecommendService {
|
|
|
|
|
|
public RecommendResponse recommend(RecommendRequest request) {
|
|
|
|
|
|
- RecommendParam param = genRecommendParam(request);
|
|
|
+ RecommendParam param = genRecommendParam(request, SceneConstants.DEFAULT);
|
|
|
log.info("genRecommendParam {}", JSONUtils.toJson(param));
|
|
|
// 获取账号排序设置
|
|
|
String strategyConfig = accountStrategyConfigMap.get(request.getAccountName());
|
|
@@ -73,9 +80,9 @@ public class RecommendService {
|
|
|
return buildRecommendResponse(recallResult, rankResult, param.getPublishNum());
|
|
|
}
|
|
|
|
|
|
- public RecommendWithUserGroupResponse recommendWithUserGroup(RecommendRequest request) {
|
|
|
+ public RecommendWithUserGroupResponse recommend4FwhColdStart(RecommendRequest request) {
|
|
|
|
|
|
- RecommendParam param = genRecommendParam(request);
|
|
|
+ RecommendParam param = genRecommendParam(request, FWH_COLD_START);
|
|
|
log.info("genRecommendParam {}", JSONUtils.toJson(param));
|
|
|
// 获取账号排序设置
|
|
|
String strategyConfig = accountStrategyConfigMap.get(request.getAccountName());
|
|
@@ -90,7 +97,33 @@ public class RecommendService {
|
|
|
|
|
|
saveSortLog(param, rankResult);
|
|
|
|
|
|
- return buildRecommendWithUserGroupResponse(recallResult, rankResult, param.getPublishNum());
|
|
|
+
|
|
|
+ List<RecommendWithUserGroupResponse.RankData> rankList = new ArrayList<>();
|
|
|
+ List<Content> contentList = rankResult.getContents();
|
|
|
+ for (int i = 0, start = 0; i < param.getUserGroupIds().size() && start < contentList.size(); i++) {
|
|
|
+ RecommendWithUserGroupResponse.RankData rankData = new RecommendWithUserGroupResponse.RankData();
|
|
|
+ rankData.setUserGroupId(param.getUserGroupIds().get(i));
|
|
|
+ int end = Math.min(contentList.size(), start + param.getPublishNum() - 1);
|
|
|
+ rankData.setContentIds(CommonCollectionUtils.toList(contentList.subList(start, end), Content::getId));
|
|
|
+ rankList.add(rankData);
|
|
|
+ start = i * param.getPublishNum();
|
|
|
+ }
|
|
|
+
|
|
|
+ List<RecommendWithUserGroupResponse.FilterData> filterList = new ArrayList<>();
|
|
|
+ for (RecallResult.RecallData data : recallResult.getData()) {
|
|
|
+ if (CollectionUtils.isNotEmpty(data.getFilterContents())) {
|
|
|
+ for (Content filterContent : data.getFilterContents()) {
|
|
|
+ RecommendWithUserGroupResponse.FilterData filterData = new RecommendWithUserGroupResponse.FilterData();
|
|
|
+ filterData.setContentId(filterContent.getId());
|
|
|
+ filterData.setFilterReason(filterContent.getFilterReason());
|
|
|
+ filterList.add(filterData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return new RecommendWithUserGroupResponse(0, "success",
|
|
|
+ new RecommendWithUserGroupResponse.RecommendWithUserGroupData(rankList, filterList));
|
|
|
}
|
|
|
|
|
|
private RecommendResponse buildRecommendResponse(RecallResult recallResult, RankResult rankResult, Integer publishNum) {
|
|
@@ -124,9 +157,28 @@ public class RecommendService {
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
- public RecommendParam genRecommendParam(RecommendRequest request) {
|
|
|
+ public RecommendParam genRecommendParam(RecommendRequest request, String abCode) {
|
|
|
RecommendParam param = new RecommendParam();
|
|
|
BeanUtils.copyProperties(request, param);
|
|
|
+ param.setScene(abCode);
|
|
|
+
|
|
|
+ switch (abCode) {
|
|
|
+ case FWH_COLD_START:
|
|
|
+ List<Integer> userGroupIds = articleUserGroupRepository.findAllUserGroupId(request.getGhId());
|
|
|
+ LocalDate today = LocalDate.now(); // 获取当前日期
|
|
|
+ int dayOfYear = today.getDayOfYear();
|
|
|
+ int tailNum = dayOfYear % 8;
|
|
|
+ List<Integer> needPushUserGroupIds = new ArrayList<>();
|
|
|
+ for (int userGroupId : userGroupIds) {
|
|
|
+ if (userGroupId % 8 == tailNum) {
|
|
|
+ needPushUserGroupIds.add(userGroupId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ param.setUserGroupIds(needPushUserGroupIds);
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
return param;
|
|
|
}
|
|
|
|
|
@@ -159,11 +211,15 @@ public class RecommendService {
|
|
|
rankParam.setGhId(param.getGhId());
|
|
|
rankParam.setAccountName(param.getAccountName());
|
|
|
rankParam.setSize(param.getPublishNum());
|
|
|
+ rankParam.setScene(param.getScene());
|
|
|
+ rankParam.setUserGroupIds(param.getUserGroupIds());
|
|
|
+
|
|
|
return rankParam;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 记录 账号、排序策略、结果。。。
|
|
|
+ *
|
|
|
* @param param
|
|
|
* @param rankResult
|
|
|
*/
|
|
@@ -179,7 +235,6 @@ public class RecommendService {
|
|
|
log.setPublishContentId(JSONObject.toJSONString(publishContentIds));
|
|
|
log.setCreateTimestamp(System.currentTimeMillis());
|
|
|
publishContentSortLogRepository.save(log);
|
|
|
- // 仅记录3-8条 冷启层内容
|
|
|
List<PublishSortLog> publishSortLogSaveList = new ArrayList<>();
|
|
|
for (int i = 1; i < rankResult.getContents().size() + 1; i++) {
|
|
|
Content content = rankResult.getContents().get(i - 1);
|