Просмотр исходного кода

refactor(消费服务): 优化日志输出与缓存更新逻辑

1. 新增多处日志输出,记录卡片数据、限制数据及缓存更新内容,提升问题排查效率。
2. 调整缓存更新逻辑,将对象序列化为JSON字符串存储,确保数据一致性。
3. 修正部分代码格式与注释,提升代码可读性与维护性。
autumnal_wind 11 месяцев назад
Родитель
Сommit
282ebef378

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

@@ -22,6 +22,7 @@ import org.dromara.common.core.enums.CreditTypeEnum;
 import org.dromara.common.core.exception.consume.ConsumeException;
 import org.dromara.common.core.utils.DateUtils;
 import org.dromara.common.core.utils.RecordIdUtils;
+import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.message.kafka.constant.EventTypeConstants;
 import org.dromara.common.message.kafka.constant.KafkaTopicConstants;
 import org.dromara.common.message.kafka.enums.EventSenderEnum;
@@ -190,14 +191,16 @@ public class BaseBusiness {
 
         userCardVo.setLastMeal(mealType);
         userCardVo.setLastPay(consumeDate);
+        log.info("待更新的卡片日消费数据,[{}]", JSONUtil.toJsonStr(userCardVo));
         String cardNo = String.valueOf(userCardVo.getCardNo());
         String userId = String.valueOf(userCardVo.getUserId());
 
         RedisUtils.delCacheMapValue(CacheNames.PT_USER_CARD_NO, cardNo);
         RedisUtils.delCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, userId);
 
-        RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_NO, cardNo, userCardVo);
-        RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, userId, userCardVo);
+        String strCard = JsonUtils.toJsonString(userCardVo);
+        RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_NO, cardNo, strCard);
+        RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, userId, strCard);
 
         // 更新数据库
         remoteCardService.updateCardDayData(userCardVo);
@@ -239,6 +242,7 @@ public class BaseBusiness {
             cardLimitedVo.setMealCount(cardLimitedVo.getMealCount() + 1);
             cardLimitedVo.setDayCount(cardLimitedVo.getDayCount() + 1);
         }
+        log.info("待更新的卡片限制数据,[{}]", JSONUtil.toJsonStr(cardLimitedVo));
         String cardNo = String.valueOf(cardLimitedVo.getCardNo());
         RedisUtils.delCacheMapValue(CacheNames.T_XF_CARD_LIMITED, cardNo);
         RedisUtils.setCacheMapValue(CacheNames.T_XF_CARD_LIMITED, cardNo, cardLimitedVo);

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

@@ -9,6 +9,7 @@ import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.backstage.api.*;
 import org.dromara.backstage.api.domain.vo.*;
 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.consume.domain.bo.XfCardLimitedBo;
 import org.dromara.server.consume.domain.vo.XfCardLimitedVo;
@@ -189,8 +190,12 @@ public class InitBusiness {
             list.forEach(v -> {
                 String cardNo = String.valueOf(v.getCardNo());
                 String userId = String.valueOf(v.getUserId());
-                RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_NO, cardNo, v);
-                RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, userId, v);
+                // RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_NO, cardNo, v);
+                // RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, userId, v);
+                String strCard = JsonUtils.toJsonString(v);
+                RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_NO, cardNo, strCard);
+                RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, userId, strCard);
+
             });
             RedisUtils.expire(CacheNames.PT_USER_CARD_NO, Duration.ofHours(5));
             RedisUtils.expire(CacheNames.PT_USER_CARD_USER_ID, Duration.ofHours(5));
@@ -212,8 +217,11 @@ public class InitBusiness {
             RedisUtils.delCacheMapValue(CacheNames.PT_USER_CARD_NO, cardNo);
             RedisUtils.delCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, userId);
 
