Commit 6fc0b3fc546b3aa41e9d1f9a3f49cb9f23deb97d

Authored by YunaiV
1 parent 1e402d80

mp:增加【自动回复】的后端新增、修改、删除接口

yudao-module-mp/yudao-module-mp-api/src/main/java/cn/iocoder/yudao/module/mp/enums/ErrorCodeConstants.java
@@ -55,4 +55,10 @@ public interface ErrorCodeConstants { @@ -55,4 +55,10 @@ public interface ErrorCodeConstants {
55 ErrorCode MENU_SAVE_FAIL = new ErrorCode(1006008000, "创建菜单失败,原因:{}"); 55 ErrorCode MENU_SAVE_FAIL = new ErrorCode(1006008000, "创建菜单失败,原因:{}");
56 ErrorCode MENU_DELETE_FAIL = new ErrorCode(1006008001, "删除菜单失败,原因:{}"); 56 ErrorCode MENU_DELETE_FAIL = new ErrorCode(1006008001, "删除菜单失败,原因:{}");
57 57
  58 + // ========== 公众号自动回复 1006009000============
  59 + ErrorCode AUTO_REPLY_NOT_EXISTS = new ErrorCode(1006009000, "自动回复不存在");
  60 + ErrorCode AUTO_REPLY_ADD_SUBSCRIBE_FAIL_EXISTS = new ErrorCode(1006009001, "操作失败,原因:已存在关注时的回复");
  61 + ErrorCode AUTO_REPLY_ADD_MESSAGE_FAIL_EXISTS = new ErrorCode(1006009002, "操作失败,原因:已存在该消息类型的回复");
  62 + ErrorCode AUTO_REPLY_ADD_KEYWORD_FAIL_EXISTS = new ErrorCode(1006009003, "操作失败,原因:已关在该关键字的回复");
  63 +
58 } 64 }
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/MpAutoReplyController.java
@@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.mp.controller.admin.message; @@ -2,7 +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.autoreply.MpAutoReplyCreateReqVO;
5 import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyRespVO; 6 import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyRespVO;
  7 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyUpdateReqVO;
6 import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; 8 import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO;
7 import cn.iocoder.yudao.module.mp.convert.message.MpAutoReplyConvert; 9 import cn.iocoder.yudao.module.mp.convert.message.MpAutoReplyConvert;
8 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO; 10 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO;
@@ -12,10 +14,7 @@ import io.swagger.annotations.ApiImplicitParam; @@ -12,10 +14,7 @@ import io.swagger.annotations.ApiImplicitParam;
12 import io.swagger.annotations.ApiOperation; 14 import io.swagger.annotations.ApiOperation;
13 import org.springframework.security.access.prepost.PreAuthorize; 15 import org.springframework.security.access.prepost.PreAuthorize;
14 import org.springframework.validation.annotation.Validated; 16 import org.springframework.validation.annotation.Validated;
15 -import org.springframework.web.bind.annotation.GetMapping;  
16 -import org.springframework.web.bind.annotation.RequestMapping;  
17 -import org.springframework.web.bind.annotation.RequestParam;  
18 -import org.springframework.web.bind.annotation.RestController; 17 +import org.springframework.web.bind.annotation.*;
19 18
20 import javax.annotation.Resource; 19 import javax.annotation.Resource;
21 import javax.validation.Valid; 20 import javax.validation.Valid;
@@ -48,4 +47,28 @@ public class MpAutoReplyController { @@ -48,4 +47,28 @@ public class MpAutoReplyController {
48 return success(MpAutoReplyConvert.INSTANCE.convert(autoReply)); 47 return success(MpAutoReplyConvert.INSTANCE.convert(autoReply));
49 } 48 }
50 49
  50 + @PostMapping("/create")
  51 + @ApiOperation("创建公众号自动回复")
  52 + @PreAuthorize("@ss.hasPermission('mp:auto-reply:create')")
  53 + public CommonResult<Long> createAutoReply(@Valid @RequestBody MpAutoReplyCreateReqVO createReqVO) {
  54 + return success(mpAutoReplyService.createAutoReply(createReqVO));
  55 + }
  56 +
  57 + @PutMapping("/update")
  58 + @ApiOperation("更新公众号自动回复")
  59 + @PreAuthorize("@ss.hasPermission('mp:auto-reply:update')")
  60 + public CommonResult<Boolean> updateAutoReply(@Valid @RequestBody MpAutoReplyUpdateReqVO updateReqVO) {
  61 + mpAutoReplyService.updateAutoReply(updateReqVO);
  62 + return success(true);
  63 + }
  64 +
  65 + @DeleteMapping("/delete")
  66 + @ApiOperation("删除公众号自动回复")
  67 + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
  68 + @PreAuthorize("@ss.hasPermission('mp:auto-reply:delete')")
  69 + public CommonResult<Boolean> deleteAutoReply(@RequestParam("id") Long id) {
  70 + mpAutoReplyService.deleteAutoReply(id);
  71 + return success(true);
  72 + }
  73 +
