Commit 6fc0b3fc546b3aa41e9d1f9a3f49cb9f23deb97d
1 parent
1e402d80
mp:增加【自动回复】的后端新增、修改、删除接口
Showing
8 changed files
with
210 additions
and
32 deletions
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 | 55 | ErrorCode MENU_SAVE_FAIL = new ErrorCode(1006008000, "创建菜单失败,原因:{}"); |
| 56 | 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 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyCreateReqVO; | |
| 5 | 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 | 8 | import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; |
| 7 | 9 | import cn.iocoder.yudao.module.mp.convert.message.MpAutoReplyConvert; |
| 8 | 10 | import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO; |
| ... | ... | @@ -12,10 +14,7 @@ import io.swagger.annotations.ApiImplicitParam; |
| 12 | 14 | import io.swagger.annotations.ApiOperation; |
| 13 | 15 | import org.springframework.security.access.prepost.PreAuthorize; |
| 14 | 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 | 19 | import javax.annotation.Resource; |
| 21 | 20 | import javax.validation.Valid; |
| ... | ... | @@ -48,4 +47,28 @@ public class MpAutoReplyController { |
| 48 | 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 | 18 | @NotNull(message = "微信公众号 ID不能为空") |
| 19 | 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 | 1 | package cn.iocoder.yudao.module.mp.convert.message; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | +import cn.iocoder.yudao.module.mp.controller.admin.message.vo.autoreply.MpAutoReplyCreateReqVO; | |
| 4 | 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 | 7 | import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO; |
| 6 | 8 | import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO; |
| 7 | 9 | import org.mapstruct.Mapper; |
| ... | ... | @@ -29,4 +31,7 @@ public interface MpAutoReplyConvert { |
| 29 | 31 | |
| 30 | 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<MpAutoReplyDO> { |
| 49 | 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 | 1 | package cn.iocoder.yudao.module.mp.service.message; |
| 2 | 2 | |
| 3 | 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 | 6 | import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; |
| 5 | 7 | import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO; |
| 6 | 8 | import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; |
| ... | ... | @@ -29,6 +31,29 @@ public interface MpAutoReplyService { |
| 29 | 31 | */ |
| 30 | 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 | 71 | * @return 回复的消息 |
| 47 | 72 | */ |
| 48 | 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 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | 4 | import cn.hutool.core.lang.Assert; |
| 5 | +import cn.hutool.core.util.ObjUtil; | |
| 6 | +import cn.iocoder.yudao.framework.common.exception.ErrorCode; | |
| 5 | 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 | 10 | import cn.iocoder.yudao.module.mp.controller.admin.message.vo.message.MpMessagePageReqVO; |
| 7 | 11 | import cn.iocoder.yudao.module.mp.convert.message.MpAutoReplyConvert; |
| 8 | 12 | import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO; |
| 9 | 13 | import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpAutoReplyDO; |
| 10 | 14 | import cn.iocoder.yudao.module.mp.dal.mysql.message.MpAutoReplyMapper; |
| 11 | 15 | import cn.iocoder.yudao.module.mp.enums.message.MpAutoReplyTypeEnum; |
| 16 | +import cn.iocoder.yudao.module.mp.framework.mp.core.util.MpUtils; | |
| 12 | 17 | import cn.iocoder.yudao.module.mp.service.account.MpAccountService; |
| 13 | 18 | import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO; |
| 14 | 19 | import me.chanjar.weixin.common.api.WxConsts; |
| ... | ... | @@ -19,8 +24,12 @@ import org.springframework.stereotype.Service; |
| 19 | 24 | import org.springframework.validation.annotation.Validated; |
| 20 | 25 | |
| 21 | 26 | import javax.annotation.Resource; |
| 27 | +import javax.validation.Validator; | |
| 22 | 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 | 34 | * 公众号的自动回复 Service 实现类 |
| 26 | 35 | * |
| ... | ... | @@ -37,6 +46,9 @@ public class MpAutoReplyServiceImpl implements MpAutoReplyService { |
| 37 | 46 | private MpAccountService mpAccountService; |
| 38 | 47 | |
| 39 | 48 | @Resource |
| 49 | + private Validator validator; | |
| 50 | + | |
| 51 | + @Resource | |
| 40 | 52 | private MpAutoReplyMapper mpAutoReplyMapper; |
| 41 | 53 | |
| 42 | 54 | @Override |
| ... | ... | @@ -50,6 +62,96 @@ public class MpAutoReplyServiceImpl implements MpAutoReplyService { |
| 50 | 62 | } |
| 51 | 63 | |
| 52 | 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 | 155 | public WxMpXmlOutMessage replyForMessage(String appId, WxMpXmlMessage wxMessage) { |
| 54 | 156 | // 第一步,匹配自动回复 |
| 55 | 157 | List<MpAutoReplyDO> replies = null; | ... | ... |
yudao-ui-admin/src/views/mp/autoReply/index.vue
| ... | ... | @@ -96,33 +96,35 @@ SOFTWARE. |
| 96 | 96 | </el-tab-pane> |
| 97 | 97 | <el-tab-pane name="3"> |
| 98 | 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 | 99 | </el-tab-pane> |
| 124 | 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 | 129 | <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body> |
| 128 | 130 | <el-form ref="form" :model="form" :rules="rules" label-width="80px"> | ... | ... |