wangyunpeng 7 місяців тому
батько
коміт
6d8e072102
16 змінених файлів з 325 додано та 27 видалено
  1. 1 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/common/enums/StatusEnum.java
  2. 8 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/mapper/aigc/AigcBaseMapper.java
  3. 28 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/dto/PublishContentMiniprogramDTO.java
  4. 14 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/dto/PublishGzhPushContentRelDTO.java
  5. 25 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/dto/PublishGzhPushDTO.java
  6. 11 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/dto/RequestResult.java
  7. 4 1
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/entity/longArticle/LongArticleAuditDelete.java
  8. 0 3
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/entity/longArticle/LongArticleVideoAudit.java
  9. 66 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/remote/WxArticleDeleteService.java
  10. 2 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/aigc/PublishAccountRepository.java
  11. 12 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/longArticle/LongArticleAuditDeleteRepository.java
  12. 2 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/longArticle/LongArticleCrawlerVideoRepository.java
  13. 10 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/longArticle/LongArticleVideoAuditRepository.java
  14. 2 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/longArticle/LongArticlesMatchVideoRepository.java
  15. 108 23
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/ArticleAuditService.java
  16. 32 0
      long-article-recommend-service/src/main/resources/mapper/aigc/AigcBaseMapper.xml

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

@@ -7,6 +7,7 @@ public enum StatusEnum {
 
     ZERO(0, "0"),
     ONE(1, "1"),
+    TWO(2, "2"),
     ;
 
     private int code;

+ 8 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/mapper/aigc/AigcBaseMapper.java

@@ -42,4 +42,12 @@ public interface AigcBaseMapper {
     List<ProducePlanExeRecord> getAllByProducePlanId(List<String> producePlanIds);
 
     List<PublishPlanAccountNotifyDTO> checkPublishPlanAccount();
+
+    List<PublishContentMiniprogramDTO> getPublishContentByTraceIdIn(List<String> traceIds);
+
+    List<PublishGzhPushContentRelDTO> getPushContentRelByPublishContentIdIn(List<String> publishContentIds);
+
+    List<PublishGzhPushDTO> getPushByPushIdIn(List<String> pushIds);
+
+    List<PublishGzhPushContentRelDTO> getGroupPushRelByPushIdIn(List<String> pushIds);
 }

+ 28 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/dto/PublishContentMiniprogramDTO.java

@@ -0,0 +1,28 @@
+package com.tzld.longarticle.recommend.server.model.dto;
+
+import lombok.Data;
+
+@Data
+public class PublishContentMiniprogramDTO {
+    private Long id;
+    private String publishContentId;
+    private String rootShareId;
+    private String source;
+    private Integer bizType;
+    private String programId;
+    private String programName;
+    private String programAvatar;
+    private String productionCover;
+    private String productionName;
+    private String productionPath;
+    private String videoUrl;
+    private Integer hideFlag;
+    private Integer status;
+    private String traceId;
+    private String errorMsg;
+    private String version;
+    private Integer miniprogramUseType;
+    private Long createTimestamp;
+    private Long updateTimestamp;
+    private String resultData;
+}

+ 14 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/dto/PublishGzhPushContentRelDTO.java

@@ -0,0 +1,14 @@
+package com.tzld.longarticle.recommend.server.model.dto;
+
+import lombok.Data;
+
+@Data
+public class PublishGzhPushContentRelDTO {
+
+    private Long id;
+    private String pushId;
+    private String planId;
+    private String publishContentId;
+    private String userGroupId;
+
+}

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

@@ -0,0 +1,25 @@
+package com.tzld.longarticle.recommend.server.model.dto;
+
+import lombok.Data;
+
+@Data
+public class PublishGzhPushDTO {
+    private String pushId;
+    private String planId;
+    private Integer pushType;
+    private String publishAccountId;
+    private Integer pushStatus;
+    private Integer publishStatus;
+    private String errorCode;
+    private String errorMsg;
+    private Integer pushRetryCount;
+    private Long pushRetryTimestamp;
+    private Integer publishRetryCount;
+    private Long publishRetryTimestamp;
+    private String draftMediaId;
+    private Long draftCreateTime;
+    private String groupPushMsgId;
+    private String robopostId;
+    private Long pushScheduleTimestamp;
+    private Long pushFinishTimestamp;
+}

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

@@ -0,0 +1,11 @@
+package com.tzld.longarticle.recommend.server.model.dto;
+
+import lombok.Data;
+
+@Data
+public class RequestResult<T> {
+    private boolean success;
+    private T response;
+    private String failReason;
+    private String responseStr;
+}

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

@@ -15,7 +15,7 @@ public class LongArticleAuditDelete {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id")
-    private Integer id;
+    private Long id;
 
     @Column(name = "gh_id")
     private String ghId;
@@ -29,6 +29,9 @@ public class LongArticleAuditDelete {
     @Column(name = "status")
     private Integer status;
 
+    @Column(name = "fail_reason")
+    private String failReason;
+
     @Column(name = "create_timestamp")
     private Long createTimestamp;
 

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

@@ -26,9 +26,6 @@ public class LongArticleVideoAudit {
     @Column(name = "oss_path")
     private String ossPath;
 
-    @Column(name = "index")
-    private Integer index;
-
     @Column(name = "status")
     private Integer status;
 

+ 66 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/remote/WxArticleDeleteService.java

@@ -0,0 +1,66 @@
+package com.tzld.longarticle.recommend.server.remote;
+
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.longarticle.recommend.server.model.dto.RequestResult;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+@Service
+@Slf4j
+public class WxArticleDeleteService {
+
+    private OkHttpClient client;
+
+    @PostConstruct
+    public void init() {
+        client = new OkHttpClient().newBuilder()
+                .connectTimeout(15, TimeUnit.MINUTES)
+                .readTimeout(15, TimeUnit.MINUTES)
+                .writeTimeout(15, TimeUnit.MINUTES)
+                .build();
+
+    }
+    public RequestResult<String> deleteArticle(String token, String msgId, int index) {
+        RequestResult<String> result = new RequestResult<>();
+        JSONObject jsonBody = new JSONObject();
+        jsonBody.put("msg_id", msgId);
+        jsonBody.put("article_idx", index);
+        try {
+            MediaType mediaType = MediaType.parse("application/json");
+            RequestBody body = RequestBody.create(mediaType, JSONObject.toJSONString(jsonBody));
+            Request request = new Request.Builder()
+                    .url("https://api.weixin.qq.com/cgi-bin/message/mass/delete?access_token=" + token)
+                    .method("POST", body)
+                    .addHeader("Content-Type", "application/json")
+                    .addHeader("Authorization", "Bearer sk-5DqYCa88kche6nwIWjLE1p4oMm8nXrR9kQMKbBolNAWERu7q")
+                    .build();
+            Response response = client.newCall(request).execute();
+
+            String responseContent = response.body().string();
+            result.setResponseStr(responseContent);
+            log.info("wx delete api responseContent = {}", responseContent);
+            if (response.isSuccessful()) {
+                JSONObject obj = JSONObject.parseObject(responseContent);
+                if (Objects.nonNull(obj) && obj.containsKey("errcode") && obj.getInteger("errcode") == 0) {
+                    result.setSuccess(true);
+                    result.setResponse(obj.toJSONString());
+                } else {
+                    result.setFailReason("response empty");
+                }
+            } else {
+                JSONObject json = JSONObject.parseObject(responseContent);
+                result.setFailReason("request error code:" + response.code() + " message:" + json.getString("error"));
+            }
+        } catch (Exception e) {
+            log.error("wx delete api error", e);
+            result.setSuccess(false);
+            result.setFailReason("request error" + e.getMessage());
+        }
+        return result;
+    }
+}

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

@@ -12,4 +12,6 @@ public interface PublishAccountRepository extends JpaRepository<PublishAccount,
     List<PublishAccount> getAllByGhIdIn(List<String> ghIds);
 
     PublishAccount getByGhId(String ghId);
+
+    List<PublishAccount> getByIdIn(List<String> publishAccountIds);
 }

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

@@ -0,0 +1,12 @@
+package com.tzld.longarticle.recommend.server.repository.longArticle;
+
+import com.tzld.longarticle.recommend.server.model.entity.longArticle.LongArticleAuditDelete;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface LongArticleAuditDeleteRepository extends JpaRepository<LongArticleAuditDelete, Long> {
+    List<LongArticleAuditDelete> getByStatus(Integer status);
+}

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

@@ -12,4 +12,6 @@ public interface LongArticleCrawlerVideoRepository extends JpaRepository<LongArt
 
     List<LongArticleCrawlerVideo> getByTraceIdIn(List<String> traceIds);
 
+    List<LongArticleCrawlerVideo> getByVideoOssPath(String ossPath);
+
 }

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

@@ -0,0 +1,10 @@
+package com.tzld.longarticle.recommend.server.repository.longArticle;
+
+import com.tzld.longarticle.recommend.server.model.entity.longArticle.LongArticleVideoAudit;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface LongArticleVideoAuditRepository extends JpaRepository<LongArticleVideoAudit, Long> {
+    LongArticleVideoAudit getByVideoId(Long videoId);
+}

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

@@ -10,4 +10,6 @@ import java.util.List;
 public interface LongArticlesMatchVideoRepository extends JpaRepository<LongArticlesMatchVideo, Integer> {
 
     List<LongArticlesMatchVideo> getByTraceIdIn(List<String> traceIds);
+
+    LongArticlesMatchVideo getByTraceId(String traceId);
 }

+ 108 - 23
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/ArticleAuditService.java

@@ -2,15 +2,16 @@ package com.tzld.longarticle.recommend.server.service.recommend;
 
 import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONArray;
-import com.tzld.longarticle.recommend.server.model.dto.LongArticlesMatchVideoResponse;
-import com.tzld.longarticle.recommend.server.model.entity.longArticle.GetOffVideoArticle;
-import com.tzld.longarticle.recommend.server.model.entity.longArticle.LongArticleCrawlerVideo;
-import com.tzld.longarticle.recommend.server.model.entity.longArticle.LongArticleVideoAudit;
-import com.tzld.longarticle.recommend.server.model.entity.longArticle.LongArticlesMatchVideo;
+import com.tzld.longarticle.recommend.server.common.enums.StatusEnum;
+import com.tzld.longarticle.recommend.server.mapper.aigc.AigcBaseMapper;
+import com.tzld.longarticle.recommend.server.model.dto.*;
+import com.tzld.longarticle.recommend.server.model.entity.aigc.PublishAccount;
+import com.tzld.longarticle.recommend.server.model.entity.longArticle.*;
 import com.tzld.longarticle.recommend.server.model.param.ArticleVideoAuditResultParam;
-import com.tzld.longarticle.recommend.server.repository.longArticle.GetOffVideoArticleRepository;
-import com.tzld.longarticle.recommend.server.repository.longArticle.LongArticleCrawlerVideoRepository;
-import com.tzld.longarticle.recommend.server.repository.longArticle.LongArticlesMatchVideoRepository;
+import com.tzld.longarticle.recommend.server.remote.WxAccessTokenRemoteService;
+import com.tzld.longarticle.recommend.server.remote.WxArticleDeleteService;
+import com.tzld.longarticle.recommend.server.repository.aigc.PublishAccountRepository;
+import com.tzld.longarticle.recommend.server.repository.longArticle.*;
 import com.tzld.longarticle.recommend.server.util.DateUtils;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.handler.annotation.XxlJob;
@@ -19,8 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
@@ -36,6 +35,18 @@ public class ArticleAuditService {
     private LongArticlesMatchVideoRepository longArticlesMatchVideoRepository;
     @Autowired
     private LongArticleCrawlerVideoRepository longArticleCrawlerVideoRepository;
+    @Autowired
+    private LongArticleAuditDeleteRepository longArticleAuditDeleteRepository;
+    @Autowired
+    private LongArticleVideoAuditRepository longArticleVideoAuditRepository;
+    @Autowired
+    private WxArticleDeleteService wxArticleDeleteService;
+    @Autowired
+    private WxAccessTokenRemoteService wxAccessTokenRemoteService;
+    @Autowired
+    private AigcBaseMapper aigcBaseMapper;
+    @Autowired
+    private PublishAccountRepository publishAccountRepository;
 
 
     @XxlJob("articleVideoAudit")
@@ -52,43 +63,117 @@ public class ArticleAuditService {
         List<LongArticlesMatchVideo> longArticlesMatchVideoList = longArticlesMatchVideoRepository.getByTraceIdIn(traceIds);
         Map<String, LongArticlesMatchVideo> longarticlesMatchVideoMap = longArticlesMatchVideoList.stream()
                 .collect(Collectors.toMap(LongArticlesMatchVideo::getTraceId, Function.identity()));
-        List<LongArticleCrawlerVideo> longArticleCrawlerVideoList = longArticleCrawlerVideoRepository.getByTraceIdIn(traceIds);
-        Map<String, List<LongArticleCrawlerVideo>> longArticleCrawlerVideoMap = longArticleCrawlerVideoList.stream()
-                .collect(Collectors.groupingBy(LongArticleCrawlerVideo::getTraceId));
-        Map<String, LongArticleVideoAudit> traceIdMap = new HashMap<>();
         for (String traceId : traceIds) {
             LongArticlesMatchVideo longArticlesMatchVideo = longarticlesMatchVideoMap.get(traceId);
             List<LongArticlesMatchVideoResponse> responseList = JSONArray.parseArray(longArticlesMatchVideo.getResponse()
                     , LongArticlesMatchVideoResponse.class);
-            List<String> videoOssList = new ArrayList<>();
-            responseList.forEach(item -> {
-                if (StringUtils.hasText(item.getVideoOSS())) {
-                    videoOssList.add(item.getVideoOSS());
-                }
-            });
-            List<LongArticleCrawlerVideo> longArticleCrawlerVideos = longArticleCrawlerVideoMap.get(traceId);
+            for (LongArticlesMatchVideoResponse response : responseList) {
+                LongArticleVideoAudit videoAudit = new LongArticleVideoAudit();
+                videoAudit.setVideoId(response.getVideoID());
+                videoAudit.setTraceId(traceId);
+                videoAudit.setContentId(longArticlesMatchVideo.getContentId());
+                videoAudit.setOssPath(response.getVideoOSS());
+                videoAudit.setStatus(StatusEnum.ZERO.getCode());
+                videoAudit.setCreateTimestamp(System.currentTimeMillis());
+                longArticleVideoAuditRepository.save(videoAudit);
+                // todo 调用PQ 审核视频
+            }
         }
 
         return ReturnT.SUCCESS;
     }
 
     /**
-     *
+     * 视频审核结果处理
      * @param param
      * @return
      */
     public void articleVideoAuditResult(ArticleVideoAuditResultParam param) {
+        LongArticleVideoAudit longArticleVideoAudit = longArticleVideoAuditRepository.getByVideoId(param.getVideoId());
+        if (param.getResult() == 1) {
+            // 审核通过,更新文章状态
+            longArticleVideoAudit.setStatus(StatusEnum.ONE.getCode());
+            longArticleVideoAudit.setFinishTimestamp(System.currentTimeMillis());
+            longArticleVideoAuditRepository.save(longArticleVideoAudit);
+        } else {
+            // 审核不通过,删除文章
+            longArticleVideoAudit.setStatus(StatusEnum.TWO.getCode());
+            longArticleVideoAudit.setFinishTimestamp(System.currentTimeMillis());
+            longArticleVideoAuditRepository.save(longArticleVideoAudit);
+            // 构建删除文章记录 并保存
+            saveDeleteRecord(longArticleVideoAudit.getOssPath());
+        }
+    }
 
+    private void saveDeleteRecord(String ossPath) {
+        List<LongArticleCrawlerVideo> crawlerVideoList = longArticleCrawlerVideoRepository.getByVideoOssPath(ossPath);
+        List<String> traceIds = crawlerVideoList.stream().map(LongArticleCrawlerVideo::getTraceId).collect(Collectors.toList());
+        List<PublishContentMiniprogramDTO> publishContentList = aigcBaseMapper.getPublishContentByTraceIdIn(traceIds);
+        List<String> publishContentIds = publishContentList.stream().map(PublishContentMiniprogramDTO::getPublishContentId).collect(Collectors.toList());
+        Map<String, String> publishContentIdMap = publishContentList.stream()
+                .collect(Collectors.toMap(PublishContentMiniprogramDTO::getTraceId, PublishContentMiniprogramDTO::getPublishContentId));
+        List<PublishGzhPushContentRelDTO> pushContentRelList = aigcBaseMapper.getPushContentRelByPublishContentIdIn(publishContentIds);
+        List<String> pushIds = pushContentRelList.stream().map(PublishGzhPushContentRelDTO::getPushId).collect(Collectors.toList());
+        Map<String, String> publishPushIdMap = pushContentRelList.stream()
+                .collect(Collectors.toMap(PublishGzhPushContentRelDTO::getPublishContentId, PublishGzhPushContentRelDTO::getPushId));
+        List<PublishGzhPushDTO> pushList = aigcBaseMapper.getPushByPushIdIn(pushIds);
+        Map<String, String> pushIdMap = pushList.stream()
+                .collect(Collectors.toMap(PublishGzhPushDTO::getPushId, PublishGzhPushDTO::getGroupPushMsgId));
+        List<String> publishAccountIds = pushList.stream().map(PublishGzhPushDTO::getPublishAccountId).collect(Collectors.toList());
+        Map<String, String> pushAccountMap = pushList.stream()
+                .collect(Collectors.toMap(PublishGzhPushDTO::getPushId, PublishGzhPushDTO::getPublishAccountId));
+        List<PublishAccount> publishAccountList = publishAccountRepository.getByIdIn(publishAccountIds);
+        Map<String, String> publishAccountMap = publishAccountList.stream()
+                .collect(Collectors.toMap(PublishAccount::getId, PublishAccount::getGhId));
+        List<PublishGzhPushContentRelDTO> groupPushRelList = aigcBaseMapper.getGroupPushRelByPushIdIn(pushIds);
+        Map<String, List<PublishGzhPushContentRelDTO>> groupPushRelMap = groupPushRelList.stream()
+                .collect(Collectors.groupingBy(PublishGzhPushContentRelDTO::getPushId));
+        for (String traceId : traceIds) {
+            String publishContentId = publishContentIdMap.get(traceId);
+            String pushId = publishPushIdMap.get(publishContentId);
+            String groupPushMsgId = pushIdMap.get(pushId);
+            String publishAccountId = pushAccountMap.get(pushId);
+            String ghId = publishAccountMap.get(publishAccountId);
+            List<PublishGzhPushContentRelDTO> relList = groupPushRelMap.get(pushId);
+            int index = 1;
+            for (int i = 0; i < relList.size(); i++) {
+                if (relList.get(i).getPublishContentId().equals(publishContentId)) {
+                    index = i + 1;
+                    break;
+                }
+            }
+            LongArticleAuditDelete delete = new LongArticleAuditDelete();
+            delete.setGhId(ghId);
+            delete.setMsgId(groupPushMsgId);
+            delete.setIndex(index);
+            delete.setStatus(StatusEnum.ZERO.getCode());
+            delete.setCreateTimestamp(System.currentTimeMillis());
+            longArticleAuditDeleteRepository.save(delete);
+        }
     }
 
     /**
      * 删除审核不通过,已发布文章
+     *
      * @param param
      * @return
      */
     @XxlJob("articleVideoDelete")
     public ReturnT<String> articleVideoDelete(String param) {
-
+        List<LongArticleAuditDelete> dealList = longArticleAuditDeleteRepository.getByStatus(StatusEnum.ZERO.getCode());
+        for (LongArticleAuditDelete delete : dealList) {
+            // 获取token
+            String token = wxAccessTokenRemoteService.getAccessToken(delete.getGhId());
+            // 删除文章
+            RequestResult<String> result = wxArticleDeleteService.deleteArticle(token, delete.getMsgId(), delete.getIndex());
+            if (result.isSuccess()) {
+                delete.setStatus(StatusEnum.ONE.getCode());
+            } else {
+                delete.setStatus(StatusEnum.TWO.getCode());
+                delete.setFinishTimestamp(System.currentTimeMillis());
+            }
+            longArticleAuditDeleteRepository.save(delete);
+        }
         return ReturnT.SUCCESS;
     }
 }

+ 32 - 0
long-article-recommend-service/src/main/resources/mapper/aigc/AigcBaseMapper.xml

@@ -207,5 +207,37 @@
         where pp.plan_status = 1 and pp.channel = 5 and pp.content_modal = 3 and ppa.publish_open_flag = 0
     </select>
 
+    <select id="getPublishContentByTraceIdIn"
+            resultType="com.tzld.longarticle.recommend.server.model.dto.PublishContentMiniprogramDTO">
+        select * from publish_content_miniprogram where trace_id in
+        <foreach collection="traceIds" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="getPushContentRelByPublishContentIdIn"
+            resultType="com.tzld.longarticle.recommend.server.model.dto.PublishGzhPushContentRelDTO">
+        select * from publish_gzh_push_content_rel where publish_content_id in
+        <foreach collection="publishContentIds" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="getPushByPushIdIn"
+            resultType="com.tzld.longarticle.recommend.server.model.dto.PublishGzhPushDTO">
+        select * from publish_gzh_push where push_id in
+        <foreach collection="pushIds" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="getGroupPushRelByPushIdIn"
+            resultType="com.tzld.longarticle.recommend.server.model.dto.PublishGzhPushContentRelDTO">
+        select * from publish_gzh_push_content_rel where push_id in
+        <foreach collection="pushIds" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        order by id
+    </select>
 
 </mapper>