51 } 74 }
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/controller/admin/message/vo/autoreply/MpAutoReplyCreateReqVO.java
@@ -18,8 +18,4 @@ public class MpAutoReplyCreateReqVO extends MpAutoReplyBaseVO { @@ -18,8 +18,4 @@ public class MpAutoReplyCreateReqVO extends MpAutoReplyBaseVO {
18 @NotNull(message = "微信公众号 ID不能为空") 18 @NotNull(message = "微信公众号 ID不能为空")
19 private Long accountId; 19 private Long accountId;
20 20
21 - @ApiModelProperty(value = "回复类型", required = true, example = "1", notes = "参见 MpAutoReplyTypeEnum 枚举")  
22 - @NotNull(message = "回复类型不能为空")  
23 - private Integer type;  
24 -  
25 } 21 }
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; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyCreateReqVO;
4 import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyRespVO; 5 import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyRespVO;
  6 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyUpdateReqVO;
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.service.message.bo.MpMessageSendOutReqBO; 8 import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO;
7 import org.mapstruct.Mapper; 9 import org.mapstruct.Mapper;
@@ -29,4 +31,7 @@ public interface MpAutoReplyConvert { @@ -29,4 +31,7 @@ public interface MpAutoReplyConvert {
29 31
30 MpAutoReplyRespVO convert(MpAutoReplyDO bean); 32 MpAutoReplyRespVO convert(MpAutoReplyDO bean);
31 33
  34 + MpAutoReplyDO convert(MpAutoReplyCreateReqVO bean);
  35 +
  36 + MpAutoReplyDO convert(MpAutoReplyUpdateReqVO bean);
32 } 37 }
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/dal/mysql/message/MpAutoReplyMapper.java
@@ -49,4 +49,22 @@ public interface MpAutoReplyMapper extends BaseMapperX&lt;MpAutoReplyDO&gt; { @@ -49,4 +49,22 @@ public interface MpAutoReplyMapper extends BaseMapperX&lt;MpAutoReplyDO&gt; {
49 .eq(MpAutoReplyDO::getType, MpAutoReplyTypeEnum.SUBSCRIBE.getType())); 49 .eq(MpAutoReplyDO::getType, MpAutoReplyTypeEnum.SUBSCRIBE.getType()));
50 } 50 }
51 51
  52 + default MpAutoReplyDO selectByAccountIdAndSubscribe(Long accountId) {
  53 + return selectOne(MpAutoReplyDO::getAccountId, accountId,
  54 + MpAutoReplyDO::getType, MpAutoReplyTypeEnum.SUBSCRIBE.getType());
  55 + }
  56 +
  57 + default MpAutoReplyDO selectByAccountIdAndMessage(Long accountId, String requestMessageType) {
  58 + return selectOne(new LambdaQueryWrapperX<MpAutoReplyDO>()
  59 + .eq(MpAutoReplyDO::getAccountId, accountId)
  60 + .eq(MpAutoReplyDO::getType, MpAutoReplyTypeEnum.MESSAGE.getType())
  61 + .eq(MpAutoReplyDO::getRequestMessageType, requestMessageType));
  62 + }
  63 +
  64 + default MpAutoReplyDO selectByAccountIdAndKeyword(Long accountId, String requestKeyword) {
  65 + return selectOne(new LambdaQueryWrapperX<MpAutoReplyDO>()
  66 + .eq(MpAutoReplyDO::getAccountId, accountId)
  67 + .eq(MpAutoReplyDO::getType, MpAutoReplyTypeEnum.KEYWORD.getType())
  68 + .eq(MpAutoReplyDO::getRequestKeyword, requestKeyword));
  69 + }
52 } 70 }
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; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyCreateReqVO;
  5 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyUpdateReqVO;
