Commit 70920a4258a3fd9700e87543881c362336982313

Authored by xp.Huang
2 parents 909b7d02 069db809

Merge branch '20220906' into 'master'

fix: 租户角色不存在时,第二次提交表单提示用户名已经存在的问题

See merge request huang/thingsboard3.3.2!128
@@ -130,8 +130,6 @@ public class YtAdminController extends BaseController { @@ -130,8 +130,6 @@ public class YtAdminController extends BaseController {
130 UserDTO userDTO = userService.findUserInfoById(strUserId); 130 UserDTO userDTO = userService.findUserInfoById(strUserId);
131 if (null != userDTO && StringUtils.isNotBlank(userDTO.getTbUser())) { 131 if (null != userDTO && StringUtils.isNotBlank(userDTO.getTbUser())) {
132 deleteTenantAdmin(userDTO.getTbUser()); 132 deleteTenantAdmin(userDTO.getTbUser());
133 - } else {  
134 - return ResponseEntity.ok(false);  
135 } 133 }
136 } 134 }
137 boolean result = 135 boolean result =
@@ -22,6 +22,9 @@ import org.thingsboard.server.common.data.id.TenantId; @@ -22,6 +22,9 @@ import org.thingsboard.server.common.data.id.TenantId;
22 import org.thingsboard.server.common.data.page.PageLink; 22 import org.thingsboard.server.common.data.page.PageLink;
23 import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; 23 import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
24 import org.thingsboard.server.common.data.yunteng.common.DeleteGroup; 24 import org.thingsboard.server.common.data.yunteng.common.DeleteGroup;
  25 +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
  26 +import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException;
  27 +import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
25 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; 28 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
26 import org.thingsboard.server.common.data.yunteng.dto.DeviceProfileDTO; 29 import org.thingsboard.server.common.data.yunteng.dto.DeviceProfileDTO;
27 import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum; 30 import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum;
@@ -84,6 +87,9 @@ public class YtDeviceProfileController extends BaseController { @@ -84,6 +87,9 @@ public class YtDeviceProfileController extends BaseController {
84 if (!Objects.equals(deviceProfile.getSoftwareId(), oldDeviceProfile.getSoftwareId())) { 87 if (!Objects.equals(deviceProfile.getSoftwareId(), oldDeviceProfile.getSoftwareId())) {
85 isSoftwareChanged = true; 88 isSoftwareChanged = true;
86 } 89 }
  90 + if (FastIotConstants.ASSERT_DEFAULT_NAME.equals(oldDeviceProfile.getName()) && !Objects.equals(deviceProfile.getName(), oldDeviceProfile.getName())) {
  91 + throw new YtDataValidationException(ErrorMessage.ASSERT_DEFAULT_NAME_NO_CHANGED.getMessage());
  92 + }
87 } 93 }
88 94
89 DeviceProfile savedDeviceProfile = checkNotNull(deviceProfileService.saveDeviceProfile(deviceProfile)); 95 DeviceProfile savedDeviceProfile = checkNotNull(deviceProfileService.saveDeviceProfile(deviceProfile));
@@ -185,9 +185,9 @@ public class YtUserController extends AbstractUserAccount { @@ -185,9 +185,9 @@ public class YtUserController extends AbstractUserAccount {
185 throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); 185 throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
186 } 186 }
187 userService.validateUserNameAndPhoneNumberAndEmail(userDTO); 187 userService.validateUserNameAndPhoneNumberAndEmail(userDTO);
  188 + userService.validateTenantRole(userDTO.getTenantId());
  189 + //租户角色不存在,会留存脏数据
