Kaynağa Gözat

历史数据过滤,组装,保底数据获取

xueyiming 7 ay önce
ebeveyn
işleme
57fdb88f7e
25 değiştirilmiş dosya ile 2051 ekleme ve 63 silme
  1. 6 4
      pom.xml
  2. 80 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/base/CommonResponse.java
  3. 11 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/constant/MiniprogramConstant.java
  4. 13 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/constant/ResponseConstant.java
  5. 27 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/enums/ExceptionCodeEnum.java
  6. 21 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/enums/MessageAttachmentTypeEnum.java
  7. 25 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/exception/CustomizeException.java
  8. 0 25
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/component/filter/HistoryFilter.java
  9. 24 6
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/config/RedisConfig.java
  10. 29 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/controller/MessageController.java
  11. 33 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/dao/mapper/MessageAttachmentMapper.java
  12. 2 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/dao/mapper/UserMapper.java
  13. 44 22
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/job/WeComHistoryDataJob.java
  14. 88 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/job/WeComMessageDataJob.java
  15. 1 4
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/model/bo/MiniprogramRecord.java
  16. 13 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/model/bo/PushMessage.java
  17. 148 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/model/po/MessageAttachment.java
  18. 993 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/model/po/MessageAttachmentExample.java
  19. 18 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/model/vo/MiniprogramVo.java
  20. 2 2
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/service/Impl/AccessTokenServiceImpl.java
  21. 88 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/service/Impl/MessageAttachmentServiceImpl.java
  22. 13 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/service/MessageAttachmentService.java
  23. 15 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/utils/MiniprogramUtil.java
  24. 33 0
      we-com-server/src/main/java/com/tzld/piaoquan/wecom/utils/OdpsUtil.java
  25. 324 0
      we-com-server/src/main/resources/mapper/MessageAttachmentMapper.xml

+ 6 - 4
pom.xml

@@ -18,10 +18,6 @@
     <name>we-com-manage</name>
     <description>we-com-manage</description>
 
-    <properties>
-        <stuuudy.commons.utils.version>1.0-SNAPSHOT</stuuudy.commons.utils.version>
-        <aliyun.rocketmq.version>1.8.4.Final</aliyun.rocketmq.version>
-    </properties>
 
     <dependencies>
         <dependency>
@@ -112,6 +108,12 @@
             <artifactId>fastjson</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.aliyun.odps</groupId>
+            <artifactId>odps-sdk-core</artifactId>
+            <version>0.27.2-public</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 80 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/base/CommonResponse.java

@@ -0,0 +1,80 @@
+package com.tzld.piaoquan.wecom.common.base;
+
+import com.tzld.piaoquan.wecom.common.enums.ExceptionCodeEnum;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import static com.tzld.piaoquan.wecom.common.constant.ResponseConstant.SUCCESS_CODE;
+import static com.tzld.piaoquan.wecom.common.constant.ResponseConstant.SUCCESS_MSG;
+
+/**
+ * Common Response
+ *
+ * @author xueyiming
+ */
+@Setter
+@Getter
+@ToString
+public class CommonResponse<T> {
+    /**
+     * 返回状态码,0 表示业务成功
+     */
+    private int code = 0;
+    /**
+     * 返回消息
+     */
+    private String msg = "success";
+    /**
+     * 业务成功时返回数据
+     */
+    private T data;
+
+    public static <T> CommonResponse<T> success() {
+        CommonResponse<T> commonResponse = new CommonResponse<>();
+        commonResponse.setCode(SUCCESS_CODE);
+        commonResponse.setMsg(SUCCESS_MSG);
+        return commonResponse;
+    }
+
+    public static <T> CommonResponse<T> success(T data) {
+        CommonResponse<T> commonResponse = new CommonResponse<>();
+        commonResponse.setCode(SUCCESS_CODE);
+        commonResponse.setMsg(SUCCESS_MSG);
+        commonResponse.setData(data);
+        return commonResponse;
+    }
+
+    public static <T> CommonResponse<T> create() {
+        return create(SUCCESS_CODE, SUCCESS_MSG, null);
+    }
+
+    public static <T> CommonResponse<T> create(T data) {
+        return create(SUCCESS_CODE, SUCCESS_MSG, data);
+    }
+
+    public static <T> CommonResponse<T> create(ExceptionCodeEnum exceptionCodeEnum) {
+        return create(exceptionCodeEnum.getCode(), exceptionCodeEnum.getMsg(), null);
+    }
+
+    public static <T> CommonResponse<T> create(ExceptionCodeEnum exceptionCodeEnum, String msg) {
+        return create(exceptionCodeEnum.getCode(), msg, null);
+    }
+
+    public static <T> CommonResponse<T> create(int code, String msg) {
+        return create(code, msg, null);
+    }
+
+    public static <T> CommonResponse<T> create(int code, String msg, T data) {
+        CommonResponse<T> commonResponse = new CommonResponse<>();
+        commonResponse.setCode(code);
+        commonResponse.setMsg(msg);
+        commonResponse.setData(data);
+        return commonResponse;
+    }
+
+    public boolean isSuccess() {
+        return this.code == SUCCESS_CODE;
+    }
+
+}

+ 11 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/constant/MiniprogramConstant.java

@@ -0,0 +1,11 @@
+package com.tzld.piaoquan.wecom.common.constant;
+
+public interface MiniprogramConstant {
+
+    String appid = "wx7187c217efef24a7";
+
+    String GUARANTEED_MINIPROGRAM_KEY = "guaranteed_miniprogram_list";
+
+    int max_length = 20;
+
+}

+ 13 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/constant/ResponseConstant.java

@@ -0,0 +1,13 @@
+package com.tzld.piaoquan.wecom.common.constant;
+
+/**
+ * 响应常量
+ *
+ * @author xueyiming
+ */
+public interface ResponseConstant {
+
+    int SUCCESS_CODE = 0;
+
+    String SUCCESS_MSG = "success";
+}

+ 27 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/enums/ExceptionCodeEnum.java

