Browse Source

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

autumnal_wind 11 tháng trước cách đây
mục cha
commit
2433d0e3dd

+ 18 - 15
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/BaseBusiness.java

@@ -238,12 +238,12 @@ public class BaseBusiness {
             cardLimitedVo.setMealCount(cardLimitedVo.getMealCount() + 1);
             cardLimitedVo.setDayCount(cardLimitedVo.getDayCount() + 1);
         }
-        String cardNo = String.valueOf(cardLimitedVo.getCardNo());
-
-        RedisUtils.delCacheMapValue(CacheNames.T_XF_CARD_LIMITED, cardNo);
-        RedisUtils.setCacheMapValue(CacheNames.T_XF_CARD_LIMITED, cardNo, JsonUtils.toJsonString(cardLimitedVo));
+        // String cardNo = String.valueOf(cardLimitedVo.getCardNo());
+        //
+        // RedisUtils.delCacheMapValue(CacheNames.T_XF_CARD_LIMITED, cardNo);
+        // RedisUtils.setCacheMapValue(CacheNames.T_XF_CARD_LIMITED, cardNo, JsonUtils.toJsonString(cardLimitedVo));
+        cardLimitedService.cacheLimitedAndOther(cardLimitedVo);
         cardLimitedService.updateByVo(cardLimitedVo);
-
     }
 
     //endregion
