Commit 4af840a21b0c340fe5ddde536686ba42b089fbc6

Authored by 黄 x
1 parent e5be8978

fix: [DEFECT-905] sms config error throw exception

@@ -85,6 +85,7 @@ public enum ErrorMessage { @@ -85,6 +85,7 @@ public enum ErrorMessage {
85 PROJECT_USED_SCRIPT(400061,"产品【%s】正在使用待删除的解析脚本"), 85 PROJECT_USED_SCRIPT(400061,"产品【%s】正在使用待删除的解析脚本"),
86 RULE_CHAIN_NOT_ENABLE(400062,"规则链不是有效的!"), 86 RULE_CHAIN_NOT_ENABLE(400062,"规则链不是有效的!"),
87 DUPLICATE_IDENTIFIERS_EXIST(400063,"存在重复的功能标识符。"), 87 DUPLICATE_IDENTIFIERS_EXIST(400063,"存在重复的功能标识符。"),
  88 + SMS_CONFIG_ERROR(400064,"短信配置错误。"),
88 HAVE_NO_PERMISSION(500002,"没有修改权限"); 89 HAVE_NO_PERMISSION(500002,"没有修改权限");
89 private final int code; 90 private final int code;
90 private String message; 91 private String message;
1 package org.thingsboard.server.dao.yunteng.impl; 1 package org.thingsboard.server.dao.yunteng.impl;
2 2
3 -  
4 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 3 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 import com.fasterxml.jackson.databind.JsonNode; 4 import com.fasterxml.jackson.databind.JsonNode;
6 import com.fasterxml.jackson.databind.node.ObjectNode; 5 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -19,10 +18,7 @@ import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidatio @@ -19,10 +18,7 @@ import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidatio
19 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; 18 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
20 import org.thingsboard.server.common.data.yunteng.dto.request.CodeTTL; 19 import org.thingsboard.server.common.data.yunteng.dto.request.CodeTTL;
21 import org.thingsboard.server.common.data.yunteng.dto.request.SmsReqDTO; 20 import org.thingsboard.server.common.data.yunteng.dto.request.SmsReqDTO;
22 -import org.thingsboard.server.common.data.yunteng.enums.AssetStatusEnum;  
23 -import org.thingsboard.server.common.data.yunteng.enums.MessageTypeEnum;  
24 -import org.thingsboard.server.common.data.yunteng.enums.MsgTemplatePurposeEnum;  
25 -import org.thingsboard.server.common.data.yunteng.enums.ResponseCodeEnum; 21 +import org.thingsboard.server.common.data.yunteng.enums.*;
26 import org.thingsboard.server.dao.yunteng.entities.TkMessageConfigEntity; 22 import org.thingsboard.server.dao.yunteng.entities.TkMessageConfigEntity;
27 import org.thingsboard.server.dao.yunteng.entities.TkMessageTemplateEntity; 23 import org.thingsboard.server.dao.yunteng.entities.TkMessageTemplateEntity;
28 import org.thingsboard.server.dao.yunteng.entities.TkSmsLogEntity; 24 import org.thingsboard.server.dao.yunteng.entities.TkSmsLogEntity;
@@ -66,44 +62,60 @@ public class TkSmsServiceImpl implements TkSmsService { @@ -66,44 +62,60 @@ public class TkSmsServiceImpl implements TkSmsService {
66 if (StringUtils.isEmpty(phoneNumbers) || StringUtils.isEmpty(templateId)) { 62 if (StringUtils.isEmpty(phoneNumbers) || StringUtils.isEmpty(templateId)) {
67 throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); 63 throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
68 } 64 }
69 - /**消息模板是否可用*/  
70 - QueryWrapper<TkMessageTemplateEntity> messageTemplateQueryWrapper = new QueryWrapper<TkMessageTemplateEntity>();  
71 - messageTemplateQueryWrapper.lambda()  
72 - .eq(TkMessageTemplateEntity::getId, templateId)  
73 - .eq(TkMessageTemplateEntity::getStatus, AssetStatusEnum.ENABLE.ordinal());  
74 - TkMessageTemplateEntity messageTemplate = messageTemplateMapper.selectOne(messageTemplateQueryWrapper); 65 + /** 消息模板是否可用 */
  66 + QueryWrapper<TkMessageTemplateEntity> messageTemplateQueryWrapper =
  67 + new QueryWrapper<TkMessageTemplateEntity>();
  68 + messageTemplateQueryWrapper
  69 + .lambda()
  70 + .eq(TkMessageTemplateEntity::getId, templateId)
  71 + .eq(TkMessageTemplateEntity::getStatus, AssetStatusEnum.ENABLE.ordinal());
  72 + TkMessageTemplateEntity messageTemplate =
  73 + messageTemplateMapper.selectOne(messageTemplateQueryWrapper);
75 if (null == messageTemplate) { 74 if (null == messageTemplate) {
76 throw new YtDataValidationException(ErrorMessage.MESSAGE_TEMPLATE_NOT_EXISTS.getMessage()); 75 throw new YtDataValidationException(ErrorMessage.MESSAGE_TEMPLATE_NOT_EXISTS.getMessage());
77 } 76 }
78 77
79 - /**消息配置是否可用*/ 78 + /** 消息配置是否可用 */
80 QueryWrapper<TkMessageConfigEntity> configQueryWrapper = new QueryWrapper<>(); 79 QueryWrapper<TkMessageConfigEntity> configQueryWrapper = new QueryWrapper<>();
81 - configQueryWrapper.lambda()  
82 - .eq(TkMessageConfigEntity::getId, messageTemplate.getMessageConfigId())  
83 - .eq(TkMessageConfigEntity::getStatus, AssetStatusEnum.ENABLE.ordinal());  
84 - TkMessageConfigEntity messageConfig =  
85 - messageConfigMapper.selectOne(configQueryWrapper); 80 + configQueryWrapper
  81 + .lambda()
  82 + .eq(TkMessageConfigEntity::getId, messageTemplate.getMessageConfigId())
  83 + .eq(TkMessageConfigEntity::getStatus, AssetStatusEnum.ENABLE.ordinal());
  84 + TkMessageConfigEntity messageConfig = messageConfigMapper.selectOne(configQueryWrapper);
86 if (null == messageConfig) { 85 if (null == messageConfig) {
87 throw new YtDataValidationException(ErrorMessage.MESSAGE_CONFIG_NOT_EXISTS.getMessage()); 86 throw new YtDataValidationException(ErrorMessage.MESSAGE_CONFIG_NOT_EXISTS.getMessage());
88 } 87 }
89 88
90 JsonNode configJsonNode = messageConfig.getConfig(); 89 JsonNode configJsonNode = messageConfig.getConfig();
91 ObjectNode configObjectNode = (ObjectNode) configJsonNode; 90 ObjectNode configObjectNode = (ObjectNode) configJsonNode;
92 - configObjectNode.put("type", messageConfig.getPlatformType()); 91 + String platForm = messageConfig.getPlatformType();
  92 + configObjectNode.put("type", platForm);
  93 + boolean isMatch = true;
  94 + if (platForm.equals(SmsProviderTypeEnum.TENCENT_CLOUD.name())
  95 + && (null == configJsonNode.get("appId") || null == configJsonNode.get("appKey"))) {
  96 + isMatch = false;
  97 + } else if (platForm.equals(SmsProviderTypeEnum.ALI_CLOUD.name())
  98 + && (null == configJsonNode.get("accessKeyId")
  99 + || null == configJsonNode.get("accessKeySecret"))) {
  100 + isMatch = false;
  101 + }
  102 + if (!isMatch) {
  103 + throw new YtDataValidationException(ErrorMessage.SMS_CONFIG_ERROR.getMessage());
  104 + }
93 SmsProviderConfiguration smsProviderConfiguration = 105 SmsProviderConfiguration smsProviderConfiguration =
94 - JacksonUtil.convertValue(configObjectNode, SmsProviderConfiguration.class); 106 + JacksonUtil.convertValue(configObjectNode, SmsProviderConfiguration.class);
95 if (null != smsProviderConfiguration) { 107 if (null != smsProviderConfiguration) {
96 SmsSender smsSender = ytDefaultSmsSenderFactory.createSmsSender(smsProviderConfiguration); 108 SmsSender smsSender = ytDefaultSmsSenderFactory.createSmsSender(smsProviderConfiguration);
97 String result = 109 String result =
98 - smsSender.sendSms(  
99 - phoneNumbers,  
100 - messageTemplate.getTemplateCode(),  
101 - templateParam,  
102 - messageTemplate.getSignName()); 110 + smsSender.sendSms(
  111 + phoneNumbers,
  112 + messageTemplate.getTemplateCode(),
  113 + templateParam,
  114 + messageTemplate.getSignName());
103 // 记录短信日志 115 // 记录短信日志
104 String status = ResponseCodeEnum.SUCCESS.name(); 116 String status = ResponseCodeEnum.SUCCESS.name();
105 - String remark = smsReqDTO.getRemark()==null?"":smsReqDTO.getRemark();  
106 - if(!ResponseCodeEnum.SUCCESS.name().equals(result)){ 117 + String remark = smsReqDTO.getRemark() == null ? "" : smsReqDTO.getRemark();
  118 + if (!ResponseCodeEnum.SUCCESS.name().equals(result)) {
107 status = ResponseCodeEnum.FAILED.name(); 119 status = ResponseCodeEnum.FAILED.name();
108 remark += result; 120 remark += result;
109 } 121 }
@@ -123,18 +135,21 @@ public class TkSmsServiceImpl implements TkSmsService { @@ -123,18 +135,21 @@ public class TkSmsServiceImpl implements TkSmsService {
123 return false; 135 return false;
124 } 136 }
125 137
126 -  
127 @Override 138 @Override
128 @Transactional 139 @Transactional
129 - public boolean sendSmsCode(String phoneNumber,MsgTemplatePurposeEnum purpose) { 140 + public boolean sendSmsCode(String phoneNumber, MsgTemplatePurposeEnum purpose) {
130 // 检查手机号码是否存在系统,以免乱发消息 141 // 检查手机号码是否存在系统,以免乱发消息
131 - List<SysUserEntity> users = userMapper  
132 - .selectList(new QueryWrapper<SysUserEntity>().lambda().eq(SysUserEntity::getPhoneNumber, phoneNumber)); 142 + List<SysUserEntity> users =
  143 + userMapper.selectList(
  144 + new QueryWrapper<SysUserEntity>()
  145 + .lambda()
  146 + .eq(SysUserEntity::getPhoneNumber, phoneNumber));
133 if (users.isEmpty()) { 147 if (users.isEmpty()) {
134 throw new YtDataValidationException("电话号码未在系统注册,请联系你的管理员"); 148 throw new YtDataValidationException("电话号码未在系统注册,请联系你的管理员");
135 } 149 }
136 - if(users.get(0).getAccountExpireTime() != null && users.get(0).getAccountExpireTime().isBefore(LocalDateTime.now())){  
137 - throw new YtDataValidationException(ErrorMessage.ACCOUNT_HAS_EXPIRED.getMessage()); 150 + if (users.get(0).getAccountExpireTime() != null
  151 + && users.get(0).getAccountExpireTime().isBefore(LocalDateTime.now())) {
  152 + throw new YtDataValidationException(ErrorMessage.ACCOUNT_HAS_EXPIRED.getMessage());
138 } 153 }
139 // 获取是否有验证码存在,防止发送数量过多 154 // 获取是否有验证码存在,防止发送数量过多
140 String key = 155 String key =
@@ -157,28 +172,27 @@ public class TkSmsServiceImpl implements TkSmsService { @@ -157,28 +172,27 @@ public class TkSmsServiceImpl implements TkSmsService {
157 throw new YtDataValidationException(ErrorMessage.MESSAGE_SEND_TOO_FAST.getMessage()); 172 throw new YtDataValidationException(ErrorMessage.MESSAGE_SEND_TOO_FAST.getMessage());
158 } 173 }
159 174
160 - /**消息模板是否可用*/ 175 + /** 消息模板是否可用 */
161 List<TkMessageTemplateEntity> messageTemplates = 176 List<TkMessageTemplateEntity> messageTemplates =
162 messageTemplateMapper.selectList( 177 messageTemplateMapper.selectList(
163 new QueryWrapper<TkMessageTemplateEntity>() 178 new QueryWrapper<TkMessageTemplateEntity>()
164 .lambda() 179 .lambda()
165 - .eq(TkMessageTemplateEntity::getTenantId, users.get(0).getTenantId())  
166 - .eq(TkMessageTemplateEntity::getStatus, 1)  
167 - .eq(TkMessageTemplateEntity::getTemplatePurpose, purpose.name())  
168 - .eq(TkMessageTemplateEntity::getMessageType, MessageTypeEnum.PHONE_MESSAGE.name())); 180 + .eq(TkMessageTemplateEntity::getTenantId, users.get(0).getTenantId())
  181 + .eq(TkMessageTemplateEntity::getStatus, 1)
  182 + .eq(TkMessageTemplateEntity::getTemplatePurpose, purpose.name())
  183 + .eq(TkMessageTemplateEntity::getMessageType, MessageTypeEnum.PHONE_MESSAGE.name()));
169 if (messageTemplates.isEmpty()) { 184 if (messageTemplates.isEmpty()) {
170 throw new YtDataValidationException(ErrorMessage.MESSAGE_TEMPLATE_NOT_EXISTS.getMessage()); 185 throw new YtDataValidationException(ErrorMessage.MESSAGE_TEMPLATE_NOT_EXISTS.getMessage());
171 } 186 }
172 187
173 - /**消息配置是否可用*/  
174 - 188 + /** 消息配置是否可用 */
175 TkMessageTemplateEntity messageTemplate = messageTemplates.get(0); 189 TkMessageTemplateEntity messageTemplate = messageTemplates.get(0);
176 QueryWrapper<TkMessageConfigEntity> configQueryWrapper = new QueryWrapper<>(); 190 QueryWrapper<TkMessageConfigEntity> configQueryWrapper = new QueryWrapper<>();
177 - configQueryWrapper.lambda()  
178 - .eq(TkMessageConfigEntity::getId, messageTemplate.getMessageConfigId())  
179 - .eq(TkMessageConfigEntity::getStatus, AssetStatusEnum.ENABLE.ordinal());  
180 - TkMessageConfigEntity messageConfig =  
181 - messageConfigMapper.selectOne(configQueryWrapper); 191 + configQueryWrapper
  192 + .lambda()
  193 + .eq(TkMessageConfigEntity::getId, messageTemplate.getMessageConfigId())
  194 + .eq(TkMessageConfigEntity::getStatus, AssetStatusEnum.ENABLE.ordinal());
  195 + TkMessageConfigEntity messageConfig = messageConfigMapper.selectOne(configQueryWrapper);
182 if (null == messageConfig) { 196 if (null == messageConfig) {
183 throw new YtDataValidationException(ErrorMessage.MESSAGE_CONFIG_NOT_EXISTS.getMessage()); 197 throw new YtDataValidationException(ErrorMessage.MESSAGE_CONFIG_NOT_EXISTS.getMessage());
184 } 198 }