浏览代码

add(backend) [模板消息 版本]

wangxiao 4 年之前
父节点
当前提交
b09c8e1d14
共有 27 个文件被更改,包括 965 次插入59 次删除
  1. 19 0
      operation-backend/src/main/java/com/idiot/operationbackend/controller/IndexController.java
  2. 1 1
      operation-backend/src/main/java/com/idiot/operationbackend/controller/WeChatController.java
  3. 1 1
      operation-backend/src/main/java/com/idiot/operationbackend/controller/fans/FansMsgController.java
  4. 39 21
      operation-backend/src/main/java/com/idiot/operationbackend/controller/group/CustomerMsgController.java
  5. 79 2
      operation-backend/src/main/java/com/idiot/operationbackend/controller/group/GroupMsgController.java
  6. 102 0
      operation-backend/src/main/java/com/idiot/operationbackend/controller/group/TemplateMsgController.java
  7. 1 1
      operation-backend/src/main/java/com/idiot/operationbackend/controller/interactive/FollowReplyController.java
  8. 1 1
      operation-backend/src/main/java/com/idiot/operationbackend/controller/interactive/PushMsgController.java
  9. 1 1
      operation-backend/src/main/java/com/idiot/operationbackend/controller/interactive/QrCodeController.java
  10. 5 7
      operation-backend/src/main/java/com/idiot/operationbackend/entity/Account.java
  11. 5 5
      operation-backend/src/main/java/com/idiot/operationbackend/entity/AccountCustomerMsg.java
  12. 8 0
      operation-backend/src/main/java/com/idiot/operationbackend/entity/CustomerMsg.java
  13. 250 0
      operation-backend/src/main/java/com/idiot/operationbackend/entity/GroupMsg.java
  14. 184 0
      operation-backend/src/main/java/com/idiot/operationbackend/entity/TemplateMsg.java
  15. 11 0
      operation-backend/src/main/java/com/idiot/operationbackend/mappers/GroupMsgMapper.java
  16. 11 0
      operation-backend/src/main/java/com/idiot/operationbackend/mappers/TemplateMsgMapper.java
  17. 1 1
      operation-backend/src/main/java/com/idiot/operationbackend/service/facade/CustomerMsgService.java
  18. 27 0
      operation-backend/src/main/java/com/idiot/operationbackend/service/facade/GroupMsgService.java
  19. 26 0
      operation-backend/src/main/java/com/idiot/operationbackend/service/facade/TemplateMsgService.java
  20. 10 0
      operation-backend/src/main/java/com/idiot/operationbackend/service/facade/WeChatService.java
  21. 1 1
      operation-backend/src/main/java/com/idiot/operationbackend/service/impl/AccountCustomerMsgServiceImpl.java
  22. 4 2
      operation-backend/src/main/java/com/idiot/operationbackend/service/impl/CustomerMsgServiceImpl.java
  23. 42 0
      operation-backend/src/main/java/com/idiot/operationbackend/service/impl/GroupMsgServiceImpl.java
  24. 34 0
      operation-backend/src/main/java/com/idiot/operationbackend/service/impl/TemplateMsgServiceImpl.java
  25. 20 6
      operation-backend/src/main/java/com/idiot/operationbackend/service/impl/WeChatServiceImpl.java
  26. 16 2
      operation-backend/src/main/java/com/idiot/operationbackend/support/Constants.java
  27. 66 7
      sql/dataBase.sql

+ 19 - 0
operation-backend/src/main/java/com/idiot/operationbackend/controller/IndexController.java

@@ -270,6 +270,25 @@ public class IndexController {
     }
 
 
+    @GetMapping("/type")
+    @ApiOperation(value = "发送消息状态码")
+    public ResponseEntity<JsonResult<List<BaseType>>> customerStatus () {
+
+        List<BaseType> baseTypes = new ArrayList<>(4);
+        BaseType success  = new BaseType(Constants.SUCCESSED,"发送成功");
+        BaseType waiting  = new BaseType(Constants.WAITING,"未发送");
+        BaseType run  = new BaseType(Constants.RUNING,"发送中");
+        BaseType end  = new BaseType(Constants.END,"发送中止");
+        BaseType fail  = new BaseType(Constants.FAILED,"发送失败");
+        baseTypes.add(success);
+        baseTypes.add(waiting);
+        baseTypes.add(run);
+        baseTypes.add(end);
+        baseTypes.add(fail);
+        return ResponseEntity.ok(JsonResult.success(baseTypes));
+    }
+
+
 
 
 

+ 1 - 1
operation-backend/src/main/java/com/idiot/operationbackend/controller/WeChatController.java

@@ -107,7 +107,7 @@ public class WeChatController {
             account.setAuthorizerRefreshToken(authorizationInfo.getString("authorizer_refresh_token"));
             // 授权方信息
             JSONObject authorizerInfo = authorizerInfoObj.getJSONObject("authorizer_info");
-            account.setHeadImg(authorizerInfo.getString("head_img"));
+            account.setHeadImage(authorizerInfo.getString("head_img"));
             account.setNickName(authorizerInfo.getString("nick_name"));
             account.setServiceTypeInfo(authorizerInfo.getJSONObject("service_type_info").toJSONString());
             account.setVerifyTypeInfo(authorizerInfo.getJSONObject("verify_type_info").toJSONString());

+ 1 - 1
operation-backend/src/main/java/com/idiot/operationbackend/controller/fans/FansMsgController.java

@@ -66,7 +66,7 @@ public class FansMsgController {
                 Optional.ofNullable(accountService.getById(e.getAccountId()))
                         .map(account -> {
                             e.setAccountName(account.getNickName());
-                            e.setAccountUrl(account.getHeadImg());
+                            e.setAccountUrl(account.getHeadImage());
                             return e;
                         });
             });

+ 39 - 21
operation-backend/src/main/java/com/idiot/operationbackend/controller/group/CustomerMsgController.java

