丁云鹏 11 meses atrás
pai
commit
6b4b09f124

+ 19 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/RecommendWithUserGroupResponse.java

@@ -0,0 +1,19 @@
+package com.tzld.longarticle.recommend.server.model;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author dyp
+ */
+
+@NoArgsConstructor
+@Getter
+@Setter
+public class RecommendWithUserGroupResponse {
+    private Integer code;
+    private String msg;
+    private ArticleSortResponseData data;
+}
+

+ 26 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/WxUserGetResponse.java

@@ -0,0 +1,26 @@
+package com.tzld.longarticle.recommend.server.model;
+
+import lombok.*;
+
+import java.util.List;
+
+/**
+ * @author dyp
+ */
+
+@NoArgsConstructor
+@Getter
+@Setter
+@AllArgsConstructor
+public class WxUserGetResponse {
+    private int total;
+    private int count;
+    private String next_openid;
+    private ResponseData data;
+
+    @lombok.Data
+    public static class ResponseData {
+        private List<String> openid;
+    }
+}
+

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

@@ -1,15 +1,98 @@
 package com.tzld.longarticle.recommend.server.remote;
 
+import com.aliyun.odps.utils.StringUtils;
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
+import com.google.common.reflect.TypeToken;
+import com.tzld.longarticle.recommend.server.common.HttpPoolFactory;
+import com.tzld.longarticle.recommend.server.model.WxUserGetResponse;
+import com.tzld.longarticle.recommend.server.util.JSONUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.StatusLine;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.util.EntityUtils;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * @author dyp
  */
 @Service