188 TenantId tenantId = TenantId.fromUUID(UUID.fromString(userDTO.getTenantId())); 190 TenantId tenantId = TenantId.fromUUID(UUID.fromString(userDTO.getTenantId()));
189 - UserDTO returnUser = userService.saveTenantAdmin(  
190 - userDTO, getCurrentUser().isPtSysadmin(), tenantId.getId().toString());  
191 try { 191 try {
192 // 创建TB的租户管理员 192 // 创建TB的租户管理员
193 CustomerId customerId = new CustomerId(EntityId.NULL_UUID); 193 CustomerId customerId = new CustomerId(EntityId.NULL_UUID);
@@ -202,7 +202,8 @@ public class YtUserController extends AbstractUserAccount { @@ -202,7 +202,8 @@ public class YtUserController extends AbstractUserAccount {
202 throw handleException(e); 202 throw handleException(e);
203 } 203 }
204 204
205 - return returnUser; 205 + return userService.saveTenantAdmin(
  206 + userDTO, getCurrentUser().isPtSysadmin(), tenantId.getId().toString());
206 } 207 }
207 208
208 @DeleteMapping 209 @DeleteMapping
@@ -11,6 +11,7 @@ public interface FastIotConstants { @@ -11,6 +11,7 @@ public interface FastIotConstants {
11 String FIRST_PAGE_NAME = "第 1 页"; 11 String FIRST_PAGE_NAME = "第 1 页";
12 String CHART_EXECUTE_CONDITION = "executeCondition"; 12 String CHART_EXECUTE_CONDITION = "executeCondition";
13 String CHART_EXECUTE_ATTRIBUTES = "executeAttributes"; 13 String CHART_EXECUTE_ATTRIBUTES = "executeAttributes";
  14 + String ASSERT_DEFAULT_NAME = "default";
14 class DefaultOrder { 15 class DefaultOrder {
15 public static final String CREATE_TIME="create_time"; 16 public static final String CREATE_TIME="create_time";
16 } 17 }
@@ -73,6 +73,8 @@ public enum ErrorMessage { @@ -73,6 +73,8 @@ public enum ErrorMessage {
73 EXPORT_CONFIG_NON_EXISTENT(400053,"报表配置不存在或已被删除"), 73 EXPORT_CONFIG_NON_EXISTENT(400053,"报表配置不存在或已被删除"),
74 START_TIME_NOT_MORE_THAN_END_TIME(400054,"开始时间不能大于结束时间"), 74 START_TIME_NOT_MORE_THAN_END_TIME(400054,"开始时间不能大于结束时间"),
75 START_TIME_OR_END_TIME_EXCEPTION(400055,"开始时间或结束时间异常"), 75 START_TIME_OR_END_TIME_EXCEPTION(400055,"开始时间或结束时间异常"),
  76 + TARGET_TEMPLATE_NOT_EXISTS_SELF_NOTICE(400056,"密码重置成功,请自行通知用户!"),
  77 + ASSERT_DEFAULT_NAME_NO_CHANGED(400056,"系统预制资源,不能修改名称!"),
76 HAVE_NO_PERMISSION(500002,"没有修改权限"); 78 HAVE_NO_PERMISSION(500002,"没有修改权限");
77 private final int code; 79 private final int code;
78 private String message; 80 private String message;
@@ -128,7 +128,7 @@ public class AlarmProfileServiceImpl extends AbstractBaseService<AlarmProfileMap @@ -128,7 +128,7 @@ public class AlarmProfileServiceImpl extends AbstractBaseService<AlarmProfileMap
128 sceneIds.add(action.getSceneLinkageId()); 128 sceneIds.add(action.getSceneLinkageId());
129 } 129 }
130 List<SceneLinkage> scenes = sceneLinkageMapper.selectList(new QueryWrapper<SceneLinkage>().lambda() 130 List<SceneLinkage> scenes = sceneLinkageMapper.selectList(new QueryWrapper<SceneLinkage>().lambda()
131 - .eq(SceneLinkage::getId, sceneIds) 131 + .in(SceneLinkage::getId, sceneIds)
132 ); 132 );
133 for(SceneLinkage item: scenes){ 133 for(SceneLinkage item: scenes){
134 sceneNames.add(item.getName()); 134 sceneNames.add(item.getName());
@@ -427,15 +427,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> @@ -427,15 +427,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
427 throw new YtDataValidationException("用户已存在"); 427 throw new YtDataValidationException("用户已存在");
428 } 428 }
429 baseMapper.insert(user); 429 baseMapper.insert(user);
430 - List<TenantRole> tenantRoleList =  
431 - tenantRoleMapper.selectList(  
432 - new QueryWrapper<TenantRole>()  
433 - .lambda()  
434 - .eq(TenantRole::getTenantId, userDTO.getTenantId()));  
435 - // 保存用户与角色的映射信息  
436 - if (null == tenantRoleList || tenantRoleList.size() == 0) {  
437 - throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());  
438 - } 430 + List<TenantRole> tenantRoleList =validateTenantRole(userDTO.getTenantId()) ;
439 for (TenantRole tenantRole : tenantRoleList) { 431 for (TenantRole tenantRole : tenantRoleList) {
440 roleMapper.saveUserRoleMapping(user.getId(), tenantRole.getRoleId()); 432 roleMapper.saveUserRoleMapping(user.getId(), tenantRole.getRoleId());
441 } 433 }
@@ -444,6 +436,20 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> @@ -444,6 +436,20 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
444 } 436 }
445 437
446 @Override 438 @Override
  439 + public List<TenantRole> validateTenantRole(String tenantId) {
  440 + List<TenantRole> tenantRoleList =
  441 + tenantRoleMapper.selectList(
  442 + new QueryWrapper<TenantRole>()
  443 + .lambda()
  444 + .eq(TenantRole::getTenantId, tenantId));
  445 + // 保存用户与角色的映射信息
  446 + if (null == tenantRoleList || tenantRoleList.size() == 0) {
  447 + throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
  448 + }
  449 + return tenantRoleList;
  450 + }
  451 +
  452 + @Override
