Przeglądaj źródła

【feat】【v3】
1.优化缓存逻辑

ChenYL 10 miesięcy temu
rodzic
commit
c23baa99ff

+ 5 - 0
src/main/java/com/punchsettle/server/service/manager/IAccountManager.java

@@ -62,4 +62,9 @@ public interface IAccountManager {
      * @param userId
      */
     void createBasicAccount(Long userId);
+
+    /**
+     * 清除账户相关缓存
+     */
+    void clearCache(Long userId);
 }

+ 28 - 0
src/main/java/com/punchsettle/server/service/manager/ICacheManager.java

@@ -0,0 +1,28 @@
+package com.punchsettle.server.service.manager;
+
+import java.util.Collection;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/5/8 16:31
+ * @description 缓存管理
+ */
+public interface ICacheManager {
+
+    /**
+     * 批量删除
+     * @param cacheNames 缓存空间
+     * @param key 键
+     */
+    void batchEvict(Collection<String> cacheNames, Object key);
+
+    /**
+     * 批量删除(右模糊匹配)
+     * @param cacheNames 缓存空间
+     * @param keyLike 键(右模糊)
+     */
+    void batchEvictLike(Collection<String> cacheNames, String keyLike);
+
+
+}

+ 8 - 0
src/main/java/com/punchsettle/server/service/manager/IPunchInManager.java

@@ -95,4 +95,12 @@ public interface IPunchInManager {
      * @return
      */
     List<PiTaskHistory> getTaskHistoryListInCache(Long userId, String punchInDate);
+
+    /**
+     * 清除缓存
+     * @param userId
+     * @param deleteHistory 删除打卡记录缓存
+     * @param deleteStat 删除统计数据缓存
+     */
+    void clearCache(Long userId, boolean deleteHistory, boolean deleteStat);
 }

+ 6 - 0
src/main/java/com/punchsettle/server/service/manager/IRewardManager.java

@@ -52,4 +52,10 @@ public interface IRewardManager {
      * @return
      */
     List<RewardExchangeHistoryVO> queryRewardExchangeHistory(String exchangeMonth);
+
+    /**
+     * 清除缓存
+     * @param userId
+     */
+    void clearCache(Long userId);
 }

+ 30 - 28
src/main/java/com/punchsettle/server/service/manager/impl/AccountManagerImpl.java

@@ -1,5 +1,21 @@
 package com.punchsettle.server.service.manager.impl;
 
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
 import com.punchsettle.server.atomic.entity.Account;
 import com.punchsettle.server.atomic.entity.AccountTransferHistory;
 import com.punchsettle.server.atomic.service.IAccountService;
@@ -9,33 +25,18 @@ import com.punchsettle.server.common.utils.Assert;
 import com.punchsettle.server.constant.AccountCategoryEnum;
 import com.punchsettle.server.constant.CacheNameConstant;
 import com.punchsettle.server.constant.TransferCategoryEnum;
+import com.punchsettle.server.pojo.account.AccountInfoVO;
+import com.punchsettle.server.pojo.account.AccountQuery;
 import com.punchsettle.server.pojo.account.AccountRequest;
 import com.punchsettle.server.pojo.account.AccountVO;
-import com.punchsettle.server.pojo.account.AccountInfoVO;
 import com.punchsettle.server.pojo.account.TransferHistoryVO;
 import com.punchsettle.server.pojo.account.TransferRequest;
-import com.punchsettle.server.pojo.account.AccountQuery;
 import com.punchsettle.server.service.manager.IAccountManager;
+import com.punchsettle.server.service.manager.ICacheManager;
 import com.punchsettle.server.utiis.DateUtils;
 import com.punchsettle.server.utiis.UserUtils;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cache.CacheManager;
-import org.springframework.cache.annotation.Cacheable;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 
-import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.function.Function;
-import java.util.stream.Collectors;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * @author tyuio
@@ -54,7 +55,7 @@ public class AccountManagerImpl implements IAccountManager {
     private IAccountTransferHistoryService accountTransferHistoryService;
 
     @Autowired
-    private CacheManager cacheManager;
+    private ICacheManager cacheManager;
 
     @Override
     @Cacheable(cacheNames = CacheNameConstant.ACCOUNT_INFO_VO, key = "T(com.punchsettle.server.utiis.UserUtils).getCurrentUserId()")
@@ -142,8 +143,7 @@ public class AccountManagerImpl implements IAccountManager {
         accountService.batchUpdate(Arrays.asList(updateAccount));
 
         // 清理缓存
-        cacheManager.getCache(CacheNameConstant.ACCOUNT_INFO_VO).evict(userId);
-        cacheManager.getCache(CacheNameConstant.ACCOUNT_LIST).evict(userId);
+        clearCache(userId);
     }
 
     @Override
@@ -160,8 +160,7 @@ public class AccountManagerImpl implements IAccountManager {
 
         // 清理缓存
         Long userId = UserUtils.getCurrentUserId();
-        cacheManager.getCache(CacheNameConstant.ACCOUNT_INFO_VO).evict(userId);
-        cacheManager.getCache(CacheNameConstant.ACCOUNT_LIST).evict(userId);
+        clearCache(userId);
     }
 
     @Override
@@ -212,10 +211,7 @@ public class AccountManagerImpl implements IAccountManager {
         accountService.batchUpdate(Arrays.asList(updateSenderAccount, updateRecipientAccount));
 
         // 清理缓存
-        String transferMonth = DateUtils.getYearMonth(LocalDate.now());
-        cacheManager.getCache(CacheNameConstant.ACCOUNT_INFO_VO).evict(userId);
-        cacheManager.getCache(CacheNameConstant.ACCOUNT_LIST).evict(userId);
-        cacheManager.getCache(CacheNameConstant.ACCOUNT_TRANSFER_HISTORY).evict(String.format("%s_%s", userId, transferMonth));
+        clearCache(userId);
     }
 
     @Override
@@ -267,4 +263,10 @@ public class AccountManagerImpl implements IAccountManager {
         account.setAccountCategory(AccountCategoryEnum.BASIC);
         accountService.insert(account);
     }
+
+    @Override
+    public void clearCache(Long userId) {
+        cacheManager.batchEvict(Arrays.asList(CacheNameConstant.ACCOUNT_INFO_VO, CacheNameConstant.ACCOUNT_LIST), userId);
+        cacheManager.batchEvictLike(Arrays.asList(CacheNameConstant.ACCOUNT_TRANSFER_HISTORY), String.valueOf(userId));
+    }
 }

+ 59 - 0
src/main/java/com/punchsettle/server/service/manager/impl/CacheManagerImpl.java

@@ -0,0 +1,59 @@
+package com.punchsettle.server.service.manager.impl;
+
+import java.util.Collection;
+import java.util.Set;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.caffeine.CaffeineCache;
+import org.springframework.cache.caffeine.CaffeineCacheManager;
+import org.springframework.stereotype.Component;
+
+import com.github.benmanes.caffeine.cache.Cache;
+import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.service.manager.ICacheManager;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2025/5/8 16:35
+ * @description TODO
+ */
+@Component
+public class CacheManagerImpl implements ICacheManager {
+
+    @Autowired
+    private CaffeineCacheManager caffeineCacheManager;
+
+    @Override
+    public void batchEvict(Collection<String> cacheNames, Object key) {
+        Assert.notEmpty(cacheNames);
+        Assert.isNull(key);
+
+        for (String cacheName : cacheNames) {
+            caffeineCacheManager.getCache(cacheName).evict(key);
+        }
+    }
+
+    @Override
+    public void batchEvictLike(Collection<String> cacheNames, String keyLike) {
+        Assert.notEmpty(cacheNames);
+        Assert.isNull(keyLike);
+
+        for (String cacheName : cacheNames) {
+            // 获取缓存空间
+            CaffeineCache cache = (CaffeineCache) caffeineCacheManager.getCache(cacheName);
+            // 获取键集合
+            Cache<Object, Object> caffeine = cache.getNativeCache();
+            Set<Object> keys = caffeine.asMap().keySet();
+            for (Object keyObj : keys) {
+                if (! (keyObj instanceof String)) {
+                    continue;
+                }
+                String key = (String) keyObj;
+                if (key.startsWith(String.valueOf(keyLike))) {
+                    cache.evict(key);
+                }
+            }
+        }
+    }
+}

+ 25 - 32
src/main/java/com/punchsettle/server/service/manager/impl/PunchInManagerImpl.java

