Commit cd4186f199b8891ae66f66a5610dfe300f606aa3

Authored by xp.Huang
1 parent df651144

fix: 下级组织在进行新增编辑时,将该组织及上级组织的缓存设置为无效

@@ -6,15 +6,13 @@ import com.google.common.collect.Lists; @@ -6,15 +6,13 @@ import com.google.common.collect.Lists;
6 import com.google.common.collect.Sets; 6 import com.google.common.collect.Sets;
7 import lombok.RequiredArgsConstructor; 7 import lombok.RequiredArgsConstructor;
8 import org.apache.commons.lang3.StringUtils; 8 import org.apache.commons.lang3.StringUtils;
9 -import org.jetbrains.annotations.NotNull;  
10 -import org.springframework.beans.factory.annotation.Autowired;  
11 import org.springframework.cache.annotation.CacheEvict; 9 import org.springframework.cache.annotation.CacheEvict;
12 -import org.springframework.cache.annotation.Cacheable;  
13 import org.springframework.cache.annotation.Caching; 10 import org.springframework.cache.annotation.Caching;
14 import org.springframework.stereotype.Service; 11 import org.springframework.stereotype.Service;
15 import org.springframework.transaction.annotation.Transactional; 12 import org.springframework.transaction.annotation.Transactional;
16 import org.springframework.util.Assert; 13 import org.springframework.util.Assert;
17 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; 14 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
  15 +import org.thingsboard.server.common.data.yunteng.core.cache.CacheUtils;
18 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException; 16 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException;
19 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage; 17 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
20 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; 18 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
@@ -39,10 +37,9 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -39,10 +37,9 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
39 private final DeviceMapper deviceMapper; 37 private final DeviceMapper deviceMapper;
40 private final SceneLinkageMapper sceneMapper; 38 private final SceneLinkageMapper sceneMapper;
41 private final AlarmContactMapper contactMapper; 39 private final AlarmContactMapper contactMapper;
  40 + private final String cacheName = FastIotConstants.CacheConfigKey.ORGANIZATION;
  41 + private final CacheUtils cacheUtils;
42 42
43 - @Caching(evict= {  
44 - @CacheEvict(cacheNames = FastIotConstants.CacheConfigKey.ORGANIZATION, key = "{#tenantId, #organizationDTO.id}")  
45 - })  
46 @Override 43 @Override
47 @Transactional 44 @Transactional
48 public OrganizationDTO saveOrganization( 45 public OrganizationDTO saveOrganization(
@@ -97,6 +94,7 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -97,6 +94,7 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
97 currentUserOrganization.toArray(new String[currentUserOrganization.size()])); 94 currentUserOrganization.toArray(new String[currentUserOrganization.size()]));
98 } 95 }
99 organization.copyToDTO(organizationDTO); 96 organization.copyToDTO(organizationDTO);
  97 + invalidateParentAndMeCacheByTenantIdAndId(tenantId,true,null,organization.getId());
100 return organizationDTO; 98 return organizationDTO;
101 } 99 }
102 100
@@ -197,6 +195,7 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -197,6 +195,7 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
197 organization.setName(organizationDTO.getName()); 195 organization.setName(organizationDTO.getName());
198 organization.setRemark(organizationDTO.getRemark()); 196 organization.setRemark(organizationDTO.getRemark());
199 organization.setSort(organizationDTO.getSort()); 197 organization.setSort(organizationDTO.getSort());
  198 + String sourceParentOrganizationId = organization.getParentId();
200 if (parent != null) { 199 if (parent != null) {
201 organization.setParentId(parent.getId()); 200 organization.setParentId(parent.getId());
202 } else { 201 } else {
@@ -204,6 +203,10 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -204,6 +203,10 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
204 } 203 }
205 baseMapper.updateById(organization); 204 baseMapper.updateById(organization);
206 organization.copyToDTO(organizationDTO); 205 organization.copyToDTO(organizationDTO);
  206 + //父级组织有变化才更新
  207 + if(!organizationDTO.getParentId().equals(sourceParentOrganizationId)){
  208 + invalidateParentAndMeCacheByTenantIdAndId(tenantId,false,organizationDTO.getParentId(),organization.getId());
  209 + }
