소스 검색

Merge remote-tracking branch 'origin/master'

xiari 11 달 전
부모
커밋
261f354ec0
24개의 변경된 파일393개의 추가작업 그리고 267개의 파일을 삭제
  1. 9 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  2. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfLimitedServiceImpl.java
  3. 1 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfLimitedServiceImpl.java
  4. 39 46
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java
  5. 35 4
      ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/constant/ConsumeConstants.java
  6. 20 7
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/BaseBusiness.java
  7. 33 23
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CardBusiness.java
  8. 52 30
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/EmployeeBusiness.java
  9. 53 29
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/InitBusiness.java
  10. 20 7
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/TermBusiness.java
  11. 1 2
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/cache/CardCacheManager.java
  12. 45 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/cache/UserAccountCacheManager.java
  13. 8 7
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/CardConsumeValidation.java
  14. 9 70
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/CommonCheck.java
  15. 3 7
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/ConsumeRequestCheck.java
  16. 22 5
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/CardController.java
  17. 4 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/ConsumeController.java
  18. 1 1
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IConsumeDetailOriginalService.java
  19. 6 1
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IPtBagService.java
  20. 2 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfTermService.java
  21. 3 2
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/ConsumeDetailOriginalServiceImpl.java
  22. 4 1
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/PtBagServiceImpl.java
  23. 14 16
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/XfTermServiceImpl.java
  24. 8 8
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/task/InitTasks.java

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