447 @Transactional 453 @Transactional
448 public void resetPassword(String userId, String tenantId, String password) { 454 public void resetPassword(String userId, String tenantId, String password) {
449 UserDTO userDTO = findUserInfoById(userId); 455 UserDTO userDTO = findUserInfoById(userId);
@@ -527,7 +533,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> @@ -527,7 +533,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
527 List<MessageTemplateDTO> templateDTOList = 533 List<MessageTemplateDTO> templateDTOList =
528 messageTemplateService.findMessageTemplate(messageTemplateDTO); 534 messageTemplateService.findMessageTemplate(messageTemplateDTO);
529 if (null == templateDTOList || templateDTOList.size() < 1) { 535 if (null == templateDTOList || templateDTOList.size() < 1) {
530 - throw new YtDataValidationException(ErrorMessage.TARGET_TEMPLATE_NOT_EXISTS.getMessage()); 536 + throw new YtDataValidationException(ErrorMessage.TARGET_TEMPLATE_NOT_EXISTS_SELF_NOTICE.getMessage());
531 } 537 }
532 if (messageType.equalsIgnoreCase(MessageTypeEnum.PHONE_MESSAGE.name())) { 538 if (messageType.equalsIgnoreCase(MessageTypeEnum.PHONE_MESSAGE.name())) {
533 SmsReqDTO smsReqDTO = new SmsReqDTO(); 539 SmsReqDTO smsReqDTO = new SmsReqDTO();
@@ -8,6 +8,7 @@ import org.thingsboard.server.common.data.yunteng.dto.request.AccountReqDTO; @@ -8,6 +8,7 @@ import org.thingsboard.server.common.data.yunteng.dto.request.AccountReqDTO;
8 import org.thingsboard.server.common.data.yunteng.dto.request.RoleOrOrganizationReqDTO; 8 import org.thingsboard.server.common.data.yunteng.dto.request.RoleOrOrganizationReqDTO;
9 import org.thingsboard.server.common.data.yunteng.dto.request.SendResetPasswordEmailMsg; 9 import org.thingsboard.server.common.data.yunteng.dto.request.SendResetPasswordEmailMsg;
10 import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData; 10 import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
  11 +import org.thingsboard.server.dao.yunteng.entities.TenantRole;
11 import org.thingsboard.server.dao.yunteng.entities.User; 12 import org.thingsboard.server.dao.yunteng.entities.User;
12 13
13 import java.time.LocalDateTime; 14 import java.time.LocalDateTime;
@@ -48,6 +49,12 @@ public interface YtUserService { @@ -48,6 +49,12 @@ public interface YtUserService {
48 49
49 void validateUserNameAndPhoneNumberAndEmail(UserDTO userDTO); 50 void validateUserNameAndPhoneNumberAndEmail(UserDTO userDTO);
50 51
  52 + /**
  53 + * 验证租户角色是否有效
  54 + * @param tenantId
  55 + */
  56 + List<TenantRole> validateTenantRole(String tenantId);
  57 +
51 UserDTO findUserInfoById(String id); 58 UserDTO findUserInfoById(String id);
52 /** 59 /**
53 * 发送密码重置新消息 60 * 发送密码重置新消息