소스 검색

Merge branch 'dev-xym-add-url' of Server/growth-manager into master

xueyiming 3 달 전
부모
커밋
c6b6c789dc

+ 1 - 1
api-module/src/main/resources/mybatis-generator-config.xml

@@ -55,7 +55,7 @@
 <!--        <table tableName="we_com_guarantees_video" domainObjectName="GuaranteesVideo" alias=""/>-->
 <!--        <table tableName="we_com_staff" domainObjectName="Staff" alias=""/>-->
 <!--        <table tableName="we_com_message_attachment" domainObjectName="MessageAttachment" alias=""/>-->
-        <table tableName="we_com_user_with_tag" domainObjectName="UserWithTag" alias=""/>
+        <table tableName="we_com_special_send_message" domainObjectName="SpecialSendMessage" alias=""/>
 <!--        <table tableName="we_com_send_msg_result" domainObjectName="SendMsgResult" alias=""/>-->
 <!--        <table tableName="we_com_corp" domainObjectName="Corp" alias=""/>-->
 

+ 40 - 0
common-module/src/main/java/com/tzld/piaoquan/growth/common/dao/mapper/SpecialSendMessageMapper.java

@@ -0,0 +1,40 @@
+package com.tzld.piaoquan.growth.common.dao.mapper;
+
+import com.tzld.piaoquan.growth.common.model.po.SpecialSendMessage;
+import com.tzld.piaoquan.growth.common.model.po.SpecialSendMessageExample;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface SpecialSendMessageMapper {
+    long countByExample(SpecialSendMessageExample example);
+
+    int deleteByExample(SpecialSendMessageExample example);
+
+    int deleteByPrimaryKey(Long id);
+
+    int insert(SpecialSendMessage record);
+
+    int insertSelective(SpecialSendMessage record);
+
+    List<SpecialSendMessage> selectByExample(SpecialSendMessageExample example);
+
+    SpecialSendMessage selectByPrimaryKey(Long id);
+
+    int updateByExampleSelective(@Param("record") SpecialSendMessage record, @Param("example") SpecialSendMessageExample example);
+
+    int updateByExample(@Param("record") SpecialSendMessage record, @Param("example") SpecialSendMessageExample example);
+
+    int updateByPrimaryKeySelective(SpecialSendMessage record);
+
+    int updateByPrimaryKey(SpecialSendMessage record);
+
+    List<SpecialSendMessage> getGroupList();
+
+    List<String> selectExternalUserId(@Param("staffId") Long staffId, @Param("group") Integer group);
+}

+ 15 - 0
common-module/src/main/java/com/tzld/piaoquan/growth/common/dao/mapper/WeComUserMapper.java

@@ -36,4 +36,19 @@ public interface WeComUserMapper {
     Long selectIdByExternalUserId(String externalUserId);
 
     void insertList(@Param("list") List<WeComUser> list);
+
+    List<WeComUser> selectUserList(@Param("staffId") Long staffId,
+                                   @Param("groupMsgDisabled") byte groupMsgDisabled,
+                                   @Param("pageNum") Integer pageNum,
+                                   @Param("pageSize") Integer pageSize);
+
+    List<WeComUser> selectSendUserList(@Param("staffId") Long staffId,
+                                       @Param("groupMsgDisabled") byte groupMsgDisabled,
+                                       @Param("pageNum") Integer pageNum,
+                                       @Param("pageSize") Integer pageSize);
+
+    List<WeComUser> selectNotSendUserList(@Param("staffId") Long staffId,
+                                          @Param("groupMsgDisabled") byte groupMsgDisabled,
+                                          @Param("pageNum") Integer pageNum,
+                                          @Param("pageSize") Integer pageSize);
 }

+ 114 - 0
common-module/src/main/java/com/tzld/piaoquan/growth/common/model/po/SpecialSendMessage.java

