diff --git a/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/redis/OrganRedisCacheManager.java b/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/redis/OrganRedisCacheManager.java index 3990692e7..b3df93bde 100644 --- a/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/redis/OrganRedisCacheManager.java +++ b/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/redis/OrganRedisCacheManager.java @@ -26,7 +26,7 @@ public class OrganRedisCacheManager extends TimeoutRedisCacheManager { private static final List ignoreOrganIdKeyList = new ArrayList<>(); static { - ignoreOrganIdKeyList.add("tenant_package_menu_ids"); + ignoreOrganIdKeyList.add("tenant_package_menu_ids_by_product"); } public OrganRedisCacheManager(RedisCacheWriter cacheWriter, diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/RedisKeyConstants.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/RedisKeyConstants.java index 25f414cfa..aec5b65ee 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/RedisKeyConstants.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/RedisKeyConstants.java @@ -117,10 +117,9 @@ public class RedisKeyConstants { public static final String SMS_CAPTCHA_VERIFICATION_LIMIT = "sms_captcha_verification_limit:%s"; /** - * 套餐下的权限菜单id:12h代表key的ttl为12小时 - * !!!!注意同步修改OrganRedisCacheManager中的key字符串 + * 产品套餐下的权限菜单 id:12h 代表 key 的 ttl 为 12 小时 */ - public static final String TENANT_PACKAGE_MENU_IDS = "tenant_package_menu_ids#12h"; + public static final String TENANT_PACKAGE_MENU_IDS_BY_PRODUCT = "tenant_package_menu_ids_by_product#12h"; /** * 系统配置 @@ -131,4 +130,4 @@ public class RedisKeyConstants { * 自定义板编号 */ public static final String CUSTOM_PLATE_NO = "custom_plateno"; -} \ No newline at end of file +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/TenantPackageService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/TenantPackageService.java index 4cb3cd2d1..af7a2745f 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/TenantPackageService.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/TenantPackageService.java @@ -74,14 +74,6 @@ public interface TenantPackageService { */ List getTenantPackageListByStatus(Integer status); - /** - * 获取组织套餐下的权限菜单id - * - * @param id 组织套餐id - * @return - */ - Set getTenantPackageMenuIds(Long id); - /** * 获取产品套餐下的权限菜单id * diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/TenantPackageServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/TenantPackageServiceImpl.java index 3ae3360e1..a60579184 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/TenantPackageServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/TenantPackageServiceImpl.java @@ -18,10 +18,13 @@ import com.cf.imes.module.system.dal.mysql.organ.TenantPackageMapper; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.cf.imes.module.system.dal.redis.RedisKeyConstants; import com.cf.imes.module.system.service.permission.PermissionService; -import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.validation.annotation.Validated; import jakarta.annotation.Resource; @@ -50,6 +53,9 @@ public class TenantPackageServiceImpl implements TenantPackageService { @Resource private PermissionService permissionService; + @Resource(name = "redisCacheManager") + private CacheManager redisCacheManager; + @Override public Long createTenantPackage(TenantPackageSaveReqVO createReqVO) { // 唯一性校验 @@ -63,7 +69,6 @@ public class TenantPackageServiceImpl implements TenantPackageService { @Override @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 - @CacheEvict(value = RedisKeyConstants.TENANT_PACKAGE_MENU_IDS, key = "#updateReqVO.id") public void updateTenantPackage(TenantPackageSaveReqVO updateReqVO) { // 唯一性校验 validateTenantPackageUnique(updateReqVO); @@ -82,13 +87,13 @@ public class TenantPackageServiceImpl implements TenantPackageService { List tenants = organService.getOrganListByPackageId(tenantPackage.getId()); permissionService.flushCacheWhenTenantPackageChange(CollectionUtils.convertList(tenants, OrganizationDO::getId)); } + evictProductMenuCacheAfterCommit(tenantPackage.getProductId()); } @Override - @CacheEvict(value = RedisKeyConstants.TENANT_PACKAGE_MENU_IDS, key = "#id") public void deleteTenantPackage(Long id) { // 校验存在 - validateTenantPackageExists(id); + TenantPackageDO tenantPackage = validateTenantPackageExists(id); if(Objects.equals(id, SYSTEM_ORGAN_PACKAGE_ID) || Objects.equals(id, SYSTEM_SUPER_PACKAGE_ID)) { throw new ServiceException(TENANT_PACKAGE_DELETED_EXIT); } @@ -97,6 +102,7 @@ public class TenantPackageServiceImpl implements TenantPackageService { validateOrganUsed(id); // 删除 tenantPackageMapper.deleteById(id); + evictProductMenuCacheAfterCommit(tenantPackage.getProductId()); } private TenantPackageDO validateTenantPackageExists(Long id) { @@ -156,19 +162,7 @@ public class TenantPackageServiceImpl implements TenantPackageService { } @Override - @Cacheable(value = RedisKeyConstants.TENANT_PACKAGE_MENU_IDS, key = "#id", unless = "#result == null", cacheManager = "redisCacheManager") - public Set getTenantPackageMenuIds(Long id) { - validateTenantPackageExists(id); - TenantPackageDO tenantPackageDO = tenantPackageMapper.selectOne(new LambdaQueryWrapper().eq(TenantPackageDO::getId, id).select(TenantPackageDO::getMenuIds)); - if (ObjectUtil.isNotNull(tenantPackageDO)) { - return tenantPackageDO.getMenuIds(); - } else { - return null; - } - } - - @Override - @Cacheable(value = RedisKeyConstants.TENANT_PACKAGE_MENU_IDS, key = "#productId", unless = "#result == null or #result.isEmpty()", cacheManager = "redisCacheManager") + @Cacheable(value = RedisKeyConstants.TENANT_PACKAGE_MENU_IDS_BY_PRODUCT, key = "#productId", unless = "#result == null or #result.isEmpty()", cacheManager = "redisCacheManager") public Set getProductTenantPackageMenuIds(Long productId) { TenantPackageDO tenantPackageDO = tenantPackageMapper.selectOne(new LambdaQueryWrapper().eq(TenantPackageDO::getProductId, productId).select(TenantPackageDO::getMenuIds)); if (ObjectUtil.isNotNull(tenantPackageDO)) { @@ -177,4 +171,31 @@ public class TenantPackageServiceImpl implements TenantPackageService { return Set.of(); } } + + /** + * 套餐菜单发生变化后,事务提交成功再清理产品菜单缓存。 + * + * @param productId 产品编号 + */ + private void evictProductMenuCacheAfterCommit(Long productId) { + if (productId == null) { + return; + } + Runnable evict = () -> { + Cache cache = redisCacheManager.getCache(RedisKeyConstants.TENANT_PACKAGE_MENU_IDS_BY_PRODUCT); + if (cache != null) { + cache.evict(productId); + } + }; + if (TransactionSynchronizationManager.isSynchronizationActive()) { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCommit() { + evict.run(); + } + }); + } else { + evict.run(); + } + } }