@@ -162,8 +162,16 @@ public interface CacheNames {
      */
     String PT_TERM_LIST = "pt_term_list";
 
+    /**
+     * 根据设备mac地址缓存设备
+     */
     String PT_TERM_MAC_MAP = "pt_term_mac_map";
 
+    /**
+     * 根据设备机号缓存设备
+     */
+    String PT_TERM_NO = "pt_term_no";
+
     String T_XF_LIMITEDTERM = "t_xf_limitedTerm";
 
     String T_XF_LIMITED = "t_xf_limited";
@@ -185,6 +193,7 @@ 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_NUMB = "pt_user_account_numb";
     String PT_USER_ACCOUNT_LIST = "pt_user_account_list";
     /**
      * 营业时段/餐类

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfLimitedServiceImpl.java

@@ -63,7 +63,7 @@ public class RemoteXfLimitedServiceImpl implements RemoteXfLimitedService {
     public Long queryLimitedTermIdByTermId(Long termId) {
         XfLimitedTermVo vo = limitedTermService.queryByTermId(termId);
         if (ObjectUtil.isNotEmpty(vo)) {
-            return vo.getLimitedTermId();
+            return vo.getTermId();
         }
         return 0L;
     }

+ 1 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfLimitedServiceImpl.java

@@ -149,6 +149,7 @@ public class XfLimitedServiceImpl implements IXfLimitedService {
     public XfLimitedVo queryByCardType(Integer cardType) {
         XfLimitedBo bo = new XfLimitedBo();
         bo.setCardType(cardType.longValue());
+        bo.setStatus("1");
         List<XfLimitedVo> list = this.queryList(bo);
         if (CollectionUtil.isNotEmpty(list)) {
             return list.get(0);

+ 39 - 46
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java

@@ -1,6 +1,7 @@
 package org.dromara.backstage.payment.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -16,6 +17,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.backstage.basics.domain.bo.PtCardtypeBo;
 import org.dromara.backstage.basics.domain.vo.PtCardtypeVo;
 import org.dromara.backstage.basics.service.IPtCardtypeService;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
@@ -92,7 +94,7 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
      */
     @Override
     public PtUserAccountVo queryById(Long userId) {
-        PtUserAccountVo vo = TenantHelper.ignore(()->baseMapper.selectVoById(userId));
+        PtUserAccountVo vo = TenantHelper.ignore(() -> baseMapper.selectVoById(userId));
         if (vo != null && ObjectUtil.isNotEmpty(vo.getDeptId())) {
             RemoteDeptVo remoteDeptVo = remoteDeptService.selectDeptById(vo.getDeptId());
             vo.setDeptName(remoteDeptVo.getDeptName());
@@ -149,10 +151,18 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
         LambdaQueryWrapper<PtUserAccount> lqw = buildQueryWrapper(bo);
         List<PtUserAccountVo> accountVoList = baseMapper.selectVoList(lqw);
         List<RemoteDeptVo> deptVoList = remoteDeptService.selectDeptList();
-        accountVoList.forEach(p->{
+        PtCardtypeBo cardTypeBo = new PtCardtypeBo();
+        cardTypeBo.setStatus("0");
+
+        List<PtCardtypeVo> cardTypeVos = cardTypeService.queryList(cardTypeBo);
+        accountVoList.forEach(p -> {
             String deptName = deptVoList.parallelStream().filter(k -> k.getDeptId().equals(p.getDeptId()))
-                                  .findFirst().map(RemoteDeptVo::getDeptName).orElse("未知部门");
+                .findFirst().map(RemoteDeptVo::getDeptName).orElse("未知部门");
             p.setDeptName(deptName);
+
+            String cardTypeNme = cardTypeVos.parallelStream().filter(k -> k.getCode().equals(p.getCardType()))
+                .findFirst().map(PtCardtypeVo::getTypeName).orElse("未知卡类");
+            p.setCardTypeName(cardTypeNme);
         });
         return accountVoList;
     }
@@ -166,18 +176,18 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
         LambdaQueryWrapper<PtUserAccount> lqw = Wrappers.lambdaQuery();
         lqw.eq(bo.getUserId() != null, PtUserAccount::getUserId, bo.getUserId());
         lqw.eq(bo.getPostId() != null, PtUserAccount::getPostId, bo.getPostId());
-       lqw.eq(bo.getDeptId() != null, PtUserAccount::getDeptId, bo.getDeptId());
+        lqw.eq(bo.getDeptId() != null, PtUserAccount::getDeptId, bo.getDeptId());
         lqw.like(StringUtils.isNotBlank(bo.getUserName()), PtUserAccount::getUserName, bo.getUserName());
         // lqw.eq(StringUtils.isNotBlank(bo.getPassword()), PtUserAccount::getPassword, bo.getPassword());
         lqw.eq(StringUtils.isNotBlank(bo.getUserNumb()), PtUserAccount::getUserNumb, bo.getUserNumb());
         // lqw.like(StringUtils.isNotBlank(bo.getNickName()), PtUserAccount::getNickName, bo.getNickName());
         lqw.like(StringUtils.isNotBlank(bo.getRealName()), PtUserAccount::getRealName, bo.getRealName());
         lqw.eq(StringUtils.isNotBlank(bo.getSex()), PtUserAccount::getSex, bo.getSex());
-        if(StringUtils.isNotBlank(bo.getCategory())){
+        if (StringUtils.isNotBlank(bo.getCategory())) {
             List<String> list = Arrays.asList(bo.getCategory().split(","));
-            if(list.size()>1){
+            if (list.size() > 1) {
                 lqw.in(StringUtils.isNotBlank(bo.getCategory()), PtUserAccount::getCategory, list);
-            } else{
+            } else {
                 lqw.eq(PtUserAccount::getCategory, bo.getCategory());
             }
         }
@@ -504,7 +514,7 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
 
         if (ObjUtil.isNotNull(redisList) && !redisList.isEmpty()) {
             vo = redisList.stream().filter(p -> Objects.equals(p.getRealName(), realName)
-            && Objects.equals(p.getUserNumb(),userNumb)).findFirst().orElse(null);
+                && Objects.equals(p.getUserNumb(), userNumb)).findFirst().orElse(null);
             if (ObjUtil.isNotNull(vo)) {
                 return vo;
             }
@@ -532,39 +542,19 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
         bo.setUserNo(userNo);
         return this.selectVoOneByBo(bo);
     }
+
     @Override
     public PtUserAccountVo getUserAccountVoByUserNumb(String userNumb) {
-        PtUserAccountVo vo;
-        List<PtUserAccountVo> redisList = RedisUtils.getCacheList(CacheNames.PT_USER_ACCOUNT);
-
-        if (ObjUtil.isNotNull(redisList) && !redisList.isEmpty()) {
-            vo = redisList.stream().filter(p -> Objects.equals(p.getUserNumb(), userNumb)).findFirst().orElse(null);
-            if (ObjUtil.isNotNull(vo)) {
-                return vo;
-            }
-        }
-
         PtUserAccountBo bo = new PtUserAccountBo();
         bo.setUserNumb(userNumb);
         return this.selectVoOneByBo(bo);
     }
+
     @Override
     public PtUserAccountVo selectVoOneByBo(PtUserAccountBo bo) {
         List<PtUserAccountVo> list = this.queryList(bo);
         if (ObjectUtil.isNotEmpty(list) && !list.isEmpty()) {
-            PtUserAccountVo vo = list.get(0);
-            if (vo != null) {
-                String deptName = remoteDeptService.selectDeptNameByIds(vo.getDeptId().toString());
-                vo.setDeptName(deptName);
-
-                PtCardtypeVo cardTypeVo  = cardTypeService.queryByCode(vo.getCardType());
-                if  (cardTypeVo != null) {
-                    vo.setCardTypeName(cardTypeVo.getTypeName());
-                }
-
-                RedisUtils.addCacheList(CacheNames.PT_USER_ACCOUNT, vo);
-                return vo;
-            }
+            return list.get(0);
         }
         return null;
     }
@@ -573,19 +563,22 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     public YcTraineeVo selectTraineeByBo(PtUserAccountBo bo, Date doingDate) {
         return TenantHelper.ignore(() -> baseMapper.selectTraineeByBo(bo, doingDate));
     }
+
     /**
      * 删除指定部门下的一卡通账户信息
-     * @param deptId 部门Id
+     *
+     * @param deptId     部门Id
      * @param operatorId 操作员Id
      * @return 删除结果
      */
     @Override
     public int deleteByDeptId(Long deptId, Long operatorId) {
         LambdaUpdateWrapper<PtUserAccount> luw = new LambdaUpdateWrapper<PtUserAccount>().set(PtUserAccount::getDelFlag, DefaultConstants.DELETED)
-                                               .set(PtUserAccount::getUpdateBy, operatorId)
-                                               .eq(PtUserAccount::getDeptId, deptId);
+            .set(PtUserAccount::getUpdateBy, operatorId)
+            .eq(PtUserAccount::getDeptId, deptId);
         return baseMapper.update(null, luw);
     }
+
     /**
      * 根据第三方Id删除人员账户信息
      *
@@ -605,9 +598,9 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
             // 如果存在账户信息,则先注销卡片
             ptCardService.cancelCard(userId, operatorId);
             LambdaUpdateWrapper<PtUserAccount> luw = new LambdaUpdateWrapper<PtUserAccount>().set(PtUserAccount::getDelFlag, DefaultConstants.DELETED)
-                                                         .set(PtUserAccount::getUpdateBy, operatorId)
-                                                         .eq(PtUserAccount::getDeptId, deptId)
-                                                         .eq(PtUserAccount::getDeptId, deptId);
+                .set(PtUserAccount::getUpdateBy, operatorId)
+                .eq(PtUserAccount::getDeptId, deptId)
+                .eq(PtUserAccount::getDeptId, deptId);
             return baseMapper.update(null, luw);
         }
         return 0;
@@ -615,16 +608,16 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
 
     @Override
     public PtUserAccount4SelectVo getCardInfoByFactoryId(String factoryId) {
-        if (StringUtils.isBlank(factoryId)){
+        if (StringUtils.isBlank(factoryId)) {
             return null;
         }
         List<PtUserAccount4SelectVo> list = baseMapper.getCardInfoByFactoryId(factoryId);
-        if (list.isEmpty()){
+        if (list.isEmpty()) {
             return null;
         }
         PtUserAccount4SelectVo res = list.get(0);
-        if(StringUtils.isNotBlank(res.getCardStatus())){
-            String cardStatusName = dictService.getDictLabel("KZT",  res.getCardStatus());
+        if (StringUtils.isNotBlank(res.getCardStatus())) {
+            String cardStatusName = dictService.getDictLabel("KZT", res.getCardStatus());
             res.setCardStatus(cardStatusName);
         }
         return res;
@@ -644,17 +637,17 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
         LambdaQueryWrapper<PtUserAccount> lqw = Wrappers.lambdaQuery();
         lqw.eq(userId != null, PtUserAccount::getUserId, userId);
         List<PtUserAccountVo> userAccounts = baseMapper.selectVoList(lqw);
-        if(CollectionUtil.isEmpty(userAccounts)){
+        if (CollectionUtil.isEmpty(userAccounts)) {
             return res;
         }
         // 正常卡信息
         PtCardBo ptCardBo = new PtCardBo();
         ptCardBo.setStatus(CardStatusEnum.NORMAL.code().toString());
-        if(userId != null){
+        if (userId != null) {
             ptCardBo.setUserId(userId);
         }
         List<PtCardVo> cards = ptCardService.getList(ptCardBo);
-        if(CollectionUtil.isEmpty(cards)){
+        if (CollectionUtil.isEmpty(cards)) {
             return userAccounts;
         }
 
@@ -666,11 +659,11 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
             Optional<PtCardVo> first = cards.stream()
                 .filter(p -> Objects.equals(p.getUserId(), id))
                 .sorted(Comparator.comparing(PtCardVo::getChangeTime).reversed()).findFirst();
-            if(first.isPresent()){
+            if (first.isPresent()) {
                 ptCardVo = first.get();
             }
             userAccount.setCard(ptCardVo);
-            userAccount.setFacePicUrl(photoPrefix+userAccount.getPhoto());
+            userAccount.setFacePicUrl(photoPrefix + userAccount.getPhoto());
 
             res.add(userAccount);
         }

+ 35 - 4
ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/constant/ConsumeConstants.java

@@ -20,12 +20,43 @@ public interface ConsumeConstants {
         put("4", "夜宵");
     }};
 
-    // 用户校验模式 0-userId 1- userNo 2-userNumb
-    Integer userIdMode = 0;
-    Integer userNoMode = 1;
-    Integer userNumbMode = 2;
+    /**
+     * 根据用户Id获取账户信息
+     */
+    int USER_ID = 0;
+
+    /**
+     * 根据用户流水号获取用户信息
+     */
+    int USER_NO = 1;
+
+    /**
+     * 根据用户编号获取用户信息
+     */
+    int USER_NUMB = 2;
     // 卡片校验模式 0-userId 1- cardNo
+    /**
+     * 根据userId获取卡片
+     */
     int CARD_USER = 0;
+
+    /**
+     * 根据卡流水号获取卡片
+     */
     int CARD_NO = 1;
+
+    /**
+     * 根据物理卡号获取卡片
+     */
     int CARD_FACTORY = 2;
+
+    /**
+     * 根据设备机号获取设备
+     */
+    int TERM_NO = 0;
+
+    /**
+     * 根据设备mac地址获取设备
+     */
+    int TERM_MAC = 1;
 }

+ 20 - 7
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.*;
 
 /**
@@ -76,12 +79,13 @@ public class BaseBusiness {
     private final SyncRemoteSendMessageRecordService syncRemoteSendMessageRecordService;
     private final IXfCardLimitedService cardLimitedService;
     private final ThreadPoolTaskExecutor taskExecutor;
+    private final InitBusiness initBusiness;
 
     @DubboReference
     private final RemoteRegisterInfoService remoteRegisterInfoService;
     @DubboReference
     private final RemoteCardService remoteCardService;
-    private final InitBusiness initBusiness;
+
 
     //region 原始消费记录处理
 
@@ -194,7 +198,6 @@ public class BaseBusiness {
         userCardVo.setLastMeal(mealType);
         userCardVo.setLastPay(consumeDate);
 
-        log.info("待更新的卡片日消费数据,[{}]", JSONUtil.toJsonStr(userCardVo));
         initBusiness.resetUserCard(userCardVo);
 
         // 更新数据库
@@ -237,7 +240,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);
@@ -508,8 +510,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 +542,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();

+ 33 - 23
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CardBusiness.java

@@ -19,6 +19,9 @@ 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.cache.UserAccountCacheManager;
 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 +36,25 @@ 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;
+    private final UserAccountCacheManager userAccountCacheManager;
 
     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,18 +76,32 @@ 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) {
         CardBagInfo cardBagInfo = new CardBagInfo();
-        Long userId = remoteCardVo.getUserId();
-        List<RemoteUserAccountVo> listUserAccount = RedisUtils.getCacheList(CacheNames.PT_USER_ACCOUNT_LIST);
-        RemoteUserAccountVo userAccountVo = listUserAccount.parallelStream().filter(p -> userId.equals(p.getUserId()))
-            .findFirst().orElse(null);
+        // String StrUserId = String.valueOf(remoteCardVo.getUserId());
+        RemoteUserAccountVo userAccountVo = userAccountCacheManager.getByUserId(remoteCardVo.getUserId());
         if (userAccountVo == null) {
             return null;
         }
+
         PtBagBo bagBo = new PtBagBo();
         bagBo.setUserId(remoteCardVo.getUserId());
         List<PtBagVo> bagVos = ptBagService.queryList(bagBo);

+ 52 - 30
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/EmployeeBusiness.java

@@ -13,6 +13,9 @@ import org.dromara.common.core.domain.model.ErrorResult;
 import org.dromara.common.core.enums.ResultCodeEnum;
 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.cache.UserAccountCacheManager;
 import org.dromara.server.consume.domain.vo.yc.*;
 import org.dromara.system.api.RemoteDeptService;
 import org.dromara.system.api.domain.vo.RemoteDeptVo;
@@ -33,15 +36,15 @@ import java.util.List;
 @Service
 @RequiredArgsConstructor
 public class EmployeeBusiness {
+    private final UserAccountCacheManager userAccountCacheManager;
+    private final CardCacheManager cardCacheManager;
+
     @DubboReference
     private final RemoteDeptService remoteDeptService;
 
     public ReturnResult getEmployeeVoByNumb(String userNumb) {
-        List<RemoteUserAccountVo> list = RedisUtils.getCacheList(CacheNames.PT_USER_ACCOUNT_LIST);
-        RemoteUserAccountVo userAccountVo = list.parallelStream()
-            .filter(p -> userNumb.equals(p.getUserNumb()))
-            .findFirst().orElse(null);
-        if (userAccountVo==null) {
+        RemoteUserAccountVo userAccountVo = userAccountCacheManager.getByUserNumb(userNumb);
+        if (userAccountVo == null) {
             ErrorResult result = new ErrorResult();
             result.setStatusCode(HttpStatus.NOT_FOUND.value());
             result.setMessage("获取用户信息失败");
@@ -52,42 +55,61 @@ public class EmployeeBusiness {
         }
         return ReturnResult.success(setReturnEmployeeVo(userAccountVo));
     }
+    /**
+     * 从缓存获取账户信息
+     *
+     * @param checkParam 用户标识
+     * @param checkMode  校验模式
+     * @return 账户信息对象
+     */
+    public RemoteUserAccountVo getAccountFromCache(String checkParam, Integer checkMode) {
+        switch (checkMode) {
+            case ConsumeConstants.USER_ID -> {
+                return userAccountCacheManager.getByUserId(Long.valueOf(checkParam));
+            }
+            case ConsumeConstants.USER_NO -> {
+                return userAccountCacheManager.getByUserNo(Long.valueOf(checkParam));
+            }
+            case ConsumeConstants.USER_NUMB -> {
+                return userAccountCacheManager.getByUserNumb(checkParam);
+            }
+        }
+        return null;
+    }
 
     private Object setReturnEmployeeVo(RemoteUserAccountVo userAccountVo) {
-        RemoteDeptVo remoteDeptVo = remoteDeptService.selectDeptById(userAccountVo.getDeptId());
+        // RemoteDeptVo remoteDeptVo = remoteDeptService.selectDeptById(userAccountVo.getDeptId());
         DepartmentVo departmentVo = new DepartmentVo();
-        departmentVo.setDepartmentID(remoteDeptVo.getDeptId().toString());
-        departmentVo.setParentDepartmentID(remoteDeptVo.getParentId().toString());
-        departmentVo.setDepartmentName(remoteDeptVo.getDeptName());
+        departmentVo.setDepartmentID(userAccountVo.getDeptId().toString());
+        // departmentVo.setParentDepartmentID(remoteDeptVo.getParentId().toString());
+        departmentVo.setDepartmentName(userAccountVo.getDeptName());
 
-        String userId = String.valueOf(userAccountVo.getUserId());
-        Object objCard = RedisUtils.getCacheMapValue(CacheNames.PT_USER_CARD_USER_ID, userId);
+        Long userId = userAccountVo.getUserId();
+        Object objCard = cardCacheManager.getByUserId(userId);
         if (objCard == null) {
-            log.info("无人员卡片信息,userNumb:{},userId:{}", userAccountVo.getUserNumb(), userAccountVo.getUserId());
+            log.warn("无人员有效卡片信息,userNumb:{},userId:{}", userAccountVo.getUserNumb(), userAccountVo.getUserId());
             return null;
         }
         RemoteCardVo remoteCardVo = JsonUtils.parseObject(objCard.toString(), RemoteCardVo.class);
         UserCardVo userCardVo = new UserCardVo();
-        Long cardNo = 0L;
-        if (remoteCardVo != null) {
-            CardStatusVo cardStatusVo = new CardStatusVo();
-            int cardStatusId = Integer.parseInt(remoteCardVo.getStatus());
-            cardStatusVo.setCardStatusID(cardStatusId);
-            cardStatusVo.setCardStatus(cardStatusId == 1 ? "正常"
-                : cardStatusId == 2 ? "挂失" : cardStatusId == 3 ? "注销"
-                : cardStatusId == 4 ? "退卡" : cardStatusId == 7 ? "冻结" : "未知");
-            userCardVo.setCardStatus(cardStatusVo);
+        Long cardNo;
+        CardStatusVo cardStatusVo = new CardStatusVo();
+        int cardStatusId = Integer.parseInt(remoteCardVo.getStatus());
+        cardStatusVo.setCardStatusID(cardStatusId);
+        cardStatusVo.setCardStatus(cardStatusId == 1 ? "正常"
+            : cardStatusId == 2 ? "挂失" : cardStatusId == 3 ? "注销"
+            : cardStatusId == 4 ? "退卡" : cardStatusId == 7 ? "冻结" : "未知");
+        userCardVo.setCardStatus(cardStatusVo);
 
-            CardTypeVo cardTypeVo = new CardTypeVo();
-            cardTypeVo.setCardTypeId(remoteCardVo.getCardType().intValue());
-            cardTypeVo.setCardType(remoteCardVo.getCardTypeName());
-            userCardVo.setCardType(cardTypeVo);
+        CardTypeVo cardTypeVo = new CardTypeVo();
+        cardTypeVo.setCardTypeId(remoteCardVo.getCardType().intValue());
+        cardTypeVo.setCardType(remoteCardVo.getCardTypeName());
+        userCardVo.setCardType(cardTypeVo);
 
-            userCardVo.setCardTypeID(remoteCardVo.getCardType().intValue());
-            userCardVo.setEmployeeID(userAccountVo.getUserNo());
-            userCardVo.setFactoryFixID(remoteCardVo.getFactoryId());
-            cardNo = remoteCardVo.getCardNo();
-        }
+        userCardVo.setCardTypeID(remoteCardVo.getCardType().intValue());
+        userCardVo.setEmployeeID(userAccountVo.getUserNo());
+        userCardVo.setFactoryFixID(remoteCardVo.getFactoryId());
+        cardNo = remoteCardVo.getCardNo();
         UserInfoVo userInfoVo = new UserInfoVo();
         userInfoVo.setDepartment(departmentVo);
         userInfoVo.setCard(userCardVo);

+ 53 - 29
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/InitBusiness.java

@@ -12,12 +12,10 @@ 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.domain.PtBag;
+import org.dromara.server.consume.cache.ValidationParam;
 import org.dromara.server.consume.domain.bo.XfCardLimitedBo;
-import org.dromara.server.consume.domain.bo.XfUserTotalBo;
 import org.dromara.server.consume.domain.vo.PtBagVo;
 import org.dromara.server.consume.domain.vo.XfCardLimitedVo;
-import org.dromara.server.consume.domain.vo.XfConsumeDetailVo;
 import org.dromara.server.consume.domain.vo.XfTermVo;
 import org.dromara.server.consume.service.IPtBagService;
 import org.dromara.server.consume.service.IXfCardLimitedService;
@@ -49,6 +47,7 @@ public class InitBusiness {
     private final IPtBagService bagService;
     private final IXfCardLimitedService cardLimitedService;
     private final IXfTermService xfTermService;
+    private final ValidationParam validationParam;
 
     @DubboReference
     private final RemotePtParameterService remotePtParameterService;
@@ -131,7 +130,7 @@ public class InitBusiness {
         if (CollUtil.isNotEmpty(discountCards)) {
             RedisUtils.deleteKeys(CacheNames.T_XF_DISCOUNT);
             discountCards.forEach(p -> {
-                String key = String.format("%s-%s",p.getCardType(),p.getMealType());
+                String key = String.format("%s-%s", p.getCardType(), p.getMealType());
                 RedisUtils.setCacheMapValue(CacheNames.T_XF_DISCOUNT, key, p);
             });
         }
@@ -155,6 +154,8 @@ public class InitBusiness {
                 RedisUtils.setCacheMapValue(CacheNames.T_XF_QUOTA, key, p);
             });
         }
+        validationParam.refresh();
+
         log.info("初始化限额卡类参数完成");
     }
 
@@ -167,7 +168,7 @@ public class InitBusiness {
         Map<String, BigDecimal> sumMap = new HashMap<>();
         for (PtBagVo vo : list) {
             String userId = String.valueOf(vo.getUserId());
-             BigDecimal amount = vo.getBalance();
+            BigDecimal amount = vo.getBalance();
             sumMap.merge(userId, amount, BigDecimal::add);
         }
         for (Map.Entry<String, BigDecimal> entry : sumMap.entrySet()) {
@@ -183,11 +184,8 @@ public class InitBusiness {
      * @param id 人员Id
      */
     public void initUserBalanceByUserId(Long id) {
-        String userId = String.valueOf(id);
-        BigDecimal balance = bagService.getUserBalance(id);
-        RedisUtils.delCacheMapValue(CacheNames.USER_TOTAL_BALANCE, userId);
-        RedisUtils.setCacheMapValue(CacheNames.USER_TOTAL_BALANCE, userId, balance);
-        log.info("初始化指定人员余额完成,人员Id:{}", id);
+        BigDecimal balance = bagService.getUserTotalBalance(id);
+        log.info("初始化指定人员余额完成,人员Id:{}, 余额:{}", id, balance);
     }
 
     /**
@@ -231,9 +229,22 @@ public class InitBusiness {
                 && p.getLifespan().getTime() > System.currentTimeMillis()).toList();
 
         if (CollectionUtil.isNotEmpty(filterList)) {
-            RedisUtils.deleteKeys(CacheNames.PT_USER_ACCOUNT_LIST);
-            RedisUtils.setCacheList(CacheNames.PT_USER_ACCOUNT_LIST, filterList);
-            RedisUtils.expire(CacheNames.PT_USER_ACCOUNT_LIST, Duration.ofHours(5));
+            RedisUtils.deleteKeys(CacheNames.PT_USER_ACCOUNT_ID);
+            RedisUtils.deleteKeys(CacheNames.PT_USER_ACCOUNT_NUMB);
+            RedisUtils.deleteKeys(CacheNames.PT_USER_ACCOUNT_NO);
+
+            filterList.parallelStream().forEach(p -> {
+                String strUserId = String.valueOf(p.getUserId());
+                String strUserNo = String.valueOf(p.getUserNo());
+                String userNumb = String.valueOf(p.getUserNumb());
+
+                RedisUtils.setCacheMapValue(CacheNames.PT_USER_ACCOUNT_ID, strUserId, p);
+                RedisUtils.setCacheMapValue(CacheNames.PT_USER_ACCOUNT_NO, strUserNo, p);
+                RedisUtils.setCacheMapValue(CacheNames.PT_USER_ACCOUNT_NUMB, userNumb, p);
+            });
+            RedisUtils.expire(CacheNames.PT_USER_ACCOUNT_ID, Duration.ofHours(5));
+            RedisUtils.expire(CacheNames.PT_USER_ACCOUNT_NUMB, Duration.ofHours(5));
+            RedisUtils.expire(CacheNames.PT_USER_ACCOUNT_NO, Duration.ofHours(5));
         }
         log.info("初始化人员账户参数完成");
     }
@@ -248,18 +259,18 @@ public class InitBusiness {
         // RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(id);
         // if (ObjectUtil.isNotEmpty(accountVo)) {
         //     List<RemoteUserAccountVo> list = RedisUtils.getCacheList(CacheNames.PT_USER_ACCOUNT_LIST);
-            // String strUserId = String.valueOf(id);
-            // String strUserNo = String.valueOf(accountVo.getUserNo());
-            //
-            // RedisUtils.delCacheMapValue(CacheNames.PT_USER_ACCOUNT_ID, strUserId);
-            // RedisUtils.delCacheMapValue(CacheNames.PT_USER_ACCOUNT_NO, strUserNo);
-            //
-            // RedisUtils.setCacheMapValue(CacheNames.PT_USER_ACCOUNT_ID, strUserId, accountVo);
-            // RedisUtils.setCacheMapValue(CacheNames.PT_USER_ACCOUNT_NO, strUserNo, accountVo);
-            //
-            // BigDecimal balance = bagService.getUserBalance(id);
-            // RedisUtils.delCacheMapValue(CacheNames.PT_USER_CARD_NO, strUserId);
-            // RedisUtils.setCacheMapValue(CacheNames.USER_TOTAL_BALANCE, strUserId, balance);
+        // String strUserId = String.valueOf(id);
+        // String strUserNo = String.valueOf(accountVo.getUserNo());
+        //
+        // RedisUtils.delCacheMapValue(CacheNames.PT_USER_ACCOUNT_ID, strUserId);
+        // RedisUtils.delCacheMapValue(CacheNames.PT_USER_ACCOUNT_NO, strUserNo);
+        //
+        // RedisUtils.setCacheMapValue(CacheNames.PT_USER_ACCOUNT_ID, strUserId, accountVo);
+        // RedisUtils.setCacheMapValue(CacheNames.PT_USER_ACCOUNT_NO, strUserNo, accountVo);
+        //
+        // BigDecimal balance = bagService.getUserBalance(id);
+        // RedisUtils.delCacheMapValue(CacheNames.PT_USER_CARD_NO, strUserId);
+        // RedisUtils.setCacheMapValue(CacheNames.USER_TOTAL_BALANCE, strUserId, balance);
         // }
         log.info("初始化指定人员账户参数完成,人员Id:{}", id);
     }
@@ -285,9 +296,21 @@ public class InitBusiness {
      */
     public void initTermInfo() {
         List<XfTermVo> list = xfTermService.queryList();
-        RedisUtils.deleteKeys(CacheNames.PT_TERM_LIST);
-        RedisUtils.setCacheList(CacheNames.PT_TERM_LIST, list);
-        RedisUtils.expire(CacheNames.PT_TERM_LIST, Duration.ofDays(1));
+        if (CollUtil.isNotEmpty(list)) {
+            RedisUtils.deleteKeys(CacheNames.PT_TERM_NO);
+            RedisUtils.deleteKeys(CacheNames.PT_TERM_MAC_MAP);
+
+            list.parallelStream().forEach(p -> {
+                String no = String.valueOf(p.getTermNo());
+                String mac = p.getTermMac();
+
+                RedisUtils.setCacheMapValue(CacheNames.PT_TERM_NO, no, p);
+                RedisUtils.setCacheMapValue(CacheNames.PT_TERM_MAC_MAP, mac, p);
+            });
+
+            RedisUtils.expire(CacheNames.PT_TERM_NO, Duration.ofDays(1));
+            RedisUtils.expire(CacheNames.PT_TERM_MAC_MAP, Duration.ofDays(1));
+        }
 
         log.info("初始化消费设备参数完成");
     }
@@ -306,9 +329,10 @@ public class InitBusiness {
 
     /**
      * 重置指定卡片的缓存数据
+     *
      * @param cardVo 卡片信息
      */
-    public void resetUserCard(RemoteCardVo cardVo){
+    public void resetUserCard(RemoteCardVo cardVo) {
         if (ObjectUtil.isNotEmpty(cardVo)) {
             String cardNo = String.valueOf(cardVo.getCardNo());
             String userId = String.valueOf(cardVo.getUserId());

+ 20 - 7
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/TermBusiness.java

@@ -5,18 +5,23 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
 import org.dromara.common.core.config.DefaultConfig;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.enums.SystemUseTypeEnum;
+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.cache.TokenManager;
 import org.dromara.server.consume.domain.vo.XfTermVo;
 import org.dromara.server.consume.domain.vo.yc.RoomInfo;
 import org.dromara.server.consume.domain.vo.yc.SettlementAccount;
 import org.dromara.server.consume.domain.vo.yc.TermInfo;
 import org.dromara.server.consume.domain.vo.yc.TermToken;
+import org.dromara.server.consume.service.IXfTermService;
 import org.springframework.stereotype.Service;
 
 import java.text.MessageFormat;
@@ -60,6 +65,8 @@ public class TermBusiness {
 
     private final TokenManager tokenManager;
     private final DefaultConfig defaultConfig;
+    private final IXfTermService termService;
+
 
     /**
      * 获取终端令牌(TermToken)。
@@ -163,13 +170,7 @@ public class TermBusiness {
      *         如果操作成功,则 TermInfo 将包含在返回值中;如果失败,则可能包含错误信息。
      */
     public R<TermInfo> getTermInfoByTermNo(Long termNo, String tenantId) {
-        List<XfTermVo> list = RedisUtils.getCacheList(CacheNames.PT_TERM_LIST);
-        if (CollectionUtil.isEmpty(list)) {
-            return R.fail("无设备清单,请重新加载数据");
-        }
-        XfTermVo termVo = list.stream().filter(x -> ObjectUtil.equals(x.getTermNo(), termNo)
-                                                        && ObjectUtil.equals(x.getTenantId(), tenantId)).findFirst().orElse(null);
-
+        XfTermVo termVo = getTermFromCache(String.valueOf(termNo), ConsumeConstants.TERM_NO);
         if(termVo == null) {
             return R.fail(MessageFormat.format("机号为[{0}]的设备不存在", termNo), null);
         } else {
@@ -195,6 +196,17 @@ public class TermBusiness {
         return R.ok(resultMap);
     }
 
+    public XfTermVo getTermFromCache(String checkParam, Integer checkMode) {
+        switch (checkMode) {
+            case ConsumeConstants.TERM_NO -> {
+                return termService.queryVoOneByNo(Long.valueOf(checkParam));
+            }
+            case ConsumeConstants.TERM_MAC -> {
+                return termService.queryVoOneByMac(checkParam);
+            }
+        }
+        return null;
+    }
     /**
      * 将系统中的设备信息转换成消费机可接收的类型
      * @param termVo 系统消费机信息
@@ -324,6 +336,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

+ 45 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/cache/UserAccountCacheManager.java

@@ -0,0 +1,45 @@
+package org.dromara.server.consume.cache;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.backstage.api.RemoteCardService;
+import org.dromara.backstage.api.RemoteUserAccountService;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
+import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.json.utils.JsonUtils;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+/**
+ * 用户败户缓存处理
+ * <p>
+ * 对消费业务用到的卡用户账户据缓存处理
+ *
+ * @author luoyibo
+ * @version 2.2.0
+ * @date 2025-06-25
+ * @since JDK17
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class UserAccountCacheManager {
+    @DubboReference
+    private final RemoteUserAccountService remoteUserAccountService;
+
+    @Cacheable(cacheNames = CacheNames.PT_USER_ACCOUNT_ID, key = "#userId", unless = "#result == null")
+    public RemoteUserAccountVo getByUserId(Long userId) {
+        return remoteUserAccountService.getUserAccountVoById(userId);
+    }
+    @Cacheable(cacheNames = CacheNames.PT_USER_ACCOUNT_NO, key = "#userNo", unless = "#result == null")
+    public RemoteUserAccountVo getByUserNo(Long userNo) {
+        return  remoteUserAccountService.getUserAccountVoByUserNo(userNo);
+    }
+
+    @Cacheable(cacheNames = CacheNames.PT_USER_ACCOUNT_NUMB, key = "#userNumb", unless = "#result == null")
+    public RemoteUserAccountVo getByUserNumb(String userNumb) {
+        return remoteUserAccountService.getUserAccountVoByUserNumb(userNumb);
+    }
+}

+ 8 - 7
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/CardConsumeValidation.java

@@ -24,7 +24,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Supplier;
 
 /**
  * 卡片消费校验
@@ -264,19 +263,19 @@ public class CardConsumeValidation {
     //region 卡片限次处理
     private R<ErrorInfo> dealCardLimited(CardConsumeValidationContext ctx) {
         if (!validationParam.getXC_CONSUME()) {
-            log.debug("全局限次功能未启用,跳过限次验证");
+            log.warn("全局限次功能未启用,跳过限次验证");
             return R.ok();
         }
 
         List<String> termIds = validationParam.getLimitedTermIdList();
         String currentTermId = String.valueOf(ctx.getTermId());
         if (CollectionUtil.isEmpty(termIds) || !termIds.contains(currentTermId)) {
-            log.debug("终端[{}]未配置限次功能,跳过限次验证", ctx.getTermNo());
+            log.warn("终端[{}]未配置限次功能,跳过限次验证", ctx.getTermNo());
             return R.ok();
         }
         List<RemoteLimitedVo> limitedCards = validationParam.getLimitedCardList();
         if (CollectionUtil.isEmpty(limitedCards)) {
-            log.debug("未配置卡类限次功能,跳过限次验证");
+            log.warn("未配置限次卡类,跳过限次验证");
             return R.ok();
         }
         Long cardType = ctx.getCardType();
@@ -284,6 +283,7 @@ public class CardConsumeValidation {
             .filter(p -> cardType.equals(p.getCardType())
                 && validationParam.getIsUse().equals(p.getStatus())).findFirst().orElse(null);
         if (limitedVo == null) {
+            log.warn("卡类[{}]未配置限次功能,跳过限次验证", cardType);
             return R.ok();
         }
 
@@ -354,19 +354,19 @@ public class CardConsumeValidation {
     //region 卡片限额处理
     private R<ErrorInfo> dealCardQuota(CardConsumeValidationContext ctx) {
         if (!validationParam.getXE_CONSUME()) {
-            log.debug("全局限额功能未启用,跳过限额验证");
+            log.warn("全局限额功能未启用,跳过限额验证");
             return R.ok();
         }
 
         List<String> termIds = validationParam.getQuotaTermIdList();
         String currentTermId = String.valueOf(ctx.getTermId());
         if (CollectionUtil.isEmpty(termIds) || !termIds.contains(currentTermId)) {
-            log.debug("终端[{}]未配置限额功能,跳过限额验证", ctx.getTermNo());
+            log.warn("终端[{}]未配置限额功能,跳过限额验证", ctx.getTermNo());
             return R.ok();
         }
         List<RemoteQuotaVo> quotaCards = validationParam.getQuotaCardList();
         if (CollectionUtil.isEmpty(quotaCards)) {
-            log.debug("未配置卡类限额功能,跳过限额验证");
+            log.warn("未配置卡类限额功能,跳过限额验证");
             return R.ok();
         }
         Long cardType = ctx.getCardType();
@@ -374,6 +374,7 @@ public class CardConsumeValidation {
             .filter(p -> cardType.equals(p.getCardType())
                 && validationParam.getIsUse().equals(p.getStatus())).findFirst().orElse(null);
         if (quotaVo == null) {
+            log.warn("卡类[{}]未配置限额功能,跳过限额验证", cardType);
             return R.ok();
         }
 

+ 9 - 70
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/check/CommonCheck.java

@@ -23,8 +23,7 @@ import org.dromara.common.redis.utils.RedisUtils;
 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.InitBusiness;
+import org.dromara.server.consume.business.*;
 import org.dromara.server.consume.cache.CardCacheManager;
 import org.dromara.server.consume.domain.vo.XfCardLimitedVo;
 import org.dromara.server.consume.domain.vo.XfTermVo;
@@ -67,9 +66,10 @@ public class CommonCheck {
     private static final long VALIDATION_TIMEOUT = 500;
 
     private final BaseBusiness baseBusiness;
-    private final InitBusiness initBusiness;
-    private final CardCacheManager cardCacheManager;
+    private final EmployeeBusiness employeeBusiness;
+    private final CardBusiness cardBusiness;
     private final ThreadPoolTaskExecutor taskExecutor;
+    private final TermBusiness termBusiness;
 
     //region 账户、卡片与设备验证
 
@@ -268,27 +268,13 @@ public class CommonCheck {
      */
     public R<ErrorInfo> checkTerm(AllowConsumeValidationContext ctx) {
         String msgInfo = ObjectUtil.isEmpty(ctx.getTermMac()) ? ctx.getTermNo().toString() : ctx.getTermMac();
-        // 先从缓存获取数据
-        List<XfTermVo> list = RedisUtils.getCacheList(CacheNames.PT_TERM_LIST);
-        if (CollectionUtil.isEmpty(list)) {
-            // 如果第一次没有从缓存中取到,则使用数据库初始化下
-            initBusiness.initTermInfo();
-            list = RedisUtils.getCacheList(CacheNames.PT_TERM_LIST);
-            if (CollectionUtil.isEmpty(list)) {
-                // 如果执行了初始化还没有数据,则返回错误
-                return createErrorResponse(1, ApiErrorTypeConstants.OBJECT_NOT_EXISTS,
-                    "未获取到设备数据",
-                    "获取消费设备失败");
-            }
-        }
-
         XfTermVo termVo;
         String mac = ctx.getTermMac();
-        Long termNo = ctx.getTermNo();
+        String termNo = String.valueOf(ctx.getTermNo());
         if (ObjectUtil.isNotEmpty(mac)) {
-            termVo = list.stream().filter(x -> ObjectUtil.equals(x.getTermMac(), mac)).findFirst().orElse(null);
+            termVo = termBusiness.getTermFromCache(mac,ConsumeConstants.TERM_MAC);
         } else {
-            termVo = list.stream().filter(x -> ObjectUtil.equals(x.getTermNo(), termNo)).findFirst().orElse(null);
+            termVo = termBusiness.getTermFromCache(termNo,ConsumeConstants.TERM_NO);;
         }
         if (ObjectUtil.isEmpty(termVo)) {
             return createErrorResponse(400, ApiErrorTypeConstants.OBJECT_NOT_EXISTS,
@@ -458,7 +444,7 @@ public class CommonCheck {
      */
     private R<ErrorInfo> checkUser(String checkParam, Integer checkMode, AllowConsumeValidationContext ctx) {
         // 1. 从缓存获取账户信息
-        RemoteUserAccountVo accountVo = getAccountFromCache(checkParam, checkMode);
+        RemoteUserAccountVo accountVo = employeeBusiness.getAccountFromCache(checkParam, checkMode);
         // 账户不存在,不允许交易
         if (accountVo == null) {
             return createErrorResponse(400, ApiErrorTypeConstants.NOT_FOUND,
@@ -506,7 +492,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,
@@ -533,53 +519,6 @@ public class CommonCheck {
         return R.ok();
     }
 
-    /**
-     * 从缓存获取账户信息
-     *
-     * @param checkParam 用户标识
-     * @param checkMode  校验模式
-     * @return 账户信息对象
-     */
-    private RemoteUserAccountVo getAccountFromCache(String checkParam, Integer checkMode) {
-        List<RemoteUserAccountVo> list = RedisUtils.getCacheList(CacheNames.PT_USER_ACCOUNT_LIST);
-        if (CollectionUtil.isEmpty(list)) {
-            // 如果缓存没有,初始化
-            initBusiness.initUserAccount();
-            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;
-    }
-
-    /**
-     * 从缓存获取卡片信息
-     *
-     * @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
-
     /**
      * 创建错误响应对象
      *

+ 3 - 7
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;
@@ -23,6 +22,7 @@ import org.dromara.server.consume.domain.convert.RemoteVoConvert;
 import org.dromara.server.consume.domain.vo.XfCardLimitedVo;
 import org.dromara.server.consume.domain.vo.XfConsumeDetailOriginalVo;
 import org.dromara.server.consume.domain.vo.XfTermVo;
+import org.dromara.server.consume.service.IPtBagService;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 
@@ -33,7 +33,6 @@ import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.*;
 import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Supplier;
 
@@ -54,6 +53,7 @@ public class ConsumeRequestCheck {
     private final CommonCheck commonCheck;
     private final CardConsumeValidation cardConsumevalidation;
     private final BaseBusiness baseBusiness;
+    private final IPtBagService bagService;
 
     public R<ErrorInfo> checkConsume(ConsumptionBo bo, RemoteUserAccountVo userAccountVo,
                                      RemoteCardVo userCardVo, XfTermVo useTermVo,
@@ -146,7 +146,7 @@ public class ConsumeRequestCheck {
     private R<ErrorInfo> checkWalletBalance(ConsumptionBo bo) {
         String userIdStr = bo.getUserId().toString();
         BigDecimal consumeMoney = bo.getConsumeMoney();
-        BigDecimal totalBalance = RedisUtils.getCacheMapValue(CacheNames.USER_TOTAL_BALANCE, userIdStr);
+        BigDecimal totalBalance = bagService.getUserTotalBalance(bo.getUserId());
         if (ObjectUtil.isEmpty(totalBalance)) {
             totalBalance = BigDecimal.ZERO;
         }
@@ -157,10 +157,6 @@ public class ConsumeRequestCheck {
         // 计算扣费后的余额
         BigDecimal balance = totalBalance.subtract(consumeMoney);
         bo.setBalance(balance);
-
-        // 更新余额缓存
-        RedisUtils.setCacheMapValue(CacheNames.USER_TOTAL_BALANCE, userIdStr, balance);
-
         return R.ok();
     }
 

+ 22 - 5
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/CardController.java

@@ -1,8 +1,13 @@
 package org.dromara.server.consume.controller.v1;
 
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.api.ReturnResult;
+import org.dromara.common.core.constant.ApiErrorTypeConstants;
 import org.dromara.common.core.constant.HttpStatus;
+import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.common.core.domain.model.ErrorResult;
+import org.dromara.common.core.enums.ResultCodeEnum;
 import org.dromara.server.consume.business.CardBusiness;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -18,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
  * @Version 1.0
  * @since jdk17
  */
+@Slf4j
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/v1/Cards")
@@ -31,11 +37,22 @@ public class CardController {
      */
     @GetMapping("/{cardNo}/bags")
     public Object getCardBags(@PathVariable("cardNo") Long cardNo) {
-        ReturnResult result = cardBusiness.getCardBagsByCardNo(cardNo);
-        if(result.isSuccess()){
-            return result.getData();
-        } else{
-            return new ResponseEntity<>(result.getData(), null, HttpStatus.NOT_FOUND);
+        try {
+            ReturnResult result = cardBusiness.getCardBagsByCardNo(cardNo);
+            if (result.isSuccess()) {
+                return result.getData();
+            } else {
+                return new ResponseEntity<>(result.getData(), null, HttpStatus.NOT_FOUND);
+            }
+        } catch (Exception e) {
+            log.error("[获取卡钱包数据异常]-[{}]",e.getMessage(),e);
+            ErrorResult result = new ErrorResult();
+            result.setStatusCode(org.springframework.http.HttpStatus.NOT_FOUND.value());
+            result.setMessage("获取卡片信息失败");
+            result.getErrors()
+                .add(new ErrorInfo(1, "获取卡片信息失败", ApiErrorTypeConstants.NOT_FOUND, "流水号为[" + cardNo + "]的卡片不存在!"));
+
+            return new ResponseEntity<>(result, null, HttpStatus.NOT_FOUND);
         }
     }
 }

+ 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);
 }

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

@@ -107,7 +107,12 @@ public interface IPtBagService {
      */
     PtBagVo queryByUserBagCode(Long userId,String bagCode);
 
-    BigDecimal getUserBalance(Long userId);
+    /**
+     * 查询指定人员的现金与补助钱包余额总和并设置至缓存
+     * @param userId 用户Id
+     * @return 两个钱包总余额
+     */
+    BigDecimal getUserTotalBalance(Long userId);
 
     void updateConsumeBalance(List<PtBagVo> bagVos);
 

+ 2 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfTermService.java

@@ -41,4 +41,6 @@ public interface IXfTermService {
      * @return 消费设备视图
      */
     XfTermVo queryVoOneByNo(Long termNo);
+
+    XfTermVo queryVoOneByMac(String mac);
 }

+ 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));
     }
 }

+ 4 - 1
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/PtBagServiceImpl.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.enums.BalanceUpdateEnum;
 import org.dromara.common.core.exception.consume.BagException;
 import org.dromara.common.core.exception.consume.ConsumeException;
@@ -24,6 +25,7 @@ import org.dromara.server.consume.domain.bo.PtBagBo;
 import org.dromara.server.consume.domain.vo.PtBagVo;
 import org.dromara.server.consume.mapper.PtBagMapper;
 import org.dromara.server.consume.service.IPtBagService;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -290,7 +292,8 @@ public class PtBagServiceImpl implements IPtBagService {
     }
 
     @Override
-    public BigDecimal getUserBalance(Long userId) {
+    @Cacheable(cacheNames = CacheNames.USER_TOTAL_BALANCE, key = "#userId", unless = "#result == null")
+    public BigDecimal getUserTotalBalance(Long userId) {
         LambdaQueryWrapper<PtBag> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(PtBag::getUserId, userId);
         queryWrapper.in(PtBag::getBagCode, Arrays.asList("1", "3"));

+ 14 - 16
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/XfTermServiceImpl.java

@@ -19,6 +19,7 @@ import org.dromara.server.consume.domain.bo.XfTermBo;
 import org.dromara.server.consume.domain.vo.XfTermVo;
 import org.dromara.server.consume.mapper.XfTermMapper;
 import org.dromara.server.consume.service.IXfTermService;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -96,17 +97,14 @@ public class XfTermServiceImpl implements IXfTermService {
             RemotePtAccountVo accountVo = remotePtAccountService.selectVoById(vo.getAccountId());
             if (ObjUtil.isNotEmpty(accountVo)) {
                 vo.setAccountName(accountVo.getAccountName());
+            } else{
+                vo.setAccountName("未知结算账户");
             }
             RemotePtRoomVo roomVo = remotePtRoomService.selectVoById(vo.getRoomId());
             if (ObjUtil.isNotEmpty(roomVo)) {
                 vo.setRoomName(roomVo.getRoomName());
-            }
-            List<XfTermVo> redisList = RedisUtils.getCacheList(CacheNames.PT_TERM_LIST);
-            if (CollectionUtil.isNotEmpty(redisList)) {
-                RedisUtils.addCacheList(CacheNames.PT_TERM_LIST, vo);
             } else {
-                redisList.add(vo);
-                RedisUtils.setCacheList(CacheNames.PT_TERM_LIST, redisList);
+                vo.setRoomName("未知房间");
             }
         }
         return vo;
@@ -119,19 +117,20 @@ public class XfTermServiceImpl implements IXfTermService {
      * @return 消费设备设备
      */
     @Override
+    @Cacheable(cacheNames = CacheNames.PT_TERM_NO, key = "#termNo", unless = "#result == null")
     public XfTermVo queryVoOneByNo(Long termNo) {
-        XfTermVo vo;
-        List<XfTermVo> redisList = RedisUtils.getCacheList(CacheNames.PT_TERM_LIST);
-        if (CollectionUtil.isNotEmpty(redisList)) {
-            vo = redisList.stream().filter(p -> Objects.equals(p.getTermNo(), termNo)).findFirst().orElse(null);
-            if (ObjUtil.isNotNull(vo)) {
-                return vo;
-            }
-        }
         XfTermBo bo = new XfTermBo();
         bo.setTermNo(termNo);
         bo.setTenantId(defaultConfig.getTenantId());
-        return this.queryVoOneByBo(bo);
+        return queryVoOneByBo(bo);
+    }
+
+    @Override
+    @Cacheable(cacheNames = CacheNames.PT_TERM_MAC_MAP, key = "#mac", unless = "#result == null")
+    public XfTermVo queryVoOneByMac(String mac) {
+        XfTermBo bo = new XfTermBo();
+        bo.setTermMac(mac);
+        return queryVoOneByBo(bo);
     }
 
     /**
@@ -146,7 +145,6 @@ public class XfTermServiceImpl implements IXfTermService {
         lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), XfTerm::getTenantId, bo.getTenantId());
         lqw.eq(StringUtils.isNotBlank(bo.getTermIp()), XfTerm::getTermIp, bo.getTermIp());
         lqw.eq(StringUtils.isNotBlank(bo.getTermMac()), XfTerm::getTermMac, bo.getTermMac());
-
         lqw.like(StringUtils.isNotBlank(bo.getTermName()), XfTerm::getTermName, bo.getTermName());
 
         lqw.orderByAsc(XfTerm::getTermNo);

+ 8 - 8
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/task/InitTasks.java

@@ -32,14 +32,14 @@ public class InitTasks implements ApplicationRunner {
     public void run(ApplicationArguments args) throws Exception {
         log.info("初始化消费验证基础数据");
         long startTime = System.currentTimeMillis();
-        // initBusiness.initGlobalData();
-        // initBusiness.initTermInfo();
-        // initBusiness.initMealTypeInfo();
-        // initBusiness.initDiscountAndOther();
-        // initBusiness.initUserCard();
-        // initBusiness.initUserAccount();
-        // initBusiness.initXfCardLimited();
-        // initBusiness.initUserBalance();
+        initBusiness.initGlobalData();
+        initBusiness.initTermInfo();
+        initBusiness.initMealTypeInfo();
+        initBusiness.initDiscountAndOther();
+        initBusiness.initUserCard();
+        initBusiness.initUserAccount();
+        initBusiness.initXfCardLimited();
+        initBusiness.initUserBalance();
         validationParam.refresh();
 
         log.info("初始化消费验证基础数据完成。耗时:{} ms", System.currentTimeMillis() - startTime);