Quellcode durchsuchen

Merge branch 'master' into test

wangyunpeng vor 1 Woche
Ursprung
Commit
5ae407e873
53 geänderte Dateien mit 3455 neuen und 373 gelöschten Zeilen
  1. 6 0
      api-module/src/main/java/com/tzld/piaoquan/api/controller/AccountDetailController.java
  2. 33 0
      api-module/src/main/java/com/tzld/piaoquan/api/controller/VideoMultiController.java
  3. 3 0
      api-module/src/main/java/com/tzld/piaoquan/api/controller/wecom/ThirdPartyController.java
  4. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/controller/wecom/WeComController.java
  5. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/controller/wecom/WeComUserController.java
  6. 3 3
      api-module/src/main/java/com/tzld/piaoquan/api/dao/generator/MybatisGeneratorMain.java
  7. 5 0
      api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/GhDetailMapperExt.java
  8. 30 0
      api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/GzhAutoreplyBehaviorUvTotalMapper.java
  9. 30 0
      api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/VideoGrowthMultiCoverMapper.java
  10. 30 0
      api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/VideoGrowthMultiTitleMapper.java
  11. 13 0
      api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/ext/VideoMultiMapperExt.java
  12. 63 0
      api-module/src/main/java/com/tzld/piaoquan/api/job/GzhReplyVideoRefreshJob.java
  13. 8 8
      api-module/src/main/java/com/tzld/piaoquan/api/job/contentplatform/ContentPlatformDatastatJob.java
  14. 2 0
      api-module/src/main/java/com/tzld/piaoquan/api/job/contentplatform/ContentPlatformVideoJob.java
  15. 10 4
      api-module/src/main/java/com/tzld/piaoquan/api/job/wecom/thirdpart/WeComSendMsgJob.java
  16. 11 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/dto/PageUrlExtData.java
  17. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/model/param/AccessTokenParam.java
  18. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/model/param/CallbackParam.java
  19. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/model/param/PushMessageParam.java
  20. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/model/param/WeComPushMessageParam.java
  21. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/model/param/WeComUserNameAvatarParam.java
  22. 90 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/po/GzhAutoreplyBehaviorUvTotal.java
  23. 661 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/po/GzhAutoreplyBehaviorUvTotalExample.java
  24. 68 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/VideoGrowthMultiCover.java
  25. 531 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/VideoGrowthMultiCoverExample.java
  26. 68 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/VideoGrowthMultiTitle.java
  27. 531 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/VideoGrowthMultiTitleExample.java
  28. 2 2
      api-module/src/main/java/com/tzld/piaoquan/api/mq/MessageCallbackCustomer.java
  29. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/mq/MessageCallbackProducer.java
  30. 2 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/CgiReplyService.java
  31. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/service/GhAccessTokenService.java
  32. 16 77
      api-module/src/main/java/com/tzld/piaoquan/api/service/VideoMultiService.java
  33. 76 80
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformPlanServiceImpl.java
  34. 7 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/impl/CgiReplyServiceImpl.java
  35. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/service/impl/GhAccessTokenServiceImpl.java
  36. 47 22
      api-module/src/main/java/com/tzld/piaoquan/api/service/impl/GhDetailServiceImpl.java
  37. 183 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/impl/VideoMultiServiceImpl.java
  38. 74 66
      api-module/src/main/java/com/tzld/piaoquan/api/service/strategy/impl/BuckStrategyV1.java
  39. 77 75
      api-module/src/main/java/com/tzld/piaoquan/api/service/strategy/impl/ThirdPartyPushMessageStrategyV1.java
  40. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/ThirdPartyService.java
  41. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/WeComService.java
  42. 15 10
      api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/impl/ThirdPartyServiceImpl.java
  43. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/impl/WeComServiceImpl.java
  44. 6 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/thirdparty/impl/WeComThirdPartyServiceImpl.java
  45. 12 0
      api-module/src/main/resources/mapper/GhDetailMapperExt.xml
  46. 246 0
      api-module/src/main/resources/mapper/GzhAutoreplyBehaviorUvTotalMapper.xml
  47. 214 0
      api-module/src/main/resources/mapper/contentplatform/VideoGrowthMultiCoverMapper.xml
  48. 214 0
      api-module/src/main/resources/mapper/contentplatform/VideoGrowthMultiTitleMapper.xml
  49. 15 0
      api-module/src/main/resources/mapper/contentplatform/ext/VideoMultiMapperExt.xml
  50. 2 1
      api-module/src/main/resources/mybatis-api-generator-config.xml
  51. 9 8
      api-module/src/main/resources/mybatis-generator-config.xml
  52. 28 0
      api-module/src/test/java/com/tzld/piaoquan/api/ContentPlatformTest.java
  53. 1 4
      offline-module/src/main/java/com/tzld/piaoquan/offline/job/WeComUserDataJob.java

+ 6 - 0
api-module/src/main/java/com/tzld/piaoquan/api/controller/AccountDetailController.java

@@ -72,4 +72,10 @@ public class AccountDetailController {
         gzhReplyVideoRefreshJob.gzhReplyVideoRefreshJob(null);
         return CommonResponse.success();
     }
+
+    @GetMapping("/job/syncGzhAutoreplyBehaviorUvTotalJob")
+    public CommonResponse<Void> syncGzhAutoreplyBehaviorUvTotalJob() {
+        gzhReplyVideoRefreshJob.syncGzhAutoreplyBehaviorUvTotalJob(null);
+        return CommonResponse.success();
+    }
 }

+ 33 - 0
api-module/src/main/java/com/tzld/piaoquan/api/controller/VideoMultiController.java

@@ -0,0 +1,33 @@
+package com.tzld.piaoquan.api.controller;
+
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCover;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitle;
+import com.tzld.piaoquan.api.service.VideoMultiService;
+import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/video/multi")
+@Slf4j
+public class VideoMultiController {
+
+    @Autowired
+    private VideoMultiService videoMultiService;
+
+    @GetMapping("/title/list")
+    public CommonResponse<List<VideoGrowthMultiTitle>> getMultiTitleByVideoId(@RequestParam Long videoId) {
+        return CommonResponse.success(videoMultiService.getMultiTitleByVideoId(videoId));
+    }
+
+    @GetMapping("/cover/list")
+    public CommonResponse<List<VideoGrowthMultiCover>> getMultiCoverByVideoId(@RequestParam Long videoId) {
+        return CommonResponse.success(videoMultiService.getMultiCoverByVideoId(videoId));
+    }
+}

+ 3 - 0
api-module/src/main/java/com/tzld/piaoquan/api/controller/wecom/ThirdPartyController.java

@@ -1,6 +1,9 @@
 package com.tzld.piaoquan.api.controller.wecom;
 
 
+import com.tzld.piaoquan.api.model.param.AccessTokenParam;
+import com.tzld.piaoquan.api.model.param.CallbackParam;
+import com.tzld.piaoquan.api.model.param.PushMessageParam;
 import com.tzld.piaoquan.api.model.vo.*;
 import com.tzld.piaoquan.api.mq.MessageCallbackProducer;
 import com.tzld.piaoquan.api.service.GhAccessTokenService;

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/controller/wecom/WeComController.java

@@ -1,6 +1,6 @@
 package com.tzld.piaoquan.api.controller.wecom;
 
-import com.tzld.piaoquan.api.model.vo.WeComPushMessageParam;
+import com.tzld.piaoquan.api.model.param.WeComPushMessageParam;
 import com.tzld.piaoquan.api.model.vo.WeComPushMessageVo;
 import com.tzld.piaoquan.api.service.wecom.WeComService;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/controller/wecom/WeComUserController.java

@@ -1,6 +1,6 @@
 package com.tzld.piaoquan.api.controller.wecom;
 
-import com.tzld.piaoquan.api.model.vo.WeComUserNameAvatarParam;
+import com.tzld.piaoquan.api.model.param.WeComUserNameAvatarParam;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
 import com.tzld.piaoquan.growth.common.model.bo.GroupSendWeComUserParam;
 import com.tzld.piaoquan.growth.common.model.vo.UserTagParam;

+ 3 - 3
api-module/src/main/java/com/tzld/piaoquan/api/dao/generator/MybatisGeneratorMain.java

