Ver Fonte

perf(消费服务): 卡片验证处理

1.将获取卡片信息的功能放到了CadBusiness做为公共功能,实现默认从缓存获取,如果缓存不存在则从数据库获取并初始人化缓存
autumnal_wind há 11 meses atrás
pai
commit
429147c135

+ 11 - 0
ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/constant/ConsumeConstants.java

@@ -25,7 +25,18 @@ public interface ConsumeConstants {
     Integer userNoMode = 1;
     Integer userNumbMode = 2;
     // 卡片校验模式 0-userId 1- cardNo
+    /**
+     * 根据userId获取卡片
+     */
     int CARD_USER = 0;
+
+    /**
+     * 根据卡流水号获取卡片
+     */
     int CARD_NO = 1;
+
+    /**
+     * 根据物理卡号获取卡片
+     */
     int CARD_FACTORY = 2;
 }

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

@@ -34,6 +34,7 @@ import org.dromara.server.base.service.yktOperation.SyncRemoteSendMessageRecordS
 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.domain.bo.XfConsumeDetailBo;
 import org.dromara.server.consume.domain.bo.XfConsumeDetailOriginalBo;
 import org.dromara.server.consume.domain.bo.XfTermTotalBo;
@@ -49,6 +50,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.text.ParseException;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 
 /**
@@ -508,8 +511,15 @@ public class BaseBusiness {
     public List<ConsumptionBo> selectOriginalReconciliation(Date consumeDate) {
         return TenantHelper.ignore(() -> originalService.selectReconciliationData(consumeDate));
     }
-    public List<ConsumptionBo> selectOriginalNoSend(Date consumeDate) {
-        List<XfConsumeDetailOriginalVo> list = originalService.queryListByConsumeDate(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);
+    }
+    public List<ConsumptionBo> selectOriginalNoSend(Date beginDate,Date endDate) {
+        List<XfConsumeDetailOriginalVo> list = originalService.queryListByConsumeDate(beginDate, endDate);
         List<ConsumptionBo>  consumptionBos = new ArrayList<>();
         list.parallelStream().forEach(p->{
             ConsumptionBo bo = new ConsumptionBo();
@@ -533,14 +543,18 @@ public class BaseBusiness {
     }
 
     public R<Void> sendToJwKafkaTest(Date consumeDate){
-        List<ConsumptionBo> list = selectOriginalNoSend(consumeDate);
+        LocalDateTime endTime = LocalDateTime.now().plusDays(1);
+        return sendToJwKafkaTest(consumeDate,CardDateUtils.toDate(endTime));
+    }
+    public R<Void> sendToJwKafkaTest(Date beginDate,Date endDate){
+        List<ConsumptionBo> list = selectOriginalNoSend(beginDate,endDate);
         if (CollUtil.isNotEmpty(list)) {
             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);
+                //向教务推送刷卡数据
                 taskExecutor.submit(() -> sendConsumeToKafka(p, accountVo));
-                taskExecutor.submit(() -> sendCloudConsume(p));
             });
         }
         return R.ok();

+ 28 - 19
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CardBusiness.java

@@ -19,6 +19,8 @@ import org.dromara.common.core.enums.ResultCodeEnum;
 import org.dromara.common.encrypt.utils.YcEncryptUtil;
 import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.server.common.constant.ConsumeConstants;
+import org.dromara.server.consume.cache.CardCacheManager;
 import org.dromara.server.consume.domain.bo.PtBagBo;
 import org.dromara.server.consume.domain.vo.PtBagVo;
 import org.dromara.server.consume.domain.vo.yc.BagInfo;
@@ -33,32 +35,24 @@ import java.util.List;
 import java.util.Objects;
 
 /**
- * @ClassName EmployeeBusiness
- * @Description TODO
- * @Author luoyibo
- * @Date 2024-12-16 15:47
- * @Version 1.0
- * @since jdk17
+ * 卡片业务处理
+ * <p>
+ * 对消费业务用到的卡片数据业务处理
+ *
+ * @author luoyibo
+ * @version 2.2.0
+ * @date 2025-06-25
+ * @since JDK17
  */
 @Slf4j
 @Service
 @RequiredArgsConstructor
 public class CardBusiness {
     private final IPtBagService ptBagService;
+    private final CardCacheManager cardCacheManager;
 
     public ReturnResult getCardBagsByCardNo(Long cardNo) {
-        String strCardNo = String.valueOf(cardNo);
-        Object objCard = RedisUtils.getCacheMapValue(CacheNames.PT_USER_CARD_NO, strCardNo);
-        if (objCard == null) {
-            ErrorResult result = new ErrorResult();
-            result.setStatusCode(HttpStatus.NOT_FOUND.value());
-            result.setMessage("获取卡片信息失败");
-            result.getErrors()
-                .add(new ErrorInfo(1, "获取卡片信息失败", ApiErrorTypeConstants.NOT_FOUND, "流水号为[" + cardNo + "]的卡片不存在!"));
-
-            return ReturnResult.failure(ResultCodeEnum.DATA_NOT_FOUND, result);
-        }
-        RemoteCardVo remoteCardVo = JsonUtils.parseObject(objCard.toString(), RemoteCardVo.class);
+        RemoteCardVo remoteCardVo = getCardFromCache(cardNo, ConsumeConstants.CARD_NO);
         if (remoteCardVo == null) {
             ErrorResult result = new ErrorResult();
             result.setStatusCode(HttpStatus.NOT_FOUND.value());
@@ -80,7 +74,22 @@ public class CardBusiness {
         } else {
             return ReturnResult.success(obj);
         }
-
+    }
+    /**
+     * 从缓存获取卡片信息
+     *
+     * @param checkParam 卡片标识
+     * @param checkMode  获取方式
+     * @return 账户信息对象
+     */
+    public RemoteCardVo getCardFromCache(Long checkParam, Integer checkMode) {
+        Object cacheCard = null;
+        switch (checkMode) {
+            case ConsumeConstants.CARD_USER -> cacheCard = cardCacheManager.getByUserId(checkParam);
+            case ConsumeConstants.CARD_NO -> cacheCard = cardCacheManager.getByCardNo(checkParam);
+            case ConsumeConstants.CARD_FACTORY -> cacheCard = cardCacheManager.getByFactoryId(checkParam);
+        }
+        return cacheCard == null ? null : JsonUtils.parseObject(cacheCard.toString(), RemoteCardVo.class);
     }
 
     private Object setCardBagInfo(RemoteCardVo remoteCardVo) {

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

@@ -324,6 +324,7 @@ public class TermBusiness {
         token.setAuthTime(MIN_TIME);
         token.setExpireTime(currentTime + TOKEN_EXPIRE_MS);
         token.setRoomName(roomName);
+
     }
 
 }

+ 1 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/cache/CardCacheManager.java

@@ -13,8 +13,7 @@ import org.springframework.stereotype.Service;
 /**
  * 卡片缓存处理
  * <p>
- * [功能说明]
- * ${1:在此简要描述文件核心功能}
+ * 对消费业务用到的卡片数据缓存处理
  *
  * @author luoyibo
  * @version 2.2.0

+ 3 - 18
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/CommonCheck.java

@@ -24,6 +24,7 @@ import org.dromara.server.common.constant.ConsumeConstants;
 import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
 import org.dromara.server.common.util.CardDateUtils;
 import org.dromara.server.consume.business.BaseBusiness;
+import org.dromara.server.consume.business.CardBusiness;
 import org.dromara.server.consume.business.InitBusiness;
 import org.dromara.server.consume.cache.CardCacheManager;
 import org.dromara.server.consume.domain.vo.XfCardLimitedVo;
@@ -68,7 +69,7 @@ public class CommonCheck {
 
     private final BaseBusiness baseBusiness;
     private final InitBusiness initBusiness;
-    private final CardCacheManager cardCacheManager;
+    private final CardBusiness cardBusiness;
     private final ThreadPoolTaskExecutor taskExecutor;
 
     //region 账户、卡片与设备验证
@@ -506,7 +507,7 @@ public class CommonCheck {
      * @return 如果卡片有效且状态正常,返回成功响应;否则返回包含错误信息的响应
      */
     private R<ErrorInfo> checkCard(Long checkParam, Integer checkMode, AllowConsumeValidationContext ctx) {
-        RemoteCardVo cardVo = getCardFromCache(checkParam, checkMode);
+        RemoteCardVo cardVo = cardBusiness.getCardFromCache(checkParam, checkMode);
         // 卡片不存在,不允许消费
         if (cardVo == null) {
             return createErrorResponse(400, ApiErrorTypeConstants.CARD_NOT_EXISTS,
@@ -562,22 +563,6 @@ public class CommonCheck {
         return null;
     }
 
-    /**
-     * 从缓存获取卡片信息
-     *
-     * @param checkParam 卡片标识
-     * @param checkMode  获取方式
-     * @return 账户信息对象
-     */
-    private RemoteCardVo getCardFromCache(Long checkParam, Integer checkMode) {
-        Object cacheCard = null;
-        switch (checkMode) {
-            case ConsumeConstants.CARD_NO -> cacheCard = cardCacheManager.getByCardNo(checkParam);
-            case ConsumeConstants.CARD_USER -> cacheCard = cardCacheManager.getByUserId(checkParam);
-            case ConsumeConstants.CARD_FACTORY -> cacheCard = cardCacheManager.getByFactoryId(checkParam);
-        }
-        return cacheCard == null ? null : JsonUtils.parseObject(cacheCard.toString(), RemoteCardVo.class);
-    }
     // endregion
 
     /**

+ 4 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/ConsumeController.java

@@ -128,6 +128,10 @@ public class ConsumeController {
     public R<Void> consumeKafka(@PathVariable("date") String date) {
         return baseBusiness.sendToJwKafkaTest(DateUtils.parseDate(date));
     }
+    @PostMapping("/Consume/kafka/{beginDate}/{endDate}")
+    public R<Void> consumeKafka(@PathVariable("beginDate") String beginDate,@PathVariable("endDate") String endDate) {
+        return baseBusiness.sendToJwKafkaTest(DateUtils.parseDate(beginDate),DateUtils.parseDate(endDate));
+    }
 
     /**
      * 原始消费对账,将有原始消费记录但没有消费明细的消费记录写入消费明细

+ 1 - 1
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IConsumeDetailOriginalService.java

@@ -96,5 +96,5 @@ public interface IConsumeDetailOriginalService {
      */
     XfConsumeDetailOriginalVo queryByConsumeDate(Long cardNo, Long termNo, Long termRecordId, Date consumeDate);
 
-    List<XfConsumeDetailOriginalVo> queryListByConsumeDate(Date date);
+    List<XfConsumeDetailOriginalVo> queryListByConsumeDate(Date beginDate, Date endDate);
 }

+ 3 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/ConsumeDetailOriginalServiceImpl.java

@@ -203,8 +203,9 @@ public class ConsumeDetailOriginalServiceImpl implements IConsumeDetailOriginalS
     }
 
     @Override
-    public List<XfConsumeDetailOriginalVo> queryListByConsumeDate(Date date) {
+    public List<XfConsumeDetailOriginalVo> queryListByConsumeDate(Date beginDate, Date endDate) {
         return baseMapper.selectVoList(new LambdaQueryWrapper<XfConsumeDetailOriginal>()
-            .gt(XfConsumeDetailOriginal::getConsumeDate, date));
+            .gt(XfConsumeDetailOriginal::getConsumeDate, beginDate)
+            .le(XfConsumeDetailOriginal::getConsumeDate,endDate));
     }
 }