ソースを参照

增加小程序匹配接口

xueyiming 3 ヶ月 前
コミット
00b44a6ece
19 ファイル変更673 行追加0 行削除
  1. 26 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/common/enums/MinigramEnum.java
  2. 17 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/common/enums/longArticle/ConstantStatusEnum.java
  3. 16 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/bo/CardData.java
  4. 30 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/entity/longArticle/CrawlerProduceIdMap.java
  5. 4 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/entity/longArticle/LongArticlesMatchVideo.java
  6. 33 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/entity/longArticle/LongArticlesPublishedTraceId.java
  7. 12 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/param/ChooseMinigramParam.java
  8. 13 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/param/GetOffVideosParam.java
  9. 11 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/param/RecallVideosParam.java
  10. 25 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/param/SearchVideoParam.java
  11. 15 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/vo/ChooseMinigramResponse.java
  12. 15 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/vo/SearchVideoResponse.java
  13. 9 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/longArticle/CrawlerProduceIdMapRepository.java
  14. 10 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/longArticle/LongArticlesPublishedTraceIdRepository.java
  15. 10 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/video/CardGeneratorService.java
  16. 21 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/video/MatchVideoService.java
  17. 132 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/video/impl/CardGeneratorServiceImpl.java
  18. 228 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/video/impl/MatchVideoServiceImpl.java
  19. 46 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/web/video/MatchVideoController.java

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

@@ -0,0 +1,26 @@
+package com.tzld.longarticle.recommend.server.common.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum MinigramEnum {
+    PQSP4("https://rescdn.yishihui.com/0temp/pqsp.png", "wxbdd2a2e93d9a6e25", "票圈视频"),
+    VLOG0("https://rescdn.yishihui.com/0temp/logo.png", "wx89e7eb06478361d7", "票圈 l 3亿人喜欢的视频平台"),
+    XYMHFQDD_27("https://rescdn.yishihui.com/0temp/xymhfqdd.png","wx7187c217efef24a7","幸运美好福气多多")
+    ;
+
+    MinigramEnum(String avatar, String id, String name) {
+        this.avatar = avatar;
+        this.id = id;
+        this.name = name;
+
+    }
+
+    private final String avatar;
+
+    private final String id;
+
+    private final String name;
+
+
+}

+ 17 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/common/enums/longArticle/ConstantStatusEnum.java