@@ -20,9 +20,9 @@ public class MybatisGeneratorMain {
             throws SQLException, IOException, InterruptedException, InvalidConfigurationException, XMLParserException {
         List<String> warnings = new ArrayList<>();
 
-        //File configFile = new File(MybatisGeneratorMain.class.getResource("/mybatis-generator-config.xml").getFile());
-        File configFile = new File(MybatisGeneratorMain.class.getResource("/mybatis-api-generator-config.xml").getFile());
-//        File configFile = new File(MybatisGeneratorMain.class.getResource("/mybatis-api-contentPlatform-generator-config.xml").getFile());
+        File configFile = new File(MybatisGeneratorMain.class.getResource("/mybatis-generator-config.xml").getFile());
+        //File configFile = new File(MybatisGeneratorMain.class.getResource("/mybatis-api-generator-config.xml").getFile());
+        //File configFile = new File(MybatisGeneratorMain.class.getResource("/mybatis-api-contentPlatform-generator-config.xml").getFile());
 //        File configFile = new File(MybatisGeneratorMain.class.getResource("/mybatis-api-wecomThirdpart-generator-config.xml").getFile());
         ConfigurationParser cp = new ConfigurationParser(warnings);
         Configuration config = cp.parseConfiguration(configFile);

+ 5 - 0
api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/GhDetailMapperExt.java

@@ -1,6 +1,7 @@
 package com.tzld.piaoquan.api.dao.mapper;
 
 import com.tzld.piaoquan.api.model.po.GhDetailExt;
+import com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotal;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
@@ -16,4 +17,8 @@ public interface GhDetailMapperExt {
     void batchInsertGhDetailExt(@Param("records") List<GhDetailExt> records);
 
     List<GhDetailExt> getGhDetailExtList(@Param("ghId") String ghId, @Param("type") Integer type);
+
+    void deleteGzhAutoreplyBehaviorUvTotal(@Param("dt") String dt);
+
+    void batchInsertGzhAutoreplyBehaviorUvTotal(@Param("records") List<GzhAutoreplyBehaviorUvTotal> saveList);
 }

+ 30 - 0
api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/GzhAutoreplyBehaviorUvTotalMapper.java

@@ -0,0 +1,30 @@
+package com.tzld.piaoquan.api.dao.mapper;
+
+import com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotal;
+import com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotalExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface GzhAutoreplyBehaviorUvTotalMapper {
+    long countByExample(GzhAutoreplyBehaviorUvTotalExample example);
+
+    int deleteByExample(GzhAutoreplyBehaviorUvTotalExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(GzhAutoreplyBehaviorUvTotal record);
+
+    int insertSelective(GzhAutoreplyBehaviorUvTotal record);
+
+    List<GzhAutoreplyBehaviorUvTotal> selectByExample(GzhAutoreplyBehaviorUvTotalExample example);
+
+    GzhAutoreplyBehaviorUvTotal selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") GzhAutoreplyBehaviorUvTotal record, @Param("example") GzhAutoreplyBehaviorUvTotalExample example);
+
+    int updateByExample(@Param("record") GzhAutoreplyBehaviorUvTotal record, @Param("example") GzhAutoreplyBehaviorUvTotalExample example);
+
+    int updateByPrimaryKeySelective(GzhAutoreplyBehaviorUvTotal record);
+
+    int updateByPrimaryKey(GzhAutoreplyBehaviorUvTotal record);
+}

+ 30 - 0
api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/VideoGrowthMultiCoverMapper.java

@@ -0,0 +1,30 @@
+package com.tzld.piaoquan.api.dao.mapper.contentplatform;
+
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCover;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCoverExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface VideoGrowthMultiCoverMapper {
+    long countByExample(VideoGrowthMultiCoverExample example);
+
+    int deleteByExample(VideoGrowthMultiCoverExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(VideoGrowthMultiCover record);
+
+    int insertSelective(VideoGrowthMultiCover record);
+
+    List<VideoGrowthMultiCover> selectByExample(VideoGrowthMultiCoverExample example);
+
+    VideoGrowthMultiCover selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") VideoGrowthMultiCover record, @Param("example") VideoGrowthMultiCoverExample example);
+
+    int updateByExample(@Param("record") VideoGrowthMultiCover record, @Param("example") VideoGrowthMultiCoverExample example);
+
+    int updateByPrimaryKeySelective(VideoGrowthMultiCover record);
+
+    int updateByPrimaryKey(VideoGrowthMultiCover record);
+}

+ 30 - 0
api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/VideoGrowthMultiTitleMapper.java

@@ -0,0 +1,30 @@
+package com.tzld.piaoquan.api.dao.mapper.contentplatform;
+
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitle;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitleExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface VideoGrowthMultiTitleMapper {
+    long countByExample(VideoGrowthMultiTitleExample example);
+
+    int deleteByExample(VideoGrowthMultiTitleExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(VideoGrowthMultiTitle record);
+
+    int insertSelective(VideoGrowthMultiTitle record);
+
+    List<VideoGrowthMultiTitle> selectByExample(VideoGrowthMultiTitleExample example);
+
+    VideoGrowthMultiTitle selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") VideoGrowthMultiTitle record, @Param("example") VideoGrowthMultiTitleExample example);
+
+    int updateByExample(@Param("record") VideoGrowthMultiTitle record, @Param("example") VideoGrowthMultiTitleExample example);
+
+    int updateByPrimaryKeySelective(VideoGrowthMultiTitle record);
+
+    int updateByPrimaryKey(VideoGrowthMultiTitle record);
+}

+ 13 - 0
api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/ext/VideoMultiMapperExt.java

@@ -0,0 +1,13 @@
+package com.tzld.piaoquan.api.dao.mapper.contentplatform.ext;
+
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCover;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitle;
+import org.apache.ibatis.annotations.Param;
+
+public interface VideoMultiMapperExt {
+
+    void insertVideoMultiTitleReturnId(@Param("record") VideoGrowthMultiTitle multiTitle);
+
+    void insertVideoMultiCoverReturnId(@Param("record") VideoGrowthMultiCover multiCover);
+
+}

+ 63 - 0
api-module/src/main/java/com/tzld/piaoquan/api/job/GzhReplyVideoRefreshJob.java

@@ -7,10 +7,14 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import com.tzld.piaoquan.api.component.AdApiService;
 import com.tzld.piaoquan.api.component.AigcApiService;
 import com.tzld.piaoquan.api.component.DeepSeekApiService;
+import com.tzld.piaoquan.api.dao.mapper.GhDetailMapperExt;
+import com.tzld.piaoquan.api.dao.mapper.GzhAutoreplyBehaviorUvTotalMapper;
 import com.tzld.piaoquan.api.model.bo.AdPutCreativeComponentCostData;
 import com.tzld.piaoquan.api.model.bo.GoogleLLMResult;
 import com.tzld.piaoquan.api.model.bo.VideoDetail;
 import com.tzld.piaoquan.api.model.dto.AIResult;
+import com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotal;
+import com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotalExample;
 import com.tzld.piaoquan.api.model.vo.GhDetailVo;
 import com.tzld.piaoquan.api.service.GhDetailService;
 import com.tzld.piaoquan.api.util.AliOssFileTool;
@@ -44,6 +48,10 @@ public class GzhReplyVideoRefreshJob {
     AigcApiService aigcApiService;
     @Autowired
     DeepSeekApiService deepSeekApiService;
+    @Autowired
+    GhDetailMapperExt ghDetailMapperExt;
+    @Autowired
+    GzhAutoreplyBehaviorUvTotalMapper gzhAutoreplyBehaviorUvTotalMapper;
 
     @ApolloJsonValue("${gzh.reply.video.refresh.job.filter.wxIds:[]}")
     private List<String> filterWxIds;
@@ -346,4 +354,59 @@ public class GzhReplyVideoRefreshJob {
         }
         return title;
     }
+
+    @XxlJob("syncGzhAutoreplyBehaviorUvTotalJob")
+    public ReturnT<String> syncGzhAutoreplyBehaviorUvTotalJob(String param) {
+        String dt = DateUtil.getBeforeDayDateString("yyyyMMdd");
+        if (StringUtils.isNotEmpty(param)) {
+            dt = param;
+        }
+        Long now = System.currentTimeMillis();
+        GzhAutoreplyBehaviorUvTotalExample example = new GzhAutoreplyBehaviorUvTotalExample();
+        example.createCriteria().andDtEqualTo(dt);
+        List<GzhAutoreplyBehaviorUvTotal> list = gzhAutoreplyBehaviorUvTotalMapper.selectByExample(example);
+        if (CollectionUtils.isNotEmpty(list)) {
+            return ReturnT.SUCCESS;
+        }
+        // 公众号自动回复数据统计
+        String sql = String.format(
+                "SELECT 合作方\n" +
+                        ",公众号id\n" +
+                        ",访问人数\n" +
+                        ",首层访问人数\n" +
+                        ",dt\n" +
+                        "FROM loghubods.gzh_autoreply_behavior_uv_total\n" +
+                        "WHERE dt = %s ;", dt);
+        List<Record> dataList = OdpsUtil.getOdpsData(sql);
+        if (CollectionUtils.isNotEmpty(dataList)) {
+            List<GzhAutoreplyBehaviorUvTotal> saveList = new ArrayList<>();
+            for (Record record : dataList) {
+                String channel = (String) record.get(0);
+                String ghId = (String) record.get(1);
+                Integer uv = parseInteger(record.get(2));
+                Integer firstLevel = parseInteger(record.get(3));
+                GzhAutoreplyBehaviorUvTotal item = new GzhAutoreplyBehaviorUvTotal();
+                item.setDt(dt);
+                item.setChannel(channel);
+                item.setUv(uv);
+                item.setFirstLevel(firstLevel);
+                item.setGhId(ghId);
+                item.setCreateTimestamp(now);
+                saveList.add(item);
+            }
+            if (CollectionUtils.isNotEmpty(saveList)) {
+                ghDetailMapperExt.deleteGzhAutoreplyBehaviorUvTotal(dt);
+                ghDetailMapperExt.batchInsertGzhAutoreplyBehaviorUvTotal(saveList);
+            }
+        }
+        return ReturnT.SUCCESS;
+    }
+
+    private Integer parseInteger(Object value) {
+        try {
+            return Integer.parseInt((String) value);
+        } catch (NumberFormatException e) {
+            return 0;
+        }
+    }
 }

+ 8 - 8
api-module/src/main/java/com/tzld/piaoquan/api/job/contentplatform/ContentPlatformDatastatJob.java

@@ -74,7 +74,7 @@ public class ContentPlatformDatastatJob {
         Long now = System.currentTimeMillis();
         // 公众号自动回复数据统计
         String sql = String.format(
-                "SELECT first_level.channel_shortname, first_level.subchannel, first_level.first_uv, fission.split_uv, fission.裂变arpu " +
+                "SELECT distinct first_level.channel_shortname, first_level.subchannel, first_level.first_uv, fission.split_uv, fission.裂变arpu " +
                         "FROM loghubods.out_channel_mid_first_total first_level " +
                         "left join loghubods.out_channel_mid_split_total fission " +
                         "on first_level.channel_shortname = fission.channel_shortname and first_level.subchannel = fission.subchannel " +
@@ -212,7 +212,7 @@ public class ContentPlatformDatastatJob {
         Long now = System.currentTimeMillis();
         // 公众号自动回复数据统计
         String sql = String.format(
-                "SELECT first_level.channel_shortname, first_level.first_uv, fission.split_uv, fission.裂变arpu, price.arpu " +
+                "SELECT distinct first_level.channel_shortname, first_level.first_uv, fission.split_uv, fission.裂变arpu, price.arpu " +
                         "FROM loghubods.out_channel_mid_first_total first_level " +
                         "left join loghubods.out_channel_mid_split_total fission " +
                         "on first_level.channel_shortname = fission.channel_shortname and first_level.dt = fission.dt " +
@@ -322,7 +322,7 @@ public class ContentPlatformDatastatJob {
         Long now = System.currentTimeMillis();
         // 公众号自动回复数据统计
         String sql = String.format(
-                "SELECT first_level.subchannel, first_level.first_uv, fission.split_uv " +
+                "SELECT distinct first_level.subchannel, first_level.first_uv, fission.split_uv " +
                         "FROM loghubods.out_channel_mid_first_total first_level " +
                         "left join loghubods.out_channel_mid_split_total fission " +
                         "on first_level.subchannel = fission.subchannel and first_level.dt = fission.dt " +
@@ -384,7 +384,7 @@ public class ContentPlatformDatastatJob {
         Long now = System.currentTimeMillis();
         // 公众号自动回复数据统计
         String sql = String.format(
-                "SELECT first_level.channel_shortname, first_level.first_uv, fission.split_uv, price.arpu " +
+                "SELECT distinct first_level.channel_shortname, first_level.first_uv, fission.split_uv, price.arpu " +
                         "FROM loghubods.out_channel_mid_first_total first_level " +
                         "left join loghubods.out_channel_mid_split_total fission " +
                         "on first_level.channel_shortname = fission.channel_shortname and first_level.dt = fission.dt " +
@@ -469,7 +469,7 @@ public class ContentPlatformDatastatJob {
         Long now = System.currentTimeMillis();
         // 公众号自动回复数据统计
         String sql = String.format(
-                "SELECT first_level.subchannel, first_level.first_uv, fission.split_uv " +
+                "SELECT distinct first_level.subchannel, first_level.first_uv, fission.split_uv " +
                         "FROM loghubods.out_channel_mid_first_total first_level " +
                         "left join loghubods.out_channel_mid_split_total fission " +
                         "on first_level.subchannel = fission.subchannel and first_level.dt = fission.dt " +
@@ -531,7 +531,7 @@ public class ContentPlatformDatastatJob {
         Long now = System.currentTimeMillis();
         // 公众号自动回复数据统计
         String sql = String.format(
-                "SELECT first_level.channel_shortname, first_level.first_uv, fission.split_uv, price.arpu " +
+                "SELECT distinct first_level.channel_shortname, first_level.first_uv, fission.split_uv, price.arpu " +
                         "FROM loghubods.out_channel_mid_first_total first_level " +
                         "left join loghubods.out_channel_mid_split_total fission " +
                         "on first_level.channel_shortname = fission.channel_shortname and first_level.dt = fission.dt " +
@@ -768,7 +768,7 @@ public class ContentPlatformDatastatJob {
         }
         Map<String, ContentPlatformQwDataStatTotal> saveMap = new HashMap<>();
         String outSql = String.format(
-                "SELECT first_level.channel_shortname, first_level.first_uv, fission.split_uv, price.arpu " +
+                "SELECT distinct first_level.channel_shortname, first_level.first_uv, fission.split_uv, price.arpu " +
                         "FROM loghubods.out_channel_mid_first_total first_level " +
                         "left join loghubods.out_channel_mid_split_total fission " +
                         "on first_level.channel_shortname = fission.channel_shortname and first_level.dt = fission.dt " +
@@ -920,7 +920,7 @@ public class ContentPlatformDatastatJob {
         }
         List<ContentPlatformQwDataStatSubChannel> saveList = new ArrayList<>();
         String outSql = String.format(
-                "SELECT first_level.channel_shortname, first_level.subchannel, first_level.first_uv, fission.split_uv, price.arpu " +
+                "SELECT distinct first_level.channel_shortname, first_level.subchannel, first_level.first_uv, fission.split_uv, price.arpu " +
                         "FROM loghubods.out_channel_mid_first_total first_level " +
                         "left join loghubods.out_channel_mid_split_total fission " +
                         "on first_level.channel_shortname = fission.channel_shortname and first_level.subchannel = fission.subchannel " +

+ 2 - 0
api-module/src/main/java/com/tzld/piaoquan/api/job/contentplatform/ContentPlatformVideoJob.java

@@ -451,6 +451,8 @@ public class ContentPlatformVideoJob {
         List<ContentPlatformVideoDataStatAgg> saveAggList = buildVideoDataStatAggList(aggDt, dtList);
         if (CollectionUtils.isNotEmpty(saveAggList)) {
             planMapperExt.deleteContentPlatformVideoDatastatAgg(aggDt, null);
+            String delDt = DateUtil.getBeforeDayDateString(31, "yyyyMMdd");
+            planMapperExt.deleteContentPlatformVideoDatastatAgg(delDt, null);
             planMapperExt.batchInsertContentPlatformVideoDatastatAgg(saveAggList);
         }
         calContentPlatformVideoDatastatAggRecommendRateJob(param);

+ 10 - 4
api-module/src/main/java/com/tzld/piaoquan/api/job/wecom/thirdpart/WeComSendMsgJob.java

@@ -183,10 +183,16 @@ public class WeComSendMsgJob {
                         for (CgiReplyBucketData cgiReplyBucketData : cgiReplyBucketDataList) {
                             // build发送体
                             SendAppMsgRequest request = buildSendAppMsgRequest(cgiReplyBucketData, pushStaff, room);
-                            // 发送消息
-                            CommonResponse<SendAppMsgResponse> response = weComThirdPartyService.sendAppMsg(pushStaff, room, request);
-                            // 存储消息
-                            saveAppWeComMsg(pushStaff.getId(), cgiReplyBucketData.getMiniVideoId(), request, response);
+                            try {
+                                // 发送消息
+                                CommonResponse<SendAppMsgResponse> response = weComThirdPartyService.sendAppMsg(pushStaff, room, request);
+                                // 存储消息
+                                saveAppWeComMsg(pushStaff.getId(), cgiReplyBucketData.getMiniVideoId(), request, response);
+                            } catch (Exception e) {
+                                log.error("发送群消息失败,账号名称:{},账号VID:{},群名称:{},视频ID:{},request:{},异常信息:{}",
+                                        staff.getName(), staff.getThirdStaffId(), room.getName(),
+                                        cgiReplyBucketData.getMiniVideoId(), JSONObject.toJSONString(request), e.getMessage(), e);
+                            }
                         }
                     }
                 }

+ 11 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/dto/PageUrlExtData.java

@@ -0,0 +1,11 @@
+package com.tzld.piaoquan.api.model.dto;
+
+import lombok.Data;
+
+@Data
+public class PageUrlExtData {
+    private Long growthTitleId;
+    private String growthTitleSource;
+    private Long growthCoverId;
+    private String growthCoverSource;
+}

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/model/vo/AccessTokenParam.java → api-module/src/main/java/com/tzld/piaoquan/api/model/param/AccessTokenParam.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.api.model.vo;
+package com.tzld.piaoquan.api.model.param;
 
 import lombok.Data;
 

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/model/vo/CallbackParam.java → api-module/src/main/java/com/tzld/piaoquan/api/model/param/CallbackParam.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.api.model.vo;
+package com.tzld.piaoquan.api.model.param;
 
 import com.tzld.piaoquan.api.model.bo.ReplyInfo;
 import lombok.Data;

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/model/vo/PushMessageParam.java → api-module/src/main/java/com/tzld/piaoquan/api/model/param/PushMessageParam.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.api.model.vo;
+package com.tzld.piaoquan.api.model.param;
 
 import lombok.Data;
 import lombok.ToString;

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/model/vo/WeComPushMessageParam.java → api-module/src/main/java/com/tzld/piaoquan/api/model/param/WeComPushMessageParam.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.api.model.vo;
+package com.tzld.piaoquan.api.model.param;
 
 import lombok.Data;
 import lombok.ToString;

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/model/vo/WeComUserNameAvatarParam.java → api-module/src/main/java/com/tzld/piaoquan/api/model/param/WeComUserNameAvatarParam.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.api.model.vo;
+package com.tzld.piaoquan.api.model.param;
 
 import lombok.Data;
 import lombok.ToString;

+ 90 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/po/GzhAutoreplyBehaviorUvTotal.java

@@ -0,0 +1,90 @@
+package com.tzld.piaoquan.api.model.po;
+
+public class GzhAutoreplyBehaviorUvTotal {
+    private Long id;
+
+    private String dt;
+
+    private String channel;
+
+    private String ghId;
+
+    private Integer uv;
+
+    private Integer firstLevel;
+
+    private Long createTimestamp;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getDt() {
+        return dt;
+    }
+
+    public void setDt(String dt) {
+        this.dt = dt;
+    }
+
+    public String getChannel() {
+        return channel;
+    }
+
+    public void setChannel(String channel) {
+        this.channel = channel;
+    }
+
+    public String getGhId() {
+        return ghId;
+    }
+
+    public void setGhId(String ghId) {
+        this.ghId = ghId;
+    }
+
+    public Integer getUv() {
+        return uv;
+    }
+
+    public void setUv(Integer uv) {
+        this.uv = uv;
+    }
+
+    public Integer getFirstLevel() {
+        return firstLevel;
+    }
+
+    public void setFirstLevel(Integer firstLevel) {
+        this.firstLevel = firstLevel;
+    }
+
+    public Long getCreateTimestamp() {
+        return createTimestamp;
+    }
+
+    public void setCreateTimestamp(Long createTimestamp) {
+        this.createTimestamp = createTimestamp;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", dt=").append(dt);
+        sb.append(", channel=").append(channel);
+        sb.append(", ghId=").append(ghId);
+        sb.append(", uv=").append(uv);
+        sb.append(", firstLevel=").append(firstLevel);
+        sb.append(", createTimestamp=").append(createTimestamp);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 661 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/po/GzhAutoreplyBehaviorUvTotalExample.java

@@ -0,0 +1,661 @@
+package com.tzld.piaoquan.api.model.po;
+
+import com.tzld.piaoquan.growth.common.utils.page.Page;
+import java.util.ArrayList;
+import java.util.List;
+
+public class GzhAutoreplyBehaviorUvTotalExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    protected Page page;
+
+    public GzhAutoreplyBehaviorUvTotalExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    public void setPage(Page page) {
+        this.page=page;
+    }
+
+    public Page getPage() {
+        return page;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtIsNull() {
+            addCriterion("dt is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtIsNotNull() {
+            addCriterion("dt is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtEqualTo(String value) {
+            addCriterion("dt =", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtNotEqualTo(String value) {
+            addCriterion("dt <>", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtGreaterThan(String value) {
+            addCriterion("dt >", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtGreaterThanOrEqualTo(String value) {
+            addCriterion("dt >=", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtLessThan(String value) {
+            addCriterion("dt <", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtLessThanOrEqualTo(String value) {
+            addCriterion("dt <=", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtLike(String value) {
+            addCriterion("dt like", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtNotLike(String value) {
+            addCriterion("dt not like", value, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtIn(List<String> values) {
+            addCriterion("dt in", values, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtNotIn(List<String> values) {
+            addCriterion("dt not in", values, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtBetween(String value1, String value2) {
+            addCriterion("dt between", value1, value2, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andDtNotBetween(String value1, String value2) {
+            addCriterion("dt not between", value1, value2, "dt");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelIsNull() {
+            addCriterion("channel is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelIsNotNull() {
+            addCriterion("channel is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelEqualTo(String value) {
+            addCriterion("channel =", value, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNotEqualTo(String value) {
+            addCriterion("channel <>", value, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelGreaterThan(String value) {
+            addCriterion("channel >", value, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelGreaterThanOrEqualTo(String value) {
+            addCriterion("channel >=", value, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelLessThan(String value) {
+            addCriterion("channel <", value, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelLessThanOrEqualTo(String value) {
+            addCriterion("channel <=", value, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelLike(String value) {
+            addCriterion("channel like", value, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNotLike(String value) {
+            addCriterion("channel not like", value, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelIn(List<String> values) {
+            addCriterion("channel in", values, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNotIn(List<String> values) {
+            addCriterion("channel not in", values, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelBetween(String value1, String value2) {
+            addCriterion("channel between", value1, value2, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andChannelNotBetween(String value1, String value2) {
+            addCriterion("channel not between", value1, value2, "channel");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdIsNull() {
+            addCriterion("gh_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdIsNotNull() {
+            addCriterion("gh_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdEqualTo(String value) {
+            addCriterion("gh_id =", value, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdNotEqualTo(String value) {
+            addCriterion("gh_id <>", value, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdGreaterThan(String value) {
+            addCriterion("gh_id >", value, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdGreaterThanOrEqualTo(String value) {
+            addCriterion("gh_id >=", value, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdLessThan(String value) {
+            addCriterion("gh_id <", value, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdLessThanOrEqualTo(String value) {
+            addCriterion("gh_id <=", value, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdLike(String value) {
+            addCriterion("gh_id like", value, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdNotLike(String value) {
+            addCriterion("gh_id not like", value, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdIn(List<String> values) {
+            addCriterion("gh_id in", values, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdNotIn(List<String> values) {
+            addCriterion("gh_id not in", values, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdBetween(String value1, String value2) {
+            addCriterion("gh_id between", value1, value2, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGhIdNotBetween(String value1, String value2) {
+            addCriterion("gh_id not between", value1, value2, "ghId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvIsNull() {
+            addCriterion("uv is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvIsNotNull() {
+            addCriterion("uv is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvEqualTo(Integer value) {
+            addCriterion("uv =", value, "uv");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvNotEqualTo(Integer value) {
+            addCriterion("uv <>", value, "uv");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvGreaterThan(Integer value) {
+            addCriterion("uv >", value, "uv");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvGreaterThanOrEqualTo(Integer value) {
+            addCriterion("uv >=", value, "uv");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvLessThan(Integer value) {
+            addCriterion("uv <", value, "uv");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvLessThanOrEqualTo(Integer value) {
+            addCriterion("uv <=", value, "uv");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvIn(List<Integer> values) {
+            addCriterion("uv in", values, "uv");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvNotIn(List<Integer> values) {
+            addCriterion("uv not in", values, "uv");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvBetween(Integer value1, Integer value2) {
+            addCriterion("uv between", value1, value2, "uv");
+            return (Criteria) this;
+        }
+
+        public Criteria andUvNotBetween(Integer value1, Integer value2) {
+            addCriterion("uv not between", value1, value2, "uv");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelIsNull() {
+            addCriterion("first_level is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelIsNotNull() {
+            addCriterion("first_level is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelEqualTo(Integer value) {
+            addCriterion("first_level =", value, "firstLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelNotEqualTo(Integer value) {
+            addCriterion("first_level <>", value, "firstLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelGreaterThan(Integer value) {
+            addCriterion("first_level >", value, "firstLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelGreaterThanOrEqualTo(Integer value) {
+            addCriterion("first_level >=", value, "firstLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelLessThan(Integer value) {
+            addCriterion("first_level <", value, "firstLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelLessThanOrEqualTo(Integer value) {
+            addCriterion("first_level <=", value, "firstLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelIn(List<Integer> values) {
+            addCriterion("first_level in", values, "firstLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelNotIn(List<Integer> values) {
+            addCriterion("first_level not in", values, "firstLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelBetween(Integer value1, Integer value2) {
+            addCriterion("first_level between", value1, value2, "firstLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andFirstLevelNotBetween(Integer value1, Integer value2) {
+            addCriterion("first_level not between", value1, value2, "firstLevel");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampIsNull() {
+            addCriterion("create_timestamp is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampIsNotNull() {
+            addCriterion("create_timestamp is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampEqualTo(Long value) {
+            addCriterion("create_timestamp =", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampNotEqualTo(Long value) {
+            addCriterion("create_timestamp <>", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampGreaterThan(Long value) {
+            addCriterion("create_timestamp >", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampGreaterThanOrEqualTo(Long value) {
+            addCriterion("create_timestamp >=", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampLessThan(Long value) {
+            addCriterion("create_timestamp <", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampLessThanOrEqualTo(Long value) {
+            addCriterion("create_timestamp <=", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampIn(List<Long> values) {
+            addCriterion("create_timestamp in", values, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampNotIn(List<Long> values) {
+            addCriterion("create_timestamp not in", values, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampBetween(Long value1, Long value2) {
+            addCriterion("create_timestamp between", value1, value2, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampNotBetween(Long value1, Long value2) {
+            addCriterion("create_timestamp not between", value1, value2, "createTimestamp");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 68 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/VideoGrowthMultiCover.java

@@ -0,0 +1,68 @@
+package com.tzld.piaoquan.api.model.po.contentplatform;
+
+public class VideoGrowthMultiCover {
+    private Long id;
+
+    private Long videoId;
+
+    private String source;
+
+    private String cover;
+
+    private Long createTimestamp;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getVideoId() {
+        return videoId;
+    }
+
+    public void setVideoId(Long videoId) {
+        this.videoId = videoId;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public String getCover() {
+        return cover;
+    }
+
+    public void setCover(String cover) {
+        this.cover = cover;
+    }
+
+    public Long getCreateTimestamp() {
+        return createTimestamp;
+    }
+
+    public void setCreateTimestamp(Long createTimestamp) {
+        this.createTimestamp = createTimestamp;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", videoId=").append(videoId);
+        sb.append(", source=").append(source);
+        sb.append(", cover=").append(cover);
+        sb.append(", createTimestamp=").append(createTimestamp);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 531 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/VideoGrowthMultiCoverExample.java

@@ -0,0 +1,531 @@
+package com.tzld.piaoquan.api.model.po.contentplatform;
+
+import com.tzld.piaoquan.growth.common.utils.page.Page;
+import java.util.ArrayList;
+import java.util.List;
+
+public class VideoGrowthMultiCoverExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    protected Page page;
+
+    public VideoGrowthMultiCoverExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    public void setPage(Page page) {
+        this.page=page;
+    }
+
+    public Page getPage() {
+        return page;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdIsNull() {
+            addCriterion("video_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdIsNotNull() {
+            addCriterion("video_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdEqualTo(Long value) {
+            addCriterion("video_id =", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdNotEqualTo(Long value) {
+            addCriterion("video_id <>", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdGreaterThan(Long value) {
+            addCriterion("video_id >", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("video_id >=", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdLessThan(Long value) {
+            addCriterion("video_id <", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdLessThanOrEqualTo(Long value) {
+            addCriterion("video_id <=", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdIn(List<Long> values) {
+            addCriterion("video_id in", values, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdNotIn(List<Long> values) {
+            addCriterion("video_id not in", values, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdBetween(Long value1, Long value2) {
+            addCriterion("video_id between", value1, value2, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdNotBetween(Long value1, Long value2) {
+            addCriterion("video_id not between", value1, value2, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIsNull() {
+            addCriterion("`source` is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIsNotNull() {
+            addCriterion("`source` is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceEqualTo(String value) {
+            addCriterion("`source` =", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotEqualTo(String value) {
+            addCriterion("`source` <>", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceGreaterThan(String value) {
+            addCriterion("`source` >", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceGreaterThanOrEqualTo(String value) {
+            addCriterion("`source` >=", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLessThan(String value) {
+            addCriterion("`source` <", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLessThanOrEqualTo(String value) {
+            addCriterion("`source` <=", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLike(String value) {
+            addCriterion("`source` like", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotLike(String value) {
+            addCriterion("`source` not like", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIn(List<String> values) {
+            addCriterion("`source` in", values, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotIn(List<String> values) {
+            addCriterion("`source` not in", values, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceBetween(String value1, String value2) {
+            addCriterion("`source` between", value1, value2, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotBetween(String value1, String value2) {
+            addCriterion("`source` not between", value1, value2, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverIsNull() {
+            addCriterion("cover is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverIsNotNull() {
+            addCriterion("cover is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverEqualTo(String value) {
+            addCriterion("cover =", value, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverNotEqualTo(String value) {
+            addCriterion("cover <>", value, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverGreaterThan(String value) {
+            addCriterion("cover >", value, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverGreaterThanOrEqualTo(String value) {
+            addCriterion("cover >=", value, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverLessThan(String value) {
+            addCriterion("cover <", value, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverLessThanOrEqualTo(String value) {
+            addCriterion("cover <=", value, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverLike(String value) {
+            addCriterion("cover like", value, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverNotLike(String value) {
+            addCriterion("cover not like", value, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverIn(List<String> values) {
+            addCriterion("cover in", values, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverNotIn(List<String> values) {
+            addCriterion("cover not in", values, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverBetween(String value1, String value2) {
+            addCriterion("cover between", value1, value2, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCoverNotBetween(String value1, String value2) {
+            addCriterion("cover not between", value1, value2, "cover");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampIsNull() {
+            addCriterion("create_timestamp is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampIsNotNull() {
+            addCriterion("create_timestamp is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampEqualTo(Long value) {
+            addCriterion("create_timestamp =", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampNotEqualTo(Long value) {
+            addCriterion("create_timestamp <>", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampGreaterThan(Long value) {
+            addCriterion("create_timestamp >", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampGreaterThanOrEqualTo(Long value) {
+            addCriterion("create_timestamp >=", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampLessThan(Long value) {
+            addCriterion("create_timestamp <", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampLessThanOrEqualTo(Long value) {
+            addCriterion("create_timestamp <=", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampIn(List<Long> values) {
+            addCriterion("create_timestamp in", values, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampNotIn(List<Long> values) {
+            addCriterion("create_timestamp not in", values, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampBetween(Long value1, Long value2) {
+            addCriterion("create_timestamp between", value1, value2, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampNotBetween(Long value1, Long value2) {
+            addCriterion("create_timestamp not between", value1, value2, "createTimestamp");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 68 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/VideoGrowthMultiTitle.java

@@ -0,0 +1,68 @@
+package com.tzld.piaoquan.api.model.po.contentplatform;
+
+public class VideoGrowthMultiTitle {
+    private Long id;
+
+    private Long videoId;
+
+    private String source;
+
+    private String title;
+
+    private Long createTimestamp;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getVideoId() {
+        return videoId;
+    }
+
+    public void setVideoId(Long videoId) {
+        this.videoId = videoId;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Long getCreateTimestamp() {
+        return createTimestamp;
+    }
+
+    public void setCreateTimestamp(Long createTimestamp) {
+        this.createTimestamp = createTimestamp;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", videoId=").append(videoId);
+        sb.append(", source=").append(source);
+        sb.append(", title=").append(title);
+        sb.append(", createTimestamp=").append(createTimestamp);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 531 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/VideoGrowthMultiTitleExample.java

@@ -0,0 +1,531 @@
+package com.tzld.piaoquan.api.model.po.contentplatform;
+
+import com.tzld.piaoquan.growth.common.utils.page.Page;
+import java.util.ArrayList;
+import java.util.List;
+
+public class VideoGrowthMultiTitleExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    protected Page page;
+
+    public VideoGrowthMultiTitleExample() {
+        oredCriteria = new ArrayList<Criteria>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    public void setPage(Page page) {
+        this.page=page;
+    }
+
+    public Page getPage() {
+        return page;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<Criterion>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(Long value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(Long value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(Long value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(Long value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(Long value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<Long> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<Long> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(Long value1, Long value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(Long value1, Long value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdIsNull() {
+            addCriterion("video_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdIsNotNull() {
+            addCriterion("video_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdEqualTo(Long value) {
+            addCriterion("video_id =", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdNotEqualTo(Long value) {
+            addCriterion("video_id <>", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdGreaterThan(Long value) {
+            addCriterion("video_id >", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("video_id >=", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdLessThan(Long value) {
+            addCriterion("video_id <", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdLessThanOrEqualTo(Long value) {
+            addCriterion("video_id <=", value, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdIn(List<Long> values) {
+            addCriterion("video_id in", values, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdNotIn(List<Long> values) {
+            addCriterion("video_id not in", values, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdBetween(Long value1, Long value2) {
+            addCriterion("video_id between", value1, value2, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andVideoIdNotBetween(Long value1, Long value2) {
+            addCriterion("video_id not between", value1, value2, "videoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIsNull() {
+            addCriterion("`source` is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIsNotNull() {
+            addCriterion("`source` is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceEqualTo(String value) {
+            addCriterion("`source` =", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotEqualTo(String value) {
+            addCriterion("`source` <>", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceGreaterThan(String value) {
+            addCriterion("`source` >", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceGreaterThanOrEqualTo(String value) {
+            addCriterion("`source` >=", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLessThan(String value) {
+            addCriterion("`source` <", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLessThanOrEqualTo(String value) {
+            addCriterion("`source` <=", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceLike(String value) {
+            addCriterion("`source` like", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotLike(String value) {
+            addCriterion("`source` not like", value, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceIn(List<String> values) {
+            addCriterion("`source` in", values, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotIn(List<String> values) {
+            addCriterion("`source` not in", values, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceBetween(String value1, String value2) {
+            addCriterion("`source` between", value1, value2, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andSourceNotBetween(String value1, String value2) {
+            addCriterion("`source` not between", value1, value2, "source");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIsNull() {
+            addCriterion("title is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIsNotNull() {
+            addCriterion("title is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleEqualTo(String value) {
+            addCriterion("title =", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotEqualTo(String value) {
+            addCriterion("title <>", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThan(String value) {
+            addCriterion("title >", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleGreaterThanOrEqualTo(String value) {
+            addCriterion("title >=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThan(String value) {
+            addCriterion("title <", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLessThanOrEqualTo(String value) {
+            addCriterion("title <=", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleLike(String value) {
+            addCriterion("title like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotLike(String value) {
+            addCriterion("title not like", value, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleIn(List<String> values) {
+            addCriterion("title in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotIn(List<String> values) {
+            addCriterion("title not in", values, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleBetween(String value1, String value2) {
+            addCriterion("title between", value1, value2, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andTitleNotBetween(String value1, String value2) {
+            addCriterion("title not between", value1, value2, "title");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampIsNull() {
+            addCriterion("create_timestamp is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampIsNotNull() {
+            addCriterion("create_timestamp is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampEqualTo(Long value) {
+            addCriterion("create_timestamp =", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampNotEqualTo(Long value) {
+            addCriterion("create_timestamp <>", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampGreaterThan(Long value) {
+            addCriterion("create_timestamp >", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampGreaterThanOrEqualTo(Long value) {
+            addCriterion("create_timestamp >=", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampLessThan(Long value) {
+            addCriterion("create_timestamp <", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampLessThanOrEqualTo(Long value) {
+            addCriterion("create_timestamp <=", value, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampIn(List<Long> values) {
+            addCriterion("create_timestamp in", values, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampNotIn(List<Long> values) {
+            addCriterion("create_timestamp not in", values, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampBetween(Long value1, Long value2) {
+            addCriterion("create_timestamp between", value1, value2, "createTimestamp");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimestampNotBetween(Long value1, Long value2) {
+            addCriterion("create_timestamp not between", value1, value2, "createTimestamp");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 2 - 2
api-module/src/main/java/com/tzld/piaoquan/api/mq/MessageCallbackCustomer.java

@@ -8,7 +8,7 @@ import com.aliyun.openservices.ons.api.ConsumeContext;
 import com.aliyun.openservices.ons.api.Message;
 import com.aliyun.openservices.ons.api.MessageListener;
 import com.tzld.piaoquan.api.model.bo.ReplyInfo;
-import com.tzld.piaoquan.api.model.vo.CallbackParam;
+import com.tzld.piaoquan.api.model.param.CallbackParam;
 import com.tzld.piaoquan.growth.common.dao.mapper.PushMessageCallbackMapper;
 import com.tzld.piaoquan.growth.common.model.po.PushMessageCallback;
 import lombok.extern.slf4j.Slf4j;
@@ -34,7 +34,7 @@ public class MessageCallbackCustomer implements MessageListener {
         CallbackParam param = JSONObject.parseObject(new String(message.getBody()), CallbackParam.class);
         log.info("param = {}", param);
         if (CollectionUtils.isEmpty(param.getReplyInfo())) {
-            log.error("CallbackParam replyInfo is empty {}", param);
+            //log.error("CallbackParam replyInfo is empty {}", param);
         }
         PushMessageCallback pushMessageCallback = new PushMessageCallback();
         pushMessageCallback.setGhId(param.getGhId());

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/mq/MessageCallbackProducer.java

@@ -5,7 +5,7 @@ import com.aliyun.openservices.ons.api.Message;
 import com.aliyun.openservices.ons.api.SendResult;
 import com.aliyun.openservices.ons.api.bean.ProducerBean;
 
-import com.tzld.piaoquan.api.model.vo.CallbackParam;
+import com.tzld.piaoquan.api.model.param.CallbackParam;
 import com.tzld.piaoquan.api.service.GhAccessTokenService;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
 import com.tzld.piaoquan.growth.common.common.enums.ExceptionCodeEnum;

+ 2 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/CgiReplyService.java

@@ -10,6 +10,8 @@ import java.util.List;
 public interface CgiReplyService {
     ReplyBucketData getRgiReplyData(BucketDataParam bucketDataParam);
 
+    List<CgiReplyBucketData> getCgiReplyBucketDataListByGhId(String ghId, String strategy);
+
     List<CgiReplyBucketData> getCgiReplyBucketDataListByGhIds(List<String> ghIds, String strategy);
 
     List<CgiReplyBucketData> getCgiReplyBucketDataListByVideoId(Long videoId);

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/service/GhAccessTokenService.java

@@ -1,7 +1,7 @@
 package com.tzld.piaoquan.api.service;
 
 import com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformAccount;
-import com.tzld.piaoquan.api.model.vo.AccessTokenParam;
+import com.tzld.piaoquan.api.model.param.AccessTokenParam;
 import com.tzld.piaoquan.api.model.vo.AccessTokenVo;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
 

+ 16 - 77
api-module/src/main/java/com/tzld/piaoquan/api/service/VideoMultiService.java

@@ -1,84 +1,23 @@
 package com.tzld.piaoquan.api.service;
 
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.tzld.piaoquan.api.component.ManagerApiService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCover;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitle;
 
-import java.net.URLEncoder;
-import java.util.Objects;
+import java.util.List;
 
-@Slf4j
-@Service
-public class VideoMultiService {
+public interface VideoMultiService {
 
-    @Autowired
-    private ManagerApiService managerApiService;
+    String setVideoMultiTitleCoverPagePath(Long videoId, String pageUrl, String title, String coverUrl);
+    
+    Long saveMultiTitle(Long videoId, String source, String title);
 
-    public String setVideoMultiTitleCoverPagePath(Long videoId, String pageUrl, String title, String coverUrl) {
-        JSONArray multiTitleList = managerApiService.videoMultiTitleListV2(videoId);
-        JSONArray multiCoverList = managerApiService.videoMultiCoverListV2(videoId);
-        if (!CollectionUtils.isEmpty(multiTitleList)) {
-            Integer titleId = null;
-            for (int i = 0; i < multiTitleList.size(); i++) {
-                JSONObject item = multiTitleList.getJSONObject(i);
-                if (item.getInteger("source") == 0) {
-                    titleId = item.getInteger("id");
-                    break;
-                }
-            }
-            if (Objects.isNull(titleId)) {
-                for (int i = 0; i < multiTitleList.size(); i++) {
-                    JSONObject item = multiTitleList.getJSONObject(i);
-                    if (title.equals(item.getString("title"))) {
-                        titleId = item.getInteger("id");
-                        break;
-                    }
-                }
-            }
-            try {
-                //if (Objects.nonNull(title) && !pageUrl.contains("shareTitle")) {
-                //    pageUrl += URLEncoder.encode("&shareTitle=" + title, "UTF-8");
-                //}
-                if (Objects.nonNull(titleId) && !pageUrl.contains("shareTitleId")) {
-                    pageUrl += URLEncoder.encode("&shareTitleId=" + titleId, "UTF-8");
-                }
-            } catch (Exception e) {
-                log.error("ThirdPartyPushMessageStrategyV1 insertSmallData setCustomerCoverTitleId Error,data:", e);
-            }
-        }
-        if (!CollectionUtils.isEmpty(multiCoverList)) {
-            Integer coverId = null;
-            for (int i = 0; i < multiCoverList.size(); i++) {
-                JSONObject item = multiCoverList.getJSONObject(i);
-                if (item.getInteger("source") == 0) {
-                    coverId = item.getInteger("id");
-                    break;
-                }
-            }
-            if (Objects.isNull(coverId)) {
-                for (int i = 0; i < multiCoverList.size(); i++) {
-                    JSONObject item = multiCoverList.getJSONObject(i);
-                    if (coverUrl.equals(item.getString("coverUrl"))) {
-                        coverId = item.getInteger("id");
-                        break;
-                    }
-                }
-            }
-            try {
-                if (Objects.nonNull(coverId) && !pageUrl.contains("shareImageId")) {
-                    pageUrl += URLEncoder.encode("&shareImageId=" + coverId, "UTF-8");
-                }
-                //if (StringUtils.isNotEmpty(coverUrl) && !pageUrl.contains("shareImageUrl")) {
-                //    pageUrl += URLEncoder.encode("&shareImageUrl=" + URLEncoder.encode(coverUrl, "UTF-8"), "UTF-8");
-                //}
-            } catch (Exception e) {
-                log.error("ThirdPartyPushMessageStrategyV1 insertSmallData setCustomerCoverTitleId Error,data:", e);
-            }
-        }
-        return pageUrl;
-    }
+    List<VideoGrowthMultiTitle> getMultiTitleByVideoId(Long videoId);
+
+    Long saveMultiCover(Long videoId, String source, String cover);
+    
+    List<VideoGrowthMultiCover> getMultiCoverByVideoId(Long videoId);
+
+    List<VideoGrowthMultiTitle> getVideoGrowthMultiTitleList(List<Long> customTitleIds);
+
+    List<VideoGrowthMultiCover> getVideoGrowthMultiCoverList(List<Long> customCoverIds);
 }

+ 76 - 80
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformPlanServiceImpl.java

@@ -1,5 +1,6 @@
 package com.tzld.piaoquan.api.service.contentplatform.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
 import com.tzld.piaoquan.api.common.enums.ExceptionEnum;
@@ -38,14 +39,13 @@ import com.tzld.piaoquan.growth.common.utils.MessageUtil;
 import com.tzld.piaoquan.growth.common.utils.page.Page;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -168,6 +168,13 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
                 planItemVO.setTitle(titleList);
                 List<GzhPlanVideoContentItemVO> videoVOList = new ArrayList<>();
                 Map<Long, CgiReplyBucketData> bucketDataMapByGhId = bucketDataMap.get(gzhAccount.getGhId());
+                if (MapUtils.isEmpty(bucketDataMapByGhId)) {
+                    BucketDataParam bucketDataParam = new BucketDataParam();
+                    bucketDataParam.setGhId(gzhAccount.getGhId());
+                    cgiReplyService.getRgiReplyData(bucketDataParam);
+                    List<CgiReplyBucketData> bucketDatas = cgiReplyService.getCgiReplyBucketDataListByGhId(gzhAccount.getGhId(), "manual");
+                    bucketDataMapByGhId = bucketDatas.stream().collect(Collectors.toMap(CgiReplyBucketData::getMiniVideoId, Function.identity(), (a, b) -> b));
+                }
                 for (ContentPlatformGzhPlanVideo video : videoListByPlanId) {
                     GzhPlanVideoContentItemVO videoItemVO = new GzhPlanVideoContentItemVO();
                     videoItemVO.setVideoId(video.getVideoId());
@@ -199,24 +206,10 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
 
     private String buildCustomPageUrl(GzhPlanVideoContentItemVO videoItemVO, ContentPlatformGzhPlanVideo video) {
         String pageUrl = videoItemVO.getPageUrl();
-        try {
-            if (StringUtils.hasText(videoItemVO.getCustomTitle()) && !pageUrl.contains("shareTitleId")) {
-                if (Objects.nonNull(video.getCustomTitleId())) {
-                    pageUrl += URLEncoder.encode("&shareTitleId=" + video.getCustomTitleId(), "UTF-8");
-                }
-                //pageUrl += URLEncoder.encode("&shareTitle=" + video.getCustomTitle(), "UTF-8");
-            }
-            if (StringUtils.hasText(videoItemVO.getCustomCover()) && !pageUrl.contains("shareImageId")) {
-                if (Objects.nonNull(video.getCustomCoverId())) {
-                    pageUrl += URLEncoder.encode("&shareImageId=" + video.getCustomCoverId(), "UTF-8");
-                }
-            //    pageUrl += URLEncoder.encode("&shareImageUrl=" +  URLEncoder.encode(video.getCustomCover(), "UTF-8"), "UTF-8");
-            }
-            return pageUrl;
-        } catch (UnsupportedEncodingException e) {
-            log.error("buildCustomPageUrl error", e);
-        }
-        return videoItemVO.getPageUrl();
+        String title = StringUtils.hasText(videoItemVO.getCustomTitle()) ? videoItemVO.getCustomTitle() : videoItemVO.getTitle();
+        String cover = StringUtils.hasText(videoItemVO.getCustomCover()) ? videoItemVO.getCustomCover() : videoItemVO.getCover();
+        pageUrl = videoMultiService.setVideoMultiTitleCoverPagePath(video.getVideoId(), pageUrl, title, cover);
+        return pageUrl;
     }
 
     @Override
@@ -329,18 +322,18 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
             gzhPlan.setId(param.getId());
             gzhPlanMapper.updateByPrimaryKeySelective(gzhPlan);
         }
+        // 保存视频内容
+        saveGzhPlanVideo(param, videoIds, gzhPlan.getId(), account, loginAccount);
         if (param.getType() == ContentPlatformGzhPlanTypeEnum.AUTO_REPLY.getVal()) {
-            // 更新gh_detail
-            updateGhDetail(account, param.getSelectVideoType(), videoIds);
             // 更新cgi_reply_bucket_data
             updateCgiReplyBucketData(account.getGhId());
+            // 更新gh_detail
+            updateGhDetail(account, param.getSelectVideoType(), videoIds);
         }
-        // 保存视频内容
-        saveGzhPlanVideo(param, videoIds, gzhPlan.getId(), account, loginAccount);
         // 调用aigc重新拉取视频
         if (param.getType() == ContentPlatformGzhPlanTypeEnum.AUTO_REPLY.getVal()) {
             if (PublishStageEnum.PLATFORM.getVal() == param.getPublishStage()) {
-                new Thread(() -> aigcApiService.refreshGzhAutoReplyMsgData(account.getGhId())).start();
+                //new Thread(() -> aigcApiService.refreshGzhAutoReplyMsgData(account.getGhId())).start();
             } else {
                 BucketDataParam bucketDataParam = new BucketDataParam();
                 bucketDataParam.setGhId(account.getGhId());
@@ -423,32 +416,11 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
 
     private String setMultiTitleCoverPagePath(ContentPlatformGzhPlanVideo item) {
         String pageUrl = item.getPageUrl();
-        if(StringUtils.hasText(pageUrl)){
-            String title = item.getTitle();
-            String cover = item.getCover();
+        if (StringUtils.hasText(pageUrl)) {
+            String title = StringUtils.hasText(item.getCustomTitle()) ? item.getCustomTitle() : item.getTitle();
+            String cover = StringUtils.hasText(item.getCustomCover()) ? item.getCustomCover() : item.getCover();
             try {
-                //if (!pageUrl.contains("shareTitle")) {
-                //    if (StringUtils.hasText(item.getCustomTitle())) {
-                //        pageUrl += URLEncoder.encode("&shareTitle=" + item.getCustomTitle(), "UTF-8");
-                //        title = item.getCustomTitle();
-                //    } else {
-                //        pageUrl += URLEncoder.encode("&shareTitle=" + item.getTitle(), "UTF-8");
-                //    }
-                //}
-                if (Objects.nonNull(item.getCustomTitleId()) && !pageUrl.contains("shareTitleId")) {
-                    pageUrl += URLEncoder.encode("&shareTitleId=" + item.getCustomTitleId(), "UTF-8");
-                }
-                if (Objects.nonNull(item.getCustomCoverId()) && !pageUrl.contains("shareImageId")) {
-                    pageUrl += URLEncoder.encode("&shareImageId=" + item.getCustomCoverId(), "UTF-8");
-                }
-                //if (!pageUrl.contains("shareImageUrl")) {
-                //    if (StringUtils.hasText(item.getCustomCover())) {
-                //        pageUrl += URLEncoder.encode("&shareImageUrl=" + URLEncoder.encode(item.getCustomCover(), "UTF-8"), "UTF-8");
-                //        cover = item.getCustomCover();
-                //    } else {
-                //        pageUrl += URLEncoder.encode("&shareImageUrl=" + URLEncoder.encode(item.getCover(), "UTF-8"), "UTF-8");
-                //    }
-                //}
+                pageUrl = videoMultiService.setVideoMultiTitleCoverPagePath(item.getVideoId(), pageUrl, title, cover);
             } catch (Exception e) {
                 log.error("设置视频多标题封面失败,videoId={}", item.getVideoId(), e);
             }
@@ -457,24 +429,36 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
         return pageUrl;
     }
 
-    private void setCustomTitle(ContentPlatformGzhPlanVideo item, GzhPlanVideoContentItemParam vo) {
-        if (StringUtils.hasText(vo.getCustomTitle())) {
-            List<ContentPlatformGzhPlanVideo> gzhPlanVideoList = gzhPlanVideoListByVideoTitle(vo.getVideoId());
-            boolean customTitleExist = false;
-            if (CollectionUtils.isNotEmpty(gzhPlanVideoList)) {
-                for (ContentPlatformGzhPlanVideo gzhPlanVideo : gzhPlanVideoList) {
-                    if (gzhPlanVideo.getCustomTitle().equals(vo.getCustomTitle())) {
-                        item.setCustomTitleId(gzhPlanVideo.getCustomTitleId());
-                        customTitleExist = true;
-                        break;
-                    }
+    private void setCustomTitle(ContentPlatformGzhPlanVideo video, GzhPlanVideoContentItemParam vo) {
+        String title = StringUtils.hasText(vo.getCustomTitle()) ? vo.getCustomTitle() : vo.getTitle();
+        if (StringUtils.hasText(title)) {
+            boolean titleExist = false;
+            List<VideoGrowthMultiTitle> list = videoMultiService.getMultiTitleByVideoId(vo.getVideoId());
+            for (VideoGrowthMultiTitle multiTitle : list) {
+                if (multiTitle.getTitle().equals(title)) {
+                    video.setCustomTitleId(multiTitle.getId());
+                    titleExist = true;
+                    break;
                 }
             }
-            if (!customTitleExist && vo.getCustomTitle().length() > 5) {
-                JSONObject multiTitle = managerApiService.videoMultiTitleSave(vo.getVideoId(), vo.getCustomTitle());
-                item.setCustomTitleId(multiTitle.getLong("id"));
+            if (!titleExist) {
+                JSONArray multiTitleList = managerApiService.videoMultiTitleListV2(vo.getVideoId());
+                String source = "自定义";
+                if (!org.springframework.util.CollectionUtils.isEmpty(multiTitleList)) {
+                    for (int i = 0; i < multiTitleList.size(); i++) {
+                        JSONObject item = multiTitleList.getJSONObject(i);
+                        if (item.getString("title").equals(title)) {
+                            if (item.getInteger("source") == 0) {
+                                source = "原始";
+                                break;
+                            }
+                        }
+                    }
+                }
+                Long titleId = videoMultiService.saveMultiTitle(vo.getVideoId(), source, title);
+                video.setCustomTitleId(titleId);
             }
-            item.setCustomTitle(vo.getCustomTitle());
+            video.setTitle(title);
         }
     }
 
@@ -484,24 +468,36 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
         return gzhPlanVideoMapper.selectByExample(example);
     }
 
-    private void setCustomCover(ContentPlatformGzhPlanVideo item, GzhPlanVideoContentItemParam vo) {
-        if (StringUtils.hasText(vo.getCustomCover())) {
-            List<ContentPlatformGzhPlanVideo> gzhPlanVideoList = gzhPlanVideoListByVideoCover(vo.getVideoId());
+    private void setCustomCover(ContentPlatformGzhPlanVideo video, GzhPlanVideoContentItemParam vo) {
+        String cover = StringUtils.hasText(vo.getCustomCover()) ? vo.getCustomCover() : vo.getCover();
+        if (StringUtils.hasText(cover)) {
             boolean customCoverExist = false;
-            if (CollectionUtils.isNotEmpty(gzhPlanVideoList)) {
-                for (ContentPlatformGzhPlanVideo gzhPlanVideo : gzhPlanVideoList) {
-                    if (gzhPlanVideo.getCustomCover().equals(vo.getCustomCover())) {
-                        item.setCustomCoverId(gzhPlanVideo.getCustomCoverId());
-                        customCoverExist = true;
-                        break;
-                    }
+            List<VideoGrowthMultiCover> list = videoMultiService.getMultiCoverByVideoId(vo.getVideoId());
+            for (VideoGrowthMultiCover multiCover : list) {
+                if (multiCover.getCover().equals(cover)) {
+                    video.setCustomCoverId(multiCover.getId());
+                    customCoverExist = true;
+                    break;
                 }
             }
             if (!customCoverExist) {
-                JSONObject multiCover = managerApiService.videoMultiCoverSave(vo.getVideoId(), vo.getCustomCover());
-                item.setCustomCoverId(multiCover.getLong("id"));
+                JSONArray multiCoverList = managerApiService.videoMultiCoverListV2(vo.getVideoId());
+                String source = "自定义";
+                if (!org.springframework.util.CollectionUtils.isEmpty(multiCoverList)) {
+                    for (int i = 0; i < multiCoverList.size(); i++) {
+                        JSONObject item = multiCoverList.getJSONObject(i);
+                        if (item.getString("coverUrl").equals(cover)) {
+                            if (item.getInteger("source") == 0) {
+                                source = "原始";
+                                break;
+                            }
+                        }
+                    }
+                }
+                Long coverId = videoMultiService.saveMultiCover(vo.getVideoId(), source, cover);
+                video.setCustomCoverId(coverId);
             }
-            item.setCustomCover(vo.getCustomCover());
+            video.setCover(cover);
         }
     }
 
@@ -976,8 +972,8 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
             String pageUrl = messageAttachmentService.getPage(loginUser.getChannel(), carrierId,
                     "dyyqw", "企微", QwPlanTypeEnum.from(param.getType()).getDescription(),
                     "位置1", videoParam.getVideoId());
-            pageUrl = videoMultiService.setVideoMultiTitleCoverPagePath(videoParam.getVideoId(), pageUrl,
-                    videoParam.getTitle(), videoParam.getCover());
+            //pageUrl = videoMultiService.setVideoMultiTitleCoverPagePath(videoParam.getVideoId(), pageUrl,
+            //        videoParam.getTitle(), videoParam.getCover());
             String rootSourceId = MessageUtil.getRootSourceId(pageUrl);
             qwPlan.setPageUrl(pageUrl);
             qwPlan.setRootSourceId(rootSourceId);

+ 7 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/impl/CgiReplyServiceImpl.java

@@ -125,6 +125,13 @@ public class CgiReplyServiceImpl implements CgiReplyService {
         return null;
     }
 
+    @Override
+    public List<CgiReplyBucketData> getCgiReplyBucketDataListByGhId(String ghId, String strategy) {
+        CgiReplyBucketDataExample example = new CgiReplyBucketDataExample();
+        example.createCriteria().andGhIdEqualTo(ghId).andStrategyEqualTo(strategy).andIsDeleteEqualTo(0);
+        return cgiReplyBucketDataMapper.selectByExample(example);
+    }
+
     @Override
     public List<CgiReplyBucketData> getCgiReplyBucketDataListByGhIds(List<String> ghIds, String strategy) {
         CgiReplyBucketDataExample example = new CgiReplyBucketDataExample();

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/service/impl/GhAccessTokenServiceImpl.java

@@ -3,7 +3,7 @@ package com.tzld.piaoquan.api.service.impl;
 import com.tzld.piaoquan.api.dao.mapper.contentplatform.ContentPlatformAccountMapper;
 import com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformAccount;
 import com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformAccountExample;
-import com.tzld.piaoquan.api.model.vo.AccessTokenParam;
+import com.tzld.piaoquan.api.model.param.AccessTokenParam;
 import com.tzld.piaoquan.api.model.vo.AccessTokenVo;
 import com.tzld.piaoquan.api.service.GhAccessTokenService;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;

+ 47 - 22
api-module/src/main/java/com/tzld/piaoquan/api/service/impl/GhDetailServiceImpl.java

@@ -10,8 +10,11 @@ import com.tzld.piaoquan.api.dao.mapper.GhDetailExtMapper;
 import com.tzld.piaoquan.api.dao.mapper.GhDetailMapperExt;
 import com.tzld.piaoquan.api.model.po.GhDetailExt;
 import com.tzld.piaoquan.api.model.po.GhDetailExtExample;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCover;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitle;
 import com.tzld.piaoquan.api.model.vo.GhDetailVo;
 import com.tzld.piaoquan.api.service.GhDetailService;
+import com.tzld.piaoquan.api.service.VideoMultiService;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
 import com.tzld.piaoquan.growth.common.common.enums.GhTypeEnum;
 import com.tzld.piaoquan.growth.common.common.enums.StrategyStatusEnum;
@@ -52,6 +55,8 @@ public class GhDetailServiceImpl implements GhDetailService {
     private CgiReplyBucketDataMapper cgiReplyBucketDataMapper;
     @Autowired
     private ManagerApiService managerApiService;
+    @Autowired
+    private VideoMultiService videoMultiService;
 
     @Value("${small_page_url}")
     private String GET_SMALL_PAGE_URL;
@@ -201,21 +206,31 @@ public class GhDetailServiceImpl implements GhDetailService {
 
     private void setCustomTitle(GhDetailExt ghDetailExt, GhDetailVo.VideoDetail videoDetail) {
         if (StringUtils.isNotEmpty(videoDetail.getTitle())) {
-            JSONArray multiTitleList = managerApiService.videoMultiTitleListV2(videoDetail.getVideoId());
             boolean titleExist = false;
-            if (!CollectionUtils.isEmpty(multiTitleList)) {
-                for (int i = 0; i < multiTitleList.size(); i++) {
-                    JSONObject item = multiTitleList.getJSONObject(i);
-                    if (item.getString("title").equals(videoDetail.getTitle())) {
-                        ghDetailExt.setTitleId(item.getLong("id"));
-                        titleExist = true;
-                        break;
-                    }
+            List<VideoGrowthMultiTitle> list = videoMultiService.getMultiTitleByVideoId(videoDetail.getVideoId());
+            for (VideoGrowthMultiTitle multiTitle : list) {
+                if (multiTitle.getTitle().equals(videoDetail.getTitle())) {
+                    ghDetailExt.setTitleId(multiTitle.getId());
+                    titleExist = true;
+                    break;
                 }
             }
             if (!titleExist) {
-                JSONObject multiTitle = managerApiService.videoMultiTitleSave(videoDetail.getVideoId(), videoDetail.getTitle());
-                ghDetailExt.setTitleId(multiTitle.getLong("id"));
+                JSONArray multiTitleList = managerApiService.videoMultiTitleListV2(videoDetail.getVideoId());
+                String source = "自定义";
+                if (!CollectionUtils.isEmpty(multiTitleList)) {
+                    for (int i = 0; i < multiTitleList.size(); i++) {
+                        JSONObject item = multiTitleList.getJSONObject(i);
+                        if (item.getString("title").equals(videoDetail.getTitle())) {
+                            if (item.getInteger("source") == 0) {
+                                source = "原始";
+                                break;
+                            }
+                        }
+                    }
+                }
+                Long titleId = videoMultiService.saveMultiTitle(videoDetail.getVideoId(), source, videoDetail.getTitle());
+                ghDetailExt.setTitleId(titleId);
             }
             ghDetailExt.setTitle(videoDetail.getTitle());
         }
@@ -223,21 +238,31 @@ public class GhDetailServiceImpl implements GhDetailService {
 
     private void setCustomCover(GhDetailExt ghDetailExt, GhDetailVo.VideoDetail videoDetail) {
         if (StringUtils.isNotEmpty(videoDetail.getCover())) {
-            JSONArray multiCoverList = managerApiService.videoMultiCoverListV2(videoDetail.getVideoId());
             boolean customCoverExist = false;
-            if (!CollectionUtils.isEmpty(multiCoverList)) {
-                for (int i = 0; i < multiCoverList.size(); i++) {
-                    JSONObject item = multiCoverList.getJSONObject(i);
-                    if (item.getString("coverUrl").equals(videoDetail.getCover())) {
-                        ghDetailExt.setCoverId(item.getLong("id"));
-                        customCoverExist = true;
-                        break;
-                    }
+            List<VideoGrowthMultiCover> list = videoMultiService.getMultiCoverByVideoId(videoDetail.getVideoId());
+            for (VideoGrowthMultiCover multiCover : list) {
+                if (multiCover.getCover().equals(videoDetail.getCover())) {
+                    ghDetailExt.setCoverId(multiCover.getId());
+                    customCoverExist = true;
+                    break;
                 }
             }
             if (!customCoverExist) {
-                JSONObject multiCover = managerApiService.videoMultiCoverSave(videoDetail.getVideoId(), videoDetail.getCover());
-                ghDetailExt.setCoverId(multiCover.getLong("id"));
+                JSONArray multiCoverList = managerApiService.videoMultiCoverListV2(videoDetail.getVideoId());
+                String source = "自定义";
+                if (!CollectionUtils.isEmpty(multiCoverList)) {
+                    for (int i = 0; i < multiCoverList.size(); i++) {
+                        JSONObject item = multiCoverList.getJSONObject(i);
+                        if (item.getString("coverUrl").equals(videoDetail.getCover())) {
+                            if (item.getInteger("source") == 0) {
+                                source = "原始";
+                                break;
+                            }
+                        }
+                    }
+                }
+                Long coverId = videoMultiService.saveMultiCover(videoDetail.getVideoId(), source, videoDetail.getCover());
+                ghDetailExt.setCoverId(coverId);
             }
             ghDetailExt.setCover(videoDetail.getCover());
         }

+ 183 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/impl/VideoMultiServiceImpl.java

@@ -0,0 +1,183 @@
+package com.tzld.piaoquan.api.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.piaoquan.api.component.ManagerApiService;
+import com.tzld.piaoquan.api.dao.mapper.contentplatform.VideoGrowthMultiCoverMapper;
+import com.tzld.piaoquan.api.dao.mapper.contentplatform.VideoGrowthMultiTitleMapper;
+import com.tzld.piaoquan.api.dao.mapper.contentplatform.ext.VideoMultiMapperExt;
+import com.tzld.piaoquan.api.model.dto.PageUrlExtData;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCover;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCoverExample;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitle;
+import com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitleExample;
+import com.tzld.piaoquan.api.service.VideoMultiService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Service
+public class VideoMultiServiceImpl implements VideoMultiService {
+
+    @Autowired
+    private ManagerApiService managerApiService;
+    @Autowired
+    private VideoMultiMapperExt videoMultiMapperExt;
+    @Autowired
+    private VideoGrowthMultiTitleMapper titleMapper;
+    @Autowired
+    private VideoGrowthMultiCoverMapper coverMapper;
+
+    @Override
+    public String setVideoMultiTitleCoverPagePath(Long videoId, String pageUrl, String title, String coverUrl) {
+        if (pageUrl.contains("growthExtData")) {
+            return pageUrl;
+        }
+        List<VideoGrowthMultiTitle> multiTitleList = getMultiTitleByVideoId(videoId);
+        List<VideoGrowthMultiCover> multiCoverList = getMultiCoverByVideoId(videoId);
+        PageUrlExtData extData = new PageUrlExtData();
+        if (!CollectionUtils.isEmpty(multiTitleList)) {
+            Long titleId = null;
+            String titleSource = "";
+            for (int i = 0; i < multiTitleList.size(); i++) {
+                VideoGrowthMultiTitle item = multiTitleList.get(i);
+                if (title.equals(item.getTitle())) {
+                    titleId = item.getId();
+                    titleSource = item.getSource();
+                    break;
+                }
+            }
+            try {
+                if (Objects.nonNull(titleId)) {
+                    extData.setGrowthTitleId(titleId);
+                    extData.setGrowthTitleSource(titleSource);
+                }
+            } catch (Exception e) {
+                log.error("VideoMultiService VideoMultiService Error,data:", e);
+            }
+        }
+        if (Objects.isNull(extData.getGrowthTitleId())) {
+            JSONArray managerMultiTitleList = managerApiService.videoMultiTitleListV2(videoId);
+            String source = "自定义";
+            if (!org.springframework.util.CollectionUtils.isEmpty(managerMultiTitleList)) {
+                for (int i = 0; i < managerMultiTitleList.size(); i++) {
+                    JSONObject item = managerMultiTitleList.getJSONObject(i);
+                    if (item.getString("title").equals(title)) {
+                        if (item.getInteger("source") == 0) {
+                            source = "原始";
+                            break;
+                        }
+                    }
+                }
+            }
+            Long titleId = saveMultiTitle(videoId, source, title);
+            extData.setGrowthTitleId(titleId);
+            extData.setGrowthTitleSource(source);
+        }
+        if (!CollectionUtils.isEmpty(multiCoverList)) {
+            Long coverId = null;
+            String coverSource = "";
+            String videoCover = coverUrl.split("\\?")[0];
+            for (int i = 0; i < multiCoverList.size(); i++) {
+                VideoGrowthMultiCover item = multiCoverList.get(i);
+                String itemCover = item.getCover().split("\\?")[0];
+                if (videoCover.equals(itemCover)) {
+                    coverId = item.getId();
+                    coverSource = item.getSource();
+                    break;
+                }
+            }
+            try {
+                if (Objects.nonNull(coverId)) {
+                    extData.setGrowthCoverId(coverId);
+                    extData.setGrowthCoverSource(coverSource);
+                }
+            } catch (Exception e) {
+                log.error("VideoMultiService VideoMultiService Error,data:", e);
+            }
+        }
+        if (Objects.isNull(extData.getGrowthCoverId())) {
+            JSONArray managerMultiCoverList = managerApiService.videoMultiCoverListV2(videoId);
+            String source = "自定义";
+            if (!CollectionUtils.isEmpty(managerMultiCoverList)) {
+                for (int i = 0; i < managerMultiCoverList.size(); i++) {
+                    JSONObject item = managerMultiCoverList.getJSONObject(i);
+                    if (item.getInteger("source") == 0) {
+                        if (item.getString("coverUrl").equals(coverUrl)
+                                || (coverUrl.contains("longvideo") && !coverUrl.contains("/longvideo/pic"))) {
+                            source = "原始";
+                            break;
+                        }
+                    }
+                }
+            }
+            Long coverId = saveMultiCover(videoId, source, coverUrl);
+            extData.setGrowthCoverId(coverId);
+            extData.setGrowthCoverSource(source);
+        }
+        if (Objects.nonNull(extData.getGrowthTitleId()) || Objects.nonNull(extData.getGrowthCoverId())) {
+            try {
+                pageUrl += URLEncoder.encode("&growthExtData=" + JSONObject.toJSONString(extData), "UTF-8");
+            } catch (Exception e) {
+                log.error("VideoMultiService VideoMultiService Error,data:", e);
+            }
+        }
+        return pageUrl;
+    }
+
+    @Override
+    public Long saveMultiTitle(Long videoId, String source, String title) {
+        VideoGrowthMultiTitle multiTitle = new VideoGrowthMultiTitle();
+        multiTitle.setVideoId(videoId);
+        multiTitle.setSource(source);
+        multiTitle.setTitle(title);
+        multiTitle.setCreateTimestamp(System.currentTimeMillis());
+        videoMultiMapperExt.insertVideoMultiTitleReturnId(multiTitle);
+        return multiTitle.getId();
+    }
+
+    @Override
+    public List<VideoGrowthMultiTitle> getMultiTitleByVideoId(Long videoId) {
+        VideoGrowthMultiTitleExample example = new VideoGrowthMultiTitleExample();
+        example.createCriteria().andVideoIdEqualTo(videoId);
+        return titleMapper.selectByExample(example);
+    }
+
+    @Override
+    public Long saveMultiCover(Long videoId, String source, String cover) {
+        VideoGrowthMultiCover multiCover = new VideoGrowthMultiCover();
+        multiCover.setVideoId(videoId);
+        multiCover.setSource(source);
+        multiCover.setCover(cover);
+        multiCover.setCreateTimestamp(System.currentTimeMillis());
+        videoMultiMapperExt.insertVideoMultiCoverReturnId(multiCover);
+        return multiCover.getId();
+    }
+
+    @Override
+    public List<VideoGrowthMultiCover> getMultiCoverByVideoId(Long videoId) {
+        VideoGrowthMultiCoverExample example = new VideoGrowthMultiCoverExample();
+        example.createCriteria().andVideoIdEqualTo(videoId);
+        return coverMapper.selectByExample(example);
+    }
+
+    @Override
+    public List<VideoGrowthMultiTitle> getVideoGrowthMultiTitleList(List<Long> customTitleIds) {
+        VideoGrowthMultiTitleExample example = new VideoGrowthMultiTitleExample();
+        example.createCriteria().andIdIn(customTitleIds);
+        return titleMapper.selectByExample(example);
+    }
+
+    @Override
+    public List<VideoGrowthMultiCover> getVideoGrowthMultiCoverList(List<Long> customCoverIds) {
+        VideoGrowthMultiCoverExample example = new VideoGrowthMultiCoverExample();
+        example.createCriteria().andIdIn(customCoverIds);
+        return coverMapper.selectByExample(example);
+    }
+}

+ 74 - 66
api-module/src/main/java/com/tzld/piaoquan/api/service/strategy/impl/BuckStrategyV1.java

@@ -31,7 +31,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.net.URLEncoder;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -247,81 +246,90 @@ public class BuckStrategyV1 implements ReplyStrategyService {
         if (CollectionUtils.isEmpty(smallDataCgiReplyList)) {
             return;
         }
-        for (String key : keyedSet) {
-            if ("base".equals(key)) {
-                continue;
-            }
-            List<CgiReplyBucketData> collect = smallDataCgiReplyList.stream()
-                    .filter(x -> x.getStrategy().equals(key))
-                    .filter(x -> x.getGhId().equals(bucketDataParam.getGhId()))
-                    .collect(Collectors.toList());
-            if (CollectionUtils.isEmpty(collect)) {
-                log.error("insertSmallData 算法排序数据异常,data:" + JSON.toJSONString(smallDataCgiReplyList));
-                continue;
+        // 循环获取锁,锁5s,每获取一次锁,未获取到锁,等待1s,最多等待10次
+        int tryCount = 0;
+        String LOCK_KEY = "insertSmallData:" + bucketDataParam.getGhId();
+        while (tryCount < 10) {
+            if (redisUtils.tryLock(LOCK_KEY, "1", 5)) {
+                break;
+            } else {
+                try {
+                    Thread.sleep(1000);
+                } catch (Exception e) {
+                    log.error("BuckStrategyV1 insertSmallData 尝试获取锁失败,ghId:" + bucketDataParam.getGhId() + ",tryCount:" + tryCount, e);
+                }
+                tryCount++;
             }
-            CgiReplyBucketDataExample cgiReplyBucketDataExample = new CgiReplyBucketDataExample();
-            cgiReplyBucketDataExample.createCriteria().andIsDeleteEqualTo(0).andMsgTypeEqualTo(1).andStrategyEqualTo(key).andGhIdEqualTo(bucketDataParam.getGhId());
-            List<CgiReplyBucketData> cgiReplyBucketData1 = cgiReplyBucketDataMapper.selectByExample(cgiReplyBucketDataExample);
-            Map<Long, CgiReplyBucketData> cgiReplyBucketDataMap = cgiReplyBucketData1.stream()
-                    .collect(Collectors.toMap(CgiReplyBucketData::getMiniVideoId, x -> x, (a, b) -> b));
-            // 清上个版本的策略数据
-            cgiReplyBucketDataMapperExt.updateDeleteStatus(bucketDataParam.getGhId(), key, 1, 1);
-            List<GhDetailExt> ghDetailExtList = ghDetailService.getGhDetailExtList(bucketDataParam.getGhId(), GhTypeEnum.GH.type);
-            Map<Long, GhDetailExt> ghDetailExtMap = ghDetailExtList.stream()
-                    .collect(Collectors.toMap(GhDetailExt::getVideoId, Function.identity(), (a, b) -> b));
-            // 入库
-            for (CgiReplyBucketData cgiReplyBucketData : collect) {
-                if (Objects.isNull(cgiReplyBucketData.getMiniVideoId())) {
-                    Long videoId = MessageUtil.getVideoId(cgiReplyBucketData.getMiniPagePath());
-                    cgiReplyBucketData.setMiniVideoId(videoId);
+        }
+        try {
+            for (String key : keyedSet) {
+                if ("base".equals(key)) {
+                    continue;
                 }
-                CgiReplyBucketData oldData = cgiReplyBucketDataMap.get(cgiReplyBucketData.getMiniVideoId());
-                if (Objects.isNull(oldData)) {
-                    oldData = cgiReplyBucketDataMapperExt.getOldCgiReplyData(cgiReplyBucketData.getMiniVideoId());
+                List<CgiReplyBucketData> collect = smallDataCgiReplyList.stream()
+                        .filter(x -> x.getStrategy().equals(key))
+                        .filter(x -> x.getGhId().equals(bucketDataParam.getGhId()))
+                        .collect(Collectors.toList());
+                if (CollectionUtils.isEmpty(collect)) {
+                    log.error("insertSmallData 算法排序数据异常,data:" + JSON.toJSONString(smallDataCgiReplyList));
+                    continue;
                 }
-                if (Objects.nonNull(oldData)) {
-                    if (StringUtils.isEmpty(cgiReplyBucketData.getTitle())) {
-                        cgiReplyBucketData.setTitle(oldData.getTitle());
+                CgiReplyBucketDataExample cgiReplyBucketDataExample = new CgiReplyBucketDataExample();
+                cgiReplyBucketDataExample.createCriteria().andIsDeleteEqualTo(0).andMsgTypeEqualTo(1).andStrategyEqualTo(key).andGhIdEqualTo(bucketDataParam.getGhId());
+                List<CgiReplyBucketData> cgiReplyBucketData1 = cgiReplyBucketDataMapper.selectByExample(cgiReplyBucketDataExample);
+                Map<Long, CgiReplyBucketData> cgiReplyBucketDataMap = cgiReplyBucketData1.stream()
+                        .collect(Collectors.toMap(CgiReplyBucketData::getMiniVideoId, x -> x, (a, b) -> b));
+                // 清上个版本的策略数据
+                cgiReplyBucketDataMapperExt.updateDeleteStatus(bucketDataParam.getGhId(), key, 1, 1);
+                List<GhDetailExt> ghDetailExtList = ghDetailService.getGhDetailExtList(bucketDataParam.getGhId(), GhTypeEnum.GH.type);
+                Map<Long, GhDetailExt> ghDetailExtMap = ghDetailExtList.stream()
+                        .collect(Collectors.toMap(GhDetailExt::getVideoId, Function.identity(), (a, b) -> b));
+                // 入库
+                for (CgiReplyBucketData cgiReplyBucketData : collect) {
+                    if (Objects.isNull(cgiReplyBucketData.getMiniVideoId())) {
+                        Long videoId = MessageUtil.getVideoId(cgiReplyBucketData.getMiniPagePath());
+                        cgiReplyBucketData.setMiniVideoId(videoId);
                     }
-                    if (StringUtils.isEmpty(cgiReplyBucketData.getCoverUrl())) {
-                        cgiReplyBucketData.setCoverUrl(oldData.getCoverUrl());
+                    CgiReplyBucketData oldData = cgiReplyBucketDataMap.get(cgiReplyBucketData.getMiniVideoId());
+                    if (Objects.isNull(oldData)) {
+                        oldData = cgiReplyBucketDataMapperExt.getOldCgiReplyData(cgiReplyBucketData.getMiniVideoId());
                     }
-                }
-                String pageUrl = cgiReplyBucketData.getMiniPagePath();
-                GhDetailExt ghDetailExt = ghDetailExtMap.get(cgiReplyBucketData.getMiniVideoId());
-                if (Objects.nonNull(ghDetailExt)) {
-                    try {
-                        //if (!pageUrl.contains("shareTitle")) {
-                        //    pageUrl += URLEncoder.encode("&shareTitle=" + ghDetailExt.getTitle(), "UTF-8");
-                        //}
-                        if (Objects.nonNull(ghDetailExt.getTitleId()) && !pageUrl.contains("shareTitleId")) {
-                            pageUrl += URLEncoder.encode("&shareTitleId=" + ghDetailExt.getTitleId(), "UTF-8");
+                    if (Objects.nonNull(oldData)) {
+                        if (StringUtils.isEmpty(cgiReplyBucketData.getTitle())) {
+                            cgiReplyBucketData.setTitle(oldData.getTitle());
                         }
-                        if (Objects.nonNull(ghDetailExt.getCoverId()) && !pageUrl.contains("shareImageId")) {
-                            pageUrl += URLEncoder.encode("&shareImageId=" + ghDetailExt.getCoverId(), "UTF-8");
+                        if (StringUtils.isEmpty(cgiReplyBucketData.getCoverUrl())) {
+                            cgiReplyBucketData.setCoverUrl(oldData.getCoverUrl());
                         }
-                        //if (!pageUrl.contains("shareImageUrl")) {
-                        //    pageUrl += URLEncoder.encode("&shareImageUrl=" + URLEncoder.encode(ghDetailExt.getCover(), "UTF-8"), "UTF-8");
-                        //}
-                    } catch (Exception e) {
-                        log.error("BuckStrategyV1 insertSmallData setCoverTitleId Error,data:" + JSON.toJSONString(ghDetailExt), e);
                     }
-                } else {
-                    pageUrl = videoMultiService.setVideoMultiTitleCoverPagePath(cgiReplyBucketData.getMiniVideoId(),
-                            cgiReplyBucketData.getMiniPagePath(), cgiReplyBucketData.getTitle(), cgiReplyBucketData.getCoverUrl());
+                    String pageUrl = cgiReplyBucketData.getMiniPagePath();
+                    GhDetailExt ghDetailExt = ghDetailExtMap.get(cgiReplyBucketData.getMiniVideoId());
+                    if (Objects.nonNull(ghDetailExt)) {
+                        try {
+                            pageUrl = videoMultiService.setVideoMultiTitleCoverPagePath(cgiReplyBucketData.getMiniVideoId(),
+                                    pageUrl, ghDetailExt.getTitle(), ghDetailExt.getCover());
+                        } catch (Exception e) {
+                            log.error("BuckStrategyV1 insertSmallData setCoverTitleId Error,data:" + JSON.toJSONString(ghDetailExt), e);
+                        }
+                    } else {
+                        pageUrl = videoMultiService.setVideoMultiTitleCoverPagePath(cgiReplyBucketData.getMiniVideoId(),
+                                cgiReplyBucketData.getMiniPagePath(), cgiReplyBucketData.getTitle(), cgiReplyBucketData.getCoverUrl());
+                    }
+                    cgiReplyBucketData.setMiniPagePath(pageUrl);
+                    cgiReplyBucketData.setRootSourceId(MessageUtil.getRootSourceId(cgiReplyBucketData.getMiniPagePath()));
+                    cgiReplyBucketDataMapper.insertSelective(cgiReplyBucketData);
+                    String redisKey = "auto_reply_video_detail_" + cgiReplyBucketData.getRootSourceId();
+                    VideoCharacteristicVO vo = new VideoCharacteristicVO();
+                    vo.setGhId(cgiReplyBucketData.getGhId());
+                    vo.setName(bucketDataParam.getAccountName());
+                    vo.setVideoId(cgiReplyBucketData.getMiniVideoId());
+                    vo.setTitle(cgiReplyBucketData.getTitle());
+                    vo.setCover(cgiReplyBucketData.getCoverUrl());
+                    redisUtils.set(redisKey, JSONObject.toJSONString(vo), 3L * 24 * 60 * 60);
                 }
-                cgiReplyBucketData.setMiniPagePath(pageUrl);
-                cgiReplyBucketData.setRootSourceId(MessageUtil.getRootSourceId(cgiReplyBucketData.getMiniPagePath()));
-                cgiReplyBucketDataMapper.insertSelective(cgiReplyBucketData);
-                String redisKey = "auto_reply_video_detail_" + cgiReplyBucketData.getRootSourceId();
-                VideoCharacteristicVO vo = new VideoCharacteristicVO();
-                vo.setGhId(cgiReplyBucketData.getGhId());
-                vo.setName(bucketDataParam.getAccountName());
-                vo.setVideoId(cgiReplyBucketData.getMiniVideoId());
-                vo.setTitle(cgiReplyBucketData.getTitle());
-                vo.setCover(cgiReplyBucketData.getCoverUrl());
-                redisUtils.set(redisKey, JSONObject.toJSONString(vo), 3L * 24 * 60 * 60);
             }
+        } finally {
+            redisUtils.del(LOCK_KEY);
         }
     }
 

+ 77 - 75
api-module/src/main/java/com/tzld/piaoquan/api/service/strategy/impl/ThirdPartyPushMessageStrategyV1.java

@@ -29,7 +29,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.net.URLEncoder;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -152,91 +151,94 @@ public class ThirdPartyPushMessageStrategyV1 implements ReplyStrategyService {
         if (CollectionUtils.isEmpty(smallDataCgiReplyList)) {
             return;
         }
-        for (String key : keyedSet) {
-            if ("base".equals(key)) {
-                continue;
-            }
-            List<CgiReplyBucketData> collect = smallDataCgiReplyList.stream()
-                    .filter(x -> x.getStrategy().equals(key))
-                    .filter(x -> x.getGhId().equals(bucketDataParam.getGhId()))
-                    .collect(Collectors.toList());
-            if (CollectionUtils.isEmpty(collect)) {
-                log.error("ThirdPartyPushMessageStrategyV1 insertSmallData 算法排序数据异常 ,key:" + key +
-                        ",data:" + JSON.toJSONString(smallDataCgiReplyList) + ",ghId:" + bucketDataParam.getGhId());
-                continue;
+        // 循环获取锁,锁5s,每获取一次锁,未获取到锁,等待1s,最多等待10次
+        int tryCount = 0;
+        String LOCK_KEY = "insertSmallData:" + bucketDataParam.getGhId();
+        while (tryCount < 10) {
+            if (redisUtils.tryLock(LOCK_KEY, "1", 5)) {
+                break;
+            } else {
+                try {
+                    Thread.sleep(1000);
+                } catch (Exception e) {
+                    log.error("ThirdPartyPushMessageStrategyV1 insertSmallData 尝试获取锁失败,ghId:" + bucketDataParam.getGhId() + ",tryCount:" + tryCount, e);
+                }
+                tryCount++;
             }
-            CgiReplyBucketDataExample cgiReplyBucketDataExample = new CgiReplyBucketDataExample();
-            cgiReplyBucketDataExample.createCriteria().andIsDeleteEqualTo(0).andMsgTypeEqualTo(1).andStrategyEqualTo(key).andGhIdEqualTo(bucketDataParam.getGhId());
-            List<CgiReplyBucketData> cgiReplyBucketData1 = cgiReplyBucketDataMapper.selectByExample(cgiReplyBucketDataExample);
-            Map<Long, CgiReplyBucketData> cgiReplyBucketDataMap = cgiReplyBucketData1.stream()
-                    .collect(Collectors.toMap(CgiReplyBucketData::getMiniVideoId, x -> x, (a, b) -> b));
-            // 清上个版本的策略数据
-            cgiReplyBucketDataMapperExt.updateDeleteStatus(bucketDataParam.getGhId(), key, 1, 1);
-            List<ContentPlatformGzhPlanVideo> gzhPlanVideoList = contentPlatformPlanService.getGzhPlanVideoListByCooperateAccountId(bucketDataParam.getGhId());
-            Map<Long, ContentPlatformGzhPlanVideo> gzhPlanVideoMap = gzhPlanVideoList.stream()
-                    .collect(Collectors.toMap(ContentPlatformGzhPlanVideo::getVideoId, x -> x, (a, b) -> b));
-            // 入库
-            for (CgiReplyBucketData cgiReplyBucketData : collect) {
-                if (Objects.isNull(cgiReplyBucketData.getMiniVideoId())) {
-                    Long videoId = MessageUtil.getVideoId(cgiReplyBucketData.getMiniPagePath());
-                    cgiReplyBucketData.setMiniVideoId(videoId);
+        }
+        try {
+            for (String key : keyedSet) {
+                if ("base".equals(key)) {
+                    continue;
                 }
-                CgiReplyBucketData oldData = cgiReplyBucketDataMap.get(cgiReplyBucketData.getMiniVideoId());
-                if (Objects.isNull(oldData)) {
-                    oldData = cgiReplyBucketDataMapperExt.getOldCgiReplyData(cgiReplyBucketData.getMiniVideoId());
+                List<CgiReplyBucketData> collect = smallDataCgiReplyList.stream()
+                        .filter(x -> x.getStrategy().equals(key))
+                        .filter(x -> x.getGhId().equals(bucketDataParam.getGhId()))
+                        .collect(Collectors.toList());
+                if (CollectionUtils.isEmpty(collect)) {
+                    log.error("ThirdPartyPushMessageStrategyV1 insertSmallData 算法排序数据异常 ,key:" + key +
+                            ",data:" + JSON.toJSONString(smallDataCgiReplyList) + ",ghId:" + bucketDataParam.getGhId());
+                    continue;
                 }
-                if (Objects.nonNull(oldData)) {
-                    if (StringUtils.isEmpty(cgiReplyBucketData.getTitle())) {
-                        cgiReplyBucketData.setTitle(oldData.getTitle());
+                CgiReplyBucketDataExample cgiReplyBucketDataExample = new CgiReplyBucketDataExample();
+                cgiReplyBucketDataExample.createCriteria().andIsDeleteEqualTo(0).andMsgTypeEqualTo(1).andStrategyEqualTo(key).andGhIdEqualTo(bucketDataParam.getGhId());
+                List<CgiReplyBucketData> cgiReplyBucketData1 = cgiReplyBucketDataMapper.selectByExample(cgiReplyBucketDataExample);
+                Map<Long, CgiReplyBucketData> cgiReplyBucketDataMap = cgiReplyBucketData1.stream()
+                        .collect(Collectors.toMap(CgiReplyBucketData::getMiniVideoId, x -> x, (a, b) -> b));
+                // 清上个版本的策略数据
+                cgiReplyBucketDataMapperExt.updateDeleteStatus(bucketDataParam.getGhId(), key, 1, 1);
+                List<ContentPlatformGzhPlanVideo> gzhPlanVideoList = contentPlatformPlanService.getGzhPlanVideoListByCooperateAccountId(bucketDataParam.getGhId());
+                Map<Long, ContentPlatformGzhPlanVideo> gzhPlanVideoMap = gzhPlanVideoList.stream()
+                        .collect(Collectors.toMap(ContentPlatformGzhPlanVideo::getVideoId, x -> x, (a, b) -> b));
+                // 入库
+                for (CgiReplyBucketData cgiReplyBucketData : collect) {
+                    if (Objects.isNull(cgiReplyBucketData.getMiniVideoId())) {
+                        Long videoId = MessageUtil.getVideoId(cgiReplyBucketData.getMiniPagePath());
+                        cgiReplyBucketData.setMiniVideoId(videoId);
                     }
-                    if (StringUtils.isEmpty(cgiReplyBucketData.getCoverUrl())) {
-                        cgiReplyBucketData.setCoverUrl(oldData.getCoverUrl());
+                    CgiReplyBucketData oldData = cgiReplyBucketDataMap.get(cgiReplyBucketData.getMiniVideoId());
+                    if (Objects.isNull(oldData)) {
+                        oldData = cgiReplyBucketDataMapperExt.getOldCgiReplyData(cgiReplyBucketData.getMiniVideoId());
                     }
-                }
-                ContentPlatformGzhPlanVideo gzhPlanVideo = gzhPlanVideoMap.get(cgiReplyBucketData.getMiniVideoId());
-                String pageUrl = cgiReplyBucketData.getMiniPagePath();
-                if (Objects.nonNull(gzhPlanVideo)) {
-                    try {
-                        //if (!pageUrl.contains("shareTitle")) {
-                        //    if (StringUtils.isNotBlank(gzhPlanVideo.getCustomTitle())) {
-                        //        pageUrl += URLEncoder.encode("&shareTitle=" + gzhPlanVideo.getCustomTitle(), "UTF-8");
-                        //    } else {
-                        //        pageUrl += URLEncoder.encode("&shareTitle=" + gzhPlanVideo.getTitle(), "UTF-8");
-                        //    }
-                        //}
-                        if (Objects.nonNull(gzhPlanVideo.getCustomTitleId()) && !pageUrl.contains("shareTitleId")) {
-                            pageUrl += URLEncoder.encode("&shareTitleId=" + gzhPlanVideo.getCustomTitleId(), "UTF-8");
+                    if (Objects.nonNull(oldData)) {
+                        if (StringUtils.isEmpty(cgiReplyBucketData.getTitle())) {
+                            cgiReplyBucketData.setTitle(oldData.getTitle());
                         }
-                        if (Objects.nonNull(gzhPlanVideo.getCustomCoverId()) && !pageUrl.contains("shareImageId")) {
-                            pageUrl += URLEncoder.encode("&shareImageId=" + gzhPlanVideo.getCustomCoverId(), "UTF-8");
+                        if (StringUtils.isEmpty(cgiReplyBucketData.getCoverUrl())) {
+                            cgiReplyBucketData.setCoverUrl(oldData.getCoverUrl());
                         }
-                        //if (!pageUrl.contains("shareImageUrl")) {
-                        //    if (StringUtils.isNotEmpty(gzhPlanVideo.getCustomCover())) {
-                        //        pageUrl += URLEncoder.encode("&shareImageUrl=" + URLEncoder.encode(gzhPlanVideo.getCustomCover(), "UTF-8"), "UTF-8");
-                        //    } else {
-                        //        pageUrl += URLEncoder.encode("&shareImageUrl=" + URLEncoder.encode(gzhPlanVideo.getCover(), "UTF-8"), "UTF-8");
-                        //    }
-                        //}
+                    }
+                    ContentPlatformGzhPlanVideo gzhPlanVideo = gzhPlanVideoMap.get(cgiReplyBucketData.getMiniVideoId());
+                    String pageUrl = cgiReplyBucketData.getMiniPagePath();
+                    if (Objects.nonNull(gzhPlanVideo)) {
+                        try {
+                            String title = StringUtils.isNotBlank(gzhPlanVideo.getCustomTitle()) ? gzhPlanVideo.getCustomTitle() : gzhPlanVideo.getTitle();
+                            String coverUrl = StringUtils.isNotBlank(gzhPlanVideo.getCustomCover()) ? gzhPlanVideo.getCustomCover() : gzhPlanVideo.getCover();
+                            pageUrl = videoMultiService.setVideoMultiTitleCoverPagePath(cgiReplyBucketData.getMiniVideoId(),
+                                    pageUrl, title, coverUrl);
+                            cgiReplyBucketData.setMiniPagePath(pageUrl);
+                        } catch (Exception e) {
+                            log.error("ThirdPartyPushMessageStrategyV1 insertSmallData setCustomerCoverTitleId Error,data:" + JSON.toJSONString(gzhPlanVideo), e);
+                        }
+                    } else {
+                        pageUrl = videoMultiService.setVideoMultiTitleCoverPagePath(cgiReplyBucketData.getMiniVideoId(),
+                                pageUrl, cgiReplyBucketData.getTitle(), cgiReplyBucketData.getCoverUrl());
                         cgiReplyBucketData.setMiniPagePath(pageUrl);
-                    } catch (Exception e) {
-                        log.error("ThirdPartyPushMessageStrategyV1 insertSmallData setCustomerCoverTitleId Error,data:" + JSON.toJSONString(gzhPlanVideo), e);
                     }
-                } else {
-                    pageUrl = videoMultiService.setVideoMultiTitleCoverPagePath(cgiReplyBucketData.getMiniVideoId(),
-                            pageUrl, cgiReplyBucketData.getTitle(), cgiReplyBucketData.getCoverUrl());
-                    cgiReplyBucketData.setMiniPagePath(pageUrl);
+                    cgiReplyBucketData.setRootSourceId(MessageUtil.getRootSourceId(cgiReplyBucketData.getMiniPagePath()));
+                    cgiReplyBucketDataMapper.insertSelective(cgiReplyBucketData);
+                    String redisKey = "auto_reply_video_detail_" + cgiReplyBucketData.getRootSourceId();
+                    VideoCharacteristicVO vo = new VideoCharacteristicVO();
+                    vo.setGhId(cgiReplyBucketData.getGhId());
+                    vo.setName(bucketDataParam.getAccountName());
+                    vo.setVideoId(cgiReplyBucketData.getMiniVideoId());
+                    vo.setTitle(cgiReplyBucketData.getTitle());
+                    vo.setCover(cgiReplyBucketData.getCoverUrl());
+                    redisUtils.set(redisKey, JSONObject.toJSONString(vo), 3L * 24 * 60 * 60);
                 }
-                cgiReplyBucketData.setRootSourceId(MessageUtil.getRootSourceId(cgiReplyBucketData.getMiniPagePath()));
-                cgiReplyBucketDataMapper.insertSelective(cgiReplyBucketData);
-                String redisKey = "auto_reply_video_detail_" + cgiReplyBucketData.getRootSourceId();
-                VideoCharacteristicVO vo = new VideoCharacteristicVO();
-                vo.setGhId(cgiReplyBucketData.getGhId());
-                vo.setName(bucketDataParam.getAccountName());
-                vo.setVideoId(cgiReplyBucketData.getMiniVideoId());
-                vo.setTitle(cgiReplyBucketData.getTitle());
-                vo.setCover(cgiReplyBucketData.getCoverUrl());
-                redisUtils.set(redisKey, JSONObject.toJSONString(vo), 3L * 24 * 60 * 60);
             }
+        } finally {
+            redisUtils.del(LOCK_KEY);
         }
     }
 

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/ThirdPartyService.java

@@ -1,7 +1,7 @@
 package com.tzld.piaoquan.api.service.wecom;
 
 
-import com.tzld.piaoquan.api.model.vo.PushMessageParam;
+import com.tzld.piaoquan.api.model.param.PushMessageParam;
 import com.tzld.piaoquan.api.model.vo.PushMessageVo;
 import com.tzld.piaoquan.api.model.vo.ReportUvVo;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/WeComService.java

@@ -2,7 +2,7 @@ package com.tzld.piaoquan.api.service.wecom;
 
 
 import com.tzld.piaoquan.api.model.po.ReplyStaff;
-import com.tzld.piaoquan.api.model.vo.WeComPushMessageParam;
+import com.tzld.piaoquan.api.model.param.WeComPushMessageParam;
 import com.tzld.piaoquan.api.model.vo.WeComPushMessageVo;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
 

+ 15 - 10
api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/impl/ThirdPartyServiceImpl.java

@@ -2,11 +2,13 @@ package com.tzld.piaoquan.api.service.wecom.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
-import com.aliyun.odps.data.Record;
 import com.tzld.piaoquan.api.common.enums.ReplyStrategyServiceEnum;
+import com.tzld.piaoquan.api.dao.mapper.GzhAutoreplyBehaviorUvTotalMapper;
 import com.tzld.piaoquan.api.model.bo.*;
+import com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotal;
+import com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotalExample;
 import com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformAccount;
-import com.tzld.piaoquan.api.model.vo.PushMessageParam;
+import com.tzld.piaoquan.api.model.param.PushMessageParam;
 import com.tzld.piaoquan.api.model.vo.PushMessageVo;
 import com.tzld.piaoquan.api.model.vo.ReportUvVo;
 import com.tzld.piaoquan.api.service.GhAccessTokenService;
@@ -56,6 +58,9 @@ public class ThirdPartyServiceImpl implements ThirdPartyService {
     @Autowired
     private GhDetailMapper ghDetailMapper;
 
+    @Autowired
+    private GzhAutoreplyBehaviorUvTotalMapper gzhAutoreplyBehaviorUvTotalMapper;
+
     private static final String canViewReportDate = "2024-10-31";
 
     private Map<String, ReplyStrategyService> strategyServiceMap;
@@ -149,18 +154,18 @@ public class ThirdPartyServiceImpl implements ThirdPartyService {
         if (targetTime > limitTime) {
             return CommonResponse.create(500, "数据不存在");
         }
-        String dt = date.replace("-", "").substring(0, 8);
-        String sql = String.format("SELECT * FROM gzh_autoreply_behavior_uv_total WHERE dt = %s AND 合作方 = '%s';",
-                dt, desc);
         List<ReportUvVo> res = new ArrayList<>();
-        List<Record> recordList = odpsManager.query(sql);
-        if (CollectionUtils.isEmpty(recordList)) {
+        String dt = date.replace("-", "").substring(0, 8);
+        GzhAutoreplyBehaviorUvTotalExample example = new GzhAutoreplyBehaviorUvTotalExample();
+        example.createCriteria().andDtEqualTo(dt).andChannelEqualTo(desc);
+        List<GzhAutoreplyBehaviorUvTotal> list = gzhAutoreplyBehaviorUvTotalMapper.selectByExample(example);
+        if (CollectionUtils.isEmpty(list)) {
             return CommonResponse.success(res);
         }
-        for (Record record : recordList) {
+        for (GzhAutoreplyBehaviorUvTotal record : list) {
             ReportUvVo reportUvVo = new ReportUvVo();
-            reportUvVo.setGhId(record.getString(1));
-            reportUvVo.setUv(record.getBigint(3));
+            reportUvVo.setGhId(record.getGhId());
+            reportUvVo.setUv(Long.valueOf(record.getFirstLevel()));
             res.add(reportUvVo);
         }
         return CommonResponse.success(res);

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/impl/WeComServiceImpl.java

@@ -12,7 +12,7 @@ import com.tzld.piaoquan.api.model.bo.MsgData;
 import com.tzld.piaoquan.api.model.bo.ReplyBucketData;
 import com.tzld.piaoquan.api.model.po.ReplyStaff;
 import com.tzld.piaoquan.api.model.po.ReplyStaffExample;
-import com.tzld.piaoquan.api.model.vo.WeComPushMessageParam;
+import com.tzld.piaoquan.api.model.param.WeComPushMessageParam;
 import com.tzld.piaoquan.api.model.vo.WeComPushMessageVo;
 import com.tzld.piaoquan.api.service.wecom.WeComService;
 import com.tzld.piaoquan.api.service.strategy.ReplyStrategyService;

+ 6 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/thirdparty/impl/WeComThirdPartyServiceImpl.java

@@ -617,6 +617,12 @@ public class WeComThirdPartyServiceImpl implements WeComThirdPartyService {
         List<ThirdPartWeComStaff> staffList = thirdPartWeComStaffMapper.selectByExample(example);
         if (CollectionUtils.isNotEmpty(staffList)) {
             for (ThirdPartWeComStaff staff : staffList) {
+                InitRequest initRequest = new InitRequest();
+                initRequest.setVid(String.valueOf(staff.getThirdStaffId()));
+                initRequest.setProxySituation(0);
+                initRequest.setDeverType("ipad");
+                apiClient.init(initRequest);
+                apiClient.setCallbackUrl(new SetCallbackUrlRequest(staff.getThirdUuid(), callbackUrl));
                 UuidRequest uuidRequest = new UuidRequest();
                 uuidRequest.setUuid(staff.getThirdUuid());
                 apiClient.automaticLogin(uuidRequest);

+ 12 - 0
api-module/src/main/resources/mapper/GhDetailMapperExt.xml

@@ -30,4 +30,16 @@
           and gde.is_delete = 0
     </select>
 
+    <delete id="deleteGzhAutoreplyBehaviorUvTotal">
+        delete from gzh_autoreply_behavior_uv_total where dt = #{dt}
+    </delete>
+
+    <insert id="batchInsertGzhAutoreplyBehaviorUvTotal">
+        insert into gzh_autoreply_behavior_uv_total (dt, channel, gh_id, uv, first_level, create_timestamp)
+        values
+        <foreach collection="records" item="item" separator=",">
+            (#{item.dt}, #{item.channel}, #{item.ghId}, #{item.uv}, #{item.firstLevel}, #{item.createTimestamp})
+        </foreach>
+    </insert>
+
 </mapper>

+ 246 - 0
api-module/src/main/resources/mapper/GzhAutoreplyBehaviorUvTotalMapper.xml

@@ -0,0 +1,246 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.tzld.piaoquan.api.dao.mapper.GzhAutoreplyBehaviorUvTotalMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotal">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="dt" jdbcType="VARCHAR" property="dt" />
+    <result column="channel" jdbcType="VARCHAR" property="channel" />
+    <result column="gh_id" jdbcType="VARCHAR" property="ghId" />
+    <result column="uv" jdbcType="INTEGER" property="uv" />
+    <result column="first_level" jdbcType="INTEGER" property="firstLevel" />
+    <result column="create_timestamp" jdbcType="BIGINT" property="createTimestamp" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, dt, channel, gh_id, uv, first_level, create_timestamp
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotalExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from gzh_autoreply_behavior_uv_total
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+    <if test="page != null">
+      limit #{page.offset} , #{page.pageSize}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from gzh_autoreply_behavior_uv_total
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from gzh_autoreply_behavior_uv_total
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotalExample">
+    delete from gzh_autoreply_behavior_uv_total
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotal">
+    insert into gzh_autoreply_behavior_uv_total (id, dt, channel, 
+      gh_id, uv, first_level, 
+      create_timestamp)
+    values (#{id,jdbcType=BIGINT}, #{dt,jdbcType=VARCHAR}, #{channel,jdbcType=VARCHAR}, 
+      #{ghId,jdbcType=VARCHAR}, #{uv,jdbcType=INTEGER}, #{firstLevel,jdbcType=INTEGER}, 
+      #{createTimestamp,jdbcType=BIGINT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotal">
+    insert into gzh_autoreply_behavior_uv_total
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="dt != null">
+        dt,
+      </if>
+      <if test="channel != null">
+        channel,
+      </if>
+      <if test="ghId != null">
+        gh_id,
+      </if>
+      <if test="uv != null">
+        uv,
+      </if>
+      <if test="firstLevel != null">
+        first_level,
+      </if>
+      <if test="createTimestamp != null">
+        create_timestamp,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="dt != null">
+        #{dt,jdbcType=VARCHAR},
+      </if>
+      <if test="channel != null">
+        #{channel,jdbcType=VARCHAR},
+      </if>
+      <if test="ghId != null">
+        #{ghId,jdbcType=VARCHAR},
+      </if>
+      <if test="uv != null">
+        #{uv,jdbcType=INTEGER},
+      </if>
+      <if test="firstLevel != null">
+        #{firstLevel,jdbcType=INTEGER},
+      </if>
+      <if test="createTimestamp != null">
+        #{createTimestamp,jdbcType=BIGINT},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotalExample" resultType="java.lang.Long">
+    select count(*) from gzh_autoreply_behavior_uv_total
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update gzh_autoreply_behavior_uv_total
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.dt != null">
+        dt = #{record.dt,jdbcType=VARCHAR},
+      </if>
+      <if test="record.channel != null">
+        channel = #{record.channel,jdbcType=VARCHAR},
+      </if>
+      <if test="record.ghId != null">
+        gh_id = #{record.ghId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.uv != null">
+        uv = #{record.uv,jdbcType=INTEGER},
+      </if>
+      <if test="record.firstLevel != null">
+        first_level = #{record.firstLevel,jdbcType=INTEGER},
+      </if>
+      <if test="record.createTimestamp != null">
+        create_timestamp = #{record.createTimestamp,jdbcType=BIGINT},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update gzh_autoreply_behavior_uv_total
+    set id = #{record.id,jdbcType=BIGINT},
+      dt = #{record.dt,jdbcType=VARCHAR},
+      channel = #{record.channel,jdbcType=VARCHAR},
+      gh_id = #{record.ghId,jdbcType=VARCHAR},
+      uv = #{record.uv,jdbcType=INTEGER},
+      first_level = #{record.firstLevel,jdbcType=INTEGER},
+      create_timestamp = #{record.createTimestamp,jdbcType=BIGINT}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotal">
+    update gzh_autoreply_behavior_uv_total
+    <set>
+      <if test="dt != null">
+        dt = #{dt,jdbcType=VARCHAR},
+      </if>
+      <if test="channel != null">
+        channel = #{channel,jdbcType=VARCHAR},
+      </if>
+      <if test="ghId != null">
+        gh_id = #{ghId,jdbcType=VARCHAR},
+      </if>
+      <if test="uv != null">
+        uv = #{uv,jdbcType=INTEGER},
+      </if>
+      <if test="firstLevel != null">
+        first_level = #{firstLevel,jdbcType=INTEGER},
+      </if>
+      <if test="createTimestamp != null">
+        create_timestamp = #{createTimestamp,jdbcType=BIGINT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.piaoquan.api.model.po.GzhAutoreplyBehaviorUvTotal">
+    update gzh_autoreply_behavior_uv_total
+    set dt = #{dt,jdbcType=VARCHAR},
+      channel = #{channel,jdbcType=VARCHAR},
+      gh_id = #{ghId,jdbcType=VARCHAR},
+      uv = #{uv,jdbcType=INTEGER},
+      first_level = #{firstLevel,jdbcType=INTEGER},
+      create_timestamp = #{createTimestamp,jdbcType=BIGINT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>

+ 214 - 0
api-module/src/main/resources/mapper/contentplatform/VideoGrowthMultiCoverMapper.xml

@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.tzld.piaoquan.api.dao.mapper.contentplatform.VideoGrowthMultiCoverMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCover">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="video_id" jdbcType="BIGINT" property="videoId" />
+    <result column="source" jdbcType="VARCHAR" property="source" />
+    <result column="cover" jdbcType="VARCHAR" property="cover" />
+    <result column="create_timestamp" jdbcType="BIGINT" property="createTimestamp" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, video_id, `source`, cover, create_timestamp
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCoverExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from video_growth_multi_cover
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+    <if test="page != null">
+      limit #{page.offset} , #{page.pageSize}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from video_growth_multi_cover
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from video_growth_multi_cover
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCoverExample">
+    delete from video_growth_multi_cover
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCover">
+    insert into video_growth_multi_cover (id, video_id, `source`, 
+      cover, create_timestamp)
+    values (#{id,jdbcType=BIGINT}, #{videoId,jdbcType=BIGINT}, #{source,jdbcType=VARCHAR}, 
+      #{cover,jdbcType=VARCHAR}, #{createTimestamp,jdbcType=BIGINT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCover">
+    insert into video_growth_multi_cover
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="videoId != null">
+        video_id,
+      </if>
+      <if test="source != null">
+        `source`,
+      </if>
+      <if test="cover != null">
+        cover,
+      </if>
+      <if test="createTimestamp != null">
+        create_timestamp,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="videoId != null">
+        #{videoId,jdbcType=BIGINT},
+      </if>
+      <if test="source != null">
+        #{source,jdbcType=VARCHAR},
+      </if>
+      <if test="cover != null">
+        #{cover,jdbcType=VARCHAR},
+      </if>
+      <if test="createTimestamp != null">
+        #{createTimestamp,jdbcType=BIGINT},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCoverExample" resultType="java.lang.Long">
+    select count(*) from video_growth_multi_cover
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update video_growth_multi_cover
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.videoId != null">
+        video_id = #{record.videoId,jdbcType=BIGINT},
+      </if>
+      <if test="record.source != null">
+        `source` = #{record.source,jdbcType=VARCHAR},
+      </if>
+      <if test="record.cover != null">
+        cover = #{record.cover,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createTimestamp != null">
+        create_timestamp = #{record.createTimestamp,jdbcType=BIGINT},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update video_growth_multi_cover
+    set id = #{record.id,jdbcType=BIGINT},
+      video_id = #{record.videoId,jdbcType=BIGINT},
+      `source` = #{record.source,jdbcType=VARCHAR},
+      cover = #{record.cover,jdbcType=VARCHAR},
+      create_timestamp = #{record.createTimestamp,jdbcType=BIGINT}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCover">
+    update video_growth_multi_cover
+    <set>
+      <if test="videoId != null">
+        video_id = #{videoId,jdbcType=BIGINT},
+      </if>
+      <if test="source != null">
+        `source` = #{source,jdbcType=VARCHAR},
+      </if>
+      <if test="cover != null">
+        cover = #{cover,jdbcType=VARCHAR},
+      </if>
+      <if test="createTimestamp != null">
+        create_timestamp = #{createTimestamp,jdbcType=BIGINT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiCover">
+    update video_growth_multi_cover
+    set video_id = #{videoId,jdbcType=BIGINT},
+      `source` = #{source,jdbcType=VARCHAR},
+      cover = #{cover,jdbcType=VARCHAR},
+      create_timestamp = #{createTimestamp,jdbcType=BIGINT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>

+ 214 - 0
api-module/src/main/resources/mapper/contentplatform/VideoGrowthMultiTitleMapper.xml

@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.tzld.piaoquan.api.dao.mapper.contentplatform.VideoGrowthMultiTitleMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitle">
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="video_id" jdbcType="BIGINT" property="videoId" />
+    <result column="source" jdbcType="VARCHAR" property="source" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="create_timestamp" jdbcType="BIGINT" property="createTimestamp" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, video_id, `source`, title, create_timestamp
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitleExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from video_growth_multi_title
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+    <if test="page != null">
+      limit #{page.offset} , #{page.pageSize}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from video_growth_multi_title
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from video_growth_multi_title
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitleExample">
+    delete from video_growth_multi_title
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitle">
+    insert into video_growth_multi_title (id, video_id, `source`, 
+      title, create_timestamp)
+    values (#{id,jdbcType=BIGINT}, #{videoId,jdbcType=BIGINT}, #{source,jdbcType=VARCHAR}, 
+      #{title,jdbcType=VARCHAR}, #{createTimestamp,jdbcType=BIGINT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitle">
+    insert into video_growth_multi_title
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="videoId != null">
+        video_id,
+      </if>
+      <if test="source != null">
+        `source`,
+      </if>
+      <if test="title != null">
+        title,
+      </if>
+      <if test="createTimestamp != null">
+        create_timestamp,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="videoId != null">
+        #{videoId,jdbcType=BIGINT},
+      </if>
+      <if test="source != null">
+        #{source,jdbcType=VARCHAR},
+      </if>
+      <if test="title != null">
+        #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="createTimestamp != null">
+        #{createTimestamp,jdbcType=BIGINT},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitleExample" resultType="java.lang.Long">
+    select count(*) from video_growth_multi_title
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update video_growth_multi_title
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.videoId != null">
+        video_id = #{record.videoId,jdbcType=BIGINT},
+      </if>
+      <if test="record.source != null">
+        `source` = #{record.source,jdbcType=VARCHAR},
+      </if>
+      <if test="record.title != null">
+        title = #{record.title,jdbcType=VARCHAR},
+      </if>
+      <if test="record.createTimestamp != null">
+        create_timestamp = #{record.createTimestamp,jdbcType=BIGINT},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update video_growth_multi_title
+    set id = #{record.id,jdbcType=BIGINT},
+      video_id = #{record.videoId,jdbcType=BIGINT},
+      `source` = #{record.source,jdbcType=VARCHAR},
+      title = #{record.title,jdbcType=VARCHAR},
+      create_timestamp = #{record.createTimestamp,jdbcType=BIGINT}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitle">
+    update video_growth_multi_title
+    <set>
+      <if test="videoId != null">
+        video_id = #{videoId,jdbcType=BIGINT},
+      </if>
+      <if test="source != null">
+        `source` = #{source,jdbcType=VARCHAR},
+      </if>
+      <if test="title != null">
+        title = #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="createTimestamp != null">
+        create_timestamp = #{createTimestamp,jdbcType=BIGINT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.VideoGrowthMultiTitle">
+    update video_growth_multi_title
+    set video_id = #{videoId,jdbcType=BIGINT},
+      `source` = #{source,jdbcType=VARCHAR},
+      title = #{title,jdbcType=VARCHAR},
+      create_timestamp = #{createTimestamp,jdbcType=BIGINT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>

+ 15 - 0
api-module/src/main/resources/mapper/contentplatform/ext/VideoMultiMapperExt.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.tzld.piaoquan.api.dao.mapper.contentplatform.ext.VideoMultiMapperExt">
+
+    <insert id="insertVideoMultiTitleReturnId" useGeneratedKeys="true" keyProperty="id">
+        insert into video_growth_multi_title (video_id, `source`, title, create_timestamp)
+        values (#{record.videoId}, #{record.source}, #{record.title}, #{record.createTimestamp})
+    </insert>
+
+    <insert id="insertVideoMultiCoverReturnId" useGeneratedKeys="true" keyProperty="id">
+        insert into video_growth_multi_cover (video_id, `source`, cover, create_timestamp)
+        values (#{record.videoId}, #{record.source}, #{record.cover}, #{record.createTimestamp})
+    </insert>
+
+</mapper>

+ 2 - 1
api-module/src/main/resources/mybatis-api-generator-config.xml

@@ -59,7 +59,8 @@
 <!--        <table tableName="we_com_send_msg_result" domainObjectName="SendMsgResult" alias=""/>-->
 <!--        <table tableName="we_com_corp" domainObjectName="Corp" alias=""/>-->
 <!--        <table tableName="workwx_auto_reply_msg_send_record" domainObjectName="AutoReplyMsgSendRecord" alias=""/>-->
-        <table tableName="gh_detail_ext" domainObjectName="GhDetailExt" alias=""/>
+<!--        <table tableName="gh_detail_ext" domainObjectName="GhDetailExt" alias=""/>-->
+        <table tableName="gzh_autoreply_behavior_uv_total" domainObjectName="GzhAutoreplyBehaviorUvTotal" alias=""/>
 
 
     </context>

+ 9 - 8
api-module/src/main/resources/mybatis-generator-config.xml

@@ -27,7 +27,7 @@
         </commentGenerator>
 
         <jdbcConnection driverClass="com.mysql.jdbc.Driver"
-                        connectionURL="jdbc:mysql://rm-bp17q95335a99272b.mysql.rds.aliyuncs.com:3306/growth?useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull&amp;useSSL=false"
+                        connectionURL="jdbc:mysql://rm-bp17q95335a99272b.mysql.rds.aliyuncs.com:3306/growth-test?useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull&amp;useSSL=false"
                         userId="crawler" password="crawler123456@">
         </jdbcConnection>
 
@@ -35,18 +35,18 @@
             <property name="forceBigDecimals" value="false"/>
         </javaTypeResolver>
 
-        <javaModelGenerator targetPackage="com.tzld.piaoquan.growth.common.model.po" targetProject="/Users/shimeng/Desktop/project/growth-manager/common-module/src/main/java">
+        <javaModelGenerator targetPackage="com.tzld.piaoquan.api.model.po.contentplatform" targetProject="api-module/src/main/java">
             <property name="constructorBased" value="false"/>
             <property name="enableSubPackages" value="true"/>
             <property name="immutable" value="false"/>
         </javaModelGenerator>
 
-        <sqlMapGenerator targetPackage="mapper" targetProject="/Users/shimeng/Desktop/project/growth-manager/common-module/src/main/resources">
+        <sqlMapGenerator targetPackage="mapper.contentplatform" targetProject="api-module/src/main/resources">
             <property name="enableSubPackages" value="true"/>
         </sqlMapGenerator>
 
-        <javaClientGenerator targetPackage="com.tzld.piaoquan.growth.common.dao.mapper" type="XMLMAPPER"
-                             targetProject="/Users/shimeng/Desktop/project/growth-manager/common-module/src/main/java">
+        <javaClientGenerator targetPackage="com.tzld.piaoquan.api.dao.mapper.contentplatform" type="XMLMAPPER"
+                             targetProject="api-module/src/main/java">
             <property name="enableSubPackages" value="true"/>
         </javaClientGenerator>
 
@@ -63,9 +63,10 @@
 <!--        <table tableName="we_com_moment_send_message" domainObjectName="MomentSendMessage" alias=""/>-->
 <!--        <table tableName="we_com_staff_with_user" domainObjectName="StaffWithUser" alias=""/>-->
 <!--        <table tableName="we_com_corp_statistics_total" domainObjectName="CorpStatisticsTotal" alias=""/>-->
-        <table tableName="we_com_staff_statistics_total" domainObjectName="StaffStatisticsTotal" alias=""/>
-        <table tableName="we_com_staff_group_statistics_total" domainObjectName="StaffGroupStatisticsTotal" alias=""/>
-
+<!--        <table tableName="we_com_staff_statistics_total" domainObjectName="StaffStatisticsTotal" alias=""/>-->
+<!--        <table tableName="we_com_staff_group_statistics_total" domainObjectName="StaffGroupStatisticsTotal" alias=""/>-->
+        <table tableName="video_growth_multi_cover" domainObjectName="VideoGrowthMultiCover" alias=""/>
+        <table tableName="video_growth_multi_title" domainObjectName="VideoGrowthMultiTitle" alias=""/>
 
     </context>
 

+ 28 - 0
api-module/src/test/java/com/tzld/piaoquan/api/ContentPlatformTest.java

@@ -2,9 +2,11 @@ package com.tzld.piaoquan.api;
 
 import com.aliyun.openservices.shade.com.google.common.collect.Sets;
 import com.tzld.piaoquan.api.dao.mapper.contentplatform.ContentPlatformAccountMapper;
+import com.tzld.piaoquan.api.dao.mapper.contentplatform.ContentPlatformIllegalMsgMapper;
 import com.tzld.piaoquan.api.job.contentplatform.ContentPlatformDatastatJob;
 import com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformAccount;
 import com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformAccountExample;
+import com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformIllegalMsg;
 import com.tzld.piaoquan.growth.common.model.bo.VideoDetail;
 import com.tzld.piaoquan.growth.common.service.MessageAttachmentService;
 import com.tzld.piaoquan.growth.common.utils.DateUtil;
@@ -30,6 +32,8 @@ public class ContentPlatformTest {
     MessageAttachmentService messageAttachmentService;
     @Autowired
     ContentPlatformAccountMapper accountMapper;
+    @Autowired
+    private ContentPlatformIllegalMsgMapper contentPlatformIllegalMsgMapper;
 
     @Test
     public void testSyncContentPlatformQwDatastatReplyTotalJob() {
@@ -89,4 +93,28 @@ public class ContentPlatformTest {
         return matcher.replaceAll("$1" + newValue);
     }
 
+    @Test
+    public void sendIllegalMsg() {
+        List<String> channels = Arrays.asList("yy","yygz","ls","xs","zqh","cy","qs","bh","jxyy","yqst","sw","sxzq","bz","gzdd","gzbb","gzxts","gzyhc","gzlq","wxm","hc","hzrf","ywlx","zc","hzqf","qd","zh","pj","szhx","zzws","llf","shx","lq","zzbf","xsy","ml","xmayd","wx","hnld","gzash","xf","jyxx","htlz","hzlcz","gzyd");
+        ContentPlatformAccountExample example = new ContentPlatformAccountExample();
+        example.createCriteria().andChannelIn(channels);
+        List<ContentPlatformAccount> accountList = accountMapper.selectByExample(example);
+        for (ContentPlatformAccount contentPlatformAccount : accountList) {
+            ContentPlatformIllegalMsg msg = new ContentPlatformIllegalMsg();
+            msg.setAccountId(contentPlatformAccount.getId());
+            msg.setStatus(0);
+            msg.setIllegalTitle("平台【本渠道裂变率】概念调整通知");
+            msg.setIllegalContent("尊敬的用户:\n" +
+                    "\n" +
+                    "为优化体验、规范信息传递,平台将公众号-自动回复的【本渠道裂变率】调整为【本渠道质量分】。新字段整合裂变、arpu等维度的效率数值,综合反映渠道质量表现。\n" +
+                    "\n" +
+                    "本次调整于2026年1月8日正式生效,不影响用户核心权益。如有疑问,可联系商务反馈。\n" +
+                    "\n" +
+                    "2026年1月8日");
+            msg.setCreateTimestamp(System.currentTimeMillis());
+            msg.setUpdateTimestamp(System.currentTimeMillis());
+            contentPlatformIllegalMsgMapper.insertSelective(msg);
+        }
+    }
+
 }

+ 1 - 4
offline-module/src/main/java/com/tzld/piaoquan/offline/job/WeComUserDataJob.java

@@ -8,8 +8,6 @@ import com.tzld.piaoquan.growth.common.dao.mapper.*;
 import com.tzld.piaoquan.growth.common.model.bo.XxlJobParam;
 import com.tzld.piaoquan.growth.common.model.po.*;
 import com.tzld.piaoquan.growth.common.service.WeComAccessTokenService;
-import com.tzld.piaoquan.growth.common.service.WeComSendService;
-import com.tzld.piaoquan.growth.common.service.WeComStaffService;
 import com.tzld.piaoquan.growth.common.service.WeComUserService;
 import com.tzld.piaoquan.growth.common.utils.DateUtil;
 import com.tzld.piaoquan.growth.common.utils.LarkRobotUtil;
@@ -23,7 +21,6 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -315,7 +312,7 @@ public class WeComUserDataJob {
                 JSONObject jsonObject = JSONObject.parseObject(res);
                 Integer errCode = jsonObject.getInteger("errcode");
                 if (errCode != 0) {
-                    log.error("getUserList error carrierId={} cursor={}", staff.getCarrierId(), cursor);
+                    //log.error("getUserList error carrierId={} cursor={}", staff.getCarrierId(), cursor);
                     return null;
                 }
                 JSONArray externalContactList = jsonObject.getJSONArray("external_contact_list");