Showing
10 changed files
with
176 additions
and
145 deletions
@@ -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"> |