207 return organizationDTO; 210 return organizationDTO;
208 } 211 }
209 212
@@ -357,22 +360,26 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -357,22 +360,26 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
357 * @param tenantId 租户ID 360 * @param tenantId 租户ID
358 * @param organizationId 组织ID 361 * @param organizationId 组织ID
359 */ 362 */
360 - @Cacheable(cacheNames = FastIotConstants.CacheConfigKey.ORGANIZATION, key = "{#tenantId, #organizationId}")  
361 @Override 363 @Override
362 public List<String> organizationAllIds(String tenantId, String organizationId) { 364 public List<String> organizationAllIds(String tenantId, String organizationId) {
363 - List<String> organizationIds = new ArrayList<>();  
364 - if (StringUtils.isEmpty(organizationId)) {  
365 - return organizationIds;  
366 - }  
367 - if (!StringUtils.isEmpty(organizationId)) {  
368 - organizationIds.add(organizationId);  
369 - }  
370 - // 查询该组织的所有子类  
371 - List<OrganizationDTO> organizationDTOS =  
372 - findOrganizationTreeList(tenantId,null, organizationIds);  
373 - List<String> queryOrganizationIds = new ArrayList<>();  
374 - organizationDTOS.forEach(item -> queryOrganizationIds.add(item.getId()));  
375 - return queryOrganizationIds; 365 + String key = tenantId + "_" + organizationId;
  366 + Optional<List<String>> allIds = cacheUtils.get(cacheName,key);
  367 + return allIds.orElseGet(()->{
  368 + List<String> organizationIds = new ArrayList<>();
  369 + if (StringUtils.isEmpty(organizationId)) {
  370 + return organizationIds;
  371 + }
  372 + if (!StringUtils.isEmpty(organizationId)) {
  373 + organizationIds.add(organizationId);
  374 + }
  375 + // 查询该组织的所有子类
  376 + List<OrganizationDTO> organizationDTOS =
  377 + findOrganizationTreeList(tenantId,null, organizationIds);
  378 + List<String> queryOrganizationIds = new ArrayList<>();
  379 + organizationDTOS.forEach(item -> queryOrganizationIds.add(item.getId()));
  380 + cacheUtils.put(cacheName,key,queryOrganizationIds);
  381 + return queryOrganizationIds;
  382 + });
376 } 383 }
377 384
378 @Override 385 @Override
@@ -383,4 +390,18 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM @@ -383,4 +390,18 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
383 return baseMapper.findOrganizationTreeList(tenantId,sort.toString(), organizationIds); 390 return baseMapper.findOrganizationTreeList(tenantId,sort.toString(), organizationIds);
384 } 391 }
385 392
  393 + @Override
  394 + public void invalidateParentAndMeCacheByTenantIdAndId(String tenantId, boolean isAdd, String sourceParentOrganizationId,
  395 + String targetOrganizationId) {
  396 + if(!isAdd && StringUtils.isNotEmpty(sourceParentOrganizationId)){
  397 + //原组织缓存
  398 + List<OrganizationDTO> sourceParentOrganizationIds =
  399 + findOrganizationTreeList(tenantId,OrganizationEnum.UP,List.of(sourceParentOrganizationId));
  400 + sourceParentOrganizationIds.forEach(org->cacheUtils.invalidate(cacheName,tenantId + "_" + org.getId()));
  401 + }
  402 + //目标组织缓存
  403 + List<OrganizationDTO> targetOrganizationIds =
  404 + findOrganizationTreeList(tenantId,OrganizationEnum.UP,List.of(targetOrganizationId));
  405 + targetOrganizationIds.forEach(org->cacheUtils.invalidate(cacheName,tenantId + "_" + org.getId()));
  406 + }
386 } 407 }
@@ -33,4 +33,14 @@ public interface TkOrganizationService extends BaseService<TkOrganizationEntity> @@ -33,4 +33,14 @@ public interface TkOrganizationService extends BaseService<TkOrganizationEntity>
33 List<String> organizationAllIds(String tenantId, String organizationId); 33 List<String> organizationAllIds(String tenantId, String organizationId);
34 34
35 List<OrganizationDTO> findOrganizationTreeList(String tenantId, OrganizationEnum sort, Collection<String> organizationIds); 35 List<OrganizationDTO> findOrganizationTreeList(String tenantId, OrganizationEnum sort, Collection<String> organizationIds);
  36 +
  37 + /**
  38 + * 如果是更新且上级组织变化了将原组织的上级组织的缓存设置为无效
  39 + * 如果是新增将目标组织及上级组织的缓存设置为无效
  40 + * @param tenantId 租户ID
  41 + * @param sourceParentOrganizationId 原父组织ID
  42 + * @param targetOrganizationId 目标组织ID
  43 + */
  44 + void invalidateParentAndMeCacheByTenantIdAndId(String tenantId,boolean isAdd, String sourceParentOrganizationId,
  45 + String targetOrganizationId);
36 } 46 }