@@ -0,0 +1,17 @@
+package com.tzld.longarticle.recommend.server.common.enums.longArticle;
+
+
+import lombok.Getter;
+
+@Getter
+public enum ConstantStatusEnum {
+    TASK_PUBLISHED_CODE(4, "发布完成");
+
+    private final Integer code;
+    private final String desc;
+
+    ConstantStatusEnum(Integer code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+}

+ 16 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/bo/CardData.java

@@ -0,0 +1,16 @@
+package com.tzld.longarticle.recommend.server.model.bo;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class CardData {
+
+    private List<JSONObject> cardList;
+
+    private JSONArray newItemList;
+}

+ 30 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/entity/longArticle/CrawlerProduceIdMap.java

@@ -0,0 +1,30 @@
+package com.tzld.longarticle.recommend.server.model.entity.longArticle;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Table(name = "crawler_produce_id_map")
+public class CrawlerProduceIdMap {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Integer id;
+
+    @Column(name = "channel_content_id")
+    private String channelContentId;
+
+    @Column(name = "content_id")
+    private String contentId;
+
+    @Column(name = "create_time")
+    private Long createTime;
+
+}

+ 4 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/entity/longArticle/LongArticlesMatchVideo.java

@@ -101,4 +101,8 @@ public class LongArticlesMatchVideo {
      */
     @Column(name = "process_times")
     private Integer processTimes = 0;
+
+
+    @Column(name = "publish_flag")
+    private Integer publishFlag = 1;
 }

+ 33 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/entity/longArticle/LongArticlesPublishedTraceId.java

@@ -0,0 +1,33 @@
+package com.tzld.longarticle.recommend.server.model.entity.longArticle;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Table(name = "long_articles_published_trace_id")
+public class LongArticlesPublishedTraceId {
+
+    @Id
+    @Column(name = "trace_id")
+    private String traceId;
+
+    @Column(name = "gh_id")
+    private String ghId;
+
+    @Column(name = "push_type")
+    private String pushType;
+
+    @Column(name = "create_timestamp")
+    private Long createTimestamp;
+
+
+}

+ 12 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/param/ChooseMinigramParam.java

@@ -0,0 +1,12 @@
+package com.tzld.longarticle.recommend.server.model.param;
+
+import lombok.Data;
+
+@Data
+public class ChooseMinigramParam {
+    private String businessType;
+    private String miniCode;
+    private String traceId;
+    private String ghId;
+
+}

+ 13 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/param/GetOffVideosParam.java

@@ -0,0 +1,13 @@
+package com.tzld.longarticle.recommend.server.model.param;
+
+import lombok.Data;
+
+@Data
+public class GetOffVideosParam {
+
+    private String traceId;
+
+    private String strategy;
+
+    private String pushType;
+}

+ 11 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/param/RecallVideosParam.java

@@ -0,0 +1,11 @@
+package com.tzld.longarticle.recommend.server.model.param;
+
+import lombok.Data;
+
+@Data
+public class RecallVideosParam {
+
+    private Integer miniprogramUseType;
+
+    private String traceId;
+}

+ 25 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/param/SearchVideoParam.java

@@ -0,0 +1,25 @@
+package com.tzld.longarticle.recommend.server.model.param;
+
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString
+public class SearchVideoParam {
+
+    private String ghId;
+
+    private String title;
+
+    private String content;
+
+    private String accountName;
+
+    private String articleId;
+
+    private String flowPoolLevelTag;
+
+    private Integer publishFlag;
+
+    private String channelContentId;
+}

+ 15 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/vo/ChooseMinigramResponse.java

@@ -0,0 +1,15 @@
+package com.tzld.longarticle.recommend.server.model.vo;
+
+import lombok.Data;
+
+@Data
+public class ChooseMinigramResponse {
+
+    private String programAvatar;
+
+    private String programId;
+
+    private String programName;
+
+    private String trace_id;
+}

+ 15 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/vo/SearchVideoResponse.java

@@ -0,0 +1,15 @@
+package com.tzld.longarticle.recommend.server.model.vo;
+
+import lombok.Data;
+
+@Data
+public class SearchVideoResponse {
+
+    private String status;
+
+    private Integer code;
+
+    private String traceId;
+
+    private String info;
+}

+ 9 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/longArticle/CrawlerProduceIdMapRepository.java

@@ -0,0 +1,9 @@
+package com.tzld.longarticle.recommend.server.repository.longArticle;
+
+import com.tzld.longarticle.recommend.server.model.entity.longArticle.CrawlerProduceIdMap;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CrawlerProduceIdMapRepository extends JpaRepository<CrawlerProduceIdMap, Integer> {
+}

+ 10 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/longArticle/LongArticlesPublishedTraceIdRepository.java

@@ -0,0 +1,10 @@
+package com.tzld.longarticle.recommend.server.repository.longArticle;
+
+
+import com.tzld.longarticle.recommend.server.model.entity.longArticle.LongArticlesPublishedTraceId;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface LongArticlesPublishedTraceIdRepository extends JpaRepository<LongArticlesPublishedTraceId, String> {
+}

+ 10 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/video/CardGeneratorService.java

@@ -0,0 +1,10 @@
+package com.tzld.longarticle.recommend.server.service.video;
+
+import com.tzld.longarticle.recommend.server.model.bo.CardData;
+
+import java.io.UnsupportedEncodingException;
+
+public interface CardGeneratorService {
+
+    CardData generateCards(String ghId, String response, Integer miniprogramUseType) throws UnsupportedEncodingException;
+}

+ 21 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/video/MatchVideoService.java

@@ -0,0 +1,21 @@
+package com.tzld.longarticle.recommend.server.service.video;
+
+import com.tzld.longarticle.recommend.server.common.response.CommonResponse;
+import com.tzld.longarticle.recommend.server.model.param.ChooseMinigramParam;
+import com.tzld.longarticle.recommend.server.model.param.GetOffVideosParam;
+import com.tzld.longarticle.recommend.server.model.param.RecallVideosParam;
+import com.tzld.longarticle.recommend.server.model.param.SearchVideoParam;
+import com.tzld.longarticle.recommend.server.model.vo.ChooseMinigramResponse;
+import com.tzld.longarticle.recommend.server.model.vo.SearchVideoResponse;
+
+import java.io.UnsupportedEncodingException;
+
+public interface MatchVideoService {
+    CommonResponse<SearchVideoResponse> searchVideo(SearchVideoParam searchVideoParam);
+
+    CommonResponse<ChooseMinigramResponse> chooseMinigram(ChooseMinigramParam chooseMinigramParam);
+
+    String getOffVideos(GetOffVideosParam getOffVideosParam);
+
+    String recallVideos(RecallVideosParam recallVideosParam) throws UnsupportedEncodingException;
+}

+ 132 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/video/impl/CardGeneratorServiceImpl.java

@@ -0,0 +1,132 @@
+package com.tzld.longarticle.recommend.server.service.video.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
+import com.tzld.longarticle.recommend.server.model.bo.CardData;
+import com.tzld.longarticle.recommend.server.service.video.CardGeneratorService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+@Slf4j
+@Service
+public class CardGeneratorServiceImpl implements CardGeneratorService {
+
+    @ApolloJsonValue("${miniMap:{}}")
+    private JSONObject miniProgramMap;
+
+    public CardData generateCards(String ghId, String response, Integer miniprogramUseType) throws UnsupportedEncodingException {
+        JSONArray jsonArray = JSONArray.parseArray(response);
+        CardData cardData = new CardData();
+        List<JSONObject> cardList = new ArrayList<>();
+        JSONArray newItemList = new JSONArray();
+        for (int i = 0; i < jsonArray.size(); i++) {
+            JSONObject item = jsonArray.getJSONObject(i);
+            JSONObject card = generateSingleCard(i, ghId, 25, item, miniprogramUseType);
+            cardList.add(card);
+            newItemList.add(item);
+        }
+        cardData.setCardList(cardList);
+        cardData.setNewItemList(newItemList);
+        return cardData;
+
+    }
+
+    public JSONObject generateSingleCard(Integer index, String ghId, Integer miniId, JSONObject item,
+                                         Integer miniprogramUseType) throws UnsupportedEncodingException {
+        String strMiniId = String.valueOf(miniId);
+        JSONObject miniInfo = miniProgramMap.getJSONObject(strMiniId);
+        String avatar = miniInfo.getString("avatar");
+        String appId = miniInfo.getString("id");
+        String appName = miniInfo.getString("name");
+        String videoId = item.getString("videoId");
+        String uid = item.getString("uid");
+        JSONObject jsonObject = createGzhPath(videoId, uid, ghId, miniprogramUseType);
+        String rootShareId = jsonObject.getString("rootShareId");
+        String rootSourceId = jsonObject.getString("rootSourceId");
+        String productionPath = jsonObject.getString("productionPath");
+
+        JSONObject result = new JSONObject();
+        result.put("productionCover", item.getString("videoCover"));
+        result.put("productionName", item.getString("kimiTitle"));
+        result.put("programAvatar", avatar);
+        result.put("programId", appId);
+        result.put("programName", appName);
+        result.put("source", item.getString("source"));
+        result.put("rootShareId", rootShareId);
+        result.put("rootSourceId", rootSourceId);
+        result.put("productionPath", productionPath);
+        result.put("videoUrl", item.getString("videoPath"));
+        result.put("mini_id", miniId);
+        if (index == 1) {
+            result.put("paragraphPosition", 0.01);
+        } else {
+            result.put("paragraphPosition", (index - 1) * 0.25);
+        }
+        item.put("rootSourceId", rootSourceId);
+        return result;
+    }
+
+    public JSONObject createGzhPath(String videoId, String sharedUid, String ghId, Integer miniProgramType) throws UnsupportedEncodingException {
+        String rootShareId = UUID.randomUUID().toString();
+        String rootSourceId;
+        switch (miniProgramType) {
+            case 1:
+                rootSourceId = "longArticles_" + generateSourceId();
+                break;
+            case 2:
+                rootSourceId = "touliu_tencentGzhArticle_" + ghId + "_" + generateSourceId();
+                break;
+            case 3:
+                rootSourceId = "WeCom_" + generateSourceId();
+                break;
+            case 4:
+                rootSourceId = "DaiTou_" + ghId + "_" + generateSourceId();
+                break;
+            case 5:
+                rootSourceId = "gzhhzdx_" + generateSourceId();
+                break;
+            default:
+                rootSourceId = "Error mini_program_type " + miniProgramType;
+        }
+
+        String url = String.format("pages/user-videos?id=%s&su=%s&fromGzh=1&rootShareId=%s&shareId=%s&rootSourceId=%s",
+                videoId, sharedUid, rootShareId, rootShareId, rootSourceId);
+        String productionPath = String.format("pages/category?jumpPage=%s", URLEncoder.encode(url, StandardCharsets.UTF_8.toString()));
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("rootShareId", rootShareId);
+        jsonObject.put("rootSourceId", rootSourceId);
+        jsonObject.put("productionPath", productionPath);
+        return jsonObject;
+    }
+
+    private String generateSourceId() {
+        long timestamp = System.currentTimeMillis();
+        int randomNum = new Random().nextInt(9000) + 1000;
+        String hashInput = timestamp + "-" + randomNum;
+        return md5(hashInput);
+    }
+
+    private String md5(String input) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] messageDigest = md.digest(input.getBytes(StandardCharsets.UTF_8));
+            StringBuilder sb = new StringBuilder();
+            for (byte b : messageDigest) {
+                sb.append(String.format("%02x", b));
+            }
+            return sb.toString();
+        } catch (NoSuchAlgorithmException e) {
+            log.error("CardServiceImpl md5 error", e);
+        }
+        return null;
+    }
+
+}

