Commit d843d6a5a8329e89c0fa8f9e9f982b89091d0852

Authored by YunaiV
1 parent 5a1491d7

短信提交 2021-04-03,重构返回的结果

Showing 27 changed files with 201 additions and 196 deletions
src/main/java/cn/iocoder/dashboard/common/core/KeyValue.java 0 → 100644
  1 +package cn.iocoder.dashboard.common.core;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +/**
  8 + * Key Value 的键值对
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +@Data
  13 +@NoArgsConstructor
  14 +@AllArgsConstructor
  15 +public class KeyValue<K, V> {
  16 +
  17 + private K key;
  18 + private V value;
  19 +
  20 +}
src/main/java/cn/iocoder/dashboard/common/pojo/CommonResult.java
@@ -8,6 +8,7 @@ import lombok.Data; @@ -8,6 +8,7 @@ import lombok.Data;
8 import org.springframework.util.Assert; 8 import org.springframework.util.Assert;
9 9
10 import java.io.Serializable; 10 import java.io.Serializable;
  11 +import java.util.Objects;
11 12
12 /** 13 /**
13 * 通用返回 14 * 通用返回
@@ -67,9 +68,13 @@ public class CommonResult&lt;T&gt; implements Serializable { @@ -67,9 +68,13 @@ public class CommonResult&lt;T&gt; implements Serializable {
67 return result; 68 return result;
68 } 69 }
69 70
  71 + public static boolean isSuccess(Integer code) {
  72 + return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode());
  73 + }
  74 +
70 @JsonIgnore // 避免 jackson 序列化 75 @JsonIgnore // 避免 jackson 序列化
71 public boolean isSuccess() { 76 public boolean isSuccess() {
72 - return GlobalErrorCodeConstants.SUCCESS.getCode().equals(code); 77 + return isSuccess(GlobalErrorCodeConstants.SUCCESS.getCode());
73 } 78 }
74 79
75 @JsonIgnore // 避免 jackson 序列化 80 @JsonIgnore // 避免 jackson 序列化
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/SmsClient.java
1 package cn.iocoder.dashboard.framework.sms.core.client; 1 package cn.iocoder.dashboard.framework.sms.core.client;
2 2
  3 +import cn.iocoder.dashboard.common.core.KeyValue;
3 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsResultDetail; 4 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsResultDetail;
4 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; 5 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
5 6
6 import javax.servlet.ServletRequest; 7 import javax.servlet.ServletRequest;
7 -import java.util.Map; 8 +import java.util.List;
8 9
9 /** 10 /**
10 * 短信客户端接口 11 * 短信客户端接口
@@ -24,13 +25,13 @@ public interface SmsClient { @@ -24,13 +25,13 @@ public interface SmsClient {
24 /** 25 /**
25 * 发送消息 26 * 发送消息
26 * 27 *
27 - * @param sendLogId 发送日志编号 28 + * @param logId 日志编号
28 * @param mobile 手机号 29 * @param mobile 手机号
29 * @param apiTemplateId 短信 API 的模板编号 30 * @param apiTemplateId 短信 API 的模板编号
30 * @param templateParams 短信模板参数 31 * @param templateParams 短信模板参数
31 * @return 短信发送结果 32 * @return 短信发送结果
32 */ 33 */
33 - SmsCommonResult<SmsSendRespDTO> send(Long sendLogId, String mobile, String apiTemplateId, Map<String, Object> templateParams); 34 + SmsCommonResult<SmsSendRespDTO> send(Long logId, String mobile, String apiTemplateId, List<KeyValue<String, Object>> templateParams);
34 35
35 // TODO FROM 芋艿 to ZZF:是不是可以改成意图更明确的解析返回结果,例如说 parseXXXX 36 // TODO FROM 芋艿 to ZZF:是不是可以改成意图更明确的解析返回结果,例如说 parseXXXX
36 /** 37 /**
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/dto/SmsSendRespDTO.java
@@ -3,7 +3,7 @@ package cn.iocoder.dashboard.framework.sms.core.client.dto; @@ -3,7 +3,7 @@ package cn.iocoder.dashboard.framework.sms.core.client.dto;
3 import lombok.Data; 3 import lombok.Data;
4 4
5 /** 5 /**
6 - * 短信发送响应 DTO 6 + * 短信发送 Response DTO
7 * 7 *
8 * @author 芋道源码 8 * @author 芋道源码
9 */ 9 */
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/AbstractSmsClient.java
1 package cn.iocoder.dashboard.framework.sms.core.client.impl; 1 package cn.iocoder.dashboard.framework.sms.core.client.impl;
2 2
  3 +import cn.iocoder.dashboard.common.core.KeyValue;
  4 +import cn.iocoder.dashboard.framework.sms.core.client.SmsClient;
3 import cn.iocoder.dashboard.framework.sms.core.client.SmsCodeMapping; 5 import cn.iocoder.dashboard.framework.sms.core.client.SmsCodeMapping;
4 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; 6 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;
5 -import cn.iocoder.dashboard.framework.sms.core.client.SmsClient;  
6 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; 7 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
7 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; 8 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
8 import lombok.extern.slf4j.Slf4j; 9 import lombok.extern.slf4j.Slf4j;
9 10
10 -import java.util.Map; 11 +import java.util.List;
11 12
12 /** 13 /**
13 * 短信客户端抽象类 14 * 短信客户端抽象类
@@ -67,16 +68,16 @@ public abstract class AbstractSmsClient implements SmsClient { @@ -67,16 +68,16 @@ public abstract class AbstractSmsClient implements SmsClient {
67 } 68 }
68 69
69 @Override 70 @Override
70 - public final SmsCommonResult<SmsSendRespDTO> send(Long sendLogId, String mobile,  
71 - String apiTemplateId, Map<String, Object> templateParams) { 71 + public final SmsCommonResult<SmsSendRespDTO> send(Long logId, String mobile,
  72 + String apiTemplateId, List<KeyValue<String, Object>> templateParams) {
72 // 执行短信发送 73 // 执行短信发送
73 SmsCommonResult<SmsSendRespDTO> result; 74 SmsCommonResult<SmsSendRespDTO> result;
74 try { 75 try {
75 - result = doSend(sendLogId, mobile, apiTemplateId, templateParams); 76 + result = doSend(logId, mobile, apiTemplateId, templateParams);
76 } catch (Throwable ex) { 77 } catch (Throwable ex) {
77 // 打印异常日志 78 // 打印异常日志
78 log.error("[send][发送短信异常,sendLogId({}) mobile({}) apiTemplateId({}) templateParams({})]", 79 log.error("[send][发送短信异常,sendLogId({}) mobile({}) apiTemplateId({}) templateParams({})]",
79 - sendLogId, mobile, apiTemplateId, templateParams, ex); 80 + logId, mobile, apiTemplateId, templateParams, ex);
80 // 封装返回 81 // 封装返回
81 return SmsCommonResult.error(ex); 82 return SmsCommonResult.error(ex);
82 } 83 }
@@ -93,6 +94,7 @@ public abstract class AbstractSmsClient implements SmsClient { @@ -93,6 +94,7 @@ public abstract class AbstractSmsClient implements SmsClient {
93 * @return 短信发送结果 94 * @return 短信发送结果
94 */ 95 */
95 protected abstract SmsCommonResult<SmsSendRespDTO> doSend(Long sendLogId, String mobile, 96 protected abstract SmsCommonResult<SmsSendRespDTO> doSend(Long sendLogId, String mobile,
96 - String apiTemplateId, Map<String, Object> templateParams) throws Throwable; 97 + String apiTemplateId, List<KeyValue<String, Object>> templateParams)
  98 + throws Throwable;
