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 +7,7 @@ import cn.iocoder.dashboard.framework.sms.core.SmsBody;
7 import cn.iocoder.dashboard.framework.sms.core.SmsResult; 7 import cn.iocoder.dashboard.framework.sms.core.SmsResult;
8 import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; 8 import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail;
9 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; 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 import cn.iocoder.dashboard.util.json.JsonUtils; 11 import cn.iocoder.dashboard.util.json.JsonUtils;
12 import com.aliyuncs.DefaultAcsClient; 12 import com.aliyuncs.DefaultAcsClient;
13 import com.aliyuncs.IAcsClient; 13 import com.aliyuncs.IAcsClient;
@@ -131,8 +131,8 @@ public class AliyunSmsClient extends AbstractSmsClient { @@ -131,8 +131,8 @@ public class AliyunSmsClient extends AbstractSmsClient {
131 131
132 public Integer getSendStatus() { 132 public Integer getSendStatus() {
133 return ((Boolean) sendResultParamMap.get(CallbackField.SUCCESS)) 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 public String getBizId() { 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,7 +9,7 @@ import cn.iocoder.dashboard.framework.sms.core.SmsConstants;
9 import cn.iocoder.dashboard.framework.sms.core.SmsResult; 9 import cn.iocoder.dashboard.framework.sms.core.SmsResult;
10 import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; 10 import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail;
11 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; 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 import cn.iocoder.dashboard.util.json.JsonUtils; 13 import cn.iocoder.dashboard.util.json.JsonUtils;
14 import com.fasterxml.jackson.core.type.TypeReference; 14 import com.fasterxml.jackson.core.type.TypeReference;
15 import com.yunpian.sdk.YunpianClient; 15 import com.yunpian.sdk.YunpianClient;
@@ -155,8 +155,8 @@ public class YunpianSmsClient extends AbstractSmsClient { @@ -155,8 +155,8 @@ public class YunpianSmsClient extends AbstractSmsClient {
155 private static int getSendStatus(Map<String, String> map) { 155 private static int getSendStatus(Map<String, String> map) {
156 String reportStatus = map.get(REPORT_STATUS); 156 String reportStatus = map.get(REPORT_STATUS);
157 return SmsConstants.SUCCESS.equals(reportStatus) 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 public static SmsResultDetail getSmsResultDetailByParam(Map<String, String> map) { 162 public static SmsResultDetail getSmsResultDetailByParam(Map<String, String> map) {
src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResultDetail.java
1 package cn.iocoder.dashboard.framework.sms.core; 1 package cn.iocoder.dashboard.framework.sms.core;
2 2
  3 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
3 import lombok.Data; 4 import lombok.Data;
4 5
5 import java.io.Serializable; 6 import java.io.Serializable;
@@ -17,7 +18,7 @@ public class SmsResultDetail implements Serializable { @@ -17,7 +18,7 @@ public class SmsResultDetail implements Serializable {
17 private String apiId; 18 private String apiId;
18 19
19 /** 20 /**
20 - * 短信发送状态 {@link cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum} 21 + * 短信发送状态 {@link SysSmsSendStatusEnum}
21 */ 22 */
22 private Integer sendStatus; 23 private Integer sendStatus;
23 24
src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsQueryLogDO.java
1 package cn.iocoder.dashboard.modules.system.dal.dataobject.sms; 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 import com.baomidou.mybatisplus.annotation.TableName; 8 import com.baomidou.mybatisplus.annotation.TableName;
4 import lombok.Data; 9 import lombok.Data;
5 import lombok.EqualsAndHashCode; 10 import lombok.EqualsAndHashCode;
6 import lombok.experimental.Accessors; 11 import lombok.experimental.Accessors;
7 12
8 -import java.io.Serializable;  
9 import java.util.Date; 13 import java.util.Date;
  14 +import java.util.Map;
10 15
11 /** 16 /**
12 - * 短信日志 17 + * 短信发送日志
13 * 18 *
14 * @author zzf 19 * @author zzf
15 * @since 2021-01-25 20 * @since 2021-01-25
@@ -18,73 +23,118 @@ import java.util.Date; @@ -18,73 +23,118 @@ import java.util.Date;
18 @EqualsAndHashCode 23 @EqualsAndHashCode
19 @Accessors(chain = true) 24 @Accessors(chain = true)
20 @TableName(value = "sms_query_log", autoResultMap = true) 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 private Long id; 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 private String channelCode; 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 private String templateCode; 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 private Integer sendStatus; 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 package cn.iocoder.dashboard.modules.system.dal.dataobject.sms; 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 import com.baomidou.mybatisplus.annotation.TableName; 4 import com.baomidou.mybatisplus.annotation.TableName;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.EqualsAndHashCode; 6 import lombok.EqualsAndHashCode;
@@ -54,7 +54,7 @@ public class SysSmsSendLogDO implements Serializable { @@ -54,7 +54,7 @@ public class SysSmsSendLogDO implements Serializable {
54 /** 54 /**
55 * 发送状态 55 * 发送状态
56 * 56 *
57 - * @see SmsSendStatusEnum 57 + * @see SysSmsSendStatusEnum
58 */ 58 */
59 private Integer sendStatus; 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,6 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.dataobject.sms;
2 2
3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
  5 +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum;
5 import com.baomidou.mybatisplus.annotation.TableField; 6 import com.baomidou.mybatisplus.annotation.TableField;
6 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
7 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; 8 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
@@ -26,62 +27,59 @@ public class SysSmsTemplateDO extends BaseDO { @@ -26,62 +27,59 @@ public class SysSmsTemplateDO extends BaseDO {
26 */ 27 */
27 private Long id; 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 private Integer type; 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 private String code; 47 private String code;
53 -  
54 /** 48 /**
55 * 名称 49 * 名称
56 */ 50 */
57 private String name; 51 private String name;
58 -  
59 - /**  
60 - * 实际渠道模板唯一标识  
61 - */  
62 - private String apiTemplateId;  
63 -  
64 /** 52 /**
65 * 内容 53 * 内容
66 */ 54 */
67 private String content; 55 private String content;
68 -  
69 /** 56 /**
70 * 参数数组(自动根据内容生成) 57 * 参数数组(自动根据内容生成)
71 */ 58 */
72 @TableField(typeHandler = JacksonTypeHandler.class) 59 @TableField(typeHandler = JacksonTypeHandler.class)
73 private List<String> params; 60 private List<String> params;
74 -  
75 /** 61 /**
76 * 备注 62 * 备注
77 */ 63 */
78 private String remark; 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,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.sms;
2 2
3 import cn.iocoder.dashboard.common.enums.DefaultBitFieldEnum; 3 import cn.iocoder.dashboard.common.enums.DefaultBitFieldEnum;
4 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsQueryLogDO; 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 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 6 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
7 import com.baomidou.mybatisplus.core.mapper.BaseMapper; 7 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
@@ -17,7 +17,7 @@ public interface SysSmsQueryLogMapper extends BaseMapper&lt;SysSmsQueryLogDO&gt; { @@ -17,7 +17,7 @@ public interface SysSmsQueryLogMapper extends BaseMapper&lt;SysSmsQueryLogDO&gt; {
17 */ 17 */
18 default List<SysSmsQueryLogDO> selectNoResultQueryLogList() { 18 default List<SysSmsQueryLogDO> selectNoResultQueryLogList() {
19 return this.selectList(new LambdaQueryWrapper<SysSmsQueryLogDO>() 19 return this.selectList(new LambdaQueryWrapper<SysSmsQueryLogDO>()
20 - .eq(SysSmsQueryLogDO::getSendStatus, SmsSendStatusEnum.QUERY_SUCCESS) 20 + .eq(SysSmsQueryLogDO::getSendStatus, SysSmsSendStatusEnum.QUERY_SUCCESS)
21 .eq(SysSmsQueryLogDO::getGotResult, DefaultBitFieldEnum.NO) 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,6 +84,7 @@ public interface SysErrorCodeConstants {
84 84
85 // ========== 短信发送 1002011000 ========== 85 // ========== 短信发送 1002011000 ==========
86 ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002011000, "手机号不存在"); 86 ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002011000, "手机号不存在");
  87 + ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002011001, "模板参数({})缺失");
87 88
88 ErrorCode SMS_CHANNEL_NOT_INIT = new ErrorCode(1003001001, 89 ErrorCode SMS_CHANNEL_NOT_INIT = new ErrorCode(1003001001,
89 "短信渠道没有初始化, 请调用SmsClientWrapper#initSmsClient()或SmsClientWrapper#addSmsClient"); 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,35 +4,19 @@ import lombok.AllArgsConstructor;
4 import lombok.Getter; 4 import lombok.Getter;
5 5
6 /** 6 /**
7 - * 短信发送状态 7 + * 短信的发送状态枚举
8 * 8 *
9 * @author zzf 9 * @author zzf
10 * @date 2021/2/1 13:39 10 * @date 2021/2/1 13:39
11 */ 11 */
12 @Getter 12 @Getter
13 @AllArgsConstructor 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 private final int status; 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,6 +19,8 @@ public interface SysSmsService {
19 void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, 19 void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType,
20 String templateCode, Map<String, Object> templateParams); 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 +7,7 @@ import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail;
7 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; 7 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty;
8 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsQueryLogMapper; 8 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsQueryLogMapper;
9 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsQueryLogDO; 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 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService; 11 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService;
12 import org.springframework.stereotype.Service; 12 import org.springframework.stereotype.Service;
13 13
@@ -36,7 +36,7 @@ public class SysSmsQueryLogServiceImpl implements SysSmsQueryLogService { @@ -36,7 +36,7 @@ public class SysSmsQueryLogServiceImpl implements SysSmsQueryLogService {
36 .setPhone(targetPhone) 36 .setPhone(targetPhone)
37 .setContent(smsBody.getParams().toString()); 37 .setContent(smsBody.getParams().toString());
38 38
39 - smsLog.setSendStatus(SmsSendStatusEnum.ASYNC.getStatus()); 39 + smsLog.setSendStatus(SysSmsSendStatusEnum.ASYNC.getStatus());
40 logMapper.insert(smsLog); 40 logMapper.insert(smsLog);
41 smsBody.setSmsLogId(smsLog.getId()); 41 smsBody.setSmsLogId(smsLog.getId());
42 } 42 }
@@ -46,7 +46,7 @@ public class SysSmsQueryLogServiceImpl implements SysSmsQueryLogService { @@ -46,7 +46,7 @@ public class SysSmsQueryLogServiceImpl implements SysSmsQueryLogService {
46 SysSmsQueryLogDO smsLog = new SysSmsQueryLogDO(); 46 SysSmsQueryLogDO smsLog = new SysSmsQueryLogDO();
47 smsLog.setId(logId); 47 smsLog.setId(logId);
48 smsLog.setApiId(result.getApiId()); 48 smsLog.setApiId(result.getApiId());
49 - smsLog.setSendStatus(SmsSendStatusEnum.QUERY_FAIL.getStatus()); 49 + smsLog.setSendStatus(SysSmsSendStatusEnum.QUERY_FAIL.getStatus());
50 smsLog.setRemark(result.getCode() + ": " + result.getMessage()); 50 smsLog.setRemark(result.getCode() + ": " + result.getMessage());
51 logMapper.updateById(smsLog); 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,7 +6,7 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsQueryLogDO;
6 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsSendLogDO; 6 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsSendLogDO;
7 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsQueryLogMapper; 7 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsQueryLogMapper;
8 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsSendLogMapper; 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 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; 10 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
11 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsSendLogService; 11 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsSendLogService;
12 import lombok.extern.slf4j.Slf4j; 12 import lombok.extern.slf4j.Slf4j;
@@ -88,7 +88,7 @@ public class SysSmsSendLogServiceImpl implements SysSmsSendLogService { @@ -88,7 +88,7 @@ public class SysSmsSendLogServiceImpl implements SysSmsSendLogService {
88 updateQueryLog.setSendStatus(SmsSendStatusEnum.QUERY_SEND_FAIL.getStatus()); 88 updateQueryLog.setSendStatus(SmsSendStatusEnum.QUERY_SEND_FAIL.getStatus());
89 smsQueryLogMapper.updateById(updateQueryLog); 89 smsQueryLogMapper.updateById(updateQueryLog);
90 }*/ 90 }*/
91 - updateQueryLog.setSendStatus(SmsSendStatusEnum.SEND_SUCCESS.getStatus()); 91 + updateQueryLog.setSendStatus(SysSmsSendStatusEnum.SEND_SUCCESS.getStatus());
92 updateQueryLog.setRemark(String.format("日志(id = %s)对应的客户端没有继承NeedQuerySendResultSmsClient, 不能获取短信结果。", queryLog.getId())); 92 updateQueryLog.setRemark(String.format("日志(id = %s)对应的客户端没有继承NeedQuerySendResultSmsClient, 不能获取短信结果。", queryLog.getId()));
93 smsQueryLogMapper.updateById(updateQueryLog); 93 smsQueryLogMapper.updateById(updateQueryLog);
94 }); 94 });
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java
1 package cn.iocoder.dashboard.modules.system.service.sms.impl; 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 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
4 import cn.iocoder.dashboard.common.enums.UserTypeEnum; 6 import cn.iocoder.dashboard.common.enums.UserTypeEnum;
5 import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; 7 import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient;
@@ -21,6 +23,8 @@ import javax.servlet.ServletRequest; @@ -21,6 +23,8 @@ import javax.servlet.ServletRequest;
21 import java.util.List; 23 import java.util.List;
22 import java.util.Map; 24 import java.util.Map;
23 import java.util.Objects; 25 import java.util.Objects;
  26 +import java.util.function.Consumer;
  27 +import java.util.function.Predicate;
24 28
25 import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; 29 import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception;
26 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; 30 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
@@ -55,24 +59,40 @@ public class SysSmsServiceImpl implements SysSmsService { @@ -55,24 +59,40 @@ public class SysSmsServiceImpl implements SysSmsService {
55 @Override 59 @Override
56 public void sendSingleSms(String mobile, Long userId, Integer userType, 60 public void sendSingleSms(String mobile, Long userId, Integer userType,
57 String templateCode, Map<String, Object> templateParams) { 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 mobile = this.checkMobile(mobile, userId, userType); 65 mobile = this.checkMobile(mobile, userId, userType);
  66 + //
62 } 67 }
63 68
64 @Override 69 @Override
65 public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, 70 public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType,
66 String templateCode, Map<String, Object> templateParams) { 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 SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCode(templateCode); 78 SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCode(templateCode);
73 if (template == null) { 79 if (template == null) {
74 throw exception(SMS_TEMPLATE_NOT_EXISTS); 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 return template; 96 return template;
77 } 97 }
78 98