4 import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; 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 me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; 8 import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
@@ -29,6 +31,29 @@ public interface MpAutoReplyService { @@ -29,6 +31,29 @@ public interface MpAutoReplyService {
29 */ 31 */
30 MpAutoReplyDO getAutoReply(Long id); 32 MpAutoReplyDO getAutoReply(Long id);
31 33
  34 +
  35 + /**
  36 + * 创建公众号自动回复
  37 + *
  38 + * @param createReqVO 创建请求
  39 + * @return 自动回复的编号
  40 + */
  41 + Long createAutoReply(MpAutoReplyCreateReqVO createReqVO);
  42 +
  43 + /**
  44 + * 更新公众号自动回复
  45 + *
  46 + * @param updateReqVO 更新请求
  47 + */
  48 + void updateAutoReply(MpAutoReplyUpdateReqVO updateReqVO);
  49 +
  50 + /**
  51 + * 删除公众号自动回复
  52 + *
  53 + * @param id 自动回复的编号
  54 + */
  55 + void deleteAutoReply(Long id);
  56 +
32 /** 57 /**
33 * 当收到消息时,自动回复 58 * 当收到消息时,自动回复
34 * 59 *
@@ -46,4 +71,5 @@ public interface MpAutoReplyService { @@ -46,4 +71,5 @@ public interface MpAutoReplyService {
46 * @return 回复的消息 71 * @return 回复的消息
47 */ 72 */
48 WxMpXmlOutMessage replyForSubscribe(String appId, WxMpXmlMessage wxMessage); 73 WxMpXmlOutMessage replyForSubscribe(String appId, WxMpXmlMessage wxMessage);
  74 +
49 } 75 }
yudao-module-mp/yudao-module-mp-biz/src/main/java/cn/iocoder/yudao/module/mp/service/message/MpAutoReplyServiceImpl.java
@@ -2,13 +2,18 @@ package cn.iocoder.yudao.module.mp.service.message; @@ -2,13 +2,18 @@ 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.hutool.core.util.ObjUtil;
  6 +import cn.iocoder.yudao.framework.common.exception.ErrorCode;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  8 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyCreateReqVO;
  9 +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyUpdateReqVO;
6 import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; 10 import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO;
7 import cn.iocoder.yudao.module.mp.convert.message.MpAutoReplyConvert; 11 import cn.iocoder.yudao.module.mp.convert.message.MpAutoReplyConvert;
8 import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO; 12 import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO;
9 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO; 13 import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO;
10 import cn.iocoder.yudao.module.mp.dal.mysql.message.MpAutoReplyMapper; 14 import cn.iocoder.yudao.module.mp.dal.mysql.message.MpAutoReplyMapper;
11 import cn.iocoder.yudao.module.mp.enums.message.MpAutoReplyTypeEnum; 15 import cn.iocoder.yudao.module.mp.enums.message.MpAutoReplyTypeEnum;
  16 +import cn.iocoder.yudao.module.mp.framework.mp.core.util.MpUtils;
12 import cn.iocoder.yudao.module.mp.service.account.MpAccountService; 17 import cn.iocoder.yudao.module.mp.service.account.MpAccountService;
13 import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO; 18 import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO;
14 import me.chanjar.weixin.common.api.WxConsts; 19 import me.chanjar.weixin.common.api.WxConsts;
@@ -19,8 +24,12 @@ import org.springframework.stereotype.Service; @@ -19,8 +24,12 @@ import org.springframework.stereotype.Service;
19 import org.springframework.validation.annotation.Validated; 24 import org.springframework.validation.annotation.Validated;
20 25
21 import javax.annotation.Resource; 26 import javax.annotation.Resource;
  27 +import javax.validation.Validator;
22 import java.util.List; 28 import java.util.List;
23 29
  30 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  31 +import static cn.iocoder.yudao.module.mp.enums.ErrorCodeConstants.*;
  32 +