@@ -0,0 +1,27 @@
+package com.tzld.piaoquan.wecom.common.enums;
+
+import lombok.Getter;
+
+/**
+ * 异常
+ *
+ * @author xueyiming
+ */
+@Getter
+public enum ExceptionCodeEnum {
+    /**
+     * 自定义异常信息
+     */
+    SYSTEM_ERROR(1000, "系统错误"),
+    PARAMS_ERROR(2001, "参数错误")
+    ;
+
+    private final int code;
+    private final String msg;
+
+    ExceptionCodeEnum(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+}

+ 21 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/enums/MessageAttachmentTypeEnum.java

@@ -0,0 +1,21 @@
+package com.tzld.piaoquan.wecom.common.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum MessageAttachmentTypeEnum {
+
+    DEFAULT(0,"未知"),
+    IMAGE(1,"图片"),
+    LINK(2,"链接"),
+    MINIPROGRAM(3, "小程序"),
+    VIDEO(4, "视频");
+
+    final Integer type;
+    final String desc;
+    MessageAttachmentTypeEnum(Integer type, String desc){
+        this.type = type;
+        this.desc = desc;
+    }
+
+}

+ 25 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/common/exception/CustomizeException.java

@@ -0,0 +1,25 @@
+package com.tzld.piaoquan.wecom.common.exception;
+
+
+import com.tzld.piaoquan.wecom.common.enums.ExceptionCodeEnum;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class CustomizeException extends RuntimeException {
+
+    private static final long serialVersionUID = 1L;
+
+    private ExceptionCodeEnum exceptionCodeEnum;
+
+    public CustomizeException(ExceptionCodeEnum exceptionCodeEnum) {
+        super(exceptionCodeEnum.getMsg());
+        this.exceptionCodeEnum = exceptionCodeEnum;
+    }
+
+    public CustomizeException(ExceptionCodeEnum exceptionCodeEnum, String msg) {
+        super(msg);
+        this.exceptionCodeEnum = exceptionCodeEnum;
+    }
+}

+ 0 - 25
we-com-server/src/main/java/com/tzld/piaoquan/wecom/component/filter/HistoryFilter.java

@@ -1,25 +0,0 @@
-package com.tzld.piaoquan.wecom.component.filter;
-
-
-import org.springframework.stereotype.Component;
-
-import java.util.HashSet;
-import java.util.Set;
-
-@Component
-public class HistoryFilter {
-
-    public static Set<Long> filterHistorySet(Set<Long>... sets) {
-        if (sets.length == 0) {
-            return new HashSet<>();
-        }
-        Set<Long> result = new HashSet<>(sets[0]);
-
-        for (int i = 1; i < sets.length; i++) {
-            result.retainAll(sets[i]);
-        }
-
-        return result;
-    }
-
-}

+ 24 - 6
we-com-server/src/main/java/com/tzld/piaoquan/wecom/config/RedisConfig.java

@@ -1,25 +1,43 @@
 package com.tzld.piaoquan.wecom.config;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializer;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
 @Configuration
 public class RedisConfig {
 
     @Bean
-    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
-        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
-        redisTemplate.setConnectionFactory(factory);
-        // key的序列化类型 保证可读性
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(redisConnectionFactory);
+        //设置value的序列化方式json
+        redisTemplate.setValueSerializer(redisSerializer());
+        //设置key序列化方式String
         redisTemplate.setKeySerializer(new StringRedisSerializer());
-        redisTemplate.setValueSerializer(new StringRedisSerializer());
+        //设置hash key序列化方式String
         redisTemplate.setHashKeySerializer(new StringRedisSerializer());
-        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
+        //设置hash value序列化json
+        redisTemplate.setHashValueSerializer(redisSerializer());
+        redisTemplate.afterPropertiesSet();
         return redisTemplate;
     }
 
+    public RedisSerializer<Object> redisSerializer() {
+        //创建JSON序列化器
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        //必须设置,否则无法序列化实体类对象
+        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
+        return new GenericJackson2JsonRedisSerializer(objectMapper);
+    }
+
 }

+ 29 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/controller/MessageController.java

@@ -0,0 +1,29 @@
+package com.tzld.piaoquan.wecom.controller;
+
+
+import com.tzld.piaoquan.wecom.common.base.CommonResponse;
+import com.tzld.piaoquan.wecom.model.vo.MiniprogramVo;
+import com.tzld.piaoquan.wecom.service.MessageAttachmentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/wecom/message")
+public class MessageController {
+
+    @Autowired
+    private MessageAttachmentService messageAttachmentService;
+
+    @PostMapping("/miniprogram/guaranteed/create")
+    public CommonResponse<Void> createGuaranteedMiniprogram(@RequestBody List<MiniprogramVo> miniprogramVoList){
+        messageAttachmentService.createGuaranteedMiniprogram(miniprogramVoList);
+        return CommonResponse.success();
+    }
+
+
+}

+ 33 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/dao/mapper/MessageAttachmentMapper.java

