Commit ab41c966419ac7e6d0161f61a2764004edc17fae

Authored by YunaiV
1 parent 26ca97d2

mp:增加【自动回复】的分页接口

Showing 23 changed files with 296 additions and 24 deletions
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/menu/vo/MpMenuBaseVO.java
@@ -63,9 +63,9 @@ public class MpMenuBaseVO { @@ -63,9 +63,9 @@ public class MpMenuBaseVO {
63 63
64 // ========== 消息内容 ========== 64 // ========== 消息内容 ==========
65 65
66 - @ApiModelProperty(value = "消息类型", example = "text", 66 + @ApiModelProperty(value = "回复的消息类型", example = "text",
67 notes = "枚举 TEXT、IMAGE、VOICE、VIDEO、NEWS、MUSIC") 67 notes = "枚举 TEXT、IMAGE、VOICE、VIDEO、NEWS、MUSIC")
68 - @NotEmpty(message = "消息类型不能为空", groups = {ClickButtonGroup.class, ScanCodeWaitMsgButtonGroup.class}) 68 + @NotEmpty(message = "回复的消息类型不能为空", groups = {ClickButtonGroup.class, ScanCodeWaitMsgButtonGroup.class})
69 private String replyMessageType; 69 private String replyMessageType;
70 70
71 @ApiModelProperty(value = "回复的消息内容", example = "欢迎关注") 71 @ApiModelProperty(value = "回复的消息内容", example = "欢迎关注")
@@ -104,7 +104,7 @@ public class MpMenuBaseVO { @@ -104,7 +104,7 @@ public class MpMenuBaseVO {
104 @Valid 104 @Valid
105 private List<MpMessageDO.Article> replyArticles; 105 private List<MpMessageDO.Article> replyArticles;
106 106
107 - @ApiModelProperty(value = "音乐链接", example = "https://www.iocoder.cn/xxx.mp3") 107 + @ApiModelProperty(value = "回复的音乐链接", example = "https://www.iocoder.cn/xxx.mp3")
108 @NotEmpty(message = "回复的音乐链接不能为空", groups = MusicMessageGroup.class) 108 @NotEmpty(message = "回复的音乐链接不能为空", groups = MusicMessageGroup.class)
109 @URL(message = "回复的高质量音乐链接格式不正确", groups = MusicMessageGroup.class) 109 @URL(message = "回复的高质量音乐链接格式不正确", groups = MusicMessageGroup.class)
110 private String replyMusicUrl; 110 private String replyMusicUrl;
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpAutoReplyController.http 0 → 100644
  1 +### 请求 /mp/message/page 接口 => 成功
  2 +GET {{baseUrl}}/mp/auto-reply/page?accountId=1&pageNo=1&pageSize=10
  3 +Content-Type: application/json
  4 +Authorization: Bearer {{token}}
  5 +tenant-id: {{adminTenentId}}
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpAutoReplyController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mp.controller.admin.message;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyRespVO;
  6 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO;
  7 +import cn.iocoder.yudao.module.mp.convert.message.MpAutoReplyConvert;
  8 +import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO;
  9 +import cn.iocoder.yudao.module.mp.service.message.MpAutoReplyService;
  10 +import io.swagger.annotations.Api;
  11 +import io.swagger.annotations.ApiOperation;
  12 +import org.springframework.security.access.prepost.PreAuthorize;
  13 +import org.springframework.validation.annotation.Validated;
  14 +import org.springframework.web.bind.annotation.GetMapping;
  15 +import org.springframework.web.bind.annotation.RequestMapping;
  16 +import org.springframework.web.bind.annotation.RestController;
  17 +
  18 +import javax.annotation.Resource;
  19 +import javax.validation.Valid;
  20 +
  21 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  22 +
  23 +@Api(tags = "管理后台 - 公众号自动回复")
  24 +@RestController
  25 +@RequestMapping("/mp/auto-reply")
  26 +@Validated
  27 +public class MpAutoReplyController {
  28 +
  29 + @Resource
  30 + private MpAutoReplyService mpAutoReplyService;
  31 +
  32 + @GetMapping("/page")
  33 + @ApiOperation("获得公众号自动回复分页")
  34 + @PreAuthorize("@ss.hasPermission('mp:auto-reply:query')")
  35 + public CommonResult<PageResult<MpAutoReplyRespVO>> getAutoReplyPage(@Valid MpMessagePageReqVO pageVO) {
  36 + PageResult<MpAutoReplyDO> pageResult = mpAutoReplyService.getAutoReplyPage(pageVO);
  37 + return success(MpAutoReplyConvert.INSTANCE.convertPage(pageResult));
  38 + }
  39 +
  40 +}
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpMessageController.java
@@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.mp.controller.admin.message; @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.mp.controller.admin.message;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 -import cn.iocoder.yudao.module.mp.controller.admin.message.vo.MpMessagePageReqVO;  
6 -import cn.iocoder.yudao.module.mp.controller.admin.message.vo.MpMessageRespVO;  
7 -import cn.iocoder.yudao.module.mp.controller.admin.message.vo.MpMessageSendReqVO; 5 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO;
  6 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessageRespVO;
  7 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessageSendReqVO;
8 import cn.iocoder.yudao.module.mp.convert.message.MpMessageConvert; 8 import cn.iocoder.yudao.module.mp.convert.message.MpMessageConvert;
9 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO; 9 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
10 import cn.iocoder.yudao.module.mp.service.message.MpMessageService; 10 import cn.iocoder.yudao.module.mp.service.message.MpMessageService;
@@ -19,7 +19,7 @@ import javax.validation.Valid; @@ -19,7 +19,7 @@ import javax.validation.Valid;
19 19
20 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 20 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
21 21
22 -@Api(tags = "管理后台 - 粉丝消息") 22 +@Api(tags = "管理后台 - 公众号消息")
23 @RestController 23 @RestController
24 @RequestMapping("/mp/message") 24 @RequestMapping("/mp/message")
25 @Validated 25 @Validated
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply;
  2 +
  3 +import cn.hutool.core.util.ObjectUtil;
  4 +import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
  5 +import cn.iocoder.yudao.module.mp.enums.message.MpAutoReplyTypeEnum;
  6 +import cn.iocoder.yudao.module.mp.framework.mp.core.util.MpUtils.*;
  7 +import io.swagger.annotations.ApiModelProperty;
  8 +import lombok.Data;
  9 +import me.chanjar.weixin.common.api.WxConsts;
  10 +import org.hibernate.validator.constraints.URL;
  11 +
  12 +import javax.validation.Valid;
  13 +import javax.validation.constraints.AssertTrue;
  14 +import javax.validation.constraints.NotEmpty;
  15 +import javax.validation.constraints.NotNull;
  16 +import java.util.List;
  17 +
  18 +/**
  19 + * 公众号自动回复 Base VO,提供给添加、修改、详细的子 VO 使用
  20 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  21 + */
  22 +@Data
  23 +public class MpAutoReplyBaseVO {
  24 +
  25 + @ApiModelProperty(value = "回复类型", example = "1", notes = "参见 MpAutoReplyTypeEnum 枚举")
  26 + @NotNull(message = "回复类型不能为空")
  27 + private Integer type;
  28 +
  29 + // ==================== 请求消息 ====================
  30 +
  31 + @ApiModelProperty(value = "请求的关键字", example = "关键字", notes = "当 type 为 MpAutoReplyTypeEnum#KEYWORD 时,必填")
  32 + private String requestKeyword;
  33 + @ApiModelProperty(value = "请求的关键字", example = "关键字", notes = "当 type 为 MpAutoReplyTypeEnum#KEYWORD 时,必填")
  34 + private Integer requestMatch;
  35 +
  36 + @ApiModelProperty(value = "请求的消息类型", example = "text", notes = "当 type 为 MpAutoReplyTypeEnum#MESSAGE 时,必填")
  37 + private String requestMessageType;
  38 +
  39 + // ==================== 响应消息 ====================
  40 +
  41 + @ApiModelProperty(value = "回复的消息类型", example = "text",
  42 + notes = "枚举 TEXT、IMAGE、VOICE、VIDEO、NEWS、MUSIC")
  43 + @NotEmpty(message = "回复的消息类型不能为空")
  44 + private String responseMessageType;
  45 +
  46 + @ApiModelProperty(value = "回复的消息内容", example = "欢迎关注")
  47 + @NotEmpty(message = "回复的消息内容不能为空", groups = TextMessageGroup.class)
  48 + private String responseContent;
  49 +
  50 + @ApiModelProperty(value = "回复的媒体 id", example = "123456")
  51 + @NotEmpty(message = "回复的消息 mediaId 不能为空",
  52 + groups = {ImageMessageGroup.class, VoiceMessageGroup.class, VideoMessageGroup.class})
  53 + private String responseMediaId;
  54 + @ApiModelProperty(value = "回复的媒体 URL", example = "https://www.iocoder.cn/xxx.jpg")
  55 + @NotEmpty(message = "回复的消息 mediaId 不能为空",
  56 + groups = {ImageMessageGroup.class, VoiceMessageGroup.class, VideoMessageGroup.class})
  57 + private String responseMediaUrl;
  58 +
  59 + @ApiModelProperty(value = "缩略图的媒体 id", example = "123456")
  60 + @NotEmpty(message = "回复的消息 thumbMediaId 不能为空", groups = {MusicMessageGroup.class})
  61 + private String responseThumbMediaId;
  62 + @ApiModelProperty(value = "缩略图的媒体 URL",example = "https://www.iocoder.cn/xxx.jpg")
  63 + @NotEmpty(message = "回复的消息 thumbMedia 地址不能为空", groups = {MusicMessageGroup.class})
  64 + private String responseThumbMediaUrl;
  65 +
  66 + @ApiModelProperty(value = "回复的标题", example = "视频标题")
  67 + @NotEmpty(message = "回复的消息标题不能为空", groups = VideoMessageGroup.class)
  68 + private String responseTitle;
  69 + @ApiModelProperty(value = "回复的描述", example = "视频描述")
  70 + @NotEmpty(message = "消息描述不能为空", groups = VideoMessageGroup.class)
  71 + private String responseDescription;
  72 +
  73 + /**
  74 + * 回复的图文消息
  75 + *
  76 + * 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS
  77 + */
  78 + @NotNull(message = "回复的图文消息不能为空", groups = {NewsMessageGroup.class, ViewLimitedButtonGroup.class})
  79 + @Valid
  80 + private List<MpMessageDO.Article> responseArticles;
  81 +
  82 + @ApiModelProperty(value = "回复的音乐链接", example = "https://www.iocoder.cn/xxx.mp3")
  83 + @NotEmpty(message = "回复的音乐链接不能为空", groups = MusicMessageGroup.class)
  84 + @URL(message = "回复的高质量音乐链接格式不正确", groups = MusicMessageGroup.class)
  85 + private String responseMusicUrl;
  86 + @ApiModelProperty(value = "高质量音乐链接", example = "https://www.iocoder.cn/xxx.mp3")
  87 + @NotEmpty(message = "回复的高质量音乐链接不能为空", groups = MusicMessageGroup.class)
  88 + @URL(message = "回复的高质量音乐链接格式不正确", groups = MusicMessageGroup.class)
  89 + private String responseHqMusicUrl;
  90 +
  91 + @AssertTrue(message = "请求的关键字不能为空")
  92 + public boolean isRequestKeywordValid() {
  93 + return ObjectUtil.notEqual(type, MpAutoReplyTypeEnum.KEYWORD)
  94 + || requestKeyword != null;
  95 + }
  96 +
  97 + @AssertTrue(message = "请求的关键字的匹配不能为空")
  98 + public boolean isRequestMatchValid() {
  99 + return ObjectUtil.notEqual(type, MpAutoReplyTypeEnum.KEYWORD)
  100 + || requestMatch != null;
  101 + }
  102 +
  103 + @AssertTrue(message = "请求的消息类型不能为空")
  104 + public boolean isRequestMessageTypeValid() {
  105 + return ObjectUtil.notEqual(type, MpAutoReplyTypeEnum.MESSAGE)
  106 + || requestMessageType != null;
  107 + }
  108 +
  109 +
  110 +}
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import javax.validation.constraints.NotNull;
  10 +
  11 +@ApiModel("管理后台 - 公众号自动回复的创建 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class MpAutoReplyCreateReqVO extends MpAutoReplyBaseVO {
  16 +
  17 + @ApiModelProperty(value = "微信公众号 ID", required = true, example = "1024")
  18 + @NotNull(message = "微信公众号 ID不能为空")
  19 + private Long accountId;
  20 +
  21 + @ApiModelProperty(value = "回复类型", required = true, example = "1", notes = "参见 MpAutoReplyTypeEnum 枚举")
  22 + @NotNull(message = "回复类型不能为空")
  23 + private Integer type;
  24 +
  25 +}
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
  9 +
  10 +import javax.validation.constraints.NotNull;
  11 +
  12 +@ApiModel("管理后台 - 公众号自动回复的分页 Request VO")
  13 +@Data
  14 +@EqualsAndHashCode(callSuper = true)
  15 +@ToString(callSuper = true)
  16 +public class MpAutoReplyPageReqVO extends PageParam {
  17 +
  18 + @ApiModelProperty(value = "公众号账号的编号", required = true, example = "1")
  19 + @NotNull(message = "公众号账号的编号不能为空")
  20 + private Long accountId;
  21 +
  22 +}
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +@ApiModel("管理后台 - 公众号自动回复 Response VO")
  10 +@Data
  11 +@EqualsAndHashCode(callSuper = true)
  12 +@ToString(callSuper = true)
  13 +public class MpAutoReplyRespVO extends MpAutoReplyBaseVO {
  14 +
  15 + @ApiModelProperty(value = "主键", required = true, example = "1024")
  16 + private Long id;
  17 +
  18 + @ApiModelProperty(value = "微信公众号 ID", required = true, example = "1024")
  19 + private Long accountId;
  20 + @ApiModelProperty(value = "微信公众号 appid", required = true, example = "wx1234567890")
  21 + private String appId;
  22 +
  23 +}
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import javax.validation.constraints.NotNull;
  10 +
  11 +@ApiModel("管理后台 - 公众号自动回复的更新 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class MpAutoReplyUpdateReqVO extends MpAutoReplyBaseVO {
  16 +
  17 + @ApiModelProperty(value = "主键", required = true, example = "1024")
  18 + @NotNull(message = "主键不能为空")
  19 + private Long id;
  20 +
  21 +}
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/MpMessageBaseVO.java renamed to yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/message/MpMessageBaseVO.java
1 -package cn.iocoder.yudao.module.mp.controller.admin.message.vo; 1 +package cn.iocoder.yudao.module.mp.controller.admin.message.vo.message;
2 2
3 import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO; 3 import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO;
4 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO; 4 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/MpMessagePageReqVO.java renamed to yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/message/MpMessagePageReqVO.java
1 -package cn.iocoder.yudao.module.mp.controller.admin.message.vo; 1 +package cn.iocoder.yudao.module.mp.controller.admin.message.vo.message;
2 2
3 import lombok.*; 3 import lombok.*;
4 4
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/MpMessageRespVO.java renamed to yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/message/MpMessageRespVO.java
1 -package cn.iocoder.yudao.module.mp.controller.admin.message.vo; 1 +package cn.iocoder.yudao.module.mp.controller.admin.message.vo.message;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
4 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/MpMessageSendReqVO.java renamed to yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/message/MpMessageSendReqVO.java
1 -package cn.iocoder.yudao.module.mp.controller.admin.message.vo; 1 +package cn.iocoder.yudao.module.mp.controller.admin.message.vo.message;
2 2
3 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO; 3 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
4 import cn.iocoder.yudao.module.mp.framework.mp.core.util.MpUtils.*; 4 import cn.iocoder.yudao.module.mp.framework.mp.core.util.MpUtils.*;
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/convert/message/MpAutoReplyConvert.java
1 package cn.iocoder.yudao.module.mp.convert.message; 1 package cn.iocoder.yudao.module.mp.convert.message;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyRespVO;
3 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO; 5 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO;
4 import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO; 6 import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO;
5 import org.mapstruct.Mapper; 7 import org.mapstruct.Mapper;
@@ -23,4 +25,6 @@ public interface MpAutoReplyConvert { @@ -23,4 +25,6 @@ public interface MpAutoReplyConvert {
23 }) 25 })
24 MpMessageSendOutReqBO convert(String openid, MpAutoReplyDO reply); 26 MpMessageSendOutReqBO convert(String openid, MpAutoReplyDO reply);
25 27
  28 + PageResult<MpAutoReplyRespVO> convertPage(PageResult<MpAutoReplyDO> page);
  29 +
26 } 30 }
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/convert/message/MpMessageConvert.java
1 package cn.iocoder.yudao.module.mp.convert.message; 1 package cn.iocoder.yudao.module.mp.convert.message;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.module.mp.controller.admin.message.vo.MpMessageRespVO;  
5 -import cn.iocoder.yudao.module.mp.controller.admin.message.vo.MpMessageSendReqVO; 4 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessageRespVO;
  5 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessageSendReqVO;