97 99
98 } 100 }
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClient.java
@@ -3,12 +3,14 @@ package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun; @@ -3,12 +3,14 @@ package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun;
3 import cn.hutool.core.collection.CollectionUtil; 3 import cn.hutool.core.collection.CollectionUtil;
4 import cn.hutool.core.date.DateUtil; 4 import cn.hutool.core.date.DateUtil;
5 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
  6 +import cn.iocoder.dashboard.common.core.KeyValue;
6 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; 7 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;
7 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsResultDetail; 8 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsResultDetail;
8 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; 9 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
9 import cn.iocoder.dashboard.framework.sms.core.client.impl.AbstractSmsClient; 10 import cn.iocoder.dashboard.framework.sms.core.client.impl.AbstractSmsClient;
10 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; 11 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
11 import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; 12 import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
  13 +import cn.iocoder.dashboard.util.collection.MapUtils;
12 import cn.iocoder.dashboard.util.json.JsonUtils; 14 import cn.iocoder.dashboard.util.json.JsonUtils;
13 import com.aliyuncs.DefaultAcsClient; 15 import com.aliyuncs.DefaultAcsClient;
14 import com.aliyuncs.IAcsClient; 16 import com.aliyuncs.IAcsClient;
@@ -60,14 +62,14 @@ public class AliyunSmsClient extends AbstractSmsClient { @@ -60,14 +62,14 @@ public class AliyunSmsClient extends AbstractSmsClient {
60 62
61 @Override 63 @Override
62 protected SmsCommonResult<SmsSendRespDTO> doSend(Long sendLogId, String mobile, 64 protected SmsCommonResult<SmsSendRespDTO> doSend(Long sendLogId, String mobile,
63 - String apiTemplateId, Map<String, Object> templateParams) throws Throwable { 65 + String apiTemplateId, List<KeyValue<String, Object>> templateParams) {
64 // 构建参数 66 // 构建参数
65 SendSmsRequest request = new SendSmsRequest(); 67 SendSmsRequest request = new SendSmsRequest();
66 request.setSysMethod(MethodType.POST); 68 request.setSysMethod(MethodType.POST);
67 request.setPhoneNumbers(mobile); 69 request.setPhoneNumbers(mobile);
68 request.setSignName(properties.getSignature()); 70 request.setSignName(properties.getSignature());
69 request.setTemplateCode(apiTemplateId); 71 request.setTemplateCode(apiTemplateId);
70 - request.setTemplateParam(JsonUtils.toJsonString(templateParams)); 72 + request.setTemplateParam(JsonUtils.toJsonString(MapUtils.convertMap(templateParams)));
71 request.setOutId(String.valueOf(sendLogId)); 73 request.setOutId(String.valueOf(sendLogId));
72 74
73 try { 75 try {
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.java
1 package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun; 1 package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun;
2 2
3 import cn.iocoder.dashboard.common.exception.ErrorCode; 3 import cn.iocoder.dashboard.common.exception.ErrorCode;
  4 +import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants;
4 import cn.iocoder.dashboard.framework.sms.core.client.SmsCodeMapping; 5 import cn.iocoder.dashboard.framework.sms.core.client.SmsCodeMapping;
5 6
6 import static cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants.*; 7 import static cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants.*;
@@ -15,7 +16,7 @@ public class AliyunSmsCodeMapping implements SmsCodeMapping { @@ -15,7 +16,7 @@ public class AliyunSmsCodeMapping implements SmsCodeMapping {
15 @Override 16 @Override
16 public ErrorCode apply(String apiCode) { 17 public ErrorCode apply(String apiCode) {
17 switch (apiCode) { 18 switch (apiCode) {
18 - case "OK": return null; 19 + case "OK": return GlobalErrorCodeConstants.SUCCESS;
19 case "MissingAccessKeyId": return SMS_CHANNEL_API_KEY_MISSING; 20 case "MissingAccessKeyId": return SMS_CHANNEL_API_KEY_MISSING;
20 case "isp.RAM_PERMISSION_DENY": return SMS_CHANNEL_PERMISSION_DENY; 21 case "isp.RAM_PERMISSION_DENY": return SMS_CHANNEL_PERMISSION_DENY;
21 case "isv.INVALID_PARAMETERS": return SMS_API_PARAM_ERROR; 22 case "isv.INVALID_PARAMETERS": return SMS_API_PARAM_ERROR;
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClient.java
@@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil; @@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil;
6 import cn.hutool.core.util.CharsetUtil; 6 import cn.hutool.core.util.CharsetUtil;
7 import cn.hutool.core.util.StrUtil; 7 import cn.hutool.core.util.StrUtil;
8 import cn.hutool.core.util.URLUtil; 8 import cn.hutool.core.util.URLUtil;
  9 +import cn.iocoder.dashboard.common.core.KeyValue;
9 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; 10 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;
10 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsResultDetail; 11 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsResultDetail;
11 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; 12 import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
@@ -65,7 +66,7 @@ public class YunpianSmsClient extends AbstractSmsClient { @@ -65,7 +66,7 @@ public class YunpianSmsClient extends AbstractSmsClient {
65 66
66 @Override 67 @Override
67 protected SmsCommonResult<SmsSendRespDTO> doSend(Long sendLogId, String mobile, 68 protected SmsCommonResult<SmsSendRespDTO> doSend(Long sendLogId, String mobile,
68 - String apiTemplateId, Map<String, Object> templateParams) throws Throwable { 69 + String apiTemplateId, List<KeyValue<String, Object>> templateParams) throws Throwable {
69 // 构建参数 70 // 构建参数
70 Map<String, String> request = new HashMap<>(); 71 Map<String, String> request = new HashMap<>();
71 request.put(YunpianConstant.APIKEY, properties.getApiKey()); 72 request.put(YunpianConstant.APIKEY, properties.getApiKey());
@@ -89,13 +90,13 @@ public class YunpianSmsClient extends AbstractSmsClient { @@ -89,13 +90,13 @@ public class YunpianSmsClient extends AbstractSmsClient {
89 data, codeMapping); 90 data, codeMapping);
90 } 91 }
91 92
92 - private static String formatTplValue(Map<String, Object> templateParams) { 93 + private static String formatTplValue(List<KeyValue<String, Object>> templateParams) {
93 if (CollUtil.isEmpty(templateParams)) { 94 if (CollUtil.isEmpty(templateParams)) {
94 return ""; 95 return "";
95 } 96 }
96 // 参考 https://www.yunpian.com/official/document/sms/zh_cn/introduction_demos_encode_sample 格式化 97 // 参考 https://www.yunpian.com/official/document/sms/zh_cn/introduction_demos_encode_sample 格式化
97 StringJoiner joiner = new StringJoiner("&"); 98 StringJoiner joiner = new StringJoiner("&");
98 - templateParams.forEach((key, value) -> joiner.add(String.format("#%s#=%s", key, URLUtil.encode(String.valueOf(value))))); 99 + templateParams.forEach(param -> joiner.add(String.format("#%s#=%s", param.getKey(), URLUtil.encode(String.valueOf(param.getValue())))));
99 return joiner.toString(); 100 return joiner.toString();
100 } 101 }
101 102
src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.java
@@ -12,7 +12,6 @@ import cn.iocoder.dashboard.common.exception.ErrorCode; @@ -12,7 +12,6 @@ import cn.iocoder.dashboard.common.exception.ErrorCode;
12 public interface SmsFrameworkErrorCodeConstants { 12 public interface SmsFrameworkErrorCodeConstants {
13 13
14 // ========== 渠道相关 2001000100 ========== 14 // ========== 渠道相关 2001000100 ==========
15 - ErrorCode SMS_CHANNEL_CLIENT_NOT_EXISTS = new ErrorCode(2001000100, "短信渠道的客户端不存在");  
16 ErrorCode SMS_CHANNEL_API_KEY_MISSING = new ErrorCode(2001000101, "API Key 不存在"); 15 ErrorCode SMS_CHANNEL_API_KEY_MISSING = new ErrorCode(2001000101, "API Key 不存在");
17 ErrorCode SMS_CHANNEL_PERMISSION_DENY = new ErrorCode(2001000102, "没有发送短信的权限"); 16 ErrorCode SMS_CHANNEL_PERMISSION_DENY = new ErrorCode(2001000102, "没有发送短信的权限");
18 17
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java
@@ -4,7 +4,6 @@ import cn.iocoder.dashboard.common.pojo.CommonResult; @@ -4,7 +4,6 @@ import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; 5 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;
6 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; 6 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO;
7 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO;  
8 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; 7 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
9 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; 8 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
10 import io.swagger.annotations.Api; 9 import io.swagger.annotations.Api;
@@ -13,7 +12,6 @@ import org.springframework.validation.annotation.Validated; @@ -13,7 +12,6 @@ import org.springframework.validation.annotation.Validated;
13 import org.springframework.web.bind.annotation.*; 12 import org.springframework.web.bind.annotation.*;
14 13
15 import javax.annotation.Resource; 14 import javax.annotation.Resource;
16 -import java.util.List;  
17 15
18 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 16 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
19 17
@@ -31,12 +29,6 @@ public class SmsChannelController { @@ -31,12 +29,6 @@ public class SmsChannelController {
31 return success(service.pageSmsChannels(reqVO)); 29 return success(service.pageSmsChannels(reqVO));
32 } 30 }
33 31
34 - @ApiOperation("获取渠道枚举")  
35 - @GetMapping("/list/channel-enum")  
36 - public CommonResult<List<SmsChannelEnumRespVO>> getChannelEnums() {  
37 - return success(service.getSmsChannelEnums());  
38 - }  
39 -  
40 @ApiOperation("添加消息渠道") 32 @ApiOperation("添加消息渠道")
41 @PostMapping("/create") 33 @PostMapping("/create")
42 public CommonResult<Long> add(@Validated @RequestBody SmsChannelCreateReqVO reqVO) { 34 public CommonResult<Long> add(@Validated @RequestBody SmsChannelCreateReqVO reqVO) {
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/resp/SmsChannelEnumRespVO.java deleted
1 -package cn.iocoder.dashboard.modules.system.controller.sms.vo.resp;  
2 -  
3 -import io.swagger.annotations.ApiModel;  
4 -import lombok.Data;  
5 -import lombok.EqualsAndHashCode;  
6 -import lombok.NoArgsConstructor;  
7 -  
8 -import java.io.Serializable;  
9 -  
10 -  
11 -@ApiModel("用户分页 Request VO")  
12 -@Data  
13 -@NoArgsConstructor  
14 -@EqualsAndHashCode  
15 -public class SmsChannelEnumRespVO implements Serializable {  
16 -  
17 - private String code;  
18 -  
19 - private String name;  
20 -  
21 -}  
src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java
1 package cn.iocoder.dashboard.modules.system.convert.sms; 1 package cn.iocoder.dashboard.modules.system.convert.sms;
2 2
3 -import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum;  
4 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; 3 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
5 import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO; 4 import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO;
6 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; 5 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;
7 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO;  
8 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; 6 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
9 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; 7 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
10 import org.mapstruct.Mapper; 8 import org.mapstruct.Mapper;
@@ -21,8 +19,6 @@ public interface SmsChannelConvert { @@ -21,8 +19,6 @@ public interface SmsChannelConvert {
21 19
22 SysSmsChannelDO convert(SysUserUpdateReqVO bean); 20 SysSmsChannelDO convert(SysUserUpdateReqVO bean);
23 21
24 - List<SmsChannelEnumRespVO> convertEnum(List<SmsChannelEnum> bean);  
25 -  
26 List<SmsChannelAllVO> convert(List<SysSmsChannelDO> bean); 22 List<SmsChannelAllVO> convert(List<SysSmsChannelDO> bean);
27 23
28 List<SmsChannelProperties> convertProperty(List<SmsChannelAllVO> list); 24 List<SmsChannelProperties> convertProperty(List<SmsChannelAllVO> list);
src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsChannelDO.java
@@ -6,16 +6,18 @@ import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; @@ -6,16 +6,18 @@ import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum;
6 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
7 import lombok.Data; 7 import lombok.Data;
8 import lombok.EqualsAndHashCode; 8 import lombok.EqualsAndHashCode;
  9 +import lombok.ToString;
9 10
10 /** 11 /**
11 - * 短信渠道 12 + * 短信渠道 DO
12 * 13 *
13 * @author zzf 14 * @author zzf
14 * @since 2021-01-25 15 * @since 2021-01-25
15 */ 16 */
16 -@TableName(value = "sms_channel", autoResultMap = true) 17 +@TableName(value = "sys_sms_channel", autoResultMap = true)
17 @Data 18 @Data
18 @EqualsAndHashCode(callSuper = true) 19 @EqualsAndHashCode(callSuper = true)
  20 +@ToString(callSuper = true)
19 public class SysSmsChannelDO extends BaseDO { 21 public class SysSmsChannelDO extends BaseDO {
20 22
21 /** 23 /**
src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsSendLogDO.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsLogDO.java
@@ -2,28 +2,30 @@ package cn.iocoder.dashboard.modules.system.dal.dataobject.sms; @@ -2,28 +2,30 @@ package cn.iocoder.dashboard.modules.system.dal.dataobject.sms;
2 2
3 import cn.iocoder.dashboard.common.enums.UserTypeEnum; 3 import cn.iocoder.dashboard.common.enums.UserTypeEnum;
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.framework.sms.core.enums.SmsSendFailureTypeEnum; 5 +import cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants;
6 import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; 6 import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
  7 +import com.baomidou.mybatisplus.annotation.TableField;
7 import com.baomidou.mybatisplus.annotation.TableName; 8 import com.baomidou.mybatisplus.annotation.TableName;
  9 +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
8 import lombok.*; 10 import lombok.*;
9 11
10 import java.util.Date; 12 import java.util.Date;
11 import java.util.Map; 13 import java.util.Map;
12 14
13 /** 15 /**
14 - * 短信发送日志 16 + * 短信日志 DO
15 * 17 *
16 * @author zzf 18 * @author zzf
17 * @since 2021-01-25 19 * @since 2021-01-25
18 */ 20 */
19 -@TableName(value = "sms_send_log", autoResultMap = true) 21 +@TableName(value = "sys_sms_log", autoResultMap = true)
20 @Data 22 @Data
21 @EqualsAndHashCode(callSuper = true) 23 @EqualsAndHashCode(callSuper = true)
22 @ToString(callSuper = true) 24 @ToString(callSuper = true)
23 @AllArgsConstructor 25 @AllArgsConstructor
24 @NoArgsConstructor 26 @NoArgsConstructor
25 @Builder 27 @Builder
26 -public class SysSmsSendLogDO extends BaseDO { 28 +public class SysSmsLogDO extends BaseDO {
27 29
28 /** 30 /**
29 * 自增编号 31 * 自增编号
@@ -48,7 +50,7 @@ public class SysSmsSendLogDO extends BaseDO { @@ -48,7 +50,7 @@ public class SysSmsSendLogDO extends BaseDO {
48 // ========= 模板相关字段 ========= 50 // ========= 模板相关字段 =========
49 51
50 /** 52 /**
51 - * 短信模板编号 53 + * 模板编号
52 * 54 *
53 * 关联 {@link SysSmsTemplateDO#getId()} 55 * 关联 {@link SysSmsTemplateDO#getId()}
54 */ 56 */
@@ -70,8 +72,9 @@ public class SysSmsSendLogDO extends BaseDO { @@ -70,8 +72,9 @@ public class SysSmsSendLogDO extends BaseDO {
70 */ 72 */
71 private String templateContent; 73 private String templateContent;
72 /** 74 /**
73 - * 基于 {@link SysSmsTemplateDO#getParams()} 输入后的内容 75 + * 基于 {@link SysSmsTemplateDO#getParams()} 输入后的参数
74 */ 76 */
  77 + @TableField(typeHandler = JacksonTypeHandler.class)
75 private Map<String, Object> templateParams; 78 private Map<String, Object> templateParams;
76 /** 79 /**
77 * 短信 API 的模板编号 80 * 短信 API 的模板编号
@@ -106,32 +109,32 @@ public class SysSmsSendLogDO extends BaseDO { @@ -106,32 +109,32 @@ public class SysSmsSendLogDO extends BaseDO {
106 */ 109 */
107 private Integer sendStatus; 110 private Integer sendStatus;
108 /** 111 /**
109 - * 时间发送时间 112 + * 发送时间
110 */ 113 */
111 private Date sendTime; 114 private Date sendTime;
112 /** 115 /**
113 - * 发送失败的类型 116 + * 发送结果的编码
114 * 117 *
115 - * 枚举 {@link SmsSendFailureTypeEnum#getType()} 118 + * 枚举 {@link SmsFrameworkErrorCodeConstants}
116 */ 119 */
117 - private Integer sendFailureType; 120 + private Integer sendCode;
118 /** 121 /**
119 - * 发送失败的提示 122 + * 发送结果的提示
120 * 123 *
121 - * 一般情况下,使用 {@link SmsSendFailureTypeEnum#getMsg()} 124 + * 一般情况下,使用 {@link SmsFrameworkErrorCodeConstants}
122 * 异常情况下,通过格式化 Exception 的提示存储 125 * 异常情况下,通过格式化 Exception 的提示存储
123 */ 126 */
124 - private String sendFailureMsg; 127 + private String sendMsg;
125 /** 128 /**
126 - * 短信 API 发送失败的类型 129 + * 短信 API 发送结果的编码
127 * 130 *
128 * 由于第三方的错误码可能是字符串,所以使用 String 类型 131 * 由于第三方的错误码可能是字符串,所以使用 String 类型
129 */ 132 */
130 - private String apiSendFailureType; 133 + private String apiSendCode;
131 /** 134 /**
132 * 短信 API 发送失败的提示 135 * 短信 API 发送失败的提示
133 */ 136 */
134 - private String apiSendFailureMsg; 137 + private String apiSendMsg;
135 /** 138 /**
136 * 短信 API 发送返回的唯一请求 ID 139 * 短信 API 发送返回的唯一请求 ID
137 * 140 *
@@ -147,9 +150,9 @@ public class SysSmsSendLogDO extends BaseDO { @@ -147,9 +150,9 @@ public class SysSmsSendLogDO extends BaseDO {
147 150
148 // ========= 接收相关字段 ========= 151 // ========= 接收相关字段 =========
149 152
150 - /**  
151 - * 是否获取过结果[0否 1是]  
152 - */  
153 - private Integer gotResult; 153 +// /**
  154 +// * 是否获取过结果[0否 1是]
  155 +// */
  156 +// private Integer gotResult;
154 157
155 } 158 }
src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsTemplateDO.java
@@ -8,18 +8,20 @@ import com.baomidou.mybatisplus.annotation.TableName; @@ -8,18 +8,20 @@ import com.baomidou.mybatisplus.annotation.TableName;
8 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; 8 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
9 import lombok.Data; 9 import lombok.Data;
10 import lombok.EqualsAndHashCode; 10 import lombok.EqualsAndHashCode;
  11 +import lombok.ToString;
11 12
12 import java.util.List; 13 import java.util.List;
13 14
14 /** 15 /**
15 - * 短信模板 16 + * 短信模板 DO
16 * 17 *
17 * @author zzf 18 * @author zzf
18 * @since 2021-01-25 19 * @since 2021-01-25
19 */ 20 */
  21 +@TableName(value = "sys_sms_template", autoResultMap = true)
20 @Data 22 @Data
21 @EqualsAndHashCode(callSuper = true) 23 @EqualsAndHashCode(callSuper = true)
22 -@TableName(value = "sms_template", autoResultMap = true) 24 +@ToString(callSuper = true)
23 public class SysSmsTemplateDO extends BaseDO { 25 public class SysSmsTemplateDO extends BaseDO {
24 26
25 /** 27 /**
@@ -46,11 +48,11 @@ public class SysSmsTemplateDO extends BaseDO { @@ -46,11 +48,11 @@ public class SysSmsTemplateDO extends BaseDO {
46 */ 48 */
47 private String code; 49 private String code;
48 /** 50 /**
49 - * 名称 51 + * 模板名称
50 */ 52 */
51 private String name; 53 private String name;
52 /** 54 /**
53 - * 内容 55 + * 模板内容
54 * 56 *
55 * 内容的参数,使用 {} 包括,例如说 {name} 57 * 内容的参数,使用 {} 包括,例如说 {name}
56 */ 58 */
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsSendLogMapper.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsLogMapper.java
1 package cn.iocoder.dashboard.modules.system.dal.mysql.sms; 1 package cn.iocoder.dashboard.modules.system.dal.mysql.sms;
2 2
3 import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX;
4 -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsSendLogDO; 4 +import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO;
5 import org.apache.ibatis.annotations.Mapper; 5 import org.apache.ibatis.annotations.Mapper;
6 6
7 @Mapper 7 @Mapper
8 -public interface SysSmsSendLogMapper extends BaseMapperX<SysSmsSendLogDO> { 8 +public interface SysSmsLogMapper extends BaseMapperX<SysSmsLogDO> {
9 } 9 }
src/main/java/cn/iocoder/dashboard/modules/system/enums/sms/SysSmsSendStatusEnum.java
@@ -16,6 +16,7 @@ public enum SysSmsSendStatusEnum { @@ -16,6 +16,7 @@ public enum SysSmsSendStatusEnum {
16 INIT(0), // 初始化 16 INIT(0), // 初始化
17 SUCCESS(10), // 发送成功 17 SUCCESS(10), // 发送成功
18 FAILURE(20), // 发送失败 18 FAILURE(20), // 发送失败
  19 + IGNORE(30), // 忽略,即不发送
19 ; 20 ;
20 21
21 private final int status; 22 private final int status;
src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsSendMessage.java
1 package cn.iocoder.dashboard.modules.system.mq.message.sms; 1 package cn.iocoder.dashboard.modules.system.mq.message.sms;
2 2
  3 +import cn.iocoder.dashboard.common.core.KeyValue;
3 import cn.iocoder.dashboard.framework.redis.core.stream.StreamMessage; 4 import cn.iocoder.dashboard.framework.redis.core.stream.StreamMessage;
4 import lombok.Data; 5 import lombok.Data;
5 6
6 import javax.validation.constraints.NotNull; 7 import javax.validation.constraints.NotNull;
7 -import java.util.Map; 8 +import java.util.List;
8 9
9 /** 10 /**
10 * 短信发送消息 11 * 短信发送消息
@@ -15,10 +16,10 @@ import java.util.Map; @@ -15,10 +16,10 @@ import java.util.Map;
15 public class SysSmsSendMessage implements StreamMessage { 16 public class SysSmsSendMessage implements StreamMessage {
16 17
17 /** 18 /**
18 - * 发送日志编号 19 + * 短信日志编号
19 */ 20 */
20 - @NotNull(message = "发送日志编号不能为空")  
21 - private Long sendLogId; 21 + @NotNull(message = "短信日志编号不能为空")
  22 + private Long logId;
22 /** 23 /**
23 * 手机号 24 * 手机号
24 */ 25 */
@@ -37,7 +38,7 @@ public class SysSmsSendMessage implements StreamMessage { @@ -37,7 +38,7 @@ public class SysSmsSendMessage implements StreamMessage {
37 /** 38 /**
38 * 短信模板参数 39 * 短信模板参数
39 */ 40 */
40 - private Map<String, Object> templateParams; 41 + private List<KeyValue<String, Object>> templateParams;
41 42
42 @Override 43 @Override
43 public String getStreamKey() { 44 public String getStreamKey() {
src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SysSmsProducer.java
1 package cn.iocoder.dashboard.modules.system.mq.producer.sms; 1 package cn.iocoder.dashboard.modules.system.mq.producer.sms;
2 2
  3 +import cn.iocoder.dashboard.common.core.KeyValue;
3 import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils; 4 import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
4 import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage; 5 import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage;
5 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
@@ -7,7 +8,7 @@ import org.springframework.data.redis.core.StringRedisTemplate; @@ -7,7 +8,7 @@ import org.springframework.data.redis.core.StringRedisTemplate;
7 import org.springframework.stereotype.Component; 8 import org.springframework.stereotype.Component;
8 9
9 import javax.annotation.Resource; 10 import javax.annotation.Resource;
10 -import java.util.Map; 11 +import java.util.List;
11 12
12 /** 13 /**
13 * 短信发送流消息监听器 14 * 短信发送流消息监听器
@@ -25,16 +26,15 @@ public class SysSmsProducer { @@ -25,16 +26,15 @@ public class SysSmsProducer {
25 /** 26 /**
26 * 发送短信 Message 27 * 发送短信 Message
27 * 28 *
28 - * @param sendLogId 发送日志编号 29 + * @param logId 短信日志编号
29 * @param mobile 手机号 30 * @param mobile 手机号
30 * @param channelId 渠道编号 31 * @param channelId 渠道编号
31 * @param apiTemplateId 短信模板编号 32 * @param apiTemplateId 短信模板编号
32 * @param templateParams 短信模板参数 33 * @param templateParams 短信模板参数
33 - * @param sendLogId 发送日志编号  
34 */ 34 */
35 - public void sendSmsSendMessage(Long sendLogId, String mobile,  
36 - Long channelId, String apiTemplateId, Map<String, Object> templateParams) {  
37 - SysSmsSendMessage message = new SysSmsSendMessage().setSendLogId(sendLogId).setMobile(mobile); 35 + public void sendSmsSendMessage(Long logId, String mobile,
  36 + Long channelId, String apiTemplateId, List<KeyValue<String, Object>> templateParams) {
  37 + SysSmsSendMessage message = new SysSmsSendMessage().setLogId(logId).setMobile(mobile);
38 message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams); 38 message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams);
39 RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message); 39 RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message);
40 } 40 }
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java
@@ -3,11 +3,8 @@ package cn.iocoder.dashboard.modules.system.service.sms; @@ -3,11 +3,8 @@ package cn.iocoder.dashboard.modules.system.service.sms;
3 import cn.iocoder.dashboard.common.pojo.PageResult; 3 import cn.iocoder.dashboard.common.pojo.PageResult;
4 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; 4 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;
5 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; 5 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO;
6 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO;  
7 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; 6 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
8 7
9 -import java.util.List;  
10 -  
11 /** 8 /**
12 * 短信渠道Service接口 9 * 短信渠道Service接口
13 * 10 *
@@ -17,9 +14,9 @@ import java.util.List; @@ -17,9 +14,9 @@ import java.util.List;
17 public interface SysSmsChannelService { 14 public interface SysSmsChannelService {
18 15
19 /** 16 /**
20 - * 初始化短信渠道并缓存短信模板信息 17 + * 初始化短信客户端
21 */ 18 */
22 - void initSmsClientAndCacheSmsTemplate(); 19 + void initSmsClients();
23 20
24 /** 21 /**
25 * 分页查询短信渠道信息 22 * 分页查询短信渠道信息
@@ -37,11 +34,4 @@ public interface SysSmsChannelService { @@ -37,11 +34,4 @@ public interface SysSmsChannelService {
37 */ 34 */
38 Long createSmsChannel(SmsChannelCreateReqVO reqVO); 35 Long createSmsChannel(SmsChannelCreateReqVO reqVO);
39 36
40 - /**  
41 - * 获取短信渠道枚举/渠道编码  
42 - *  
43 - * @return 短信渠道枚举/渠道编码  
44 - */  
45 - List<SmsChannelEnumRespVO> getSmsChannelEnums();  
46 -  
47 } 37 }
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsSendLogService.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java
@@ -5,45 +5,40 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; @@ -5,45 +5,40 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
5 import java.util.Map; 5 import java.util.Map;
6 6
7 /** 7 /**
8 - * 短信发送日志服务接口 8 + * 短信日志服务接口
9 * 9 *
10 * @author zzf 10 * @author zzf
11 * @date 13:48 2021/3/2 11 * @date 13:48 2021/3/2
12 */ 12 */
13 -public interface SysSmsSendLogService { 13 +public interface SysSmsLogService {
14 14
15 /** 15 /**
16 - * 创建发送日志 16 + * 创建短信日志
17 * 17 *
18 * @param mobile 手机号 18 * @param mobile 手机号
19 * @param userId 用户编号 19 * @param userId 用户编号
20 * @param userType 用户类型 20 * @param userType 用户类型
  21 + * @param isSend 是否发送
21 * @param template 短信模板 22 * @param template 短信模板
22 * @param templateContent 短信内容 23 * @param templateContent 短信内容
23 * @param templateParams 短信参数 24 * @param templateParams 短信参数
24 - * @return 25 + * @return 发送日志编号
25 */ 26 */
26 - Long createSmsSendLog(String mobile, Long userId, Integer userType,  
27 - SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams); 27 + Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
  28 + SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams);
28 29
29 /** 30 /**
30 * 更新发送日志的结果 31 * 更新发送日志的结果
31 * 32 *
32 * @param id 日志编号 33 * @param id 日志编号
33 - * @param success 是否成功  
34 - * @param sendFailureType 发送失败的类型  
35 - * @param sendFailureMsg 发送失败的提示  
36 - * @param apiSendFailureType 短信 API 发送失败的类型  
37 - * @param apiSendFailureMsg 短信 API 发送失败的提示 34 + * @param sendCode 发送结果的编码
  35 + * @param sendMsg 发送结果的提示
  36 + * @param apiSendCode 短信 API 发送结果的编码
  37 + * @param apiSendMsg 短信 API 发送失败的提示
38 * @param apiRequestId 短信 API 发送返回的唯一请求 ID 38 * @param apiRequestId 短信 API 发送返回的唯一请求 ID
39 * @param apiSerialNo 短信 API 发送返回的序号 39 * @param apiSerialNo 短信 API 发送返回的序号
40 */ 40 */
41 - void updateSmsSendLogResult(Long id, Boolean success, Integer sendFailureType, String sendFailureMsg,  
42 - String apiSendFailureType, String apiSendFailureMsg, String apiRequestId, String apiSerialNo);  
43 -  
44 - default void updateSmsSendLogFailure(Long id, SmsSendFailureTypeEnum sendFailureType) {  
45 - updateSmsSendLogResult(id, false, sendFailureType.getType(), sendFailureType.getMsg(),  
46 - null, null, null, null);  
47 - } 41 + void updateSmsSendResult(Long id, Integer sendCode, String sendMsg,
  42 + String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo);
48 43
49 } 44 }
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java
@@ -3,21 +3,17 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl; @@ -3,21 +3,17 @@ package cn.iocoder.dashboard.modules.system.service.sms.impl;
3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 import cn.iocoder.dashboard.framework.sms.core.client.SmsClientFactory; 5 import cn.iocoder.dashboard.framework.sms.core.client.SmsClientFactory;
6 -import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum;  
7 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; 6 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
8 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO; 7 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;
9 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; 8 import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO;
10 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO;  
11 import cn.iocoder.dashboard.modules.system.convert.sms.SmsChannelConvert; 9 import cn.iocoder.dashboard.modules.system.convert.sms.SmsChannelConvert;
12 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; 10 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
13 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsChannelMapper; 11 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsChannelMapper;
14 -import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper;  
15 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; 12 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
16 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
17 14
18 import javax.annotation.PostConstruct; 15 import javax.annotation.PostConstruct;
19 import javax.annotation.Resource; 16 import javax.annotation.Resource;
20 -import java.util.Arrays;  
21 import java.util.List; 17 import java.util.List;
22 18
23 /** 19 /**
@@ -35,12 +31,9 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { @@ -35,12 +31,9 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService {
35 @Resource 31 @Resource
36 private SysSmsChannelMapper channelMapper; 32 private SysSmsChannelMapper channelMapper;
37 33
38 - @Resource  
39 - private SysSmsTemplateMapper templateMapper;  
40 -  
41 @Override 34 @Override
42 @PostConstruct 35 @PostConstruct
43 - public void initSmsClientAndCacheSmsTemplate() { 36 + public void initSmsClients() {
44 // 查询有效渠道信息 37 // 查询有效渠道信息
45 List<SysSmsChannelDO> channelDOList = channelMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()); 38 List<SysSmsChannelDO> channelDOList = channelMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus());
46 // 创建渠道 Client 39 // 创建渠道 Client
@@ -48,6 +41,8 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { @@ -48,6 +41,8 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService {
48 propertiesList.forEach(properties -> smsClientFactory.createOrUpdateSmsClient(properties)); 41 propertiesList.forEach(properties -> smsClientFactory.createOrUpdateSmsClient(properties));
49 } 42 }
50 43
  44 + // TODO 芋艿:刷新缓存
  45 +
51 @Override 46 @Override
52 public PageResult<SysSmsChannelDO> pageSmsChannels(SmsChannelPageReqVO reqVO) { 47 public PageResult<SysSmsChannelDO> pageSmsChannels(SmsChannelPageReqVO reqVO) {
53 return channelMapper.selectChannelPage(reqVO); 48 return channelMapper.selectChannelPage(reqVO);
@@ -60,11 +55,6 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { @@ -60,11 +55,6 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService {
60 return channelDO.getId(); 55 return channelDO.getId();
61 } 56 }
62 57
63 - @Override  
64 - public List<SmsChannelEnumRespVO> getSmsChannelEnums() {  
65 - return SmsChannelConvert.INSTANCE.convertEnum(Arrays.asList(SmsChannelEnum.values()));  
66 - }  
67 -  
68 // @Override 58 // @Override
69 // public List<SmsChannelAllVO> listSmsChannelAllEnabledInfo() { 59 // public List<SmsChannelAllVO> listSmsChannelAllEnabledInfo() {
70 // List<SysSmsChannelDO> channelDOList = channelMapper.selectListByStatus(); 60 // List<SysSmsChannelDO> channelDOList = channelMapper.selectListByStatus();
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsSendLogServiceImpl.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.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsSendLogDO; 3 +import cn.iocoder.dashboard.common.pojo.CommonResult;
  4 +import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO;
4 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; 5 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
5 -import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsSendLogMapper; 6 +import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsLogMapper;
6 import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; 7 import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum;
7 -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsSendLogService; 8 +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService;
8 import lombok.extern.slf4j.Slf4j; 9 import lombok.extern.slf4j.Slf4j;
9 import org.springframework.stereotype.Service; 10 import org.springframework.stereotype.Service;
10 11
@@ -21,15 +22,18 @@ import java.util.Objects; @@ -21,15 +22,18 @@ import java.util.Objects;
21 */ 22 */
22 @Slf4j 23 @Slf4j
23 @Service 24 @Service
24 -public class SysSmsSendLogServiceImpl implements SysSmsSendLogService { 25 +public class SysSmsSendLogServiceImpl implements SysSmsLogService {
25 26
26 @Resource 27 @Resource
27 - private SysSmsSendLogMapper smsSendLogMapper; 28 + private SysSmsLogMapper smsLogMapper;
28 29
29 @Override 30 @Override
30 - public Long createSmsSendLog(String mobile, Long userId, Integer userType,  
31 - SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams) {  
32 - SysSmsSendLogDO.SysSmsSendLogDOBuilder logBuilder = SysSmsSendLogDO.builder(); 31 + public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend,
  32 + SysSmsTemplateDO template, String templateContent, Map<String, Object> templateParams) {
  33 + SysSmsLogDO.SysSmsLogDOBuilder logBuilder = SysSmsLogDO.builder();
  34 + // 根据是否要发送,设置状态
  35 + logBuilder.sendStatus(Objects.equals(isSend, true) ? SysSmsSendStatusEnum.INIT.getStatus()
  36 + : SysSmsSendStatusEnum.IGNORE.getStatus());
33 // 设置手机相关字段 37 // 设置手机相关字段
34 logBuilder.mobile(mobile).userId(userId).userType(userType); 38 logBuilder.mobile(mobile).userId(userId).userType(userType);
35 // 设置模板相关字段 39 // 设置模板相关字段
@@ -39,18 +43,18 @@ public class SysSmsSendLogServiceImpl implements SysSmsSendLogService { @@ -39,18 +43,18 @@ public class SysSmsSendLogServiceImpl implements SysSmsSendLogService {
39 logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode()); 43 logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode());
40 44
41 // 插入数据库 45 // 插入数据库
42 - SysSmsSendLogDO logDO = logBuilder.build();  
43 - smsSendLogMapper.insert(logDO); 46 + SysSmsLogDO logDO = logBuilder.build();
  47 + smsLogMapper.insert(logDO);
44 return logDO.getId(); 48 return logDO.getId();
45 } 49 }
46 50
47 @Override 51 @Override
48 - public void updateSmsSendLogResult(Long id, Boolean success, Integer sendFailureType, String sendFailureMsg,  
49 - String apiSendFailureType, String apiSendFailureMsg, String apiRequestId, String apiSerialNo) {  
50 - SysSmsSendStatusEnum sendStatus = Objects.equals(success, true) ? SysSmsSendStatusEnum.SUCCESS : SysSmsSendStatusEnum.FAILURE;  
51 - smsSendLogMapper.updateById(new SysSmsSendLogDO().setId(id).setSendStatus(sendStatus.getStatus()).setSendTime(new Date())  
52 - .setSendFailureType(sendFailureType).setSendFailureMsg(sendFailureMsg)  
53 - .setApiSendFailureType(apiSendFailureType).setApiSendFailureMsg(apiSendFailureMsg).setApiRequestId(apiRequestId).setApiSerialNo(apiSerialNo)); 52 + public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg,
  53 + String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo) {
  54 + SysSmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? SysSmsSendStatusEnum.SUCCESS : SysSmsSendStatusEnum.FAILURE;
  55 + smsLogMapper.updateById(SysSmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()).sendTime(new Date())
  56 + .sendCode(sendCode).sendMsg(sendMsg).apiSendCode(apiSendCode).apiSendMsg(apiSendMsg)
  57 + .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build());
54 } 58 }
55 59
56 } 60 }
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.util.StrUtil; 3 import cn.hutool.core.util.StrUtil;
  4 +import cn.iocoder.dashboard.common.core.KeyValue;
5 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 5 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
6 import cn.iocoder.dashboard.common.enums.UserTypeEnum; 6 import cn.iocoder.dashboard.common.enums.UserTypeEnum;
7 -import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;  
8 import cn.iocoder.dashboard.framework.sms.core.client.SmsClient; 7 import cn.iocoder.dashboard.framework.sms.core.client.SmsClient;
9 import cn.iocoder.dashboard.framework.sms.core.client.SmsClientFactory; 8 import cn.iocoder.dashboard.framework.sms.core.client.SmsClientFactory;
10 -import cn.iocoder.dashboard.framework.sms.core.enums.SmsSendFailureTypeEnum; 9 +import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;
  10 +import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
11 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; 11 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
12 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 12 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
13 import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage; 13 import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage;
14 import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer; 14 import cn.iocoder.dashboard.modules.system.mq.producer.sms.SysSmsProducer;
15 -import cn.iocoder.dashboard.modules.system.service.sms.SysSmsSendLogService; 15 +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
  16 +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService;
16 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; 17 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService;
17 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService; 18 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService;
18 import cn.iocoder.dashboard.modules.system.service.user.SysUserService; 19 import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
19 import lombok.extern.slf4j.Slf4j; 20 import lombok.extern.slf4j.Slf4j;
20 import org.springframework.stereotype.Service; 21 import org.springframework.stereotype.Service;
  22 +import org.springframework.util.Assert;
21 23
22 import javax.annotation.Resource; 24 import javax.annotation.Resource;
23 import javax.servlet.ServletRequest; 25 import javax.servlet.ServletRequest;
24 import java.util.List; 26 import java.util.List;
25 import java.util.Map; 27 import java.util.Map;
26 import java.util.Objects; 28 import java.util.Objects;
  29 +import java.util.stream.Collectors;
27 30
28 import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; 31 import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception;
29 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; 32 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
@@ -39,9 +42,11 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; @@ -39,9 +42,11 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
39 public class SysSmsServiceImpl implements SysSmsService { 42 public class SysSmsServiceImpl implements SysSmsService {
40 43
41 @Resource 44 @Resource
  45 + private SysSmsChannelService smsChannelService;
  46 + @Resource
42 private SysSmsTemplateService smsTemplateService; 47 private SysSmsTemplateService smsTemplateService;
43 @Resource 48 @Resource
44 - private SysSmsSendLogService smsSendLogService; 49 + private SysSmsLogService smsLogService;
45 @Resource 50 @Resource
46 private SysSmsProducer smsProducer; 51 private SysSmsProducer smsProducer;
47 @Resource 52 @Resource
@@ -54,53 +59,58 @@ public class SysSmsServiceImpl implements SysSmsService { @@ -54,53 +59,58 @@ public class SysSmsServiceImpl implements SysSmsService {
54 public void sendSingleSms(String mobile, Long userId, Integer userType, 59 public void sendSingleSms(String mobile, Long userId, Integer userType,
55 String templateCode, Map<String, Object> templateParams) { 60 String templateCode, Map<String, Object> templateParams) {
56 // 校验短信模板是否合法 61 // 校验短信模板是否合法
57 - SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode, templateParams); 62 + SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode);
58 // 校验手机号码是否存在 63 // 校验手机号码是否存在
59 mobile = this.checkMobile(mobile, userId, userType); 64 mobile = this.checkMobile(mobile, userId, userType);
60 65
61 // 创建发送日志 66 // 创建发送日志
  67 + Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); // 如果模板被禁用,则不发送短信,只记录日志
62 String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams); 68 String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams);
63 - Long sendLogId = smsSendLogService.createSmsSendLog(mobile, userId, userType, template, content, templateParams); 69 + Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams);
64 70
65 - // 如果模板被禁用,则直接标记发送失败。也就说,不发短信,嘿嘿。  
66 - if (CommonStatusEnum.DISABLE.getStatus().equals(template.getStatus())) {  
67 - smsSendLogService.updateSmsSendLogFailure(sendLogId, SmsSendFailureTypeEnum.SMS_TEMPLATE_DISABLE); 71 + // 发送 MQ 消息,异步执行发送短信
  72 + if (!isSend) {
68 return; 73 return;
69 } 74 }
70 - // 如果模板未禁用,发送 MQ 消息。目的是,异步化调用短信平台  
71 - smsProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(), template.getApiTemplateId(), templateParams); 75 + List<KeyValue<String, Object>> newTemplateParams = this.buildTemplateParams(template, templateParams);
  76 + smsProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(), template.getApiTemplateId(), newTemplateParams);
72 } 77 }
73 78
74 @Override 79 @Override
75 public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, 80 public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType,
76 String templateCode, Map<String, Object> templateParams) { 81 String templateCode, Map<String, Object> templateParams) {
77 // 校验短信模板是否存在 82 // 校验短信模板是否存在
78 - SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode, templateParams); 83 + SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode);
79 } 84 }
80 85
81 - private SysSmsTemplateDO checkSmsTemplateValid(String templateCode, Map<String, Object> templateParams) { 86 + private SysSmsTemplateDO checkSmsTemplateValid(String templateCode) {
82 // 短信模板不存在 87 // 短信模板不存在
83 SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCode(templateCode); 88 SysSmsTemplateDO template = smsTemplateService.getSmsTemplateByCode(templateCode);
84 if (template == null) { 89 if (template == null) {
85 throw exception(SMS_TEMPLATE_NOT_EXISTS); 90 throw exception(SMS_TEMPLATE_NOT_EXISTS);
86 } 91 }
87 - // 参数不够  
88 - if (CollUtil.isNotEmpty(template.getParams())) {  
89 - template.getParams().forEach(param -> {  
90 - if (!templateParams.containsKey(param)) {  
91 - throw exception(SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS);  
92 - }  
93 - });  
94 - }  
95 - // 移除多余参数  
96 - if (CollUtil.isEmpty(template.getParams())) {  
97 - templateParams.clear();  
98 - } else {  
99 - templateParams.entrySet().removeIf(entry -> !template.getParams().contains(entry.getKey()));  
100 - }  
101 return template; 92 return template;
102 } 93 }
103 94
  95 + /**
  96 + * 将参数模板,处理成有序的 KeyValue 数组
  97 + *
  98 + * 原因是,部分短信平台并不是使用 key 作为参数,而是数组下标,例如说腾讯云 https://cloud.tencent.com/document/product/382/39023
  99 + *
  100 + * @param template 短信模板
  101 + * @param templateParams 原始参数
  102 + * @return 处理后的参数
  103 + */
  104 + private List<KeyValue<String, Object>> buildTemplateParams(SysSmsTemplateDO template, Map<String, Object> templateParams) {
  105 + return template.getParams().stream().map(key -> {
  106 + Object value = templateParams.get(key);
  107 + if (value == null) {
  108 + throw exception(SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, key);
  109 + }
  110 + return new KeyValue<>(key, value);
  111 + }).collect(Collectors.toList());
  112 + }
  113 +
104 private String checkMobile(String mobile, Long userId, Integer userType) { 114 private String checkMobile(String mobile, Long userId, Integer userType) {
105 mobile = getMobile(mobile, userId, userType); 115 mobile = getMobile(mobile, userId, userType);
106 if (StrUtil.isEmpty(mobile)) { 116 if (StrUtil.isEmpty(mobile)) {
@@ -130,15 +140,12 @@ public class SysSmsServiceImpl implements SysSmsService { @@ -130,15 +140,12 @@ public class SysSmsServiceImpl implements SysSmsService {
130 public void doSendSms(SysSmsSendMessage message) { 140 public void doSendSms(SysSmsSendMessage message) {
131 // 获得渠道对应的 SmsClient 客户端 141 // 获得渠道对应的 SmsClient 客户端
132 SmsClient smsClient = smsClientFactory.getSmsClient(message.getChannelId()); 142 SmsClient smsClient = smsClientFactory.getSmsClient(message.getChannelId());
133 - if (smsClient == null) {  
134 - log.error("[doSendSms][短信 message({}) 找不到对应的客户端]", message);  
135 - smsSendLogService.updateSmsSendLogFailure(message.getSendLogId(), SmsSendFailureTypeEnum.SMS_CHANNEL_CLIENT_NOT_EXISTS);  
136 - return;  
137 - }  
138 - 143 + Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", message.getChannelId()));
139 // 发送短信 144 // 发送短信
140 - SmsCommonResult sendResult = smsClient.send(message.getSendLogId(), message.getMobile(), 145 + SmsCommonResult<SmsSendRespDTO> sendResult = smsClient.send(message.getLogId(), message.getMobile(),
141 message.getApiTemplateId(), message.getTemplateParams()); 146 message.getApiTemplateId(), message.getTemplateParams());
  147 + smsLogService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(),
  148 + sendResult.getApiCode(), sendResult.getApiMsg(), sendResult.getApiRequestId(), sendResult.getData().getSerialNo());
142 } 149 }
143 150
144 @Override 151 @Override
src/main/java/cn/iocoder/dashboard/util/collection/MapUtils.java
@@ -2,6 +2,8 @@ package cn.iocoder.dashboard.util.collection; @@ -2,6 +2,8 @@ package cn.iocoder.dashboard.util.collection;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.CollectionUtil; 4 import cn.hutool.core.collection.CollectionUtil;
  5 +import cn.iocoder.dashboard.common.core.KeyValue;
  6 +import com.google.common.collect.Maps;
5 import com.google.common.collect.Multimap; 7 import com.google.common.collect.Multimap;
6 8
7 import java.util.ArrayList; 9 import java.util.ArrayList;
@@ -55,4 +57,10 @@ public class MapUtils { @@ -55,4 +57,10 @@ public class MapUtils {
55 consumer.accept(value); 57 consumer.accept(value);
56 } 58 }
57 59
  60 + public static <K, V> Map<K, V> convertMap(List<KeyValue<K, V>> keyValues) {
  61 + Map<K, V> map = Maps.newLinkedHashMapWithExpectedSize(keyValues.size());
  62 + keyValues.forEach(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
  63 + return map;
  64 + }
  65 +
58 } 66 }
src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java
1 package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun; 1 package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun;
2 2
  3 +import cn.iocoder.dashboard.common.core.KeyValue;
3 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; 4 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;
  5 +import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
4 import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; 6 import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum;
5 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; 7 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
6 import org.junit.jupiter.api.Test; 8 import org.junit.jupiter.api.Test;
7 9
8 -import java.util.HashMap;  
9 -import java.util.Map; 10 +import java.util.ArrayList;
  11 +import java.util.List;
10 12
11 /** 13 /**
12 * {@link AliyunSmsClient} 的集成测试 14 * {@link AliyunSmsClient} 的集成测试
@@ -26,11 +28,11 @@ public class AliyunSmsClientTest { @@ -26,11 +28,11 @@ public class AliyunSmsClientTest {
26 AliyunSmsClient smsClient = new AliyunSmsClient(properties); 28 AliyunSmsClient smsClient = new AliyunSmsClient(properties);
27 smsClient.init(); 29 smsClient.init();
28 // 发送短信 30 // 发送短信
29 - Map<String, Object> templateParams = new HashMap<>();  
30 - templateParams.put("code", "1024"); 31 + List<KeyValue<String, Object>> templateParams = new ArrayList<>();
  32 + templateParams.add(new KeyValue<>("code", "1024"));
31 // templateParams.put("operation", "嘿嘿"); 33 // templateParams.put("operation", "嘿嘿");
32 // SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams); 34 // SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams);
33 - SmsCommonResult result = smsClient.send(1L, "15601691399", "SMS_207945135", templateParams); 35 + SmsCommonResult<SmsSendRespDTO> result = smsClient.send(1L, "15601691399", "SMS_207945135", templateParams);
34 System.out.println(result); 36 System.out.println(result);
35 } 37 }
36 38
src/test-integration/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java
1 package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian; 1 package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian;
2 2
  3 +import cn.iocoder.dashboard.common.core.KeyValue;
3 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; 4 import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult;
  5 +import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO;
4 import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; 6 import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum;
5 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; 7 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
6 import org.junit.jupiter.api.Test; 8 import org.junit.jupiter.api.Test;
7 9
8 -import java.util.HashMap;  
9 -import java.util.Map; 10 +import java.util.ArrayList;
  11 +import java.util.List;
10 12
11 /** 13 /**
12 * {@link YunpianSmsClient} 的集成测试 14 * {@link YunpianSmsClient} 的集成测试
@@ -25,11 +27,11 @@ public class YunpianSmsClientIntegrationTest { @@ -25,11 +27,11 @@ public class YunpianSmsClientIntegrationTest {
25 YunpianSmsClient smsClient = new YunpianSmsClient(properties); 27 YunpianSmsClient smsClient = new YunpianSmsClient(properties);
26 smsClient.init(); 28 smsClient.init();
27 // 发送短信 29 // 发送短信
28 - Map<String, Object> templateParams = new HashMap<>();  
29 - templateParams.put("code", "1024");  
30 - templateParams.put("operation", "嘿嘿"); 30 + List<KeyValue<String, Object>> templateParams = new ArrayList<>();
  31 + templateParams.add(new KeyValue<>("code", "1024"));
  32 + templateParams.add(new KeyValue<>("operation", "嘿嘿"));
31 // SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams); 33 // SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams);
32 - SmsCommonResult result = smsClient.send(1L, "15601691399", "4383920", templateParams); 34 + SmsCommonResult<SmsSendRespDTO> result = smsClient.send(1L, "15601691399", "4383920", templateParams);
33 System.out.println(result); 35 System.out.println(result);
34 } 36 }
35 37