@@ -13,14 +13,8 @@ import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import com.punchsettle.server.atomic.entity.PiStatus;
-import com.punchsettle.server.atomic.service.IPiStatusService;
-import com.punchsettle.server.constant.CacheNameConstant;
-import com.punchsettle.server.constant.ContinueStatusEnum;
-import com.punchsettle.server.utiis.SpringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cache.CacheManager;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -28,8 +22,10 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import com.punchsettle.server.atomic.StatPiTask;
+import com.punchsettle.server.atomic.entity.PiStatus;
 import com.punchsettle.server.atomic.entity.PiTask;
 import com.punchsettle.server.atomic.entity.PiTaskHistory;
+import com.punchsettle.server.atomic.service.IPiStatusService;
 import com.punchsettle.server.atomic.service.IPiTaskHistoryService;
 import com.punchsettle.server.atomic.service.IPiTaskService;
 import com.punchsettle.server.atomic.service.IStatPiTaskMonthService;
@@ -38,6 +34,8 @@ import com.punchsettle.server.common.constant.CommonEnableStatusEnum;
 import com.punchsettle.server.common.exception.BusinessException;
 import com.punchsettle.server.common.utils.Assert;
 import com.punchsettle.server.constant.ArchiveStatusEnum;
+import com.punchsettle.server.constant.CacheNameConstant;
+import com.punchsettle.server.constant.ContinueStatusEnum;
 import com.punchsettle.server.constant.PunchInExtraMethodEnum;
 import com.punchsettle.server.constant.PunchInMethodEnum;
 import com.punchsettle.server.constant.PunchInResultEnum;
@@ -59,10 +57,12 @@ import com.punchsettle.server.pojo.punchIn.PunchInRequest;
 import com.punchsettle.server.pojo.stat.StatPiTaskQuery;
 import com.punchsettle.server.pojo.ucharts.LineSeriesVO;
 import com.punchsettle.server.pojo.ucharts.LineVO;
+import com.punchsettle.server.service.manager.ICacheManager;
 import com.punchsettle.server.service.manager.ICalendarManager;
 import com.punchsettle.server.service.manager.IPunchInCoreManager;
 import com.punchsettle.server.service.manager.IPunchInManager;
 import com.punchsettle.server.utiis.DateUtils;
+import com.punchsettle.server.utiis.SpringUtils;
 import com.punchsettle.server.utiis.UserUtils;
 
 import lombok.extern.slf4j.Slf4j;
@@ -96,7 +96,7 @@ public class PunchInManagerImpl implements IPunchInManager {
     private ICalendarManager calendarManager;
 
     @Autowired
-    private CacheManager cacheManager;
+    private ICacheManager cacheManager;
 
     @Autowired
     private IPiStatusService piStatusService;
@@ -387,12 +387,7 @@ public class PunchInManagerImpl implements IPunchInManager {
         }
 
         // 清除缓存
-        cacheManager.getCache(CacheNameConstant.TASK_LIST_FOR_USER).evict(currentUserId);
-        cacheManager.getCache(CacheNameConstant.TASK_LIST_VO).evict(currentUserId);
-        cacheManager.getCache(CacheNameConstant.TASK_PUNCH_IN_HISTORY).evict(String.format("%s_%s", currentUserId, today));
-        cacheManager.getCache(CacheNameConstant.TASK_HISTORY_LIST_FOR_USER).evict(String.format("%s_%s", currentUserId, today));
-        cacheManager.getCache(CacheNameConstant.TASK_STAT).evict(String.format("%s_%s", currentUserId, today.toString().substring(0, 7)));
-        cacheManager.getCache(CacheNameConstant.TASK_STAT).evict(String.format("%s_%s", currentUserId, today.toString().substring(0, 4)));
+        clearCache(currentUserId, false, false);
     }
 
     @Override
@@ -406,10 +401,8 @@ public class PunchInManagerImpl implements IPunchInManager {
 
         piTaskService.insert(addPiTask);
 
-        // 清楚缓存
-        Long currentUserId = UserUtils.getCurrentUserId();
-        cacheManager.getCache(CacheNameConstant.TASK_LIST_FOR_USER).evict(currentUserId);
-        cacheManager.getCache(CacheNameConstant.TASK_LIST_VO).evict(currentUserId);
+        // 清除缓存
+        clearCache(UserUtils.getCurrentUserId(), false, false);
     }
 
     @Override
