mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-11-01 03:28:41 +08:00 
			
		
		
		
	短信提交 2021-03-25,调整下短信发送 API
This commit is contained in:
		| @ -7,7 +7,7 @@ import cn.iocoder.dashboard.framework.sms.core.SmsBody; | |||||||
| import cn.iocoder.dashboard.framework.sms.core.SmsResult; | import cn.iocoder.dashboard.framework.sms.core.SmsResult; | ||||||
| import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; | import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; | ||||||
| import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; | import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; | ||||||
| import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; | ||||||
| import cn.iocoder.dashboard.util.json.JsonUtils; | import cn.iocoder.dashboard.util.json.JsonUtils; | ||||||
| import com.aliyuncs.DefaultAcsClient; | import com.aliyuncs.DefaultAcsClient; | ||||||
| import com.aliyuncs.IAcsClient; | import com.aliyuncs.IAcsClient; | ||||||
| @ -131,8 +131,8 @@ public class AliyunSmsClient extends AbstractSmsClient { | |||||||
|  |  | ||||||
|         public Integer getSendStatus() { |         public Integer getSendStatus() { | ||||||
|             return ((Boolean) sendResultParamMap.get(CallbackField.SUCCESS)) |             return ((Boolean) sendResultParamMap.get(CallbackField.SUCCESS)) | ||||||
|                     ? SmsSendStatusEnum.SEND_SUCCESS.getStatus() |                     ? SysSmsSendStatusEnum.SEND_SUCCESS.getStatus() | ||||||
|                     : SmsSendStatusEnum.SEND_FAIL.getStatus(); |                     : SysSmsSendStatusEnum.SEND_FAIL.getStatus(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public String getBizId() { |         public String getBizId() { | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ import cn.iocoder.dashboard.framework.sms.core.SmsConstants; | |||||||
| import cn.iocoder.dashboard.framework.sms.core.SmsResult; | import cn.iocoder.dashboard.framework.sms.core.SmsResult; | ||||||
| import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; | import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; | ||||||
| import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; | import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; | ||||||
| import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; | ||||||
| import cn.iocoder.dashboard.util.json.JsonUtils; | import cn.iocoder.dashboard.util.json.JsonUtils; | ||||||
| import com.fasterxml.jackson.core.type.TypeReference; | import com.fasterxml.jackson.core.type.TypeReference; | ||||||
| import com.yunpian.sdk.YunpianClient; | import com.yunpian.sdk.YunpianClient; | ||||||
| @ -155,8 +155,8 @@ public class YunpianSmsClient extends AbstractSmsClient { | |||||||
|         private static int getSendStatus(Map<String, String> map) { |         private static int getSendStatus(Map<String, String> map) { | ||||||
|             String reportStatus = map.get(REPORT_STATUS); |             String reportStatus = map.get(REPORT_STATUS); | ||||||
|             return SmsConstants.SUCCESS.equals(reportStatus) |             return SmsConstants.SUCCESS.equals(reportStatus) | ||||||
|                     ? SmsSendStatusEnum.SEND_SUCCESS.getStatus() |                     ? SysSmsSendStatusEnum.SEND_SUCCESS.getStatus() | ||||||
|                     : SmsSendStatusEnum.SEND_FAIL.getStatus(); |                     : SysSmsSendStatusEnum.SEND_FAIL.getStatus(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public static SmsResultDetail getSmsResultDetailByParam(Map<String, String> map) { |         public static SmsResultDetail getSmsResultDetailByParam(Map<String, String> map) { | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| package cn.iocoder.dashboard.framework.sms.core; | package cn.iocoder.dashboard.framework.sms.core; | ||||||
|  |  | ||||||
|  | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  |  | ||||||
| import java.io.Serializable; | import java.io.Serializable; | ||||||
| @ -17,7 +18,7 @@ public class SmsResultDetail implements Serializable { | |||||||
|     private String apiId; |     private String apiId; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 短信发送状态 {@link cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum} |      * 短信发送状态 {@link SysSmsSendStatusEnum} | ||||||
|      */ |      */ | ||||||
|     private Integer sendStatus; |     private Integer sendStatus; | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,15 +1,20 @@ | |||||||
| package cn.iocoder.dashboard.modules.system.dal.dataobject.sms; | package cn.iocoder.dashboard.modules.system.dal.dataobject.sms; | ||||||
|  |  | ||||||
|  | import cn.iocoder.dashboard.common.enums.UserTypeEnum; | ||||||
|  | import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; | ||||||
|  | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendFailureTypeEnum; | ||||||
|  | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; | ||||||
|  | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum; | ||||||
| import com.baomidou.mybatisplus.annotation.TableName; | import com.baomidou.mybatisplus.annotation.TableName; | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
| import lombok.EqualsAndHashCode; | import lombok.EqualsAndHashCode; | ||||||
| import lombok.experimental.Accessors; | import lombok.experimental.Accessors; | ||||||
|  |  | ||||||
| import java.io.Serializable; |  | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
|  | import java.util.Map; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 短信日志 |  * 短信发送日志 | ||||||
|  * |  * | ||||||
|  * @author zzf |  * @author zzf | ||||||
|  * @since 2021-01-25 |  * @since 2021-01-25 | ||||||
| @ -18,73 +23,118 @@ import java.util.Date; | |||||||
| @EqualsAndHashCode | @EqualsAndHashCode | ||||||
| @Accessors(chain = true) | @Accessors(chain = true) | ||||||
| @TableName(value = "sms_query_log", autoResultMap = true) | @TableName(value = "sms_query_log", autoResultMap = true) | ||||||
| public class SysSmsQueryLogDO implements Serializable { | public class SysSmsQueryLogDO extends BaseDO { | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 自增编号 |      * 自增编号 | ||||||
|      */ |      */ | ||||||
|     private Long id; |     private Long id; | ||||||
|  |  | ||||||
|     /** |     // ========= 渠道相关字段 ========= | ||||||
|      * 第三方唯一标识 |  | ||||||
|      */ |  | ||||||
|     private String apiId; |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 短信渠道编码(来自枚举类) |      * 短信渠道编号 | ||||||
|      */ |      * | ||||||
|     private String channelCode; |      * 关联 {@link SysSmsChannelDO#getId()} | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 短信渠道id |  | ||||||
|      */ |      */ | ||||||
|     private Long channelId; |     private Long channelId; | ||||||
|  |     /** | ||||||
|  |      * 短信渠道编码 | ||||||
|  |      * | ||||||
|  |      * 冗余 {@link SysSmsChannelDO#getCode()} | ||||||
|  |      */ | ||||||
|  |     private String channelCode; | ||||||
|  |     /** | ||||||
|  |      * 实际渠道模板唯一标识 | ||||||
|  |      */ | ||||||
|  |     private String apiTemplateId; | ||||||
|  |  | ||||||
|  |     // ========= 模板相关字段 ========= | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 模板id |      * 短信模板编号 | ||||||
|  |      * | ||||||
|  |      * 关联 {@link} | ||||||
|      */ |      */ | ||||||
|     private String templateCode; |     private String templateCode; | ||||||
|  |     /** | ||||||
|  |      * 短信类型 | ||||||
|  |      * | ||||||
|  |      * 枚举 {@link SysSmsTemplateTypeEnum} | ||||||
|  |      */ | ||||||
|  |     private Integer templateType; | ||||||
|  |     /** | ||||||
|  |      * 基于 {@link SysSmsTemplateDO#getContent()} 格式化后的内容 | ||||||
|  |      */ | ||||||
|  |     private String templateContent; | ||||||
|  |     /** | ||||||
|  |      * 基于 {@link SysSmsTemplateDO#getParams()} 输入后的内容 | ||||||
|  |      */ | ||||||
|  |     private Map<String, Object> templateParams; | ||||||
|  |  | ||||||
|  |     // ========= 手机相关字段 ========= | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 手机号 |      * 手机号 | ||||||
|      */ |      */ | ||||||
|     private String phone; |     private String mobile; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 内容 |      * 用户编号 | ||||||
|      */ |      */ | ||||||
|     private String content; |     private Integer userId; | ||||||
|  |     /** | ||||||
|  |      * 用户类型 | ||||||
|  |      * | ||||||
|  |      * 枚举 {@link UserTypeEnum} | ||||||
|  |      */ | ||||||
|  |     private Integer userType; | ||||||
|  |  | ||||||
|  |     // ========= 发送相关字段 ========= | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 发送状态 |      * 发送状态 | ||||||
|      * |      * | ||||||
|      * @see cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum |      * 枚举 {@link SysSmsSendStatusEnum} | ||||||
|      */ |      */ | ||||||
|     private Integer sendStatus; |     private Integer sendStatus; | ||||||
|  |     /** | ||||||
|  |      * 发送失败的类型 | ||||||
|  |      * | ||||||
|  |      * 枚举 {@link SysSmsSendFailureTypeEnum} | ||||||
|  |      */ | ||||||
|  |     private Integer sendFailureType; | ||||||
|  |     /** | ||||||
|  |      * 发送成功时间 | ||||||
|  |      */ | ||||||
|  |     private Date sendTime; | ||||||
|  |     /** | ||||||
|  |      * 短信 API 发送失败的类型 | ||||||
|  |      * | ||||||
|  |      * 由于第三方的错误码可能是字符串,所以使用 String 类型 | ||||||
|  |      */ | ||||||
|  |     private String apiSendFailureType; | ||||||
|  |     /** | ||||||
|  |      * 短信 API 发送失败的提示 | ||||||
|  |      */ | ||||||
|  |     private String apiSendFailureMsg; | ||||||
|  |     /** | ||||||
|  |      * 短信 API 发送返回的唯一请求 ID | ||||||
|  |      * | ||||||
|  |      * 用于和短信 API 进行定位于排错 | ||||||
|  |      */ | ||||||
|  |     private String apiRequestId; | ||||||
|  |     /** | ||||||
|  |      * 短信 API 发送返回的序号 | ||||||
|  |      * | ||||||
|  |      * 用于和短信 API 平台的发送记录关联 | ||||||
|  |      */ | ||||||
|  |     private String apiSerialNo; | ||||||
|  |  | ||||||
|  |     // ========= 接收相关字段 ========= | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 是否获取过结果[0否 1是] |      * 是否获取过结果[0否 1是] | ||||||
|      */ |      */ | ||||||
|     private Integer gotResult; |     private Integer gotResult; | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 备注 |  | ||||||
|      */ |  | ||||||
|     private String remark; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 创建人 |  | ||||||
|      */ |  | ||||||
|     private String createBy; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 创建时间 |  | ||||||
|      */ |  | ||||||
|     private Date createTime; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 发送时间 |  | ||||||
|      */ |  | ||||||
|     private Date sendTime; |  | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package cn.iocoder.dashboard.modules.system.dal.dataobject.sms; | package cn.iocoder.dashboard.modules.system.dal.dataobject.sms; | ||||||
|  |  | ||||||
| import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; | ||||||
| import com.baomidou.mybatisplus.annotation.TableName; | import com.baomidou.mybatisplus.annotation.TableName; | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
| import lombok.EqualsAndHashCode; | import lombok.EqualsAndHashCode; | ||||||
| @ -54,7 +54,7 @@ public class SysSmsSendLogDO implements Serializable { | |||||||
|     /** |     /** | ||||||
|      * 发送状态 |      * 发送状态 | ||||||
|      * |      * | ||||||
|      * @see SmsSendStatusEnum |      * @see SysSmsSendStatusEnum | ||||||
|      */ |      */ | ||||||
|     private Integer sendStatus; |     private Integer sendStatus; | ||||||
|  |  | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.dataobject.sms; | |||||||
|  |  | ||||||
| import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | ||||||
| import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; | import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; | ||||||
|  | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum; | ||||||
| import com.baomidou.mybatisplus.annotation.TableField; | import com.baomidou.mybatisplus.annotation.TableField; | ||||||
| import com.baomidou.mybatisplus.annotation.TableName; | import com.baomidou.mybatisplus.annotation.TableName; | ||||||
| import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | ||||||
| @ -26,62 +27,59 @@ public class SysSmsTemplateDO extends BaseDO { | |||||||
|      */ |      */ | ||||||
|     private Long id; |     private Long id; | ||||||
|  |  | ||||||
|     /** |     // ========= 模板相关字段 ========= | ||||||
|      * 短信渠道编码(来自枚举类) |  | ||||||
|      */ |  | ||||||
|     private String channelCode; |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 短信渠道id (对于前端来说就是绑定一个签名) |      * 短信类型 | ||||||
|      */ |      * | ||||||
|     private Long channelId; |      * 枚举 {@link SysSmsTemplateTypeEnum} | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 消息类型 [0验证码 1短信通知 2推广短信 3国际/港澳台消息] |  | ||||||
|      */ |      */ | ||||||
|     private Integer type; |     private Integer type; | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板) |  | ||||||
|      */ |  | ||||||
|     private String bizCode; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 模板编码 |  | ||||||
|      */ |  | ||||||
|     private String code; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 名称 |  | ||||||
|      */ |  | ||||||
|     private String name; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 实际渠道模板唯一标识 |  | ||||||
|      */ |  | ||||||
|     private String apiTemplateId; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 内容 |  | ||||||
|      */ |  | ||||||
|     private String content; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 参数数组(自动根据内容生成) |  | ||||||
|      */ |  | ||||||
|     @TableField(typeHandler = JacksonTypeHandler.class) |  | ||||||
|     private List<String> params; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 备注 |  | ||||||
|      */ |  | ||||||
|     private String remark; |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 启用状态 |      * 启用状态 | ||||||
|      * |      * | ||||||
|      * 枚举 {@link CommonStatusEnum} |      * 枚举 {@link CommonStatusEnum} | ||||||
|      */ |      */ | ||||||
|     private Integer status; |     private Integer status; | ||||||
|  |     /** | ||||||
|  |      * 模板编码,保证唯一 | ||||||
|  |      */ | ||||||
|  |     private String code; | ||||||
|  |     /** | ||||||
|  |      * 名称 | ||||||
|  |      */ | ||||||
|  |     private String name; | ||||||
|  |     /** | ||||||
|  |      * 内容 | ||||||
|  |      */ | ||||||
|  |     private String content; | ||||||
|  |     /** | ||||||
|  |      * 参数数组(自动根据内容生成) | ||||||
|  |      */ | ||||||
|  |     @TableField(typeHandler = JacksonTypeHandler.class) | ||||||
|  |     private List<String> params; | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     // ========= 渠道相关字段 ========= | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 短信渠道编号 | ||||||
|  |      * | ||||||
|  |      * 关联 {@link SysSmsChannelDO#getId()} | ||||||
|  |      */ | ||||||
|  |     private Long channelId; | ||||||
|  |     /** | ||||||
|  |      * 短信渠道编码 | ||||||
|  |      * | ||||||
|  |      * 冗余 {@link SysSmsChannelDO#getCode()} | ||||||
|  |      */ | ||||||
|  |     private String channelCode; | ||||||
|  |     /** | ||||||
|  |      * 短信 API 的模板编号 | ||||||
|  |      */ | ||||||
|  |     private String apiTemplateId; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.sms; | |||||||
|  |  | ||||||
| import cn.iocoder.dashboard.common.enums.DefaultBitFieldEnum; | import cn.iocoder.dashboard.common.enums.DefaultBitFieldEnum; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsQueryLogDO; | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsQueryLogDO; | ||||||
| import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; | ||||||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||||
| import com.baomidou.mybatisplus.core.mapper.BaseMapper; | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | ||||||
| import org.apache.ibatis.annotations.Mapper; | import org.apache.ibatis.annotations.Mapper; | ||||||
| @ -17,7 +17,7 @@ public interface SysSmsQueryLogMapper extends BaseMapper<SysSmsQueryLogDO> { | |||||||
|      */ |      */ | ||||||
|     default List<SysSmsQueryLogDO> selectNoResultQueryLogList() { |     default List<SysSmsQueryLogDO> selectNoResultQueryLogList() { | ||||||
|         return this.selectList(new LambdaQueryWrapper<SysSmsQueryLogDO>() |         return this.selectList(new LambdaQueryWrapper<SysSmsQueryLogDO>() | ||||||
|                 .eq(SysSmsQueryLogDO::getSendStatus, SmsSendStatusEnum.QUERY_SUCCESS) |                 .eq(SysSmsQueryLogDO::getSendStatus, SysSmsSendStatusEnum.QUERY_SUCCESS) | ||||||
|                 .eq(SysSmsQueryLogDO::getGotResult, DefaultBitFieldEnum.NO) |                 .eq(SysSmsQueryLogDO::getGotResult, DefaultBitFieldEnum.NO) | ||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -84,6 +84,7 @@ public interface SysErrorCodeConstants { | |||||||
|  |  | ||||||
|     // ========== 短信发送 1002011000 ========== |     // ========== 短信发送 1002011000 ========== | ||||||
|     ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002011000, "手机号不存在"); |     ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002011000, "手机号不存在"); | ||||||
|  |     ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002011001, "模板参数({})缺失"); | ||||||
|  |  | ||||||
|     ErrorCode SMS_CHANNEL_NOT_INIT = new ErrorCode(1003001001, |     ErrorCode SMS_CHANNEL_NOT_INIT = new ErrorCode(1003001001, | ||||||
|             "短信渠道没有初始化, 请调用SmsClientWrapper#initSmsClient()或SmsClientWrapper#addSmsClient"); |             "短信渠道没有初始化, 请调用SmsClientWrapper#initSmsClient()或SmsClientWrapper#addSmsClient"); | ||||||
|  | |||||||
| @ -1,39 +0,0 @@ | |||||||
| package cn.iocoder.dashboard.modules.system.enums.sms; |  | ||||||
|  |  | ||||||
| import lombok.AllArgsConstructor; |  | ||||||
| import lombok.Getter; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * 短信发送状态 |  | ||||||
|  * |  | ||||||
|  * @author zzf |  | ||||||
|  * @date 2021/2/1 13:39 |  | ||||||
|  */ |  | ||||||
| @Getter |  | ||||||
| @AllArgsConstructor |  | ||||||
| public enum SmsSendStatusEnum { |  | ||||||
|  |  | ||||||
|     //请求发送结果时失败 |  | ||||||
|     QUERY_SEND_FAIL(-3), |  | ||||||
|  |  | ||||||
|     //短信发送失败 |  | ||||||
|     SEND_FAIL(-2), |  | ||||||
|  |  | ||||||
|     //短信请求失败 |  | ||||||
|     QUERY_FAIL(-1), |  | ||||||
|  |  | ||||||
|     //异步转发中 |  | ||||||
|     ASYNC(0), |  | ||||||
|  |  | ||||||
|     //请求成功 |  | ||||||
|     QUERY_SUCCESS(1), |  | ||||||
|  |  | ||||||
|     //短信成功 |  | ||||||
|     SEND_SUCCESS(2), |  | ||||||
|  |  | ||||||
|     //等待回执 |  | ||||||
|     WAITING(3); |  | ||||||
|  |  | ||||||
|     private final int status; |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @ -0,0 +1,19 @@ | |||||||
|  | package cn.iocoder.dashboard.modules.system.enums.sms; | ||||||
|  |  | ||||||
|  | import lombok.AllArgsConstructor; | ||||||
|  | import lombok.Getter; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 短信的发送失败类型的枚举 | ||||||
|  |  * | ||||||
|  |  * @author 芋道源码 | ||||||
|  |  */ | ||||||
|  | @Getter | ||||||
|  | @AllArgsConstructor | ||||||
|  | public enum SysSmsSendFailureTypeEnum { | ||||||
|  |  | ||||||
|  |     ; | ||||||
|  |  | ||||||
|  |     private final int type; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,23 @@ | |||||||
|  | package cn.iocoder.dashboard.modules.system.enums.sms; | ||||||
|  |  | ||||||
|  | import lombok.AllArgsConstructor; | ||||||
|  | import lombok.Getter; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 短信的发送状态枚举 | ||||||
|  |  * | ||||||
|  |  * @author zzf | ||||||
|  |  * @date 2021/2/1 13:39 | ||||||
|  |  */ | ||||||
|  | @Getter | ||||||
|  | @AllArgsConstructor | ||||||
|  | public enum SysSmsSendStatusEnum { | ||||||
|  |  | ||||||
|  |     INIT(0), // 初始化 | ||||||
|  |     SUCCESS(10), // 发送成功 | ||||||
|  |     FAILURE(20), // 发送失败 | ||||||
|  |     ; | ||||||
|  |  | ||||||
|  |     private final int status; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,25 @@ | |||||||
|  | package cn.iocoder.dashboard.modules.system.enums.sms; | ||||||
|  |  | ||||||
|  | import lombok.AllArgsConstructor; | ||||||
|  | import lombok.Getter; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 短信的模板类型枚举 | ||||||
|  |  * | ||||||
|  |  * @author 芋道源码 | ||||||
|  |  */ | ||||||
|  | @Getter | ||||||
|  | @AllArgsConstructor | ||||||
|  | public enum SysSmsTemplateTypeEnum { | ||||||
|  |  | ||||||
|  |     VERIFICATION_CODE(1), // 验证码 | ||||||
|  |     NOTICE(2), // 通知 | ||||||
|  |     PROMOTION(3), // 营销 | ||||||
|  |     ; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 类型 | ||||||
|  |      */ | ||||||
|  |     private final int type; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -19,6 +19,8 @@ public interface SysSmsService { | |||||||
|     void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, |     void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, | ||||||
|                       String templateCode, Map<String, Object> templateParams); |                       String templateCode, Map<String, Object> templateParams); | ||||||
|  |  | ||||||
|  |     void doSendSms(); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 处理短信发送回调函数 |      * 处理短信发送回调函数 | ||||||
|      * |      * | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ import cn.iocoder.dashboard.framework.sms.core.SmsResultDetail; | |||||||
| import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; | import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperty; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsQueryLogMapper; | import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SysSmsQueryLogMapper; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsQueryLogDO; | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsQueryLogDO; | ||||||
| import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; | ||||||
| import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService; | import cn.iocoder.dashboard.modules.system.service.sms.SysSmsQueryLogService; | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
|  |  | ||||||
| @ -36,7 +36,7 @@ public class SysSmsQueryLogServiceImpl implements SysSmsQueryLogService { | |||||||
|                 .setPhone(targetPhone) |                 .setPhone(targetPhone) | ||||||
|                 .setContent(smsBody.getParams().toString()); |                 .setContent(smsBody.getParams().toString()); | ||||||
|  |  | ||||||
|         smsLog.setSendStatus(SmsSendStatusEnum.ASYNC.getStatus()); |         smsLog.setSendStatus(SysSmsSendStatusEnum.ASYNC.getStatus()); | ||||||
|         logMapper.insert(smsLog); |         logMapper.insert(smsLog); | ||||||
|         smsBody.setSmsLogId(smsLog.getId()); |         smsBody.setSmsLogId(smsLog.getId()); | ||||||
|     } |     } | ||||||
| @ -46,7 +46,7 @@ public class SysSmsQueryLogServiceImpl implements SysSmsQueryLogService { | |||||||
|         SysSmsQueryLogDO smsLog = new SysSmsQueryLogDO(); |         SysSmsQueryLogDO smsLog = new SysSmsQueryLogDO(); | ||||||
|         smsLog.setId(logId); |         smsLog.setId(logId); | ||||||
|         smsLog.setApiId(result.getApiId()); |         smsLog.setApiId(result.getApiId()); | ||||||
|         smsLog.setSendStatus(SmsSendStatusEnum.QUERY_FAIL.getStatus()); |         smsLog.setSendStatus(SysSmsSendStatusEnum.QUERY_FAIL.getStatus()); | ||||||
|         smsLog.setRemark(result.getCode() + ": " + result.getMessage()); |         smsLog.setRemark(result.getCode() + ": " + result.getMessage()); | ||||||
|         logMapper.updateById(smsLog); |         logMapper.updateById(smsLog); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsQueryLogDO; | |||||||
| import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsSendLogDO; | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsSendLogDO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsQueryLogMapper; | import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsQueryLogMapper; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsSendLogMapper; | import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsSendLogMapper; | ||||||
| import cn.iocoder.dashboard.modules.system.enums.sms.SmsSendStatusEnum; | import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; | ||||||
| import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; | import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; | ||||||
| import cn.iocoder.dashboard.modules.system.service.sms.SysSmsSendLogService; | import cn.iocoder.dashboard.modules.system.service.sms.SysSmsSendLogService; | ||||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||||
| @ -88,7 +88,7 @@ public class SysSmsSendLogServiceImpl implements SysSmsSendLogService { | |||||||
|                 updateQueryLog.setSendStatus(SmsSendStatusEnum.QUERY_SEND_FAIL.getStatus()); |                 updateQueryLog.setSendStatus(SmsSendStatusEnum.QUERY_SEND_FAIL.getStatus()); | ||||||
|                 smsQueryLogMapper.updateById(updateQueryLog); |                 smsQueryLogMapper.updateById(updateQueryLog); | ||||||
|             }*/ |             }*/ | ||||||
|             updateQueryLog.setSendStatus(SmsSendStatusEnum.SEND_SUCCESS.getStatus()); |             updateQueryLog.setSendStatus(SysSmsSendStatusEnum.SEND_SUCCESS.getStatus()); | ||||||
|             updateQueryLog.setRemark(String.format("日志(id = %s)对应的客户端没有继承NeedQuerySendResultSmsClient, 不能获取短信结果。", queryLog.getId())); |             updateQueryLog.setRemark(String.format("日志(id = %s)对应的客户端没有继承NeedQuerySendResultSmsClient, 不能获取短信结果。", queryLog.getId())); | ||||||
|             smsQueryLogMapper.updateById(updateQueryLog); |             smsQueryLogMapper.updateById(updateQueryLog); | ||||||
|         }); |         }); | ||||||
|  | |||||||
| @ -1,5 +1,7 @@ | |||||||
| package cn.iocoder.dashboard.modules.system.service.sms.impl; | package cn.iocoder.dashboard.modules.system.service.sms.impl; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.CollUtil; | ||||||
|  | import cn.hutool.core.map.MapUtil; | ||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
| import cn.iocoder.dashboard.common.enums.UserTypeEnum; | import cn.iocoder.dashboard.common.enums.UserTypeEnum; | ||||||
| import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; | import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient; | ||||||
| @ -21,6 +23,8 @@ import javax.servlet.ServletRequest; | |||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.Objects; | import java.util.Objects; | ||||||
|  | import java.util.function.Consumer; | ||||||
|  | import java.util.function.Predicate; | ||||||
|  |  | ||||||
| import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; | import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; | ||||||
| import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; | import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; | ||||||
| @ -55,24 +59,40 @@ public class SysSmsServiceImpl implements SysSmsService { | |||||||
|     @Override |     @Override | ||||||
|     public void sendSingleSms(String mobile, Long userId, Integer userType, |     public void sendSingleSms(String mobile, Long userId, Integer userType, | ||||||
|                               String templateCode, Map<String, Object> templateParams) { |                               String templateCode, Map<String, Object> templateParams) { | ||||||
|         // 校验短信模板是否存在 |         // 校验短信模板是否合法 | ||||||
|         SysSmsTemplateDO template = this.checkSmsTemplateExists(templateCode); |         SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode, templateParams); | ||||||
|         // 校验手机号码是否存在 |         // 校验手机号码是否存在 | ||||||
|         mobile = this.checkMobile(mobile, userId, userType); |         mobile = this.checkMobile(mobile, userId, userType); | ||||||
|  |         // | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, |     public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, | ||||||
|                              String templateCode, Map<String, Object> templateParams) { |                              String templateCode, Map<String, Object> templateParams) { | ||||||
|         // 校验短信模板是否存在 |         // 校验短信模板是否存在 | ||||||
|         SysSmsTemplateDO template = this.checkSmsTemplateExists(templateCode); |         SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode, templateParams); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private SysSmsTemplateDO checkSmsTemplateExists(String templateCode) { |     private SysSmsTemplateDO checkSmsTemplateValid(String templateCode, Map<String, Object> templateParams) { | ||||||
|  |         // 短信模板不存在 | ||||||
|         SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCode(templateCode); |         SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCode(templateCode); | ||||||
|         if (template == null) { |         if (template == null) { | ||||||
|             throw exception(SMS_TEMPLATE_NOT_EXISTS); |             throw exception(SMS_TEMPLATE_NOT_EXISTS); | ||||||
|         } |         } | ||||||
|  |         // 参数不够 | ||||||
|  |         if (CollUtil.isNotEmpty(template.getParams())) { | ||||||
|  |             template.getParams().forEach(param -> { | ||||||
|  |                 if (!templateParams.containsKey(param)) { | ||||||
|  |                     throw exception(SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |         // 移除多余参数 | ||||||
|  |         if (CollUtil.isEmpty(template.getParams())) { | ||||||
|  |             templateParams.clear(); | ||||||
|  |         } else { | ||||||
|  |             templateParams.entrySet().removeIf(entry -> !template.getParams().contains(entry.getKey())); | ||||||
|  |         } | ||||||
|         return template; |         return template; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV