Commit 134fff173319370f814ee74b96716ca9a69a6fa7

Authored by 盛长浩
1 parent bb70b3c9

设备管理类型功能修改完善

@@ -7,9 +7,12 @@ import lombok.extern.slf4j.Slf4j; @@ -7,9 +7,12 @@ import lombok.extern.slf4j.Slf4j;
7 import org.apache.commons.lang3.StringUtils; 7 import org.apache.commons.lang3.StringUtils;
8 import org.springframework.http.ResponseEntity; 8 import org.springframework.http.ResponseEntity;
9 import org.springframework.security.access.prepost.PreAuthorize; 9 import org.springframework.security.access.prepost.PreAuthorize;
  10 +import org.springframework.validation.annotation.Validated;
10 import org.springframework.web.bind.annotation.*; 11 import org.springframework.web.bind.annotation.*;
11 import org.thingsboard.server.common.data.exception.ThingsboardException; 12 import org.thingsboard.server.common.data.exception.ThingsboardException;
  13 +import org.thingsboard.server.common.data.yunteng.common.DeleteGroup;
12 import org.thingsboard.server.common.data.yunteng.dto.BrainDeviceCategoryDTO; 14 import org.thingsboard.server.common.data.yunteng.dto.BrainDeviceCategoryDTO;
  15 +import org.thingsboard.server.common.data.yunteng.utils.tools.ResponseResult;
13 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; 16 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData;
14 import org.thingsboard.server.controller.BaseController; 17 import org.thingsboard.server.controller.BaseController;
15 import org.thingsboard.server.dao.yunteng.service.BrainDeviceCategoryService; 18 import org.thingsboard.server.dao.yunteng.service.BrainDeviceCategoryService;
@@ -37,7 +40,6 @@ public class BrainDeviceCategoryController extends BaseController { @@ -37,7 +40,6 @@ public class BrainDeviceCategoryController extends BaseController {
37 @RequestParam(PAGE_SIZE) int pageSize, 40 @RequestParam(PAGE_SIZE) int pageSize,
38 @RequestParam(PAGE) int page, 41 @RequestParam(PAGE) int page,
39 @RequestParam(value = "name", required = false) String name, 42 @RequestParam(value = "name", required = false) String name,
40 - @RequestParam(value = "code", required = false) String code,  
41 @RequestParam(value = "status", required = false) String status 43 @RequestParam(value = "status", required = false) String status
42 ) throws ThingsboardException { 44 ) throws ThingsboardException {
43 Map<String, Object> queryMap = new HashMap<>(); 45 Map<String, Object> queryMap = new HashMap<>();
@@ -47,10 +49,6 @@ public class BrainDeviceCategoryController extends BaseController { @@ -47,10 +49,6 @@ public class BrainDeviceCategoryController extends BaseController {
47 queryMap.put("name", name); 49 queryMap.put("name", name);
48 } 50 }
49 51
50 - if (StringUtils.isNotBlank(code)) {  
51 - queryMap.put("code", code);  
52 - }  
53 -  
54 if (StringUtils.isNotBlank(status)) { 52 if (StringUtils.isNotBlank(status)) {
55 queryMap.put("status", status); 53 queryMap.put("status", status);
56 } 54 }
@@ -76,4 +74,26 @@ public class BrainDeviceCategoryController extends BaseController { @@ -76,4 +74,26 @@ public class BrainDeviceCategoryController extends BaseController {
76 return ResponseEntity.ok(brainDeviceCategoryService.delete(id)); 74 return ResponseEntity.ok(brainDeviceCategoryService.delete(id));
77 } 75 }
78 76
  77 + /**
  78 + * 批量删除
  79 + *
  80 + * @param brainDeviceCategoryDTO
  81 + * @return
  82 + */
  83 + @DeleteMapping
  84 + @PreAuthorize("hasAnyAuthority('SYS_ADMIN','PLATFORM_ADMIN','TENANT_ADMIN')")
  85 + public ResponseResult<Boolean> deleteBath(
  86 + @Validated({DeleteGroup.class}) @RequestBody BrainDeviceCategoryDTO brainDeviceCategoryDTO) throws ThingsboardException {
  87 + brainDeviceCategoryDTO.setTenantId(getCurrentUser().getCurrentTenantId());
  88 + return ResponseResult.success(brainDeviceCategoryService.deleteBath(brainDeviceCategoryDTO));
  89 + }
  90 +
  91 + @PostMapping("/updateStatus")
  92 + @PreAuthorize("hasAnyAuthority('TENANT_ADMIN','CUSTOMER_USER')")
  93 + @ApiOperation("批量启用停用")
  94 + public ResponseResult<Boolean> updateStatus(@RequestBody BrainDeviceCategoryDTO brainDeviceCategoryDTO) throws ThingsboardException {
  95 + brainDeviceCategoryService.updateStatus(brainDeviceCategoryDTO);
  96 + return ResponseResult.success(true);
  97 + }
  98 +
79 } 99 }
@@ -3,6 +3,10 @@ package org.thingsboard.server.common.data.yunteng.dto; @@ -3,6 +3,10 @@ package org.thingsboard.server.common.data.yunteng.dto;
3 import io.swagger.annotations.ApiModelProperty; 3 import io.swagger.annotations.ApiModelProperty;
4 import lombok.Data; 4 import lombok.Data;
5 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
  6 +import org.thingsboard.server.common.data.yunteng.common.DeleteGroup;
  7 +
  8 +import javax.validation.constraints.Size;
  9 +import java.util.Set;
6 10
7 @EqualsAndHashCode(callSuper = true) 11 @EqualsAndHashCode(callSuper = true)
8 @Data 12 @Data
@@ -18,4 +22,11 @@ public class BrainDeviceCategoryDTO extends TenantDTO { @@ -18,4 +22,11 @@ public class BrainDeviceCategoryDTO extends TenantDTO {
18 private String notes; 22 private String notes;
19 @ApiModelProperty(value = "创建用户名称") 23 @ApiModelProperty(value = "创建用户名称")
20 private String creatorName; 24 private String creatorName;
  25 +
  26 + @Size(
  27 + min = 1,
  28 + message = "删除至少需要一个id",
  29 + groups = {DeleteGroup.class})
  30 + @ApiModelProperty(value = "删除ID列表", required = true)
  31 + private Set<String> ids;
21 } 32 }
@@ -8,19 +8,25 @@ import lombok.extern.slf4j.Slf4j; @@ -8,19 +8,25 @@ import lombok.extern.slf4j.Slf4j;
8 import org.apache.commons.collections4.CollectionUtils; 8 import org.apache.commons.collections4.CollectionUtils;
9 import org.apache.commons.lang3.StringUtils; 9 import org.apache.commons.lang3.StringUtils;
10 import org.springframework.stereotype.Service; 10 import org.springframework.stereotype.Service;
  11 +import org.springframework.transaction.annotation.Transactional;
11 import org.thingsboard.server.common.data.exception.ThingsboardException; 12 import org.thingsboard.server.common.data.exception.ThingsboardException;
  13 +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
12 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; 14 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException;
13 import org.thingsboard.server.common.data.yunteng.dto.BrainDeviceCategoryDTO; 15 import org.thingsboard.server.common.data.yunteng.dto.BrainDeviceCategoryDTO;
  16 +import org.thingsboard.server.common.data.yunteng.dto.UserDTO;
14 import org.thingsboard.server.common.data.yunteng.utils.SpringBeanUtils; 17 import org.thingsboard.server.common.data.yunteng.utils.SpringBeanUtils;
15 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData; 18 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData;
16 import org.thingsboard.server.dao.yunteng.entities.BrainDeviceCategoryEntity; 19 import org.thingsboard.server.dao.yunteng.entities.BrainDeviceCategoryEntity;
17 import org.thingsboard.server.dao.yunteng.mapper.BrainDeviceCategoryMapper; 20 import org.thingsboard.server.dao.yunteng.mapper.BrainDeviceCategoryMapper;
18 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService; 21 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
19 import org.thingsboard.server.dao.yunteng.service.BrainDeviceCategoryService; 22 import org.thingsboard.server.dao.yunteng.service.BrainDeviceCategoryService;
  23 +import org.thingsboard.server.dao.yunteng.service.TkUserService;
20 24
  25 +import javax.annotation.Resource;
21 import java.util.List; 26 import java.util.List;
22 import java.util.Map; 27 import java.util.Map;
23 import java.util.UUID; 28 import java.util.UUID;
  29 +import java.util.stream.Collectors;
24 30
25 @Service 31 @Service
26 @RequiredArgsConstructor 32 @RequiredArgsConstructor
@@ -28,6 +34,9 @@ import java.util.UUID; @@ -28,6 +34,9 @@ import java.util.UUID;
28 public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDeviceCategoryMapper, BrainDeviceCategoryEntity> 34 public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDeviceCategoryMapper, BrainDeviceCategoryEntity>
29 implements BrainDeviceCategoryService { 35 implements BrainDeviceCategoryService {
30 36
  37 + @Resource
  38 + private TkUserService tkUserService;
  39 +
31 @Override 40 @Override
32 public TkPageData<BrainDeviceCategoryDTO> page(Map<String, Object> params) throws ThingsboardException { 41 public TkPageData<BrainDeviceCategoryDTO> page(Map<String, Object> params) throws ThingsboardException {
33 params.put("tenantId", SpringBeanUtils.getTenantId().getId().toString()); 42 params.put("tenantId", SpringBeanUtils.getTenantId().getId().toString());
@@ -36,6 +45,14 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev @@ -36,6 +45,14 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev
36 getPage(params, "create_time", false); 45 getPage(params, "create_time", false);
37 IPage<BrainDeviceCategoryDTO> pageData = baseMapper.getDataPage(page, params); 46 IPage<BrainDeviceCategoryDTO> pageData = baseMapper.getDataPage(page, params);
38 if (pageData != null) { 47 if (pageData != null) {
  48 + List<String> creatorIds = pageData.getRecords().stream().map(BrainDeviceCategoryDTO::getCreator).collect(Collectors.toList());
  49 + Map<String, UserDTO> userMap = tkUserService.findUserByUserIdListMap(creatorIds);
  50 + pageData.getRecords().forEach(item -> {
  51 + UserDTO userInfo = userMap.get(item.getCreator());
  52 + if (userInfo != null) {
  53 + item.setCreatorName(userInfo.getRealName());
  54 + }
  55 + });
39 result.setItems(pageData.getRecords()); 56 result.setItems(pageData.getRecords());
40 } 57 }
41 result.setTotal(Long.valueOf(pageData.getTotal()).intValue()); 58 result.setTotal(Long.valueOf(pageData.getTotal()).intValue());
@@ -78,6 +95,10 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev @@ -78,6 +95,10 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev
78 if (StringUtils.isBlank(dto.getStatus())) { 95 if (StringUtils.isBlank(dto.getStatus())) {
79 throw new TkDataValidationException("设备类型状态不能为空!"); 96 throw new TkDataValidationException("设备类型状态不能为空!");
80 } 97 }
  98 +
  99 + if (StringUtils.isBlank(dto.getTenantId())) {
  100 + dto.setTenantId(SpringBeanUtils.getTenantId().getId().toString());
  101 + }
81 } 102 }
82 103
83 private boolean checkDuplicateData(BrainDeviceCategoryDTO BrainDeviceCategoryDTO) throws ThingsboardException { 104 private boolean checkDuplicateData(BrainDeviceCategoryDTO BrainDeviceCategoryDTO) throws ThingsboardException {
@@ -101,6 +122,11 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev @@ -101,6 +122,11 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev
101 result = new BrainDeviceCategoryDTO(); 122 result = new BrainDeviceCategoryDTO();
102 entity.copyToDTO(result); 123 entity.copyToDTO(result);
103 } 124 }
  125 + String creatorId = entity.getCreator();
  126 + if (StringUtils.isNotBlank(creatorId)) {
  127 + UserDTO userInfo = tkUserService.findUserInfoById(creatorId);
  128 + result.setCreatorName(userInfo.getRealName());
  129 + }
104 return result; 130 return result;
105 } 131 }
106 132
@@ -109,4 +135,31 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev @@ -109,4 +135,31 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev
109 int count = baseMapper.deleteById(id); 135 int count = baseMapper.deleteById(id);
110 return count > 0; 136 return count > 0;
111 } 137 }
  138 +
  139 + @Override
  140 + @Transactional
  141 + public boolean deleteBath(BrainDeviceCategoryDTO brainDeviceCategoryDTO) {
  142 + return baseMapper.delete(
  143 + new LambdaQueryWrapper<BrainDeviceCategoryEntity>()
  144 + .eq(BrainDeviceCategoryEntity::getTenantId, brainDeviceCategoryDTO.getTenantId())
  145 + .in(BrainDeviceCategoryEntity::getId, brainDeviceCategoryDTO.getIds()))
  146 + > FastIotConstants.MagicNumber.ZERO;
  147 + }
  148 +
  149 + @Override
  150 + public void updateStatus(BrainDeviceCategoryDTO brainDeviceCategoryDTO) throws ThingsboardException {
  151 + if (StringUtils.isEmpty(brainDeviceCategoryDTO.getStatus()) || CollectionUtils.isEmpty(brainDeviceCategoryDTO.getIds())) {
  152 + return;
  153 + }
  154 + for (String id : brainDeviceCategoryDTO.getIds()) {
  155 + BrainDeviceCategoryEntity entity = baseMapper.selectById(id);
  156 + if (entity == null) {
  157 + continue;
  158 + }
  159 + entity.setStatus(brainDeviceCategoryDTO.getStatus());
  160 + LambdaQueryWrapper<BrainDeviceCategoryEntity> filter = new QueryWrapper<BrainDeviceCategoryEntity>().lambda()
  161 + .eq(BrainDeviceCategoryEntity::getId, entity.getId());
  162 + baseMapper.update(entity, filter);
  163 + }
  164 + }
