Commit df01bd6c79cba042f24fe4c70df1fab807a1665d
1 parent
3acdec96
短信提交 2021-03-25,调整下短信发送 API
Showing
15 changed files
with
199 additions
and
99 deletions
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<SysSmsQueryLogDO> { |
| 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
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 | ... | ... |