@@ -481,11 +474,7 @@ public class PunchInManagerImpl implements IPunchInManager {
         }
 
         // 清楚缓存
-        cacheManager.getCache(CacheNameConstant.TASK_LIST_VO).evict(currentUserId);
-        cacheManager.getCache(CacheNameConstant.TASK_PUNCH_IN_HISTORY).evict(String.format("%s_%s", currentUserId, punchInDate));
-        cacheManager.getCache(CacheNameConstant.TASK_HISTORY_LIST_FOR_USER).evict(String.format("%s_%s", currentUserId, punchInDate));
-        cacheManager.getCache(CacheNameConstant.TASK_STAT).evict(String.format("%s_%s", currentUserId, punchInDate.substring(0, 7)));
-        cacheManager.getCache(CacheNameConstant.TASK_STAT).evict(String.format("%s_%s", currentUserId, punchInDate.substring(0, 4)));
+        clearCache(currentUserId, true, true);
     }
 
     @Override
@@ -500,9 +489,7 @@ public class PunchInManagerImpl implements IPunchInManager {
         piTaskService.insert(addPiTask);
 
         // 清楚缓存
-        Long currentUserId = UserUtils.getCurrentUserId();
-        cacheManager.getCache(CacheNameConstant.TASK_LIST_FOR_USER).evict(currentUserId);
-        cacheManager.getCache(CacheNameConstant.TASK_LIST_VO).evict(currentUserId);
+        clearCache(UserUtils.getCurrentUserId(), false, false);
     }
 
     @Override
@@ -547,13 +534,7 @@ public class PunchInManagerImpl implements IPunchInManager {
         piTaskHistoryService.update(updatePiTaskHistory);
 
         // 清楚缓存
-        Long currentUserId = UserUtils.getCurrentUserId();
-        String punchInDate = LocalDate.now().toString();
-        cacheManager.getCache(CacheNameConstant.TASK_LIST_VO).evict(currentUserId);
-        cacheManager.getCache(CacheNameConstant.TASK_PUNCH_IN_HISTORY).evict(String.format("%s_%s", currentUserId, punchInDate));
-        cacheManager.getCache(CacheNameConstant.TASK_HISTORY_LIST_FOR_USER).evict(String.format("%s_%s", currentUserId, punchInDate));
-        cacheManager.getCache(CacheNameConstant.TASK_STAT).evict(String.format("%s_%s", currentUserId, punchInDate.substring(0, 7)));
-        cacheManager.getCache(CacheNameConstant.TASK_STAT).evict(String.format("%s_%s", currentUserId, punchInDate.substring(0, 4)));
+        clearCache(UserUtils.getCurrentUserId(), true, true);
     }
 
     @Override
@@ -692,4 +673,16 @@ public class PunchInManagerImpl implements IPunchInManager {
 
         return piTaskHistories;
     }
+
+    @Override
+    public void clearCache(Long userId, boolean deleteHistory, boolean deleteStat) {
+        cacheManager.batchEvict(Arrays.asList(CacheNameConstant.TASK_LIST_FOR_USER, CacheNameConstant.TASK_LIST_VO), userId);
+        if (deleteHistory) {
+            cacheManager.batchEvictLike(Arrays.asList(CacheNameConstant.TASK_PUNCH_IN_HISTORY, CacheNameConstant.TASK_HISTORY_LIST_FOR_USER), String.valueOf(userId));
+        }
+        if (deleteStat) {
+            cacheManager.batchEvictLike(Arrays.asList(CacheNameConstant.TASK_STAT), String.valueOf(userId));
+        }
+
+    }
 }

+ 12 - 13
src/main/java/com/punchsettle/server/service/manager/impl/RewardManagerImpl.java

@@ -1,7 +1,6 @@
 package com.punchsettle.server.service.manager.impl;
 
 import java.text.SimpleDateFormat;
-import java.time.LocalDate;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -13,7 +12,6 @@ import java.util.stream.Collectors;
 
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cache.CacheManager;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -39,6 +37,7 @@ import com.punchsettle.server.pojo.reward.RewardExchangeRequest;
 import com.punchsettle.server.pojo.reward.RewardQuery;
 import com.punchsettle.server.pojo.reward.RewardRequest;
 import com.punchsettle.server.pojo.reward.RewardVO;