@@ -0,0 +1,33 @@
+package com.tzld.piaoquan.wecom.dao.mapper;
+
+import com.tzld.piaoquan.wecom.model.po.MessageAttachment;
+import com.tzld.piaoquan.wecom.model.po.MessageAttachmentExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface MessageAttachmentMapper {
+
+    long countByExample(MessageAttachmentExample example);
+
+    int deleteByExample(MessageAttachmentExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(MessageAttachment record);
+
+    int insertSelective(MessageAttachment record);
+
+    List<MessageAttachment> selectByExample(MessageAttachmentExample example);
+
+    MessageAttachment selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") MessageAttachment record, @Param("example") MessageAttachmentExample example);
+
+    int updateByExample(@Param("record") MessageAttachment record, @Param("example") MessageAttachmentExample example);
+
+    int updateByPrimaryKeySelective(MessageAttachment record);
+
+    int updateByPrimaryKey(MessageAttachment record);
+}

+ 2 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/dao/mapper/UserMapper.java

@@ -3,9 +3,11 @@ package com.tzld.piaoquan.wecom.dao.mapper;
 import com.tzld.piaoquan.wecom.model.po.User;
 import com.tzld.piaoquan.wecom.model.po.UserExample;
 import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
 
 import java.util.List;
 
+@Repository
 public interface UserMapper {
     long countByExample(UserExample example);
 

+ 44 - 22
we-com-server/src/main/java/com/tzld/piaoquan/wecom/job/WeComHistoryDataJob.java

@@ -2,13 +2,17 @@ package com.tzld.piaoquan.wecom.job;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.tzld.piaoquan.wecom.common.enums.MessageAttachmentTypeEnum;
 import com.tzld.piaoquan.wecom.dao.mapper.UserMapper;
-import com.tzld.piaoquan.wecom.model.bo.Miniprogram;
+import com.tzld.piaoquan.wecom.model.bo.MiniprogramRecord;
 import com.tzld.piaoquan.wecom.model.po.HistoryMessage;
+import com.tzld.piaoquan.wecom.model.po.MessageAttachment;
 import com.tzld.piaoquan.wecom.service.AccessTokenService;
 import com.tzld.piaoquan.wecom.service.HistoryMessageService;
+import com.tzld.piaoquan.wecom.service.MessageAttachmentService;
 import com.tzld.piaoquan.wecom.utils.HttpClientUtil;
 import com.tzld.piaoquan.wecom.utils.HttpPoolClient;
+import com.tzld.piaoquan.wecom.utils.MiniprogramUtil;
 import com.tzld.piaoquan.wecom.utils.URLUtil;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -40,11 +44,19 @@ public class WeComHistoryDataJob {
     @Autowired
     private HistoryMessageService historyMessageService;
 
+    @Autowired
+    private MessageAttachmentService messageAttachmentService;
+
     public void selectHistoryMessageByDay() {
-        long startTime = 1723996800L;
-        long endTime = System.currentTimeMillis() / 1000;
+        long startTime = 1722268800L;
+//        long endTime = System.currentTimeMillis() / 1000;
+        long endTime = 1726934399L;
         for (; startTime < endTime; startTime += 60 * 60 * 24) {
-            selectHistoryMessage(startTime, startTime + 60 * 60 * 24);
+            if(startTime + 60 * 60 * 24 < endTime){
+                selectHistoryMessage(startTime, startTime + 60 * 60 * 24);
+            }else {
+                selectHistoryMessage(startTime, endTime);
+            }
         }
     }
 
@@ -56,7 +68,7 @@ public class WeComHistoryDataJob {
             }
             int page = total / size + 1;
             for (int n = 0; n < page; n++) {
-                String res = getHistoryData(size, n, startTime, endTime);
+                String res = getHistoryData(size, n * size, startTime, endTime);
                 //TODO 记录查询数据 info日志
                 if (ObjectUtils.isEmpty(res)) {
                     return;
@@ -65,20 +77,29 @@ public class WeComHistoryDataJob {
                 JSONArray jsonArray = jsonObject.getJSONArray("missions");
                 for (int i = 0; i < jsonArray.size(); i++) {
                     List<String> allExternalUserList = new ArrayList<>();
-                    List<Miniprogram> miniprogramList = new ArrayList<>();
+                    List<MiniprogramRecord> miniprogramRecordList = new ArrayList<>();
+                    List<MessageAttachment> messageAttachmentList = new ArrayList<>();
                     Date createdAt = jsonArray.getJSONObject(i).getDate("created_at");
                     JSONArray attachments = jsonArray.getJSONObject(i).getJSONObject("msg_data").getJSONArray("attachments");
                     for (int j = 0; j < attachments.size(); j++) {
-                        Miniprogram miniprogram = new Miniprogram();
-                        String inxdePage = attachments.getJSONObject(j).getJSONObject("miniprogram").getString("page");
-                        //历史先用切割法
-                        String translate = URLUtil.translate(inxdePage);
-                        String videoId = translate.split("id=")[1].split("&")[0];
-                        if (StringUtils.isNotEmpty(videoId) && StringUtils.isNumeric(videoId)) {
-                            miniprogram.setVideoId(Long.parseLong(videoId));
-                        }
-                        miniprogram.setAttachmentIdx(j + 1);
-                        miniprogramList.add(miniprogram);
+                        MiniprogramRecord miniprogramRecord = new MiniprogramRecord();
+                        MessageAttachment messageAttachment = new MessageAttachment();
+                        String indexPage = attachments.getJSONObject(j).getJSONObject("miniprogram").getString("page");
+                        Long videoId = MiniprogramUtil.getVideoId(indexPage);
+                        miniprogramRecord.setVideoId(videoId);
+                        miniprogramRecord.setAttachmentIdx(j + 1);
+                        miniprogramRecordList.add(miniprogramRecord);
+
+                        String cover = attachments.getJSONObject(j).getJSONObject("miniprogram").getString("cover");
+                        String appid = attachments.getJSONObject(j).getJSONObject("miniprogram").getString("appid");
+                        String title = attachments.getJSONObject(j).getJSONObject("miniprogram").getString("title");
+                        messageAttachment.setAppid(appid);
+                        messageAttachment.setCover(cover);
+                        messageAttachment.setPage(indexPage);
+                        messageAttachment.setTitle(title);
+                        messageAttachment.setMiniprogramVideoId(videoId);
+                        messageAttachment.setType(MessageAttachmentTypeEnum.MINIPROGRAM.getType());
+                        messageAttachmentList.add(messageAttachment);
                     }
                     JSONArray subMissionList = jsonArray.getJSONObject(i).getJSONArray("sub_mission_list");
                     for (int k = 0; k < subMissionList.size(); k++) {
@@ -91,7 +112,8 @@ public class WeComHistoryDataJob {
                         }
                         allExternalUserList.addAll(externalUserList);
                     }
-                    insertHistoryMessageList(allExternalUserList, miniprogramList, createdAt);
+                    insertHistoryMessageList(allExternalUserList, miniprogramRecordList, createdAt);
+                    messageAttachmentService.addMiniprogram(messageAttachmentList);
                 }
             }
         } catch (IOException e) {
@@ -101,18 +123,18 @@ public class WeComHistoryDataJob {
     }
 
 
-    private void insertHistoryMessageList(List<String> allExternalUserList, List<Miniprogram> miniprogramList, Date sendTime) {
+    private void insertHistoryMessageList(List<String> allExternalUserList, List<MiniprogramRecord> miniprogramRecordList, Date sendTime) {
         List<HistoryMessage> historyMessageList = new ArrayList<>();
         for (String externalUserId3rdParty : allExternalUserList) {
             Long userId = userMapper.selectIdByExternalUserId3rdParty(externalUserId3rdParty);
             if (userId == null) {
                 continue;
             }
-            for (Miniprogram miniprogram : miniprogramList) {
+            for (MiniprogramRecord miniprogramRecord : miniprogramRecordList) {
                 HistoryMessage historyMessage = new HistoryMessage();
                 historyMessage.setSendTime(sendTime);
-                historyMessage.setAttachmentIdx(miniprogram.getAttachmentIdx());
-                historyMessage.setVideoId(miniprogram.getVideoId());
+                historyMessage.setAttachmentIdx(miniprogramRecord.getAttachmentIdx());
+                historyMessage.setVideoId(miniprogramRecord.getVideoId());
                 historyMessage.setUserId(userId);
                 historyMessageList.add(historyMessage);
             }
@@ -123,7 +145,7 @@ public class WeComHistoryDataJob {
     public Integer getHistoryDataTotal(Long startTime, Long endTime) throws IOException {
         String res = getHistoryData(1, 0, startTime, endTime);
         JSONObject jsonObject = JSONObject.parseObject(res);
-        return jsonObject.getInteger("total");
+        return jsonObject.getInteger("total_count");
     }
 
     public String getHistoryData(Integer limit, Integer offset, Long startTime, Long endTime) throws IOException {

+ 88 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/job/WeComMessageDataJob.java

@@ -0,0 +1,88 @@
+package com.tzld.piaoquan.wecom.job;
+
+import com.aliyun.odps.data.Record;
+import com.tzld.piaoquan.wecom.common.constant.MiniprogramConstant;
+import com.tzld.piaoquan.wecom.dao.mapper.UserMapper;
+import com.tzld.piaoquan.wecom.model.bo.PushMessage;
+import com.tzld.piaoquan.wecom.model.po.User;
+import com.tzld.piaoquan.wecom.utils.OdpsUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Component
+public class WeComMessageDataJob {
+
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    private static final int sum = 3;
+
+    List<PushMessage> goodList = new ArrayList<>();
+    List<Long> saveList = new ArrayList<>();
+
+    void init() {
+        List<Record> recordList = OdpsUtil.getOdpsData("SELECT * FROM loghubods.history_good_video_can_push_user_list where dt = 20240922;");
+        if (CollectionUtils.isEmpty(recordList)) {
+            return;
+        }
+        List<PushMessage> list = new ArrayList<>();
+        for (Record record : recordList) {
+            PushMessage pushMessage = new PushMessage();
+            Long videoId = Long.parseLong((String) record.get(0));
+            StringBuilder stringBuilder = new StringBuilder((String) record.get(1));
+            stringBuilder.delete(0, 1);
+            stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
+            Set<Long> userIds = Arrays.stream(stringBuilder.toString().split(",")).map(String::trim).map(Long::parseLong).collect(Collectors.toSet());
+            pushMessage.setVideoId(videoId);
+            pushMessage.setUserIds(userIds);
+            list.add(pushMessage);
+        }
+        goodList = list;
+        saveList = Objects.requireNonNull(redisTemplate.opsForList().range(MiniprogramConstant.GUARANTEED_MINIPROGRAM_KEY, 0, 2)).stream().map(o -> (Long) o).collect(Collectors.toList());
+    }
+
+
+
+    public String getPushKey(User user) {
+        int i = 0;
+        StringBuilder key = new StringBuilder();
+        for (PushMessage pushMessage : goodList) {
+            if (pushMessage.getUserIds().contains(user.getId())) {
+                if (key.length() == 0) {
+                    key.append(pushMessage.getVideoId());
+                    i++;
+                } else {
+                    key.append("_");
+                    key.append(pushMessage.getVideoId());
+                }
+                i++;
+                if (i > sum) {
+                    return key.toString();
+                }
+            }
+        }
+        for (Long videoId : saveList) {
+            if (key.length() == 0) {
+                key.append(videoId);
+                i++;
+            } else {
+                key.append("_");
+                key.append(videoId);
+            }
+            i++;
+            if (i > sum) {
+                return key.toString();
+            }
+        }
+        return key.toString();
+    }
+}

+ 1 - 4
we-com-server/src/main/java/com/tzld/piaoquan/wecom/model/bo/Miniprogram.java → we-com-server/src/main/java/com/tzld/piaoquan/wecom/model/bo/MiniprogramRecord.java

@@ -1,12 +1,9 @@
 package com.tzld.piaoquan.wecom.model.bo;
 
 import lombok.Data;
-import lombok.Getter;
-
-import java.util.Date;
 
 @Data
-public class Miniprogram {
+public class MiniprogramRecord {
 
     private Long videoId;
 

+ 13 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/model/bo/PushMessage.java

@@ -0,0 +1,13 @@
+package com.tzld.piaoquan.wecom.model.bo;
+
+import lombok.Data;
+
+import java.util.Set;
+
+@Data
+public class PushMessage {
+
+    private Long videoId;
+
+    private Set<Long> userIds;
+}

+ 148 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/model/po/MessageAttachment.java

@@ -0,0 +1,148 @@
+package com.tzld.piaoquan.wecom.model.po;
+
+import java.util.Date;
+
+public class MessageAttachment {
+
+    private Long id;
+
+    private Integer type;
+
+    private String url;
+
+    private String title;
+
+    private String desc;
+
+    private String appid;
+
+    private String page;
+
+    private String cover;
+
+    private Long miniprogramVideoId;
+
+    private Integer isDelete;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public String getAppid() {
+        return appid;
+    }
+
+    public void setAppid(String appid) {
+        this.appid = appid;
+    }
+
+    public String getPage() {
+        return page;
+    }
+
+    public void setPage(String page) {
+        this.page = page;
+    }
+
+    public String getCover() {
+        return cover;
+    }
+
+    public void setCover(String cover) {
+        this.cover = cover;
+    }
+
+    public Long getMiniprogramVideoId() {
+        return miniprogramVideoId;
+    }
+
+    public void setMiniprogramVideoId(Long miniprogramVideoId) {
+        this.miniprogramVideoId = miniprogramVideoId;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    @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(", type=").append(type);
+        sb.append(", url=").append(url);
+        sb.append(", title=").append(title);
+        sb.append(", desc=").append(desc);
+        sb.append(", appid=").append(appid);
+        sb.append(", page=").append(page);
+        sb.append(", cover=").append(cover);
+        sb.append(", miniprogramVideoId=").append(miniprogramVideoId);
+        sb.append(", isDelete=").append(isDelete);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 993 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/model/po/MessageAttachmentExample.java

@@ -0,0 +1,993 @@
+package com.tzld.piaoquan.wecom.model.po;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class MessageAttachmentExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public MessageAttachmentExample() {
+        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;
+    }
+
+    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 andTypeIsNull() {
+            addCriterion("`type` is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIsNotNull() {
+            addCriterion("`type` is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeEqualTo(Integer value) {
+            addCriterion("`type` =", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotEqualTo(Integer value) {
+            addCriterion("`type` <>", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThan(Integer value) {
+            addCriterion("`type` >", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeGreaterThanOrEqualTo(Integer value) {
+            addCriterion("`type` >=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThan(Integer value) {
+            addCriterion("`type` <", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeLessThanOrEqualTo(Integer value) {
+            addCriterion("`type` <=", value, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeIn(List<Integer> values) {
+            addCriterion("`type` in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotIn(List<Integer> values) {
+            addCriterion("`type` not in", values, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeBetween(Integer value1, Integer value2) {
+            addCriterion("`type` between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andTypeNotBetween(Integer value1, Integer value2) {
+            addCriterion("`type` not between", value1, value2, "type");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIsNull() {
+            addCriterion("url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIsNotNull() {
+            addCriterion("url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlEqualTo(String value) {
+            addCriterion("url =", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotEqualTo(String value) {
+            addCriterion("url <>", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlGreaterThan(String value) {
+            addCriterion("url >", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("url >=", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLessThan(String value) {
+            addCriterion("url <", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLessThanOrEqualTo(String value) {
+            addCriterion("url <=", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlLike(String value) {
+            addCriterion("url like", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotLike(String value) {
+            addCriterion("url not like", value, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlIn(List<String> values) {
+            addCriterion("url in", values, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotIn(List<String> values) {
+            addCriterion("url not in", values, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlBetween(String value1, String value2) {
+            addCriterion("url between", value1, value2, "url");
+            return (Criteria) this;
+        }
+
+        public Criteria andUrlNotBetween(String value1, String value2) {
+            addCriterion("url not between", value1, value2, "url");
+            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 andDescIsNull() {
+            addCriterion("`desc` is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescIsNotNull() {
+            addCriterion("`desc` is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescEqualTo(String value) {
+            addCriterion("`desc` =", value, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescNotEqualTo(String value) {
+            addCriterion("`desc` <>", value, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescGreaterThan(String value) {
+            addCriterion("`desc` >", value, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescGreaterThanOrEqualTo(String value) {
+            addCriterion("`desc` >=", value, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescLessThan(String value) {
+            addCriterion("`desc` <", value, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescLessThanOrEqualTo(String value) {
+            addCriterion("`desc` <=", value, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescLike(String value) {
+            addCriterion("`desc` like", value, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescNotLike(String value) {
+            addCriterion("`desc` not like", value, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescIn(List<String> values) {
+            addCriterion("`desc` in", values, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescNotIn(List<String> values) {
+            addCriterion("`desc` not in", values, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescBetween(String value1, String value2) {
+            addCriterion("`desc` between", value1, value2, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andDescNotBetween(String value1, String value2) {
+            addCriterion("`desc` not between", value1, value2, "desc");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidIsNull() {
+            addCriterion("appid is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidIsNotNull() {
+            addCriterion("appid is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidEqualTo(String value) {
+            addCriterion("appid =", value, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidNotEqualTo(String value) {
+            addCriterion("appid <>", value, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidGreaterThan(String value) {
+            addCriterion("appid >", value, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidGreaterThanOrEqualTo(String value) {
+            addCriterion("appid >=", value, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidLessThan(String value) {
+            addCriterion("appid <", value, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidLessThanOrEqualTo(String value) {
+            addCriterion("appid <=", value, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidLike(String value) {
+            addCriterion("appid like", value, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidNotLike(String value) {
+            addCriterion("appid not like", value, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidIn(List<String> values) {
+            addCriterion("appid in", values, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidNotIn(List<String> values) {
+            addCriterion("appid not in", values, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidBetween(String value1, String value2) {
+            addCriterion("appid between", value1, value2, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppidNotBetween(String value1, String value2) {
+            addCriterion("appid not between", value1, value2, "appid");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageIsNull() {
+            addCriterion("page is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageIsNotNull() {
+            addCriterion("page is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageEqualTo(String value) {
+            addCriterion("page =", value, "page");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageNotEqualTo(String value) {
+            addCriterion("page <>", value, "page");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageGreaterThan(String value) {
+            addCriterion("page >", value, "page");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageGreaterThanOrEqualTo(String value) {
+            addCriterion("page >=", value, "page");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageLessThan(String value) {
+            addCriterion("page <", value, "page");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageLessThanOrEqualTo(String value) {
+            addCriterion("page <=", value, "page");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageLike(String value) {
+            addCriterion("page like", value, "page");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageNotLike(String value) {
+            addCriterion("page not like", value, "page");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageIn(List<String> values) {
+            addCriterion("page in", values, "page");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageNotIn(List<String> values) {
+            addCriterion("page not in", values, "page");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageBetween(String value1, String value2) {
+            addCriterion("page between", value1, value2, "page");
+            return (Criteria) this;
+        }
+
+        public Criteria andPageNotBetween(String value1, String value2) {
+            addCriterion("page not between", value1, value2, "page");
+            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 andMiniprogramVideoIdIsNull() {
+            addCriterion("miniprogram_video_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMiniprogramVideoIdIsNotNull() {
+            addCriterion("miniprogram_video_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMiniprogramVideoIdEqualTo(Long value) {
+            addCriterion("miniprogram_video_id =", value, "miniprogramVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMiniprogramVideoIdNotEqualTo(Long value) {
+            addCriterion("miniprogram_video_id <>", value, "miniprogramVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMiniprogramVideoIdGreaterThan(Long value) {
+            addCriterion("miniprogram_video_id >", value, "miniprogramVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMiniprogramVideoIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("miniprogram_video_id >=", value, "miniprogramVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMiniprogramVideoIdLessThan(Long value) {
+            addCriterion("miniprogram_video_id <", value, "miniprogramVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMiniprogramVideoIdLessThanOrEqualTo(Long value) {
+            addCriterion("miniprogram_video_id <=", value, "miniprogramVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMiniprogramVideoIdIn(List<Long> values) {
+            addCriterion("miniprogram_video_id in", values, "miniprogramVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMiniprogramVideoIdNotIn(List<Long> values) {
+            addCriterion("miniprogram_video_id not in", values, "miniprogramVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMiniprogramVideoIdBetween(Long value1, Long value2) {
+            addCriterion("miniprogram_video_id between", value1, value2, "miniprogramVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMiniprogramVideoIdNotBetween(Long value1, Long value2) {
+            addCriterion("miniprogram_video_id not between", value1, value2, "miniprogramVideoId");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteIsNull() {
+            addCriterion("is_delete is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteIsNotNull() {
+            addCriterion("is_delete is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteEqualTo(Integer value) {
+            addCriterion("is_delete =", value, "isDelete");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteNotEqualTo(Integer value) {
+            addCriterion("is_delete <>", value, "isDelete");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteGreaterThan(Integer value) {
+            addCriterion("is_delete >", value, "isDelete");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteGreaterThanOrEqualTo(Integer value) {
+            addCriterion("is_delete >=", value, "isDelete");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteLessThan(Integer value) {
+            addCriterion("is_delete <", value, "isDelete");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteLessThanOrEqualTo(Integer value) {
+            addCriterion("is_delete <=", value, "isDelete");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteIn(List<Integer> values) {
+            addCriterion("is_delete in", values, "isDelete");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteNotIn(List<Integer> values) {
+            addCriterion("is_delete not in", values, "isDelete");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteBetween(Integer value1, Integer value2) {
+            addCriterion("is_delete between", value1, value2, "isDelete");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsDeleteNotBetween(Integer value1, Integer value2) {
+            addCriterion("is_delete not between", value1, value2, "isDelete");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Date value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table we_com_message_attachment
+     *
+     * @mbg.generated do_not_delete_during_merge
+     */
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    /**
+     * This class was generated by MyBatis Generator.
+     * This class corresponds to the database table we_com_message_attachment
+     *
+     * @mbg.generated
+     */
+    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);
+        }
+    }
+}

+ 18 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/model/vo/MiniprogramVo.java

@@ -0,0 +1,18 @@
+package com.tzld.piaoquan.wecom.model.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class MiniprogramVo {
+
+    private String title;
+
+    private String appid;
+
+    private String page;
+
+    private String cover;
+
+}

+ 2 - 2
we-com-server/src/main/java/com/tzld/piaoquan/wecom/service/Impl/AccessTokenServiceImpl.java

@@ -25,11 +25,11 @@ public class AccessTokenServiceImpl implements AccessTokenService {
     private String SECRET = "9fe05442559750d0cc3e71c5f81217a4";
 
     @Autowired
-    private RedisTemplate<String, String> redisTemplate;
+    private RedisTemplate<String, Object> redisTemplate;
 
     @Override
     public String getAccessToken() {
-        String accessToken = redisTemplate.opsForValue().get(ACCESS_TOKEN);
+        String accessToken = (String) redisTemplate.opsForValue().get(ACCESS_TOKEN);
         if (StringUtils.isNotEmpty(accessToken)) {
             return accessToken;
         }

+ 88 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/service/Impl/MessageAttachmentServiceImpl.java

@@ -0,0 +1,88 @@
+package com.tzld.piaoquan.wecom.service.Impl;
+
+import com.tzld.piaoquan.wecom.common.constant.MiniprogramConstant;
+import com.tzld.piaoquan.wecom.common.enums.MessageAttachmentTypeEnum;
+import com.tzld.piaoquan.wecom.common.exception.CustomizeException;
+import com.tzld.piaoquan.wecom.dao.mapper.MessageAttachmentMapper;
+import com.tzld.piaoquan.wecom.model.po.MessageAttachment;
+import com.tzld.piaoquan.wecom.model.po.MessageAttachmentExample;
+import com.tzld.piaoquan.wecom.model.vo.MiniprogramVo;
+import com.tzld.piaoquan.wecom.service.MessageAttachmentService;
+import com.tzld.piaoquan.wecom.utils.MiniprogramUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.tzld.piaoquan.wecom.common.constant.MiniprogramConstant.*;
+import static com.tzld.piaoquan.wecom.common.enums.ExceptionCodeEnum.PARAMS_ERROR;
+
+
+@Service
+public class MessageAttachmentServiceImpl implements MessageAttachmentService {
+
+
+    @Autowired
+    private MessageAttachmentMapper messageAttachmentMapper;
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @Override
+    public void addMiniprogram(List<MessageAttachment> messageAttachmentList) {
+        for (MessageAttachment messageAttachment : messageAttachmentList) {
+            MessageAttachmentExample example = new MessageAttachmentExample();
+            example.createCriteria()
+                    .andAppidEqualTo(messageAttachment.getAppid())
+                    .andTypeEqualTo(messageAttachment.getType())
+                    .andMiniprogramVideoIdEqualTo(messageAttachment.getMiniprogramVideoId());
+            List<MessageAttachment> messageAttachments = messageAttachmentMapper.selectByExample(example);
+            if (CollectionUtils.isEmpty(messageAttachments)) {
+                messageAttachmentMapper.insert(messageAttachment);
+                continue;
+            }
+            messageAttachment.setId(messageAttachments.get(0).getId());
+            messageAttachmentMapper.updateByPrimaryKeySelective(messageAttachment);
+        }
+    }
+
+    @Override
+    public void createGuaranteedMiniprogram(List<MiniprogramVo> miniprogramVoList) {
+        List<MessageAttachment> messageAttachmentList = new ArrayList<>();
+        List<Long> videoList = new ArrayList<>();
+        for (MiniprogramVo miniprogramVo : miniprogramVoList) {
+            if (StringUtils.isEmpty(miniprogramVo.getPage())) {
+                throw new CustomizeException(PARAMS_ERROR);
+            }
+            if (StringUtils.isEmpty(miniprogramVo.getCover())) {
+                throw new CustomizeException(PARAMS_ERROR);
+            }
+            if (StringUtils.isEmpty(miniprogramVo.getTitle())) {
+                throw new CustomizeException(PARAMS_ERROR);
+            }
+            Long videoId = MiniprogramUtil.getVideoId(miniprogramVo.getPage());
+            if (videoId == null) {
+                throw new CustomizeException(PARAMS_ERROR);
+            }
+            if (StringUtils.isEmpty(miniprogramVo.getAppid())) {
+                miniprogramVo.setAppid(MiniprogramConstant.appid);
+            }
+            MessageAttachment messageAttachment = new MessageAttachment();
+            BeanUtils.copyProperties(miniprogramVo, messageAttachment);
+            messageAttachment.setMiniprogramVideoId(videoId);
+            messageAttachment.setType(MessageAttachmentTypeEnum.MINIPROGRAM.getType());
+            messageAttachmentList.add(messageAttachment);
+            videoList.add(videoId);
+        }
+        addMiniprogram(messageAttachmentList);
+        redisTemplate.opsForList().leftPushAll(GUARANTEED_MINIPROGRAM_KEY, videoList);
+        //保底数据只保留部分
+        redisTemplate.opsForList().trim(GUARANTEED_MINIPROGRAM_KEY, 0, max_length);
+
+    }
+}

+ 13 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/service/MessageAttachmentService.java

@@ -0,0 +1,13 @@
+package com.tzld.piaoquan.wecom.service;
+
+import com.tzld.piaoquan.wecom.model.po.MessageAttachment;
+import com.tzld.piaoquan.wecom.model.vo.MiniprogramVo;
+
+import java.util.List;
+
+public interface MessageAttachmentService {
+
+    void addMiniprogram(List<MessageAttachment> messageAttachmentList);
+
+    void createGuaranteedMiniprogram(List<MiniprogramVo> miniprogramVoList);
+}

+ 15 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/utils/MiniprogramUtil.java

@@ -0,0 +1,15 @@
+package com.tzld.piaoquan.wecom.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class MiniprogramUtil {
+
+    public static Long getVideoId(String page){
+        String translate = URLUtil.translate(page);
+        String videoId = translate.split("id=")[1].split("&")[0];
+        if (StringUtils.isNotEmpty(videoId) && StringUtils.isNumeric(videoId)) {
+            return Long.parseLong(videoId);
+        }
+        return null;
+    }
+}

+ 33 - 0
we-com-server/src/main/java/com/tzld/piaoquan/wecom/utils/OdpsUtil.java

@@ -0,0 +1,33 @@
+package com.tzld.piaoquan.wecom.utils;
+
+import com.aliyun.odps.Instance;
+import com.aliyun.odps.Odps;
+import com.aliyun.odps.OdpsException;
+import com.aliyun.odps.account.Account;
+import com.aliyun.odps.account.AliyunAccount;
+import com.aliyun.odps.data.Record;
+import com.aliyun.odps.task.SQLTask;
+
+import java.util.List;
+
+public class OdpsUtil {
+
+    public static List<Record> getOdpsData(String sql) {
+        String accessId = "LTAI9EBa0bd5PrDa";
+        String accessKey = "vAalxds7YxhfOA2yVv8GziCg3Y87v5";
+        String endpoint = "http://service.odps.aliyun.com/api";
+        Account account = new AliyunAccount(accessId, accessKey);
+        Odps odps = new Odps(account);
+        odps.setEndpoint(endpoint);
+        odps.setDefaultProject("loghubods");
+        Instance i;
+        try {
+            i = SQLTask.run(odps, sql);
+            i.waitForSuccess();
+            return SQLTask.getResult(i);
+        } catch (OdpsException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 324 - 0
we-com-server/src/main/resources/mapper/MessageAttachmentMapper.xml

@@ -0,0 +1,324 @@
+<?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.wecom.dao.mapper.MessageAttachmentMapper">
+  <resultMap id="BaseResultMap" type="com.tzld.piaoquan.wecom.model.po.MessageAttachment">
+
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="type" jdbcType="INTEGER" property="type" />
+    <result column="url" jdbcType="VARCHAR" property="url" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="desc" jdbcType="VARCHAR" property="desc" />
+    <result column="appid" jdbcType="VARCHAR" property="appid" />
+    <result column="page" jdbcType="VARCHAR" property="page" />
+    <result column="cover" jdbcType="VARCHAR" property="cover" />
+    <result column="miniprogram_video_id" jdbcType="BIGINT" property="miniprogramVideoId" />
+    <result column="is_delete" jdbcType="INTEGER" property="isDelete" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+  </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, `type`, url, title, `desc`, appid, page, cover, miniprogram_video_id, is_delete, 
+    create_time, update_time
+  </sql>
+  <select id="selectByExample" parameterType="com.tzld.piaoquan.wecom.model.po.MessageAttachmentExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from we_com_message_attachment
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from we_com_message_attachment
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    delete from we_com_message_attachment
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.tzld.piaoquan.wecom.model.po.MessageAttachmentExample">
+    delete from we_com_message_attachment
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.tzld.piaoquan.wecom.model.po.MessageAttachment">
+    insert into we_com_message_attachment (id, `type`, url, 
+      title, `desc`, appid, 
+      page, cover, miniprogram_video_id, 
+      create_time, update_time
+      )
+    values (#{id,jdbcType=BIGINT}, #{type,jdbcType=INTEGER}, #{url,jdbcType=VARCHAR}, 
+      #{title,jdbcType=VARCHAR}, #{desc,jdbcType=VARCHAR}, #{appid,jdbcType=VARCHAR}, 
+      #{page,jdbcType=VARCHAR}, #{cover,jdbcType=VARCHAR}, #{miniprogramVideoId,jdbcType=BIGINT}, 
+      #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.tzld.piaoquan.wecom.model.po.MessageAttachment">
+    insert into we_com_message_attachment
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="type != null">
+        `type`,
+      </if>
+      <if test="url != null">
+        url,
+      </if>
+      <if test="title != null">
+        title,
+      </if>
+      <if test="desc != null">
+        `desc`,
+      </if>
+      <if test="appid != null">
+        appid,
+      </if>
+      <if test="page != null">
+        page,
+      </if>
+      <if test="cover != null">
+        cover,
+      </if>
+      <if test="miniprogramVideoId != null">
+        miniprogram_video_id,
+      </if>
+      <if test="isDelete != null">
+        is_delete,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="type != null">
+        #{type,jdbcType=INTEGER},
+      </if>
+      <if test="url != null">
+        #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="title != null">
+        #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="desc != null">
+        #{desc,jdbcType=VARCHAR},
+      </if>
+      <if test="appid != null">
+        #{appid,jdbcType=VARCHAR},
+      </if>
+      <if test="page != null">
+        #{page,jdbcType=VARCHAR},
+      </if>
+      <if test="cover != null">
+        #{cover,jdbcType=VARCHAR},
+      </if>
+      <if test="miniprogramVideoId != null">
+        #{miniprogramVideoId,jdbcType=BIGINT},
+      </if>
+      <if test="isDelete != null">
+        #{isDelete,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.tzld.piaoquan.wecom.model.po.MessageAttachmentExample" resultType="java.lang.Long">
+    select count(*) from we_com_message_attachment
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update we_com_message_attachment
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=BIGINT},
+      </if>
+      <if test="record.type != null">
+        `type` = #{record.type,jdbcType=INTEGER},
+      </if>
+      <if test="record.url != null">
+        url = #{record.url,jdbcType=VARCHAR},
+      </if>
+      <if test="record.title != null">
+        title = #{record.title,jdbcType=VARCHAR},
+      </if>
+      <if test="record.desc != null">
+        `desc` = #{record.desc,jdbcType=VARCHAR},
+      </if>
+      <if test="record.appid != null">
+        appid = #{record.appid,jdbcType=VARCHAR},
+      </if>
+      <if test="record.page != null">
+        page = #{record.page,jdbcType=VARCHAR},
+      </if>
+      <if test="record.cover != null">
+        cover = #{record.cover,jdbcType=VARCHAR},
+      </if>
+      <if test="record.miniprogramVideoId != null">
+        miniprogram_video_id = #{record.miniprogramVideoId,jdbcType=BIGINT},
+      </if>
+      <if test="record.isDelete != null">
+        is_delete = #{record.isDelete,jdbcType=INTEGER},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update we_com_message_attachment
+    set id = #{record.id,jdbcType=BIGINT},
+      `type` = #{record.type,jdbcType=INTEGER},
+      url = #{record.url,jdbcType=VARCHAR},
+      title = #{record.title,jdbcType=VARCHAR},
+      `desc` = #{record.desc,jdbcType=VARCHAR},
+      appid = #{record.appid,jdbcType=VARCHAR},
+      page = #{record.page,jdbcType=VARCHAR},
+      cover = #{record.cover,jdbcType=VARCHAR},
+      miniprogram_video_id = #{record.miniprogramVideoId,jdbcType=BIGINT},
+      is_delete = #{record.isDelete,jdbcType=INTEGER},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.tzld.piaoquan.wecom.model.po.MessageAttachment">
+    update we_com_message_attachment
+    <set>
+      <if test="type != null">
+        `type` = #{type,jdbcType=INTEGER},
+      </if>
+      <if test="url != null">
+        url = #{url,jdbcType=VARCHAR},
+      </if>
+      <if test="title != null">
+        title = #{title,jdbcType=VARCHAR},
+      </if>
+      <if test="desc != null">
+        `desc` = #{desc,jdbcType=VARCHAR},
+      </if>
+      <if test="appid != null">
+        appid = #{appid,jdbcType=VARCHAR},
+      </if>
+      <if test="page != null">
+        page = #{page,jdbcType=VARCHAR},
+      </if>
+      <if test="cover != null">
+        cover = #{cover,jdbcType=VARCHAR},
+      </if>
+      <if test="miniprogramVideoId != null">
+        miniprogram_video_id = #{miniprogramVideoId,jdbcType=BIGINT},
+      </if>
+      <if test="isDelete != null">
+        is_delete = #{isDelete,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.tzld.piaoquan.wecom.model.po.MessageAttachment">
+    update we_com_message_attachment
+    set `type` = #{type,jdbcType=INTEGER},
+      url = #{url,jdbcType=VARCHAR},
+      title = #{title,jdbcType=VARCHAR},
+      `desc` = #{desc,jdbcType=VARCHAR},
+      appid = #{appid,jdbcType=VARCHAR},
+      page = #{page,jdbcType=VARCHAR},
+      cover = #{cover,jdbcType=VARCHAR},
+      miniprogram_video_id = #{miniprogramVideoId,jdbcType=BIGINT},
+      is_delete = #{isDelete,jdbcType=INTEGER},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+</mapper>