24 /** 33 /**
25 * 公众号的自动回复 Service 实现类 34 * 公众号的自动回复 Service 实现类
26 * 35 *
@@ -37,6 +46,9 @@ public class MpAutoReplyServiceImpl implements MpAutoReplyService { @@ -37,6 +46,9 @@ public class MpAutoReplyServiceImpl implements MpAutoReplyService {
37 private MpAccountService mpAccountService; 46 private MpAccountService mpAccountService;
38 47
39 @Resource 48 @Resource
  49 + private Validator validator;
  50 +
  51 + @Resource
40 private MpAutoReplyMapper mpAutoReplyMapper; 52 private MpAutoReplyMapper mpAutoReplyMapper;
41 53
42 @Override 54 @Override
@@ -50,6 +62,96 @@ public class MpAutoReplyServiceImpl implements MpAutoReplyService { @@ -50,6 +62,96 @@ public class MpAutoReplyServiceImpl implements MpAutoReplyService {
50 } 62 }
51 63
52 @Override 64 @Override
  65 + public Long createAutoReply(MpAutoReplyCreateReqVO createReqVO) {
  66 + // 第一步,校验数据
  67 + if (createReqVO.getResponseMessageType() != null) {
  68 + MpUtils.validateMessage(validator, createReqVO.getResponseMessageType(), createReqVO);
  69 + }
  70 + validateAutoReplyConflict(null, createReqVO.getAccountId(), createReqVO.getType(),
  71 + createReqVO.getRequestKeyword(), createReqVO.getRequestMessageType());
  72 +
  73 + // 第二步,插入数据
  74 + MpAccountDO account = mpAccountService.getRequiredAccount(createReqVO.getAccountId());
  75 + MpAutoReplyDO autoReply = MpAutoReplyConvert.INSTANCE.convert(createReqVO)
  76 + .setAppId(account.getAppId());
  77 + mpAutoReplyMapper.insert(autoReply);
  78 + return autoReply.getId();
  79 + }
  80 +
  81 + @Override
  82 + public void updateAutoReply(MpAutoReplyUpdateReqVO updateReqVO) {
  83 + // 第一步,校验数据
  84 + if (updateReqVO.getResponseMessageType() != null) {
  85 + MpUtils.validateMessage(validator, updateReqVO.getResponseMessageType(), updateReqVO);
  86 + }
  87 + MpAutoReplyDO autoReply = validateAutoReplyExists(updateReqVO.getId());
  88 + validateAutoReplyConflict(updateReqVO.getId(), autoReply.getAccountId(), updateReqVO.getType(),
  89 + updateReqVO.getRequestKeyword(), updateReqVO.getRequestMessageType());
  90 +
  91 + // 第二步,更新数据
  92 + MpAutoReplyDO updateObj = MpAutoReplyConvert.INSTANCE.convert(updateReqVO)
  93 + .setAccountId(null).setAppId(null); // 避免前端传递,更新着两个字段
  94 + mpAutoReplyMapper.updateById(updateObj);
  95 + }
  96 +
  97 + /**
  98 + * 校验自动回复是否冲突
  99 + *
  100 + * 不同的 type,会有不同的逻辑:
  101 + * 1. type = SUBSCRIBE 时,不允许有其他的自动回复
  102 + * 2. type = MESSAGE 时,校验 requestMessageType 已经存在自动回复
  103 + * 3. type = KEYWORD 时,校验 keyword 已经存在自动回复
  104 + *
  105 + * @param id 自动回复编号
  106 + * @param accountId 公众号账号的编号
  107 + * @param type 类型
  108 + * @param requestKeyword 请求关键词
  109 + * @param requestMessageType 请求消息类型
  110 + */
  111 + private void validateAutoReplyConflict(Long id, Long accountId, Integer type,
  112 + String requestKeyword, String requestMessageType) {
  113 + // 获得已经存在的自动回复
  114 + MpAutoReplyDO autoReply = null;
  115 + ErrorCode errorCode = null;
  116 + if (MpAutoReplyTypeEnum.SUBSCRIBE.getType().equals(type)) {
  117 + autoReply = mpAutoReplyMapper.selectByAccountIdAndSubscribe(accountId);
  118 + errorCode = AUTO_REPLY_ADD_SUBSCRIBE_FAIL_EXISTS;
  119 + } else if (MpAutoReplyTypeEnum.MESSAGE.getType().equals(type)) {
  120 + autoReply = mpAutoReplyMapper.selectByAccountIdAndMessage(accountId, requestMessageType);
  121 + errorCode = AUTO_REPLY_ADD_MESSAGE_FAIL_EXISTS;
  122 + } else if (MpAutoReplyTypeEnum.KEYWORD.getType().equals(type)) {
  123 + autoReply = mpAutoReplyMapper.selectByAccountIdAndKeyword(accountId, requestKeyword);
  124 + errorCode = AUTO_REPLY_ADD_KEYWORD_FAIL_EXISTS;
  125 + }
  126 + if (autoReply == null) {
  127 + return;
  128 + }
  129 +
  130 + // 存在冲突,抛出业务异常
  131 + if (id == null // 情况一,新增(id == null),存在记录,说明冲突
  132 + || ObjUtil.notEqual(id, autoReply.getId())) { // 情况二,修改(id != null),id 不匹配,说明冲突
  133 + throw exception(errorCode);
  134 + }
  135 + }
  136 +
  137 + @Override
  138 + public void deleteAutoReply(Long id) {
  139 + // 校验用户存在
  140 + validateAutoReplyExists(id);
  141 +
  142 + // 删除自动回复
  143 + mpAutoReplyMapper.deleteById(id);
  144 + }
  145 +
  146 + private MpAutoReplyDO validateAutoReplyExists(Long id) {
  147 + MpAutoReplyDO autoReply = mpAutoReplyMapper.selectById(id);
  148 + if (autoReply == null) {
  149 + throw exception(AUTO_REPLY_NOT_EXISTS);
  150 + }
  151 + return autoReply;
  152 + }
  153 +
  154 + @Override
