ソースを参照

Merge branch 'wyp/1017-rank1314' of Server/long-article-recommend into master

wangyunpeng 9 ヶ月 前
コミット
b0cca9120e
28 ファイル変更532 行追加218 行削除
  1. 31 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/common/enums/ArticleTypeEnum.java
  2. 3 3
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/common/enums/FeishuRobotIdEnum.java
  3. 2 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/common/enums/RankStrategyEnum.java
  4. 3 2
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/remote/ArticleListRemoteService.java
  5. 1 1
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/remote/NLPRemoteService.java
  6. 2 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/crawler/ArticleRepository.java
  7. 6 5
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/DataDashboardService.java
  8. 1 1
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/RecommendService.java
  9. 7 10
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/StrategyIndexScoreWeightService.java
  10. 3 3
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/XxlJobService.java
  11. 28 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/RankStrategy.java
  12. 10 19
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/DefaultRankStrategy.java
  13. 0 1
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/FwhColdStartRankStrategy.java
  14. 10 18
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV10Strategy.java
  15. 10 18
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV11Strategy.java
  16. 10 18
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV12Strategy.java
  17. 166 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV13Strategy.java
  18. 166 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV14Strategy.java
  19. 0 3
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV2Strategy.java
  20. 10 18
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV3Strategy.java
  21. 10 18
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV4Strategy.java
  22. 10 17
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV5Strategy.java
  23. 10 18
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV7Strategy.java
  24. 10 18
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV8Strategy.java
  25. 10 18
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV9Strategy.java
  26. 6 5
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recall/RecallService.java
  27. 3 1
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/score/ScoreService.java
  28. 4 3
      long-article-recommend-service/src/test/java/com/tzld/longarticle/recommend/server/RecommendTest.java

+ 31 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/common/enums/ArticleTypeEnum.java

@@ -0,0 +1,31 @@
+package com.tzld.longarticle.recommend.server.common.enums;
+
+import lombok.Getter;
+
+import java.util.Objects;
+
+@Getter
+public enum ArticleTypeEnum {
+    QUNFA("9", "群发"),
+    WUXIANLIU("10002", "无限流"),
+
+    ;
+
+    private final String val;
+    private final String description;
+
+
+    ArticleTypeEnum(String val, String description) {
+        this.val = val;
+        this.description = description;
+    }
+
+    public static ArticleTypeEnum from(String val) {
+        for (ArticleTypeEnum articleTypeEnum : ArticleTypeEnum.values()) {
+            if (Objects.equals(articleTypeEnum.val, val)) {
+                return articleTypeEnum;
+            }
+        }
+        return QUNFA;
+    }
+}

+ 3 - 3
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/common/enums/FeishuRobotIdEnum.java

@@ -6,8 +6,8 @@ import java.util.Objects;
 
 @Getter
 public enum FeishuRobotIdEnum {
-    recommend("长文排序报警群", "07026a9f-43f5-448b-ba40-a8d71bd6e634"),
-    job("定时任务报警群", "186c9798-5b6a-4ff8-b7fc-4ce4b6ea5076"),
+    RECOMMEND("长文排序报警群", "07026a9f-43f5-448b-ba40-a8d71bd6e634"),
+    JOB("定时任务报警群", "186c9798-5b6a-4ff8-b7fc-4ce4b6ea5076"),
 
     ;
 
@@ -26,6 +26,6 @@ public enum FeishuRobotIdEnum {
                 return robotEnum;
             }
         }
-        return recommend;
+        return RECOMMEND;
     }
 }

+ 2 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/common/enums/RankStrategyEnum.java

@@ -17,6 +17,8 @@ public enum RankStrategyEnum {
     ArticleRankV10("ArticleRankV10", "ArticleRankV10", "rankV10Strategy"),
     ArticleRankV11("ArticleRankV11", "ArticleRankV11", "rankV11Strategy"),
     ArticleRankV12("ArticleRankV12", "ArticleRankV12", "rankV12Strategy"),
+    ArticleRankV13("ArticleRankV13", "ArticleRankV13", "rankV13Strategy"),
+    ArticleRankV14("ArticleRankV14", "ArticleRankV14", "rankV14Strategy"),
 
     late_Strategy("ArticleRankLate", "晚间策略", "lateRankStrategy"),
     default_strategy("ArticleRankV1", "默认策略", "defaultRankStrategy"),

+ 3 - 2
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/remote/ArticleListRemoteService.java

@@ -3,8 +3,9 @@ package com.tzld.longarticle.recommend.server.remote;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.tzld.longarticle.recommend.server.common.HttpPoolFactory;
-import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.http.HttpEntity;
@@ -92,7 +93,7 @@ public class ArticleListRemoteService {
 
 
     private List<Article> getArticleListByDB(String accountName, List<Integer> indexList) {
-        return articleRepository.getByAccountNameAndItemIndexInAndTypeEquals(accountName, indexList, "9");
+        return articleRepository.getByAccountNameAndItemIndexInAndTypeEquals(accountName, indexList, ArticleTypeEnum.QUNFA.getVal());
     }
 
 }

+ 1 - 1
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/remote/NLPRemoteService.java

@@ -101,7 +101,7 @@ public class NLPRemoteService {
                                 .put("url", url)
                                 .put("账号名称", accountName)
                                 .build());
-                FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.recommend.getRobotId(),
+                FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.RECOMMEND.getRobotId(),
                         "4090计算评分失败\n"
                         + "url: " + url +"\n"
                         + "账号名称: " + accountName);

+ 2 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/crawler/ArticleRepository.java

@@ -24,4 +24,6 @@ public interface ArticleRepository extends JpaRepository<Article, String> {
 
     List<Article> getByUpdateTimeGreaterThanAndTypeEquals(Long updateTIme, String type);
 
+    List<Article> getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(String ghId, Integer itemIndex, String type, Integer status);
+
 }

+ 6 - 5
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/DataDashboardService.java

@@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
 import com.google.common.collect.Lists;
 import com.tzld.longarticle.recommend.server.common.enums.AccountBusinessTypeEnum;
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.mapper.aigc.AigcBaseMapper;
 import com.tzld.longarticle.recommend.server.mapper.longArticle.LongArticleBaseMapper;
 import com.tzld.longarticle.recommend.server.model.dto.ProduceContentDTO;