+import com.punchsettle.server.service.manager.ICacheManager;
 import com.punchsettle.server.service.manager.IRewardManager;
 import com.punchsettle.server.utiis.DateUtils;
 import com.punchsettle.server.utiis.UserUtils;
@@ -65,7 +64,7 @@ public class RewardManagerImpl implements IRewardManager {
     private IUserService userService;
 
     @Autowired
-    private CacheManager cacheManager;
+    private ICacheManager cacheManager;
 
     @Override
     @Cacheable(cacheNames = CacheNameConstant.REWARD_LIST, key = "T(com.punchsettle.server.utiis.UserUtils).getCurrentUserId()")
@@ -135,7 +134,7 @@ public class RewardManagerImpl implements IRewardManager {
         }
 
         // 移除缓存
-        cacheManager.getCache(CacheNameConstant.REWARD_LIST).evict(UserUtils.getCurrentUserId());
+        clearCache(UserUtils.getCurrentUserId());
     }
 
     @Override
@@ -149,7 +148,7 @@ public class RewardManagerImpl implements IRewardManager {
         rewardService.insert(addReward);
 
         // 移除缓存
-        cacheManager.getCache(CacheNameConstant.REWARD_LIST).evict(UserUtils.getCurrentUserId());
+        clearCache(UserUtils.getCurrentUserId());
     }
 
     private Reward copyAndArchive(Long id) {
@@ -236,14 +235,7 @@ public class RewardManagerImpl implements IRewardManager {
         updateAccount.setPoints(accountPointsAfterExchange);
         accountService.batchUpdate(Arrays.asList(updateAccount));
 
-        String exchangeMonth = DateUtils.getYearMonth(LocalDate.now());
-        cacheManager.getCache(CacheNameConstant.REWARD_LIST).evict(userId);
-        cacheManager.getCache(CacheNameConstant.REWARD_EXCHANGE_HISTORY).evict(String.format("%s_%s", userId, exchangeMonth));
-        cacheManager.getCache(CacheNameConstant.USER).evict(userId);
-        cacheManager.getCache(CacheNameConstant.USER_VO).evict(userId);
-        cacheManager.getCache(CacheNameConstant.ACCOUNT_INFO_VO).evict(userId);
-        cacheManager.getCache(CacheNameConstant.ACCOUNT_LIST).evict(userId);
-        cacheManager.getCache(CacheNameConstant.REWARD_EXCHANGE_HISTORY).evict(String.format("%s_%s", userId, exchangeMonth));
+        clearCache(userId);
     }
 
     @Override
@@ -291,4 +283,11 @@ public class RewardManagerImpl implements IRewardManager {
             return rewardExchangeHistoryVO;
         }).collect(Collectors.toList());
     }
+
+    @Override
+    public void clearCache(Long userId) {
+        cacheManager.batchEvict(Arrays.asList(CacheNameConstant.REWARD_LIST, CacheNameConstant.USER, CacheNameConstant.USER_VO,
+                CacheNameConstant.ACCOUNT_INFO_VO, CacheNameConstant.ACCOUNT_LIST), userId);
+        cacheManager.batchEvictLike(Arrays.asList(CacheNameConstant.REWARD_EXCHANGE_HISTORY), String.valueOf(userId));
+    }
 }

+ 2 - 0
src/main/java/com/punchsettle/server/service/manager/impl/SettleManagerImpl.java

@@ -687,5 +687,7 @@ public class SettleManagerImpl implements ISettleManager {
         if (!CollectionUtils.isEmpty(zeroSettleUserHistories)) {
             settleUserHistoryService.batchUpdate(zeroSettleUserHistories);
         }
+
+        // TODO 差这里的缓存清理
     }
 }

+ 33 - 18
src/main/java/com/punchsettle/server/service/manager/impl/StatManagerImpl.java

@@ -12,12 +12,8 @@ import java.util.Optional;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import com.punchsettle.server.atomic.entity.User;
-import com.punchsettle.server.atomic.service.IUserService;
-import com.punchsettle.server.common.utils.Assert;
-import com.punchsettle.server.constant.UserCategoryEnum;
-import com.punchsettle.server.service.manager.IUserManager;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.CacheManager;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -33,16 +29,20 @@ import com.punchsettle.server.atomic.entity.StatPiTaskMonth;
 import com.punchsettle.server.atomic.entity.StatPiTaskWeek;
 import com.punchsettle.server.atomic.entity.StatPiTaskYear;
 import com.punchsettle.server.atomic.entity.StatPoints;
