Commit cd4186f199b8891ae66f66a5610dfe300f606aa3
1 parent
df651144
fix: 下级组织在进行新增编辑时,将该组织及上级组织的缓存设置为无效
Showing
2 changed files
with
51 additions
and
20 deletions
@@ -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 | } |