Commit 4af840a21b0c340fe5ddde536686ba42b089fbc6

Authored by 黄 x
1 parent e5be8978

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

... ... @@ -85,6 +85,7 @@ public enum ErrorMessage {
85 85 PROJECT_USED_SCRIPT(400061,"产品【%s】正在使用待删除的解析脚本"),
86 86 RULE_CHAIN_NOT_ENABLE(400062,"规则链不是有效的!"),
87 87 DUPLICATE_IDENTIFIERS_EXIST(400063,"存在重复的功能标识符。"),
  88 + SMS_CONFIG_ERROR(400064,"短信配置错误。"),
88 89 HAVE_NO_PERMISSION(500002,"没有修改权限");
89 90 private final int code;
90 91 private String message;
... ...
1 1 package org.thingsboard.server.dao.yunteng.impl;
2 2
3   -
4 3 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 4 import com.fasterxml.jackson.databind.JsonNode;
6 5 import com.fasterxml.jackson.databind.node.ObjectNode;
... ... @@ -19,10 +18,7 @@ import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidatio
19 18 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
20 19 import org.thingsboard.server.common.data.yunteng.dto.request.CodeTTL;
21 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 22 import org.thingsboard.server.dao.yunteng.entities.TkMessageConfigEntity;
27 23 import org.thingsboard.server.dao.yunteng.entities.TkMessageTemplateEntity;
28 24 import org.thingsboard.server.dao.yunteng.entities.TkSmsLogEntity;
... ... @@ -66,44 +62,60 @@ public class TkSmsServiceImpl implements TkSmsService {
66 62 if (StringUtils.isEmpty(phoneNumbers) || StringUtils.isEmpty(templateId)) {
67 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 74 if (null == messageTemplate) {
76 75 throw new YtDataValidationException(ErrorMessage.MESSAGE_TEMPLATE_NOT_EXISTS.getMessage());
77 76 }
78 77
79   - /**消息配置是否可用*/
  78 + /** 消息配置是否可用 */
80 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 85 if (null == messageConfig) {
87 86 throw new YtDataValidationException(ErrorMessage.MESSAGE_CONFIG_NOT_EXISTS.getMessage());
88 87 }
89 88
90 89 JsonNode configJsonNode = messageConfig.getConfig();
91 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 105 SmsProviderConfiguration smsProviderConfiguration =
94   - JacksonUtil.convertValue(configObjectNode, SmsProviderConfiguration.class);
  106 + JacksonUtil.convertValue(configObjectNode, SmsProviderConfiguration.class);
95 107 if (null != smsProviderConfiguration) {
96 108 SmsSender smsSender = ytDefaultSmsSenderFactory.createSmsSender(smsProviderConfiguration);
97 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 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 119 status = ResponseCodeEnum.FAILED.name();
108 120 remark += result;
109 121 }
... ... @@ -123,18 +135,21 @@ public class TkSmsServiceImpl implements TkSmsService {
123 135 return false;
124 136 }
125 137
126   -
127 138 @Override
128 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 147 if (users.isEmpty()) {
134 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 155 String key =
... ... @@ -157,28 +172,27 @@ public class TkSmsServiceImpl implements TkSmsService {
157 172 throw new YtDataValidationException(ErrorMessage.MESSAGE_SEND_TOO_FAST.getMessage());
158 173 }
159 174
160   - /**消息模板是否可用*/
  175 + /** 消息模板是否可用 */
161 176 List<TkMessageTemplateEntity> messageTemplates =
162 177 messageTemplateMapper.selectList(
163 178 new QueryWrapper<TkMessageTemplateEntity>()
164 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 184 if (messageTemplates.isEmpty()) {
170 185 throw new YtDataValidationException(ErrorMessage.MESSAGE_TEMPLATE_NOT_EXISTS.getMessage());
171 186 }
172 187
173   - /**消息配置是否可用*/
174   -
  188 + /** 消息配置是否可用 */
175 189 TkMessageTemplateEntity messageTemplate = messageTemplates.get(0);
176 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 196 if (null == messageConfig) {
183 197 throw new YtDataValidationException(ErrorMessage.MESSAGE_CONFIG_NOT_EXISTS.getMessage());
184 198 }
... ...