Forráskód Böngészése

perf(消费服务): 卡片信息的缓存操作不再直接使用RedisUtils操作,而是使用spring-cache 的注解操作

autumnal_wind 11 hónapja
szülő
commit
fde031dd75

+ 20 - 23
ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java

@@ -15,6 +15,7 @@
  */
 package org.dromara.common.redis.manager;
 
+import lombok.Setter;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.redisson.api.RMap;
 import org.redisson.api.RMapCache;
@@ -47,8 +48,27 @@ public class PlusSpringCacheManager implements CacheManager {
 
     private boolean dynamic = true;
 
+    /**
+     * -- SETTER --
+     *  Defines possibility of storing
+     *  values.
+     *  <p>
+     *  Default is <code>true</code>
+     *
+     */
+    @Setter
     private boolean allowNullValues = true;
 
+    /**
+     * -- SETTER --
+     *  Defines if cache aware of Spring-managed transactions.
+     *  If
+     *  put/evict operations are executed only for successful transaction in after-commit phase.
+     *  <p>
+     *  Default is <code>false</code>
+     *
+     */
+    @Setter
     private boolean transactionAware = true;
 
     Map<String, CacheConfig> configMap = new ConcurrentHashMap<>();
@@ -61,29 +81,6 @@ public class PlusSpringCacheManager implements CacheManager {
     }
 
 
-    /**
-     * Defines possibility of storing {@code null} values.
-     * <p>
-     * Default is <code>true</code>
-     *
-     * @param allowNullValues stores if <code>true</code>
-     */
-    public void setAllowNullValues(boolean allowNullValues) {
-        this.allowNullValues = allowNullValues;
-    }
-
-    /**
-     * Defines if cache aware of Spring-managed transactions.
-     * If {@code true} put/evict operations are executed only for successful transaction in after-commit phase.
-     * <p>
-     * Default is <code>false</code>
-     *
-     * @param transactionAware cache is transaction aware if <code>true</code>
-     */
-    public void setTransactionAware(boolean transactionAware) {
-        this.transactionAware = transactionAware;
-    }
-
     /**
      * Defines 'fixed' cache names.
      * A new cache instance will not be created in dynamic for non-defined names.

+ 3 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/BaseBusiness.java

@@ -35,6 +35,7 @@ import org.dromara.server.common.constant.ConsumeConstants;
 import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
 import org.dromara.server.common.domain.vo.yc.YcPushConsumeInfoVo;
 import org.dromara.server.common.util.CardDateUtils;
+import org.dromara.server.consume.cache.CardCacheManager;
 import org.dromara.server.consume.domain.bo.XfConsumeDetailBo;
 import org.dromara.server.consume.domain.bo.XfConsumeDetailOriginalBo;
 import org.dromara.server.consume.domain.bo.XfTermTotalBo;
@@ -79,7 +80,7 @@ public class BaseBusiness {
     private final SyncRemoteSendMessageRecordService syncRemoteSendMessageRecordService;
     private final IXfCardLimitedService cardLimitedService;
     private final ThreadPoolTaskExecutor taskExecutor;
-    private final InitBusiness initBusiness;
+    private final CardCacheManager cardCacheManager;
 
     @DubboReference
     private final RemoteRegisterInfoService remoteRegisterInfoService;
@@ -198,7 +199,7 @@ public class BaseBusiness {
         userCardVo.setLastMeal(mealType);
         userCardVo.setLastPay(consumeDate);
 
-        initBusiness.resetUserCard(userCardVo);
+        cardCacheManager.cacheCardVo(userCardVo);
 
         // 更新数据库
         remoteCardService.updateCardDayData(userCardVo);

+ 4 - 10
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/InitBusiness.java

@@ -12,6 +12,7 @@ import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.server.common.util.CardDateUtils;
+import org.dromara.server.consume.cache.CardCacheManager;
 import org.dromara.server.consume.cache.ValidationParam;
 import org.dromara.server.consume.domain.bo.XfCardLimitedBo;
 import org.dromara.server.consume.domain.vo.PtBagVo;
@@ -48,6 +49,7 @@ public class InitBusiness {
     private final IXfCardLimitedService cardLimitedService;
     private final IXfTermService xfTermService;
     private final ValidationParam validationParam;
+    private final CardCacheManager cardCacheManager;
 
     @DubboReference
     private final RemotePtParameterService remotePtParameterService;
@@ -194,15 +196,7 @@ public class InitBusiness {
     public void initUserCard() {
         List<RemoteCardVo> list = remoteCardService.selectNormalCards();
         if (CollUtil.isNotEmpty(list)) {
-            RedisUtils.deleteKeys(CacheNames.PT_USER_CARD_NO);
-            RedisUtils.deleteKeys(CacheNames.PT_USER_CARD_USER_ID);
-            RedisUtils.deleteKeys(CacheNames.PT_USER_CARD_FACTORYID);
-
-            list.forEach(this::resetUserCard);
-
-            RedisUtils.expire(CacheNames.PT_USER_CARD_NO, Duration.ofHours(5));
-            RedisUtils.expire(CacheNames.PT_USER_CARD_USER_ID, Duration.ofHours(5));
-            RedisUtils.expire(CacheNames.PT_USER_CARD_FACTORYID, Duration.ofHours(5));
+            list.forEach(cardCacheManager::cacheCardVo);
         }
         log.info("初始化人员卡片参数完成");
     }
@@ -214,7 +208,7 @@ public class InitBusiness {
      */
     public void initUserCardByUserId(Long id) {
         RemoteCardVo cardVo = remoteCardService.queryMainCardByUserId(id);
-        resetUserCard(cardVo);
+        cardCacheManager.cacheCardVo(cardVo);
         log.info("初始指定人员卡片参数完成,人员Id:{}", id);
     }
 

+ 4 - 1
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/TermBusiness.java

@@ -204,9 +204,12 @@ public class TermBusiness {
             case ConsumeConstants.TERM_MAC -> {
                 return termService.queryVoOneByMac(checkParam);
             }
+            default -> {
+                return null;
+            }
         }
-        return null;
     }