112 } 165 }
@@ -63,935 +63,954 @@ import static org.thingsboard.server.common.data.yunteng.constant.ModelConstants @@ -63,935 +63,954 @@ import static org.thingsboard.server.common.data.yunteng.constant.ModelConstants
63 @Slf4j 63 @Slf4j
64 @RequiredArgsConstructor 64 @RequiredArgsConstructor
65 public class SysUserServiceImpl extends AbstractBaseService<UserMapper, SysUserEntity> 65 public class SysUserServiceImpl extends AbstractBaseService<UserMapper, SysUserEntity>
66 - implements TkUserService {  
67 -  
68 - public static final String ACTIVATE_URL_PATTERN = "%s/api/noauth/activate?activateToken=%s";  
69 - private final AdminSettingMapper adminSettingMapper;  
70 - private final ObjectMapper mapper;  
71 - private final RoleMapper roleMapper;  
72 - private final OrganizationMapper organizationMapper;  
73 - private final UserRoleMapper userRoleMapper;  
74 - private final TenantRoleMapper tenantRoleMapper;  
75 - private final TkMessageService tkSmsService;  
76 - private final TkMessageTemplateService messageTemplateService;  
77 - private final TkOrganizationService organizationService;  
78 - private final UserOrganizationMappingService userOrganizationMappingService;  
79 - private final SceneLinkageService sceneLinkageService;  
80 - private final SceneLinkageMapper sceneLinkageMapper;  
81 - private final PasswordEncoder passwordEncoder;  
82 -  
83 - private final CacheUtils cacheUtils;  
84 - private final UserService tbUserService;  
85 - private final ApplicationEventPublisher eventPublisher;  
86 - private final AccountProperties accountProperties;  
87 -  
88 - private final TenantMapper tenantMapper;  
89 - private final TkCustomerDevice tkCustomerDevice;  
90 -  
91 -  
92 - @Override  
93 - public List<UserDetailsDTO> findUserDetailsByUsername(String username, String tenantId) {  
94 - // 多个租户可能存在多个username相同的情况  
95 - return baseMapper.findUserDetailsByUserName(username, tenantId);  
96 - }  
97 -  
98 - @Override  
99 - @Transactional  
100 - public UserDTO saveAccount(  
101 - UserDTO userDTO, boolean sendEmail, boolean sendMsg, boolean isTenantAdmin, boolean isCommonTenant,String tenantId) {  
102 - boolean isTenantAdminOperate = isTenantAdmin||isCommonTenant;  
103 - if (sendMsg && StringUtils.isEmpty(userDTO.getPhoneNumber())) {  
104 - throw new TkDataValidationException(  
105 - "you must specify user phone number if you want send activate email to this user");  
106 - }  
107 - if (sendEmail && StringUtils.isEmpty(userDTO.getEmail())) {  
108 - throw new TkDataValidationException(  
109 - "you must specify user email if you want send activate email to this user");  
110 - }  
111 - SysUserEntity user = new SysUserEntity();  
112 - userDTO.copyToEntity(user, ID, CREATE_TIME, UPDATE_TIME, TENANT_CODE, ACTIVATE_TOKEN);  
113 - boolean userExist;  
114 - if (StringUtils.isNotBlank(userDTO.getPassword())) {  
115 - user.setPassword(passwordEncoder.encode(userDTO.getPassword()));  
116 - } else {  
117 - user.setPassword(passwordEncoder.encode(accountProperties.getDefaultPassword()));  
118 - }  
119 - userExist =  
120 - baseMapper.selectCount(  
121 - new QueryWrapper<SysUserEntity>()  
122 - .lambda()  
123 - .eq(SysUserEntity::getUsername, userDTO.getUsername())  
124 - .eq(SysUserEntity::getTenantId, tenantId))  
125 - > 0;  
126 - if (userExist) {  
127 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.NAME_ALREADY_EXISTS.getI18nCode()));  
128 - } else {  
129 - user.setTenantId(tenantId);  
130 - user.setLevel(  
131 - isTenantAdminOperate  
132 - ? FastIotConstants.LevelValue.IS_CUSTOMER_USER  
133 - : FastIotConstants.LevelValue.IS_PLATFORM_ADMIN);  
134 - baseMapper.insert(user);  
135 - for (String roleId : userDTO.getRoleIds()) {  
136 - // 添加用户角色信息  
137 - SysUserRoleEntity userRole = new SysUserRoleEntity();  
138 - userRole.setUserId(user.getId());  
139 - userRole.setRoleId(roleId);  
140 - userRoleMapper.insert(userRole);  
141 - }  
142 - // 绑定用户和组织的关系  
143 - organizationService.bindUserToOrganization(  
144 - tenantId, user.getId(), userDTO.getOrganizationIds());  
145 - user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN);  
146 - return userDTO;  
147 - }  
148 - }  
149 -  
150 - @Override  
151 - public void validateUserNameAndPhoneNumberAndEmail(UserDTO userDTO) {  
152 - if (null == userDTO.getId()) {  
153 - SysUserEntity existUser =  
154 - baseMapper.selectOne(  
155 - new LambdaQueryWrapper<SysUserEntity>()  
156 - .eq(SysUserEntity::getUsername, userDTO.getUsername()));  
157 - if (null != existUser) {  
158 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.USER_NAME_ALREADY_EXISTS.getI18nCode()));  
159 - }  
160 - }  
161 - if (StringUtils.isNotBlank(userDTO.getPhoneNumber())) {  
162 - if (!CHINA_MOBILE_PATTERN.matcher(userDTO.getPhoneNumber()).matches()) {  
163 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.PROVIDE_CORRECT_PHONE_NUMBER.getI18nCode()));  
164 - }  
165 - }  
166 - if (StringUtils.isNotBlank(userDTO.getEmail())) {  
167 - if (!EMAIL_PATTERN.matcher(userDTO.getEmail()).matches()) {  
168 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.PROVIDE_CORRECT_EMAIL.getI18nCode()));  
169 - }  
170 - }  
171 - if (StringUtils.isEmpty(userDTO.getEmail()) && StringUtils.isEmpty(userDTO.getPhoneNumber())) {  
172 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.PHONE_NUMBER_OR_EMAIL_REQUIRED.getI18nCode()));  
173 - }  
174 - boolean needCheck = true;  
175 - if (null != userDTO.getId()) {  
176 - SysUserEntity user = baseMapper.selectById(userDTO.getId());  
177 - if (user.getPhoneNumber().equals(userDTO.getPhoneNumber())  
178 - && user.getEmail() != null  
179 - && user.getEmail().equals(userDTO.getEmail())) {  
180 - needCheck = false;  
181 - }  
182 - }  
183 - if (needCheck) {  
184 - LambdaQueryWrapper<SysUserEntity> queryWrapper = new LambdaQueryWrapper<>();  
185 - if (null != userDTO.getId()) {  
186 - queryWrapper.ne(SysUserEntity::getId, userDTO.getId());  
187 - }  
188 - queryWrapper.and(  
189 - userLambdaQueryWrapper -> {  
190 - userLambdaQueryWrapper.eq(SysUserEntity::getPhoneNumber, userDTO.getPhoneNumber());  
191 - userLambdaQueryWrapper.or(  
192 - StringUtils.isNotEmpty(userDTO.getEmail()),  
193 - (userQueryWrapper -> {  
194 - userQueryWrapper.eq(SysUserEntity::getEmail, userDTO.getEmail());  
195 - }));  
196 - });  
197 - List<SysUserEntity> existPhoneOrEmail = baseMapper.selectList(queryWrapper);  
198 - if (null != existPhoneOrEmail && existPhoneOrEmail.size() > 0) {  
199 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.PHONE_OR_EMAIL_HAS_REGISTER.getI18nCode()));  
200 - }  
201 - }  
202 - }  
203 -  
204 - @Override  
205 - public UserDTO findUserInfoById(String id) {  
206 - if (StringUtils.isEmpty(id)) {  
207 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
208 - }  
209 - SysUserEntity user = baseMapper.selectById(id);  
210 - return null != user ? user.getDTO(UserDTO.class) : null;  
211 - }  
212 -  
213 - @Override  
214 - public String getActivationLink(String userId, boolean isPtSysadmin, String tenantId) {  
215 - SysUserEntity user = baseMapper.selectById(userId);  
216 - if (!isPtSysadmin && tenantId.equals(user.getTenantId())) {  
217 - throw new AccessDeniedException(  
218 - "you don't have permission to get activation link for this user");  
219 - }  
220 - if (StringUtils.isEmpty(user.getActivateToken())) {  
221 - throw new TkDataValidationException("user already activated");  
222 - }  
223 - try {  
224 - List<SysAdminSettingEntity> generalSetting =  
225 - adminSettingMapper.selectList(  
226 - new QueryWrapper<SysAdminSettingEntity>()  
227 - .lambda()  
228 - .eq(  
229 - SysAdminSettingEntity::getKey,  
230 - ModelConstants.AdminSettingConfigKey.GENERAL_SETTING));  
231 - SysAdminSettingEntity adminSetting = generalSetting.get(0);  
232 - JsonNode configNode = mapper.readTree(adminSetting.getConfigJson());  
233 - String baseUrl = configNode.get(FastIotConstants.ConfigJSONKey.BASE_URL).asText();  
234 - return String.format(ACTIVATE_URL_PATTERN, baseUrl, user.getActivateToken());  
235 - } catch (Exception e) {  
236 - throw new RuntimeException("error occurs");  
237 - }  
238 - }  
239 -  
240 - @Override  
241 - public UserInfoDTO me(String userId, String tenantId, Set<String> currentRoles) {  
242 - SysUserEntity user = baseMapper.selectById(userId);  
243 - UserInfoDTO userInfoDTO = new UserInfoDTO();  
244 - if (!accountProperties.getReset() || !StringUtils.isEmpty(user.getActivateToken())) {  
245 - userInfoDTO.setNeedSetPwd(false);  
246 - }  
247 - AtomicReference<LocalDateTime> expireTime = new AtomicReference<>(user.getAccountExpireTime());  
248 - if (expireTime.get() == null) {  
249 - SysTenantEntity tenant =  
250 - tenantMapper.selectOne(  
251 - new QueryWrapper<SysTenantEntity>()  
252 - .lambda()  
253 - .eq(SysTenantEntity::getTenantId, tenantId));  
254 - Optional.ofNullable(tenant)  
255 - .ifPresent(  
256 - i -> {  
257 - expireTime.set(i.getTenantExpireTime());  
258 - });  
259 - }  
260 - userInfoDTO.setAccountExpireTime(expireTime.get());  
261 - userInfoDTO.setUserId(userId);  
262 - userInfoDTO.setUsername(user.getUsername());  
263 - userInfoDTO.setCreateTime(user.getCreateTime());  
264 - userInfoDTO.setRealName(user.getRealName());  
265 - userInfoDTO.setAvatar(user.getAvatar());  
266 - userInfoDTO.setPhoneNumber(user.getPhoneNumber());  
267 - userInfoDTO.setEmail(user.getEmail());  
268 - userInfoDTO.setTenantId(tenantId);  
269 - userInfoDTO.setRoles(currentRoles);  
270 - userInfoDTO.setLevel(user.getLevel());  
271 - Set<SysRoleEntity> roles = roleMapper.selectRoleByUserId(userId);  
272 - Set<PlainRolesDTO> plainRolesDTOSet = Sets.newHashSet();  
273 - roles.forEach(  
274 - role -> {  
275 - PlainRolesDTO plainRolesDTO = new PlainRolesDTO();  
276 - plainRolesDTO.setRoleId(role.getId());  
277 - plainRolesDTO.setRoleName(role.getName());  
278 - plainRolesDTOSet.add(plainRolesDTO);  
279 - });  
280 - userInfoDTO.setPlainRoles(plainRolesDTOSet);  
281 - return userInfoDTO;  
282 - }  
283 -  
284 - @Override  
285 - public Optional<UserDTO> getUser(String userId, boolean isPtSysadmin, String tenantId) {  
286 - SysUserEntity user = baseMapper.selectById(userId);  
287 - if (user != null) {  
288 - UserDTO userDTO = new UserDTO();  
289 - user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN);  
290 - if (!isPtSysadmin && !tenantId.equals(user.getTenantId())) {  
291 - return Optional.empty();  
292 - }  
293 - return Optional.of(userDTO);  
294 - } else {  
295 - return Optional.empty();  
296 - }  
297 - }  
298 -  
299 - @Override  
300 - @Transactional  
301 - public UserDTO updateUser(UserDTO userDTO, boolean isPtSysadmin, String tenantId) {  
302 - SysUserEntity user = baseMapper.selectById(userDTO.getId());  
303 - if (!isPtSysadmin && !user.getTenantId().equals(tenantId)) {  
304 - throw new NoneTenantAssetException(ErrorMessage.NOT_BELONG_CURRENT_TENANT);  
305 - }  
306 - if (!user.getUsername().equals(userDTO.getUsername())) {  
307 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.USERNAME_IS_IMMUTABLE.getI18nCode()));  
308 - }  
309 -  
310 - if(null != userDTO.getOrganizationIds() && user.getLevel() == MagicNumber.THREE){  
311 - boolean difference = false;  
312 - //判断客户组织是否有变化  
313 - List<String> newList = List.of(userDTO.getOrganizationIds());  
314 - List<String> oldList = userOrganizationMappingService.getOrganizationIdsByUserId(userDTO.getId());  
315 - if(newList.size()!=oldList.size()){  
316 - difference = true;  
317 - }  
318 - if(!difference) {  
319 - List<String> differenceList = newList.stream()  
320 - .filter(element -> !oldList.contains(element))  
321 - .collect(Collectors.toList());  
322 - if (null != differenceList && !differenceList.isEmpty()) {  
323 - difference = true;  
324 - }  
325 - }  
326 - //有变化则查询该客户是否分配设备 分配设备则不允许修改  
327 - if(difference){  
328 - User tbuser = tbUserService.findUserById(new TenantId(UUID.fromString(tenantId)), new UserId(UUID.fromString(user.getTbUser())));  
329 - List<TkCustomerDeviceDTO> dtolist = tkCustomerDevice.getMappingByCustomerId(tbuser.getCustomerId().toString());  
330 - if(null != dtolist&&!dtolist.isEmpty()){  
331 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.CUSTOMER_USER_UPDATE_ERROR.getI18nCode()));  
332 - }  
333 - }  
334 - }  
335 - validateUserNameAndPhoneNumberAndEmail(userDTO);  
336 - user.setRealName(userDTO.getRealName());  
337 - user.setEnabled(userDTO.isEnabled());  
338 - user.setPhoneNumber(userDTO.getPhoneNumber());  
339 - user.setEmail(userDTO.getEmail());  
340 - user.setAccountExpireTime(userDTO.getAccountExpireTime());  
341 - user.setRemark(userDTO.getRemark());  
342 - user.setUpdateTime(LocalDateTime.now());  
343 - if (userDTO.getPassword() != null && !userDTO.getPassword().equals("******")) {  
344 - user.setPassword(passwordEncoder.encode(userDTO.getPassword()));  
345 - }  
346 - baseMapper.updateById(user);  
347 - if (null != userDTO.getRoleIds()) {  
348 - deleteAndAddUserRole(user.getId(), Arrays.asList(userDTO.getRoleIds()));  
349 - userOrganizationMappingService.addOrUpdateUserOrganizationMapping(  
350 - user.getId(), Arrays.asList(userDTO.getOrganizationIds()), true);  
351 - }  
352 - user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN);  
353 - return userDTO;  
354 - }  
355 -  
356 - @Override  
357 - public TkPageData<UserDTO> page(  
358 - Map<String, Object> queryMap, boolean isPtSysadmin, boolean isTenantAdmin) {  
359 - String tenantId = (String) queryMap.get("tenantId");  
360 - IPage<UserDTO> userPage = null;  
361 - IPage<SysUserEntity> userIPage = getPage(queryMap, "create_time", false);  
362 - String organizationId =  
363 - queryMap.get("organizationId") != null ? (String) queryMap.get("organizationId") : null;  
364 - List<String> organizationIds =  
365 - queryMap.get("organizationIds") != null ? (List<String>) queryMap.get("organizationIds") : null;  
366 - List<String> userIds = null;  
367 -  
368 - if (null != organizationId) {  
369 - userIds = userOrganizationMappingService.getUserIdByOrganizationIds(tenantId,OrganizationEnum.DOWN, organizationId);  
370 - queryMap.put("userIds", userIds);  
371 - }else if(null!=organizationIds){  
372 - userIds = userOrganizationMappingService.getUserIdByOrganizationIds(tenantId,OrganizationEnum.DOWN, organizationIds.toArray(new String[0]));  
373 - queryMap.put("userIds", userIds);  
374 - }  
375 - if (isPtSysadmin) {  
376 - if (null != organizationId && (userIds.size() == FastIotConstants.MagicNumber.ZERO)) {  
377 - userPage = new Page<>();  
378 - } else {  
379 - userPage = baseMapper.getUserPage(userIPage, queryMap);  
380 - }  
381 - } else if (isTenantAdmin) {  
382 - if (null != organizationId && (userIds.size() == FastIotConstants.MagicNumber.ZERO)) {  
383 - userPage = new Page<>();  
384 - } else {  
385 - queryMap.put("isTenantAdmin", true);  
386 - userPage = baseMapper.getUserPage(userIPage, queryMap);  
387 - }  
388 - }  
389 - if (null != userPage) {  
390 - userPage  
391 - .getRecords()  
392 - .forEach(  
393 - record -> {  
394 - fillUserStatus(record);  
395 - record.setHasPassword(StringUtils.isNotBlank(record.getActivateToken()));  
396 - record.setPassword(null);  
397 - });  
398 - }  
399 - return getPageData(userPage, UserDTO.class);  
400 - }  
401 -  
402 - @Override  
403 - public TkPageData<UserDTO> tenantPage(Map<String, Object> queryMap, String tenantId,boolean isCommonTenantAdmin) {  
404 - String organizationId = null !=queryMap.get("organizationId")?queryMap.get("organizationId").toString():null;  
405 - String currentUserId = null !=queryMap.get("currentUserId")?queryMap.get("currentUserId").toString():null;  
406 - Integer level = Integer.valueOf(queryMap.get("level").toString());  
407 - List<String> userIds = null;  
408 - boolean isTenantAdminOrCommon = MagicNumber.FOUR == level && null != currentUserId;  
409 - boolean continueQueryPageData = false;  
410 - if(isTenantAdminOrCommon && !isCommonTenantAdmin && StringUtils.isEmpty(organizationId)){  
411 - //如果是租户管理员查询分页,没有传组织ID就直接进行后续分页查询  
412 - continueQueryPageData = true;  
413 - }  
414 - if(isTenantAdminOrCommon && !isCommonTenantAdmin && StringUtils.isNotEmpty(organizationId)){  
415 - userIds = tenantAdminOperator(tenantId,organizationId);  
416 - }  
417 - if( isTenantAdminOrCommon && isCommonTenantAdmin){  
418 - userIds = commonTenantAdminOperator(tenantId,currentUserId,organizationId);  
419 - }  
420 - if(null != userIds && !userIds.isEmpty()){  
421 - queryMap.put("userIds",userIds);  
422 - }  
423 - if(isTenantAdminOrCommon && !continueQueryPageData){  
424 - if(null == userIds || userIds.isEmpty()){  
425 - return new TkPageData<>(new ArrayList<UserDTO>(),0);  
426 - }  
427 - }  
428 - IPage<SysUserEntity> userIPage = getPage(queryMap, "create_time", false);  
429 - IPage<UserDTO> userPage = baseMapper.getTenantAdminPage(userIPage, tenantId,queryMap);  
430 - if (null != userPage) {  
431 - userPage  
432 - .getRecords()  
433 - .forEach(  
434 - record -> {  
435 - fillUserStatus(record);  
436 - record.setHasPassword(StringUtils.isNotBlank(record.getActivateToken()));  
437 - record.setPassword(null);  
438 - });  
439 - }  
440 - return getPageData(userPage, UserDTO.class);  
441 - }  
442 -  
443 - private List<String> tenantAdminOperator(String tenantId,String organizationId){  
444 - List<String> userIds = null;  
445 - List<String> organizationIds = organizationService.organizationAllIds(tenantId,organizationId);  
446 - if(null != organizationIds && !organizationIds.isEmpty()){  
447 - userIds = userOrganizationMappingService.getUserIdByOrganizationIds(tenantId,OrganizationEnum.DOWN,  
448 - organizationIds.toArray(new String[organizationIds.size()]));  
449 - }  
450 - //过滤当前组织的上级组织的账号  
451 - //userIds = filterParentUserId(tenantId,organizationId,userIds);  
452 - return userIds;  
453 - }  
454 -  
455 - private List<String> commonTenantAdminOperator(String tenantId,String currentUserId,String organizationId){  
456 - List<String> userIds;  
457 - //找到当前用户的组织  
458 - List<String> organizationIds = userOrganizationMappingService.getOrganizationIdsByUserId(currentUserId);  
459 - //找到当前组织关联的所有账号  
460 - userIds = queryCurrentUser(tenantId,organizationId,organizationIds);  
461 - //找到当前用户组织的上级组织的账号  
462 - if(null !=organizationIds && !organizationIds.isEmpty()){  
463 - Set<String> filterUserIds = new HashSet<>();  
464 - for (String orgId :organizationIds){  
465 - List<String> parentUserIds = filterParentUserId(tenantId,orgId,userIds);  
466 - if(null != parentUserIds && !parentUserIds.isEmpty()){  
467 - filterUserIds.addAll(parentUserIds);  
468 - }  
469 - }  
470 - if(!filterUserIds.isEmpty()){ 66 + implements TkUserService {
  67 +
  68 + public static final String ACTIVATE_URL_PATTERN = "%s/api/noauth/activate?activateToken=%s";
  69 + private final AdminSettingMapper adminSettingMapper;
  70 + private final ObjectMapper mapper;
  71 + private final RoleMapper roleMapper;
  72 + private final OrganizationMapper organizationMapper;
  73 + private final UserRoleMapper userRoleMapper;
  74 + private final TenantRoleMapper tenantRoleMapper;
  75 + private final TkMessageService tkSmsService;
  76 + private final TkMessageTemplateService messageTemplateService;
  77 + private final TkOrganizationService organizationService;
  78 + private final UserOrganizationMappingService userOrganizationMappingService;
  79 + private final SceneLinkageService sceneLinkageService;
  80 + private final SceneLinkageMapper sceneLinkageMapper;
  81 + private final PasswordEncoder passwordEncoder;
  82 +
  83 + private final CacheUtils cacheUtils;
  84 + private final UserService tbUserService;
  85 + private final ApplicationEventPublisher eventPublisher;
  86 + private final AccountProperties accountProperties;
  87 +
  88 + private final TenantMapper tenantMapper;
  89 + private final TkCustomerDevice tkCustomerDevice;
  90 +
  91 +
  92 + @Override
  93 + public List<UserDetailsDTO> findUserDetailsByUsername(String username, String tenantId) {
  94 + // 多个租户可能存在多个username相同的情况
  95 + return baseMapper.findUserDetailsByUserName(username, tenantId);
  96 + }
  97 +
  98 + @Override
  99 + @Transactional
  100 + public UserDTO saveAccount(
  101 + UserDTO userDTO, boolean sendEmail, boolean sendMsg, boolean isTenantAdmin, boolean isCommonTenant, String tenantId) {
  102 + boolean isTenantAdminOperate = isTenantAdmin || isCommonTenant;
  103 + if (sendMsg && StringUtils.isEmpty(userDTO.getPhoneNumber())) {
  104 + throw new TkDataValidationException(
  105 + "you must specify user phone number if you want send activate email to this user");
  106 + }
  107 + if (sendEmail && StringUtils.isEmpty(userDTO.getEmail())) {
  108 + throw new TkDataValidationException(
  109 + "you must specify user email if you want send activate email to this user");
  110 + }
  111 + SysUserEntity user = new SysUserEntity();
  112 + userDTO.copyToEntity(user, ID, CREATE_TIME, UPDATE_TIME, TENANT_CODE, ACTIVATE_TOKEN);
  113 + boolean userExist;
  114 + if (StringUtils.isNotBlank(userDTO.getPassword())) {
  115 + user.setPassword(passwordEncoder.encode(userDTO.getPassword()));
  116 + } else {
  117 + user.setPassword(passwordEncoder.encode(accountProperties.getDefaultPassword()));
  118 + }
  119 + userExist =
  120 + baseMapper.selectCount(
  121 + new QueryWrapper<SysUserEntity>()
  122 + .lambda()
  123 + .eq(SysUserEntity::getUsername, userDTO.getUsername())
  124 + .eq(SysUserEntity::getTenantId, tenantId))
  125 + > 0;
  126 + if (userExist) {
  127 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.NAME_ALREADY_EXISTS.getI18nCode()));
  128 + } else {
  129 + user.setTenantId(tenantId);
  130 + user.setLevel(
  131 + isTenantAdminOperate
  132 + ? FastIotConstants.LevelValue.IS_CUSTOMER_USER
  133 + : FastIotConstants.LevelValue.IS_PLATFORM_ADMIN);
  134 + baseMapper.insert(user);
  135 + for (String roleId : userDTO.getRoleIds()) {
  136 + // 添加用户角色信息
  137 + SysUserRoleEntity userRole = new SysUserRoleEntity();
  138 + userRole.setUserId(user.getId());
  139 + userRole.setRoleId(roleId);
  140 + userRoleMapper.insert(userRole);
  141 + }
  142 + // 绑定用户和组织的关系
  143 + organizationService.bindUserToOrganization(
  144 + tenantId, user.getId(), userDTO.getOrganizationIds());
  145 + user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN);
  146 + return userDTO;
  147 + }
  148 + }
  149 +
  150 + @Override
  151 + public void validateUserNameAndPhoneNumberAndEmail(UserDTO userDTO) {
  152 + if (null == userDTO.getId()) {
  153 + SysUserEntity existUser =
  154 + baseMapper.selectOne(
  155 + new LambdaQueryWrapper<SysUserEntity>()
  156 + .eq(SysUserEntity::getUsername, userDTO.getUsername()));
  157 + if (null != existUser) {
  158 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.USER_NAME_ALREADY_EXISTS.getI18nCode()));
  159 + }
  160 + }
  161 + if (StringUtils.isNotBlank(userDTO.getPhoneNumber())) {
  162 + if (!CHINA_MOBILE_PATTERN.matcher(userDTO.getPhoneNumber()).matches()) {
  163 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.PROVIDE_CORRECT_PHONE_NUMBER.getI18nCode()));
  164 + }
  165 + }
  166 + if (StringUtils.isNotBlank(userDTO.getEmail())) {
  167 + if (!EMAIL_PATTERN.matcher(userDTO.getEmail()).matches()) {
  168 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.PROVIDE_CORRECT_EMAIL.getI18nCode()));
  169 + }
  170 + }
  171 + if (StringUtils.isEmpty(userDTO.getEmail()) && StringUtils.isEmpty(userDTO.getPhoneNumber())) {
  172 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.PHONE_NUMBER_OR_EMAIL_REQUIRED.getI18nCode()));
  173 + }
  174 + boolean needCheck = true;
  175 + if (null != userDTO.getId()) {
  176 + SysUserEntity user = baseMapper.selectById(userDTO.getId());
  177 + if (user.getPhoneNumber().equals(userDTO.getPhoneNumber())
  178 + && user.getEmail() != null
  179 + && user.getEmail().equals(userDTO.getEmail())) {
  180 + needCheck = false;
  181 + }
  182 + }
  183 + if (needCheck) {
  184 + LambdaQueryWrapper<SysUserEntity> queryWrapper = new LambdaQueryWrapper<>();
  185 + if (null != userDTO.getId()) {
  186 + queryWrapper.ne(SysUserEntity::getId, userDTO.getId());
  187 + }
  188 + queryWrapper.and(
  189 + userLambdaQueryWrapper -> {
  190 + userLambdaQueryWrapper.eq(SysUserEntity::getPhoneNumber, userDTO.getPhoneNumber());
  191 + userLambdaQueryWrapper.or(
  192 + StringUtils.isNotEmpty(userDTO.getEmail()),
  193 + (userQueryWrapper -> {
  194 + userQueryWrapper.eq(SysUserEntity::getEmail, userDTO.getEmail());
  195 + }));
  196 + });
  197 + List<SysUserEntity> existPhoneOrEmail = baseMapper.selectList(queryWrapper);
  198 + if (null != existPhoneOrEmail && existPhoneOrEmail.size() > 0) {
  199 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.PHONE_OR_EMAIL_HAS_REGISTER.getI18nCode()));
  200 + }
  201 + }
  202 + }
  203 +
  204 + @Override
  205 + public UserDTO findUserInfoById(String id) {
  206 + if (StringUtils.isEmpty(id)) {
  207 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  208 + }
  209 + SysUserEntity user = baseMapper.selectById(id);
  210 + return null != user ? user.getDTO(UserDTO.class) : null;
  211 + }
  212 +
  213 + @Override
  214 + public String getActivationLink(String userId, boolean isPtSysadmin, String tenantId) {
  215 + SysUserEntity user = baseMapper.selectById(userId);
  216 + if (!isPtSysadmin && tenantId.equals(user.getTenantId())) {
  217 + throw new AccessDeniedException(
  218 + "you don't have permission to get activation link for this user");
  219 + }
  220 + if (StringUtils.isEmpty(user.getActivateToken())) {
  221 + throw new TkDataValidationException("user already activated");
  222 + }
  223 + try {
  224 + List<SysAdminSettingEntity> generalSetting =
  225 + adminSettingMapper.selectList(
  226 + new QueryWrapper<SysAdminSettingEntity>()
  227 + .lambda()
  228 + .eq(
  229 + SysAdminSettingEntity::getKey,
  230 + ModelConstants.AdminSettingConfigKey.GENERAL_SETTING));
  231 + SysAdminSettingEntity adminSetting = generalSetting.get(0);
  232 + JsonNode configNode = mapper.readTree(adminSetting.getConfigJson());
  233 + String baseUrl = configNode.get(FastIotConstants.ConfigJSONKey.BASE_URL).asText();
  234 + return String.format(ACTIVATE_URL_PATTERN, baseUrl, user.getActivateToken());
  235 + } catch (Exception e) {
  236 + throw new RuntimeException("error occurs");
  237 + }
  238 + }
  239 +
  240 + @Override
  241 + public UserInfoDTO me(String userId, String tenantId, Set<String> currentRoles) {
  242 + SysUserEntity user = baseMapper.selectById(userId);
  243 + UserInfoDTO userInfoDTO = new UserInfoDTO();
  244 + if (!accountProperties.getReset() || !StringUtils.isEmpty(user.getActivateToken())) {
  245 + userInfoDTO.setNeedSetPwd(false);
  246 + }
  247 + AtomicReference<LocalDateTime> expireTime = new AtomicReference<>(user.getAccountExpireTime());
  248 + if (expireTime.get() == null) {
  249 + SysTenantEntity tenant =
  250 + tenantMapper.selectOne(
  251 + new QueryWrapper<SysTenantEntity>()
  252 + .lambda()
  253 + .eq(SysTenantEntity::getTenantId, tenantId));
  254 + Optional.ofNullable(tenant)
  255 + .ifPresent(
  256 + i -> {
  257 + expireTime.set(i.getTenantExpireTime());
  258 + });
  259 + }
  260 + userInfoDTO.setAccountExpireTime(expireTime.get());
  261 + userInfoDTO.setUserId(userId);
  262 + userInfoDTO.setUsername(user.getUsername());
  263 + userInfoDTO.setCreateTime(user.getCreateTime());
  264 + userInfoDTO.setRealName(user.getRealName());
  265 + userInfoDTO.setAvatar(user.getAvatar());
  266 + userInfoDTO.setPhoneNumber(user.getPhoneNumber());
  267 + userInfoDTO.setEmail(user.getEmail());
  268 + userInfoDTO.setTenantId(tenantId);
  269 + userInfoDTO.setRoles(currentRoles);
  270 + userInfoDTO.setLevel(user.getLevel());
  271 + Set<SysRoleEntity> roles = roleMapper.selectRoleByUserId(userId);
  272 + Set<PlainRolesDTO> plainRolesDTOSet = Sets.newHashSet();
  273 + roles.forEach(
  274 + role -> {
  275 + PlainRolesDTO plainRolesDTO = new PlainRolesDTO();
  276 + plainRolesDTO.setRoleId(role.getId());
  277 + plainRolesDTO.setRoleName(role.getName());
  278 + plainRolesDTOSet.add(plainRolesDTO);
  279 + });
  280 + userInfoDTO.setPlainRoles(plainRolesDTOSet);
  281 + return userInfoDTO;
  282 + }
  283 +
  284 + @Override
  285 + public Optional<UserDTO> getUser(String userId, boolean isPtSysadmin, String tenantId) {
  286 + SysUserEntity user = baseMapper.selectById(userId);
  287 + if (user != null) {
  288 + UserDTO userDTO = new UserDTO();
  289 + user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN);
  290 + if (!isPtSysadmin && !tenantId.equals(user.getTenantId())) {
  291 + return Optional.empty();
  292 + }
  293 + return Optional.of(userDTO);
  294 + } else {
  295 + return Optional.empty();
  296 + }
  297 + }
  298 +
  299 + @Override
  300 + @Transactional
  301 + public UserDTO updateUser(UserDTO userDTO, boolean isPtSysadmin, String tenantId) {
  302 + SysUserEntity user = baseMapper.selectById(userDTO.getId());
  303 + if (!isPtSysadmin && !user.getTenantId().equals(tenantId)) {
  304 + throw new NoneTenantAssetException(ErrorMessage.NOT_BELONG_CURRENT_TENANT);
  305 + }
  306 + if (!user.getUsername().equals(userDTO.getUsername())) {
  307 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.USERNAME_IS_IMMUTABLE.getI18nCode()));
  308 + }
  309 +
  310 + if (null != userDTO.getOrganizationIds() && user.getLevel() == MagicNumber.THREE) {
  311 + boolean difference = false;
  312 + //判断客户组织是否有变化
  313 + List<String> newList = List.of(userDTO.getOrganizationIds());
  314 + List<String> oldList = userOrganizationMappingService.getOrganizationIdsByUserId(userDTO.getId());
  315 + if (newList.size() != oldList.size()) {
  316 + difference = true;
  317 + }
  318 + if (!difference) {
  319 + List<String> differenceList = newList.stream()
  320 + .filter(element -> !oldList.contains(element))
  321 + .collect(Collectors.toList());
  322 + if (null != differenceList && !differenceList.isEmpty()) {
  323 + difference = true;
  324 + }
  325 + }
  326 + //有变化则查询该客户是否分配设备 分配设备则不允许修改
  327 + if (difference) {
  328 + User tbuser = tbUserService.findUserById(new TenantId(UUID.fromString(tenantId)), new UserId(UUID.fromString(user.getTbUser())));
  329 + List<TkCustomerDeviceDTO> dtolist = tkCustomerDevice.getMappingByCustomerId(tbuser.getCustomerId().toString());
  330 + if (null != dtolist && !dtolist.isEmpty()) {
  331 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.CUSTOMER_USER_UPDATE_ERROR.getI18nCode()));
  332 + }
  333 + }
  334 + }
  335 + validateUserNameAndPhoneNumberAndEmail(userDTO);
  336 + user.setRealName(userDTO.getRealName());
  337 + user.setEnabled(userDTO.isEnabled());
  338 + user.setPhoneNumber(userDTO.getPhoneNumber());
  339 + user.setEmail(userDTO.getEmail());
  340 + user.setAccountExpireTime(userDTO.getAccountExpireTime());
  341 + user.setRemark(userDTO.getRemark());
  342 + user.setUpdateTime(LocalDateTime.now());
  343 + if (userDTO.getPassword() != null && !userDTO.getPassword().equals("******")) {
  344 + user.setPassword(passwordEncoder.encode(userDTO.getPassword()));
  345 + }
  346 + baseMapper.updateById(user);
  347 + if (null != userDTO.getRoleIds()) {
  348 + deleteAndAddUserRole(user.getId(), Arrays.asList(userDTO.getRoleIds()));
  349 + userOrganizationMappingService.addOrUpdateUserOrganizationMapping(
  350 + user.getId(), Arrays.asList(userDTO.getOrganizationIds()), true);
  351 + }
  352 + user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN);
  353 + return userDTO;
  354 + }
  355 +
  356 + @Override
  357 + public TkPageData<UserDTO> page(
  358 + Map<String, Object> queryMap, boolean isPtSysadmin, boolean isTenantAdmin) {
  359 + String tenantId = (String) queryMap.get("tenantId");
  360 + IPage<UserDTO> userPage = null;
  361 + IPage<SysUserEntity> userIPage = getPage(queryMap, "create_time", false);
  362 + String organizationId =
  363 + queryMap.get("organizationId") != null ? (String) queryMap.get("organizationId") : null;
  364 + List<String> organizationIds =
  365 + queryMap.get("organizationIds") != null ? (List<String>) queryMap.get("organizationIds") : null;
  366 + List<String> userIds = null;
  367 +
  368 + if (null != organizationId) {
  369 + userIds = userOrganizationMappingService.getUserIdByOrganizationIds(tenantId, OrganizationEnum.DOWN, organizationId);
  370 + queryMap.put("userIds", userIds);
  371 + } else if (null != organizationIds) {
  372 + userIds = userOrganizationMappingService.getUserIdByOrganizationIds(tenantId, OrganizationEnum.DOWN, organizationIds.toArray(new String[0]));
  373 + queryMap.put("userIds", userIds);
  374 + }
  375 + if (isPtSysadmin) {
  376 + if (null != organizationId && (userIds.size() == FastIotConstants.MagicNumber.ZERO)) {
  377 + userPage = new Page<>();
  378 + } else {
  379 + userPage = baseMapper.getUserPage(userIPage, queryMap);
  380 + }
  381 + } else if (isTenantAdmin) {
  382 + if (null != organizationId && (userIds.size() == FastIotConstants.MagicNumber.ZERO)) {
  383 + userPage = new Page<>();
  384 + } else {
  385 + queryMap.put("isTenantAdmin", true);
  386 + userPage = baseMapper.getUserPage(userIPage, queryMap);
  387 + }
  388 + }
  389 + if (null != userPage) {
  390 + userPage
  391 + .getRecords()
  392 + .forEach(
  393 + record -> {
  394 + fillUserStatus(record);
  395 + record.setHasPassword(StringUtils.isNotBlank(record.getActivateToken()));
  396 + record.setPassword(null);
  397 + });
  398 + }
  399 + return getPageData(userPage, UserDTO.class);
  400 + }
  401 +
  402 + @Override
  403 + public TkPageData<UserDTO> tenantPage(Map<String, Object> queryMap, String tenantId, boolean isCommonTenantAdmin) {
  404 + String organizationId = null != queryMap.get("organizationId") ? queryMap.get("organizationId").toString() : null;
  405 + String currentUserId = null != queryMap.get("currentUserId") ? queryMap.get("currentUserId").toString() : null;
  406 + Integer level = Integer.valueOf(queryMap.get("level").toString());
  407 + List<String> userIds = null;
  408 + boolean isTenantAdminOrCommon = MagicNumber.FOUR == level && null != currentUserId;
  409 + boolean continueQueryPageData = false;
  410 + if (isTenantAdminOrCommon && !isCommonTenantAdmin && StringUtils.isEmpty(organizationId)) {
  411 + //如果是租户管理员查询分页,没有传组织ID就直接进行后续分页查询
  412 + continueQueryPageData = true;
  413 + }
  414 + if (isTenantAdminOrCommon && !isCommonTenantAdmin && StringUtils.isNotEmpty(organizationId)) {
  415 + userIds = tenantAdminOperator(tenantId, organizationId);
  416 + }
  417 + if (isTenantAdminOrCommon && isCommonTenantAdmin) {
  418 + userIds = commonTenantAdminOperator(tenantId, currentUserId, organizationId);
  419 + }
  420 + if (null != userIds && !userIds.isEmpty()) {
  421 + queryMap.put("userIds", userIds);
  422 + }
  423 + if (isTenantAdminOrCommon && !continueQueryPageData) {
  424 + if (null == userIds || userIds.isEmpty()) {
  425 + return new TkPageData<>(new ArrayList<UserDTO>(), 0);
  426 + }
  427 + }
  428 + IPage<SysUserEntity> userIPage = getPage(queryMap, "create_time", false);
  429 + IPage<UserDTO> userPage = baseMapper.getTenantAdminPage(userIPage, tenantId, queryMap);
  430 + if (null != userPage) {
  431 + userPage
  432 + .getRecords()
  433 + .forEach(
  434 + record -> {
  435 + fillUserStatus(record);
  436 + record.setHasPassword(StringUtils.isNotBlank(record.getActivateToken()));
  437 + record.setPassword(null);
  438 + });
  439 + }
  440 + return getPageData(userPage, UserDTO.class);
  441 + }
  442 +
  443 + private List<String> tenantAdminOperator(String tenantId, String organizationId) {
  444 + List<String> userIds = null;
  445 + List<String> organizationIds = organizationService.organizationAllIds(tenantId, organizationId);
  446 + if (null != organizationIds && !organizationIds.isEmpty()) {
  447 + userIds = userOrganizationMappingService.getUserIdByOrganizationIds(tenantId, OrganizationEnum.DOWN,
  448 + organizationIds.toArray(new String[organizationIds.size()]));
  449 + }
  450 + //过滤当前组织的上级组织的账号
  451 + //userIds = filterParentUserId(tenantId,organizationId,userIds);
  452 + return userIds;
  453 + }
  454 +
  455 + private List<String> commonTenantAdminOperator(String tenantId, String currentUserId, String organizationId) {
  456 + List<String> userIds;
  457 + //找到当前用户的组织
  458 + List<String> organizationIds = userOrganizationMappingService.getOrganizationIdsByUserId(currentUserId);
  459 + //找到当前组织关联的所有账号
  460 + userIds = queryCurrentUser(tenantId, organizationId, organizationIds);
  461 + //找到当前用户组织的上级组织的账号
  462 + if (null != organizationIds && !organizationIds.isEmpty()) {
  463 + Set<String> filterUserIds = new HashSet<>();
  464 + for (String orgId : organizationIds) {
  465 + List<String> parentUserIds = filterParentUserId(tenantId, orgId, userIds);
  466 + if (null != parentUserIds && !parentUserIds.isEmpty()) {
  467 + filterUserIds.addAll(parentUserIds);
  468 + }
  469 + }
  470 + if (!filterUserIds.isEmpty()) {
471 // filterUserIds.remove(currentUserId); 471 // filterUserIds.remove(currentUserId);
472 - userIds = new ArrayList<>();  
473 - userIds.addAll(filterUserIds);  
474 - }  
475 - }  
476 - return userIds;  
477 - }  
478 - private List<String> queryCurrentUser(String tenantId,String organizationId,List<String> organizationIds){  
479 - if(!StringUtils.isEmpty(organizationId)){  
480 - if(organizationIds.contains(organizationId)){  
481 - //查询当前组织下的所有下级组织  
482 - organizationIds = organizationService.organizationAllIds(tenantId,organizationId);  
483 - }else{ 472 + userIds = new ArrayList<>();
  473 + userIds.addAll(filterUserIds);
  474 + }
  475 + }
  476 + return userIds;
  477 + }
  478 +
  479 + private List<String> queryCurrentUser(String tenantId, String organizationId, List<String> organizationIds) {
  480 + if (!StringUtils.isEmpty(organizationId)) {
  481 + if (organizationIds.contains(organizationId)) {
  482 + //查询当前组织下的所有下级组织
  483 + organizationIds = organizationService.organizationAllIds(tenantId, organizationId);
  484 + } else {
  485 + return null;
  486 + }
  487 + }
  488 + if (null != organizationIds && !organizationIds.isEmpty()) {
  489 + return userOrganizationMappingService.getUserIdByOrganizationIds(tenantId, OrganizationEnum.DOWN,
  490 + organizationIds.toArray(new String[organizationIds.size()]));
  491 + }
484 return null; 492 return null;
485 - }  
486 - }  
487 - if(null != organizationIds && !organizationIds.isEmpty()){  
488 - return userOrganizationMappingService.getUserIdByOrganizationIds(tenantId,OrganizationEnum.DOWN,  
489 - organizationIds.toArray(new String[organizationIds.size()]));  
490 - }  
491 - return null;  
492 - }  
493 -  
494 - private List<String> filterParentUserId(String tenantId,String organizationId,List<String> sourceUserIds){  
495 - Set<String> organizationIds = organizationService.findOrganizationTreeList(tenantId, OrganizationEnum.UP, List.of(organizationId)).stream()  
496 - .map(OrganizationDTO::getId)  
497 - .collect(Collectors.toSet());  
498 -  
499 - List<String> userIds = userOrganizationMappingService.getUserIdsByOrganizationIds(organizationIds,organizationId);  
500 - return sourceUserIds.stream()  
501 - .filter(element -> !userIds.contains(element))  
502 - .collect(Collectors.toList());  
503 - }  
504 - private void fillUserStatus(UserDTO userDTO) {  
505 - userDTO.setUserStatusEnum(UserStatusEnum.NORMAL);  
506 - if (!userDTO.isEnabled()) {  
507 - userDTO.setUserStatusEnum(UserStatusEnum.DISABLED);  
508 - } else {  
509 - if (userDTO.getAccountExpireTime() != null) {  
510 - if (userDTO.getAccountExpireTime().isBefore(LocalDateTime.now())) {  
511 - userDTO.setUserStatusEnum(UserStatusEnum.EXPIRED);  
512 - }  
513 - }  
514 - }  
515 - }  
516 -  
517 - @Override  
518 - @Transactional  
519 - public boolean deleteUser(Set<String> userIds, boolean isPtSysadmin, String tenantId) {  
520 - // 1. 判断是否所有的id都属于此人  
521 - if (!isPtSysadmin) {  
522 - long notTenantUserCount =  
523 - baseMapper.selectCount(  
524 - new QueryWrapper<SysUserEntity>()  
525 - .lambda()  
526 - .ne(SysUserEntity::getTenantId, tenantId)  
527 - .in(SysUserEntity::getId, userIds));  
528 - if (notTenantUserCount > 0) {  
529 - throw new AccessDeniedException("cannot delete user that not belong to your tenant");  
530 - }  
531 - }  
532 - // 2. 删除人员对应的 role  
533 - roleMapper.deleteRoleUserMappingByUserIds(userIds);  
534 -  
535 - // 3. 解绑人员对应的group  
536 -  
537 - organizationService.unBindUserToOrganization(userIds);  
538 -  
539 - // 4. 删除人员  
540 - baseMapper.deleteBatchIds(userIds);  
541 -  
542 - // 5、删除场景联动  
543 - Wrapper filter =  
544 - new QueryWrapper<TkSceneLinkageEntity>()  
545 - .lambda()  
546 - .in(TkSceneLinkageEntity::getCreator, userIds);  
547 - List<TkSceneLinkageEntity> sceneLinkages = sceneLinkageMapper.selectList(filter);  
548 - if (sceneLinkages == null || sceneLinkages.isEmpty()) {  
549 - return true;  
550 - }  
551 - Set<String> sceneIds = sceneLinkages.stream().map(i -> i.getId()).collect(Collectors.toSet());  
552 - sceneLinkageService.deleteSceneLinkage(sceneIds, tenantId, null);  
553 -  
554 - return true;  
555 - }  
556 -  
557 - @Override  
558 - @Transactional  
559 - public UserDTO saveTenantAdmin(UserDTO userDTO, boolean isPtSysadmin, String tenantId) {  
560 - if (StringUtils.isNotBlank(userDTO.getId())) {  
561 - return updateUser(userDTO, isPtSysadmin, tenantId);  
562 - }  
563 - SysUserEntity user = new SysUserEntity();  
564 - userDTO.copyToEntity(user, ID, PASSWORD, CREATE_TIME, UPDATE_TIME, ACTIVATE_TOKEN);  
565 - user.setPassword(passwordEncoder.encode(accountProperties.getDefaultPassword()));  
566 - //判断是租户管理员还是普通租户  
567 - Integer level = null;  
568 - if (null!=userDTO.getLevel()&&userDTO.getLevel()== MagicNumber.FOUR){  
569 - level = FastIotConstants.LevelValue.IS_CUSTOMER_TENANT;  
570 - }else if (null!=userDTO.getLevel()&&userDTO.getLevel()== MagicNumber.FIVE){  
571 - level = FastIotConstants.LevelValue.IS_OPENAPI_USER;  
572 - }else{  
573 - level = FastIotConstants.LevelValue.IS_TENANT_ADMIN;  
574 - }  
575 - user.setLevel(level);  
576 - List<SysUserEntity> users =  
577 - baseMapper.selectList(  
578 - new QueryWrapper<SysUserEntity>()  
579 - .lambda()  
580 - .eq(SysUserEntity::getUsername, userDTO.getUsername()));  
581 - if (!users.isEmpty()) {  
582 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.USER_ISNOT_NULL.getI18nCode()));  
583 - }  
584 - baseMapper.insert(user);  
585 - // 如果为普通租户绑定用户和组织的关系和角色  
586 - if (null!=level&&(level== FastIotConstants.MagicNumber.FOUR||level==FastIotConstants.LevelValue.IS_OPENAPI_USER)){  
587 - //如果是普通租户或者openapi用户  
588 - for (String tenantRole : userDTO.getRoleIds()) {  
589 - roleMapper.saveUserRoleMapping(user.getId(), tenantRole);  
590 - }  
591 - organizationService.bindUserToOrganization(  
592 - tenantId, user.getId(), userDTO.getOrganizationIds());  
593 - }else{  
594 - //查询租户的角色  
595 - List<SysTenantRoleEntity> tenantRoleList = validateTenantRole(userDTO.getTenantId());  
596 - for (SysTenantRoleEntity tenantRole : tenantRoleList) {  
597 - roleMapper.saveUserRoleMapping(user.getId(), tenantRole.getRoleId());  
598 - }  
599 - }  
600 - user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN);  
601 - return userDTO;  
602 - }  
603 -  
604 - @Override  
605 - public List<SysTenantRoleEntity> validateTenantRole(String tenantId) {  
606 - List<SysTenantRoleEntity> tenantRoleList =  
607 - tenantRoleMapper.selectList(  
608 - new QueryWrapper<SysTenantRoleEntity>()  
609 - .lambda()  
610 - .eq(SysTenantRoleEntity::getTenantId, tenantId));  
611 - // 保存用户与角色的映射信息  
612 - if (null == tenantRoleList || tenantRoleList.size() == 0) {  
613 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
614 - }  
615 - return tenantRoleList;  
616 - }  
617 -  
618 - @Override  
619 - @Transactional  
620 - public void resetPassword(String userId, String tenantId, String password) {  
621 - UserDTO userDTO = findUserInfoById(userId);  
622 - if (null == userDTO) {  
623 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
624 - }  
625 - userDTO.setPassword(passwordEncoder.encode(password));  
626 - userDTO.setActivateToken(null);  
627 - baseMapper.updateById(userDTO.getEntity(SysUserEntity.class));  
628 - }  
629 -  
630 - @Override  
631 - public void forgetPassword(String phoneNumber, AccountReqDTO forget) {  
632 - String key =  
633 - MsgTemplatePurposeEnum.FOR_FORGET_PASSWORD.name()  
634 - + DEFAULT_DELIMITER  
635 - + MessageTypeEnum.PHONE_MESSAGE.name()  
636 - + DEFAULT_DELIMITER  
637 - + phoneNumber;  
638 - boolean correct =  
639 - cacheUtils  
640 - .get(MOBILE_LOGIN_SMS_CODE, key)  
641 - .map(  
642 - o -> {  
643 - CodeTTL codeTTL = (CodeTTL) o;  
644 - if (System.currentTimeMillis() - codeTTL.getSendTs() < 5 * 60 * 1000) {  
645 - return Objects.equals(codeTTL.getCode(), forget.getUserId());  
646 - } else {  
647 - return false;  
648 - }  
649 - })  
650 - .orElse(false);  
651 - if (!correct) {  
652 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.MSG_CODE_NOT_MATCHED.getI18nCode()));  
653 - }  
654 - String pwd = forget.getPassword();  
655 - if (StringUtils.isEmpty(pwd)) {  
656 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
657 - }  
658 -  
659 - SysUserEntity user =  
660 - baseMapper.selectOne(  
661 - new QueryWrapper<SysUserEntity>()  
662 - .lambda()  
663 - .eq(SysUserEntity::getPhoneNumber, phoneNumber));  
664 -  
665 - if (StringUtils.isNotBlank(user.getTbUser())) {  
666 - UserId userId = new UserId(UUID.fromString(user.getTbUser()));  
667 - UserCredentials userCredentials =  
668 - tbUserService.findUserCredentialsByUserId(TenantId.SYS_TENANT_ID, userId);  
669 -  
670 - userCredentials.setPassword(passwordEncoder.encode(pwd));  
671 - tbUserService.replaceUserCredentials(  
672 - TenantId.fromUUID(UUID.fromString(user.getTenantId())), userCredentials);  
673 - // eventPublisher.publishEvent(new UserAuthDataChangedEvent(userId));  
674 - }  
675 -  
676 - user.setPassword(pwd);  
677 - changePassword(user);  
678 - }  
679 -  
680 - @Override  
681 - public List<UserDetailsDTO> getUserByPhoneNumber(String phoneNumber) {  
682 - return baseMapper.findUserDetailsByPhoneNumber(phoneNumber);  
683 - }  
684 -  
685 - @Override  
686 - public void sendRestPasswordMsg(String tenantId, SendResetPasswordEmailMsg msg) {  
687 - // 通过用户ID查询用户信息  
688 - SysUserEntity user = baseMapper.selectById(msg.getUserId());  
689 - if (null == user) {  
690 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
691 - }  
692 -  
693 - // 通过模板用途和状态查询模板信息  
694 - MessageTemplateDTO messageTemplateDTO = new MessageTemplateDTO();  
695 - String messageType = msg.getMessageTypeEnum().name();  
696 - messageTemplateDTO.setMessageType(messageType);  
697 - messageTemplateDTO.setTemplatePurpose(MsgTemplatePurposeEnum.FOR_SET_PASSWORD.name());  
698 - messageTemplateDTO.setTenantId(tenantId);  
699 - messageTemplateDTO.setStatus(1);  
700 - List<MessageTemplateDTO> templateDTOList =  
701 - messageTemplateService.findMessageTemplate(messageTemplateDTO);  
702 - if (null == templateDTOList || templateDTOList.size() < 1) {  
703 - throw new TkDataValidationException(  
704 - MessageUtils.message(ErrorMessage.TARGET_TEMPLATE_NOT_EXISTS_SELF_NOTICE.getI18nCode()));  
705 - }  
706 - if (messageType.equalsIgnoreCase(MessageTypeEnum.PHONE_MESSAGE.name())) {  
707 - SmsReqDTO smsReqDTO = new SmsReqDTO();  
708 - smsReqDTO.setPhoneNumbers(user.getPhoneNumber());  
709 - smsReqDTO.setId(templateDTOList.get(0).getId());  
710 - LinkedHashMap<String, Object> params = new LinkedHashMap<>();  
711 - params.put("code", accountProperties.getDefaultPassword());  
712 - smsReqDTO.setParams(params);  
713 - smsReqDTO.setTemplatePurpose(messageTemplateDTO.getTemplatePurpose());  
714 - tkSmsService.sendSms(smsReqDTO);  
715 - }  
716 - }  
717 -  
718 - @Override  
719 - public Optional<List<UserDTO>> getOrganizationUserByOrganizationId(  
720 - String groupId, String tenantId) {  
721 - TkOrganizationEntity group = organizationMapper.selectById(groupId);  
722 - if (group == null || !group.getTenantId().equals(tenantId)) {  
723 - return Optional.empty();  
724 - }  
725 - List<String> userIds = userOrganizationMappingService.getUserIdByOrganizationIds(group.getId(),null);  
726 - List<SysUserEntity> users = baseMapper.selectBatchIds(userIds);  
727 - return Optional.ofNullable(ReflectUtils.sourceToTarget(users, UserDTO.class));  
728 - }  
729 -  
730 - @Override  
731 - public String[] getUserRoleOrOrganization(RoleOrOrganizationReqDTO roleOrGroupReqDTO) {  
732 - String userId = roleOrGroupReqDTO.getUserId();  
733 - if (StringUtils.isEmpty(userId)) {  
734 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
735 - }  
736 - if (roleOrGroupReqDTO.isQueryRole()) {  
737 - List<String> roleIds =  
738 - userRoleMapper  
739 - .selectList(  
740 - new QueryWrapper<SysUserRoleEntity>()  
741 - .lambda()  
742 - .eq(SysUserRoleEntity::getUserId, userId))  
743 - .stream()  
744 - .map(SysUserRoleEntity::getRoleId)  
745 - .collect(Collectors.toList());  
746 - List<String> enableRoles =  
747 - roleMapper  
748 - .selectList(  
749 - new QueryWrapper<SysRoleEntity>()  
750 - .lambda()  
751 - .eq(SysRoleEntity::isEnabled, true)  
752 - .in(SysRoleEntity::getId, roleIds))  
753 - .stream()  
754 - .map(m -> m.getId())  
755 - .collect(Collectors.toList());  
756 - if (enableRoles.size() == 0) { 493 + }
  494 +
  495 + private List<String> filterParentUserId(String tenantId, String organizationId, List<String> sourceUserIds) {
  496 + Set<String> organizationIds = organizationService.findOrganizationTreeList(tenantId, OrganizationEnum.UP, List.of(organizationId)).stream()
  497 + .map(OrganizationDTO::getId)
  498 + .collect(Collectors.toSet());
  499 +
  500 + List<String> userIds = userOrganizationMappingService.getUserIdsByOrganizationIds(organizationIds, organizationId);
  501 + return sourceUserIds.stream()
  502 + .filter(element -> !userIds.contains(element))
  503 + .collect(Collectors.toList());
  504 + }
  505 +
  506 + private void fillUserStatus(UserDTO userDTO) {
  507 + userDTO.setUserStatusEnum(UserStatusEnum.NORMAL);
  508 + if (!userDTO.isEnabled()) {
  509 + userDTO.setUserStatusEnum(UserStatusEnum.DISABLED);
  510 + } else {
  511 + if (userDTO.getAccountExpireTime() != null) {
  512 + if (userDTO.getAccountExpireTime().isBefore(LocalDateTime.now())) {
  513 + userDTO.setUserStatusEnum(UserStatusEnum.EXPIRED);
  514 + }
  515 + }
  516 + }
  517 + }
  518 +
  519 + @Override
  520 + @Transactional
  521 + public boolean deleteUser(Set<String> userIds, boolean isPtSysadmin, String tenantId) {
  522 + // 1. 判断是否所有的id都属于此人
  523 + if (!isPtSysadmin) {
  524 + long notTenantUserCount =
  525 + baseMapper.selectCount(
  526 + new QueryWrapper<SysUserEntity>()
  527 + .lambda()
  528 + .ne(SysUserEntity::getTenantId, tenantId)
  529 + .in(SysUserEntity::getId, userIds));
  530 + if (notTenantUserCount > 0) {
  531 + throw new AccessDeniedException("cannot delete user that not belong to your tenant");
  532 + }
  533 + }
  534 + // 2. 删除人员对应的 role
  535 + roleMapper.deleteRoleUserMappingByUserIds(userIds);
  536 +
  537 + // 3. 解绑人员对应的group
  538 +
  539 + organizationService.unBindUserToOrganization(userIds);
  540 +
  541 + // 4. 删除人员
  542 + baseMapper.deleteBatchIds(userIds);
  543 +
  544 + // 5、删除场景联动
  545 + Wrapper filter =
  546 + new QueryWrapper<TkSceneLinkageEntity>()
  547 + .lambda()
  548 + .in(TkSceneLinkageEntity::getCreator, userIds);
  549 + List<TkSceneLinkageEntity> sceneLinkages = sceneLinkageMapper.selectList(filter);
  550 + if (sceneLinkages == null || sceneLinkages.isEmpty()) {
  551 + return true;
  552 + }
  553 + Set<String> sceneIds = sceneLinkages.stream().map(i -> i.getId()).collect(Collectors.toSet());
  554 + sceneLinkageService.deleteSceneLinkage(sceneIds, tenantId, null);
  555 +
  556 + return true;
  557 + }
  558 +
  559 + @Override
  560 + @Transactional
  561 + public UserDTO saveTenantAdmin(UserDTO userDTO, boolean isPtSysadmin, String tenantId) {
  562 + if (StringUtils.isNotBlank(userDTO.getId())) {
  563 + return updateUser(userDTO, isPtSysadmin, tenantId);
  564 + }
  565 + SysUserEntity user = new SysUserEntity();
  566 + userDTO.copyToEntity(user, ID, PASSWORD, CREATE_TIME, UPDATE_TIME, ACTIVATE_TOKEN);
  567 + user.setPassword(passwordEncoder.encode(accountProperties.getDefaultPassword()));
  568 + //判断是租户管理员还是普通租户
  569 + Integer level = null;
  570 + if (null != userDTO.getLevel() && userDTO.getLevel() == MagicNumber.FOUR) {
  571 + level = FastIotConstants.LevelValue.IS_CUSTOMER_TENANT;
  572 + } else if (null != userDTO.getLevel() && userDTO.getLevel() == MagicNumber.FIVE) {
  573 + level = FastIotConstants.LevelValue.IS_OPENAPI_USER;
  574 + } else {
  575 + level = FastIotConstants.LevelValue.IS_TENANT_ADMIN;
  576 + }
  577 + user.setLevel(level);
  578 + List<SysUserEntity> users =
  579 + baseMapper.selectList(
  580 + new QueryWrapper<SysUserEntity>()
  581 + .lambda()
  582 + .eq(SysUserEntity::getUsername, userDTO.getUsername()));
  583 + if (!users.isEmpty()) {
  584 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.USER_ISNOT_NULL.getI18nCode()));
  585 + }
  586 + baseMapper.insert(user);
  587 + // 如果为普通租户绑定用户和组织的关系和角色
  588 + if (null != level && (level == FastIotConstants.MagicNumber.FOUR || level == FastIotConstants.LevelValue.IS_OPENAPI_USER)) {
  589 + //如果是普通租户或者openapi用户
  590 + for (String tenantRole : userDTO.getRoleIds()) {
  591 + roleMapper.saveUserRoleMapping(user.getId(), tenantRole);
  592 + }
  593 + organizationService.bindUserToOrganization(
  594 + tenantId, user.getId(), userDTO.getOrganizationIds());
  595 + } else {
  596 + //查询租户的角色
  597 + List<SysTenantRoleEntity> tenantRoleList = validateTenantRole(userDTO.getTenantId());
  598 + for (SysTenantRoleEntity tenantRole : tenantRoleList) {
  599 + roleMapper.saveUserRoleMapping(user.getId(), tenantRole.getRoleId());
  600 + }
  601 + }
  602 + user.copyToDTO(userDTO, PASSWORD, ACTIVATE_TOKEN);
  603 + return userDTO;
  604 + }
  605 +
  606 + @Override
  607 + public List<SysTenantRoleEntity> validateTenantRole(String tenantId) {
  608 + List<SysTenantRoleEntity> tenantRoleList =
  609 + tenantRoleMapper.selectList(
  610 + new QueryWrapper<SysTenantRoleEntity>()
  611 + .lambda()
  612 + .eq(SysTenantRoleEntity::getTenantId, tenantId));
  613 + // 保存用户与角色的映射信息
  614 + if (null == tenantRoleList || tenantRoleList.size() == 0) {
  615 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  616 + }
  617 + return tenantRoleList;
  618 + }
  619 +
  620 + @Override
  621 + @Transactional
  622 + public void resetPassword(String userId, String tenantId, String password) {
  623 + UserDTO userDTO = findUserInfoById(userId);
  624 + if (null == userDTO) {
  625 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  626 + }
  627 + userDTO.setPassword(passwordEncoder.encode(password));
  628 + userDTO.setActivateToken(null);
  629 + baseMapper.updateById(userDTO.getEntity(SysUserEntity.class));
  630 + }
  631 +
  632 + @Override
  633 + public void forgetPassword(String phoneNumber, AccountReqDTO forget) {
  634 + String key =
  635 + MsgTemplatePurposeEnum.FOR_FORGET_PASSWORD.name()
  636 + + DEFAULT_DELIMITER
  637 + + MessageTypeEnum.PHONE_MESSAGE.name()
  638 + + DEFAULT_DELIMITER
  639 + + phoneNumber;
  640 + boolean correct =
  641 + cacheUtils
  642 + .get(MOBILE_LOGIN_SMS_CODE, key)
  643 + .map(
  644 + o -> {
  645 + CodeTTL codeTTL = (CodeTTL) o;
  646 + if (System.currentTimeMillis() - codeTTL.getSendTs() < 5 * 60 * 1000) {
  647 + return Objects.equals(codeTTL.getCode(), forget.getUserId());
  648 + } else {
  649 + return false;
  650 + }
  651 + })
  652 + .orElse(false);
  653 + if (!correct) {
  654 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.MSG_CODE_NOT_MATCHED.getI18nCode()));
  655 + }
  656 + String pwd = forget.getPassword();
  657 + if (StringUtils.isEmpty(pwd)) {
  658 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  659 + }
  660 +
  661 + SysUserEntity user =
  662 + baseMapper.selectOne(
  663 + new QueryWrapper<SysUserEntity>()
  664 + .lambda()
  665 + .eq(SysUserEntity::getPhoneNumber, phoneNumber));
  666 +
  667 + if (StringUtils.isNotBlank(user.getTbUser())) {
  668 + UserId userId = new UserId(UUID.fromString(user.getTbUser()));
  669 + UserCredentials userCredentials =
  670 + tbUserService.findUserCredentialsByUserId(TenantId.SYS_TENANT_ID, userId);
  671 +
  672 + userCredentials.setPassword(passwordEncoder.encode(pwd));
  673 + tbUserService.replaceUserCredentials(
  674 + TenantId.fromUUID(UUID.fromString(user.getTenantId())), userCredentials);
  675 + // eventPublisher.publishEvent(new UserAuthDataChangedEvent(userId));
  676 + }
  677 +
  678 + user.setPassword(pwd);
  679 + changePassword(user);
  680 + }
  681 +
  682 + @Override
  683 + public List<UserDetailsDTO> getUserByPhoneNumber(String phoneNumber) {
  684 + return baseMapper.findUserDetailsByPhoneNumber(phoneNumber);
  685 + }
  686 +
  687 + @Override
  688 + public void sendRestPasswordMsg(String tenantId, SendResetPasswordEmailMsg msg) {
  689 + // 通过用户ID查询用户信息
  690 + SysUserEntity user = baseMapper.selectById(msg.getUserId());
  691 + if (null == user) {
  692 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  693 + }
  694 +
  695 + // 通过模板用途和状态查询模板信息
  696 + MessageTemplateDTO messageTemplateDTO = new MessageTemplateDTO();
  697 + String messageType = msg.getMessageTypeEnum().name();
  698 + messageTemplateDTO.setMessageType(messageType);
  699 + messageTemplateDTO.setTemplatePurpose(MsgTemplatePurposeEnum.FOR_SET_PASSWORD.name());
  700 + messageTemplateDTO.setTenantId(tenantId);
  701 + messageTemplateDTO.setStatus(1);
  702 + List<MessageTemplateDTO> templateDTOList =
  703 + messageTemplateService.findMessageTemplate(messageTemplateDTO);
  704 + if (null == templateDTOList || templateDTOList.size() < 1) {
  705 + throw new TkDataValidationException(
  706 + MessageUtils.message(ErrorMessage.TARGET_TEMPLATE_NOT_EXISTS_SELF_NOTICE.getI18nCode()));
  707 + }
  708 + if (messageType.equalsIgnoreCase(MessageTypeEnum.PHONE_MESSAGE.name())) {
  709 + SmsReqDTO smsReqDTO = new SmsReqDTO();
  710 + smsReqDTO.setPhoneNumbers(user.getPhoneNumber());
  711 + smsReqDTO.setId(templateDTOList.get(0).getId());
  712 + LinkedHashMap<String, Object> params = new LinkedHashMap<>();
  713 + params.put("code", accountProperties.getDefaultPassword());
  714 + smsReqDTO.setParams(params);
  715 + smsReqDTO.setTemplatePurpose(messageTemplateDTO.getTemplatePurpose());
  716 + tkSmsService.sendSms(smsReqDTO);
  717 + }
  718 + }
  719 +
  720 + @Override
  721 + public Optional<List<UserDTO>> getOrganizationUserByOrganizationId(
  722 + String groupId, String tenantId) {
  723 + TkOrganizationEntity group = organizationMapper.selectById(groupId);
  724 + if (group == null || !group.getTenantId().equals(tenantId)) {
  725 + return Optional.empty();
  726 + }
  727 + List<String> userIds = userOrganizationMappingService.getUserIdByOrganizationIds(group.getId(), null);
  728 + List<SysUserEntity> users = baseMapper.selectBatchIds(userIds);
  729 + return Optional.ofNullable(ReflectUtils.sourceToTarget(users, UserDTO.class));
  730 + }
  731 +
  732 + @Override
  733 + public String[] getUserRoleOrOrganization(RoleOrOrganizationReqDTO roleOrGroupReqDTO) {
  734 + String userId = roleOrGroupReqDTO.getUserId();
  735 + if (StringUtils.isEmpty(userId)) {
  736 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  737 + }
  738 + if (roleOrGroupReqDTO.isQueryRole()) {
  739 + List<String> roleIds =
  740 + userRoleMapper
  741 + .selectList(
  742 + new QueryWrapper<SysUserRoleEntity>()
  743 + .lambda()
  744 + .eq(SysUserRoleEntity::getUserId, userId))
  745 + .stream()
  746 + .map(SysUserRoleEntity::getRoleId)
  747 + .collect(Collectors.toList());
  748 + List<String> enableRoles =
  749 + roleMapper
  750 + .selectList(
  751 + new QueryWrapper<SysRoleEntity>()
  752 + .lambda()
  753 + .eq(SysRoleEntity::isEnabled, true)
  754 + .in(SysRoleEntity::getId, roleIds))
  755 + .stream()
  756 + .map(m -> m.getId())
  757 + .collect(Collectors.toList());
  758 + if (enableRoles.size() == 0) {
  759 + return null;
  760 + }
  761 + return enableRoles.toArray(new String[enableRoles.size()]);
  762 + }
  763 + if (roleOrGroupReqDTO.isQueryOrganization()) {
  764 + List<String> organizationIds =
  765 + userOrganizationMappingService.getOrganizationIdsByUserId(userId);
  766 + return organizationIds.toArray(new String[organizationIds.size()]);
  767 + }
  768 + return null;
  769 + }
  770 +
  771 + @Override
  772 + @Transactional
  773 + public boolean changePassword(SysUserEntity user) {
  774 + // 修改密码
  775 + user.setPassword(passwordEncoder.encode(user.getPassword()));
  776 + user.setActivateToken(RandomStringUtils.randomAlphabetic(10));
  777 + return baseMapper.updateById(user) > 0;
  778 + }
  779 +
  780 + @Override
  781 + public String findUserCustomerIdById(String id) {
  782 + if (StringUtils.isEmpty(id)) {
  783 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  784 + }
  785 + String customerId = baseMapper.findUserCustomerIdById(id);
  786 + if (null == customerId) {
  787 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.USER_NOT_EXISTS.getI18nCode()));
  788 + }
  789 + return customerId;
  790 + }
  791 +
  792 + @Override
  793 + public UserDTO updatePersonalCenter(UserDTO userDTO) {
  794 + SysUserEntity user = baseMapper.selectById(userDTO.getId());
  795 + user.setRealName(userDTO.getRealName());
  796 + user.setEmail(userDTO.getEmail());
  797 + user.setAvatar(userDTO.getAvatar());
  798 + user.setPhoneNumber(userDTO.getPhoneNumber());
  799 + baseMapper.updateById(user);
  800 + user.copyToDTO(userDTO);
  801 + return userDTO;
  802 + }
  803 +
  804 + @Override
  805 + public List<UserDTO> getMyCustomers(
  806 + String organizationId, String tenantId, boolean isTenantAdmin, boolean isPtCommonTenant, List<String> orgIds) {
  807 + if (StringUtils.isEmpty(organizationId)) {
  808 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  809 + }
  810 + List<String> userList =
  811 + userOrganizationMappingService.getUserIdByOrganizationIds(tenantId, OrganizationEnum.UP, organizationId);
  812 + if (isPtCommonTenant) {
  813 + List<String> DownUserList =
  814 + userOrganizationMappingService.getUserIdByOrganizationIds(tenantId, null, orgIds.toArray(new String[orgIds.size()]));
  815 + userList = userList.stream().filter(DownUserList::contains).collect(Collectors.toList());
  816 + }
  817 + if (isTenantAdmin || isPtCommonTenant) {
  818 + if (null != userList && userList.size() > FastIotConstants.MagicNumber.ZERO) {
  819 + return baseMapper.getMyCustomers(tenantId, EntityId.NULL_UUID.toString(), userList);
  820 + }
  821 + }
757 return null; 822 return null;
758 - }  
759 - return enableRoles.toArray(new String[enableRoles.size()]);  
760 - }  
761 - if (roleOrGroupReqDTO.isQueryOrganization()) {  
762 - List<String> organizationIds =  
763 - userOrganizationMappingService.getOrganizationIdsByUserId(userId);  
764 - return organizationIds.toArray(new String[organizationIds.size()]);  
765 - }  
766 - return null;  
767 - }  
768 -  
769 - @Override  
770 - @Transactional  
771 - public boolean changePassword(SysUserEntity user) {  
772 - // 修改密码  
773 - user.setPassword(passwordEncoder.encode(user.getPassword()));  
774 - user.setActivateToken(RandomStringUtils.randomAlphabetic(10));  
775 - return baseMapper.updateById(user) > 0;  
776 - }  
777 -  
778 - @Override  
779 - public String findUserCustomerIdById(String id) {  
780 - if (StringUtils.isEmpty(id)) {  
781 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
782 - }  
783 - String customerId = baseMapper.findUserCustomerIdById(id);  
784 - if (null == customerId) {  
785 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.USER_NOT_EXISTS.getI18nCode()));  
786 - }  
787 - return customerId;  
788 - }  
789 -  
790 - @Override  
791 - public UserDTO updatePersonalCenter(UserDTO userDTO) {  
792 - SysUserEntity user = baseMapper.selectById(userDTO.getId());  
793 - user.setRealName(userDTO.getRealName());  
794 - user.setEmail(userDTO.getEmail());  
795 - user.setAvatar(userDTO.getAvatar());  
796 - user.setPhoneNumber(userDTO.getPhoneNumber());  
797 - baseMapper.updateById(user);  
798 - user.copyToDTO(userDTO);  
799 - return userDTO;  
800 - }  
801 -  
802 - @Override  
803 - public List<UserDTO> getMyCustomers(  
804 - String organizationId, String tenantId, boolean isTenantAdmin,boolean isPtCommonTenant,List<String>orgIds) {  
805 - if (StringUtils.isEmpty(organizationId)) {  
806 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
807 - }  
808 - List<String> userList =  
809 - userOrganizationMappingService.getUserIdByOrganizationIds(tenantId, OrganizationEnum.UP, organizationId);  
810 - if(isPtCommonTenant){  
811 - List<String> DownUserList =  
812 - userOrganizationMappingService.getUserIdByOrganizationIds(tenantId, null, orgIds.toArray(new String[orgIds.size()]));  
813 - userList = userList.stream().filter(DownUserList::contains).collect(Collectors.toList());  
814 - }  
815 - if (isTenantAdmin||isPtCommonTenant) {  
816 - if (null != userList && userList.size() > FastIotConstants.MagicNumber.ZERO) {  
817 - return baseMapper.getMyCustomers(tenantId, EntityId.NULL_UUID.toString(), userList);  
818 - }  
819 - }  
820 - return null;  
821 - }  
822 -  
823 - @Override  
824 - @Async  
825 - public CompletableFuture<TkTsValue> findUsersAsyncByTs(  
826 - LocalDateTime startTs, LocalDateTime endTs, String date) {  
827 - DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");  
828 - String startTime = df.format(startTs);  
829 - String endTime = df.format(endTs);  
830 - List<UserDTO> list = baseMapper.findUsersAsyncByTs(startTime, endTime);  
831 - return CompletableFuture.supplyAsync(() -> new TkTsValue(date, String.valueOf(list.size())));  
832 - }  
833 -  
834 - @Override  
835 - public UserDTO checkAccount(String userId, Integer level) {  
836 - SysUserEntity user =  
837 - baseMapper.selectOne(  
838 - new LambdaQueryWrapper<SysUserEntity>()  
839 - .eq(SysUserEntity::getId, userId)  
840 - .eq(SysUserEntity::getLevel, level));  
841 - return null != user ? user.getDTO(UserDTO.class) : null;  
842 - }  
843 -  
844 - @Override  
845 - public List<UserDTO> findAllTenantAdminsByTenantId(String tenantId) {  
846 - List<SysUserEntity> entities =  
847 - baseMapper.selectList(  
848 - new LambdaQueryWrapper<SysUserEntity>()  
849 - .eq(SysUserEntity::getTenantId, tenantId)  
850 - .eq(SysUserEntity::getLevel, 2));  
851 - if (null != entities && !entities.isEmpty()) {  
852 - return entities.stream()  
853 - .map(entity -> entity.getDTO(UserDTO.class))  
854 - .collect(Collectors.toList());  
855 - }  
856 - return null;  
857 - }  
858 -  
859 - @Override  
860 - public UserDTO accountExist(String userName) {  
861 - if (StringUtils.isEmpty(userName)) {  
862 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
863 - }  
864 - UserDTO userDTO = new UserDTO();  
865 - userDTO.setUsername(userName);  
866 - return baseMapper.findUserInfo(userDTO);  
867 - }  
868 -  
869 - /**  
870 - * 判断手机号是否重复  
871 - *  
872 - * @param phoneNumber 手机号  
873 - * @return  
874 - */  
875 - @Override  
876 - public UserDTO findUserByPhoneNumber(String phoneNumber) {  
877 - if (StringUtils.isEmpty(phoneNumber)) {  
878 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
879 - }  
880 - UserDTO userDTO = new UserDTO();  
881 - userDTO.setPhoneNumber(phoneNumber);  
882 - List<UserDTO> list = baseMapper.findUserInfoByPhoneNumber(userDTO);  
883 - return null != list && list.size() > 0 ? list.get(0) : null;  
884 - }  
885 -  
886 - @Override  
887 - public SysUserEntity validateChangePasswordAccount(AccountReqDTO accountReqDTO) {  
888 - SysUserEntity user = baseMapper.selectById(accountReqDTO.getUserId());  
889 - checkPassword(accountReqDTO, user);  
890 - return user;  
891 - }  
892 -  
893 - @Override  
894 - public void updateTenantAdminUserCredentials(  
895 - List<UserId> ids,  
896 - String currentTenantId,  
897 - boolean userCredentialsEnabled,  
898 - boolean needUpdateStatus) {  
899 - TenantId tenantId = new TenantId(UUID.fromString(currentTenantId));  
900 - for (UserId id : ids) {  
901 - tbUserService.setUserCredentialsEnabled(tenantId, id, userCredentialsEnabled);  
902 - eventPublisher.publishEvent(new UserCredentialsInvalidationEvent(id));  
903 - // 更新租户管理员的状态  
904 - if (needUpdateStatus) {  
905 - SysUserEntity entity =  
906 - baseMapper.selectOne(  
907 - new LambdaQueryWrapper<SysUserEntity>()  
908 - .eq(SysUserEntity::getTenantId, currentTenantId)  
909 - .eq(SysUserEntity::getTbUser, id.getId().toString()));  
910 - if (null != entity) {  
911 - entity.setTbUser(id.getId().toString());  
912 - entity.setEnabled(userCredentialsEnabled);  
913 - baseMapper.updateById(entity);  
914 - }  
915 - }  
916 - }  
917 - }  
918 -  
919 - @Override  
920 - @Transactional  
921 - public boolean deleteUserAndRoleMapping(List<String> userIds,String tenantId) {  
922 - if(StringUtils.isEmpty(tenantId) || null == userIds || userIds.isEmpty()){  
923 - return false;  
924 - }  
925 - boolean result;  
926 - result = baseMapper.delete(new LambdaQueryWrapper<SysUserEntity>().eq(SysUserEntity::getTenantId,tenantId).in(  
927 - SysUserEntity::getId,userIds))> MagicNumber.ZERO;  
928 - if(result){  
929 - result = userRoleMapper.delete(new LambdaQueryWrapper<SysUserRoleEntity>().in(SysUserRoleEntity::getUserId,  
930 - userIds))>MagicNumber.ZERO;  
931 - }  
932 - return result;  
933 - }  
934 -  
935 - @Override  
936 - public List<String> findUserIdsByTenantId(String tenantId) {  
937 - List<SysUserEntity> entities = baseMapper.selectList(new LambdaQueryWrapper<SysUserEntity>().  
938 - eq(SysUserEntity::getTenantId,tenantId));  
939 - if(null == entities || entities.isEmpty()){  
940 - return null;  
941 - }  
942 - return entities.stream().map(entity->entity.getId()).collect(Collectors.toList());  
943 - }  
944 -  
945 - @Override  
946 - public List<UserDTO> findUserByUserIdList(List<String> userIdList) {  
947 - if (CollectionUtils.isEmpty(userIdList)) {  
948 - return new ArrayList<>(0);  
949 - }  
950 -  
951 - List<SysUserEntity> entities =  
952 - baseMapper.selectList(  
953 - new LambdaQueryWrapper<SysUserEntity>()  
954 - .in(SysUserEntity::getId, userIdList));  
955 - if (null != entities && !entities.isEmpty()) {  
956 - return entities.stream()  
957 - .map(entity -> entity.getDTO(UserDTO.class))  
958 - .collect(Collectors.toList());  
959 - }  
960 -  
961 - return null;  
962 - }  
963 -  
964 - private void checkPassword(AccountReqDTO accountReqDTO, SysUserEntity user) {  
965 - if (null == user  
966 - || StringUtils.isEmpty(accountReqDTO.getPassword())  
967 - || StringUtils.isEmpty(accountReqDTO.getResetPassword())) {  
968 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
969 - }  
970 - // 判断用户密码是否正确  
971 - boolean isMatch = passwordEncoder.matches(accountReqDTO.getPassword(), user.getPassword());  
972 - if (!isMatch) {  
973 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.PASSWORD_INCORRECT.getI18nCode()));  
974 - }  
975 - user.setPassword(accountReqDTO.getResetPassword());  
976 - }  
977 -  
978 - /**  
979 - * 先删除用户与角色的关系,再添加新的关系  
980 - *  
981 - * @param userId 用户ID  
982 - * @param roleIds 角色ID  
983 - */  
984 - private void deleteAndAddUserRole(String userId, List<String> roleIds) {  
985 - if (StringUtils.isEmpty(userId) || null == roleIds || roleIds.size() < 1) {  
986 - throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));  
987 - }  
988 - // 先删除用户与角色的关系,再添加用户与角色的关系  
989 - List<String> userIds = new ArrayList<>();  
990 - userIds.add(userId);  
991 - roleMapper.deleteRoleUserMappingByUserIds(userIds);  
992 - roleIds.forEach(  
993 - role -> {  
994 - roleMapper.saveUserRoleMapping(userId, role);  
995 - });  
996 - } 823 + }
  824 +
  825 + @Override
  826 + @Async
  827 + public CompletableFuture<TkTsValue> findUsersAsyncByTs(
  828 + LocalDateTime startTs, LocalDateTime endTs, String date) {
  829 + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  830 + String startTime = df.format(startTs);
  831 + String endTime = df.format(endTs);
  832 + List<UserDTO> list = baseMapper.findUsersAsyncByTs(startTime, endTime);
  833 + return CompletableFuture.supplyAsync(() -> new TkTsValue(date, String.valueOf(list.size())));
  834 + }
  835 +
  836 + @Override
  837 + public UserDTO checkAccount(String userId, Integer level) {
  838 + SysUserEntity user =
  839 + baseMapper.selectOne(
  840 + new LambdaQueryWrapper<SysUserEntity>()
  841 + .eq(SysUserEntity::getId, userId)
  842 + .eq(SysUserEntity::getLevel, level));
  843 + return null != user ? user.getDTO(UserDTO.class) : null;
  844 + }
  845 +
  846 + @Override
  847 + public List<UserDTO> findAllTenantAdminsByTenantId(String tenantId) {
  848 + List<SysUserEntity> entities =
  849 + baseMapper.selectList(
  850 + new LambdaQueryWrapper<SysUserEntity>()
  851 + .eq(SysUserEntity::getTenantId, tenantId)
  852 + .eq(SysUserEntity::getLevel, 2));
  853 + if (null != entities && !entities.isEmpty()) {
  854 + return entities.stream()
  855 + .map(entity -> entity.getDTO(UserDTO.class))
  856 + .collect(Collectors.toList());
  857 + }
  858 + return null;
  859 + }
  860 +
  861 + @Override
  862 + public UserDTO accountExist(String userName) {
  863 + if (StringUtils.isEmpty(userName)) {
  864 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  865 + }
  866 + UserDTO userDTO = new UserDTO();
  867 + userDTO.setUsername(userName);
  868 + return baseMapper.findUserInfo(userDTO);
  869 + }
  870 +
  871 + /**
  872 + * 判断手机号是否重复
  873 + *
  874 + * @param phoneNumber 手机号
  875 + * @return
  876 + */
  877 + @Override
  878 + public UserDTO findUserByPhoneNumber(String phoneNumber) {
  879 + if (StringUtils.isEmpty(phoneNumber)) {
  880 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  881 + }
  882 + UserDTO userDTO = new UserDTO();
  883 + userDTO.setPhoneNumber(phoneNumber);
  884 + List<UserDTO> list = baseMapper.findUserInfoByPhoneNumber(userDTO);
  885 + return null != list && list.size() > 0 ? list.get(0) : null;
  886 + }
  887 +
  888 + @Override
  889 + public SysUserEntity validateChangePasswordAccount(AccountReqDTO accountReqDTO) {
  890 + SysUserEntity user = baseMapper.selectById(accountReqDTO.getUserId());
  891 + checkPassword(accountReqDTO, user);
  892 + return user;
  893 + }
  894 +
  895 + @Override
  896 + public void updateTenantAdminUserCredentials(
  897 + List<UserId> ids,
  898 + String currentTenantId,
  899 + boolean userCredentialsEnabled,
  900 + boolean needUpdateStatus) {
  901 + TenantId tenantId = new TenantId(UUID.fromString(currentTenantId));
  902 + for (UserId id : ids) {
  903 + tbUserService.setUserCredentialsEnabled(tenantId, id, userCredentialsEnabled);
  904 + eventPublisher.publishEvent(new UserCredentialsInvalidationEvent(id));
  905 + // 更新租户管理员的状态
  906 + if (needUpdateStatus) {
  907 + SysUserEntity entity =
  908 + baseMapper.selectOne(
  909 + new LambdaQueryWrapper<SysUserEntity>()
  910 + .eq(SysUserEntity::getTenantId, currentTenantId)
  911 + .eq(SysUserEntity::getTbUser, id.getId().toString()));
  912 + if (null != entity) {
  913 + entity.setTbUser(id.getId().toString());
  914 + entity.setEnabled(userCredentialsEnabled);
  915 + baseMapper.updateById(entity);
  916 + }
  917 + }
  918 + }
  919 + }
  920 +
  921 + @Override
  922 + @Transactional
  923 + public boolean deleteUserAndRoleMapping(List<String> userIds, String tenantId) {
  924 + if (StringUtils.isEmpty(tenantId) || null == userIds || userIds.isEmpty()) {
  925 + return false;
  926 + }
  927 + boolean result;
  928 + result = baseMapper.delete(new LambdaQueryWrapper<SysUserEntity>().eq(SysUserEntity::getTenantId, tenantId).in(
  929 + SysUserEntity::getId, userIds)) > MagicNumber.ZERO;
  930 + if (result) {
  931 + result = userRoleMapper.delete(new LambdaQueryWrapper<SysUserRoleEntity>().in(SysUserRoleEntity::getUserId,
  932 + userIds)) > MagicNumber.ZERO;
  933 + }
  934 + return result;
  935 + }
  936 +
  937 + @Override
  938 + public List<String> findUserIdsByTenantId(String tenantId) {
  939 + List<SysUserEntity> entities = baseMapper.selectList(new LambdaQueryWrapper<SysUserEntity>().
  940 + eq(SysUserEntity::getTenantId, tenantId));
  941 + if (null == entities || entities.isEmpty()) {
  942 + return null;
  943 + }
  944 + return entities.stream().map(entity -> entity.getId()).collect(Collectors.toList());
  945 + }
  946 +
  947 + @Override
  948 + public List<UserDTO> findUserByUserIdList(List<String> userIdList) {
  949 + if (CollectionUtils.isEmpty(userIdList)) {
  950 + return new ArrayList<>(0);
  951 + }
  952 +
  953 + List<SysUserEntity> entities =
  954 + baseMapper.selectList(
  955 + new LambdaQueryWrapper<SysUserEntity>()
  956 + .in(SysUserEntity::getId, userIdList));
  957 + if (null != entities && !entities.isEmpty()) {
  958 + return entities.stream()
  959 + .map(entity -> entity.getDTO(UserDTO.class))
  960 + .collect(Collectors.toList());
  961 + }
  962 +
  963 + return null;
  964 + }
  965 +
  966 + @Override
  967 + public Map<String, UserDTO> findUserByUserIdListMap(List<String> userIdList) {
  968 + if (CollectionUtils.isEmpty(userIdList)) {
  969 + return new HashMap<>(0);
  970 + }
  971 +
  972 + List<SysUserEntity> entities =
  973 + baseMapper.selectList(
  974 + new LambdaQueryWrapper<SysUserEntity>()
  975 + .in(SysUserEntity::getId, userIdList));
  976 + if (null != entities && !entities.isEmpty()) {
  977 + return entities.stream()
  978 + .collect(Collectors.toMap(SysUserEntity::getId, entity -> entity.getDTO(UserDTO.class)));
  979 + }
  980 + return null;
  981 + }
  982 +
  983 + private void checkPassword(AccountReqDTO accountReqDTO, SysUserEntity user) {
  984 + if (null == user
  985 + || StringUtils.isEmpty(accountReqDTO.getPassword())
  986 + || StringUtils.isEmpty(accountReqDTO.getResetPassword())) {
  987 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  988 + }
  989 + // 判断用户密码是否正确
  990 + boolean isMatch = passwordEncoder.matches(accountReqDTO.getPassword(), user.getPassword());
  991 + if (!isMatch) {
  992 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.PASSWORD_INCORRECT.getI18nCode()));
  993 + }
  994 + user.setPassword(accountReqDTO.getResetPassword());
  995 + }
  996 +
  997 + /**
  998 + * 先删除用户与角色的关系,再添加新的关系
  999 + *
  1000 + * @param userId 用户ID
  1001 + * @param roleIds 角色ID
  1002 + */
  1003 + private void deleteAndAddUserRole(String userId, List<String> roleIds) {
  1004 + if (StringUtils.isEmpty(userId) || null == roleIds || roleIds.size() < 1) {
  1005 + throw new TkDataValidationException(MessageUtils.message(ErrorMessage.INVALID_PARAMETER.getI18nCode()));
  1006 + }
  1007 + // 先删除用户与角色的关系,再添加用户与角色的关系
  1008 + List<String> userIds = new ArrayList<>();
  1009 + userIds.add(userId);
  1010 + roleMapper.deleteRoleUserMappingByUserIds(userIds);
  1011 + roleIds.forEach(
  1012 + role -> {
  1013 + roleMapper.saveUserRoleMapping(userId, role);
  1014 + });
  1015 + }