53 public WxMpXmlOutMessage replyForMessage(String appId, WxMpXmlMessage wxMessage) { 155 public WxMpXmlOutMessage replyForMessage(String appId, WxMpXmlMessage wxMessage) {
54 // 第一步,匹配自动回复 156 // 第一步,匹配自动回复
55 List<MpAutoReplyDO> replies = null; 157 List<MpAutoReplyDO> replies = null;
yudao-ui-admin/src/views/mp/autoReply/index.vue
@@ -96,33 +96,35 @@ SOFTWARE. @@ -96,33 +96,35 @@ SOFTWARE.
96 </el-tab-pane> 96 </el-tab-pane>
97 <el-tab-pane name="3"> 97 <el-tab-pane name="3">
98 <span slot="label"><i class="el-icon-news"></i> 关键词回复</span> 98 <span slot="label"><i class="el-icon-news"></i> 关键词回复</span>
99 - <el-table v-loading="loading" :data="list">  
100 - <el-table-column label="关键词" align="center" prop="requestKeyword"/>  
101 - <el-table-column label="匹配类型" align="center" prop="requestMatch">  
102 - <template v-slot="scope">  
103 - <dict-tag :type="DICT_TYPE.MP_AUTO_REPLY_REQUEST_MATCH" :value="scope.row.requestMatch"/>  
104 - </template>  
105 - </el-table-column>  
106 - <el-table-column label="回复消息类型" align="center" prop="responseMessageType"/>  
107 - <el-table-column label="创建时间" align="center" prop="createTime" width="180">  
108 - <template slot-scope="scope">  
109 - <span>{{ parseTime(scope.row.createTime) }}</span>  
110 - </template>  
111 - </el-table-column>  
112 - <el-table-column label="操作" align="center" class-name="small-padding fixed-width">  
113 - <template slot-scope="scope">  
114 - <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"  
115 - v-hasPermi="['mp:auto-reply:update']">修改  
116 - </el-button>  
117 - <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"  
118 - v-hasPermi="['mp:auto-reply:delete']">删除  
119 - </el-button>  
120 - </template>  
121 - </el-table-column>  
122 - </el-table>  
123 </el-tab-pane> 99 </el-tab-pane>
124 </el-tabs> 100 </el-tabs>
125 101
  102 + <!-- 列表 -->
  103 + <el-table v-loading="loading" :data="list">
  104 + <el-table-column label="关键词" align="center" prop="requestKeyword"/>
  105 + <el-table-column label="匹配类型" align="center" prop="requestMatch">
  106 + <template v-slot="scope">
  107 + <dict-tag :type="DICT_TYPE.MP_AUTO_REPLY_REQUEST_MATCH" :value="scope.row.requestMatch"/>
  108 + </template>
  109 + </el-table-column>
  110 + <el-table-column label="回复消息类型" align="center" prop="responseMessageType"/>
  111 + <el-table-column label="创建时间" align="center" prop="createTime" width="180">
  112 + <template slot-scope="scope">
  113 + <span>{{ parseTime(scope.row.createTime) }}</span>
  114 + </template>
  115 + </el-table-column>
  116 + <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  117 + <template slot-scope="scope">
  118 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  119 + v-hasPermi="['mp:auto-reply:update']">修改
  120 + </el-button>
  121 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  122 + v-hasPermi="['mp:auto-reply:delete']">删除
  123 + </el-button>
  124 + </template>
  125 + </el-table-column>
  126 + </el-table>
  127 +
126 <!-- 添加或修改自动回复的对话框 --> 128 <!-- 添加或修改自动回复的对话框 -->
127 <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body> 129 <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
128 <el-form ref="form" :model="form" :rules="rules" label-width="80px"> 130 <el-form ref="form" :model="form" :rules="rules" label-width="80px">