+import com.punchsettle.server.atomic.entity.User;
 import com.punchsettle.server.atomic.service.IPiTaskHistoryService;
 import com.punchsettle.server.atomic.service.IPiTaskService;
 import com.punchsettle.server.atomic.service.ISettleTaskRelaHistoryService;
 import com.punchsettle.server.atomic.service.IStatNewUserService;
 import com.punchsettle.server.atomic.service.IStatPiTaskWeekService;
 import com.punchsettle.server.atomic.service.IStatPointsService;
+import com.punchsettle.server.atomic.service.IUserService;
+import com.punchsettle.server.common.utils.Assert;
 import com.punchsettle.server.constant.CacheNameConstant;
 import com.punchsettle.server.constant.PunchInResultEnum;
 import com.punchsettle.server.constant.SettleResultEnum;
 import com.punchsettle.server.constant.StatPeriodEnum;
+import com.punchsettle.server.constant.UserCategoryEnum;
 import com.punchsettle.server.core.config.BizProperties;
 import com.punchsettle.server.pojo.punchIn.PiTaskHistoryQuery;
 import com.punchsettle.server.pojo.settle.SettleTaskRelaHistoryQuery;
@@ -52,6 +52,7 @@ import com.punchsettle.server.pojo.stat.StatPointsQuery;
 import com.punchsettle.server.pojo.ucharts.LineSeriesVO;
 import com.punchsettle.server.pojo.ucharts.LineVO;
 import com.punchsettle.server.service.manager.IStatManager;
+import com.punchsettle.server.service.manager.IUserManager;
 import com.punchsettle.server.utiis.DateUtils;
 import com.punchsettle.server.utiis.UserUtils;
 