+@Slf4j
 public class WxUserManagementRemoteService {
-    public List<String> getAllUser(String gzhId) {
+
+    private final CloseableHttpClient client = HttpPoolFactory.defaultPool();
+
+    @ApolloJsonValue("${gzh_accessToken:{}}")
+    private Map<String, String> accessTokenMap;
+
+    public WxUserGetResponse getAllUserLimit10000(String gzhId) {
+
+        try {
+
+            String accessToken = accessTokenMap.get(gzhId);
+            if (StringUtils.isBlank(accessToken)) {
+                log.error("gzh {} access_token not config", gzhId);
+                return null;
+            }
+
+            URIBuilder uriBuilder = new URIBuilder("https://api.weixin.qq.com/cgi-bin/user/get");
+            uriBuilder.setParameter("gzhId", gzhId); // 假设需要传递gzhId参数
+            uriBuilder.setParameter("access_token", accessToken);
+            HttpGet httpGet = new HttpGet();
+            httpGet.setURI(uriBuilder.build());
+
+            CloseableHttpResponse response = client.execute(httpGet);
+            StatusLine statusLine = response.getStatusLine();
+            if (statusLine.getStatusCode() == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (Objects.nonNull(responseEntity)) {
+                    String responseBody = EntityUtils.toString(responseEntity, "UTF-8");
+                    return JSONUtils.fromJson(responseBody, new TypeToken<WxUserGetResponse>() {
+                    }, null);
+                }
+            }
+        } catch (Exception e) {
+            log.error("get user error gzhId {} ", gzhId, e);
+        }
         return null;
     }
+
+    public WxUserGetResponse getAllUserLimit10000(String gzhId, String nextOpenId) {
+        try {
+
+            String accessToken = accessTokenMap.get(gzhId);
+            if (StringUtils.isBlank(accessToken)) {
+                log.error("gzh {} access_token not config", gzhId);
+                return null;
+            }
+
+            URIBuilder uriBuilder = new URIBuilder("https://api.weixin.qq.com/cgi-bin/user/get");
+            uriBuilder.setParameter("gzhId", gzhId); // 假设需要传递gzhId参数
+            uriBuilder.setParameter("access_token", accessToken);
+            uriBuilder.setParameter("next_openid", nextOpenId);
+            HttpGet httpGet = new HttpGet();
+            httpGet.setURI(uriBuilder.build());
+
+            CloseableHttpResponse response = client.execute(httpGet);
+            StatusLine statusLine = response.getStatusLine();
+            if (statusLine.getStatusCode() == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (Objects.nonNull(responseEntity)) {
+                    String responseBody = EntityUtils.toString(responseEntity, "UTF-8");
+                    return JSONUtils.fromJson(responseBody, new TypeToken<WxUserGetResponse>() {
+                    }, null);
+                }
+            }
+        } catch (Exception e) {
+            log.error("get user error gzhId={} nextOpenId={} ", gzhId, nextOpenId, e);
+        }
+        return null;
+    }
+
 }

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

@@ -73,6 +73,26 @@ public class RecommendService {
         return buildRecommendResponse(recallResult, rankResult, param.getPublishNum());
     }
 
+    public RecommendWithUserGroupResponse recommendWithUserGroup(RecommendRequest request) {
+
+        RecommendParam param = genRecommendParam(request);
+        log.info("genRecommendParam {}", JSONUtils.toJson(param));
+        // 获取账号排序设置
+        String strategyConfig = accountStrategyConfigMap.get(request.getAccountName());
+        if (StringUtils.hasText(strategyConfig)) {
+            param.setStrategy(strategyConfig);
+        }
+        RecallResult recallResult = recallService.recall(convertToRecallParam(param));
+        log.info("recallResult {}", JSONUtils.toJson(recallResult));
+
+        RankResult rankResult = rankService.rank(convertToRankParam(param, recallResult));
+        log.info("rankResult {}", JSONUtils.toJson(rankResult));
+
+        saveSortLog(param, rankResult);
+
+        return buildRecommendWithUserGroupResponse(recallResult, rankResult, param.getPublishNum());
+    }
+
     private RecommendResponse buildRecommendResponse(RecallResult recallResult, RankResult rankResult, Integer publishNum) {
         List<Content> contentList = rankResult.getContents();
         List<ArticleSortResponseDataItem> rankList = new ArrayList<>();

+ 73 - 16
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/UserManagementService.java

@@ -1,11 +1,12 @@
 package com.tzld.longarticle.recommend.server.service;
 
+import com.tzld.longarticle.recommend.server.model.WxUserGetResponse;
 import com.tzld.longarticle.recommend.server.remote.WxUserManagementRemoteService;
 import com.tzld.longarticle.recommend.server.repository.crawler.ArticleUserGroupRepository;
 import com.tzld.longarticle.recommend.server.repository.entity.crawler.ArticleUserGroup;
 import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.ListUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.math.RandomUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.dom4j.Document;
@@ -31,33 +32,89 @@ public class UserManagementService {
     private ArticleUserGroupRepository articleUserGroupRepository;
 
     public void addGZH(String gzhId, int groupNum) {
-        List<String> openIds = wxUserManagementRemoteService.getAllUser(gzhId);
-        // 相对均匀
-        Collections.shuffle(openIds);
-        int size = openIds.size() / groupNum;
-        List<List<String>> partition = ListUtils.partition(openIds, size);
-        for (int i = 0; i < (openIds.size() % groupNum); i++) {
-            partition.get(i).add(openIds.get(size - i - 1));
-        }
 
-        // 写入DB
-        int ugId = 0;
-        for (List<String> partOpenIds : partition) {
+        // syncAllUserOnce(gzhId, groupNum);
+
+        // 同步用户
+        log.info("start sync user gzhId={}", gzhId);
 
-            int finalUgId = ugId;
-            List<ArticleUserGroup> userGroups = CommonCollectionUtils.toList(partOpenIds, s -> {
+        WxUserGetResponse response = wxUserManagementRemoteService.getAllUserLimit10000(gzhId);
+        if (response == null) {
+            return;
+        }
+
+        int total = response.getTotal();
+        int count = response.getCount();
+        log.info("sync user gzhId={} total={} count={}", gzhId, total, count);
+        List<String> openIds = response.getData() == null
+                ? Collections.emptyList()
+                : response.getData().getOpenid();
+        String nextOpenId = response.getNext_openid();
+        if (CollectionUtils.isNotEmpty(openIds)) {
+            List<ArticleUserGroup> userGroups = CommonCollectionUtils.toList(openIds, s -> {
                 ArticleUserGroup ug = new ArticleUserGroup();
                 ug.setGzhId(gzhId);
                 ug.setOpenId(s);
-                ug.setUserGroupId(finalUgId);
+                ug.setUserGroupId(RandomUtils.nextInt(groupNum));
                 return ug;
             });
             articleUserGroupRepository.saveAll(userGroups);
-            ugId++;
         }
 
+        while (StringUtils.isNotBlank(nextOpenId)) {
+            response = wxUserManagementRemoteService.getAllUserLimit10000(gzhId, nextOpenId);
+            if (response == null) {
+                return;
+            }
+            openIds = response.getData() == null
+                    ? Collections.emptyList()
+                    : response.getData().getOpenid();
+            nextOpenId = response.getNext_openid();
+            count += response.getCount();
+            log.info("sync user gzhId={} total={} count={}", gzhId, total, count);
+            if (CollectionUtils.isNotEmpty(openIds)) {
+                List<ArticleUserGroup> userGroups = CommonCollectionUtils.toList(openIds, s -> {
+                    ArticleUserGroup ug = new ArticleUserGroup();
+                    ug.setGzhId(gzhId);
+                    ug.setOpenId(s);
+                    ug.setUserGroupId(RandomUtils.nextInt(groupNum));
+                    return ug;
+                });
+                articleUserGroupRepository.saveAll(userGroups);
+            }
+        }
+
+        log.info("end sync user gzhId={}", gzhId);
+
     }
 
+//    private void syncAllUserOnce(String gzhId, int groupNum) {
+//        List<String> openIds = wxUserManagementRemoteService.getAllUser(gzhId);
+//        // 相对均匀
+//        Collections.shuffle(openIds);
+//        int size = openIds.size() / groupNum;
+//        List<List<String>> partition = ListUtils.partition(openIds, size);
+//        for (int i = 0; i < (openIds.size() % groupNum); i++) {
+//            partition.get(i).add(openIds.get(size - i - 1));
+//        }
+//
+//        // 写入DB
+//        int ugId = 0;
+//        for (List<String> partOpenIds : partition) {
+//
+//            int finalUgId = ugId;
+//            List<ArticleUserGroup> userGroups = CommonCollectionUtils.toList(partOpenIds, s -> {
+//                ArticleUserGroup ug = new ArticleUserGroup();
+//                ug.setGzhId(gzhId);
+//                ug.setOpenId(s);
+//                ug.setUserGroupId(finalUgId);
+//                return ug;
+//            });
+//            articleUserGroupRepository.saveAll(userGroups);
+//            ugId++;
+//        }
+//    }
+
     /**
      * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html
      *

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

@@ -15,4 +15,6 @@ import java.util.List;
 @AllArgsConstructor
 public class RankResult {
     private List<Content> contents;
+
+    private Map<Integer,>
 }

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

@@ -2,6 +2,7 @@ package com.tzld.longarticle.recommend.server.web;
 
 import com.tzld.longarticle.recommend.server.model.RecommendRequest;
 import com.tzld.longarticle.recommend.server.model.RecommendResponse;
+import com.tzld.longarticle.recommend.server.model.RecommendWithUserGroupResponse;
 import com.tzld.longarticle.recommend.server.service.RecommendService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,9 +20,15 @@ public class RecommendController {
     private RecommendService recommendService;
 
     @RequestMapping("/recommend")
-    public RecommendResponse homepageRecommend(@RequestBody RecommendRequest httpRequest) {
+    public RecommendResponse recommend(@RequestBody RecommendRequest httpRequest) {
 
         return recommendService.recommend(httpRequest);
     }
 
+    @RequestMapping("/recommendWithUserGroup")
+    public RecommendWithUserGroupResponse recommendWithUserGroup(@RequestBody RecommendRequest httpRequest) {
+
+        return recommendService.recommendWithUserGroup(httpRequest);
+    }
+
 }