@@ -508,17 +508,19 @@ public class BaseBusiness {
     public List<ConsumptionBo> selectOriginalReconciliation(Date consumeDate) {
         return TenantHelper.ignore(() -> originalService.selectReconciliationData(consumeDate));
     }
-    public List<ConsumptionBo> selectOriginalNoSend(Date consumeDate){
+
+    public List<ConsumptionBo> selectOriginalNoSend(Date consumeDate) {
         LocalDateTime beginTime = CardDateUtils.toLocalDateTime(consumeDate);
         LocalDateTime endTime = beginTime.plusDays(1);
         Date beginDate = CardDateUtils.toDate(beginTime, ZoneId.of("Asia/Shanghai"));
         Date endDate = CardDateUtils.toDate(endTime, ZoneId.of("Asia/Shanghai"));
-        return selectOriginalNoSend(beginDate,endDate);
+        return selectOriginalNoSend(beginDate, endDate);
     }
-    public List<ConsumptionBo> selectOriginalNoSend(Date beginDate,Date endDate) {
+
+    public List<ConsumptionBo> selectOriginalNoSend(Date beginDate, Date endDate) {
         List<XfConsumeDetailOriginalVo> list = originalService.queryListByConsumeDate(beginDate, endDate);
-        List<ConsumptionBo>  consumptionBos = new ArrayList<>();
-        list.parallelStream().forEach(p->{
+        List<ConsumptionBo> consumptionBos = new ArrayList<>();
+        list.parallelStream().forEach(p -> {
             ConsumptionBo bo = new ConsumptionBo();
             bo.setRecordId(p.getRecordId());
             bo.setUserId(p.getUserId());
@@ -539,14 +541,15 @@ public class BaseBusiness {
         return consumptionBos;
     }
 
-    public R<Void> sendToJwKafkaTest(Date consumeDate){
+    public R<Void> sendToJwKafkaTest(Date consumeDate) {
         LocalDateTime endTime = LocalDateTime.now().plusDays(1);
-        return sendToJwKafkaTest(consumeDate,CardDateUtils.toDate(endTime));
+        return sendToJwKafkaTest(consumeDate, CardDateUtils.toDate(endTime));
     }
-    public R<Void> sendToJwKafkaTest(Date beginDate,Date endDate){
-        List<ConsumptionBo> list = selectOriginalNoSend(beginDate,endDate);
+
+    public R<Void> sendToJwKafkaTest(Date beginDate, Date endDate) {
+        List<ConsumptionBo> list = selectOriginalNoSend(beginDate, endDate);
         if (CollUtil.isNotEmpty(list)) {
-            list.parallelStream().forEach(p->{
+            list.parallelStream().forEach(p -> {
                 List<RemoteUserAccountVo> accountVoList = RedisUtils.getCacheList(CacheNames.PT_USER_ACCOUNT_LIST);
                 RemoteUserAccountVo accountVo = accountVoList.parallelStream()
                     .filter(k -> k.getUserId().equals(p.getUserId())).findFirst().orElse(null);

+ 1 - 5
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/InitBusiness.java

@@ -251,11 +251,7 @@ public class InitBusiness {
         XfCardLimitedBo bo = new XfCardLimitedBo();
         List<XfCardLimitedVo> list = cardLimitedService.queryList(bo);
         if (CollUtil.isNotEmpty(list)) {
-            RedisUtils.deleteKeys(CacheNames.T_XF_CARD_LIMITED);
-            list.forEach(p -> {
-                RedisUtils.setCacheMapValue(CacheNames.T_XF_CARD_LIMITED, p.getCardNo().toString(), JsonUtils.toJsonString(p));
-            });
-            RedisUtils.expire(CacheNames.T_XF_CARD_LIMITED, Duration.ofHours(5));
+            list.forEach(cardLimitedService::cacheLimitedAndOther);
         }
         log.info("卡片消费限制参数完成");
     }

+ 14 - 5
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/CardConsumeValidationContext.java

@@ -2,18 +2,19 @@ package org.dromara.server.consume.check;
 
 import cn.hutool.core.util.ObjectUtil;
 import lombok.Data;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.backstage.api.domain.vo.RemoteCardVo;
 import org.dromara.backstage.api.domain.vo.RemoteDiscountVo;
 import org.dromara.backstage.api.domain.vo.RemoteLimitedVo;
 import org.dromara.backstage.api.domain.vo.RemoteQuotaVo;
-import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.json.utils.JsonUtils;
-import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
 import org.dromara.server.common.util.CardDateUtils;
 import org.dromara.server.consume.domain.vo.XfCardLimitedVo;
 import org.dromara.server.consume.domain.vo.XfTermVo;
+import org.dromara.server.consume.service.IXfCardLimitedService;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
@@ -32,6 +33,7 @@ import java.util.Objects;
  */
 @Data
 @Slf4j
+@RequiredArgsConstructor
 public class CardConsumeValidationContext {
     /**
      * 设备Id
@@ -133,12 +135,19 @@ public class CardConsumeValidationContext {
         context.lastPayTime = CardDateUtils.toLocalDateTime(bo.getConsumeDate());
 
         // 从缓存获取卡片限制数据
-        String strCardNo = String.valueOf(userCardVo.getCardNo());
-        Object objXfCardLimited = RedisUtils.getCacheMapValue(CacheNames.T_XF_CARD_LIMITED, strCardNo);
+        // String strCardNo = String.valueOf(userCardVo.getCardNo());
+        // Object objXfCardLimited = RedisUtils.getCacheMapValue(CacheNames.T_XF_CARD_LIMITED, strCardNo);
+        // if (objXfCardLimited != null) {
+        //     context.cardLimitedVo = JsonUtils.parseObject(objXfCardLimited.toString(), XfCardLimitedVo.class);
+        // }
+        // // 如果缓存中没有则初始化为当天当餐
+        // if (ObjectUtil.isEmpty(context.cardLimitedVo)) {
+        //     context.cardLimitedVo = initXfCardLimited(context.cardNo, context.consumeDate, context.lastMeal);
+        // }
+        Object objXfCardLimited = SpringUtils.getBean(IXfCardLimitedService.class).getLimitedAndOtherByNo(context.getCardNo());
         if (objXfCardLimited != null) {
             context.cardLimitedVo = JsonUtils.parseObject(objXfCardLimited.toString(), XfCardLimitedVo.class);
         }
-        // 如果缓存中没有则初始化为当天当餐
         if (ObjectUtil.isEmpty(context.cardLimitedVo)) {
             context.cardLimitedVo = initXfCardLimited(context.cardNo, context.consumeDate, context.lastMeal);
         }

+ 4 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfCardLimitedService.java

@@ -124,4 +124,8 @@ public interface IXfCardLimitedService {
     void insertOrUpdate(XfCardLimitedBo bo);
 
     void updateByVo(XfCardLimitedVo vo);
+
+    String cacheLimitedAndOther(XfCardLimitedVo vo);
+
+    String getLimitedAndOtherByNo(Long cardNo);
 }

+ 48 - 6
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/XfCardLimitedServiceImpl.java

@@ -9,8 +9,11 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
+import org.apache.poi.ss.formula.functions.Now;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.server.consume.domain.XfCardLimited;
@@ -18,11 +21,14 @@ import org.dromara.server.consume.domain.bo.XfCardLimitedBo;
 import org.dromara.server.consume.domain.vo.XfCardLimitedVo;
 import org.dromara.server.consume.mapper.XfCardLimitedMapper;
 import org.dromara.server.consume.service.IXfCardLimitedService;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -295,8 +301,8 @@ public class XfCardLimitedServiceImpl implements IXfCardLimitedService {
         XfCardLimitedVo vo = this.queryByCardNo(cardNo);
         if (ObjUtil.isNotEmpty(vo)) {
             LambdaUpdateWrapper<XfCardLimited> luw = new LambdaUpdateWrapper<>();
-            luw.set(XfCardLimited::getDayDiscountCount, vo.getDayDiscountCount()+1);
-            luw.set(XfCardLimited::getMealDiscountCount, vo.getMealDiscountCount()+1);
+            luw.set(XfCardLimited::getDayDiscountCount, vo.getDayDiscountCount() + 1);
+            luw.set(XfCardLimited::getMealDiscountCount, vo.getMealDiscountCount() + 1);
 
             luw.eq(XfCardLimited::getCardNo, cardNo);
             return baseMapper.update(null, luw) > 0;
@@ -309,7 +315,7 @@ public class XfCardLimitedServiceImpl implements IXfCardLimitedService {
     public void insertOrUpdate(XfCardLimitedBo bo) {
         XfCardLimited entity = MapstructUtils.convert(bo, XfCardLimited.class);
         XfCardLimited temp = baseMapper.selectOne(new LambdaQueryWrapper<XfCardLimited>().eq(XfCardLimited::getCardNo, bo.getCardNo()));
-        if(ObjUtil.isNotEmpty(temp)){
+        if (ObjUtil.isNotEmpty(temp)) {
             entity.setLimitedId(temp.getLimitedId());
             baseMapper.updateById(entity);
         } else {
@@ -320,9 +326,45 @@ public class XfCardLimitedServiceImpl implements IXfCardLimitedService {
     @Override
     public void updateByVo(XfCardLimitedVo vo) {
         XfCardLimited entity = MapstructUtils.convert(vo, XfCardLimited.class);
-        LambdaUpdateWrapper<XfCardLimited> luw = new LambdaUpdateWrapper<XfCardLimited>()
-                                                     .eq(XfCardLimited::getCardNo, vo.getCardNo());
-        baseMapper.update(entity, luw);
+        XfCardLimitedVo limitedVo = queryByCardNo(vo.getCardNo());
+        if (limitedVo != null) {
+            LambdaUpdateWrapper<XfCardLimited> luw = new LambdaUpdateWrapper<XfCardLimited>()
+                .eq(XfCardLimited::getCardNo, vo.getCardNo());
+            baseMapper.update(entity, luw);
+        } else {
+            baseMapper.insert(entity);
+        }
+
+    }
+
+    @Override
+    @CachePut(cacheNames = CacheNames.T_XF_CARD_LIMITED, key = "#vo.cardNo")
+    public String cacheLimitedAndOther(XfCardLimitedVo vo) {
+        return JsonUtils.toJsonString(vo);
+    }
+
+    @Override
+    @Cacheable(cacheNames = CacheNames.T_XF_CARD_LIMITED, key = "#cardNo", unless = "#result == null")
+    public String getLimitedAndOtherByNo(Long cardNo) {
+        XfCardLimitedVo vo = queryByCardNo(cardNo);
+        if (vo == null) {
+            vo = initXfCardLimited(cardNo);
+        }
+        return JsonUtils.toJsonString(vo);
+    }
+
+    private static XfCardLimitedVo initXfCardLimited(Long cardNo) {
+        XfCardLimitedVo vo = new XfCardLimitedVo();
+        vo.setCardNo(cardNo);
+        vo.setDayCount(0L);
+        vo.setDayMoney(BigDecimal.ZERO);
+        vo.setMealCount(0L);
+        vo.setMealMoney(BigDecimal.ZERO);
+        vo.setDayDiscountCount(0L);
+        vo.setMealDiscountCount(0L);
+        vo.setLastPay(new Date());
+        vo.setLastMeal(0L);
 
+        return vo;
     }
 }