Commit 134fff173319370f814ee74b96716ca9a69a6fa7

Authored by 盛长浩
1 parent bb70b3c9

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

... ... @@ -7,9 +7,12 @@ import lombok.extern.slf4j.Slf4j;
7 7 import org.apache.commons.lang3.StringUtils;
8 8 import org.springframework.http.ResponseEntity;
9 9 import org.springframework.security.access.prepost.PreAuthorize;
  10 +import org.springframework.validation.annotation.Validated;
10 11 import org.springframework.web.bind.annotation.*;
11 12 import org.thingsboard.server.common.data.exception.ThingsboardException;
  13 +import org.thingsboard.server.common.data.yunteng.common.DeleteGroup;
12 14 import org.thingsboard.server.common.data.yunteng.dto.BrainDeviceCategoryDTO;
  15 +import org.thingsboard.server.common.data.yunteng.utils.tools.ResponseResult;
13 16 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData;
14 17 import org.thingsboard.server.controller.BaseController;
15 18 import org.thingsboard.server.dao.yunteng.service.BrainDeviceCategoryService;
... ... @@ -37,7 +40,6 @@ public class BrainDeviceCategoryController extends BaseController {
37 40 @RequestParam(PAGE_SIZE) int pageSize,
38 41 @RequestParam(PAGE) int page,
39 42 @RequestParam(value = "name", required = false) String name,
40   - @RequestParam(value = "code", required = false) String code,
41 43 @RequestParam(value = "status", required = false) String status
42 44 ) throws ThingsboardException {
43 45 Map<String, Object> queryMap = new HashMap<>();
... ... @@ -47,10 +49,6 @@ public class BrainDeviceCategoryController extends BaseController {
47 49 queryMap.put("name", name);
48 50 }
49 51
50   - if (StringUtils.isNotBlank(code)) {
51   - queryMap.put("code", code);
52   - }
53   -
54 52 if (StringUtils.isNotBlank(status)) {
55 53 queryMap.put("status", status);
56 54 }
... ... @@ -76,4 +74,26 @@ public class BrainDeviceCategoryController extends BaseController {
76 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 3 import io.swagger.annotations.ApiModelProperty;
4 4 import lombok.Data;
5 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 11 @EqualsAndHashCode(callSuper = true)
8 12 @Data
... ... @@ -18,4 +22,11 @@ public class BrainDeviceCategoryDTO extends TenantDTO {
18 22 private String notes;
19 23 @ApiModelProperty(value = "创建用户名称")
20 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 8 import org.apache.commons.collections4.CollectionUtils;
9 9 import org.apache.commons.lang3.StringUtils;
10 10 import org.springframework.stereotype.Service;
  11 +import org.springframework.transaction.annotation.Transactional;
11 12 import org.thingsboard.server.common.data.exception.ThingsboardException;
  13 +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
12 14 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException;
13 15 import org.thingsboard.server.common.data.yunteng.dto.BrainDeviceCategoryDTO;
  16 +import org.thingsboard.server.common.data.yunteng.dto.UserDTO;
14 17 import org.thingsboard.server.common.data.yunteng.utils.SpringBeanUtils;
15 18 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData;
16 19 import org.thingsboard.server.dao.yunteng.entities.BrainDeviceCategoryEntity;
17 20 import org.thingsboard.server.dao.yunteng.mapper.BrainDeviceCategoryMapper;
18 21 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
19 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 26 import java.util.List;
22 27 import java.util.Map;
23 28 import java.util.UUID;
  29 +import java.util.stream.Collectors;
24 30
25 31 @Service
26 32 @RequiredArgsConstructor
... ... @@ -28,6 +34,9 @@ import java.util.UUID;
28 34 public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDeviceCategoryMapper, BrainDeviceCategoryEntity>
29 35 implements BrainDeviceCategoryService {
30 36
  37 + @Resource
  38 + private TkUserService tkUserService;
  39 +
31 40 @Override
32 41 public TkPageData<BrainDeviceCategoryDTO> page(Map<String, Object> params) throws ThingsboardException {
33 42 params.put("tenantId", SpringBeanUtils.getTenantId().getId().toString());
... ... @@ -36,6 +45,14 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev
36 45 getPage(params, "create_time", false);
37 46 IPage<BrainDeviceCategoryDTO> pageData = baseMapper.getDataPage(page, params);
38 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 56 result.setItems(pageData.getRecords());
40 57 }
41 58 result.setTotal(Long.valueOf(pageData.getTotal()).intValue());
... ... @@ -78,6 +95,10 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev
78 95 if (StringUtils.isBlank(dto.getStatus())) {
79 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 104 private boolean checkDuplicateData(BrainDeviceCategoryDTO BrainDeviceCategoryDTO) throws ThingsboardException {
... ... @@ -101,6 +122,11 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev
101 122 result = new BrainDeviceCategoryDTO();
102 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 130 return result;
105 131 }
106 132
... ... @@ -109,4 +135,31 @@ public class BrainDeviceCategoryServiceImpl extends AbstractBaseService<BrainDev
109 135 int count = baseMapper.deleteById(id);
110 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 63 @Slf4j
64 64 @RequiredArgsConstructor
65 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 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 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 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 16 BrainDeviceCategoryDTO detail(String id) throws ThingsboardException;
17 17
18 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 182 List<String> findUserIdsByTenantId(String tenantId);
183 183
184 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 22 <if test="queryMap.tenantId !=null and queryMap.tenantId !=''">
23 23 AND o.tenant_id = #{queryMap.tenantId}
24 24 </if>
25   - <if test="queryMap.code !=null and queryMap.code !=''">
26   - AND o.code ILIKE concat('%',#{queryMap.code}::TEXT,'%')
27   - </if>
28 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 27 </if>
31 28 <if test="queryMap.status !=null and queryMap.status !=''">
32 29 AND o.status = #{queryMap.status}
... ...