@@ -143,7 +144,7 @@ public class DataDashboardService {
         List<AccountAvgInfo> accountAvgInfoList = accountAvgInfoRepository.findAll();
         List<String> ghIds = accountAvgInfoList.stream().map(AccountAvgInfo::getGhId).distinct().collect(Collectors.toList());
 
-        List<Article> articleList = articleRepository.getByGhIdInAndUpdateTimeGreaterThanAndTypeEquals(ghIds, timestamp, "9");
+        List<Article> articleList = articleRepository.getByGhIdInAndUpdateTimeGreaterThanAndTypeEquals(ghIds, timestamp, ArticleTypeEnum.QUNFA.getVal());
         Map<String, Map<String, Map<Integer, Article>>> articleMap = articleList.stream().collect(Collectors.groupingBy(Article::getGhId,
                 Collectors.groupingBy(Article::getAppMsgId, Collectors.toMap(Article::getItemIndex, o -> o))));
 
@@ -262,7 +263,7 @@ public class DataDashboardService {
         List<Article> hisArticleList = new ArrayList<>();
         List<List<String>> titleMd5Partition = Lists.partition(new ArrayList<>(titleMd5List), 1000);
         for (List<String> titleMd5s : titleMd5Partition) {
-            hisArticleList.addAll(articleRepository.getByTitleMd5InAndTypeEqualsAndStatusEquals(titleMd5s, "9", 1));
+            hisArticleList.addAll(articleRepository.getByTitleMd5InAndTypeEqualsAndStatusEquals(titleMd5s, ArticleTypeEnum.QUNFA.getVal(), 1));
         }
         Map<String, List<Article>> hisArticleMap = hisArticleList.stream().collect(Collectors.groupingBy(Article::getTitle));
         Set<String> hisWxSnList = hisArticleList.stream().map(Article::getWxSn).collect(Collectors.toSet());
@@ -772,7 +773,7 @@ public class DataDashboardService {
                 .collect(Collectors.groupingBy(AccountAvgInfo::getGhId, Collectors.groupingBy(AccountAvgInfo::getUpdateTime,
                         Collectors.toMap(AccountAvgInfo::getPosition, o -> o))));
         List<String> ghIds = accountAvgInfoList.stream().map(AccountAvgInfo::getGhId).distinct().collect(Collectors.toList());
-        List<Article> articleList = articleRepository.getByGhIdInAndUpdateTimeLessThanAndTypeEquals(ghIds, dateEnd, "9");
+        List<Article> articleList = articleRepository.getByGhIdInAndUpdateTimeLessThanAndTypeEquals(ghIds, dateEnd, ArticleTypeEnum.QUNFA.getVal());
         Map<String, Article> articleMap = articleList.stream().collect(Collectors.toMap(Article::getWxSn, o -> o));
         List<Article> todayPublish = articleList.stream().filter(o -> o.getUpdateTime() > dateStart).collect(Collectors.toList());
         if (CollectionUtils.isEmpty(todayPublish)) {
@@ -795,7 +796,7 @@ public class DataDashboardService {
         List<NewSortStrategyExport> newSortStrategyExportList = getNewSortStrategyExportList(todayPublish,
                 articleDetailInfoMap, accountAvgInfoIndexMap);
 
-        List<Article> futurePublishList = articleRepository.getByUpdateTimeGreaterThanAndTypeEquals(dateEnd, "9");
+        List<Article> futurePublishList = articleRepository.getByUpdateTimeGreaterThanAndTypeEquals(dateEnd, ArticleTypeEnum.QUNFA.getVal());
         Map<String, List<Article>> futurePublishMap = futurePublishList.stream().collect(Collectors.groupingBy(Article::getTitle));
 
         Map<String, List<String>> titleTypeMap = new HashMap<>();
@@ -1381,7 +1382,7 @@ public class DataDashboardService {
         sortLogList.sort(Comparator.comparing(PublishSortLog::getGhId).thenComparing(PublishSortLog::getDateStr));
         List<String> ghIds = sortLogList.stream().map(PublishSortLog::getGhId).distinct().collect(Collectors.toList());
         long minTimestamp = DateUtils.dateStrToTimestamp(dateStrList.get(0), "yyyyMMdd");
-        List<Article> articleList = articleRepository.getByGhIdInAndUpdateTimeGreaterThanAndTypeEquals(ghIds, minTimestamp, "9");
+        List<Article> articleList = articleRepository.getByGhIdInAndUpdateTimeGreaterThanAndTypeEquals(ghIds, minTimestamp, ArticleTypeEnum.QUNFA.getVal());
         articleList = articleList.stream().filter(o -> o.getItemIndex() == 1).collect(Collectors.toList());
         Map<String, Map<String, Article>> articleMap = articleList.stream().collect(
                 Collectors.groupingBy(Article::getGhId, Collectors.toMap(

+ 1 - 1
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/RecommendService.java

@@ -95,7 +95,7 @@ public class RecommendService {
         if (StringUtils.hasText(strategyConfig) && !request.isParamStrategy()) {
             param.setStrategy(strategyConfig);
         }
-        if (DateUtils.getCurrentHour() >= 19) {
+        if (DateUtils.getCurrentHour() >= 19 && !request.isParamStrategy()) {
             Integer pushType = aigcBaseMapper.getPublishPlanPushType(request.getPlanId());
             if (Objects.equals(2, pushType)) {
                 param.setStrategy(RankStrategyEnum.late_Strategy.getStrategy());

+ 7 - 10
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/StrategyIndexScoreWeightService.java

@@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
+import java.util.Objects;
 
 @Component
 @Slf4j
@@ -14,17 +15,13 @@ public class StrategyIndexScoreWeightService {
     private Map<String, Map<String, Map<String, Double>>> strategyIndexScoreWeightMap;
 
     public double getWeight(String strategy, Integer index, String score) {
+        Double weight = 1.0;
         Map<String, Map<String, Double>> indexMap = strategyIndexScoreWeightMap.get(strategy);
-        if (indexMap == null) {
-            return 1.0;
-        }
-        Map<String, Double> scoreMap = indexMap.get(String.valueOf(index));
-        if (scoreMap == null) {
-            return 1.0;
-        }
-        Double weight = scoreMap.get(score);
-        if (weight == null) {
-            return 1.0;
+        if (Objects.nonNull(indexMap)) {
+            Map<String, Double> scoreMap = indexMap.get(String.valueOf(index));
+            if (Objects.nonNull(scoreMap) && scoreMap.containsKey(score)) {
+                weight = scoreMap.get(score);
+            }
         }
         return weight;
     }

+ 3 - 3
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/XxlJobService.java

@@ -81,7 +81,7 @@ public class XxlJobService {
         if (CollectionUtil.isNotEmpty(publishAccounts)) {
             accountNames = publishAccounts.stream().map(PublishAccount::getName).collect(Collectors.toList());
         }
-        FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.recommend.getRobotId(),
+        FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.RECOMMEND.getRobotId(),
                 "发布计划超1H未发送完成\n"
                         + "发布计划ID: " + publishPlan.getPlanId() + "\n"
                         + "发布计划名称: " + publishPlan.getPlanName() + "\n"
@@ -147,7 +147,7 @@ public class XxlJobService {
             }
         } catch (Exception e) {
             log.error("Error processCrawlerEachData: {}", JSONObject.toJSONString(longArticlesVideo), e);
-            FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.job.getRobotId(),
+            FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.JOB.getRobotId(),
                     "processCrawlerEachData 异常\n"
                     + "异常数据: " + JSONObject.toJSONString(longArticlesVideo) + "\n"
                     + "错误信息:" + e.getMessage());
@@ -198,7 +198,7 @@ public class XxlJobService {
             }
         } catch (Exception e) {
             log.error("Error processArticleEachData: {}", JSONObject.toJSONString(longArticlesMatchVideo), e);
-            FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.job.getRobotId(),
+            FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.JOB.getRobotId(),
                     "processArticleEachData 异常\n"
                             + "异常数据: " + JSONObject.toJSONString(longArticlesMatchVideo) + "\n"
                             + "错误信息:" + e.getMessage());

+ 28 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/RankStrategy.java

@@ -2,9 +2,14 @@ package com.tzld.longarticle.recommend.server.service.rank;
 
 
 import com.tzld.longarticle.recommend.server.common.enums.ContentPoolEnum;
+import com.tzld.longarticle.recommend.server.common.enums.FeishuRobotIdEnum;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
 import com.tzld.longarticle.recommend.server.service.score.ScoreParam;
+import com.tzld.longarticle.recommend.server.service.score.strategy.SimilarityStrategy;
 import com.tzld.longarticle.recommend.server.util.TitleSimilarCheckUtil;
+import com.tzld.longarticle.recommend.server.util.feishu.FeishuMessageSender;
+import org.apache.commons.collections4.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -82,4 +87,27 @@ public interface RankStrategy {
         return result;
     }
 
+    static boolean SimilarityScoreZero(List<RankItem> items, RankParam param, List<Article> articleList) {
+        if (CollectionUtils.isNotEmpty(items)
+                && items.get(0).getScoreMap().containsKey(SimilarityStrategy.class.getSimpleName())
+                && items.get(0).getScoreMap().get(SimilarityStrategy.class.getSimpleName()) == 0) {
+                FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.RECOMMEND.getRobotId(),
+                        "内容评分为0\n"
+                                + "ghId: " + param.getGhId() + "\n"
+                                + "账号名称: " + param.getAccountName() + "\n"
+                                + "策略: " + param.getStrategy());
+                return true;
+        }
+        return false;
+    }
+
+    static void sendFeishuFirstPoolEmpty(RankParam param, String contentPool) {
+        FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.RECOMMEND.getRobotId(),
+                "内容池1为空\n"
+                        + "ghId: " + param.getGhId() + "\n"
+                        + "账号名称: " + param.getAccountName() + "\n"
+                        + "内容池: " + contentPool + "\n"
+                        + "策略: " + param.getStrategy());
+    }
+
 }

+ 10 - 19
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/DefaultRankStrategy.java

@@ -1,7 +1,10 @@
 package com.tzld.longarticle.recommend.server.service.rank.strategy;
 
 
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
 import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
 import com.tzld.longarticle.recommend.server.service.rank.RankItem;
 import com.tzld.longarticle.recommend.server.service.rank.RankParam;
@@ -13,7 +16,6 @@ import com.tzld.longarticle.recommend.server.service.score.strategy.SimilaritySt
 import com.tzld.longarticle.recommend.server.service.score.strategy.ViewCountStrategy;
 import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
 import com.tzld.longarticle.recommend.server.util.JSONUtils;
-import com.tzld.longarticle.recommend.server.util.feishu.FeishuMessageSender;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.RandomUtils;
@@ -33,13 +35,13 @@ public class DefaultRankStrategy implements RankStrategy {
     private ScoreService scoreService;
     @Autowired
     private AccountContentPoolConfigService accountContentPoolConfigService;
+    @Autowired
+    private ArticleRepository articleRepository;
 
     public RankResult rank(RankParam param) {
         List<Content> result = new ArrayList<>();
-        //log.info("RankParam {}", JSONUtils.toJson(param));
-        ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
-        //log.info("ScoreResult {}", JSONUtils.toJson(scoreResult));
 
+        ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
         Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
 
         List<RankItem> items = CommonCollectionUtils.toList(param.getContents(), c -> {
@@ -81,14 +83,9 @@ public class DefaultRankStrategy implements RankStrategy {
             }
         }
         // 相似度评分为0 报警返回
-        if (CollectionUtils.isNotEmpty(items)
-                && items.get(0).getScoreMap().containsKey(SimilarityStrategy.class.getSimpleName())
-                && items.get(0).getScoreMap().get(SimilarityStrategy.class.getSimpleName()) == 0) {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容评分为0\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
             return new RankResult(result);
         }
 
@@ -96,7 +93,6 @@ public class DefaultRankStrategy implements RankStrategy {
         List<Content> contents = CommonCollectionUtils.toList(sortedItems, RankItem::getContent);
 
         // 3 相似去重
-//        contents = deduplication(contents);
         log.info("Deduplication {}", JSONUtils.toJson(contents));
         String[] publishPool = Arrays.copyOf(contentPools, contentPools.length);
 
@@ -113,12 +109,7 @@ public class DefaultRankStrategy implements RankStrategy {
         if (CollectionUtils.isNotEmpty(pool)) {
             result.add(pool.get(RandomUtils.nextInt(0, Math.min(pool.size(), 5))));
         } else {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容池1为空\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "内容池: " + contentPools[0] + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
             return new RankResult(result);
         }
 

+ 0 - 1
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/FwhColdStartRankStrategy.java

@@ -68,7 +68,6 @@ public class FwhColdStartRankStrategy implements RankStrategy {
         Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
         // 2 相似去重
         List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
-//        contents = deduplication(contents);
 
         // 3 选文章
         List<Content> result = new ArrayList<>();

+ 10 - 18
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV10Strategy.java

@@ -1,7 +1,10 @@
 package com.tzld.longarticle.recommend.server.service.rank.strategy;
 
 
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
 import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
 import com.tzld.longarticle.recommend.server.service.rank.RankItem;
 import com.tzld.longarticle.recommend.server.service.rank.RankParam;
@@ -12,7 +15,6 @@ import com.tzld.longarticle.recommend.server.service.score.ScoreResult;
 import com.tzld.longarticle.recommend.server.service.score.ScoreService;
 import com.tzld.longarticle.recommend.server.service.score.strategy.*;
 import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
-import com.tzld.longarticle.recommend.server.util.feishu.FeishuMessageSender;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.RandomUtils;
@@ -32,10 +34,12 @@ public class RankV10Strategy implements RankStrategy {
     private ScoreService scoreService;
     @Autowired
     private AccountContentPoolConfigService accountContentPoolConfigService;
+    @Autowired
+    private ArticleRepository articleRepository;
 
     public RankResult rank(RankParam param) {
         List<Content> result = new ArrayList<>();
-        //log.info("RankParam {}", JSONUtils.toJson(param));
+
         ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
 
         Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
@@ -69,15 +73,9 @@ public class RankV10Strategy implements RankStrategy {
             return item;
         });
         // 相似度评分为0 报警返回
-        
-        if (CollectionUtils.isNotEmpty(items)
-                && items.get(0).getScoreMap().containsKey(SimilarityStrategy.class.getSimpleName())
-                && items.get(0).getScoreMap().get(SimilarityStrategy.class.getSimpleName()) == 0) {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容评分为0\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
             return new RankResult(result);
         }
 
@@ -85,7 +83,6 @@ public class RankV10Strategy implements RankStrategy {
         Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
         // 2 相似去重
         List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
-//        contents = deduplication(contents);
 
         // 3 文章按照内容池分组
         Map<String, List<Content>> contentMap = new HashMap<>();
@@ -101,12 +98,7 @@ public class RankV10Strategy implements RankStrategy {
         if (CollectionUtils.isNotEmpty(pool1)) {
             result.add(pool1.get(0));
         } else {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容池1为空\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "内容池: " + contentPools[0] + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
             return new RankResult(result);
         }
         // 次

+ 10 - 18
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV11Strategy.java

@@ -1,8 +1,11 @@
 package com.tzld.longarticle.recommend.server.service.rank.strategy;
 
 
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.common.enums.RankStrategyEnum;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
 import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
 import com.tzld.longarticle.recommend.server.service.StrategyIndexScoreWeightService;
 import com.tzld.longarticle.recommend.server.service.rank.*;
@@ -11,7 +14,6 @@ import com.tzld.longarticle.recommend.server.service.score.ScoreResult;
 import com.tzld.longarticle.recommend.server.service.score.ScoreService;
 import com.tzld.longarticle.recommend.server.service.score.strategy.*;
 import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
-import com.tzld.longarticle.recommend.server.util.feishu.FeishuMessageSender;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.RandomUtils;
@@ -32,11 +34,13 @@ public class RankV11Strategy implements RankStrategy {
     @Autowired
     private AccountContentPoolConfigService accountContentPoolConfigService;
     @Autowired
+    private ArticleRepository articleRepository;
+    @Autowired
     private StrategyIndexScoreWeightService weightService;
 
     public RankResult rank(RankParam param) {
         List<Content> result = new ArrayList<>();
-        //log.info("RankParam {}", JSONUtils.toJson(param));
+
         ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
 
         Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
@@ -89,15 +93,9 @@ public class RankV11Strategy implements RankStrategy {
             return item;
         });
         // 相似度评分为0 报警返回
-        
-        if (CollectionUtils.isNotEmpty(items)
-                && items.get(0).getScoreMap().containsKey(SimilarityStrategy.class.getSimpleName())
-                && items.get(0).getScoreMap().get(SimilarityStrategy.class.getSimpleName()) == 0) {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容评分为0\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
             return new RankResult(result);
         }
 
@@ -105,7 +103,6 @@ public class RankV11Strategy implements RankStrategy {
         Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
         // 2 相似去重
         List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
-//        contents = deduplication(contents);
 
         // 3 文章按照内容池分组
         Map<String, List<Content>> contentMap = new HashMap<>();
@@ -122,12 +119,7 @@ public class RankV11Strategy implements RankStrategy {
         if (CollectionUtils.isNotEmpty(pool1)) {
             result.add(pool1.get(0));
         } else {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容池1为空\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "内容池: " + contentPools[0] + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
             return new RankResult(result);
         }
         // 次

+ 10 - 18
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV12Strategy.java

@@ -1,8 +1,11 @@
 package com.tzld.longarticle.recommend.server.service.rank.strategy;
 
 
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.common.enums.RankStrategyEnum;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
 import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
 import com.tzld.longarticle.recommend.server.service.StrategyIndexScoreWeightService;
 import com.tzld.longarticle.recommend.server.service.rank.*;
@@ -11,7 +14,6 @@ import com.tzld.longarticle.recommend.server.service.score.ScoreResult;
 import com.tzld.longarticle.recommend.server.service.score.ScoreService;
 import com.tzld.longarticle.recommend.server.service.score.strategy.*;
 import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
-import com.tzld.longarticle.recommend.server.util.feishu.FeishuMessageSender;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.RandomUtils;
@@ -32,11 +34,13 @@ public class RankV12Strategy implements RankStrategy {
     @Autowired
     private AccountContentPoolConfigService accountContentPoolConfigService;
     @Autowired
+    private ArticleRepository articleRepository;
+    @Autowired
     private StrategyIndexScoreWeightService weightService;
 
     public RankResult rank(RankParam param) {
         List<Content> result = new ArrayList<>();
-        //log.info("RankParam {}", JSONUtils.toJson(param));
+
         ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
 
         Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
@@ -89,15 +93,9 @@ public class RankV12Strategy implements RankStrategy {
             return item;
         });
         // 相似度评分为0 报警返回
-        
-        if (CollectionUtils.isNotEmpty(items)
-                && items.get(0).getScoreMap().containsKey(SimilarityStrategy.class.getSimpleName())
-                && items.get(0).getScoreMap().get(SimilarityStrategy.class.getSimpleName()) == 0) {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容评分为0\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
             return new RankResult(result);
         }
 
@@ -105,7 +103,6 @@ public class RankV12Strategy implements RankStrategy {
         Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
         // 2 相似去重
         List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
-//        contents = deduplication(contents);
 
         // 3 文章按照内容池分组
         Map<String, List<Content>> contentMap = new HashMap<>();
@@ -122,12 +119,7 @@ public class RankV12Strategy implements RankStrategy {
         if (CollectionUtils.isNotEmpty(pool1)) {
             result.add(pool1.get(0));
         } else {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容池1为空\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "内容池: " + contentPools[0] + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
             return new RankResult(result);
         }
         // 次

+ 166 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV13Strategy.java

@@ -0,0 +1,166 @@
+package com.tzld.longarticle.recommend.server.service.rank.strategy;
+
+
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
+import com.tzld.longarticle.recommend.server.common.enums.RankStrategyEnum;
+import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
+import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
+import com.tzld.longarticle.recommend.server.service.StrategyIndexScoreWeightService;
+import com.tzld.longarticle.recommend.server.service.rank.*;
+import com.tzld.longarticle.recommend.server.service.score.AccountIndexReplacePoolConfig;
+import com.tzld.longarticle.recommend.server.service.score.ScoreResult;
+import com.tzld.longarticle.recommend.server.service.score.ScoreService;
+import com.tzld.longarticle.recommend.server.service.score.strategy.*;
+import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.RandomUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * @author dyp
+ */
+@Service
+@Slf4j
+public class RankV13Strategy implements RankStrategy {
+
+    @Autowired
+    private ScoreService scoreService;
+    @Autowired
+    private AccountContentPoolConfigService accountContentPoolConfigService;
+    @Autowired
+    private ArticleRepository articleRepository;
+    @Autowired
+    private StrategyIndexScoreWeightService weightService;
+
+    public RankResult rank(RankParam param) {
+        List<Content> result = new ArrayList<>();
+
+        ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
+
+        Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
+        String[] contentPools = accountContentPoolConfigService.getContentPools(param.getAccountName());
+        Map<Integer, AccountIndexReplacePoolConfig> indexReplacePoolConfigMap = accountContentPoolConfigService.getContentReplacePools(param.getAccountName());
+
+        List<RankItem> items = CommonCollectionUtils.toList(param.getContents(), c -> {
+            RankItem item = new RankItem();
+            item.setContent(c);
+            c.setScoreMap(scoreMap.get(c.getId()));
+            item.setScoreMap(scoreMap.get(c.getId()));
+            double score;
+            if (contentPools[0].equals(item.getContent().getContentPoolType())) {
+                double similarityScore = Math.pow(item.getScore(SimilarityStrategy.class.getSimpleName()),
+                        weightService.getWeight(param.getStrategy(), 1,
+                                SimilarityStrategy.class.getSimpleName()));
+                score = item.getScore(HisFissionAvgReadRateRateStrategy.class.getSimpleName())
+                        * weightService.getWeight(param.getStrategy(), 1,
+                        HisFissionAvgReadRateRateStrategy.class.getSimpleName());
+                if (item.getScore(PublishTimesStrategy.class.getSimpleName()) >= 0) {
+                    score += item.getScore(ViewCountRateStrategy.class.getSimpleName())
+                            * weightService.getWeight(param.getStrategy(), 1,
+                            ViewCountRateStrategy.class.getSimpleName());
+                }
+                score = score * similarityScore;
+            } else if (contentPools[1].equals(item.getContent().getContentPoolType())) {
+                score = (item.getScore(SimilarityStrategy.class.getSimpleName())
+                        * weightService.getWeight(param.getStrategy(), 2,
+                        SimilarityStrategy.class.getSimpleName()))
+                        + item.getScore(CategoryStrategy.class.getSimpleName())
+                        + item.getScore(FlowCtlDecreaseStrategy.class.getSimpleName());
+                if (item.getScore(PublishTimesStrategy.class.getSimpleName()) >= 0) {
+                    score += item.getScore(ViewCountRateStrategy.class.getSimpleName())
+                            * weightService.getWeight(param.getStrategy(), 2,
+                            ViewCountRateStrategy.class.getSimpleName());
+                }
+            } else {
+                score = (item.getScore(SimilarityStrategy.class.getSimpleName())
+                        * weightService.getWeight(param.getStrategy(), 3,
+                        SimilarityStrategy.class.getSimpleName()))
+                        + item.getScore(CategoryStrategy.class.getSimpleName())
+                        + (item.getScore(AccountPreDistributeStrategy.class.getSimpleName())
+                        * weightService.getWeight(param.getStrategy(), 3,
+                        AccountPreDistributeStrategy.class.getSimpleName()))
+                        + item.getScore(PublishTimesStrategy.class.getSimpleName())
+                        + item.getScore(FlowCtlDecreaseStrategy.class.getSimpleName());
+            }
+            c.setScore(score);
+            c.setHisPublishArticleList(null);
+            item.setScore(score);
+            return item;
+        });
+        // 相似度评分为0 报警返回
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
+            return new RankResult(result);
+        }
+
+        // 1 排序
+        Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
+        // 2 相似去重
+        List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
+
+        // 3 文章按照内容池分组
+        Map<String, List<Content>> contentMap = new HashMap<>();
+        for (Content c : contents) {
+            List<Content> data = contentMap.computeIfAbsent(c.getContentPoolType(), k -> new ArrayList<>());
+            data.add(c);
+        }
+        // 4 选文章
+        String[] publishPool = Arrays.copyOf(contentPools, contentPools.length);
+
+        // 头
+        List<Content> pool1 = contentMap.get(contentPools[0]);
+        RankService.printSortLog(RankStrategyEnum.ArticleRankV13.getStrategy(), param.getAccountName(), pool1);
+        if (CollectionUtils.isNotEmpty(pool1)) {
+            result.add(pool1.get(0));
+        } else {
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
+            return new RankResult(result);
+        }
+        // 次
+        List<Content> pool2 = contentMap.get(contentPools[1]);
+        if (CollectionUtils.isNotEmpty(pool2)) {
+            int i = RandomUtils.nextInt(0, Math.min(pool2.size(), 5));
+            int j = RandomUtils.nextInt(0, Math.min(pool2.size(), 5));
+            result.add(pool2.get(i));
+            // 替补 头条内容不足使用次条内容
+            if (result.size() == 1 && pool2.size() > 1) {
+                while (i == j && pool2.size() > 1) {
+                    j = RandomUtils.nextInt(0, Math.min(pool2.size(), 5));
+                    if (i != j) {
+                        publishPool[0] = contentPools[1];
+                        result.add(pool2.get(1));
+                        break;
+                    }
+                }
+            }
+        } else {
+            // 替补 根据设置替补内容池查找内容尽心替补
+            AccountIndexReplacePoolConfig replacePoolConfig = indexReplacePoolConfigMap.get(2);
+            if (Objects.nonNull(replacePoolConfig)) {
+                List<Content> pool2Replace = contentMap.get(replacePoolConfig.getContentPool());
+                if (CollectionUtils.isNotEmpty(pool2Replace)) {
+                    publishPool[1] = replacePoolConfig.getContentPool();
+                    result.add(pool2Replace.get(0));
+                }
+            }
+        }
+
+        // 3-8
+        List<Content> pool = contentMap.get(contentPools[2]);
+        if (CollectionUtils.isNotEmpty(pool) && param.getSize() > result.size()) {
+            result.addAll(pool.subList(0, Math.min(pool.size(), param.getSize() - result.size())));
+        }
+
+        RankStrategy.deduplication(result, contentMap, publishPool);
+
+        return new RankResult(result);
+    }
+
+}

+ 166 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV14Strategy.java

@@ -0,0 +1,166 @@
+package com.tzld.longarticle.recommend.server.service.rank.strategy;
+
+
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
+import com.tzld.longarticle.recommend.server.common.enums.RankStrategyEnum;
+import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
+import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
+import com.tzld.longarticle.recommend.server.service.StrategyIndexScoreWeightService;
+import com.tzld.longarticle.recommend.server.service.rank.*;
+import com.tzld.longarticle.recommend.server.service.score.AccountIndexReplacePoolConfig;
+import com.tzld.longarticle.recommend.server.service.score.ScoreResult;
+import com.tzld.longarticle.recommend.server.service.score.ScoreService;
+import com.tzld.longarticle.recommend.server.service.score.strategy.*;
+import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.RandomUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * @author dyp
+ */
+@Service
+@Slf4j
+public class RankV14Strategy implements RankStrategy {
+
+    @Autowired
+    private ScoreService scoreService;
+    @Autowired
+    private AccountContentPoolConfigService accountContentPoolConfigService;
+    @Autowired
+    private ArticleRepository articleRepository;
+    @Autowired
+    private StrategyIndexScoreWeightService weightService;
+
+    public RankResult rank(RankParam param) {
+        List<Content> result = new ArrayList<>();
+
+        ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
+
+        Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
+        String[] contentPools = accountContentPoolConfigService.getContentPools(param.getAccountName());
+        Map<Integer, AccountIndexReplacePoolConfig> indexReplacePoolConfigMap = accountContentPoolConfigService.getContentReplacePools(param.getAccountName());
+
+        List<RankItem> items = CommonCollectionUtils.toList(param.getContents(), c -> {
+            RankItem item = new RankItem();
+            item.setContent(c);
+            c.setScoreMap(scoreMap.get(c.getId()));
+            item.setScoreMap(scoreMap.get(c.getId()));
+            double score;
+            if (contentPools[0].equals(item.getContent().getContentPoolType())) {
+                double similarityScore = Math.pow(item.getScore(SimilarityStrategy.class.getSimpleName()),
+                        weightService.getWeight(param.getStrategy(), 1,
+                                SimilarityStrategy.class.getSimpleName()));
+                score = item.getScore(HisFissionDeWeightAvgReadSumRateStrategy.class.getSimpleName())
+                        * weightService.getWeight(param.getStrategy(), 1,
+                        HisFissionDeWeightAvgReadSumRateStrategy.class.getSimpleName());
+                if (item.getScore(PublishTimesStrategy.class.getSimpleName()) >= 0) {
+                    score += item.getScore(ViewCountRateStrategy.class.getSimpleName())
+                            * weightService.getWeight(param.getStrategy(), 1,
+                            ViewCountRateStrategy.class.getSimpleName());
+                }
+                score = score * similarityScore;
+            } else if (contentPools[1].equals(item.getContent().getContentPoolType())) {
+                score = (item.getScore(SimilarityStrategy.class.getSimpleName())
+                        * weightService.getWeight(param.getStrategy(), 2,
+                        SimilarityStrategy.class.getSimpleName()))
+                        + item.getScore(CategoryStrategy.class.getSimpleName())
+                        + item.getScore(FlowCtlDecreaseStrategy.class.getSimpleName());
+                if (item.getScore(PublishTimesStrategy.class.getSimpleName()) >= 0) {
+                    score += item.getScore(ViewCountRateStrategy.class.getSimpleName())
+                            * weightService.getWeight(param.getStrategy(), 2,
+                            ViewCountRateStrategy.class.getSimpleName());
+                }
+            } else {
+                score = (item.getScore(SimilarityStrategy.class.getSimpleName())
+                        * weightService.getWeight(param.getStrategy(), 3,
+                        SimilarityStrategy.class.getSimpleName()))
+                        + item.getScore(CategoryStrategy.class.getSimpleName())
+                        + (item.getScore(AccountPreDistributeStrategy.class.getSimpleName())
+                        * weightService.getWeight(param.getStrategy(), 3,
+                        AccountPreDistributeStrategy.class.getSimpleName()))
+                        + item.getScore(PublishTimesStrategy.class.getSimpleName())
+                        + item.getScore(FlowCtlDecreaseStrategy.class.getSimpleName());
+            }
+            c.setScore(score);
+            c.setHisPublishArticleList(null);
+            item.setScore(score);
+            return item;
+        });
+        // 相似度评分为0 报警返回
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
+            return new RankResult(result);
+        }
+
+        // 1 排序
+        Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
+        // 2 相似去重
+        List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
+
+        // 3 文章按照内容池分组
+        Map<String, List<Content>> contentMap = new HashMap<>();
+        for (Content c : contents) {
+            List<Content> data = contentMap.computeIfAbsent(c.getContentPoolType(), k -> new ArrayList<>());
+            data.add(c);
+        }
+        // 4 选文章
+        String[] publishPool = Arrays.copyOf(contentPools, contentPools.length);
+
+        // 头
+        List<Content> pool1 = contentMap.get(contentPools[0]);
+        RankService.printSortLog(RankStrategyEnum.ArticleRankV14.getStrategy(), param.getAccountName(), pool1);
+        if (CollectionUtils.isNotEmpty(pool1)) {
+            result.add(pool1.get(0));
+        } else {
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
+            return new RankResult(result);
+        }
+        // 次
+        List<Content> pool2 = contentMap.get(contentPools[1]);
+        if (CollectionUtils.isNotEmpty(pool2)) {
+            int i = RandomUtils.nextInt(0, Math.min(pool2.size(), 5));
+            int j = RandomUtils.nextInt(0, Math.min(pool2.size(), 5));
+            result.add(pool2.get(i));
+            // 替补 头条内容不足使用次条内容
+            if (result.size() == 1 && pool2.size() > 1) {
+                while (i == j && pool2.size() > 1) {
+                    j = RandomUtils.nextInt(0, Math.min(pool2.size(), 5));
+                    if (i != j) {
+                        publishPool[0] = contentPools[1];
+                        result.add(pool2.get(1));
+                        break;
+                    }
+                }
+            }
+        } else {
+            // 替补 根据设置替补内容池查找内容尽心替补
+            AccountIndexReplacePoolConfig replacePoolConfig = indexReplacePoolConfigMap.get(2);
+            if (Objects.nonNull(replacePoolConfig)) {
+                List<Content> pool2Replace = contentMap.get(replacePoolConfig.getContentPool());
+                if (CollectionUtils.isNotEmpty(pool2Replace)) {
+                    publishPool[1] = replacePoolConfig.getContentPool();
+                    result.add(pool2Replace.get(0));
+                }
+            }
+        }
+
+        // 3-8
+        List<Content> pool = contentMap.get(contentPools[2]);
+        if (CollectionUtils.isNotEmpty(pool) && param.getSize() > result.size()) {
+            result.addAll(pool.subList(0, Math.min(pool.size(), param.getSize() - result.size())));
+        }
+
+        RankStrategy.deduplication(result, contentMap, publishPool);
+
+        return new RankResult(result);
+    }
+
+}

+ 0 - 3
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV2Strategy.java

@@ -33,10 +33,7 @@ public class RankV2Strategy implements RankStrategy {
 
     public RankResult rank(RankParam param) {
 
-        //log.info("RankParam {}", JSONUtils.toJson(param));
         ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
-        //log.info("ScoreResult {}", JSONUtils.toJson(scoreResult));
-
         Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
 
         List<RankItem> items = CommonCollectionUtils.toList(param.getContents(), c -> {

+ 10 - 18
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV3Strategy.java

@@ -1,7 +1,10 @@
 package com.tzld.longarticle.recommend.server.service.rank.strategy;
 
 
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
 import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
 import com.tzld.longarticle.recommend.server.service.rank.RankItem;
 import com.tzld.longarticle.recommend.server.service.rank.RankParam;
@@ -12,7 +15,6 @@ import com.tzld.longarticle.recommend.server.service.score.ScoreResult;
 import com.tzld.longarticle.recommend.server.service.score.ScoreService;
 import com.tzld.longarticle.recommend.server.service.score.strategy.*;
 import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
-import com.tzld.longarticle.recommend.server.util.feishu.FeishuMessageSender;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.RandomUtils;
@@ -32,10 +34,12 @@ public class RankV3Strategy implements RankStrategy {
     private ScoreService scoreService;
     @Autowired
     private AccountContentPoolConfigService accountContentPoolConfigService;
+    @Autowired
+    private ArticleRepository articleRepository;
 
     public RankResult rank(RankParam param) {
         List<Content> result = new ArrayList<>();
-        //log.info("RankParam {}", JSONUtils.toJson(param));
+
         ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
 
         Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
@@ -68,15 +72,9 @@ public class RankV3Strategy implements RankStrategy {
             return item;
         });
         // 相似度评分为0 报警返回
-        
-        if (CollectionUtils.isNotEmpty(items)
-                && items.get(0).getScoreMap().containsKey(SimilarityStrategy.class.getSimpleName())
-                && items.get(0).getScoreMap().get(SimilarityStrategy.class.getSimpleName()) == 0) {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容评分为0\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
             return new RankResult(result);
         }
 
@@ -84,7 +82,6 @@ public class RankV3Strategy implements RankStrategy {
         Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
         // 2 相似去重
         List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
-//        contents = deduplication(contents);
 
         // 3 文章按照内容池分组
         Map<String, List<Content>> contentMap = new HashMap<>();
@@ -100,12 +97,7 @@ public class RankV3Strategy implements RankStrategy {
         if (CollectionUtils.isNotEmpty(pool1)) {
             result.add(pool1.get(0));
         } else {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容池1为空\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "内容池: " + contentPools[0] + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
             return new RankResult(result);
         }
         // 次

+ 10 - 18
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV4Strategy.java

@@ -1,7 +1,10 @@
 package com.tzld.longarticle.recommend.server.service.rank.strategy;
 
 
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
 import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
 import com.tzld.longarticle.recommend.server.service.rank.RankItem;
 import com.tzld.longarticle.recommend.server.service.rank.RankParam;
@@ -12,7 +15,6 @@ import com.tzld.longarticle.recommend.server.service.score.ScoreResult;
 import com.tzld.longarticle.recommend.server.service.score.ScoreService;
 import com.tzld.longarticle.recommend.server.service.score.strategy.*;
 import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
-import com.tzld.longarticle.recommend.server.util.feishu.FeishuMessageSender;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.RandomUtils;
@@ -32,10 +34,12 @@ public class RankV4Strategy implements RankStrategy {
     private ScoreService scoreService;
     @Autowired
     private AccountContentPoolConfigService accountContentPoolConfigService;
+    @Autowired
+    private ArticleRepository articleRepository;
 
     public RankResult rank(RankParam param) {
         List<Content> result = new ArrayList<>();
-        //log.info("RankParam {}", JSONUtils.toJson(param));
+
         ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
 
         Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
@@ -68,15 +72,9 @@ public class RankV4Strategy implements RankStrategy {
             return item;
         });
         // 相似度评分为0 报警返回
-        
-        if (CollectionUtils.isNotEmpty(items)
-                && items.get(0).getScoreMap().containsKey(SimilarityStrategy.class.getSimpleName())
-                && items.get(0).getScoreMap().get(SimilarityStrategy.class.getSimpleName()) == 0) {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容评分为0\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
             return new RankResult(result);
         }
 
@@ -84,7 +82,6 @@ public class RankV4Strategy implements RankStrategy {
         Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
         // 2 相似去重
         List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
-//        contents = deduplication(contents);
 
         // 3 文章按照内容池分组
         Map<String, List<Content>> contentMap = new HashMap<>();
@@ -100,12 +97,7 @@ public class RankV4Strategy implements RankStrategy {
         if (CollectionUtils.isNotEmpty(pool1)) {
             result.add(pool1.get(0));
         } else {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容池1为空\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "内容池: " + contentPools[0] + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
             return new RankResult(result);
         }
         // 次

+ 10 - 17
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV5Strategy.java

@@ -1,8 +1,11 @@
 package com.tzld.longarticle.recommend.server.service.rank.strategy;
 
 
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.common.enums.RankStrategyEnum;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
 import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
 import com.tzld.longarticle.recommend.server.service.rank.*;
 import com.tzld.longarticle.recommend.server.service.score.AccountIndexReplacePoolConfig;
@@ -10,7 +13,6 @@ import com.tzld.longarticle.recommend.server.service.score.ScoreResult;
 import com.tzld.longarticle.recommend.server.service.score.ScoreService;
 import com.tzld.longarticle.recommend.server.service.score.strategy.*;
 import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
-import com.tzld.longarticle.recommend.server.util.feishu.FeishuMessageSender;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.RandomUtils;
@@ -30,10 +32,12 @@ public class RankV5Strategy implements RankStrategy {
     private ScoreService scoreService;
     @Autowired
     private AccountContentPoolConfigService accountContentPoolConfigService;
+    @Autowired
+    private ArticleRepository articleRepository;
 
     public RankResult rank(RankParam param) {
         List<Content> result = new ArrayList<>();
-        //log.info("RankParam {}", JSONUtils.toJson(param));
+
         ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
 
         Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
@@ -66,14 +70,9 @@ public class RankV5Strategy implements RankStrategy {
             return item;
         });
         // 相似度评分为0 报警返回
-        if (CollectionUtils.isNotEmpty(items)
-                && items.get(0).getScoreMap().containsKey(SimilarityStrategy.class.getSimpleName())
-                && items.get(0).getScoreMap().get(SimilarityStrategy.class.getSimpleName()) == 0) {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容评分为0\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
             return new RankResult(result);
         }
 
@@ -81,7 +80,6 @@ public class RankV5Strategy implements RankStrategy {
         Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
         // 2 相似去重
         List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
-//        contents = deduplication(contents);
 
         // 3 文章按照内容池分组
         Map<String, List<Content>> contentMap = new HashMap<>();
@@ -100,12 +98,7 @@ public class RankV5Strategy implements RankStrategy {
         if (CollectionUtils.isNotEmpty(pool1)) {
             result.add(pool1.get(0));
         } else {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容池1为空\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "内容池: " + contentPools[0] + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
             return new RankResult(result);
         }
         // 次

+ 10 - 18
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV7Strategy.java

@@ -1,7 +1,10 @@
 package com.tzld.longarticle.recommend.server.service.rank.strategy;
 
 
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
 import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
 import com.tzld.longarticle.recommend.server.service.rank.RankItem;
 import com.tzld.longarticle.recommend.server.service.rank.RankParam;
@@ -12,7 +15,6 @@ import com.tzld.longarticle.recommend.server.service.score.ScoreResult;
 import com.tzld.longarticle.recommend.server.service.score.ScoreService;
 import com.tzld.longarticle.recommend.server.service.score.strategy.*;
 import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
-import com.tzld.longarticle.recommend.server.util.feishu.FeishuMessageSender;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.RandomUtils;
@@ -32,10 +34,12 @@ public class RankV7Strategy implements RankStrategy {
     private ScoreService scoreService;
     @Autowired
     private AccountContentPoolConfigService accountContentPoolConfigService;
+    @Autowired
+    private ArticleRepository articleRepository;
 
     public RankResult rank(RankParam param) {
         List<Content> result = new ArrayList<>();
-        //log.info("RankParam {}", JSONUtils.toJson(param));
+
         ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
 
         Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
@@ -69,15 +73,9 @@ public class RankV7Strategy implements RankStrategy {
             return item;
         });
         // 相似度评分为0 报警返回
-        
-        if (CollectionUtils.isNotEmpty(items)
-                && items.get(0).getScoreMap().containsKey(SimilarityStrategy.class.getSimpleName())
-                && items.get(0).getScoreMap().get(SimilarityStrategy.class.getSimpleName()) == 0) {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容评分为0\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
             return new RankResult(result);
         }
 
@@ -85,7 +83,6 @@ public class RankV7Strategy implements RankStrategy {
         Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
         // 2 相似去重
         List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
-//        contents = deduplication(contents);
 
         // 3 文章按照内容池分组
         Map<String, List<Content>> contentMap = new HashMap<>();
@@ -101,12 +98,7 @@ public class RankV7Strategy implements RankStrategy {
         if (CollectionUtils.isNotEmpty(pool1)) {
             result.add(pool1.get(0));
         } else {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容池1为空\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "内容池: " + contentPools[0] + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
             return new RankResult(result);
         }
         // 次

+ 10 - 18
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV8Strategy.java

@@ -1,7 +1,10 @@
 package com.tzld.longarticle.recommend.server.service.rank.strategy;
 
 
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
 import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
 import com.tzld.longarticle.recommend.server.service.rank.RankItem;
 import com.tzld.longarticle.recommend.server.service.rank.RankParam;
@@ -12,7 +15,6 @@ import com.tzld.longarticle.recommend.server.service.score.ScoreResult;
 import com.tzld.longarticle.recommend.server.service.score.ScoreService;
 import com.tzld.longarticle.recommend.server.service.score.strategy.*;
 import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
-import com.tzld.longarticle.recommend.server.util.feishu.FeishuMessageSender;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.RandomUtils;
@@ -32,10 +34,12 @@ public class RankV8Strategy implements RankStrategy {
     private ScoreService scoreService;
     @Autowired
     private AccountContentPoolConfigService accountContentPoolConfigService;
+    @Autowired
+    private ArticleRepository articleRepository;
 
     public RankResult rank(RankParam param) {
         List<Content> result = new ArrayList<>();
-        //log.info("RankParam {}", JSONUtils.toJson(param));
+
         ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
 
         Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
@@ -72,15 +76,9 @@ public class RankV8Strategy implements RankStrategy {
             return item;
         });
         // 相似度评分为0 报警返回
-        
-        if (CollectionUtils.isNotEmpty(items)
-                && items.get(0).getScoreMap().containsKey(SimilarityStrategy.class.getSimpleName())
-                && items.get(0).getScoreMap().get(SimilarityStrategy.class.getSimpleName()) == 0) {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容评分为0\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
             return new RankResult(result);
         }
 
@@ -88,7 +86,6 @@ public class RankV8Strategy implements RankStrategy {
         Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
         // 2 相似去重
         List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
-//        contents = deduplication(contents);
 
         // 3 文章按照内容池分组
         Map<String, List<Content>> contentMap = new HashMap<>();
@@ -104,12 +101,7 @@ public class RankV8Strategy implements RankStrategy {
         if (CollectionUtils.isNotEmpty(pool1)) {
             result.add(pool1.get(0));
         } else {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容池1为空\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "内容池: " + contentPools[0] + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
             return new RankResult(result);
         }
         // 次

+ 10 - 18
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV9Strategy.java

@@ -1,7 +1,10 @@
 package com.tzld.longarticle.recommend.server.service.rank.strategy;
 
 
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleRepository;
 import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
 import com.tzld.longarticle.recommend.server.service.rank.RankItem;
 import com.tzld.longarticle.recommend.server.service.rank.RankParam;
@@ -12,7 +15,6 @@ import com.tzld.longarticle.recommend.server.service.score.ScoreResult;
 import com.tzld.longarticle.recommend.server.service.score.ScoreService;
 import com.tzld.longarticle.recommend.server.service.score.strategy.*;
 import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
-import com.tzld.longarticle.recommend.server.util.feishu.FeishuMessageSender;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.RandomUtils;
@@ -32,10 +34,12 @@ public class RankV9Strategy implements RankStrategy {
     private ScoreService scoreService;
     @Autowired
     private AccountContentPoolConfigService accountContentPoolConfigService;
+    @Autowired
+    private ArticleRepository articleRepository;
 
     public RankResult rank(RankParam param) {
         List<Content> result = new ArrayList<>();
-        //log.info("RankParam {}", JSONUtils.toJson(param));
+
         ScoreResult scoreResult = scoreService.score(RankStrategy.convertToScoreParam(param));
 
         Map<String, Map<String, Double>> scoreMap = scoreResult.getScoreMap();
@@ -69,15 +73,9 @@ public class RankV9Strategy implements RankStrategy {
             return item;
         });
         // 相似度评分为0 报警返回
-        
-        if (CollectionUtils.isNotEmpty(items)
-                && items.get(0).getScoreMap().containsKey(SimilarityStrategy.class.getSimpleName())
-                && items.get(0).getScoreMap().get(SimilarityStrategy.class.getSimpleName()) == 0) {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容评分为0\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+        List<Article> hisPublishFirstArticleList = articleRepository.getByGhIdAndItemIndexAndTypeEqualsAndStatusEquals(
+                param.getGhId(), 1, ArticleTypeEnum.QUNFA.getVal(), 1);
+        if (RankStrategy.SimilarityScoreZero(items, param, hisPublishFirstArticleList)) {
             return new RankResult(result);
         }
 
@@ -85,7 +83,6 @@ public class RankV9Strategy implements RankStrategy {
         Collections.sort(items, (o1, o2) -> -Double.compare(o1.getScore(), o2.getScore()));
         // 2 相似去重
         List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
-//        contents = deduplication(contents);
 
         // 3 文章按照内容池分组
         Map<String, List<Content>> contentMap = new HashMap<>();
@@ -101,12 +98,7 @@ public class RankV9Strategy implements RankStrategy {
         if (CollectionUtils.isNotEmpty(pool1)) {
             result.add(pool1.get(0));
         } else {
-            FeishuMessageSender.sendWebHookMessage("07026a9f-43f5-448b-ba40-a8d71bd6e634",
-                    "内容池1为空\n"
-                            + "ghId: " + param.getGhId() + "\n"
-                            + "账号名称: " + param.getAccountName() + "\n"
-                            + "内容池: " + contentPools[0] + "\n"
-                            + "策略: " + this.getClass().getSimpleName());
+            RankStrategy.sendFeishuFirstPoolEmpty(param, contentPools[0]);
             return new RankResult(result);
         }
         // 次

+ 6 - 5
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recall/RecallService.java

@@ -2,6 +2,7 @@ package com.tzld.longarticle.recommend.server.service.recall;
 
 import com.google.common.collect.Lists;
 import com.tzld.longarticle.recommend.server.common.ThreadPoolFactory;
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.common.enums.FeishuRobotIdEnum;
 import com.tzld.longarticle.recommend.server.mapper.crawler.CrawlerBaseMapper;
 import com.tzld.longarticle.recommend.server.model.dto.Content;
@@ -142,7 +143,7 @@ public class RecallService implements ApplicationContextAware {
     private List<Content> getAllContent(RecallParam param) {
         List<Content> content = aigcRemoteService.getAllContent(param);
         if (CollectionUtils.isEmpty(content)) {
-            FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.recommend.getRobotId(),
+            FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.RECOMMEND.getRobotId(),
                     "内容召回失败\n"
                     + "ghId: " + param.getGhId() + "\n"
                     + "账号名称: " + param.getAccountName());
@@ -224,7 +225,7 @@ public class RecallService implements ApplicationContextAware {
         List<Article> hisArticleList = new ArrayList<>();
         List<List<String>> titleMd5Partition = Lists.partition(new ArrayList<>(titleMd5List), 1000);
         for (List<String> titleMd5s : titleMd5Partition) {
-            hisArticleList.addAll(articleRepository.getByTitleMd5InAndTypeEqualsAndStatusEquals(titleMd5s, "9", 1));
+            hisArticleList.addAll(articleRepository.getByTitleMd5InAndTypeEqualsAndStatusEquals(titleMd5s, ArticleTypeEnum.QUNFA.getVal(), 1));
         }
         Map<String, Map<Integer, List<Article>>> map = hisArticleList.stream()
                 .collect(Collectors.groupingBy(Article::getTitle, Collectors.groupingBy(Article::getItemIndex)));
@@ -239,7 +240,7 @@ public class RecallService implements ApplicationContextAware {
         // 获取历史已发布文章所属头条内容
         Set<String> ghIds = hisArticleList.stream().map(Article::getGhId).collect(Collectors.toSet());
         Set<String> appMsgIds = hisArticleList.stream().map(Article::getAppMsgId).collect(Collectors.toSet());
-        List<Article> firstIndexHisArticleList = articleRepository.getByGhIdInAndAppMsgIdInAndItemIndexAndTypeEqualsAndStatusEquals(ghIds, appMsgIds, 1, "9", 1);
+        List<Article> firstIndexHisArticleList = articleRepository.getByGhIdInAndAppMsgIdInAndItemIndexAndTypeEqualsAndStatusEquals(ghIds, appMsgIds, 1, ArticleTypeEnum.QUNFA.getVal(), 1);
         Map<String, Map<String, Article>> firstIndexHisArticleMap = firstIndexHisArticleList.stream()
                 .collect(Collectors.groupingBy(Article::getGhId, Collectors.toMap(Article::getAppMsgId, o -> o)));
         // 获取发布账号 位置历史均值
@@ -300,7 +301,7 @@ public class RecallService implements ApplicationContextAware {
                         avgViewCount = Optional.ofNullable(indexMap.get(hisArticle.getItemIndex().toString()).getReadAvg())
                                 .orElse(0.0).intValue();
                     } else {
-                        FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.recommend.getRobotId(),
+                        FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.RECOMMEND.getRobotId(),
                                 "历史表现阅读均值获取失败\n"
                                 + "ghId: " + hisArticle.getGhId() + "\n"
                                 + "账号名称: " + hisArticle.getAccountName() + "\n"
@@ -359,7 +360,7 @@ public class RecallService implements ApplicationContextAware {
             if (CollectionUtils.isEmpty(article.getArticleDetailInfoList())) {
                 // 仅判断7.12以后发布文章
                 if (article.getUpdateTime() > 1720713600 && contentHisFeishuEnable) {
-                    FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.recommend.getRobotId(),
+                    FeishuMessageSender.sendWebHookMessage(FeishuRobotIdEnum.RECOMMEND.getRobotId(),
                             "历史表现裂变特征获取失败\n"
                             + "ghId: " + article.getGhId() + "\n"
                             + "账号名称: " + article.getAccountName() + "\n"

+ 3 - 1
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/score/ScoreService.java

@@ -110,7 +110,9 @@ public class ScoreService implements ApplicationContextAware {
                 || StringUtils.equals(param.getStrategy(), RankStrategyEnum.ArticleRankV9.getStrategy())
                 || StringUtils.equals(param.getStrategy(), RankStrategyEnum.ArticleRankV10.getStrategy())
                 || StringUtils.equals(param.getStrategy(), RankStrategyEnum.ArticleRankV11.getStrategy())
-                || StringUtils.equals(param.getStrategy(), RankStrategyEnum.ArticleRankV12.getStrategy())) {
+                || StringUtils.equals(param.getStrategy(), RankStrategyEnum.ArticleRankV12.getStrategy())
+                || StringUtils.equals(param.getStrategy(), RankStrategyEnum.ArticleRankV13.getStrategy())
+                || StringUtils.equals(param.getStrategy(), RankStrategyEnum.ArticleRankV14.getStrategy())) {
             strategies.add(strategyMap.get(CategoryStrategy.class.getSimpleName()));
             strategies.add(strategyMap.get(AccountPreDistributeStrategy.class.getSimpleName()));
             strategies.add(strategyMap.get(FlowCtlDecreaseStrategy.class.getSimpleName()));

+ 4 - 3
long-article-recommend-service/src/test/java/com/tzld/longarticle/recommend/server/RecommendTest.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
+import com.tzld.longarticle.recommend.server.common.enums.ArticleTypeEnum;
 import com.tzld.longarticle.recommend.server.mapper.crawler.CrawlerBaseMapper;
 import com.tzld.longarticle.recommend.server.model.entity.crawler.AccountAvgInfo;
 import com.tzld.longarticle.recommend.server.model.entity.crawler.Article;
@@ -65,7 +66,7 @@ public class RecommendTest {
 //    @Test
 //    void exportData() {
 //        Set<String> ghIds = new HashSet<>(Arrays.asList("gh_adca24a8f429", "gh_e0eb490115f5", "gh_51e4ad40466d", "gh_95ed5ecf9363"));
-//        List<Article> articleList = articleRepository.getByGhIdInAndUpdateTimeGreaterThanAndTypeEquals(ghIds, 1722441600L, "9");
+//        List<Article> articleList = articleRepository.getByGhIdInAndUpdateTimeGreaterThanAndTypeEquals(ghIds, 1722441600L, ArticleTypeEnum.qunfa.getVal());
 //
 //        Map<String, Map<Integer, List<Article>>> map = articleList.stream()
 //                .collect(Collectors.groupingBy(Article::getTitle, Collectors.groupingBy(Article::getItemIndex)));
@@ -186,7 +187,7 @@ public class RecommendTest {
         List<String> morning = Lists.newArrayList("gh_084a485e859a", "gh_183d80deffb8", "gh_5ff48e9fb9ef", "gh_6d9f36e3a7be", "gh_9f8dc5b0c74e", "gh_e0eb490115f5", "gh_e24da99dc899");
         List<String> noon = Lists.newArrayList("gh_080bb43aa0dc", "gh_0c89e11f8bf3", "gh_192c9cf58b13", "gh_1b27dd1beeca", "gh_1d887d61088c", "gh_29074b51f2b7", "gh_3ed305b5817f", "gh_5ae65db96cb7", "gh_6b7c2a257263", "gh_6cfd1132df94", "gh_6d205db62f04", "gh_72bace6b3059", "gh_7e5818b2dd83", "gh_7f5075624a50", "gh_89ef4798d3ea", "gh_9877c8541764", "gh_9eef14ad6c16", "gh_a2901d34f75b", "gh_b15de7c99912", "gh_b676b7ad9b74", "gh_b6f2c5332c72", "gh_bfe5b705324a", "gh_bff0bcb0694a", "gh_c5cdf60d9ab4", "gh_c69776baf2cd", "gh_d49df5e974ca", "gh_d4dffc34ac39", "gh_dd4c857bbb36", "gh_ee78360d06f5", "gh_f25b5fb01977", "gh_f902cea89e48", "gh_ff487cb5dab3");
         String dateStr = "2024-09-12";
-        List<Article> articleList = articleRepository.getByUpdateTimeGreaterThanAndTypeEquals(1725120000L, "9");
+        List<Article> articleList = articleRepository.getByUpdateTimeGreaterThanAndTypeEquals(1725120000L, ArticleTypeEnum.QUNFA.getVal());
         articleList = articleList.stream().filter(o -> o.getItemIndex() == 1 && o.getUpdateTime() < 1726675200).collect(Collectors.toList());
         Map<String, List<Article>> map = articleList.stream().collect(Collectors.groupingBy(Article::getTitle));
         List<AccountAvgInfo> accountAvgInfoList = accountAvgInfoRepository.getAllByUpdateTime(dateStr);
@@ -267,7 +268,7 @@ public class RecommendTest {
         sortLogList = sortLogList.stream().filter(o -> o.getIndex() == 1).collect(Collectors.toList());
         sortLogList.sort(Comparator.comparing(PublishSortLog::getGhId).thenComparing(PublishSortLog::getDateStr));
         List<String> ghIds = sortLogList.stream().map(PublishSortLog::getGhId).distinct().collect(Collectors.toList());
-        List<Article> articleList = articleRepository.getByGhIdInAndUpdateTimeGreaterThanAndTypeEquals(ghIds, 1727452800L, "9");
+        List<Article> articleList = articleRepository.getByGhIdInAndUpdateTimeGreaterThanAndTypeEquals(ghIds, 1727452800L, ArticleTypeEnum.QUNFA.getVal());
         articleList = articleList.stream().filter(o -> o.getItemIndex() == 1).collect(Collectors.toList());
         Map<String, Map<String, Article>> articleMap = articleList.stream().collect(Collectors.groupingBy(Article::getGhId, Collectors.toMap(
                 o -> DateUtils.timestampToYMDStr(o.getUpdateTime(),"yyyyMMdd"), o -> o,