@@ -0,0 +1,114 @@
+package com.tzld.piaoquan.growth.common.model.po;
+
+import java.util.Date;
+
+public class SpecialSendMessage {
+    private Long id;
+
+    private Long staffId;
+
+    private Long userId;
+
+    private Integer group;
+
+    private String content;
+
+    private String attachmentIds;
+
+    private Integer isSend;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getStaffId() {
+        return staffId;
+    }
+
+    public void setStaffId(Long staffId) {
+        this.staffId = staffId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Integer getGroup() {
+        return group;
+    }
+
+    public void setGroup(Integer group) {
+        this.group = group;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getAttachmentIds() {
+        return attachmentIds;
+    }
+
+    public void setAttachmentIds(String attachmentIds) {
+        this.attachmentIds = attachmentIds;
+    }
+
+    public Integer getIsSend() {
+        return isSend;
+    }
+
+    public void setIsSend(Integer isSend) {
+        this.isSend = isSend;
+    }
+
+    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(", staffId=").append(staffId);
+        sb.append(", userId=").append(userId);
+        sb.append(", group=").append(group);
+        sb.append(", content=").append(content);
+        sb.append(", attachmentIds=").append(attachmentIds);
+        sb.append(", isSend=").append(isSend);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 773 - 0
common-module/src/main/java/com/tzld/piaoquan/growth/common/model/po/SpecialSendMessageExample.java

@@ -0,0 +1,773 @@
+package com.tzld.piaoquan.growth.common.model.po;
+
+import com.tzld.piaoquan.growth.common.utils.page.Page;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class SpecialSendMessageExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    protected Page page;
+
+    public SpecialSendMessageExample() {
+        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;
+    }
+
+    public void setPage(Page page) {
+        this.page=page;
+    }
+
+    public Page getPage() {
+        return page;
+    }
+
+    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 andStaffIdIsNull() {
+            addCriterion("staff_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStaffIdIsNotNull() {
+            addCriterion("staff_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStaffIdEqualTo(Long value) {
+            addCriterion("staff_id =", value, "staffId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStaffIdNotEqualTo(Long value) {
+            addCriterion("staff_id <>", value, "staffId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStaffIdGreaterThan(Long value) {
+            addCriterion("staff_id >", value, "staffId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStaffIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("staff_id >=", value, "staffId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStaffIdLessThan(Long value) {
+            addCriterion("staff_id <", value, "staffId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStaffIdLessThanOrEqualTo(Long value) {
+            addCriterion("staff_id <=", value, "staffId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStaffIdIn(List<Long> values) {
+            addCriterion("staff_id in", values, "staffId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStaffIdNotIn(List<Long> values) {
+            addCriterion("staff_id not in", values, "staffId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStaffIdBetween(Long value1, Long value2) {
+            addCriterion("staff_id between", value1, value2, "staffId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStaffIdNotBetween(Long value1, Long value2) {
+            addCriterion("staff_id not between", value1, value2, "staffId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIsNull() {
+            addCriterion("user_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIsNotNull() {
+            addCriterion("user_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdEqualTo(Long value) {
+            addCriterion("user_id =", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotEqualTo(Long value) {
+            addCriterion("user_id <>", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdGreaterThan(Long value) {
+            addCriterion("user_id >", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdGreaterThanOrEqualTo(Long value) {
+            addCriterion("user_id >=", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdLessThan(Long value) {
+            addCriterion("user_id <", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdLessThanOrEqualTo(Long value) {
+            addCriterion("user_id <=", value, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdIn(List<Long> values) {
+            addCriterion("user_id in", values, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotIn(List<Long> values) {
+            addCriterion("user_id not in", values, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdBetween(Long value1, Long value2) {
+            addCriterion("user_id between", value1, value2, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andUserIdNotBetween(Long value1, Long value2) {
+            addCriterion("user_id not between", value1, value2, "userId");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupIsNull() {
+            addCriterion("`group` is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupIsNotNull() {
+            addCriterion("`group` is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupEqualTo(Integer value) {
+            addCriterion("`group` =", value, "group");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupNotEqualTo(Integer value) {
+            addCriterion("`group` <>", value, "group");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupGreaterThan(Integer value) {
+            addCriterion("`group` >", value, "group");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupGreaterThanOrEqualTo(Integer value) {
+            addCriterion("`group` >=", value, "group");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupLessThan(Integer value) {
+            addCriterion("`group` <", value, "group");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupLessThanOrEqualTo(Integer value) {
+            addCriterion("`group` <=", value, "group");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupIn(List<Integer> values) {
+            addCriterion("`group` in", values, "group");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupNotIn(List<Integer> values) {
+            addCriterion("`group` not in", values, "group");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupBetween(Integer value1, Integer value2) {
+            addCriterion("`group` between", value1, value2, "group");
+            return (Criteria) this;
+        }
+
+        public Criteria andGroupNotBetween(Integer value1, Integer value2) {
+            addCriterion("`group` not between", value1, value2, "group");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIsNull() {
+            addCriterion("content is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIsNotNull() {
+            addCriterion("content is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentEqualTo(String value) {
+            addCriterion("content =", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotEqualTo(String value) {
+            addCriterion("content <>", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentGreaterThan(String value) {
+            addCriterion("content >", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentGreaterThanOrEqualTo(String value) {
+            addCriterion("content >=", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentLessThan(String value) {
+            addCriterion("content <", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentLessThanOrEqualTo(String value) {
+            addCriterion("content <=", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentLike(String value) {
+            addCriterion("content like", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotLike(String value) {
+            addCriterion("content not like", value, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentIn(List<String> values) {
+            addCriterion("content in", values, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotIn(List<String> values) {
+            addCriterion("content not in", values, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentBetween(String value1, String value2) {
+            addCriterion("content between", value1, value2, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andContentNotBetween(String value1, String value2) {
+            addCriterion("content not between", value1, value2, "content");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsIsNull() {
+            addCriterion("attachment_ids is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsIsNotNull() {
+            addCriterion("attachment_ids is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsEqualTo(String value) {
+            addCriterion("attachment_ids =", value, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsNotEqualTo(String value) {
+            addCriterion("attachment_ids <>", value, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsGreaterThan(String value) {
+            addCriterion("attachment_ids >", value, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsGreaterThanOrEqualTo(String value) {
+            addCriterion("attachment_ids >=", value, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsLessThan(String value) {
+            addCriterion("attachment_ids <", value, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsLessThanOrEqualTo(String value) {
+            addCriterion("attachment_ids <=", value, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsLike(String value) {
+            addCriterion("attachment_ids like", value, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsNotLike(String value) {
+            addCriterion("attachment_ids not like", value, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsIn(List<String> values) {
+            addCriterion("attachment_ids in", values, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsNotIn(List<String> values) {
+            addCriterion("attachment_ids not in", values, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsBetween(String value1, String value2) {
+            addCriterion("attachment_ids between", value1, value2, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andAttachmentIdsNotBetween(String value1, String value2) {
+            addCriterion("attachment_ids not between", value1, value2, "attachmentIds");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendIsNull() {
+            addCriterion("is_send is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendIsNotNull() {
+            addCriterion("is_send is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendEqualTo(Integer value) {
+            addCriterion("is_send =", value, "isSend");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendNotEqualTo(Integer value) {
+            addCriterion("is_send <>", value, "isSend");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendGreaterThan(Integer value) {
+            addCriterion("is_send >", value, "isSend");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendGreaterThanOrEqualTo(Integer value) {
+            addCriterion("is_send >=", value, "isSend");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendLessThan(Integer value) {
+            addCriterion("is_send <", value, "isSend");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendLessThanOrEqualTo(Integer value) {
+            addCriterion("is_send <=", value, "isSend");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendIn(List<Integer> values) {
+            addCriterion("is_send in", values, "isSend");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendNotIn(List<Integer> values) {
+            addCriterion("is_send not in", values, "isSend");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendBetween(Integer value1, Integer value2) {
+            addCriterion("is_send between", value1, value2, "isSend");
+            return (Criteria) this;
+        }
+
+        public Criteria andIsSendNotBetween(Integer value1, Integer value2) {
+            addCriterion("is_send not between", value1, value2, "isSend");
+            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;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+
+        protected Criteria() {
+            super();
+        }
+    }
+
+    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);
+        }
+    }
+}

+ 7 - 0
common-module/src/main/java/com/tzld/piaoquan/growth/common/service/Impl/MessageAttachmentServiceImpl.java

@@ -119,6 +119,13 @@ public class MessageAttachmentServiceImpl implements MessageAttachmentService {
         return messageAttachmentIds;
     }
 
+    @Override
+    public List<MessageAttachment> getMessageAttachment(List<Long> attachmentIds) {
+        MessageAttachmentExample example = new MessageAttachmentExample();
+        example.createCriteria().andIdIn(attachmentIds);
+        return messageAttachmentMapper.selectByExample(example);
+    }
+
 
     public CommonResponse<Void> createGuaranteedMiniProgram(GuaranteedParam guaranteedParam) {
         if (isInvalidGuaranteedParam(guaranteedParam)) {

+ 2 - 0
common-module/src/main/java/com/tzld/piaoquan/growth/common/service/MessageAttachmentService.java

@@ -11,6 +11,8 @@ public interface MessageAttachmentService {
 
     List<Long> addMessageAttachment(List<MessageAttachment> messageAttachmentList, Long createTime);
 
+    List<MessageAttachment> getMessageAttachment(List<Long> attachmentIds);
+
     CommonResponse<Void> createGuaranteedMiniProgram(GuaranteedParam guaranteedParam);
 
     GuaranteedParam getGuaranteedVideo(String date);

+ 299 - 0
common-module/src/main/resources/mapper/SpecialSendMessageMapper.xml

@@ -0,0 +1,299 @@
+<?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.growth.common.dao.mapper.SpecialSendMessageMapper">
+    <resultMap id="BaseResultMap" type="com.tzld.piaoquan.growth.common.model.po.SpecialSendMessage">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="staff_id" jdbcType="BIGINT" property="staffId"/>
+        <result column="user_id" jdbcType="BIGINT" property="userId"/>
+        <result column="group" jdbcType="INTEGER" property="group"/>
+        <result column="content" jdbcType="VARCHAR" property="content"/>
+        <result column="attachment_ids" jdbcType="VARCHAR" property="attachmentIds"/>
+        <result column="is_send" jdbcType="INTEGER" property="isSend"/>
+        <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
+        , staff_id, user_id, `group`, content, attachment_ids, is_send, create_time, update_time
+    </sql>
+    <select id="selectByExample" parameterType="com.tzld.piaoquan.growth.common.model.po.SpecialSendMessageExample"
+            resultMap="BaseResultMap">
+        select
+        <if test="distinct">
+            distinct
+        </if>
+        <include refid="Base_Column_List"/>
+        from we_com_special_send_message
+        <if test="_parameter != null">
+            <include refid="Example_Where_Clause"/>
+        </if>
+        <if test="orderByClause != null">
+            order by ${orderByClause}
+        </if>
+        <if test="page != null">
+            limit #{page.offset} , #{page.pageSize}
+        </if>
+    </select>
+    <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from we_com_special_send_message
+        where id = #{id,jdbcType=BIGINT}
+    </select>
+    <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+        delete
+        from we_com_special_send_message
+        where id = #{id,jdbcType=BIGINT}
+    </delete>
+    <delete id="deleteByExample" parameterType="com.tzld.piaoquan.growth.common.model.po.SpecialSendMessageExample">
+        delete from we_com_special_send_message
+        <if test="_parameter != null">
+            <include refid="Example_Where_Clause"/>
+        </if>
+    </delete>
+    <insert id="insert" parameterType="com.tzld.piaoquan.growth.common.model.po.SpecialSendMessage">
+        insert into we_com_special_send_message (id, staff_id, user_id,
+                                                 `group`, content, attachment_ids,
+                                                 is_send, create_time, update_time)
+        values (#{id,jdbcType=BIGINT}, #{staffId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT},
+                #{group,jdbcType=INTEGER}, #{content,jdbcType=VARCHAR}, #{attachmentIds,jdbcType=VARCHAR},
+                #{isSend,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})
+    </insert>
+    <insert id="insertSelective" parameterType="com.tzld.piaoquan.growth.common.model.po.SpecialSendMessage">
+        insert into we_com_special_send_message
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">
+                id,
+            </if>
+            <if test="staffId != null">
+                staff_id,
+            </if>
+            <if test="userId != null">
+                user_id,
+            </if>
+            <if test="group != null">
+                `group`,
+            </if>
+            <if test="content != null">
+                content,
+            </if>
+            <if test="attachmentIds != null">
+                attachment_ids,
+            </if>
+            <if test="isSend != null">
+                is_send,
+            </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="staffId != null">
+                #{staffId,jdbcType=BIGINT},
+            </if>
+            <if test="userId != null">
+                #{userId,jdbcType=BIGINT},
+            </if>
+            <if test="group != null">
+                #{group,jdbcType=INTEGER},
+            </if>
+            <if test="content != null">
+                #{content,jdbcType=VARCHAR},
+            </if>
+            <if test="attachmentIds != null">
+                #{attachmentIds,jdbcType=VARCHAR},
+            </if>
+            <if test="isSend != null">
+                #{isSend,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.growth.common.model.po.SpecialSendMessageExample"
+            resultType="java.lang.Long">
+        select count(*) from we_com_special_send_message
+        <if test="_parameter != null">
+            <include refid="Example_Where_Clause"/>
+        </if>
+    </select>
+    <update id="updateByExampleSelective" parameterType="map">
+        update we_com_special_send_message
+        <set>
+            <if test="record.id != null">
+                id = #{record.id,jdbcType=BIGINT},
+            </if>
+            <if test="record.staffId != null">
+                staff_id = #{record.staffId,jdbcType=BIGINT},
+            </if>
+            <if test="record.userId != null">
+                user_id = #{record.userId,jdbcType=BIGINT},
+            </if>
+            <if test="record.group != null">
+                `group` = #{record.group,jdbcType=INTEGER},
+            </if>
+            <if test="record.content != null">
+                content = #{record.content,jdbcType=VARCHAR},
+            </if>
+            <if test="record.attachmentIds != null">
+                attachment_ids = #{record.attachmentIds,jdbcType=VARCHAR},
+            </if>
+            <if test="record.isSend != null">
+                is_send = #{record.isSend,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_special_send_message
+        set id = #{record.id,jdbcType=BIGINT},
+        staff_id = #{record.staffId,jdbcType=BIGINT},
+        user_id = #{record.userId,jdbcType=BIGINT},
+        `group` = #{record.group,jdbcType=INTEGER},
+        content = #{record.content,jdbcType=VARCHAR},
+        attachment_ids = #{record.attachmentIds,jdbcType=VARCHAR},
+        is_send = #{record.isSend,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.growth.common.model.po.SpecialSendMessage">
+        update we_com_special_send_message
+        <set>
+            <if test="staffId != null">
+                staff_id = #{staffId,jdbcType=BIGINT},
+            </if>
+            <if test="userId != null">
+                user_id = #{userId,jdbcType=BIGINT},
+            </if>
+            <if test="group != null">
+                `group` = #{group,jdbcType=INTEGER},
+            </if>
+            <if test="content != null">
+                content = #{content,jdbcType=VARCHAR},
+            </if>
+            <if test="attachmentIds != null">
+                attachment_ids = #{attachmentIds,jdbcType=VARCHAR},
+            </if>
+            <if test="isSend != null">
+                is_send = #{isSend,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.growth.common.model.po.SpecialSendMessage">
+        update we_com_special_send_message
+        set staff_id       = #{staffId,jdbcType=BIGINT},
+            user_id        = #{userId,jdbcType=BIGINT},
+            `group`        = #{group,jdbcType=INTEGER},
+            content        = #{content,jdbcType=VARCHAR},
+            attachment_ids = #{attachmentIds,jdbcType=VARCHAR},
+            is_send        = #{isSend,jdbcType=INTEGER},
+            create_time    = #{createTime,jdbcType=TIMESTAMP},
+            update_time    = #{updateTime,jdbcType=TIMESTAMP}
+        where id = #{id,jdbcType=BIGINT}
+    </update>
+
+    <select id="getGroupList" resultMap="BaseResultMap">
+        select staff_id, `group`, content, attachment_ids
+        from we_com_special_send_message
+        where is_send = 0
+        group by staff_id, `group`, content, attachment_ids
+    </select>
+
+    <select id="selectExternalUserId" resultType="java.lang.String">
+        select t2.external_user_id
+        from we_com_special_send_message t1
+                 left join we_com_user t2 on t1.user_id = t2.id
+        where t1.staff_id = #{staffId,jdbcType=BIGINT}
+          and t1.group = #{group,jdbcType=INTEGER}
+          and t1.is_send = 0
+    </select>
+</mapper>

+ 46 - 0
common-module/src/main/resources/mapper/WeComUserMapper.xml

@@ -435,4 +435,50 @@
             )
         </foreach>
     </insert>
+
+
+    <select id="selectSendUserList" resultType="com.tzld.piaoquan.growth.common.model.po.WeComUser">
+        select t2.*
+        from we_com_staff_with_user t1
+                 left join we_com_user t2 on t2.id = t1.user_id
+        where staff_id = #{staffId,jdbcType=BIGINT}
+          and t1.is_delete = 0
+          and t2.group_msg_disabled = #{groupMsgDisabled,jdbcType=TINYINT}
+          and user_id in (select user_id
+                          from (select user_id, count(*) as num from we_com_staff_with_user group by user_id) c
+                          where c.num = 1)
+          and user_id in (select distinct user_id
+                              from we_com_send_message
+                              where (create_time between '2025-02-27 10:00:00' and '2025-02-27 17:00:00')
+                                 or (create_time between '2025-02-28 10:00:00' and '2025-02-28 17:00:00')
+                                 or (create_time between '2025-03-03 10:00:00' and '2025-03-03 17:00:00')
+                                  and staff_id = #{staffId,jdbcType=BIGINT}) limit #{pageNum}, #{pageSize}
+    </select>
+
+    <select id="selectNotSendUserList" resultType="com.tzld.piaoquan.growth.common.model.po.WeComUser">
+        select t2.*
+        from we_com_staff_with_user t1
+                 left join we_com_user t2 on t2.id = t1.user_id
+        where staff_id = #{staffId,jdbcType=BIGINT}
+          and t1.is_delete = 0
+          and t2.group_msg_disabled = #{groupMsgDisabled,jdbcType=TINYINT}
+          and user_id in (select user_id
+                          from (select user_id, count(*) as num from we_com_staff_with_user group by user_id) c
+                          where c.num = 1)
+          and user_id not in (select distinct user_id
+                              from we_com_send_message
+                              where (create_time between '2025-02-27 10:00:00' and '2025-02-27 17:00:00')
+                                 or (create_time between '2025-02-28 10:00:00' and '2025-02-28 17:00:00')
+                                 or (create_time between '2025-03-03 10:00:00' and '2025-03-03 17:00:00')
+                                  and staff_id = #{staffId,jdbcType=BIGINT}) limit #{pageNum}, #{pageSize}
+    </select>
+
+    <select id="selectUserList" resultType="com.tzld.piaoquan.growth.common.model.po.WeComUser">
+        select t1.*
+        from we_com_user t1
+                 left join we_com_staff_with_user t2 on t1.id = t2.user_id
+        where t1.group_msg_disabled = #{groupMsgDisabled,jdbcType=TINYINT}
+          and t2.staff_id = #{staffId,jdbcType=BIGINT} and t2.is_delete = 0
+            limit #{pageNum}, #{pageSize}
+    </select>
 </mapper>

+ 181 - 0
offline-module/src/main/java/com/tzld/piaoquan/offline/job/WeComSpecialDataJob.java

@@ -0,0 +1,181 @@
+package com.tzld.piaoquan.offline.job;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.tzld.piaoquan.growth.common.common.constant.MessageConstant;
+import com.tzld.piaoquan.growth.common.common.enums.MessageAttachmentTypeEnum;
+import com.tzld.piaoquan.growth.common.dao.mapper.SpecialSendMessageMapper;
+import com.tzld.piaoquan.growth.common.dao.mapper.StaffMapper;
+import com.tzld.piaoquan.growth.common.dao.mapper.WeComUserMapper;
+import com.tzld.piaoquan.growth.common.model.po.*;
+import com.tzld.piaoquan.growth.common.service.MessageAttachmentService;
+import com.tzld.piaoquan.growth.common.service.MessageService;
+import com.tzld.piaoquan.growth.common.utils.ToolUtils;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+
+@Component
+public class WeComSpecialDataJob {
+
+    @Autowired
+    private WeComUserMapper weComUserMapper;
+
+    @Autowired
+    private StaffMapper staffMapper;
+
+    @Autowired
+    private SpecialSendMessageMapper specialSendMessageMapper;
+
+    @Autowired
+    private MessageService messageService;
+
+    @Autowired
+    private MessageAttachmentService messageAttachmentService;
+
+    //发送小程序标题限制字节数
+    private static final int MAX_BYTES = 64;
+
+
+    public void specialAssembleSendMessage(Long staffId, Integer pageNum, Integer pageSize,
+                                           byte groupMsgDisabled, List<Long> attachmentIds, String content) {
+        List<WeComUser> weComUserList = weComUserMapper.selectUserList(staffId, groupMsgDisabled, (pageNum - 1) * pageSize, pageSize);
+        //落库逻辑
+        for (WeComUser weComUser : weComUserList) {
+            SpecialSendMessage specialSendMessage = new SpecialSendMessage();
+            specialSendMessage.setStaffId(staffId);
+            specialSendMessage.setUserId(weComUser.getId());
+            specialSendMessage.setGroup(pageNum);
+            specialSendMessage.setAttachmentIds(JSONObject.toJSONString(attachmentIds));
+            specialSendMessage.setContent(content);
+            specialSendMessageMapper.insertSelective(specialSendMessage);
+        }
+    }
+
+    @XxlJob("sendSpecialPushMessageJob")
+    public void sendSpecialPushMessage() {
+        List<SpecialSendMessage> groupList = specialSendMessageMapper.getGroupList();
+        for (SpecialSendMessage specialSendMessage : groupList) {
+            List<String> externalUserIds = specialSendMessageMapper.selectExternalUserId(specialSendMessage.getStaffId(), specialSendMessage.getGroup());
+            boolean flag = specialPushMessage(externalUserIds, specialSendMessage);
+            if (flag) {
+                SpecialSendMessage updateSpecialSendMessage = new SpecialSendMessage();
+                updateSpecialSendMessage.setIsSend(1);
+                SpecialSendMessageExample example = new SpecialSendMessageExample();
+                example.createCriteria()
+                        .andStaffIdEqualTo(specialSendMessage.getStaffId())
+                        .andGroupEqualTo(specialSendMessage.getGroup())
+                        .andContentEqualTo(specialSendMessage.getContent())
+                        .andAttachmentIdsEqualTo(specialSendMessage.getAttachmentIds());
+                specialSendMessageMapper.updateByExampleSelective(updateSpecialSendMessage, example);
+            }
+        }
+    }
+
+    private boolean specialPushMessage(List<String> sendUserList, SpecialSendMessage specialSendMessage) {
+        List<JSONObject> pushList = new ArrayList<>();
+        StaffExample staffExample = new StaffExample();
+        staffExample.createCriteria().andIdEqualTo(specialSendMessage.getStaffId());
+        List<Staff> staffList = staffMapper.selectByExample(staffExample);
+        Staff staff = staffList.get(0);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("chat_type", "single");
+        JSONObject text = new JSONObject();
+        if (StringUtils.isNotEmpty(specialSendMessage.getContent())) {
+            text.put("content", specialSendMessage.getContent());
+        } else {
+            text.put("content", messageService.getMessageText());
+        }
+        jsonObject.put("text", text);
+        jsonObject.put("sender", staff.getCarrierId());
+        String attachmentIds = specialSendMessage.getAttachmentIds();
+        JSONArray attachments = new JSONArray();
+        if (StringUtils.isNotEmpty(attachmentIds)) {
+            List<Long> attachmentIdList = JSONArray.parseArray(attachmentIds, Long.class);
+            if (!CollectionUtils.isEmpty(attachmentIdList)) {
+                List<MessageAttachment> messageAttachments = messageAttachmentService.getMessageAttachment(attachmentIdList);
+                if (!CollectionUtils.isEmpty(messageAttachments)) {
+                    for (MessageAttachment messageAttachment : messageAttachments) {
+                        Integer type = messageAttachment.getType();
+                        if (Objects.equals(MessageAttachmentTypeEnum.MINI_PROGRAM.getCode(), type)) {
+                            JSONObject miniprogramAttachment = new JSONObject();
+                            JSONObject miniprogram = new JSONObject();
+                            miniprogram.put("appid", MessageConstant.appid);
+                            String title = messageAttachment.getTitle();
+                            if (title.getBytes(StandardCharsets.UTF_8).length > MAX_BYTES) {
+                                title = ToolUtils.truncateString(title, MAX_BYTES - 3) + "...";
+                            }
+                            miniprogram.put("title", title);
+                            String picMediaId = messageAttachment.getMediaId();
+                            if (StringUtils.isEmpty(picMediaId)) {
+                                return false;
+                            }
+                            miniprogram.put("pic_media_id", picMediaId);
+                            String page = messageAttachment.getPage();
+                            if (StringUtils.isEmpty(page)) {
+                                return false;
+                            }
+                            miniprogram.put("page", page);
+                            miniprogramAttachment.put("msgtype", "miniprogram");
+                            miniprogramAttachment.put("miniprogram", miniprogram);
+                            attachments.add(miniprogramAttachment);
+                        }
+
+                        if (Objects.equals(MessageAttachmentTypeEnum.LINK.getCode(), type)) {
+                            JSONObject linkAttachment = new JSONObject();
+                            JSONObject link = new JSONObject();
+                            link.put("title", messageAttachment.getTitle());
+                            link.put("picurl", messageAttachment.getPicUrl());
+                            link.put("desc", messageAttachment.getDesc());
+                            link.put("url", messageAttachment.getUrl());
+                            linkAttachment.put("msgtype", "link");
+                            linkAttachment.put("link", link);
+                            attachments.add(linkAttachment);
+                        }
+
+                        if (Objects.equals(MessageAttachmentTypeEnum.IMAGE.getCode(), type)) {
+                            JSONObject imageAttachment = new JSONObject();
+                            JSONObject image = new JSONObject();
+                            image.put("media_id", messageAttachment.getMediaId());
+                            imageAttachment.put("msgtype", "image");
+                            imageAttachment.put("image", image);
+                            attachments.add(imageAttachment);
+                        }
+                    }
+
+                }
+            }
+        }
+        if (!attachments.isEmpty()) {
+            jsonObject.put("attachments", attachments);
+        }
+        List<List<String>> lists = Lists.partition(sendUserList, 10000);
+        for (List<String> list : lists) {
+            JSONArray externalUserIds = JSONArray.parseArray(JSON.toJSONString(list));
+            JSONObject newJSONObject = new JSONObject();
+            newJSONObject.putAll(jsonObject);
+            newJSONObject.put("external_userid", externalUserIds);
+            pushList.add(newJSONObject);
+        }
+        if (CollectionUtils.isEmpty(pushList)) {
+            return false;
+        }
+        for (JSONObject pushJsonObject : pushList) {
+            boolean flag = messageService.pushWeComMessage(pushJsonObject, 1L);
+            if (!flag) {
+                return flag;
+            }
+        }
+        return true;
+    }
+}