Commit cd4186f199b8891ae66f66a5610dfe300f606aa3

Authored by xp.Huang
1 parent df651144

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

... ... @@ -6,15 +6,13 @@ import com.google.common.collect.Lists;
6 6 import com.google.common.collect.Sets;
7 7 import lombok.RequiredArgsConstructor;
8 8 import org.apache.commons.lang3.StringUtils;
9   -import org.jetbrains.annotations.NotNull;
10   -import org.springframework.beans.factory.annotation.Autowired;
11 9 import org.springframework.cache.annotation.CacheEvict;
12   -import org.springframework.cache.annotation.Cacheable;
13 10 import org.springframework.cache.annotation.Caching;
14 11 import org.springframework.stereotype.Service;
15 12 import org.springframework.transaction.annotation.Transactional;
16 13 import org.springframework.util.Assert;
17 14 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
  15 +import org.thingsboard.server.common.data.yunteng.core.cache.CacheUtils;
18 16 import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidationException;
19 17 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
20 18 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
... ... @@ -39,10 +37,9 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
39 37 private final DeviceMapper deviceMapper;
40 38 private final SceneLinkageMapper sceneMapper;
41 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 43 @Override
47 44 @Transactional
48 45 public OrganizationDTO saveOrganization(
... ... @@ -97,6 +94,7 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
97 94 currentUserOrganization.toArray(new String[currentUserOrganization.size()]));
98 95 }
99 96 organization.copyToDTO(organizationDTO);
  97 + invalidateParentAndMeCacheByTenantIdAndId(tenantId,true,null,organization.getId());
100 98 return organizationDTO;
101 99 }
102 100
... ... @@ -197,6 +195,7 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
197 195 organization.setName(organizationDTO.getName());
198 196 organization.setRemark(organizationDTO.getRemark());
199 197 organization.setSort(organizationDTO.getSort());
  198 + String sourceParentOrganizationId = organization.getParentId();
200 199 if (parent != null) {
201 200 organization.setParentId(parent.getId());
202 201 } else {
... ... @@ -204,6 +203,10 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
204 203 }
205 204 baseMapper.updateById(organization);
206 205 organization.copyToDTO(organizationDTO);
  206 + //父级组织有变化才更新
  207 + if(!organizationDTO.getParentId().equals(sourceParentOrganizationId)){
  208 + invalidateParentAndMeCacheByTenantIdAndId(tenantId,false,organizationDTO.getParentId(),organization.getId());
  209 + }
207 210 return organizationDTO;
208 211 }
209 212
... ... @@ -357,22 +360,26 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
357 360 * @param tenantId 租户ID
358 361 * @param organizationId 组织ID
359 362 */
360   - @Cacheable(cacheNames = FastIotConstants.CacheConfigKey.ORGANIZATION, key = "{#tenantId, #organizationId}")
361 363 @Override
362 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 385 @Override
... ... @@ -383,4 +390,18 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
383 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 33 List<String> organizationAllIds(String tenantId, String organizationId);
34 34
35 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 }
... ...