@@ -18,8 +18,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 客服消息
@@ -47,7 +51,7 @@ public class CustomerMsgController {
     @ApiOperation(value = "查询客服消息")
     public ResponseEntity<JsonResult<Page<CustomerMsg>>> pageCustomerMsg (@RequestHeader String token,
                                                                           @RequestParam int page,
-                                                                          @RequestParam(required = false) String status,
+                                                                          @RequestParam(required = false) Integer status,
                                                                           @RequestParam(required = false) String startDate,
                                                                           @RequestParam(required = false) String endDate) {
         String userId = JwtTokenUtil.getUserId(token);
@@ -60,31 +64,45 @@ public class CustomerMsgController {
 
     @GetMapping("/{msgId}")
     @ApiOperation(value = "该客服消息下公众号发送详情")
-    public ResponseEntity<JsonResult<List<AccountCustomerMsg>>> accountMsg (@PathVariable String msgId) {
-
-        logger.info("查询客服消息公众号详情列表,nsgId:{}",msgId);
+    public ResponseEntity<JsonResult<List<AccountCustomerMsg>>> accountMsg (@RequestHeader String token,
+                                                                            @PathVariable String msgId) {
+        String userId = JwtTokenUtil.getUserId(token);
+        logger.info("用户:{}查询客服消息公众号详情列表,msgId:{}",userId,msgId);
         List<AccountCustomerMsg> accountCustomerMsgs = accountCustomerMsgService.queryByMsgId(msgId);
         return ResponseEntity.ok(JsonResult.success(accountCustomerMsgs));
     }
 
-    @GetMapping("/type")
-    @ApiOperation(value = "客服消息状态码")
-    public ResponseEntity<JsonResult<List<BaseType>>> customerStatus () {
-
-        List<BaseType> baseTypes = new ArrayList<>(4);
-        BaseType success  = new BaseType(Constants.SUCCESSED,"发送成功");
-        BaseType waiting  = new BaseType(Constants.WAITING,"未发送");
-        BaseType run  = new BaseType(Constants.RUNING,"发送中");
-        BaseType end  = new BaseType(Constants.END,"发送中止");
-        BaseType fail  = new BaseType(Constants.FAILD,"发送失败");
-        baseTypes.add(success);
-        baseTypes.add(waiting);
-        baseTypes.add(run);
-        baseTypes.add(end);
-        baseTypes.add(fail);
-        return ResponseEntity.ok(JsonResult.success(baseTypes));
-    }
 
 
 
+    // fixme 预估人数暂时还没有
+    @PostMapping
+    @ApiOperation(value = "新增客服消息状")
+    public ResponseEntity<JsonResult<Boolean>> addCustomerMsg (@RequestHeader String token,
+                                                              @RequestBody @Valid CustomerMsg customerMsg) {
+        String userId = JwtTokenUtil.getUserId(token);
+        String authId = userService.queryAuthId(userId);
+        logger.info("用户:{}新增客服消息详情列表,customerMsg:{}",userId,customerMsg.toString());
+        customerMsg.setAuthId(authId);
+        customerMsg.setCreateTime(LocalDateTime.now().format(Constants.DATE_TIME_FORMATTER));
+        customerMsg.setStatus(Constants.WAITING);
+        boolean addResult =  customerMsgService.save(customerMsg);
+        if (addResult) {
+            String msgId = customerMsg.getId();
+            String accountIdStr = customerMsg.getAccountIds();
+            List<String> accountIds = Arrays.stream(accountIdStr.split(",")).collect(Collectors.toList());
+            List<AccountCustomerMsg> accountCustomerMsgs = new ArrayList<>(accountIds.size());
+            AccountCustomerMsg accountCustomerMsg = null;
+            for (String accountId : accountIds) {
+                accountCustomerMsg = new AccountCustomerMsg();
+                accountCustomerMsg.setStatus(Constants.WAITING);
+                accountCustomerMsg.setMsgId(msgId);
+                accountCustomerMsg.setAccountId(accountId);
+                accountCustomerMsgs.add(accountCustomerMsg);
+            }
+            accountCustomerMsgService.saveBatch(accountCustomerMsgs);
+        }
+        return ResponseEntity.ok(JsonResult.success(addResult));
+    }
+
 }

+ 79 - 2
operation-backend/src/main/java/com/idiot/operationbackend/controller/group/GroupMsgController.java

@@ -1,8 +1,28 @@
 package com.idiot.operationbackend.controller.group;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.idiot.operationbackend.entity.Account;
+import com.idiot.operationbackend.entity.GroupMsg;
+import com.idiot.operationbackend.service.facade.AccountService;
+import com.idiot.operationbackend.service.facade.GroupMsgService;
+import com.idiot.operationbackend.support.Constants;
+import com.idiot.operationbackend.support.CustomException;
+import com.idiot.operationbackend.support.JsonResult;
+import com.idiot.operationbackend.util.JwtTokenUtil;
+import com.idiot.operationbackend.vo.BaseType;
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 高级群发
@@ -15,5 +35,62 @@ import org.springframework.web.bind.annotation.RestController;
 public class GroupMsgController {
 
 
+    private final Logger logger = LoggerFactory.getLogger(CustomerMsgController.class);
+
+    @Autowired
+    private AccountService accountService;
+
+    @Autowired
+    private GroupMsgService groupMsgService;
+
+    @GetMapping
+    @ApiOperation(value = "查询高级群发")
+    public ResponseEntity<JsonResult<Page<GroupMsg>>> pageGroupMsg (@RequestHeader String token,
+                                                                    @RequestParam int page,
+                                                                    @RequestParam(required = false) Integer status,
+                                                                    @RequestParam(required = false) String startDate,
+                                                                    @RequestParam(required = false) String endDate) {
+        String userId = JwtTokenUtil.getUserId(token);
+        logger.info("用户:{}查询高级群发列表 page:{}",userId,page);
+        List<Account> accounts = accountService.queryAccountByUserId(userId);
+        List<String> ids = accounts.stream().map(Account::getId).collect(Collectors.toList());
+        Page<GroupMsg> groupMsgPage = groupMsgService.queryPageGroupMsg(page,startDate,endDate,status,ids);
+        return ResponseEntity.ok(JsonResult.success(groupMsgPage));
+    }
+
+
+    @DeleteMapping("/{msgId}")
+    @ApiOperation(value = "删除高级群发")
+    public ResponseEntity<JsonResult<Boolean>> delGroupMsg(@RequestHeader String token,
+                                                           @PathVariable String msgId) {
+        String userId = JwtTokenUtil.getUserId(token);
+        logger.info("用户:{}高级群发msgId:{}",userId,msgId);
+        boolean delResult = groupMsgService.removeById(msgId);
+        return ResponseEntity.ok(JsonResult.success(delResult));
+    }
+
+    // fixme 预估人数暂时还没有
+    @PostMapping
+    @ApiOperation(value = "新建高级群发")
+    public ResponseEntity<JsonResult<Boolean>> addGroupMsg(@RequestHeader String token,
+                                                           @RequestBody @Valid  GroupMsg groupMsg) {
+        String userId = JwtTokenUtil.getUserId(token);
+        String accountId = groupMsg.getAccountId();
+        boolean enable = accountService.queryAccountByUserId(userId).stream()
+                .anyMatch(e->accountId.equals(e.getId()));
+        if (!enable) {
+            throw new CustomException(500,"你没有权限操作该公众号");
+        }
+        Account account = accountService.getById(accountId);
+        if (Objects.isNull(account)) {
+            throw new CustomException(500,"选择的公众号不存在");
+        }
+        groupMsg.setNikeName(account.getNickName());
+        groupMsg.setHeadImage(account.getHeadImage());
+        logger.info("用户:{}高级群发groupMsg:{}",userId,groupMsg.toString());
+        boolean delResult = groupMsgService.save(groupMsg);
+        return ResponseEntity.ok(JsonResult.success(delResult));
+    }
+
 
 }

+ 102 - 0
operation-backend/src/main/java/com/idiot/operationbackend/controller/group/TemplateMsgController.java

@@ -0,0 +1,102 @@
+package com.idiot.operationbackend.controller.group;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.idiot.operationbackend.entity.Account;
+import com.idiot.operationbackend.entity.TemplateMsg;
+import com.idiot.operationbackend.service.facade.AccountService;
+import com.idiot.operationbackend.service.facade.TemplateMsgService;
+import com.idiot.operationbackend.service.facade.WeChatService;
+import com.idiot.operationbackend.support.CustomException;
+import com.idiot.operationbackend.support.JsonResult;
+import com.idiot.operationbackend.util.JwtTokenUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+
+/**
+ * 模板消息
+ * @author wang xiao
+ * @date Created in 19:15 2020/9/22
+ */
+@RestController
+@RequestMapping("/Template")
+@Api(value = "TemplateMsgController", tags ="模板消息")
+public class TemplateMsgController {
+
+    private final Logger logger = LoggerFactory.getLogger(CustomerMsgController.class);
+
+    @Autowired
+    private AccountService accountService;
+
+    @Autowired
+    private TemplateMsgService templateMsgService;
+
+
+    @Autowired
+    private WeChatService weChatService;
+
+
+    @GetMapping
+    @ApiOperation(value = "查询模板消息")
+    public ResponseEntity<JsonResult<Page<TemplateMsg>>> pageTemplateMsg (@RequestHeader String token,
+                                                                          @RequestParam int page,
+                                                                          @RequestParam(required = false) Integer status) {
+        String userId = JwtTokenUtil.getUserId(token);
+        logger.info("用户:{}查询模板消息",userId);
+        List<Account> accounts = accountService.queryAccountByUserId(userId);
+        List<String> ids = accounts.stream().map(Account::getId).collect(Collectors.toList());
+        Page<TemplateMsg> templateMsgPage = templateMsgService.queryPageTemplateMsg(page,status,ids);
+        return ResponseEntity.ok(JsonResult.success(templateMsgPage));
+    }
+
+    @PostMapping
+    @ApiOperation(value = "新增模板消息")
+    public ResponseEntity<JsonResult<Boolean>> addTemplateMsg (@RequestHeader String token,
+                                                               @RequestBody @Valid TemplateMsg templateMsg) {
+        String userId = JwtTokenUtil.getUserId(token);
+        String accountId = templateMsg.getAccountId();
+        boolean enable = accountService.queryAccountByUserId(userId).stream()
+                .anyMatch(e->accountId.equals(e.getId()));
+        if (!enable) {
+            throw new CustomException(500,"你没有权限操作该公众号");
+        }
+        Account account = accountService.getById(accountId);
+        if (Objects.isNull(account)) {
+            throw new CustomException(500,"选择的公众号不存在");
+        }
+        templateMsg.setHeadImage(account.getHeadImage());
+        templateMsg.setNikeName(account.getNickName());
+        logger.info("用户:{}查询公众号:{}模板消息,templateMsg:{}",userId,accountId,templateMsg.toString());
+        return ResponseEntity.ok(JsonResult.success(false));
+    }
+
+    @GetMapping("/{accountId}")
+    @ApiOperation(value = "模板消息列表")
+    public ResponseEntity<JsonResult<Object>> getTemplate (@RequestHeader String token,
+                                                           @PathVariable String accountId) {
+        String userId = JwtTokenUtil.getUserId(token);
+        boolean enable = accountService.queryAccountByUserId(userId).stream()
+                .anyMatch(e->accountId.equals(e.getId()));
+        if (!enable) {
+            throw new CustomException(500,"你没有权限操作该公众号");
+        }
+        String wxJson =weChatService.getTemplate(accountId);
+        JSONObject jsonObject = JSON.parseObject(wxJson);
+        return ResponseEntity.ok(JsonResult.success(jsonObject));
+    }
+
+
+
+}

+ 1 - 1
operation-backend/src/main/java/com/idiot/operationbackend/controller/interactive/FollowReplyController.java

@@ -88,7 +88,7 @@ public class FollowReplyController {
     private FollowReply nonReply (Account account){
         FollowReply reply = new FollowReply();
         reply.setNikeName(account.getNickName());
-        reply.setHeadImage(account.getHeadImg());
+        reply.setHeadImage(account.getHeadImage());
         reply.setEnable(false);
         reply.setSetUp(false);
         return reply;

+ 1 - 1
operation-backend/src/main/java/com/idiot/operationbackend/controller/interactive/PushMsgController.java

@@ -89,7 +89,7 @@ public class PushMsgController {
     private AccountPush nonPush (Account account){
         AccountPush push = new AccountPush();
         push.setNikeName(account.getNickName());
-        push.setHeadImage(account.getHeadImg());
+        push.setHeadImage(account.getHeadImage());
         push.setEnable(false);
         push.setSetUp(false);
         return push;

+ 1 - 1
operation-backend/src/main/java/com/idiot/operationbackend/controller/interactive/QrCodeController.java

@@ -70,7 +70,7 @@ public class QrCodeController {
         String accountId = qrCode.getAccountId();
         Account account = accountService.getById(accountId);
         qrCode.setNikeName(account.getNickName());
-        qrCode.setHeadImage(account.getHeadImg());
+        qrCode.setHeadImage(account.getHeadImage());
         qrCodeService.save(qrCode);
         String wxJson = weChatService.createQrCode(qrCode,accountId);
         boolean upResult = qrCodeService.upQrCode(qrCode,wxJson);

+ 5 - 7
operation-backend/src/main/java/com/idiot/operationbackend/entity/Account.java

@@ -26,7 +26,7 @@ public class Account {
 
     private String nickName;
 
-    private String headImg;
+    private String headImage;
 
     private String serviceTypeInfo;
 
@@ -46,8 +46,6 @@ public class Account {
 
     private String createUserId;
 
-
-
     /**
      * 粉丝数量
      */
@@ -100,12 +98,12 @@ public class Account {
         this.nickName = nickName;
     }
 
-    public String getHeadImg() {
-        return headImg;
+    public String getHeadImage() {
+        return headImage;
     }
 
-    public void setHeadImg(String headImg) {
-        this.headImg = headImg;
+    public void setHeadImage(String headImage) {
+        this.headImage = headImage;
     }
 
     public String getServiceTypeInfo() {

+ 5 - 5
operation-backend/src/main/java/com/idiot/operationbackend/entity/AccountCustomerMsg.java

@@ -29,7 +29,7 @@ public class AccountCustomerMsg {
     private String nikeName;
 
     @TableField(exist = false)
-    private String headImg;
+    private String headImage;
 
     public String getId() {
         return id;
@@ -87,12 +87,12 @@ public class AccountCustomerMsg {
         this.nikeName = nikeName;
     }
 
-    public String getHeadImg() {
-        return headImg;
+    public String getHeadImage() {
+        return headImage;
     }
 
-    public void setHeadImg(String headImg) {
-        this.headImg = headImg;
+    public void setHeadImage(String headImage) {
+        this.headImage = headImage;
     }
 
     @Override

+ 8 - 0
operation-backend/src/main/java/com/idiot/operationbackend/entity/CustomerMsg.java

@@ -3,6 +3,9 @@ package com.idiot.operationbackend.entity;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
 /**
  * 客服消息
  * @author wang xiao
@@ -14,17 +17,22 @@ public class CustomerMsg {
     @TableId
     private String id;
 
+    @NotEmpty(message = "请选择客服消息公众号")
     private String accountIds;
 
+    @NotEmpty(message = "请填写客服消息名称")
     private String label;
 
+    @NotEmpty(message = "请填写客服消息内容")
     private String contents;
 
+    @NotEmpty(message = "请填写客服消息发送时间")
     private String sendTime;
 
     /**
      * 0 条件筛选 1 全部
      */
+    @NotNull(message = "请选择客服消息类型")
     private Integer type;
 
     private Integer selectSex;

+ 250 - 0
operation-backend/src/main/java/com/idiot/operationbackend/entity/GroupMsg.java

@@ -0,0 +1,250 @@
+package com.idiot.operationbackend.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 群发消息
+ * @author wang xiao
+ * @date Created in 16:38 2020/9/22
+ */
+@TableName("t_group_msg")
+public class GroupMsg {
+
+    @TableId
+    private String id;
+
+    @NotEmpty(message = "请选择公众号")
+    private String accountId;
+
+    @NotEmpty(message = "请编辑群发内容")
+    private String contents;
+
+    @NotEmpty(message = "请选择群发时间")
+    private String sendTime;
+
+    private Long sendNum;
+
+    /**
+     * 类型,1-图文,2-图片,3-文字,4-音频,5-视频"
+     */
+    private Integer msgType;
+
+    /**
+     * 0 条件筛选 1 全部
+     */
+    @NotNull(message = "请选择群发类型")
+    private Integer type;
+
+    private Integer selectSex;
+
+    private String  selectSubscribeTime;
+
+    private String selectProvince;
+
+    private String selectCity;
+
+    private String selectTag;
+
+    private String phone;
+
+    /**
+     * 微信后台设置
+     */
+
+    private Integer power;
+
+    /**
+     * 转载是否继续发送
+     */
+    private Boolean repeatSend;
+
+    private Integer status;
+
+    private String createTime;
+
+    private String nikeName;
+
+    private String headImage;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(String accountId) {
+        this.accountId = accountId;
+    }
+
+    public String getContents() {
+        return contents;
+    }
+
+    public void setContents(String contents) {
+        this.contents = contents;
+    }
+
+    public String getSendTime() {
+        return sendTime;
+    }
+
+    public void setSendTime(String sendTime) {
+        this.sendTime = sendTime;
+    }
+
+    public Long getSendNum() {
+        return sendNum;
+    }
+
+    public void setSendNum(Long sendNum) {
+        this.sendNum = sendNum;
+    }
+
+    public Integer getMsgType() {
+        return msgType;
+    }
+
+    public void setMsgType(Integer msgType) {
+        this.msgType = msgType;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getPower() {
+        return power;
+    }
+
+    public void setPower(Integer power) {
+        this.power = power;
+    }
+
+    public Integer getSelectSex() {
+        return selectSex;
+    }
+
+    public void setSelectSex(Integer selectSex) {
+        this.selectSex = selectSex;
+    }
+
+    public String getSelectSubscribeTime() {
+        return selectSubscribeTime;
+    }
+
+    public void setSelectSubscribeTime(String selectSubscribeTime) {
+        this.selectSubscribeTime = selectSubscribeTime;
+    }
+
+    public String getSelectProvince() {
+        return selectProvince;
+    }
+
+    public void setSelectProvince(String selectProvince) {
+        this.selectProvince = selectProvince;
+    }
+
+    public String getSelectCity() {
+        return selectCity;
+    }
+
+    public void setSelectCity(String selectCity) {
+        this.selectCity = selectCity;
+    }
+
+    public String getSelectTag() {
+        return selectTag;
+    }
+
+    public void setSelectTag(String selectTag) {
+        this.selectTag = selectTag;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Boolean getRepeatSend() {
+        return repeatSend;
+    }
+
+    public void setRepeatSend(Boolean repeatSend) {
+        this.repeatSend = repeatSend;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getNikeName() {
+        return nikeName;
+    }
+
+    public void setNikeName(String nikeName) {
+        this.nikeName = nikeName;
+    }
+
+    public String getHeadImage() {
+        return headImage;
+    }
+
+    public void setHeadImage(String headImage) {
+        this.headImage = headImage;
+    }
+
+
+    @Override
+    public String toString() {
+        return "GroupMsg{" +
+                "id='" + id + '\'' +
+                ", accountId='" + accountId + '\'' +
+                ", contents='" + contents + '\'' +
+                ", sendTime='" + sendTime + '\'' +
+                ", sendNum=" + sendNum +
+                ", msgType=" + msgType +
+                ", type=" + type +
+                ", selectSex=" + selectSex +
+                ", selectSubscribeTime='" + selectSubscribeTime + '\'' +
+                ", selectProvince='" + selectProvince + '\'' +
+                ", selectCity='" + selectCity + '\'' +
+                ", selectTag='" + selectTag + '\'' +
+                ", phone='" + phone + '\'' +
+                ", power=" + power +
+                ", repeatSend=" + repeatSend +
+                ", status=" + status +
+                ", createTime='" + createTime + '\'' +
+                ", nikeName='" + nikeName + '\'' +
+                ", headImage='" + headImage + '\'' +
+                '}';
+    }
+}

+ 184 - 0
operation-backend/src/main/java/com/idiot/operationbackend/entity/TemplateMsg.java

@@ -0,0 +1,184 @@
+package com.idiot.operationbackend.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * 模板消息
+ * @author wang xiao
+ * @date Created in 19:01 2020/9/22
+ */
+@TableName("t_template_msg")
+public class TemplateMsg {
+
+    @TableId
+    private String id;
+
+    @NotEmpty(message = "请选择公众号")
+    private String accountId;
+
+    @NotEmpty(message = "请填写模板消息名称")
+    private String label;
+
+    @NotEmpty(message = "请选择模板消息模板")
+    private String templateId;
+
+    @NotEmpty(message = "请填写模板消息模板数据")
+    private String templateData;
+
+    @NotEmpty(message = "请选择跳转类型")
+    private Integer linkType;
+
+    private String linkUrl;
+
+    private String linkAppId;
+
+    private String sendTime;
+
+    private Long sendNum;
+
+    private Integer status;
+
+    private String createTime;
+
+    private String nikeName;
+
+    private String headImage;
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(String accountId) {
+        this.accountId = accountId;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+    public String getTemplateId() {
+        return templateId;
+    }
+
+    public void setTemplateId(String templateId) {
+        this.templateId = templateId;
+    }
+
+    public String getTemplateData() {
+        return templateData;
+    }
+
+    public void setTemplateData(String templateData) {
+        this.templateData = templateData;
+    }
+
+    public Integer getLinkType() {
+        return linkType;
+    }
+
+    public void setLinkType(Integer linkType) {
+        this.linkType = linkType;
+    }
+
+    public String getLinkUrl() {
+        return linkUrl;
+    }
+
+    public void setLinkUrl(String linkUrl) {
+        this.linkUrl = linkUrl;
+    }
+
+    public String getLinkAppId() {
+        return linkAppId;
+    }
+
+    public void setLinkAppId(String linkAppId) {
+        this.linkAppId = linkAppId;
+    }
+
+    public String getSendTime() {
+        return sendTime;
+    }
+
+    public void setSendTime(String sendTime) {
+        this.sendTime = sendTime;
+    }
+
+    public Long getSendNum() {
+        return sendNum;
+    }
+
+    public void setSendNum(Long sendNum) {
+        this.sendNum = sendNum;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getNikeName() {
+        return nikeName;
+    }
+
+    public void setNikeName(String nikeName) {
+        this.nikeName = nikeName;
+    }
+
+    public String getHeadImage() {
+        return headImage;
+    }
+
+    public void setHeadImage(String headImage) {
+        this.headImage = headImage;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+
+    @Override
+    public String toString() {
+        return "TemplateMsg{" +
+                "id='" + id + '\'' +
+                ", accountId='" + accountId + '\'' +
+                ", label='" + label + '\'' +
+                ", templateId='" + templateId + '\'' +
+                ", templateData='" + templateData + '\'' +
+                ", linkType=" + linkType +
+                ", linkUrl='" + linkUrl + '\'' +
+                ", linkAppId='" + linkAppId + '\'' +
+                ", sendTime='" + sendTime + '\'' +
+                ", sendNum=" + sendNum +
+                ", status=" + status +
+                ", createTime='" + createTime + '\'' +
+                ", nikeName='" + nikeName + '\'' +
+                ", headImage='" + headImage + '\'' +
+                '}';
+    }
+}

+ 11 - 0
operation-backend/src/main/java/com/idiot/operationbackend/mappers/GroupMsgMapper.java

@@ -0,0 +1,11 @@
+package com.idiot.operationbackend.mappers;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.idiot.operationbackend.entity.GroupMsg;
+
+/**
+ * @author wang xiao
+ * @date Created in 17:18 2020/9/22
+ */
+public interface GroupMsgMapper extends BaseMapper<GroupMsg> {
+}

+ 11 - 0
operation-backend/src/main/java/com/idiot/operationbackend/mappers/TemplateMsgMapper.java

@@ -0,0 +1,11 @@
+package com.idiot.operationbackend.mappers;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.idiot.operationbackend.entity.TemplateMsg;
+
+/**
+ * @author wang xiao
+ * @date Created in 19:26 2020/9/22
+ */
+public interface TemplateMsgMapper extends BaseMapper<TemplateMsg> {
+}

+ 1 - 1
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/CustomerMsgService.java

@@ -22,5 +22,5 @@ public interface CustomerMsgService extends IService<CustomerMsg> {
      * @param authId authId
      * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.idiot.operationbackend.entity.CustomerMsg>
      */
-    Page<CustomerMsg> queryPageCustomerMsg (String status,int page,String startDate,String endDate,String authId);
+    Page<CustomerMsg> queryPageCustomerMsg (Integer status,int page,String startDate,String endDate,String authId);
 }

+ 27 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/GroupMsgService.java

@@ -0,0 +1,27 @@
+package com.idiot.operationbackend.service.facade;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.idiot.operationbackend.entity.GroupMsg;
+
+import java.util.List;
+
+/**
+ * @author wang xiao
+ * @date Created in 17:22 2020/9/22
+ */
+public interface GroupMsgService extends IService<GroupMsg> {
+
+    /**
+     *  高级群发分页
+     * @author wangxiao
+     * @date 17:39 2020/9/22
+     * @param page page
+     * @param startDate startDate
+     * @param endDate endDate
+     * @param status status
+     * @param ids ids
+     * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.idiot.operationbackend.entity.GroupMsg>
+     */
+    Page<GroupMsg> queryPageGroupMsg (int page, String startDate, String endDate,Integer status, List<String> ids);
+}

+ 26 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/TemplateMsgService.java

@@ -0,0 +1,26 @@
+package com.idiot.operationbackend.service.facade;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.idiot.operationbackend.entity.TemplateMsg;
+
+import java.util.List;
+
+/**
+ * @author wang xiao
+ * @date Created in 19:26 2020/9/22
+ */
+public interface TemplateMsgService extends IService<TemplateMsg> {
+
+
+    /**
+     *  查询模板消息列表
+     * @author wangxiao
+     * @date 19:36 2020/9/22
+     * @param page page
+     * @param status status
+     * @param ids ids
+     * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.idiot.operationbackend.entity.TemplateMsg>
+     */
+    Page<TemplateMsg> queryPageTemplateMsg(int page, Integer status, List<String> ids);
+}

+ 10 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/WeChatService.java

@@ -346,6 +346,16 @@ public interface WeChatService {
    boolean delMenu(String accountId);
 
 
+   /**
+    *  获取微信模板消息列表
+    * @author wangxiao
+    * @date 20:01 2020/9/22
+    * @param accountId
+    * @return java.lang.String
+    */
+   String getTemplate(String accountId);
+
+
 
 
 

+ 1 - 1
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/AccountCustomerMsgServiceImpl.java

@@ -36,7 +36,7 @@ public class AccountCustomerMsgServiceImpl extends ServiceImpl<AccountCustomerMs
                 Optional.ofNullable(accountService.getById(customerMsg.getAccountId()))
                         .map(e->{
                             customerMsg.setNikeName(e.getNickName());
-                            customerMsg.setHeadImg(e.getHeadImg());
+                            customerMsg.setHeadImage(e.getHeadImage());
                             return customerMsg;
                         });
             }

+ 4 - 2
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/CustomerMsgServiceImpl.java

@@ -10,6 +10,8 @@ import com.idiot.operationbackend.mappers.CustomerMsgMapper;
 import com.idiot.operationbackend.service.facade.CustomerMsgService;
 import org.springframework.stereotype.Service;
 
+import java.util.Objects;
+
 
 /**
  * @author wang xiao
@@ -20,12 +22,12 @@ public class CustomerMsgServiceImpl extends ServiceImpl<CustomerMsgMapper, Custo
         implements CustomerMsgService {
 
     @Override
-    public Page<CustomerMsg> queryPageCustomerMsg(String status, int page, String startDate, String endDate, String authId) {
+    public Page<CustomerMsg> queryPageCustomerMsg(Integer status, int page, String startDate, String endDate, String authId) {
 
         Page<CustomerMsg> queryPage = new Page<>(page,15);
         LambdaQueryWrapper<CustomerMsg> queryWrapper = Wrappers.<CustomerMsg>lambdaQuery();
         queryWrapper.eq(CustomerMsg::getAuthId,authId);
-        if (StringUtils.isNotBlank(status)) {
+        if (Objects.nonNull(status)) {
             queryWrapper.eq(CustomerMsg::getStatus,status);
         }
         if (StringUtils.isNotBlank(startDate)) {

+ 42 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/GroupMsgServiceImpl.java

@@ -0,0 +1,42 @@
+package com.idiot.operationbackend.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.idiot.operationbackend.entity.GroupMsg;
+import com.idiot.operationbackend.mappers.GroupMsgMapper;
+import com.idiot.operationbackend.service.facade.GroupMsgService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author wang xiao
+ * @date Created in 17:23 2020/9/22
+ */
+@Service
+public class GroupMsgServiceImpl extends ServiceImpl<GroupMsgMapper, GroupMsg> implements GroupMsgService {
+
+
+    @Override
+    public Page<GroupMsg> queryPageGroupMsg(int page, String startDate, String endDate, Integer status, List<String> ids) {
+
+        Page<GroupMsg> queryPage = new Page<>(page,15);
+        LambdaQueryWrapper<GroupMsg> queryWrapper = Wrappers.<GroupMsg>lambdaQuery();
+        if (StringUtils.isNotBlank(startDate)) {
+            queryWrapper.ge(GroupMsg::getCreateTime,startDate);
+        }
+        if (StringUtils.isNotBlank(endDate)) {
+            queryWrapper.le(GroupMsg::getCreateTime,endDate);
+        }
+        if (Objects.nonNull(status)) {
+            queryWrapper.eq(GroupMsg::getStatus,status);
+        }
+        queryWrapper.in(GroupMsg::getAccountId,ids);
+        queryWrapper.orderByDesc(GroupMsg::getCreateTime);
+        return page(queryPage,queryWrapper);
+    }
+}

+ 34 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/TemplateMsgServiceImpl.java

@@ -0,0 +1,34 @@
+package com.idiot.operationbackend.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.idiot.operationbackend.entity.TemplateMsg;
+import com.idiot.operationbackend.mappers.TemplateMsgMapper;
+import com.idiot.operationbackend.service.facade.TemplateMsgService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author wang xiao
+ * @date Created in 19:27 2020/9/22
+ */
+@Service
+public class TemplateMsgServiceImpl  extends ServiceImpl<TemplateMsgMapper,TemplateMsg>  implements TemplateMsgService {
+
+
+    @Override
+    public Page<TemplateMsg> queryPageTemplateMsg(int page, Integer status, List<String> ids) {
+        Page<TemplateMsg> queryPage = new Page<>(page,15);
+        LambdaQueryWrapper<TemplateMsg> queryWrapper = Wrappers.<TemplateMsg>
+                lambdaQuery().orderByDesc(TemplateMsg::getCreateTime);
+        if (Objects.nonNull(status)) {
+            queryWrapper.eq(TemplateMsg::getStatus,status);
+        }
+        queryWrapper.in(TemplateMsg::getAccountId,ids);
+        return page(queryPage,queryWrapper);
+    }
+}

+ 20 - 6
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/WeChatServiceImpl.java

@@ -63,6 +63,8 @@ public class WeChatServiceImpl implements WeChatService, InitializingBean {
 
     private WXBizMsgCrypt pc;
 
+    private final String ERROR_CODE = "errcode";
+
     @Resource(name = "rpcRestTemplate")
     private RestTemplate restTemplate;
 
@@ -486,7 +488,7 @@ public class WeChatServiceImpl implements WeChatService, InitializingBean {
         ResponseEntity<String> respStr = restTemplate.exchange(requestUrl,HttpMethod.POST,entity,String.class);
         String jsonStr = respStr.getBody();
         logger.info("微信设置备注,accountId:{}----end,时间:{},微信返回{}",accountId,LocalDateTime.now().toString(),jsonStr);
-        if (0 ==JSONObject.parseObject(jsonStr).getIntValue("errcode")) {
+        if (0 ==JSONObject.parseObject(jsonStr).getIntValue(ERROR_CODE)) {
             return fansService.updateFansRemark(accountId,openId,remark);
         }
         return false;
@@ -535,7 +537,7 @@ public class WeChatServiceImpl implements WeChatService, InitializingBean {
         ResponseEntity<String> respStr = restTemplate.exchange(requestUrl,HttpMethod.POST,entity,String.class);
         String jsonStr = respStr.getBody();
         logger.info("微信用户打标签,accountId:{},opedId size:{}----end,时间:{},微信返回:{}",accountId,size, LocalDateTime.now().toString(),jsonStr);
-        if (0 ==JSONObject.parseObject(jsonStr).getIntValue("errcode")) {
+        if (0 ==JSONObject.parseObject(jsonStr).getIntValue(ERROR_CODE)) {
             return tagService.addTagSize(accountId,wxId,size);
         }
         return false;
@@ -558,7 +560,7 @@ public class WeChatServiceImpl implements WeChatService, InitializingBean {
         ResponseEntity<String> respStr = restTemplate.exchange(requestUrl,HttpMethod.POST,entity,String.class);
         String jsonStr = respStr.getBody();
         logger.info("微信用去除标签,accountId:{},opedId size:{}----end,时间:{},微信返回:{}",accountId,size, LocalDateTime.now().toString(),jsonStr);
-        if (0 ==JSONObject.parseObject(jsonStr).getIntValue("errcode")) {
+        if (0 ==JSONObject.parseObject(jsonStr).getIntValue(ERROR_CODE)) {
             return tagService.subTagSize(accountId,wxId,size);
         }
         return false;
@@ -583,7 +585,7 @@ public class WeChatServiceImpl implements WeChatService, InitializingBean {
         ResponseEntity<String> respStr = restTemplate.exchange(requestUrl,HttpMethod.POST,entity,String.class);
         String jsonStr = respStr.getBody();
         logger.info("微信创建标签,accountId:{}----end,时间:{},微信返回{}",accountId,LocalDateTime.now().toString(),jsonStr);
-        int errorCode = JSONObject.parseObject(jsonStr).getIntValue("errcode");
+        int errorCode = JSONObject.parseObject(jsonStr).getIntValue(ERROR_CODE);
         return 0 == errorCode;
     }
 
@@ -682,7 +684,7 @@ public class WeChatServiceImpl implements WeChatService, InitializingBean {
         String jsonStr = restTemplate.postForObject(requestUrl,request,String.class);
         logger.info("微信创建公众号菜单,accountId:{},accountMenus:{}----end,时间:{},微信返回:{}",accountId,param,
                 LocalDateTime.now().toString(),jsonStr);
-        int errcode = JSONObject.parseObject(jsonStr).getIntValue("errcode");
+        int errcode = JSONObject.parseObject(jsonStr).getIntValue(ERROR_CODE);
         return 0 == errcode;
     }
 
@@ -695,10 +697,22 @@ public class WeChatServiceImpl implements WeChatService, InitializingBean {
         logger.info("微信删除公众号菜单,accountId:{}----start,时间:{}",accountId,LocalDateTime.now().toString());
         String jsonStr = restTemplate.getForObject(url,String.class);
         logger.info("微信创建公众号菜单,accountId:{}----end,时间:{},微信返回:{}",accountId,LocalDateTime.now().toString(),jsonStr);
-        int errcode = JSONObject.parseObject(jsonStr).getIntValue("errcode");
+        int errcode = JSONObject.parseObject(jsonStr).getIntValue(ERROR_CODE);
         return 0 == errcode;
     }
 
+
+    @Override
+    public String getTemplate(String accountId) {
+        String requestUrl = " https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=%s";
+        String accessToken = getAuthorizerAccessToken(accountId);
+        requestUrl = String.format(requestUrl,accessToken);
+        logger.info("微信请求公众号模板消息列表,accountId:{}----start,时间:{}",accountId,LocalDateTime.now().toString());
+        String jsonStr = restTemplate.getForObject(requestUrl,String.class);
+        logger.info("微信请求公众号模板消息列表,accountId:{}----end,时间:{},微信返回:{}",accountId,LocalDateTime.now().toString(),jsonStr);
+        return jsonStr;
+    }
+
     private String parseToJson (List<AccountMenu> accountMenus) {
         int size  = accountMenus.size();
         JSONObject jsonObject = new JSONObject(1);

+ 16 - 2
operation-backend/src/main/java/com/idiot/operationbackend/support/Constants.java

@@ -86,7 +86,7 @@ public class Constants {
 
 
     /**
-     *  '0'-已发送,'1'-未发送,'2'-发送中, '3'-发送终止,4'-发送失败
+     *  发送状态码 '0'-已发送,'1'-未发送,'2'-发送中, '3'-发送终止,4'-发送失败
      * @author wangxiao
      */
      public static final Integer SUCCESSED = 0;
@@ -97,9 +97,23 @@ public class Constants {
 
      public static final Integer END = 3;
 
-     public static final Integer FAILD = 4;
+     public static final Integer FAILED = 4;
 
 
+    /**
+     *  发送消息状态码 类型,1-图文,2-图片,3-文字,4-音频,5-视频"
+     * @author wangxiao
+     */
+    public static final Integer NEWS = 1;
+
+    public static final Integer IMG = 2;
+
+    public static final Integer TEXT = 3;
+
+    public static final Integer VOI = 4;
+
+    public static final Integer VID = 5;
+
 
     /**
      *  计算 比率

+ 66 - 7
sql/dataBase.sql

@@ -30,7 +30,7 @@ CREATE TABLE `t_account`  (
   `authorizer_refresh_token` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '授权方刷新token',
   `expires_in` int(0) NULL DEFAULT NULL COMMENT 'token过期时间',
   `nick_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '昵称',
-  `head_img` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '头像',
+  `head_image` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '头像',
   `service_type_info` json NULL COMMENT '公众号类型',
   `verify_type_info` json NULL COMMENT '公众号认证类型',
   `user_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '原始 ID',
@@ -365,13 +365,72 @@ CREATE TABLE `t_customer_msg`  (
 -- ----------------------------
 -- Table structure for t_account_customer_msg 公众客服消息 
 -- ----------------------------
-DROP TABLE IF EXISTS `t_account_customer_msg`;
-CREATE TABLE `t_account_customer_msg`  (
+DROP TABLE IF EXISTS `t_customer_msg`;
+CREATE TABLE `t_customer_msg`  (
   `id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'id',
-  `msg_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '消息id',
   `account_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '公众号id',
-  `success_num` int(0) NULL DEFAULT NULL COMMENT '成功人数',
+  `label` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '消息名称',
+  `contents` json NULL COMMENT '消息内容',
+  `send_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '发送时间',
+  `type` int(0) NULL DEFAULT NULL COMMENT '类型 0 全部粉丝 1 筛选粉丝',
+  `select_sex` int(0) NULL DEFAULT NULL COMMENT '筛选性别',
+  `select_subscribe_time` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '筛选关注时间',
+  `select_province` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '省份',
+  `select_city` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '城市',
+  `select_tag` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '标签',
+  `success_num` int(0) NULL DEFAULT NULL COMMENT '发送成功',
   `pre_success_num` int(0) NULL DEFAULT NULL COMMENT '预计成功',
-  `status` int(0) NULL DEFAULT NULL COMMENT '状态码',
+  `status` int(0) NULL DEFAULT NULL COMMENT '状态',
+  `auth_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '认证权限id parentUserId',
+  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '客服消息' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for t_group_msg 群发消息
+-- ----------------------------
+DROP TABLE IF EXISTS `t_group_msg`;
+CREATE TABLE `t_group_msg`  (
+  `id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'id',
+  `account_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '公众号id',
+  `contents` json NULL COMMENT '发送内容',
+  `send_time` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '发送时间',
+  `send_num` int(0) NULL DEFAULT NULL COMMENT '发送数量',
+  `msg_type` int(0) NULL DEFAULT NULL COMMENT '1-图文,2-图片,3-文字,4-音频,5-视频',
+  `type` int(0) NULL DEFAULT NULL COMMENT ' 0 条件筛选 1 全部',
+  `power` int(0) NULL DEFAULT NULL COMMENT '微信后台',
+  `repeat_send` tinyint(1) NULL DEFAULT NULL COMMENT '转发是否继续发送',
+  `select_sex` int(0) NULL DEFAULT NULL COMMENT '选择性别',
+  `select_subscribe_time` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '订阅时间',
+  `select_province` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '省',
+  `select_city` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '城市',
+  `select_tag` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '标签',
+  `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '电话',
+  `status` int(0) NULL DEFAULT NULL COMMENT '状态',
+  `create_time` datetime(0) NULL DEFAULT NULL,
+  `head_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `nike_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '群发消息' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for t_template_msg 模板消息
+-- ----------------------------
+DROP TABLE IF EXISTS `t_template_msg`;
+CREATE TABLE `t_template_msg`  (
+  `id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'id',
+  `account_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '公众号id',
+  `label` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '消息名称',
+  `template_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '模板id',
+  `template_data` json NULL COMMENT '模板数据',
+  `link_type` int(0) NULL DEFAULT NULL COMMENT '0 链接,1小程序',
+  `link_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '链接地址或者小程序页面',
+  `link_app_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '小程序appid',
+  `send_time` varchar(0) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '发送时间',
+  `send_num` int(0) NULL DEFAULT NULL COMMENT '发送数目',
+  `status` int(0) NULL DEFAULT NULL COMMENT '发送数目',
+  `nike_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `head_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `create_time` datetime(0) NULL DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '公众号客服消息' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '模板消息' ROW_FORMAT = Dynamic;