Commit df01bd6c79cba042f24fe4c70df1fab807a1665d

Authored by YunaiV
1 parent 3acdec96

短信提交 2021-03-25,调整下短信发送 API

src/main/java/cn/iocoder/dashboard/framework/sms/client/impl/ali/AliyunSmsClient.java
... ... @@ -7,7 +7,7 @@ import cn.iocoder.dashboard.framework.sms.core.SmsBody;
7 7 import cn.iocoder.dashboard.framework.sms.core.SmsResult;
8 8 import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail;
9 9 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty;
10   -import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum;
  10 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
11 11 import cn.iocoder.dashboard.util.json.JsonUtils;
12 12 import com.aliyuncs.DefaultAcsClient;
13 13 import com.aliyuncs.IAcsClient;
... ... @@ -131,8 +131,8 @@ public class AliyunSmsClient extends AbstractSmsClient {
131 131  
132 132 public Integer getSendStatus() {
133 133 return ((Boolean) sendResultParamMap.get(CallbackField.SUCCESS))
134   - ? SmsSendStatusEnum.SEND_SUCCESS.getStatus()
135   - : SmsSendStatusEnum.SEND_FAIL.getStatus();
  134 + ? SysSmsSendStatusEnum.SEND_SUCCESS.getStatus()
  135 + : SysSmsSendStatusEnum.SEND_FAIL.getStatus();
136 136 }
137 137  
138 138 public String getBizId() {
... ...
src/main/java/cn/iocoder/dashboard/framework/sms/client/impl/yunpian/YunpianSmsClient.java
... ... @@ -9,7 +9,7 @@ import cn.iocoder.dashboard.framework.sms.core.SmsConstants;
9 9 import cn.iocoder.dashboard.framework.sms.core.SmsResult;
10 10 import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail;
11 11 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty;
12   -import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum;
  12 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
13 13 import cn.iocoder.dashboard.util.json.JsonUtils;
14 14 import com.fasterxml.jackson.core.type.TypeReference;
15 15 import com.yunpian.sdk.YunpianClient;
... ... @@ -155,8 +155,8 @@ public class YunpianSmsClient extends AbstractSmsClient {
155 155 private static int getSendStatus(Map<String, String> map) {
156 156 String reportStatus = map.get(REPORT_STATUS);
157 157 return SmsConstants.SUCCESS.equals(reportStatus)
158   - ? SmsSendStatusEnum.SEND_SUCCESS.getStatus()
159   - : SmsSendStatusEnum.SEND_FAIL.getStatus();
  158 + ? SysSmsSendStatusEnum.SEND_SUCCESS.getStatus()
  159 + : SysSmsSendStatusEnum.SEND_FAIL.getStatus();
160 160 }
161 161  
162 162 public static SmsResultDetail getSmsResultDetailByParam(Map<String, String> map) {
... ...
src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java
1 1 package cn.iocoder.dashboard.framework.sms.core;
2 2  
  3 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
3 4 import lombok.Data;
4 5  
5 6 import java.io.Serializable;
... ... @@ -17,7 +18,7 @@ public class SmsResultDetail implements Serializable {
17 18 private String apiId;
18 19  
19 20 /**
20   - * 短信发送状态 {@link cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum}
  21 + * 短信发送状态 {@link SysSmsSendStatusEnum}
21 22 */
22 23 private Integer sendStatus;
23 24  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsQueryLogDO.java
1 1 package cn.iocoder.dashboard.modules.system.dal.dataobject.sms;
2 2  
  3 +import cn.iocoder.dashboard.common.enums.UserTypeEnum;
  4 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
  5 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendFailureTypeEnum;
  6 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
  7 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum;
3 8 import com.baomidou.mybatisplus.annotation.TableName;
4 9 import lombok.Data;
5 10 import lombok.EqualsAndHashCode;
6 11 import lombok.experimental.Accessors;
7 12  
8   -import java.io.Serializable;
9 13 import java.util.Date;
  14 +import java.util.Map;
10 15  
11 16 /**
12   - * 短信日志
  17 + * 短信发送日志
13 18 *
14 19 * @author zzf
15 20 * @since 2021-01-25
... ... @@ -18,73 +23,118 @@ import java.util.Date;
18 23 @EqualsAndHashCode
19 24 @Accessors(chain = true)
20 25 @TableName(value = "sms_query_log", autoResultMap = true)
21   -public class SysSmsQueryLogDO implements Serializable {
  26 +public class SysSmsQueryLogDO extends BaseDO {
22 27  
23 28 /**
24 29 * 自增编号
25 30 */
26 31 private Long id;
27 32  
  33 + // ========= 渠道相关字段 =========
  34 +
28 35 /**
29   - * 第三方唯一标识
  36 + * 短信渠道编号
  37 + *
  38 + * 关联 {@link SysSmsChannelDO#getId()}
30 39 */
31   - private String apiId;
32   -
  40 + private Long channelId;
33 41 /**
34   - * 短信渠道编码(来自枚举类)
  42 + * 短信渠道编码
  43 + *
  44 + * 冗余 {@link SysSmsChannelDO#getCode()}
35 45 */
36 46 private String channelCode;
37   -
38 47 /**
39   - * 短信渠道id
  48 + * 实际渠道模板唯一标识
40 49 */
41   - private Long channelId;
  50 + private String apiTemplateId;
  51 +
  52 + // ========= 模板相关字段 =========
42 53  
43 54 /**
44   - * 模板id
  55 + * 短信模板编号
  56 + *
  57 + * 关联 {@link}
45 58 */
46 59 private String templateCode;
  60 + /**
  61 + * 短信类型
  62 + *
  63 + * 枚举 {@link SysSmsTemplateTypeEnum}
  64 + */
  65 + private Integer templateType;
  66 + /**
  67 + * 基于 {@link SysSmsTemplateDO#getContent()} 格式化后的内容
  68 + */
  69 + private String templateContent;
  70 + /**
  71 + * 基于 {@link SysSmsTemplateDO#getParams()} 输入后的内容
  72 + */
  73 + private Map<String, Object> templateParams;
  74 +
  75 + // ========= 手机相关字段 =========
47 76  
48 77 /**
49 78 * 手机号
50 79 */
51   - private String phone;
52   -
  80 + private String mobile;
53 81 /**
54   - * 内容
  82 + * 用户编号
  83 + */
  84 + private Integer userId;
  85 + /**
  86 + * 用户类型
  87 + *
  88 + * 枚举 {@link UserTypeEnum}
55 89 */
56   - private String content;
  90 + private Integer userType;
  91 +
  92 + // ========= 发送相关字段 =========
57 93  
58 94 /**
59 95 * 发送状态
60 96 *
61   - * @see cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum
  97 + * 枚举 {@link SysSmsSendStatusEnum}
62 98 */
63 99 private Integer sendStatus;
64   -
65 100 /**
66   - * 是否获取过结果[0否 1是]
  101 + * 发送失败的类型
  102 + *
  103 + * 枚举 {@link SysSmsSendFailureTypeEnum}
67 104 */
68   - private Integer gotResult;
69   -
  105 + private Integer sendFailureType;
70 106 /**
71   - * 备注
  107 + * 发送成功时间
72 108 */
73   - private String remark;
74   -
  109 + private Date sendTime;
75 110 /**
76   - * 创建人
  111 + * 短信 API 发送失败的类型
  112 + *
  113 + * 由于第三方的错误码可能是字符串,所以使用 String 类型
77 114 */
78   - private String createBy;
79   -
  115 + private String apiSendFailureType;
80 116 /**
81   - * 创建时间
  117 + * 短信 API 发送失败的提示
82 118 */
83   - private Date createTime;
  119 + private String apiSendFailureMsg;
  120 + /**
  121 + * 短信 API 发送返回的唯一请求 ID
  122 + *
  123 + * 用于和短信 API 进行定位于排错
  124 + */
  125 + private String apiRequestId;
  126 + /**
  127 + * 短信 API 发送返回的序号
  128 + *
  129 + * 用于和短信 API 平台的发送记录关联
  130 + */
  131 + private String apiSerialNo;
  132 +
  133 + // ========= 接收相关字段 =========
84 134  
85 135 /**
86   - * 发送时间
  136 + * 是否获取过结果[0否 1是]
87 137 */
88   - private Date sendTime;
  138 + private Integer gotResult;
89 139  
90 140 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsSendLogDO.java
1 1 package cn.iocoder.dashboard.modules.system.dal.dataobject.sms;
2 2  
3   -import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum;
  3 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
4 4 import com.baomidou.mybatisplus.annotation.TableName;
5 5 import lombok.Data;
6 6 import lombok.EqualsAndHashCode;
... ... @@ -54,7 +54,7 @@ public class SysSmsSendLogDO implements Serializable {
54 54 /**
55 55 * 发送状态
56 56 *
57   - * @see SmsSendStatusEnum
  57 + * @see SysSmsSendStatusEnum
58 58 */
59 59 private Integer sendStatus;
60 60  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.dataobject.sms;
2 2  
3 3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
  5 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum;
5 6 import com.baomidou.mybatisplus.annotation.TableField;
6 7 import com.baomidou.mybatisplus.annotation.TableName;
7 8 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
... ... @@ -26,62 +27,59 @@ public class SysSmsTemplateDO extends BaseDO {
26 27 */
27 28 private Long id;
28 29  
29   - /**
30   - * 短信渠道编码(来自枚举类)
31   - */
32   - private String channelCode;
  30 + // ========= 模板相关字段 =========
33 31  
34 32 /**
35   - * 短信渠道id (对于前端来说就是绑定一个签名)
36   - */
37   - private Long channelId;
38   -
39   - /**
40   - * 消息类型 [0验证码 1短信通知 2推广短信 3国际/港澳台消息]
  33 + * 短信类型
  34 + *
  35 + * 枚举 {@link SysSmsTemplateTypeEnum}
41 36 */
42 37 private Integer type;
43   -
44 38 /**
45   - * 业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板)
  39 + * 启用状态
  40 + *
  41 + * 枚举 {@link CommonStatusEnum}
46 42 */
47   - private String bizCode;
48   -
  43 + private Integer status;
49 44 /**
50   - * 模板编码
  45 + * 模板编码,保证唯一
51 46 */
52 47 private String code;
53   -
54 48 /**
55 49 * 名称
56 50 */
57 51 private String name;
58   -
59   - /**
60   - * 实际渠道模板唯一标识
61   - */
62   - private String apiTemplateId;
63   -
64 52 /**
65 53 * 内容
66 54 */
67 55 private String content;
68   -
69 56 /**
70 57 * 参数数组(自动根据内容生成)
71 58 */
72 59 @TableField(typeHandler = JacksonTypeHandler.class)
73 60 private List<String> params;
74   -
75 61 /**
76 62 * 备注
77 63 */
78 64 private String remark;
79 65  
  66 + // ========= 渠道相关字段 =========
  67 +
80 68 /**
81   - * 启用状态
  69 + * 短信渠道编号
82 70 *
83   - * 枚举 {@link CommonStatusEnum}
  71 + * 关联 {@link SysSmsChannelDO#getId()}
84 72 */
85   - private Integer status;
  73 + private Long channelId;
  74 + /**
  75 + * 短信渠道编码
  76 + *
  77 + * 冗余 {@link SysSmsChannelDO#getCode()}
  78 + */
  79 + private String channelCode;
  80 + /**
  81 + * 短信 API 的模板编号
  82 + */
  83 + private String apiTemplateId;
86 84  
87 85 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsQueryLogMapper.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.sms;
2 2  
3 3 import cn.iocoder.dashboard.common.enums.DefaultBitFieldEnum;
4 4 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsQueryLogDO;
5   -import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum;
  5 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
6 6 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
7 7 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
8 8 import org.apache.ibatis.annotations.Mapper;
... ... @@ -17,7 +17,7 @@ public interface SysSmsQueryLogMapper extends BaseMapper&lt;SysSmsQueryLogDO&gt; {
17 17 */
18 18 default List<SysSmsQueryLogDO> selectNoResultQueryLogList() {
19 19 return this.selectList(new LambdaQueryWrapper<SysSmsQueryLogDO>()
20   - .eq(SysSmsQueryLogDO::getSendStatus, SmsSendStatusEnum.QUERY_SUCCESS)
  20 + .eq(SysSmsQueryLogDO::getSendStatus, SysSmsSendStatusEnum.QUERY_SUCCESS)
21 21 .eq(SysSmsQueryLogDO::getGotResult, DefaultBitFieldEnum.NO)
22 22 );
23 23 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
... ... @@ -84,6 +84,7 @@ public interface SysErrorCodeConstants {
84 84  
85 85 // ========== 短信发送 1002011000 ==========
86 86 ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002011000, "手机号不存在");
  87 + ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002011001, "模板参数({})缺失");
87 88  
88 89 ErrorCode SMS_CHANNEL_NOT_INIT = new ErrorCode(1003001001,
89 90 "短信渠道没有初始化, 请调用SmsClientWrapper#initSmsClient()或SmsClientWrapper#addSmsClient");
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsSendFailureTypeEnum.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.enums.sms;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * 短信的发送失败类型的枚举
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +@Getter
  12 +@AllArgsConstructor
  13 +public enum SysSmsSendFailureTypeEnum {
  14 +
  15 + ;
  16 +
  17 + private final int type;
  18 +
  19 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SmsSendStatusEnum.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsSendStatusEnum.java
... ... @@ -4,35 +4,19 @@ import lombok.AllArgsConstructor;
4 4 import lombok.Getter;
5 5  
6 6 /**
7   - * 短信发送状态
  7 + * 短信的发送状态枚举
8 8 *
9 9 * @author zzf
10 10 * @date 2021/2/1 13:39
11 11 */
12 12 @Getter
13 13 @AllArgsConstructor
14   -public enum SmsSendStatusEnum {
  14 +public enum SysSmsSendStatusEnum {
15 15  
16   - //请求发送结果时失败
17   - QUERY_SEND_FAIL(-3),
18   -
19   - //短信发送失败
20   - SEND_FAIL(-2),
21   -
22   - //短信请求失败
23   - QUERY_FAIL(-1),
24   -
25   - //异步转发中
26   - ASYNC(0),
27   -
28   - //请求成功
29   - QUERY_SUCCESS(1),
30   -
31   - //短信成功
32   - SEND_SUCCESS(2),
33   -
34   - //等待回执
35   - WAITING(3);
  16 + INIT(0), // 初始化
  17 + SUCCESS(10), // 发送成功
  18 + FAILURE(20), // 发送失败
  19 + ;
36 20  
37 21 private final int status;
38 22  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsTemplateTypeEnum.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.enums.sms;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * 短信的模板类型枚举
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +@Getter
  12 +@AllArgsConstructor
  13 +public enum SysSmsTemplateTypeEnum {
  14 +
  15 + VERIFICATION_CODE(1), // 验证码
  16 + NOTICE(2), // 通知
  17 + PROMOTION(3), // 营销
  18 + ;
  19 +
  20 + /**
  21 + * 类型
  22 + */
  23 + private final int type;
  24 +
  25 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java
... ... @@ -19,6 +19,8 @@ public interface SysSmsService {
19 19 void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType,
20 20 String templateCode, Map<String, Object> templateParams);
21 21  
  22 + void doSendSms();
  23 +
22 24 /**
23 25 * 处理短信发送回调函数
24 26 *
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsQueryLogServiceImpl.java
... ... @@ -7,7 +7,7 @@ import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail;
7 7 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty;
8 8 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsQueryLogMapper;
9 9 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsQueryLogDO;
10   -import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum;
  10 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
11 11 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService;
12 12 import org.springframework.stereotype.Service;
13 13  
... ... @@ -36,7 +36,7 @@ public class SysSmsQueryLogServiceImpl implements SysSmsQueryLogService {
36 36 .setPhone(targetPhone)
37 37 .setContent(smsBody.getParams().toString());
38 38  
39   - smsLog.setSendStatus(SmsSendStatusEnum.ASYNC.getStatus());
  39 + smsLog.setSendStatus(SysSmsSendStatusEnum.ASYNC.getStatus());
40 40 logMapper.insert(smsLog);
41 41 smsBody.setSmsLogId(smsLog.getId());
42 42 }
... ... @@ -46,7 +46,7 @@ public class SysSmsQueryLogServiceImpl implements SysSmsQueryLogService {
46 46 SysSmsQueryLogDO smsLog = new SysSmsQueryLogDO();
47 47 smsLog.setId(logId);
48 48 smsLog.setApiId(result.getApiId());
49   - smsLog.setSendStatus(SmsSendStatusEnum.QUERY_FAIL.getStatus());
  49 + smsLog.setSendStatus(SysSmsSendStatusEnum.QUERY_FAIL.getStatus());
50 50 smsLog.setRemark(result.getCode() + ": " + result.getMessage());
51 51 logMapper.updateById(smsLog);
52 52 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsSendLogServiceImpl.java
... ... @@ -6,7 +6,7 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsQueryLogDO;
6 6 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsSendLogDO;
7 7 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsQueryLogMapper;
8 8 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsSendLogMapper;
9   -import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum;
  9 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
10 10 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
11 11 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsSendLogService;
12 12 import lombok.extern.slf4j.Slf4j;
... ... @@ -88,7 +88,7 @@ public class SysSmsSendLogServiceImpl implements SysSmsSendLogService {
88 88 updateQueryLog.setSendStatus(SmsSendStatusEnum.QUERY_SEND_FAIL.getStatus());
89 89 smsQueryLogMapper.updateById(updateQueryLog);
90 90 }*/
91   - updateQueryLog.setSendStatus(SmsSendStatusEnum.SEND_SUCCESS.getStatus());
  91 + updateQueryLog.setSendStatus(SysSmsSendStatusEnum.SEND_SUCCESS.getStatus());
92 92 updateQueryLog.setRemark(String.format("日志(id = %s)对应的客户端没有继承NeedQuerySendResultSmsClient, 不能获取短信结果。", queryLog.getId()));
93 93 smsQueryLogMapper.updateById(updateQueryLog);
94 94 });
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java
1 1 package cn.iocoder.dashboard.modules.system.service.sms.impl;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.map.MapUtil;
3 5 import cn.hutool.core.util.StrUtil;
4 6 import cn.iocoder.dashboard.common.enums.UserTypeEnum;
5 7 import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient;
... ... @@ -21,6 +23,8 @@ import javax.servlet.ServletRequest;
21 23 import java.util.List;
22 24 import java.util.Map;
23 25 import java.util.Objects;
  26 +import java.util.function.Consumer;
  27 +import java.util.function.Predicate;
24 28  
25 29 import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception;
26 30 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
... ... @@ -55,24 +59,40 @@ public class SysSmsServiceImpl implements SysSmsService {
55 59 @Override
56 60 public void sendSingleSms(String mobile, Long userId, Integer userType,
57 61 String templateCode, Map<String, Object> templateParams) {
58   - // 校验短信模板是否存在
59   - SysSmsTemplateDO template = this.checkSmsTemplateExists(templateCode);
  62 + // 校验短信模板是否合法
  63 + SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode, templateParams);
60 64 // 校验手机号码是否存在
61 65 mobile = this.checkMobile(mobile, userId, userType);
  66 + //
62 67 }
63 68  
64 69 @Override
65 70 public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType,
66 71 String templateCode, Map<String, Object> templateParams) {
67 72 // 校验短信模板是否存在
68   - SysSmsTemplateDO template = this.checkSmsTemplateExists(templateCode);
  73 + SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode, templateParams);
69 74 }
70 75  
71   - private SysSmsTemplateDO checkSmsTemplateExists(String templateCode) {
  76 + private SysSmsTemplateDO checkSmsTemplateValid(String templateCode, Map<String, Object> templateParams) {
  77 + // 短信模板不存在
72 78 SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCode(templateCode);
73 79 if (template == null) {
74 80 throw exception(SMS_TEMPLATE_NOT_EXISTS);
75 81 }
  82 + // 参数不够
  83 + if (CollUtil.isNotEmpty(template.getParams())) {
  84 + template.getParams().forEach(param -> {
  85 + if (!templateParams.containsKey(param)) {
  86 + throw exception(SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS);
  87 + }
  88 + });
  89 + }
  90 + // 移除多余参数
  91 + if (CollUtil.isEmpty(template.getParams())) {
  92 + templateParams.clear();
  93 + } else {
  94 + templateParams.entrySet().removeIf(entry -> !template.getParams().contains(entry.getKey()));
  95 + }
76 96 return template;
77 97 }
78 98  
... ...