-            RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_NO, cardNo, cardVo);
-            RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, userId, cardVo);
+            String strCard = JsonUtils.toJsonString(cardVo);
+            RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_NO, cardNo, strCard);
+            RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, userId, strCard);
+            // RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_NO, cardNo, cardVo);
+            // RedisUtils.setCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, userId, cardVo);
         }
         log.info("初始指定人员卡片参数完成,人员Id:{}", id);
     }

+ 4 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/CardConsumeValidationContext.java

@@ -1,6 +1,7 @@
 package org.dromara.server.consume.check;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONUtil;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.backstage.api.domain.vo.RemoteCardVo;
@@ -137,6 +138,8 @@ public class CardConsumeValidationContext {
         if (ObjectUtil.isEmpty(context.cardLimitedVo)) {
             context.cardLimitedVo = initXfCardLimited(context.cardNo, context.consumeDate, context.lastMeal);
         }
+        log.info("缓存获取到的卡限制数据:{}", JSONUtil.toJsonStr(context.cardLimitedVo));
+
         LocalDateTime lastPayLimitLocalDt = CardDateUtils.toLocalDateTime(context.cardLimitedVo.getLastPay());
         if (!lastPayLimitLocalDt.toLocalDate().isEqual(context.lastPayTime.toLocalDate())) {
             // 如果和消费时间不是同天,初始化为当天
@@ -152,6 +155,7 @@ public class CardConsumeValidationContext {
                 context.cardLimitedVo.setLastPay(context.consumeDate);
             }
         }
+        log.info("初始化到当天的卡限制数据:{}", JSONUtil.toJsonStr(context.cardLimitedVo));
 
         return context;
     }

+ 44 - 41
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/CommonCheck.java

@@ -18,6 +18,7 @@ import org.dromara.common.core.domain.model.ErrorInfo;
 import org.dromara.common.core.enums.CardStatusEnum;
 import org.dromara.common.core.enums.TradeStatusEnum;
 import org.dromara.common.core.enums.UserAccountStatusEnum;
+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.consume.business.BaseBusiness;
@@ -100,7 +101,7 @@ public class CommonCheck {
                     R<ErrorInfo> result = task.get();
                     // 如果发现错误且尚未设置错误结果
                     if (result != null && R.isError(result) &&
-                            firstError.compareAndSet(null, result)) {
+                        firstError.compareAndSet(null, result)) {
                         // 取消其他任务(通过中断)
                         taskExecutor.getThreadPoolExecutor().getQueue().clear();
                     }
@@ -124,6 +125,7 @@ public class CommonCheck {
             return firstError.get() != null ? firstError.get() : R.ok();
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
+            log.error("error:{}", e.getMessage(), e);
             return createError(TradeStatusEnum.SysError);
         }
     }
@@ -142,14 +144,14 @@ public class CommonCheck {
         // 1. 校验设备标识参数
         if (isTerminalInvalid(ctx)) {
             return createErrorResponse(1, ApiErrorTypeConstants.PARAM_ERROR,
-                                       "设备机号不正确", "设备机号必须大于零或MAC地址不能为空!");
+                "设备机号不正确", "设备机号必须大于零或MAC地址不能为空!");
         }
 
         // 2. 校验用户标识参数
         if (isUserIdentifierInvalid(ctx)) {
             return createErrorResponse(1, ApiErrorTypeConstants.PARAM_ERROR,
-                                       "交易人员标识不满足",
-                                       "必须提供 [CardNo | FactoryId | userNo | userNumb]  中至少1项来标识交易用户");
+                "交易人员标识不满足",
+                "必须提供 [CardNo | FactoryId | userNo | userNumb]  中至少1项来标识交易用户");
         }
 
         // 3. 所有参数校验通过