@@ -96,6 +97,9 @@ public class StatManagerImpl implements IStatManager {
     @Autowired
     private IUserService userService;
 
+    @Autowired
+    private CacheManager cacheManager;
+
     @Override
     @Cacheable(cacheNames = CacheNameConstant.STAT_POINTS_LINE, key = "T(com.punchsettle.server.utiis.UserUtils).getCurrentUserId()")
     public LineVO queryStatPointsLine() {
@@ -255,12 +259,21 @@ public class StatManagerImpl implements IStatManager {
             return;
         }
 
+        String statTimeStr = null;
+        if (StatPeriodEnum.WEEK.equals(statPeriod)) {
+            statTimeStr = DateUtils.getYearWeek(statTime);
+        } else if (StatPeriodEnum.MONTH.equals(statPeriod)) {
+            statTimeStr = DateUtils.getYearMonth(statTime);
+        } else if (StatPeriodEnum.YEAR.equals(statPeriod)) {
+            statTimeStr = DateUtils.getYear(statTime);
+        }
+
         StatPiTaskQuery statPiTaskQuery = new StatPiTaskQuery();
-        statPiTaskQuery.setStatTime(statTime.toString());
+        statPiTaskQuery.setStatTime(statTimeStr);
         statPiTaskQuery.setUserIds(userIds);
-        List<StatPiTask> statPiTaskDatas = statPiTaskService.queryByCondition(statPiTaskQuery);
-        // 任务唯一ID - 周统计数据
-        Map<Long, StatPiTask> statPiTaskDataMap = statPiTaskDatas.stream().collect(Collectors.toMap(StatPiTask::getTaskUniqueId, Function.identity(), (key1, key2) -> key1));
+        List<StatPiTask> statPiTaskDataList = statPiTaskService.queryByCondition(statPiTaskQuery);
+        // 任务唯一ID - 统计数据
+        Map<Long, StatPiTask> statPiTaskDataMap = statPiTaskDataList.stream().collect(Collectors.toMap(StatPiTask::getTaskUniqueId, Function.identity(), (key1, key2) -> key1));
 
         // 查询已结算数据
         SettleTaskRelaHistoryQuery settleTaskRelaHistoryQuery = new SettleTaskRelaHistoryQuery();
@@ -273,9 +286,9 @@ public class StatManagerImpl implements IStatManager {
         Map<Long, List<SettleTaskRelaHistory>> settleTaskRelaHistoryMap = settleTaskRelaHistorieList.stream().collect(Collectors.groupingBy(SettleTaskRelaHistory::getPiTaskUniqueId));
 
         // 新增
-        List<StatPiTask> addStatPiTaskWeekList = new ArrayList<>();
+        List<StatPiTask> addStatPiTaskList = new ArrayList<>();
         // 更新
-        List<StatPiTask> updateStatPiTaskWeekList = new ArrayList<>();
+        List<StatPiTask> updateStatPiTaskList = new ArrayList<>();
 
         for (PiTask piTask : piTasks) {
             // 获取结算数据
@@ -289,20 +302,20 @@ public class StatManagerImpl implements IStatManager {
             if (Objects.isNull(oldStatPiTaskWeek)) {
                 newStatPiTask.setUserId(piTask.getCreatedBy());
                 newStatPiTask.setTaskUniqueId(piTask.getUniqueId());
-                newStatPiTask.setStatTime(statTime.toString());
-                addStatPiTaskWeekList.add(newStatPiTask);
+                newStatPiTask.setStatTime(statTimeStr);
+                addStatPiTaskList.add(newStatPiTask);
             } else {
                 newStatPiTask.setId(oldStatPiTaskWeek.getId());
-                updateStatPiTaskWeekList.add(newStatPiTask);
+                updateStatPiTaskList.add(newStatPiTask);
             }
         }
 
-        if (!CollectionUtils.isEmpty(addStatPiTaskWeekList)) {
-            statPiTaskWeekService.insertList(addStatPiTaskWeekList);
+        if (!CollectionUtils.isEmpty(addStatPiTaskList)) {
+            statPiTaskService.insertList(addStatPiTaskList);
         }
 
-        if (!CollectionUtils.isEmpty(updateStatPiTaskWeekList)) {
-            statPiTaskWeekService.batchUpdate(updateStatPiTaskWeekList);
+        if (!CollectionUtils.isEmpty(updateStatPiTaskList)) {
+            statPiTaskService.batchUpdate(updateStatPiTaskList);
         }
     }
 
@@ -368,5 +381,7 @@ public class StatManagerImpl implements IStatManager {
         addStatNewUser.setStatTime(statTime.toString());
         addStatNewUser.setNewUserCount(newUserCount);
         statNewUserService.insert(addStatNewUser);
+
+        cacheManager.getCache(CacheNameConstant.STAT_NEW_USER_LINE).clear();
     }
 }

+ 6 - 0
src/main/java/com/punchsettle/server/task/PiTaskAutoArchiveTask.java

@@ -4,6 +4,8 @@ import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -81,6 +83,10 @@ public class PiTaskAutoArchiveTask {
             piTaskService.batchAdd(addPiTaskList);
         }
 
+        // 清除缓存
+        Set<Long> userIds = piTasks.stream().map(PiTask::getCreatedBy).collect(Collectors.toSet());
+        userIds.forEach(userId -> punchInManager.clearCache(userId, false, false));
+
         log.info("========== 打卡任务自动归档任务 结束执行 ==========");
     }
 }

+ 12 - 2
src/main/java/com/punchsettle/server/task/PiTaskAutoPunchInTask.java

@@ -55,6 +55,9 @@ public class PiTaskAutoPunchInTask {
     @Autowired
     private ICalendarManager calendarManager;
 
+    @Autowired
+    private IPunchInManager punchInManager;
+
     @Transactional(rollbackFor = Exception.class)
     public void execute() {
         log.info("========== 打卡任务自动打卡定时任务 开始执行 ==========");
@@ -136,10 +139,17 @@ public class PiTaskAutoPunchInTask {
             return addPiTaskHistory;
         }).toList();
 
-        if (!CollectionUtils.isEmpty(addPiTaskHistories)) {
-            piTaskHistoryService.batchAdd(addPiTaskHistories);
+        if (CollectionUtils.isEmpty(addPiTaskHistories)) {
+            return;
         }
 
+        // 数据入库
+        piTaskHistoryService.batchAdd(addPiTaskHistories);
+
+        // 清除缓存
+        Set<Long> userIds = addPiTaskHistories.stream().map(PiTaskHistory::getUserId).collect(Collectors.toSet());
+        userIds.forEach(userId -> punchInManager.clearCache(userId, true, true));
+
         log.info("========== 打卡任务自动打卡定时任务 结束执行 ==========");
     }
 }

+ 25 - 20
src/main/java/com/punchsettle/server/task/RewardAutoExchangeTask.java

@@ -1,5 +1,18 @@
 package com.punchsettle.server.task;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
 import com.punchsettle.server.atomic.entity.Account;
 import com.punchsettle.server.atomic.entity.Reward;
 import com.punchsettle.server.atomic.entity.RewardExchangeHistory;
@@ -9,28 +22,14 @@ import com.punchsettle.server.atomic.service.IRewardExchangeHistoryService;
 import com.punchsettle.server.atomic.service.IRewardService;
 import com.punchsettle.server.atomic.service.IUserService;
 import com.punchsettle.server.common.constant.CommonEnableStatusEnum;
-import com.punchsettle.server.common.exception.BusinessException;
 import com.punchsettle.server.constant.AccountCategoryEnum;
 import com.punchsettle.server.constant.RewardExchangeMethodEnum;
 import com.punchsettle.server.constant.VersionStatusEnum;
 import com.punchsettle.server.pojo.account.AccountQuery;
-import com.punchsettle.server.pojo.reward.RewardExchangeRequest;
 import com.punchsettle.server.pojo.reward.RewardQuery;
 import com.punchsettle.server.service.manager.IRewardManager;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * @author tyuio
@@ -54,6 +53,9 @@ public class RewardAutoExchangeTask {
     @Autowired
     private IRewardExchangeHistoryService rewardExchangeHistoryService;
 
+    @Autowired
+    private IRewardManager rewardManager;
+
     @Transactional(rollbackFor = Exception.class)
     public void execute() {
         log.info("========== 奖励自动兑换定时任务 开始执行 ==========");
@@ -72,7 +74,6 @@ public class RewardAutoExchangeTask {
         Set<Long> userIds = rewards.stream().map(Reward::getUserId).collect(Collectors.toSet());
         List<User> users = userService.listByIds(userIds);
 
-
         // 获取账户信息
         AccountQuery accountQuery = new AccountQuery();
         accountQuery.setUserIds(userIds);
@@ -163,10 +164,6 @@ public class RewardAutoExchangeTask {
             updateAccounts.add(updateAccount);
         }
 
-        if (!CollectionUtils.isEmpty(addRewardExchangeHistories)) {
-            rewardExchangeHistoryService.batchAdd(addRewardExchangeHistories);
-        }
-
         if (!CollectionUtils.isEmpty(updateAccounts)) {
             accountService.batchUpdate(updateAccounts);
         }
@@ -175,6 +172,14 @@ public class RewardAutoExchangeTask {
             userService.batchUpdate(updateUsers);
         }
 
+        if (!CollectionUtils.isEmpty(addRewardExchangeHistories)) {
+            rewardExchangeHistoryService.batchAdd(addRewardExchangeHistories);
+
+            // 清除缓存
+            Set<Long> tempUserIds = addRewardExchangeHistories.stream().map(RewardExchangeHistory::getUserId).collect(Collectors.toSet());
+            tempUserIds.forEach(tempUserId -> rewardManager.clearCache(tempUserId));
+        }
+
         log.info("========== 奖励自动兑换定时任务 结束执行 ==========");
     }
 }

+ 7 - 0
src/main/java/com/punchsettle/server/task/StatPiTask.java

@@ -3,7 +3,9 @@ package com.punchsettle.server.task;
 import java.time.LocalDate;
 import java.util.List;
 
+import com.punchsettle.server.constant.CacheNameConstant;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.CacheManager;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
@@ -43,6 +45,9 @@ public class StatPiTask {
     @Autowired
     private IStatManager statManager;
 
+    @Autowired
+    private CacheManager cacheManager;
+
     public void execute() {
         log.info("========== 打卡任务数据统计定时任务 开始执行 ==========");
 
@@ -78,6 +83,8 @@ public class StatPiTask {
             // TODO 中间需打卡的变动次数可以考虑在编辑时进行校正
         }
 
+        // 清除缓存
+        cacheManager.getCache(CacheNameConstant.TASK_STAT).clear();
 
         log.info("========== 打卡任务数据统计定时任务 开始执行 ==========");
     }