丁云鹏 11 months ago
parent
commit
42dea785b3

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

@@ -0,0 +1,23 @@
+package com.tzld.longarticle.recommend.server.model;
+
+import com.tzld.longarticle.recommend.server.util.JSONUtils;
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author dyp
+ */
+@Data
+public class Result {
+
+    public static String success(Object data) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("code", 1);
+        map.put("msg", "success");
+        map.put("data", data);
+        return JSONUtils.toJson(map);
+    }
+
+}

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

@@ -0,0 +1,15 @@
+package com.tzld.longarticle.recommend.server.remote;
+
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author dyp
+ */
+@Service
+public class WxUserManagementRemoteService {
+    public List<String> getAllUser(String gzhId) {
+        return null;
+    }
+}

+ 21 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/crawler/ArticleUserGroupRepository.java

@@ -0,0 +1,21 @@
+package com.tzld.longarticle.recommend.server.repository.crawler;
+
+import com.tzld.longarticle.recommend.server.repository.entity.crawler.ArticlePreDistributeAccount;
+import com.tzld.longarticle.recommend.server.repository.entity.crawler.ArticleUserGroup;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ArticleUserGroupRepository extends JpaRepository<ArticleUserGroup, Long> {
+    @Query("select distinct userGroupId from ArticleUserGroup where gzhId = :gzhId and isDelete = 0")
+    List<Integer> findAllUserGroupId(String gzhId);
+
+    ArticleUserGroup findFirstByGzhIdAndOpenId(String gzhId, String openId);
+
+    @Query("select distinct openId from ArticleUserGroup where gzhId = :gzhId" +
+            " and userGroupId = :userGroupId and isDelete = 0")
+    List<String> findAllOpenId(String gzhId, int userGroupId);
+}

+ 24 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/entity/crawler/ArticleUserGroup.java

@@ -0,0 +1,24 @@
+package com.tzld.longarticle.recommend.server.repository.entity.crawler;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+/**
+ * @author dyp
+ */
+@Data
+@Entity
+@Table(name = "article_user_group")
+public class ArticleUserGroup {
+    @Id
+    private long id;
+    @Column(name = "gzh_id")
+    private String gzhId;
+    @Column(name = "user_group_id")
+    private int userGroupId;
+    @Column(name = "open_id")
+    private String openId;
+    @Column(name = "is_delete")
+    private int isDelete;
+}

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

@@ -0,0 +1,136 @@
+package com.tzld.longarticle.recommend.server.service;
+
+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.lang.math.RandomUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author dyp
+ */
+@Slf4j
+@Service
+public class UserManagementService {
+    @Autowired
+    private WxUserManagementRemoteService wxUserManagementRemoteService;
+    @Autowired
+    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) {
+
+            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
+     *
+     * <xml>
+     * <ToUserName><![CDATA[toUser]]></ToUserName>
+     * <FromUserName><![CDATA[FromUser]]></FromUserName>
+     * <CreateTime>123456789</CreateTime>
+     * <MsgType><![CDATA[event]]></MsgType>
+     * <Event><![CDATA[subscribe]]></Event>
+     * </xml>
+     */
+    public void listenWx(String xmlData) {
+        try {
+            SAXReader saxReader = new SAXReader();
+            Document document = saxReader.read(xmlData);
+            Element root = document.getRootElement();
+            Map<String, String> param = new HashMap<>();
+            for (Element e : root.elements()) {
+                param.put(e.getName(), e.getTextTrim());
+            }
+
+            String gzhId = param.get("ToUserName");
+            String openId = param.get("FromUserName");
+            if (StringUtils.equals("event", param.get("MsgType"))) {
+                String event = param.get("Event");
+                switch (event) {
+                    case "subscribe":
+                        handleSubscribe(gzhId, openId);
+                        break;
+                    case "unsubscribe":
+                        handleUnsubscribe(gzhId, openId);
+                        break;
+                    default:
+                        break;
+                }
+            }
+
+        } catch (Exception e) {
+            log.error("listenWx handle error {} ", xmlData, e);
+        }
+    }
+
+    private void handleSubscribe(String gzhId, String openId) {
+        //
+        ArticleUserGroup group = articleUserGroupRepository.findFirstByGzhIdAndOpenId(gzhId, openId);
+        if (group == null) {
+            // insert
+            // 查库,知道所有分组
+            List<Integer> ugIds = articleUserGroupRepository.findAllUserGroupId(gzhId);
+            // 随机选一个组
+            int ugId = ugIds.get(RandomUtils.nextInt(ugIds.size()));
+            group = new ArticleUserGroup();
+            group.setGzhId(gzhId);
+            group.setOpenId(openId);
+            group.setUserGroupId(ugId);
+            articleUserGroupRepository.save(group);
+        } else {
+            // update
+            group.setIsDelete(0);
+            articleUserGroupRepository.save(group);
+        }
+
+    }
+
+    private void handleUnsubscribe(String gzhId, String openId) {
+        ArticleUserGroup group = articleUserGroupRepository.findFirstByGzhIdAndOpenId(gzhId, openId);
+        if (group != null) {
+            group.setIsDelete(1);
+            articleUserGroupRepository.save(group);
+        }
+    }
+
+    public List<String> listByUserGroupId(String gzhId, int userGroupId) {
+        return articleUserGroupRepository.findAllOpenId(gzhId, userGroupId);
+    }
+}

+ 55 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/web/UserManagementController.java

@@ -0,0 +1,55 @@
+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.Result;
+import com.tzld.longarticle.recommend.server.repository.crawler.ArticleUserGroupRepository;
+import com.tzld.longarticle.recommend.server.service.UserManagementService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+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;
+
+/**
+ * @author dyp
+ */
+@RestController
+@Slf4j
+@RequestMapping("/user")
+public class UserManagementController {
+    @Autowired
+    private UserManagementService userManagementService;
+
+
+    @RequestMapping("/addGZH")
+    public String homepageRecommend(@RequestParam(name = "gzhId") String gzhId,
+                                    @RequestParam(name = "groupNum") int groupNum) {
+        userManagementService.addGZH(gzhId, groupNum);
+        return "success";
+    }
+
+    /**
+     * 微信关注/取消事件监听
+     */
+    @RequestMapping("/listByUserGroupId")
+    public String list(@RequestParam(name = "gzhId") String gzhId,
+                       @RequestParam(name = "userGroupId") int userGroupId) {
+        List<String> openIds = userManagementService.listByUserGroupId(gzhId, userGroupId);
+
+        return Result.success(openIds);
+    }
+
+    /**
+     * 微信关注/取消事件监听
+     */
+    @RequestMapping("/listenWx")
+    public String listenWx(@RequestBody String xmlData) {
+        userManagementService.listenWx(xmlData);
+        return "success";
+    }
+
+}