997 } 1016 }
@@ -16,4 +16,19 @@ public interface BrainDeviceCategoryService extends BaseService<BrainDeviceCateg @@ -16,4 +16,19 @@ public interface BrainDeviceCategoryService extends BaseService<BrainDeviceCateg
16 BrainDeviceCategoryDTO detail(String id) throws ThingsboardException; 16 BrainDeviceCategoryDTO detail(String id) throws ThingsboardException;
17 17
18 boolean delete(String id) throws ThingsboardException; 18 boolean delete(String id) throws ThingsboardException;
  19 +
  20 +
  21 + /**
  22 + * 批量删除
  23 + *
  24 + * @param BrainDeviceCategoryDTO 删除IDS
  25 + */
  26 + boolean deleteBath(BrainDeviceCategoryDTO BrainDeviceCategoryDTO) throws ThingsboardException;
  27 +
  28 + /**
  29 + * 批量更新状态
  30 + *
  31 + * @param BrainDeviceCategoryDTO 更新状态
  32 + */
  33 + void updateStatus(BrainDeviceCategoryDTO BrainDeviceCategoryDTO) throws ThingsboardException;
19 } 34 }
@@ -182,4 +182,11 @@ public interface TkUserService { @@ -182,4 +182,11 @@ public interface TkUserService {
182 List<String> findUserIdsByTenantId(String tenantId); 182 List<String> findUserIdsByTenantId(String tenantId);
183 183
184 List<UserDTO> findUserByUserIdList(List<String> userIdList); 184 List<UserDTO> findUserByUserIdList(List<String> userIdList);
  185 +
  186 + /**
  187 + * 获取人员信息map
  188 + * @param userIdList
  189 + * @return
  190 + */
  191 + Map<String,UserDTO> findUserByUserIdListMap(List<String> userIdList);
185 } 192 }
@@ -22,11 +22,8 @@ @@ -22,11 +22,8 @@
22 <if test="queryMap.tenantId !=null and queryMap.tenantId !=''"> 22 <if test="queryMap.tenantId !=null and queryMap.tenantId !=''">
23 AND o.tenant_id = #{queryMap.tenantId} 23 AND o.tenant_id = #{queryMap.tenantId}
24 </if> 24 </if>
25 - <if test="queryMap.code !=null and queryMap.code !=''">  
26 - AND o.code ILIKE concat('%',#{queryMap.code}::TEXT,'%')  
27 - </if>  
28 <if test="queryMap.name !=null and queryMap.name !=''"> 25 <if test="queryMap.name !=null and queryMap.name !=''">
29 - AND o.name ILIKE concat('%',#{queryMap.name}::TEXT,'%') 26 + AND (o.name ILIKE concat('%',#{queryMap.name}::TEXT,'%') OR o.code ILIKE concat('%',#{queryMap.name}::TEXT,'%'))
30 </if> 27 </if>
31 <if test="queryMap.status !=null and queryMap.status !=''"> 28 <if test="queryMap.status !=null and queryMap.status !=''">
32 AND o.status = #{queryMap.status} 29 AND o.status = #{queryMap.status}