Commit c1f7842e240c33192f7889d0381a286caf8f2360

Authored by 云中非
2 parents 131d7496 eea90075

Merge branch 'master' into ljl1207

@@ -293,7 +293,7 @@ public abstract class BaseController { @@ -293,7 +293,7 @@ public abstract class BaseController {
293 errorResponseHandler.handle(ex, response); 293 errorResponseHandler.handle(ex, response);
294 } 294 }
295 295
296 - ThingsboardException handleException(Exception exception) { 296 + protected ThingsboardException handleException(Exception exception) {
297 return handleException(exception, true); 297 return handleException(exception, true);
298 } 298 }
299 299
@@ -446,7 +446,7 @@ public abstract class BaseController { @@ -446,7 +446,7 @@ public abstract class BaseController {
446 } 446 }
447 } 447 }
448 448
449 - User checkUserId(UserId userId, Operation operation) throws ThingsboardException { 449 + protected User checkUserId(UserId userId, Operation operation) throws ThingsboardException {
450 try { 450 try {
451 validateId(userId, "Incorrect userId " + userId); 451 validateId(userId, "Incorrect userId " + userId);
452 User user = userService.findUserById(getCurrentUser().getTenantId(), userId); 452 User user = userService.findUserById(getCurrentUser().getTenantId(), userId);
@@ -50,18 +50,21 @@ public class YtOrganizationController extends BaseController { @@ -50,18 +50,21 @@ public class YtOrganizationController extends BaseController {
50 } 50 }
51 51
52 @GetMapping("/me/organizations") 52 @GetMapping("/me/organizations")
53 - public List<OrganizationDTO> getMyOrganizations() {  
54 - return organizationService.getMyOrganizations(); 53 + public List<OrganizationDTO> getMyOrganizations() throws ThingsboardException {
  54 + return organizationService.getMyOrganizations(
  55 + getCurrentUser().isPtTenantAdmin(),
  56 + getCurrentUser().getCurrentTenantId(),
  57 + getCurrentUser().getCurrentUserId());
55 } 58 }
56 59
57 @PutMapping 60 @PutMapping
58 - public OrganizationDTO updateOrganization(@Validated(UpdateGroup.class) @RequestBody OrganizationDTO groupDTO) {  
59 - return organizationService.updateOrganization(groupDTO); 61 + public OrganizationDTO updateOrganization(@Validated(UpdateGroup.class) @RequestBody OrganizationDTO groupDTO) throws ThingsboardException {
  62 + return organizationService.updateOrganization(groupDTO, getCurrentUser().getCurrentTenantId());
60 } 63 }
61 64
62 @PutMapping("saveOrUpdateUserOrganizationMapping/{userId}") 65 @PutMapping("saveOrUpdateUserOrganizationMapping/{userId}")
63 public void bindUserToOrganization( 66 public void bindUserToOrganization(
64 - @RequestBody String[] organizationIds, @PathVariable("userId") String userId) {  
65 - organizationService.bindUserToOrganization(userId, organizationIds); 67 + @RequestBody String[] organizationIds, @PathVariable("userId") String userId) throws ThingsboardException {
  68 + organizationService.bindUserToOrganization(getCurrentUser().getCurrentTenantId(), userId, organizationIds);
66 } 69 }
67 } 70 }
@@ -8,6 +8,7 @@ import lombok.RequiredArgsConstructor; @@ -8,6 +8,7 @@ import lombok.RequiredArgsConstructor;
8 import org.apache.commons.lang3.StringUtils; 8 import org.apache.commons.lang3.StringUtils;
9 import org.springframework.http.ResponseEntity; 9 import org.springframework.http.ResponseEntity;
10 import org.springframework.security.access.prepost.PreAuthorize; 10 import org.springframework.security.access.prepost.PreAuthorize;
  11 +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
11 import org.springframework.validation.annotation.Validated; 12 import org.springframework.validation.annotation.Validated;
12 import org.springframework.web.bind.annotation.*; 13 import org.springframework.web.bind.annotation.*;
13 import org.springframework.web.servlet.support.ServletUriComponentsBuilder; 14 import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
@@ -16,9 +17,14 @@ import org.thingsboard.server.common.data.audit.ActionType; @@ -16,9 +17,14 @@ import org.thingsboard.server.common.data.audit.ActionType;
16 import org.thingsboard.server.common.data.edge.EdgeEventActionType; 17 import org.thingsboard.server.common.data.edge.EdgeEventActionType;
17 import org.thingsboard.server.common.data.exception.ThingsboardException; 18 import org.thingsboard.server.common.data.exception.ThingsboardException;
18 import org.thingsboard.server.common.data.id.TenantId; 19 import org.thingsboard.server.common.data.id.TenantId;
  20 +import org.thingsboard.server.common.data.id.UserId;
  21 +import org.thingsboard.server.common.data.security.Authority;
  22 +import org.thingsboard.server.common.data.security.UserCredentials;
19 import org.thingsboard.server.common.data.yunteng.common.AddGroup; 23 import org.thingsboard.server.common.data.yunteng.common.AddGroup;
20 import org.thingsboard.server.common.data.yunteng.common.DeleteGroup; 24 import org.thingsboard.server.common.data.yunteng.common.DeleteGroup;
21 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; 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;
22 import org.thingsboard.server.common.data.yunteng.utils.Demo; 28 import org.thingsboard.server.common.data.yunteng.utils.Demo;
23 import org.thingsboard.server.common.data.yunteng.utils.ExcelUtil; 29 import org.thingsboard.server.common.data.yunteng.utils.ExcelUtil;
24 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; 30 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
@@ -33,6 +39,9 @@ import org.thingsboard.server.common.data.yunteng.utils.tools.ResponseResult; @@ -33,6 +39,9 @@ import org.thingsboard.server.common.data.yunteng.utils.tools.ResponseResult;
33 import org.thingsboard.server.controller.BaseController; 39 import org.thingsboard.server.controller.BaseController;
34 import org.thingsboard.server.dao.user.UserService; 40 import org.thingsboard.server.dao.user.UserService;
35 import org.thingsboard.server.dao.yunteng.service.YtUserService; 41 import org.thingsboard.server.dao.yunteng.service.YtUserService;
  42 +import org.thingsboard.server.service.security.model.SecurityUser;
  43 +import org.thingsboard.server.service.security.model.UserPrincipal;
  44 +import org.thingsboard.server.service.security.permission.Operation;
36 45
37 import javax.servlet.http.HttpServletRequest; 46 import javax.servlet.http.HttpServletRequest;
38 import javax.servlet.http.HttpServletResponse; 47 import javax.servlet.http.HttpServletResponse;
@@ -49,7 +58,7 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant. @@ -49,7 +58,7 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.
49 @RequiredArgsConstructor 58 @RequiredArgsConstructor
50 @Api(value = "用户接口") 59 @Api(value = "用户接口")
51 public class YtUserController extends BaseController { 60 public class YtUserController extends BaseController {
52 - 61 + private final BCryptPasswordEncoder passwordEncoder;
53 private final YtUserService userService; 62 private final YtUserService userService;
54 private final UserService tbUserService; 63 private final UserService tbUserService;
55 @GetMapping("{userId}") 64 @GetMapping("{userId}")
@@ -140,17 +149,38 @@ public class YtUserController extends BaseController { @@ -140,17 +149,38 @@ public class YtUserController extends BaseController {
140 @PreAuthorize("hasAnyAuthority('SYS_ADMIN','PLATFORM_ADMIN')") 149 @PreAuthorize("hasAnyAuthority('SYS_ADMIN','PLATFORM_ADMIN')")
141 @PostMapping("saveTenantAdmin") 150 @PostMapping("saveTenantAdmin")
142 public UserDTO saveTenantAdmin(@Validated(AddGroup.class)@RequestBody UserDTO userDTO) throws ThingsboardException { 151 public UserDTO saveTenantAdmin(@Validated(AddGroup.class)@RequestBody UserDTO userDTO) throws ThingsboardException {
143 - //创建TB的租户管理员  
144 - User tbUser = new User(); 152 + if(StringUtils.isAllBlank(userDTO.getTenantId())){
  153 + throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
  154 + }
145 TenantId tenantId = new TenantId(UUID.fromString(userDTO.getTenantId())); 155 TenantId tenantId = new TenantId(UUID.fromString(userDTO.getTenantId()));
146 - tbUser.setTenantId(tenantId);  
147 - tbUser.setEmail(userDTO.getUsername()+ FastIotConstants.DEFAULT_EMAIL_SUFFIX_FOR_TB);  
148 - tbUser = tbUserService.saveUser(tbUser);  
149 - logEntityAction(tbUser.getId(), tbUser,  
150 - tbUser.getCustomerId(),  
151 - userDTO.getId() == null ? ActionType.ADDED : ActionType.UPDATED, null);  
152 - sendEntityNotificationMsg(tenantId, tbUser.getId(),  
153 - userDTO.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED); 156 + try{
  157 + //创建TB的租户管理员
  158 + User tbUser = new User();
  159 + tbUser.setAuthority(Authority.TENANT_ADMIN);
  160 + tbUser.setTenantId(tenantId);
  161 + tbUser.setEmail(userDTO.getUsername()+ FastIotConstants.DEFAULT_EMAIL_SUFFIX_FOR_TB);
  162 + tbUser = tbUserService.saveUser(tbUser);
  163 + userDTO.setTbUser(tbUser.getId().getId().toString());
  164 + logEntityAction(tbUser.getId(), tbUser,
  165 + tbUser.getCustomerId(),
  166 + userDTO.getId() == null ? ActionType.ADDED : ActionType.UPDATED, null);
  167 + sendEntityNotificationMsg(tenantId, tbUser.getId(),
  168 + userDTO.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED);
  169 +
  170 + //激活租户管理员
  171 + //1、获取UserCredentials 并获取activateToken
  172 + UserId userId = tbUser.getId();
  173 + User user = checkUserId(userId, Operation.READ);
  174 + SecurityUser authUser = getCurrentUser();
  175 + UserCredentials userCredentials = tbUserService.findUserCredentialsByUserId(authUser.getTenantId(), user.getId());
  176 + //2、进行激活
  177 + String encodedPassword = passwordEncoder.encode(FastIotConstants.DEFAULT_PWD);
  178 + UserCredentials credentials = tbUserService.activateUserCredentials(TenantId.SYS_TENANT_ID, userCredentials.getActivateToken(), encodedPassword);
  179 + User currentUser = tbUserService.findUserById(TenantId.SYS_TENANT_ID, credentials.getUserId());
  180 + tbUserService.setUserCredentialsEnabled(currentUser.getTenantId(), currentUser.getId(), true);
  181 + }catch (Exception e){
  182 + throw handleException(e);
  183 + }
154 return userService.saveTenantAdmin( 184 return userService.saveTenantAdmin(
155 userDTO, getCurrentUser().isPtSysadmin(), tenantId.getId().toString()); 185 userDTO, getCurrentUser().isPtSysadmin(), tenantId.getId().toString());
156 } 186 }
@@ -4,6 +4,9 @@ import java.util.regex.Pattern; @@ -4,6 +4,9 @@ import java.util.regex.Pattern;
4 4
5 public interface FastIotConstants { 5 public interface FastIotConstants {
6 6
  7 + /** 默认密码 */
  8 + public static final String DEFAULT_PWD = "123456";
  9 +
7 class DefaultOrder { 10 class DefaultOrder {
8 public static final String CREATE_TIME="create_time"; 11 public static final String CREATE_TIME="create_time";
9 } 12 }
1 package org.thingsboard.server.common.data.yunteng.dto; 1 package org.thingsboard.server.common.data.yunteng.dto;
2 2
3 import com.fasterxml.jackson.annotation.JsonFormat; 3 import com.fasterxml.jackson.annotation.JsonFormat;
  4 +import com.fasterxml.jackson.annotation.JsonIgnore;
4 import com.fasterxml.jackson.annotation.JsonInclude; 5 import com.fasterxml.jackson.annotation.JsonInclude;
5 import lombok.Data; 6 import lombok.Data;
6 import lombok.EqualsAndHashCode; 7 import lombok.EqualsAndHashCode;
@@ -22,7 +23,6 @@ public class UserDTO extends BaseDTO { @@ -22,7 +23,6 @@ public class UserDTO extends BaseDTO {
22 private String realName; 23 private String realName;
23 24
24 @JsonInclude(JsonInclude.Include.NON_NULL) 25 @JsonInclude(JsonInclude.Include.NON_NULL)
25 - @NotEmpty(message = "密码不能为空或空字符串", groups = AddGroup.class)  
26 private String password; 26 private String password;
27 27
28 @JsonInclude(JsonInclude.Include.NON_NULL) 28 @JsonInclude(JsonInclude.Include.NON_NULL)
@@ -37,6 +37,10 @@ public class UserDTO extends BaseDTO { @@ -37,6 +37,10 @@ public class UserDTO extends BaseDTO {
37 private String phoneNumber; 37 private String phoneNumber;
38 private String email; 38 private String email;
39 private String avatar; 39 private String avatar;
  40 + /** TB的UserId 不序列化到前端*/
  41 + @JsonIgnore
  42 + private String tbUser;
  43 +
40 private boolean enabled; 44 private boolean enabled;
41 45
42 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 46 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -45,7 +49,6 @@ public class UserDTO extends BaseDTO { @@ -45,7 +49,6 @@ public class UserDTO extends BaseDTO {
45 private boolean hasPassword; 49 private boolean hasPassword;
46 50
47 @JsonInclude(JsonInclude.Include.NON_NULL) 51 @JsonInclude(JsonInclude.Include.NON_NULL)
48 - @NotEmpty(message = "租户ID不能为空或者空字符串", groups = AddGroup.class)  
49 private String tenantId; 52 private String tenantId;
50 53
51 @JsonInclude(JsonInclude.Include.NON_NULL) 54 @JsonInclude(JsonInclude.Include.NON_NULL)
@@ -36,6 +36,9 @@ public class User extends TenantBaseEntity { @@ -36,6 +36,9 @@ public class User extends TenantBaseEntity {
36 36
37 private String deptId; 37 private String deptId;
38 38
  39 + /** TB的UserId */
  40 + private String tbUser;
  41 +
39 /** 0:超级管理员;1:租户账号;2:租户下的账号 */ 42 /** 0:超级管理员;1:租户账号;2:租户下的账号 */
40 private Integer level; 43 private Integer level;
41 } 44 }
@@ -12,9 +12,12 @@ import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidatio @@ -12,9 +12,12 @@ import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidatio
12 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; 12 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
13 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; 13 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
14 import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO; 14 import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO;
  15 +import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils;
  16 +import org.thingsboard.server.common.data.yunteng.utils.tree.TreeUtils;
15 import org.thingsboard.server.dao.yunteng.entities.UserOrganizationMapping; 17 import org.thingsboard.server.dao.yunteng.entities.UserOrganizationMapping;
16 import org.thingsboard.server.dao.yunteng.entities.Organization; 18 import org.thingsboard.server.dao.yunteng.entities.Organization;
17 import org.thingsboard.server.dao.yunteng.entities.User; 19 import org.thingsboard.server.dao.yunteng.entities.User;
  20 +import org.thingsboard.server.dao.yunteng.entities.YtDevice;
18 import org.thingsboard.server.dao.yunteng.mapper.DeviceMapper; 21 import org.thingsboard.server.dao.yunteng.mapper.DeviceMapper;
19 import org.thingsboard.server.dao.yunteng.mapper.OrganizationMapper; 22 import org.thingsboard.server.dao.yunteng.mapper.OrganizationMapper;
20 import org.thingsboard.server.dao.yunteng.mapper.UserMapper; 23 import org.thingsboard.server.dao.yunteng.mapper.UserMapper;
@@ -36,16 +39,14 @@ public class YtOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -36,16 +39,14 @@ public class YtOrganizationServiceImpl extends AbstractBaseService<OrganizationM
36 39
37 @Override 40 @Override
38 @Transactional 41 @Transactional
39 - public OrganizationDTO saveOrganization(OrganizationDTO organizationDTO,String tenantId) { 42 + public OrganizationDTO saveOrganization(OrganizationDTO organizationDTO, String tenantId) {
40 Assert.notNull(organizationDTO.getName(), "organization name cannot be null"); 43 Assert.notNull(organizationDTO.getName(), "organization name cannot be null");
41 if (StringUtils.isNotBlank(organizationDTO.getParentId())) { 44 if (StringUtils.isNotBlank(organizationDTO.getParentId())) {
42 Organization organization = baseMapper.selectById(organizationDTO.getParentId()); 45 Organization organization = baseMapper.selectById(organizationDTO.getParentId());
43 if (organization == null) { 46 if (organization == null) {
44 throw new YtDataValidationException("parent organization not exist!"); 47 throw new YtDataValidationException("parent organization not exist!");
45 } else { 48 } else {
46 - if (!organization  
47 - .getTenantId()  
48 - .equals(null)) {//TODO getCurrentUser().getTenantId() 49 + if (!organization.getTenantId().equals(tenantId)) {
49 throw new YtDataValidationException("parent organization not exist."); 50 throw new YtDataValidationException("parent organization not exist.");
50 } 51 }
51 } 52 }
@@ -60,16 +61,13 @@ public class YtOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -60,16 +61,13 @@ public class YtOrganizationServiceImpl extends AbstractBaseService<OrganizationM
60 61
61 @Override 62 @Override
62 @Transactional 63 @Transactional
63 - public boolean deleteOrganizations(DeleteDTO deleteDTO,String tenantId) {  
64 - if(null == deleteDTO || deleteDTO.getIds().isEmpty()){ 64 + public boolean deleteOrganizations(DeleteDTO deleteDTO, String tenantId) {
  65 + if (null == deleteDTO || deleteDTO.getIds().isEmpty()) {
65 throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage()); 66 throw new YtDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
66 } 67 }
67 String[] ids = deleteDTO.getIds().toArray(new String[deleteDTO.getIds().size()]); 68 String[] ids = deleteDTO.getIds().toArray(new String[deleteDTO.getIds().size()]);
68 Set<String> idToDelete = 69 Set<String> idToDelete =
69 - baseMapper  
70 - .findOrganizationTreeList(  
71 - null, Arrays.asList(ids))//TODO getCurrentUser().getTenantId()  
72 - .stream() 70 + baseMapper.findOrganizationTreeList(tenantId, Arrays.asList(ids)).stream()
73 .map(OrganizationDTO::getId) 71 .map(OrganizationDTO::getId)
74 .collect(Collectors.toSet()); 72 .collect(Collectors.toSet());
75 if (idToDelete.size() != ids.length) { 73 if (idToDelete.size() != ids.length) {
@@ -84,16 +82,17 @@ public class YtOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -84,16 +82,17 @@ public class YtOrganizationServiceImpl extends AbstractBaseService<OrganizationM
84 throw new YtDataValidationException("待删除数据存在关联用户,不能删除!"); 82 throw new YtDataValidationException("待删除数据存在关联用户,不能删除!");
85 } 83 }
86 // 查询是否有设备使用该组织 84 // 查询是否有设备使用该组织
87 -// List<Device> deviceList = deviceMapper.selectList(  
88 -// new QueryWrapper<Device>()  
89 -// .lambda()  
90 -// .eq(Device::getTenantId, getCurrentUser().getTenantId())  
91 -// .eq(Device::getOrganizationId,ids));  
92 -// if (!deviceList.isEmpty()) {  
93 -// throw new DataValidationException("待删除数据存在关联设备,不能删除!");  
94 -// } 85 + List<YtDevice> deviceList =
  86 + deviceMapper.selectList(
  87 + new QueryWrapper<YtDevice>()
  88 + .lambda()
  89 + .eq(YtDevice::getTenantId, tenantId)
  90 + .eq(YtDevice::getOrganizationId, ids));
  91 + if (!deviceList.isEmpty()) {
  92 + throw new YtDataValidationException("待删除数据存在关联设备,不能删除!");
  93 + }
95 doDeleteUserOrganizationMapping(idToDelete); 94 doDeleteUserOrganizationMapping(idToDelete);
96 - return baseMapper.deleteBatchIds(idToDelete)>0; 95 + return baseMapper.deleteBatchIds(idToDelete) > 0;
97 } 96 }
98 97
99 private void doDeleteUserOrganizationMapping(Collection<String> organizationIds) { 98 private void doDeleteUserOrganizationMapping(Collection<String> organizationIds) {
@@ -105,63 +104,58 @@ public class YtOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -105,63 +104,58 @@ public class YtOrganizationServiceImpl extends AbstractBaseService<OrganizationM
105 104
106 @Override 105 @Override
107 @Transactional 106 @Transactional
108 - public OrganizationDTO updateOrganization(OrganizationDTO organizationDTO) {  
109 -// Organization organization = baseMapper.selectById(organizationDTO.getId());  
110 -// Organization parent = null;  
111 -// if (StringUtils.isNotBlank(organizationDTO.getParentId())) {  
112 -// Organization parentOrganization = baseMapper.selectById(organizationDTO.getParentId());  
113 -// if (parentOrganization  
114 -// .getTenantId()  
115 -// .equals(getCurrentUser().getTenantId())) {  
116 -// parent = parentOrganization;  
117 -// }  
118 -// }  
119 -// if (organization == null) {  
120 -// return null;  
121 -// }  
122 -// if (organization.getName().equals(organizationDTO.getName())  
123 -// && organization.getSort() == organizationDTO.getSort()  
124 -// && organization.getRemark().equals(organizationDTO.getRemark())  
125 -// && Objects.equals(organization.getParentId(), organizationDTO.getParentId())) {  
126 -// return organizationDTO;  
127 -// }  
128 -// organization.setName(organizationDTO.getName());  
129 -// organization.setRemark(organizationDTO.getRemark());  
130 -// organization.setSort(organizationDTO.getSort());  
131 -// if (parent != null) {  
132 -// organization.setParentId(parent.getId());  
133 -// }  
134 -// baseMapper.updateById(organization);  
135 -// organization.copyToDTO(organizationDTO);  
136 -// return organizationDTO;  
137 - return null; 107 + public OrganizationDTO updateOrganization(OrganizationDTO organizationDTO, String tenantId) {
  108 + Organization organization = baseMapper.selectById(organizationDTO.getId());
  109 + Organization parent = null;
  110 + if (StringUtils.isNotBlank(organizationDTO.getParentId())) {
  111 + Organization parentOrganization = baseMapper.selectById(organizationDTO.getParentId());
  112 + if (parentOrganization.getTenantId().equals(tenantId)) {
  113 + parent = parentOrganization;
  114 + }
  115 + }
  116 + if (organization == null) {
  117 + return null;
  118 + }
  119 + if (organization.getName().equals(organizationDTO.getName())
  120 + && organization.getSort() == organizationDTO.getSort()
  121 + && organization.getRemark().equals(organizationDTO.getRemark())
  122 + && Objects.equals(organization.getParentId(), organizationDTO.getParentId())) {
  123 + return organizationDTO;
  124 + }
  125 + organization.setName(organizationDTO.getName());
  126 + organization.setRemark(organizationDTO.getRemark());
  127 + organization.setSort(organizationDTO.getSort());
  128 + if (parent != null) {
  129 + organization.setParentId(parent.getId());
  130 + }
  131 + baseMapper.updateById(organization);
  132 + organization.copyToDTO(organizationDTO);
  133 + return organizationDTO;
138 } 134 }
139 135
140 @Override 136 @Override
141 - public List<OrganizationDTO> getMyOrganizations() {  
142 -// if (getCurrentUser().isTenantAdmin()) {  
143 -// return findOrganizationTree(getCurrentUser().getTenantId());  
144 -// } else {  
145 -// Set<String> organizationIds =  
146 -// userOrganizationMappingMapper  
147 -// .selectList(  
148 -// new QueryWrapper<UserOrganizationMapping>()  
149 -// .lambda()  
150 -// .in(  
151 -// UserOrganizationMapping::getUserId,  
152 -// getCurrentUser().getUserId()))  
153 -// .stream()  
154 -// .map(UserOrganizationMapping::getOrganizationId)  
155 -// .collect(Collectors.toSet());  
156 -// List<Organization> organizations =  
157 -// baseMapper.selectList(  
158 -// new QueryWrapper<Organization>()  
159 -// .lambda()  
160 -// .eq(Organization::getTenantId, getCurrentUser().getTenantId())  
161 -// .in(organizationIds.size() > 0, Organization::getId, organizationIds));  
162 -// return TreeUtils.buildTree(ReflectUtils.sourceToTarget(organizations, OrganizationDTO.class));  
163 -// }  
164 - return null; 137 + public List<OrganizationDTO> getMyOrganizations(
  138 + boolean isPtTenantAdmin, String tenantId, String currentUserId) {
  139 + if (isPtTenantAdmin) {
  140 + return findOrganizationTree(tenantId);
  141 + } else {
  142 + Set<String> organizationIds =
  143 + userOrganizationMappingMapper
  144 + .selectList(
  145 + new QueryWrapper<UserOrganizationMapping>()
  146 + .lambda()
  147 + .in(UserOrganizationMapping::getUserId, currentUserId))
  148 + .stream()
  149 + .map(UserOrganizationMapping::getOrganizationId)
  150 + .collect(Collectors.toSet());
  151 + List<Organization> organizations =
  152 + baseMapper.selectList(
  153 + new QueryWrapper<Organization>()
  154 + .lambda()
  155 + .eq(Organization::getTenantId, tenantId)
  156 + .in(organizationIds.size() > 0, Organization::getId, organizationIds));
  157 + return TreeUtils.buildTree(ReflectUtils.sourceToTarget(organizations, OrganizationDTO.class));
  158 + }
165 } 159 }
166 160
167 private List<OrganizationDTO> findOrganizationTree(String tenantId) { 161 private List<OrganizationDTO> findOrganizationTree(String tenantId) {
@@ -193,46 +187,43 @@ public class YtOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -193,46 +187,43 @@ public class YtOrganizationServiceImpl extends AbstractBaseService<OrganizationM
193 187
194 @Override 188 @Override
195 @Transactional 189 @Transactional
196 - public void bindUserToOrganization(String userId, String[] organizationIds) {  
197 -// User user = userMapper.selectById(userId);  
198 -// if (user == null) {  
199 -// throw new DataValidationException("所选用户不存在");  
200 -// }  
201 -// if (!user.getTenantId().equals(getCurrentUser().getTenantId())) {  
202 -// throw new DataValidationException("所选用户不可用");  
203 -// }  
204 -// if (null != organizationIds && organizationIds.length > 0) {  
205 -// Set<String> newBinding =  
206 -// baseMapper  
207 -// .findOrganizationTreeList(  
208 -// getCurrentUser().getTenantId(), Arrays.asList(organizationIds))  
209 -// .stream()  
210 -// .map(OrganizationDTO::getId)  
211 -// .collect(Collectors.toSet());  
212 -// Set<String> existBinding =  
213 -// userOrganizationMappingMapper  
214 -// .selectList(  
215 -// new QueryWrapper<UserOrganizationMapping>()  
216 -// .lambda()  
217 -// .eq(UserOrganizationMapping::getUserId, userId))  
218 -// .stream()  
219 -// .map(UserOrganizationMapping::getOrganizationId)  
220 -// .collect(Collectors.toSet());  
221 -// Set<String> toDel = Sets.difference(existBinding, newBinding);  
222 -// Set<String> toAdd = Sets.difference(newBinding, existBinding);  
223 -// if (!toDel.isEmpty()) {  
224 -// userOrganizationMappingMapper.delete(  
225 -// new QueryWrapper<UserOrganizationMapping>()  
226 -// .lambda()  
227 -// .in(UserOrganizationMapping::getUserId, userId)  
228 -// .in(UserOrganizationMapping::getOrganizationId, toDel));  
229 -// }  
230 -// if (!toAdd.isEmpty()) {  
231 -// toAdd.stream()  
232 -// .map(organizationId -> new UserOrganizationMapping(userId, organizationId))  
233 -// .forEach(userOrganizationMappingMapper::insert);  
234 -// }  
235 -// } 190 + public void bindUserToOrganization(String tenantId, String userId, String[] organizationIds) {
  191 + User user = userMapper.selectById(userId);
  192 + if (user == null) {
  193 + throw new YtDataValidationException("所选用户不存在");
  194 + }
  195 + if (!user.getTenantId().equals(tenantId)) {
  196 + throw new YtDataValidationException("所选用户不可用");
  197 + }
  198 + if (null != organizationIds && organizationIds.length > 0) {
  199 + Set<String> newBinding =
  200 + baseMapper.findOrganizationTreeList(tenantId, Arrays.asList(organizationIds)).stream()
  201 + .map(OrganizationDTO::getId)
  202 + .collect(Collectors.toSet());
  203 + Set<String> existBinding =
  204 + userOrganizationMappingMapper
  205 + .selectList(
  206 + new QueryWrapper<UserOrganizationMapping>()
  207 + .lambda()
  208 + .eq(UserOrganizationMapping::getUserId, userId))
  209 + .stream()
  210 + .map(UserOrganizationMapping::getOrganizationId)
  211 + .collect(Collectors.toSet());
  212 + Set<String> toDel = Sets.difference(existBinding, newBinding);
  213 + Set<String> toAdd = Sets.difference(newBinding, existBinding);
  214 + if (!toDel.isEmpty()) {
  215 + userOrganizationMappingMapper.delete(
  216 + new QueryWrapper<UserOrganizationMapping>()
  217 + .lambda()
  218 + .in(UserOrganizationMapping::getUserId, userId)
  219 + .in(UserOrganizationMapping::getOrganizationId, toDel));
  220 + }
  221 + if (!toAdd.isEmpty()) {
  222 + toAdd.stream()
  223 + .map(organizationId -> new UserOrganizationMapping(userId, organizationId))
  224 + .forEach(userOrganizationMappingMapper::insert);
  225 + }
  226 + }
236 } 227 }
237 228
238 @Override 229 @Override
@@ -63,8 +63,6 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> imp @@ -63,8 +63,6 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> imp
63 63
64 public static final String ACTIVATE_URL_PATTERN = "%s/api/noauth/activate?activateToken=%s"; 64 public static final String ACTIVATE_URL_PATTERN = "%s/api/noauth/activate?activateToken=%s";
65 private final PasswordEncoder passwordEncoder; 65 private final PasswordEncoder passwordEncoder;
66 - /** 默认密码 */  
67 - private static final String DEFAULT_PWD = "123456";  
68 66
69 @Override 67 @Override
70 public List<UserDetailsDTO> findUserDetailsByUsername(String username) { 68 public List<UserDetailsDTO> findUserDetailsByUsername(String username) {
@@ -98,7 +96,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> imp @@ -98,7 +96,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> imp
98 // 添加的租户管理员 96 // 添加的租户管理员
99 if (StringUtils.isNotBlank(userDTO.getTenantId())) { 97 if (StringUtils.isNotBlank(userDTO.getTenantId())) {
100 user.setTenantId(userDTO.getTenantId()); 98 user.setTenantId(userDTO.getTenantId());
101 - user.setPassword(passwordEncoder.encode(DEFAULT_PWD)); 99 + user.setPassword(passwordEncoder.encode(FastIotConstants.DEFAULT_PWD));
102 int tenantExist = 100 int tenantExist =
103 tenantMapper.selectCount( 101 tenantMapper.selectCount(
104 new QueryWrapper<Tenant>() 102 new QueryWrapper<Tenant>()
@@ -142,7 +140,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> imp @@ -142,7 +140,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> imp
142 userRoleMapper.insert(userRole); 140 userRoleMapper.insert(userRole);
143 } 141 }
144 // 绑定用户和组织的关系 142 // 绑定用户和组织的关系
145 - groupService.bindUserToOrganization(user.getId(), userDTO.getOrganizationIds()); 143 + groupService.bindUserToOrganization(tenantId,user.getId(), userDTO.getOrganizationIds());
146 user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN); 144 user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN);
147 return userDTO; 145 return userDTO;
148 } 146 }
@@ -352,7 +350,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> imp @@ -352,7 +350,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> imp
352 validatePhoneNumberAndEmail(userDTO); 350 validatePhoneNumberAndEmail(userDTO);
353 User user = new User(); 351 User user = new User();
354 userDTO.copyToEntity(user, ID, PASSWORD, CREATE_TIME, UPDATE_TIME, ACTIVATE_TOKEN); 352 userDTO.copyToEntity(user, ID, PASSWORD, CREATE_TIME, UPDATE_TIME, ACTIVATE_TOKEN);
355 - user.setPassword(passwordEncoder.encode(DEFAULT_PWD)); 353 + user.setPassword(passwordEncoder.encode(FastIotConstants.DEFAULT_PWD));
356 List<User> users = 354 List<User> users =
357 baseMapper.selectList( 355 baseMapper.selectList(
358 new QueryWrapper<User>().lambda().eq(User::getUsername, userDTO.getUsername())); 356 new QueryWrapper<User>().lambda().eq(User::getUsername, userDTO.getUsername()));
1 package org.thingsboard.server.dao.yunteng.service; 1 package org.thingsboard.server.dao.yunteng.service;
2 -  
3 -  
4 -  
5 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; 2 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
6 import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO; 3 import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO;
7 4
@@ -13,11 +10,12 @@ public interface YtOrganizationService { @@ -13,11 +10,12 @@ public interface YtOrganizationService {
13 10
14 boolean deleteOrganizations(DeleteDTO deleteDTO,String tenantId); 11 boolean deleteOrganizations(DeleteDTO deleteDTO,String tenantId);
15 12
16 - List<OrganizationDTO> getMyOrganizations(); 13 + List<OrganizationDTO> getMyOrganizations(
  14 + boolean isPtTenantAdmin, String tenantId, String currentUserId);
17 15
18 - OrganizationDTO updateOrganization(OrganizationDTO organizationDTO); 16 + OrganizationDTO updateOrganization(OrganizationDTO organizationDTO, String tenantId);
19 17
20 - void bindUserToOrganization(String userId, String[] organizationIds); 18 + void bindUserToOrganization(String tenantId, String userId, String[] organizationIds);
21 19
22 void unBindUserToOrganization(Set<String> userIds); 20 void unBindUserToOrganization(Set<String> userIds);
23 } 21 }
@@ -34,6 +34,7 @@ @@ -34,6 +34,7 @@
34 <result property="updateTime" column="update_time"/> 34 <result property="updateTime" column="update_time"/>
35 <result property="accountExpireTime" column="account_expire_time"/> 35 <result property="accountExpireTime" column="account_expire_time"/>
36 <result property="level" column="level"/> 36 <result property="level" column="level"/>
  37 + <result property="tbUser" column="tb_user"/>
37 </resultMap> 38 </resultMap>
38 39
39 <sql id="columns"> 40 <sql id="columns">
@@ -50,7 +51,8 @@ @@ -50,7 +51,8 @@
50 su.update_time AS update_time, 51 su.update_time AS update_time,
51 su.real_name AS real_name, 52 su.real_name AS real_name,
52 su.dept_id AS dept_id, 53 su.dept_id AS dept_id,
53 - su.level AS level 54 + su.level AS level,
  55 + su.tb_user AS tb_user
54 </sql> 56 </sql>
55 57
56 <select id="findUserDetailsByUserName" resultMap="userDetailsMap"> 58 <select id="findUserDetailsByUserName" resultMap="userDetailsMap">