+ 228 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/video/impl/MatchVideoServiceImpl.java

@@ -0,0 +1,228 @@
+package com.tzld.longarticle.recommend.server.service.video.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
+import com.tzld.longarticle.recommend.server.common.enums.MinigramEnum;
+import com.tzld.longarticle.recommend.server.common.enums.longArticle.ConstantStatusEnum;
+import com.tzld.longarticle.recommend.server.common.response.CommonResponse;
+import com.tzld.longarticle.recommend.server.model.bo.CardData;
+import com.tzld.longarticle.recommend.server.model.entity.longArticle.*;
+import com.tzld.longarticle.recommend.server.model.param.ChooseMinigramParam;
+import com.tzld.longarticle.recommend.server.model.param.GetOffVideosParam;
+import com.tzld.longarticle.recommend.server.model.param.RecallVideosParam;
+import com.tzld.longarticle.recommend.server.model.param.SearchVideoParam;
+import com.tzld.longarticle.recommend.server.model.vo.ChooseMinigramResponse;
+import com.tzld.longarticle.recommend.server.model.vo.SearchVideoResponse;
+import com.tzld.longarticle.recommend.server.repository.longArticle.*;
+import com.tzld.longarticle.recommend.server.service.video.CardGeneratorService;
+import com.tzld.longarticle.recommend.server.service.video.MatchVideoService;
+import com.tzld.longarticle.recommend.server.util.http.HttpClientUtils;
+import com.tzld.longarticle.recommend.server.util.http.HttpResponseContent;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.UnsupportedEncodingException;
+import java.util.*;
+
+@Slf4j
+@Service
+public class MatchVideoServiceImpl implements MatchVideoService {
+
+    @ApolloJsonValue("${ghIdInPqVideo:[\"gh_2ad5072e7a76\",\"gh_57c9e8babea7\",\"gh_a61d7ae2e594\",\"gh_2fe4c2f7d571\",\"gh_d8c215687f02\",\"gh_749271f1ccd5\",\"gh_617684416aec\",\"gh_a221d1a952aa\",\"gh_ec42d1027ba5\",\"gh_e3a8e14013cd\",\"gh_9ee8fc75c07f\",\"gh_0e4fd9e88386\",\"gh_2e8ae0384787\",\"gh_7c66e0dbd2cf\",\"gh_755225d8ede5\",\"gh_92da3c574f82\",\"gh_31e523f45168\",\"gh_df59c5e42954\",\"gh_6d3aa9d13402\",\"gh_810a439f320a\",\"gh_2e0c4609839f\",\"gh_f1122b34f1f3\",\"gh_da44c409ec0f\",\"gh_2e615fa75ffb\",\"gh_d32fe439b098\",\"gh_d7fa1998b4e1\",\"gh_abc6794e6996\",\"gh_c43c01198e6a\",\"gh_a447c30961b7\",\"gh_dc2da0611278\",\"gh_156c66ac3e37\",\"gh_ddf6ec0104d0\",\"gh_39218d3a3ec1\",\"gh_98ec0ffe69b3\",\"gh_243829b5ff02\",\"gh_03d32e83122f\",\"gh_a1c2771f8020\",\"gh_4f6bfd731ac8\",\"gh_9360765baf6a\",\"gh_1686250f15b6\",\"gh_6e977e8cd40d\",\"gh_dfa7599c181f\"]}")
+    private List<String> ghIdInPqVideo;
+
+    private static final Set<String> EXPERIMENT_27_GH_ID_SET = new HashSet<String>() {{
+        add("gh_970460d9ccec");
+        add("gh_bfea052b5baa");
+        add("gh_5d18ac6e3118");
+        add("gh_660afe87b6fd");
+        add("gh_7c66e0dbd2cf");
+        add("gh_57c9e8babea7");
+        add("gh_749271f1ccd5");
+        add("gh_2e615fa75ffb");
+        add("gh_486568379bf8");
+        add("gh_c9b664360ce6");
+        add("gh_98ec0ffe69b3");
+        add("gh_03d45c260115");
+        add("gh_6d3aa9d13402");
+        add("gh_1686250f15b6");
+    }};
+
+    @Autowired
+    private LongArticlesMatchVideoRepository longArticlesMatchVideoRepository;
+
+    @Autowired
+    private GetOffVideoArticleRepository getOffVideoArticleRepository;
+
+
+    @Autowired
+    private LongArticlesTextRepository longArticlesTextRepository;
+
+    @Autowired
+    private CrawlerProduceIdMapRepository crawlerProduceIdMapRepository;
+
+    @Autowired
+    private LongArticlesPublishedTraceIdRepository longArticlesPublishedTraceIdRepository;
+
+    @Autowired
+    private CardGeneratorService cardGeneratorService;
+
+    @Transactional
+    @Override
+    public CommonResponse<SearchVideoResponse> searchVideo(SearchVideoParam searchVideoParam) {
+        if (StringUtils.isEmpty(searchVideoParam.getContent())
+                || StringUtils.isEmpty(searchVideoParam.getArticleId())
+                || StringUtils.isEmpty(searchVideoParam.getGhId())
+                || StringUtils.isEmpty(searchVideoParam.getAccountName())
+                || StringUtils.isEmpty(searchVideoParam.getTitle())) {
+            SearchVideoResponse searchVideoResponse = new SearchVideoResponse();
+            searchVideoResponse.setCode(1);
+            searchVideoResponse.setStatus("fail");
+            searchVideoResponse.setInfo("params check error");
+            return CommonResponse.success(searchVideoResponse);
+        }
+        String traceId = String.format("search-%s-%s", UUID.randomUUID(), System.currentTimeMillis() / 1000);
+        LongArticlesMatchVideo longArticlesMatchVideo = new LongArticlesMatchVideo();
+        longArticlesMatchVideo.setTraceId(traceId);
+        longArticlesMatchVideo.setContentId(searchVideoParam.getArticleId());
+        longArticlesMatchVideo.setFlowPoolLevel(searchVideoParam.getFlowPoolLevelTag());
+        longArticlesMatchVideo.setGhId(searchVideoParam.getGhId());
+        longArticlesMatchVideo.setAccountName(searchVideoParam.getAccountName());
+        longArticlesMatchVideo.setRequestTimestamp(System.currentTimeMillis() / 1000);
+        if (searchVideoParam.getPublishFlag() == null) {
+            longArticlesMatchVideo.setPublishFlag(1);
+        } else {
+            longArticlesMatchVideo.setPublishFlag(searchVideoParam.getPublishFlag());
+        }
+        longArticlesMatchVideoRepository.save(longArticlesMatchVideo);
+
+
+        LongArticlesText longArticlesText = new LongArticlesText();
+        longArticlesText.setContentId(searchVideoParam.getArticleId());
+        longArticlesText.setArticleTitle(searchVideoParam.getTitle());
+        longArticlesText.setArticleTitle(searchVideoParam.getContent());
+        longArticlesTextRepository.save(longArticlesText);
+
+        if (StringUtils.isNotEmpty(searchVideoParam.getChannelContentId())) {
+            CrawlerProduceIdMap crawlerProduceIdMap = new CrawlerProduceIdMap();
+            crawlerProduceIdMap.setChannelContentId(searchVideoParam.getChannelContentId());
+            crawlerProduceIdMap.setContentId(searchVideoParam.getArticleId());
+            crawlerProduceIdMapRepository.save(crawlerProduceIdMap);
+        }
+        SearchVideoResponse searchVideoResponse = new SearchVideoResponse();
+        searchVideoResponse.setCode(0);
+        searchVideoResponse.setStatus("success input to article queue");
+        searchVideoResponse.setTraceId(traceId);
+        return CommonResponse.success(searchVideoResponse);
+    }
+
+    @Override
+    public CommonResponse<ChooseMinigramResponse> chooseMinigram(ChooseMinigramParam chooseMinigramParam) {
+        String ghId = chooseMinigramParam.getGhId();
+        ChooseMinigramResponse chooseMinigramResponse = new ChooseMinigramResponse();
+        if (ghId != null && EXPERIMENT_27_GH_ID_SET.contains(ghId)) {
+            chooseMinigramResponse.setProgramAvatar(MinigramEnum.XYMHFQDD_27.getAvatar());
+            chooseMinigramResponse.setProgramId(MinigramEnum.XYMHFQDD_27.getId());
+            chooseMinigramResponse.setProgramName(MinigramEnum.XYMHFQDD_27.getName());
+            chooseMinigramResponse.setTrace_id(chooseMinigramParam.getTraceId());
+        } else if (ghId != null && ghIdInPqVideo.contains(ghId)) {
+            chooseMinigramResponse.setProgramAvatar(MinigramEnum.PQSP4.getAvatar());
+            chooseMinigramResponse.setProgramId(MinigramEnum.PQSP4.getId());
+            chooseMinigramResponse.setProgramName(MinigramEnum.PQSP4.getName());
+            chooseMinigramResponse.setTrace_id(chooseMinigramParam.getTraceId());
+        } else {
+            chooseMinigramResponse.setProgramAvatar(MinigramEnum.VLOG0.getAvatar());
+            chooseMinigramResponse.setProgramId(MinigramEnum.VLOG0.getId());
+            chooseMinigramResponse.setProgramName(MinigramEnum.VLOG0.getName());
+            chooseMinigramResponse.setTrace_id(chooseMinigramParam.getTraceId());
+        }
+        return CommonResponse.success(chooseMinigramResponse);
+    }
+
+    @Override
+    public String getOffVideos(GetOffVideosParam getOffVideosParam) {
+        JSONObject res = new JSONObject();
+        if (StringUtils.isEmpty(getOffVideosParam.getPushType()) || StringUtils.isEmpty(getOffVideosParam.getTraceId())) {
+            res.put("error", "params error");
+            return res.toJSONString();
+        }
+        if (!getOffVideosParam.getTraceId().startsWith("search")) {
+            res.put("msg", "do not process trace id");
+            return res.toJSONString();
+        }
+        String traceId = getOffVideosParam.getTraceId();
+        LongArticlesMatchVideo matchVideo = longArticlesMatchVideoRepository.getByTraceId(traceId);
+        if (matchVideo == null) {
+            String url = "http://192.168.205.85:8111/get_off_videos";
+            JSONObject param = new JSONObject();
+            param.put("traceId", getOffVideosParam.getTraceId());
+            HttpResponseContent httpResponseContent = HttpClientUtils.postData(url, param.toJSONString(),
+                    HttpClientUtils.contentTypeJson);
+            return httpResponseContent.getBodyContent();
+        }
+        String ghId = matchVideo.getGhId();
+        String response = matchVideo.getResponse();
+        List<Long> videoIds = JSONArray.parseArray(response, Long.class);
+        if (CollectionUtils.isNotEmpty(videoIds)) {
+            List<GetOffVideoArticle> addList = new ArrayList<>();
+            for (Long videoId : videoIds) {
+                GetOffVideoArticle getOffVideoArticle = new GetOffVideoArticle();
+                getOffVideoArticle.setTraceId(getOffVideosParam.getTraceId());
+                getOffVideoArticle.setVideoId(videoId);
+                getOffVideoArticle.setVideoStatus(1);
+                getOffVideoArticle.setPublishTime(System.currentTimeMillis() / 1000);
+                addList.add(getOffVideoArticle);
+            }
+            getOffVideoArticleRepository.saveAll(addList);
+        }
+        LongArticlesPublishedTraceId longArticlesPublishedTraceId = new LongArticlesPublishedTraceId();
+        longArticlesPublishedTraceId.setGhId(ghId);
+        longArticlesPublishedTraceId.setTraceId(traceId);
+        longArticlesPublishedTraceId.setPushType(getOffVideosParam.getPushType());
+        longArticlesPublishedTraceId.setCreateTimestamp(System.currentTimeMillis() / 1000);
+        longArticlesPublishedTraceIdRepository.save(longArticlesPublishedTraceId);
+
+        res.put("status", "success");
+        res.put("traceId", traceId);
+        return res.toJSONString();
+    }
+
+    @Override
+    public String recallVideos(RecallVideosParam recallVideosParam) throws UnsupportedEncodingException {
+        JSONObject res = new JSONObject();
+        String traceId = recallVideosParam.getTraceId();
+        Integer miniprogramUseType = recallVideosParam.getMiniprogramUseType();
+        LongArticlesMatchVideo matchVideo = longArticlesMatchVideoRepository.getByTraceId(traceId);
+        if (matchVideo == null) {
+            String url = "http://192.168.205.85:8111/recall_videos";
+            JSONObject param = new JSONObject();
+            param.put("traceId", traceId);
+            param.put("miniprogramUseType", miniprogramUseType);
+            HttpResponseContent httpResponseContent = HttpClientUtils.postData(url, param.toJSONString(),
+                    HttpClientUtils.contentTypeJson);
+            return httpResponseContent.getBodyContent();
+        }
+        LongArticlesMatchVideo longArticlesMatchVideo = longArticlesMatchVideoRepository.getByTraceId(traceId);
+        if (Objects.equals(longArticlesMatchVideo.getContentStatus(), ConstantStatusEnum.TASK_PUBLISHED_CODE.getCode())) {
+            CardData cardData = cardGeneratorService.generateCards(longArticlesMatchVideo.getGhId(),
+                    longArticlesMatchVideo.getResponse(), miniprogramUseType);
+            List<JSONObject> cardList = cardData.getCardList();
+            res.put("traceId", traceId);
+            res.put("miniprogramList", cardList);
+            longArticlesMatchVideo.setResponse(cardData.getNewItemList().toJSONString());
+            longArticlesMatchVideo.setSuccessStatus(1);
+            longArticlesMatchVideoRepository.save(longArticlesMatchVideo);
+            return res.toJSONString();
+        }
+
+        res.put("traceId", traceId);
+        res.put("code", longArticlesMatchVideo.getContentStatus());
+        return res.toJSONString();
+    }
+}

+ 46 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/web/video/MatchVideoController.java

@@ -0,0 +1,46 @@
+package com.tzld.longarticle.recommend.server.web.video;
+
+import com.tzld.longarticle.recommend.server.common.response.CommonResponse;
+import com.tzld.longarticle.recommend.server.model.param.ChooseMinigramParam;
+import com.tzld.longarticle.recommend.server.model.param.GetOffVideosParam;
+import com.tzld.longarticle.recommend.server.model.param.RecallVideosParam;
+import com.tzld.longarticle.recommend.server.model.param.SearchVideoParam;
+import com.tzld.longarticle.recommend.server.model.vo.ChooseMinigramResponse;
+import com.tzld.longarticle.recommend.server.model.vo.SearchVideoResponse;
+import com.tzld.longarticle.recommend.server.service.video.MatchVideoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/matchVideo")
+public class MatchVideoController {
+
+    @Autowired
+    private MatchVideoService matchVideoService;
+
+    @PostMapping("/searchVideos")
+    public CommonResponse<SearchVideoResponse> searchVideo(@RequestBody SearchVideoParam searchVideoParam) {
+        return matchVideoService.searchVideo(searchVideoParam);
+    }
+
+    @PostMapping("/chooseMinigram")
+    public CommonResponse<ChooseMinigramResponse> chooseMinigram(@RequestBody ChooseMinigramParam chooseMinigramParam) {
+        return matchVideoService.chooseMinigram(chooseMinigramParam);
+    }
+
+    @PostMapping("/getOffVideos")
+    public String getOffVideos(@RequestBody GetOffVideosParam getOffVideosParam) {
+        return matchVideoService.getOffVideos(getOffVideosParam);
+    }
+
+    @PostMapping("/recallideos")
+    public String recallVideos(@RequestBody RecallVideosParam recallVideosParam) {
+        return matchVideoService.recallVideos(recallVideosParam);
+    }
+
+
+
+}