@@ -165,7 +167,7 @@ public class CommonCheck {
     private boolean isTerminalInvalid(AllowConsumeValidationContext ctx) {
         // 终端号为空或为0 且 MAC地址为空
         return (ObjectUtil.isEmpty(ctx.getTermNo()) || ctx.getTermNo() == 0)
-                   && ObjectUtil.isEmpty(ctx.getTermMac());
+            && ObjectUtil.isEmpty(ctx.getTermMac());
     }
 
     /**
@@ -177,9 +179,9 @@ public class CommonCheck {
     private boolean isUserIdentifierInvalid(AllowConsumeValidationContext ctx) {
         // 所有用户标识字段均为空或无效值
         return ctx.getCardNo() <= 0L
-                   && ctx.getFactoryId() == 0L
-                   && ctx.getUserNo() <= 0L
-                   && StrUtil.isEmpty(ctx.getUserNumb());
+            && ctx.getFactoryId() == 0L
+            && ctx.getUserNo() <= 0L
+            && StrUtil.isEmpty(ctx.getUserNumb());
     }
     // endregion
 
@@ -197,8 +199,8 @@ public class CommonCheck {
         List<XfTermVo> list = RedisUtils.getCacheList(CacheNames.PT_TERM_LIST);
         if (CollectionUtil.isEmpty(list)) {
             return createErrorResponse(1, ApiErrorTypeConstants.OBJECT_NOT_EXISTS,
-                                       "未获取到设备数据",
-                                       "获取消费设备失败");
+                "未获取到设备数据",
+                "获取消费设备失败");
         }
         XfTermVo termVo;
         String mac = ctx.getTermMac();
@@ -210,8 +212,8 @@ public class CommonCheck {
         }
         if (ObjectUtil.isEmpty(termVo)) {
             return createErrorResponse(400, ApiErrorTypeConstants.OBJECT_NOT_EXISTS,
-                                       "设备不存在",
-                                       MessageFormat.format("机号或MAC为[{0}]的设备不存在,不允许交易", msgInfo));
+                "设备不存在",
+                MessageFormat.format("机号或MAC为[{0}]的设备不存在,不允许交易", msgInfo));
         }
         // 因为后续处理都是用的机号,如果消费机上传的是mac地址,则将termNo更新到消费业务对象
         if (termVo != null) {
@@ -265,9 +267,9 @@ public class CommonCheck {
         Long cardFactoryId = ctx.getUserCardVo().getFactoryId();
         if (factoryId.compareTo(0L) > 0 && !cardFactoryId.equals(factoryId)) {
             return createErrorResponse(400, ApiErrorTypeConstants.PARAM_ERROR,
-                                       "卡片不正确",
-                                       MessageFormat.format("物理卡号不一致,不允许交易。传入值[{0}],系统值[{1}]", factoryId,
-                                                            cardFactoryId));
+                "卡片不正确",
+                MessageFormat.format("物理卡号不一致,不允许交易。传入值[{0}],系统值[{1}]", factoryId,
+                    cardFactoryId));
 
         }
         // 获取消费账户信息
@@ -323,32 +325,32 @@ public class CommonCheck {
         // 账户不存在,不允许交易
         if (ObjectUtil.isEmpty(accountVo)) {
             return createErrorResponse(400, ApiErrorTypeConstants.NOT_FOUND,
-                                       "账户不存在",
-                                       MessageFormat.format("流水号或Id为[{0}]的账户不存在,不允许交易", checkParam));
+                "账户不存在",
+                MessageFormat.format("流水号或Id为[{0}]的账户不存在,不允许交易", checkParam));
         }
         // 账户被冻结,不允许交易
         if (ObjectUtil.equals(accountVo.getFreezeStatus(), Constants.SYS_YES)) {
             return createErrorResponse(400, ApiErrorTypeConstants.BAD_REQUEST,
-                                       "账户被冻结",
-                                       MessageFormat.format("流水号或Id为[{0}]的账户被冻结,不允许交易", checkParam));
+                "账户被冻结",
+                MessageFormat.format("流水号或Id为[{0}]的账户被冻结,不允许交易", checkParam));
         }
         // 账户状态不正常,不允许交易
         if (ObjectUtil.equals(accountVo.getStatus(), Constants.SYS_NO)) {
             return createErrorResponse(400, ApiErrorTypeConstants.NOT_FOUND,
-                                       "账户状态不正常",
-                                       MessageFormat.format("流水号或Id为[{0}]的账户状态不正常,不允许交易", checkParam));
+                "账户状态不正常",
+                MessageFormat.format("流水号或Id为[{0}]的账户状态不正常,不允许交易", checkParam));
         }
         // 未开户,不允许交易
         if (!ObjectUtil.equals(accountVo.getAccountStatus(), UserAccountStatusEnum.IS_OPEN.code().toString())) {
             return createErrorResponse(400, ApiErrorTypeConstants.NOT_FOUND,
-                                       "账户尚未开户",
-                                       MessageFormat.format("流水号或Id为[{0}]的账户尚未开户,不允许交易", checkParam));
+                "账户尚未开户",
+                MessageFormat.format("流水号或Id为[{0}]的账户尚未开户,不允许交易", checkParam));
         }
         // 账户已过有效期,不允许消费
         if (accountVo.getLifespan().getTime() < System.currentTimeMillis()) {
             return createErrorResponse(400, ApiErrorTypeConstants.BAD_REQUEST,
-                                       "账户过期",
-                                       MessageFormat.format("流水号或Id为[{0}]的账户已过期,不允许交易", checkParam));
+                "账户过期",
+                MessageFormat.format("流水号或Id为[{0}]的账户已过期,不允许交易", checkParam));
         }
         // 全部检查通过,复制账户信息
         ctx.setUserAccountVo(accountVo);
@@ -371,14 +373,14 @@ public class CommonCheck {
         // 卡片不存在,不允许消费
         if (ObjectUtil.isEmpty(cardVo)) {
             return createErrorResponse(400, ApiErrorTypeConstants.CARD_NOT_EXISTS,
-                                       "卡片不存在",
-                                       MessageFormat.format("流水号或用户Id或物理卡号为[{0}]的卡片不存在,不允许交易", checkParam));
+                "卡片不存在",
+                MessageFormat.format("流水号或用户Id或物理卡号为[{0}]的卡片不存在,不允许交易", checkParam));
         }
         // 卡片状态不正常,不允许消费
         if (!String.valueOf(CardStatusEnum.NORMAL.code()).equals(cardVo.getStatus())) {
             return createErrorResponse(400, ApiErrorTypeConstants.CARD_STATUS_NOT_NORMAL,
-                                       "卡片状态不正确",
-                                       MessageFormat.format("流水号或用户Id或物理卡号为[{0}]的卡片状态不正确,不允许交易", checkParam));
+                "卡片状态不正确",
+                MessageFormat.format("流水号或用户Id或物理卡号为[{0}]的卡片状态不正确,不允许交易", checkParam));
 
         }
 
@@ -397,8 +399,8 @@ public class CommonCheck {
     private RemoteUserAccountVo getAccountFromCache(Long checkParam, Integer checkMode) {
         String cacheKey = checkParam.toString();
         return checkMode.equals(userIdMode) ?
-                   RedisUtils.getCacheMapValue(CacheNames.PT_USER_ACCOUNT_ID, cacheKey) :
-                   RedisUtils.getCacheMapValue(CacheNames.PT_USER_ACCOUNT_NO, cacheKey);
+            RedisUtils.getCacheMapValue(CacheNames.PT_USER_ACCOUNT_ID, cacheKey) :
+            RedisUtils.getCacheMapValue(CacheNames.PT_USER_ACCOUNT_NO, cacheKey);
     }
 
     /**
@@ -411,8 +413,9 @@ public class CommonCheck {
     private RemoteCardVo getCardFromCache(Long checkParam, Integer checkMode) {
         String cacheKey = checkParam.toString();
         return checkMode.equals(cardIdMode) ?
-                   RedisUtils.getCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, cacheKey) :
-                   RedisUtils.getCacheMapValue(CacheNames.PT_USER_CARD_NO, cacheKey);
+            JsonUtils.parseObject(String.valueOf(RedisUtils.getCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, cacheKey)), RemoteCardVo.class) :
+            JsonUtils.parseObject(String.valueOf(RedisUtils.getCacheMapValue(CacheNames.PT_USER_CARD_NO, cacheKey)), RemoteCardVo.class);
+        // RedisUtils.getCacheMapValue(CacheNames.PT_USER_CARD_NO, cacheKey);
     }
     // endregion
 
@@ -472,8 +475,8 @@ public class CommonCheck {
         }
         String mealTime = DateUtil.format(consumeDate, "HH:mm:ss");
         return list.stream().filter(p -> mealTime
-                                             .compareTo(p.getBeginTime()) >= 0 && mealTime.compareTo(p.getEndTime()) < 0)
-                   .findFirst().orElse(null);
+                .compareTo(p.getBeginTime()) >= 0 && mealTime.compareTo(p.getEndTime()) < 0)
+            .findFirst().orElse(null);
     }
 
     /**
@@ -508,12 +511,12 @@ public class CommonCheck {
         RedisUtils.expire(CacheNames.XF_ORIGINAL_ID, Duration.ofHours(20));
 
         // if (ObjectUtil.equals(currentDateStr, consumeDateStr)) {
-            // 重置卡天当日消费数据
-            taskExecutor.submit(() -> baseBusiness.resetCardConsumeInfo(userCardVo, mealType, consumeMoney, consumeDate));
-            // 重置卡片当日限制数据
-            taskExecutor.submit(() -> baseBusiness.restCardLimitedInfo(mapCardLimited, cardLimitedVo, consumeMoney));
-            // 重置人员当日总卡余
-            taskExecutor.submit(() -> baseBusiness.resetUserBalance(userId, balance));
+        // 重置卡天当日消费数据
+        taskExecutor.submit(() -> baseBusiness.resetCardConsumeInfo(userCardVo, mealType, consumeMoney, consumeDate));
+        // 重置卡片当日限制数据
+        taskExecutor.submit(() -> baseBusiness.restCardLimitedInfo(mapCardLimited, cardLimitedVo, consumeMoney));
+        // 重置人员当日总卡余
+        taskExecutor.submit(() -> baseBusiness.resetUserBalance(userId, balance));
         // }
     }
 

+ 3 - 1
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/ConsumeRequestCheck.java

@@ -2,6 +2,7 @@ package org.dromara.server.consume.check;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.backstage.api.domain.vo.RemoteCardVo;
@@ -228,12 +229,12 @@ public class ConsumeRequestCheck {
         LocalDateTime now = LocalDateTime.now();
         LocalDateTime lastPay = CardDateUtils.toLocalDateTime(cardVo.getLastPay());
 
+        log.info("缓存读取的卡片数据:{}", JSONUtil.toJsonStr(cardVo));
         // 餐类数据初始化
         boolean sameMeal = mealVo.getTypeId().equals(cardVo.getLastMeal().toString());
         boolean sameDay = now.toLocalDate().equals(lastPay.toLocalDate());
 
         if (!sameMeal || !sameDay) {
-            // cardService.initCardMealData(cardVo.getCardNo(), mealVo.getTypeId());
             cardVo.setMealCount(0L);
             cardVo.setMealTotal(BigDecimal.ZERO);
         }
@@ -244,6 +245,7 @@ public class ConsumeRequestCheck {
             cardVo.setDayCount(0L);
             cardVo.setDayTotal(BigDecimal.ZERO);
         }
+        log.info("初始化后的卡片数据:{}", JSONUtil.toJsonStr(cardVo));
     }
 
     /**