| 
					
				 | 
			
			
				@@ -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); 
			 |