+
     /**
      * 将系统中的设备信息转换成消费机可接收的类型
      * @param termVo 系统消费机信息

+ 13 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/cache/CardCacheManager.java

@@ -7,7 +7,9 @@ import org.dromara.backstage.api.RemoteCardService;
 import org.dromara.backstage.api.domain.vo.RemoteCardVo;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.json.utils.JsonUtils;
+import org.springframework.cache.annotation.CachePut;
 import org.springframework.cache.annotation.Cacheable;
+import org.springframework.cache.annotation.Caching;
 import org.springframework.stereotype.Service;
 
 /**
@@ -52,4 +54,15 @@ public class CardCacheManager {
         }
         return JsonUtils.toJsonString(cardVo);
     }
+
+    @Caching(
+        put = {
+            @CachePut(cacheNames = CacheNames.PT_USER_CARD_FACTORYID, key = "#cardVo.factoryId"),
+            @CachePut(cacheNames = CacheNames.PT_USER_CARD_USER_ID, key = "#cardVo.userId"),
+            @CachePut(cacheNames = CacheNames.PT_USER_CARD_NO, key = "#cardVo.cardNo")
+        }
+    )
+    public String cacheCardVo(RemoteCardVo cardVo) {
+        return JsonUtils.toJsonString(cardVo);
+    }
 }

+ 7 - 12
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/CommonCheck.java

@@ -268,24 +268,19 @@ public class CommonCheck {
      */
     public R<ErrorInfo> checkTerm(AllowConsumeValidationContext ctx) {
         String msgInfo = ObjectUtil.isEmpty(ctx.getTermMac()) ? ctx.getTermNo().toString() : ctx.getTermMac();
-        XfTermVo termVo;
-        String mac = ctx.getTermMac();
-        String termNo = String.valueOf(ctx.getTermNo());
-        if (ObjectUtil.isNotEmpty(mac)) {
-            termVo = termBusiness.getTermFromCache(mac,ConsumeConstants.TERM_MAC);
-        } else {
-            termVo = termBusiness.getTermFromCache(termNo,ConsumeConstants.TERM_NO);;
-        }
+        String checkParam = ObjectUtil.isNotEmpty(ctx.getTermMac()) ? ctx.getTermMac() : ctx.getTermNo().toString();
+        Integer checkMode = ObjectUtil.isNotEmpty(ctx.getTermMac()) ? ConsumeConstants.TERM_MAC : ConsumeConstants.TERM_NO;
+        XfTermVo termVo = termBusiness.getTermFromCache(checkParam, checkMode);
+
         if (ObjectUtil.isEmpty(termVo)) {
             return createErrorResponse(400, ApiErrorTypeConstants.OBJECT_NOT_EXISTS,
                 "设备不存在",
                 MessageFormat.format("机号或MAC为[{0}]的设备不存在,不允许交易", msgInfo));
         }
         // 因为后续处理都是用的机号,如果消费机上传的是mac地址,则将termNo更新到消费业务对象
-        if (termVo != null) {
-            ctx.getBo().setTermNo(termVo.getTermNo());
-            ctx.getBo().setTermName(termVo.getTermName());
-        }
+        ctx.getBo().setTermNo(termVo.getTermNo());
+        ctx.getBo().setTermName(termVo.getTermName());
+
         // 将消费机数据复制提供后续业务使用
         ctx.setUseTermVo(termVo);