6 import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO; 6 import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO;
7 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO; 7 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
8 import cn.iocoder.yudao.module.mp.dal.dataobject.user.MpUserDO; 8 import cn.iocoder.yudao.module.mp.dal.dataobject.user.MpUserDO;
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/dal/dataobject/message/MpAutoReplyDO.java
@@ -9,7 +9,6 @@ import com.baomidou.mybatisplus.annotation.KeySequence; @@ -9,7 +9,6 @@ import com.baomidou.mybatisplus.annotation.KeySequence;
9 import com.baomidou.mybatisplus.annotation.TableField; 9 import com.baomidou.mybatisplus.annotation.TableField;
10 import com.baomidou.mybatisplus.annotation.TableId; 10 import com.baomidou.mybatisplus.annotation.TableId;
11 import com.baomidou.mybatisplus.annotation.TableName; 11 import com.baomidou.mybatisplus.annotation.TableName;
12 -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;  
13 import lombok.Data; 12 import lombok.Data;
14 import lombok.EqualsAndHashCode; 13 import lombok.EqualsAndHashCode;
15 import lombok.ToString; 14 import lombok.ToString;
@@ -133,4 +132,5 @@ public class MpAutoReplyDO extends BaseDO { @@ -133,4 +132,5 @@ public class MpAutoReplyDO extends BaseDO {
133 */ 132 */
134 @TableField(typeHandler = MpMessageDO.ArticleTypeHandler.class) 133 @TableField(typeHandler = MpMessageDO.ArticleTypeHandler.class)
135 private List<MpMessageDO.Article> responseArticles; 134 private List<MpMessageDO.Article> responseArticles;
  135 +
136 } 136 }
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/dal/mysql/message/MpAutoReplyMapper.java
1 package cn.iocoder.yudao.module.mp.dal.mysql.message; 1 package cn.iocoder.yudao.module.mp.dal.mysql.message;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO;
5 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO; 7 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO;
6 import cn.iocoder.yudao.module.mp.enums.message.MpAutoReplyMatchEnum; 8 import cn.iocoder.yudao.module.mp.enums.message.MpAutoReplyMatchEnum;
7 import cn.iocoder.yudao.module.mp.enums.message.MpAutoReplyTypeEnum; 9 import cn.iocoder.yudao.module.mp.enums.message.MpAutoReplyTypeEnum;
@@ -12,6 +14,12 @@ import java.util.List; @@ -12,6 +14,12 @@ import java.util.List;
12 @Mapper 14 @Mapper
13 public interface MpAutoReplyMapper extends BaseMapperX<MpAutoReplyDO> { 15 public interface MpAutoReplyMapper extends BaseMapperX<MpAutoReplyDO> {
14 16
  17 + default PageResult<MpAutoReplyDO> selectPage(MpMessagePageReqVO pageVO) {
  18 + return selectPage(pageVO, new LambdaQueryWrapperX<MpAutoReplyDO>()
  19 + .eq(MpAutoReplyDO::getAccountId, pageVO.getAccountId())
  20 + .eqIfPresent(MpAutoReplyDO::getType, pageVO.getType()));
  21 + }
  22 +
15 default List<MpAutoReplyDO> selectListByAppIdAndKeywordAll(String appId, String requestKeyword) { 23 default List<MpAutoReplyDO> selectListByAppIdAndKeywordAll(String appId, String requestKeyword) {
16 return selectList(new LambdaQueryWrapperX<MpAutoReplyDO>() 24 return selectList(new LambdaQueryWrapperX<MpAutoReplyDO>()
17 .eq(MpAutoReplyDO::getAppId, appId) 25 .eq(MpAutoReplyDO::getAppId, appId)
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/dal/mysql/message/MpMessageMapper.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.mp.dal.mysql.message; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.mp.dal.mysql.message;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 -import cn.iocoder.yudao.module.mp.controller.admin.message.vo.MpMessagePageReqVO; 6 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO;
7 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO; 7 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/message/MpAutoReplyService.java
1 package cn.iocoder.yudao.module.mp.service.message; 1 package cn.iocoder.yudao.module.mp.service.message;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO;
  5 +import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO;
3 import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; 6 import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
4 import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; 7 import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
5 8
@@ -11,6 +14,14 @@ import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; @@ -11,6 +14,14 @@ import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
11 public interface MpAutoReplyService { 14 public interface MpAutoReplyService {
12 15
13 /** 16 /**
  17 + * 获得公众号自动回复分页
  18 + *
  19 + * @param pageVO 分页请求
  20 + * @return 自动回复分页结果
  21 + */
  22 + PageResult<MpAutoReplyDO> getAutoReplyPage(MpMessagePageReqVO pageVO);
  23 +
  24 + /**
14 * 当收到消息时,自动回复 25 * 当收到消息时,自动回复
15 * 26 *
16 * @param appId 微信公众号 appId 27 * @param appId 微信公众号 appId
@@ -27,5 +38,4 @@ public interface MpAutoReplyService { @@ -27,5 +38,4 @@ public interface MpAutoReplyService {
27 * @return 回复的消息 38 * @return 回复的消息
28 */ 39 */
29 WxMpXmlOutMessage replyForSubscribe(String appId, WxMpXmlMessage wxMessage); 40 WxMpXmlOutMessage replyForSubscribe(String appId, WxMpXmlMessage wxMessage);
30 -  
31 } 41 }
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/message/MpAutoReplyServiceImpl.java
@@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.mp.service.message; @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.mp.service.message;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.lang.Assert; 4 import cn.hutool.core.lang.Assert;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO;
5 import cn.iocoder.yudao.module.mp.convert.message.MpAutoReplyConvert; 7 import cn.iocoder.yudao.module.mp.convert.message.MpAutoReplyConvert;
6 import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO; 8 import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO;
7 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO; 9 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO;
@@ -38,6 +40,11 @@ public class MpAutoReplyServiceImpl implements MpAutoReplyService { @@ -38,6 +40,11 @@ public class MpAutoReplyServiceImpl implements MpAutoReplyService {
38 private MpAutoReplyMapper mpAutoReplyMapper; 40 private MpAutoReplyMapper mpAutoReplyMapper;
39 41
40 @Override 42 @Override
  43 + public PageResult<MpAutoReplyDO> getAutoReplyPage(MpMessagePageReqVO pageVO) {
  44 + return mpAutoReplyMapper.selectPage(pageVO);
  45 + }
  46 +
  47 + @Override
41 public WxMpXmlOutMessage replyForMessage(String appId, WxMpXmlMessage wxMessage) { 48 public WxMpXmlOutMessage replyForMessage(String appId, WxMpXmlMessage wxMessage) {
42 // 第一步,匹配自动回复 49 // 第一步,匹配自动回复
43 List<MpAutoReplyDO> replies = null; 50 List<MpAutoReplyDO> replies = null;
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/message/MpMessageService.java
1 package cn.iocoder.yudao.module.mp.service.message; 1 package cn.iocoder.yudao.module.mp.service.message;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.module.mp.controller.admin.message.vo.MpMessagePageReqVO;  
5 -import cn.iocoder.yudao.module.mp.controller.admin.message.vo.MpMessageSendReqVO; 4 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO;
  5 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessageSendReqVO;
6 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO; 6 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
7 import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO; 7 import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO;
8 import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; 8 import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/message/MpMessageServiceImpl.java
@@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.mp.service.message; @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.mp.service.message;
3 import cn.hutool.core.lang.Assert; 3 import cn.hutool.core.lang.Assert;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 -import cn.iocoder.yudao.module.mp.controller.admin.message.vo.MpMessagePageReqVO;  
7 -import cn.iocoder.yudao.module.mp.controller.admin.message.vo.MpMessageSendReqVO; 6 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO;
  7 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessageSendReqVO;
8 import cn.iocoder.yudao.module.mp.convert.message.MpMessageConvert; 8 import cn.iocoder.yudao.module.mp.convert.message.MpMessageConvert;
9 import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO; 9 import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO;
10 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO; 10 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
yudao-ui-admin/src/views/mp/autoReply/index.vue
@@ -53,7 +53,6 @@ SOFTWARE. @@ -53,7 +53,6 @@ SOFTWARE.
53 <el-tab-pane name="1"> 53 <el-tab-pane name="1">
54 <span slot="label"><i class="el-icon-star-off"></i> 关注时回复</span> 54 <span slot="label"><i class="el-icon-star-off"></i> 关注时回复</span>
55 <el-table v-loading="loading" :data="list"> 55 <el-table v-loading="loading" :data="list">
56 - <el-table-column label="编号" align="center" prop="id"/>  
57 <el-table-column label="回复消息类型" align="center" prop="responseMessageType"/> 56 <el-table-column label="回复消息类型" align="center" prop="responseMessageType"/>
58 <el-table-column label="创建时间" align="center" prop="createTime" width="180"> 57 <el-table-column label="创建时间" align="center" prop="createTime" width="180">
59 <template slot-scope="scope"> 58 <template slot-scope="scope">
@@ -75,7 +74,6 @@ SOFTWARE. @@ -75,7 +74,6 @@ SOFTWARE.
75 <el-tab-pane name="2"> 74 <el-tab-pane name="2">
76 <span slot="label"><i class="el-icon-chat-line-round"></i> 消息回复</span> 75 <span slot="label"><i class="el-icon-chat-line-round"></i> 消息回复</span>
77 <el-table v-loading="loading" :data="list"> 76 <el-table v-loading="loading" :data="list">
78 - <el-table-column label="编号" align="center" prop="id"/>  
79 <el-table-column label="请求消息类型" align="center" prop="requestMessageType"/> 77 <el-table-column label="请求消息类型" align="center" prop="requestMessageType"/>
80 <el-table-column label="回复消息类型" align="center" prop="responseMessageType"/> 78 <el-table-column label="回复消息类型" align="center" prop="responseMessageType"/>
81 <el-table-column label="创建时间" align="center" prop="createTime" width="180"> 79 <el-table-column label="创建时间" align="center" prop="createTime" width="180">
@@ -98,7 +96,6 @@ SOFTWARE. @@ -98,7 +96,6 @@ SOFTWARE.
98 <el-tab-pane name="3"> 96 <el-tab-pane name="3">
99 <span slot="label"><i class="el-icon-news"></i> 关键词回复</span> 97 <span slot="label"><i class="el-icon-news"></i> 关键词回复</span>
100 <el-table v-loading="loading" :data="list"> 98 <el-table v-loading="loading" :data="list">
101 - <el-table-column label="编号" align="center" prop="id"/>  
102 <el-table-column label="关键词" align="center" prop="requestKeyword"/> 99 <el-table-column label="关键词" align="center" prop="requestKeyword"/>
103 <el-table-column label="匹配类型" align="center" prop="requestMatch"/> 100 <el-table-column label="匹配类型" align="center" prop="requestMatch"/>
104 <el-table-column label="回复消息类型" align="center" prop="responseMessageType"/> 101 <el-table-column label="回复消息类型" align="center" prop="responseMessageType"/>
@@ -175,7 +172,7 @@ export default { @@ -175,7 +172,7 @@ export default {
175 data() { 172 data() {
176 return { 173 return {
177 // tab 类型(1、关注时回复;2、消息回复;3、关键词回复) 174 // tab 类型(1、关注时回复;2、消息回复;3、关键词回复)
178 - type:'1', 175 + type: '3',
179 // 遮罩层 176 // 遮罩层
180 loading: true, 177 loading: true,
181 // 显示搜索条件 178 // 显示搜索条件