Przeglądaj źródła

fix(消费服务): 解决消费服务人脸消费验证通不过问题

autumnal_wind 11 miesięcy temu
rodzic
commit
c463d44fe1

+ 2 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -185,6 +185,8 @@ public interface CacheNames {
      */
     String PT_USER_ACCOUNT_ID = "pt_user_account_id";
     String PT_USER_ACCOUNT_NO = "pt_user_account_no";
+    String PT_USER_ACCOUNT_List = "pt_user_account_list";
+
     /**
      * 营业时段/餐类
      */

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

@@ -242,7 +242,6 @@ 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);

+ 1 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/EmployeeBusiness.java

@@ -20,7 +20,6 @@ import org.dromara.system.api.RemoteDeptService;
 import org.dromara.system.api.domain.vo.RemoteDeptVo;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
-
 /**
  * @ClassName EmployeeBusiness
  * @Description TODO
@@ -37,7 +36,6 @@ public class EmployeeBusiness {
     private final RemoteUserAccountService remoteUserAccountService;
     @DubboReference
     private final RemoteDeptService remoteDeptService;
-    @DubboReference
 
 
     public ReturnResult getEmployeeVoByNumb(String userNumb) {
@@ -52,6 +50,7 @@ public class EmployeeBusiness {
 
             return ReturnResult.failure(ResultCodeEnum.DATA_NOT_FOUND, result);
         }
+        // RemoteUserAccountVo userAccountVo = new RemoteUserAccountVo();
         return ReturnResult.success(this.setReturnEmployeeVo(userAccountVo));
     }
 

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

@@ -220,8 +220,6 @@ public class InitBusiness {
             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);
     }
@@ -238,23 +236,19 @@ public class InitBusiness {
 
         if (CollectionUtil.isNotEmpty(filterList)) {
             RedisUtils.deleteKeys(CacheNames.USER_TOTAL_BALANCE);
-            RedisUtils.deleteKeys(CacheNames.PT_USER_ACCOUNT_ID);
-            RedisUtils.deleteKeys(CacheNames.PT_USER_ACCOUNT_NO);
+            RedisUtils.deleteKeys(CacheNames.PT_USER_ACCOUNT_List);
+
+            RedisUtils.setCacheList(CacheNames.PT_USER_ACCOUNT_List, filterList);
             list.forEach(v -> {
                 Long userId = v.getUserId();
                 String strUserId = String.valueOf(userId);
-                String strUserNo = String.valueOf(v.getUserNo());
-
-                RedisUtils.setCacheMapValue(CacheNames.PT_USER_ACCOUNT_ID, strUserId, v);
-                RedisUtils.setCacheMapValue(CacheNames.PT_USER_ACCOUNT_NO, strUserNo, v);
 
                 BigDecimal balance = bagService.getUserBalance(userId);
                 RedisUtils.setCacheMapValue(CacheNames.USER_TOTAL_BALANCE, strUserId, balance);
 
             });
             RedisUtils.expire(CacheNames.PT_USER_ACCOUNT_ID, Duration.ofHours(5));
-            RedisUtils.expire(CacheNames.PT_USER_ACCOUNT_NO, Duration.ofHours(5));
-            RedisUtils.expire(CacheNames.USER_TOTAL_BALANCE, Duration.ofHours(5));
+            RedisUtils.expire(CacheNames.PT_USER_ACCOUNT_List, Duration.ofHours(5));
         }
         log.info("初始化人员账户参数完成");
     }

+ 1 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/AllowConsumeValidationContext.java

@@ -48,6 +48,7 @@ public class AllowConsumeValidationContext {
         context.cardNo = bo.getCardNo();
         context.factoryId = bo.getFactoryId();
         context.userNo = bo.getUserNo();
+        context.userNumb = bo.getUserNumb();
         context.termNo = bo.getTermNo();
         context.termMac=bo.getTermMac();
 

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

@@ -143,7 +143,6 @@ public class CardConsumeValidationContext {
             context.cardLimitedVo = initXfCardLimited(context.cardNo, context.consumeDate, context.lastMeal);
         }
         LocalDateTime lastPayLimitLocalDt = CardDateUtils.toLocalDateTime(context.cardLimitedVo.getLastPay());
-        log.info("limit-last-pay:{},consumeDate:{}", lastPayLimitLocalDt.toLocalDate(), context.lastPayTime.toLocalDate());
         if (!lastPayLimitLocalDt.toLocalDate().isEqual(context.lastPayTime.toLocalDate())) {
             // 如果和消费时间不是同天,初始化为当天
             initCardDayLimitedData(context.cardLimitedVo, Long.valueOf(context.lastMeal), context.consumeDate);
@@ -158,8 +157,6 @@ public class CardConsumeValidationContext {
                 context.cardLimitedVo.setLastPay(context.consumeDate);
             }
         }
-        log.info("初始化到当天的卡限制数据:{}", JsonUtils.toJsonString(context.cardLimitedVo));
-
         return context;
     }
 

+ 48 - 8
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/CommonCheck.java

@@ -53,6 +53,7 @@ public class CommonCheck {
     // 用户校验模式 0-userId 1- userNo
     private static final Integer userIdMode = 0;
     private static final Integer userNoMode = 1;
+    private static final Integer userNumbMode = 2;
     // 卡片校验模式 0-userId 1- cardNo
     private static final Integer cardIdMode = 0;
     private static final Integer cardNoMode = 1;
@@ -91,6 +92,8 @@ public class CommonCheck {
         AllowConsumeValidationContext termCtx = AllowConsumeValidationContext.create(ctx.getBo());
         AllowConsumeValidationContext userAccountCtx = AllowConsumeValidationContext.create(ctx.getBo());
 
+        // checkUserAccount(userAccountCtx);
+
         validationTasks.add(() -> checkParam(ctx));
         validationTasks.add(() -> checkTerm(termCtx));
         validationTasks.add(() -> checkUserAccount(userAccountCtx));
@@ -362,6 +365,7 @@ public class CommonCheck {
         try {
             long cardNo = ObjectUtil.isEmpty(ctx.getCardNo()) ? 0 : ctx.getCardNo();
             long userNo = ObjectUtil.isEmpty(ctx.getUserNo()) ? 0 : ctx.getUserNo();
+            String userNumb = ObjectUtil.isEmpty(ctx.getUserNumb()) ? null : ctx.getUserNumb();
 
             // 如果卡流水号>0验证卡信息
             if (cardNo > 0) {
@@ -370,6 +374,9 @@ public class CommonCheck {
             if (userNo > 0) {
                 return checkUserNo(ctx);
             }
+            if (ObjectUtil.isNotEmpty(userNumb)) {
+                return checkUserNumb(ctx);
+            }
             return R.ok();
         } catch (Exception e) {
             Thread.currentThread().interrupt();
@@ -403,7 +410,7 @@ public class CommonCheck {
 
         }
         // 获取消费账户信息
-        Long userId = ctx.getUserCardVo().getUserId();
+        String userId = String.valueOf(ctx.getUserCardVo().getUserId());
         result = checkUser(userId, userIdMode, ctx);
         if (R.isError(result)) {
             return result;
@@ -422,7 +429,7 @@ public class CommonCheck {
      */
     private R<ErrorInfo> checkUserNo(AllowConsumeValidationContext ctx) {
         // 校验账户信息
-        Long userNo = ctx.getUserNo();
+        String userNo = String.valueOf(ctx.getUserNo());
         R<ErrorInfo> result = checkUser(userNo, userNoMode, ctx);
         if (R.isError(result)) {
             return result;
@@ -439,6 +446,30 @@ public class CommonCheck {
         return R.ok();
     }
 
+    /**
+     * 根据用户编号校验账户是否可以消费。
+     *
+     * @param ctx 消费有效性校验上下文,包含消费相关的基础信息(如用户流水号、消费金额等)
+     * @return 如果校验失败,则返回包含错误信息的 R 对象;如果校验成功,则返回表示成功的 R 对象
+     */
+    private R<ErrorInfo> checkUserNumb(AllowConsumeValidationContext ctx) {
+        // 校验账户信息
+        String userNumb = ctx.getUserNumb();
+        R<ErrorInfo> result = checkUser(userNumb, userNumbMode, ctx);
+        if (R.isError(result)) {
+            return result;
+        }
+        // 校验卡片信息
+        Long userId = ctx.getUserAccountVo().getUserId();
+        result = checkCard(userId, cardIdMode, ctx);
+        if (R.isError(result)) {
+            return result;
+        }
+        // 更新bo中部分值息
+        setCheckAfterAccountData(ctx);
+
+        return R.ok();
+    }
     /**
      * 校验用户账户信息是否符合交易条件。
      * 该方法会检查账户是否存在、是否被冻结、状态是否正常、是否已开户以及是否过期。
@@ -449,7 +480,7 @@ public class CommonCheck {
      * @param ctx        消费有效性校验上下文     *
      * @return 包含错误信息的响应对象,如果校验失败则返回错误详情;如果校验成功则返回成功响应
      */
-    private R<ErrorInfo> checkUser(Long checkParam, Integer checkMode, AllowConsumeValidationContext ctx) {
+    private R<ErrorInfo> checkUser(String checkParam, Integer checkMode, AllowConsumeValidationContext ctx) {
         // 1. 从缓存获取账户信息
         RemoteUserAccountVo accountVo = getAccountFromCache(checkParam, checkMode);
         // 账户不存在,不允许交易
@@ -526,11 +557,20 @@ public class CommonCheck {
      * @param checkMode  校验模式
      * @return 账户信息对象
      */
-    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);
+    private RemoteUserAccountVo getAccountFromCache(String checkParam, Integer checkMode) {
+        List<RemoteUserAccountVo> list = RedisUtils.getCacheList(CacheNames.PT_USER_ACCOUNT_List);
+        if (CollectionUtil.isEmpty(list)) {
+            return null;
+        }
+        Long tempValue = Long.valueOf(checkParam);
+        if (checkMode.equals(userIdMode)) {
+            return list.parallelStream().filter(p -> tempValue.equals(p.getUserId())).findFirst().orElse(null);
+        } else if (checkMode.equals(userNoMode)) {
+            return list.parallelStream().filter(p -> tempValue.equals(p.getUserNo())).findFirst().orElse(null);
+        } else if (checkMode.equals(userNumbMode)) {
+            return list.parallelStream().filter(p -> checkParam.equals(p.getUserNumb())).findFirst().orElse(null);
+        }
+        return null;
     }
 
     /**

+ 0 - 5
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/ConsumeRequestCheck.java

@@ -2,7 +2,6 @@ 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;
@@ -229,9 +228,7 @@ public class ConsumeRequestCheck {
         LocalDateTime now = LocalDateTime.now();
         LocalDateTime beforeTime = LocalDateTime.now().plusDays(-1);
         LocalDateTime lastPay = cardVo.getLastPay() == null ? beforeTime : CardDateUtils.toLocalDateTime(cardVo.getLastPay());
-        // 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());
@@ -243,11 +240,9 @@ public class ConsumeRequestCheck {
 
         // 日消费数据初始化
         if (!sameDay) {
-            // cardService.initCardDayData(cardVo.getCardNo());
             cardVo.setDayCount(0L);
             cardVo.setDayTotal(BigDecimal.ZERO);
         }
-        log.info("初始化后的卡片数据:{}", JSONUtil.toJsonStr(cardVo));
     }
 
     /**