Selaa lähdekoodia

单小程序文章删除

wangyunpeng 5 kuukautta sitten
vanhempi
commit
7d9b682268

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

@@ -72,4 +72,6 @@ public interface LongArticleBaseMapper {
     void updateVideoPoolContentBad(String contentTraceId);
 
     void batchInsertArticleReMatchRecord(List<ArticleReMatchRecord> list);
+
+    List<String> getDisAuditDeleteGhid();
 }

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

@@ -25,6 +25,7 @@ public class WxArticleDeleteService {
                 .build();
 
     }
+
     public RequestResult<String> deleteArticle(String token, String msgId, int index) {
         RequestResult<String> result = new RequestResult<>();
         JSONObject jsonBody = new JSONObject();
@@ -46,9 +47,13 @@ public class WxArticleDeleteService {
             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());
+                if (Objects.nonNull(obj) && obj.containsKey("errcode")) {
+                    if (obj.getInteger("errcode") == 0) {
+                        result.setSuccess(true);
+                        result.setResponse(obj.toJSONString());
+                    } else {
+                        result.setFailReason(obj.getString("errmsg"));
+                    }
                 } else {
                     result.setFailReason("response empty");
                 }
@@ -63,4 +68,46 @@ public class WxArticleDeleteService {
         }
         return result;
     }
+
+    public RequestResult<String> clearQuota(String token, String appid) {
+        RequestResult<String> result = new RequestResult<>();
+        JSONObject jsonBody = new JSONObject();
+        jsonBody.put("appid", appid);
+        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/clear_quota?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 clearQuota api responseContent = {}", responseContent);
+            if (response.isSuccessful()) {
+                JSONObject obj = JSONObject.parseObject(responseContent);
+                if (Objects.nonNull(obj) && obj.containsKey("errcode")) {
+                    if (obj.getInteger("errcode") == 0) {
+                        result.setSuccess(true);
+                        result.setResponse(obj.toJSONString());
+                    } else {
+                        result.setFailReason(obj.getString("errmsg"));
+                    }
+                } 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 clearQuota api error", e);
+            result.setSuccess(false);
+            result.setFailReason("request error" + e.getMessage());
+        }
+        return result;
+    }
 }

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

@@ -517,30 +517,38 @@ public class ArticleAuditService {
         CountDownLatch cdl = new CountDownLatch(dealMap.size());
         for (Map.Entry<String, List<LongArticleAuditDelete>> entry : dealMap.entrySet()) {
             pool.submit(() -> {
-                // 获取token
                 try {
+                    // 获取token
                     String token = wxAccessTokenRemoteService.getAccessToken(entry.getKey());
                     List<LongArticleAuditDelete> list = entry.getValue();
-                    for (LongArticleAuditDelete delete : list) {
-                        try {
-                            if (Objects.equals(delete.getPushType(), PushTypeEnum.AUTO_GROUP_PUBLISH.getVal())) {
-                                // 删除文章
-                                RequestResult<String> result = wxArticleDeleteService.deleteArticle(token, delete.getMsgId(), delete.getIndex());
-                                if (result.isSuccess()) {
-                                    delete.setStatus(ArticleDeleteStatusEnum.SUCCESS.getCode());
-                                } else {
-                                    delete.setStatus(ArticleDeleteStatusEnum.FAIL.getCode());
-                                    delete.setFailReason(result.getFailReason());
-                                }
+                    Map<String, List<LongArticleAuditDelete>> msgIdMap = list.stream()
+                            .collect(Collectors.groupingBy(LongArticleAuditDelete::getMsgId));
+                    for (Map.Entry<String, List<LongArticleAuditDelete>> msgIdEntry : msgIdMap.entrySet()) {
+                        String msgId = msgIdEntry.getKey();
+                        List<LongArticleAuditDelete> msgIdList = msgIdEntry.getValue();
+                        Integer pushType = msgIdList.get(0).getPushType();
+                        int status;
+                        String errMsg;
+                        if (Objects.equals(pushType, PushTypeEnum.AUTO_GROUP_PUBLISH.getVal())) {
+                            RequestResult<String> result = wxArticleDeleteService.deleteArticle(token, msgId, 0);
+                            if (result.isSuccess()) {
+                                errMsg = null;
+                                status = ArticleDeleteStatusEnum.SUCCESS.getCode();
                             } else {
-                                deleteFailAlarmAdd(alarmList, delete.getPublishContentId(), "非自动群发", delete.getIndex());
-                                delete.setStatus(ArticleDeleteStatusEnum.SUCCESS.getCode());
+                                status = ArticleDeleteStatusEnum.FAIL.getCode();
+                                errMsg = result.getFailReason();
                             }
+                        } else {
+                            errMsg = null;
+                            status = ArticleDeleteStatusEnum.SUCCESS.getCode();
+                            msgIdList.forEach(delete -> deleteFailAlarmAdd(alarmList, delete.getPublishContentId(), "非自动群发", delete.getIndex()));
+                        }
+                        msgIdList.forEach(delete -> {
+                            delete.setStatus(status);
+                            delete.setFailReason(errMsg);
                             delete.setFinishTimestamp(System.currentTimeMillis());
                             longArticleAuditDeleteRepository.save(delete);
-                        } catch (Exception e) {
-                            log.error("articleVideoDelete ghId:{} error", delete.getGhId(), e);
-                        }
+                        });
                     }
                 } finally {
                     cdl.countDown();

+ 4 - 0
long-article-recommend-service/src/main/resources/mapper/longArticle/LongArticleBaseMapper.xml

@@ -267,4 +267,8 @@
         </foreach>
     </insert>
 
+    <select id="getDisAuditDeleteGhid" resultType="java.lang.String">
+        select distinct gh_id from long_article_audit_delete where create_timestamp > 1736157600000 and status = 2 and fail_reason like 'reach max api daily quota%'
+    </select>
+
 </mapper>

+ 36 - 0
long-article-recommend-service/src/test/java/com/tzld/longarticle/recommend/server/WxApiTest.java

@@ -0,0 +1,36 @@
+package com.tzld.longarticle.recommend.server;
+
+import com.tzld.longarticle.recommend.server.mapper.aigc.AigcBaseMapper;
+import com.tzld.longarticle.recommend.server.mapper.longArticle.LongArticleBaseMapper;
+import com.tzld.longarticle.recommend.server.model.entity.aigc.PublishAccount;
+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 org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@SpringBootTest(classes = Application.class)
+public class WxApiTest {
+
+    @Resource
+    private LongArticleBaseMapper longArticleBaseMapper;
+    @Resource
+    private PublishAccountRepository publishAccountRepository;
+    @Resource
+    private WxAccessTokenRemoteService wxAccessTokenRemoteService;
+    @Resource
+    private WxArticleDeleteService wxArticleDeleteService;
+
+    @Test
+    public void clearQuotaTest() {
+        List<String> ghIds = longArticleBaseMapper.getDisAuditDeleteGhid();
+        List<PublishAccount> publishAccountList = publishAccountRepository.getAllByGhIdIn(ghIds);
+        for (PublishAccount publishAccount : publishAccountList) {
+            String token = wxAccessTokenRemoteService.getAccessToken(publishAccount.getGhId());
+            wxArticleDeleteService.clearQuota(token, publishAccount.getAppId());
+        }
+    }
+}