Bladeren bron

feature: 消费对接
1.设备餐、日限制验证

luoyb 1 jaar geleden
bovenliggende
commit
86f23acf45

+ 7 - 3
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteCardService.java

@@ -45,14 +45,18 @@ public interface RemoteCardService {
 
     /**
      * 初始化卡片的餐消费信息
-     * @param cardNo 卡流水号
+     *
+     * @param cardNo   卡流水号
      * @param mealType 餐类
+     * @return
      */
-    void initCardMealData(Long cardNo, String mealType);
+    Boolean initCardMealData(Long cardNo, String mealType);
 
     /**
      * 初始化卡片日消费数据
+     *
      * @param cardNo 卡流水号
+     * @return
      */
-    void initCardDayData(Long cardNo);
+    Boolean initCardDayData(Long cardNo);
 }

+ 4 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/PtCard.java

@@ -4,6 +4,8 @@ import org.dromara.common.tenant.core.TenantEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 
@@ -72,7 +74,7 @@ public class PtCard extends TenantEntity {
     /**
      * 当日消费金额
      */
-    private Long dayTotal;
+    private BigDecimal dayTotal;
 
     /**
      * 当日消费次数
@@ -82,7 +84,7 @@ public class PtCard extends TenantEntity {
     /**
      * 当餐交易金额
      */
-    private Long mealTotal;
+    private BigDecimal mealTotal;
 
     /**
      * 当餐消费次数

+ 6 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/dubbo/RemoteCardServiceImpl.java

@@ -65,20 +65,22 @@ public class RemoteCardServiceImpl implements RemoteCardService {
      *
      * @param cardNo   卡流水号
      * @param mealType 餐类
+     * @return 初始化结果
      */
     @Override
-    public void initCardMealData(Long cardNo, String mealType) {
-        cardService.initCardMealData(cardNo, mealType);
+    public Boolean initCardMealData(Long cardNo, String mealType) {
+        return cardService.initCardMealData(cardNo, mealType);
     }
 
     /**
      * 初始化卡片日消费数据
      *
      * @param cardNo 卡流水号
+     * @return 初始化结果
      */
     @Override
-    public void initCardDayData(Long cardNo) {
-        cardService.initCardDayData(cardNo);
+    public Boolean initCardDayData(Long cardNo) {
+        return cardService.initCardDayData(cardNo);
     }
 }
 

+ 7 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java

@@ -176,14 +176,18 @@ public interface IPtCardService {
 
     /**
      * 初始化卡片的餐消费信息
-     * @param cardNo 卡流水号
+     *
+     * @param cardNo   卡流水号
      * @param mealType 餐类
+     * @return
      */
-    void initCardMealData(Long cardNo, String mealType);
+    Boolean initCardMealData(Long cardNo, String mealType);
 
     /**
      * 初始化卡片日消费数据
+     *
      * @param cardNo 卡流水号
+     * @return
      */
-    void initCardDayData(Long cardNo);
+    Boolean initCardDayData(Long cardNo);
 }

+ 42 - 14
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java

@@ -85,9 +85,9 @@ public class PtCardServiceImpl implements IPtCardService {
     @Override
     public List<PtCardVo> queryList(PtCardBo bo) {
         LambdaQueryWrapper<PtCard> lqw = buildQueryWrapper(bo);
-        List<PtCardVo> list =  baseMapper.selectVoList(lqw);
+        List<PtCardVo> list = baseMapper.selectVoList(lqw);
         if (ObjUtil.isNotNull(list) && !list.isEmpty()) {
-            list.parallelStream().forEach(p-> {
+            list.parallelStream().forEach(p -> {
                 PtCardtypeVo cardTypeVo = cardTypeService.queryByCode(p.getCardType());
                 p.setCardTypeName(cardTypeVo.getTypeName());
             });
@@ -296,6 +296,7 @@ public class PtCardServiceImpl implements IPtCardService {
             return BigDecimal.ZERO;
         }
     }
+
     /**
      * 根据人员Id获取账户主卡
      *
@@ -306,9 +307,9 @@ public class PtCardServiceImpl implements IPtCardService {
     public PtCardVo queryMainCardByUserId(Long userId) {
         PtCardVo vo;
         List<PtCardVo> redisList = RedisUtils.getCacheList(CacheNames.PT_USER_CARD);
-        if (ObjUtil.isNotNull(redisList)&& !redisList.isEmpty()) {
+        if (ObjUtil.isNotNull(redisList) && !redisList.isEmpty()) {
             vo = redisList.stream().filter(p -> Objects.equals(p.getUserId(), userId)
-            &&Objects.equals(p.getMainCard(),"Y")&&Objects.equals(p.getStatus(),"1")).findFirst().orElse(null);
+                && Objects.equals(p.getMainCard(), "Y") && Objects.equals(p.getStatus(), "1")).findFirst().orElse(null);
             if (ObjUtil.isNotNull(vo)) {
                 return vo;
             }
@@ -319,6 +320,7 @@ public class PtCardServiceImpl implements IPtCardService {
         bo.setStatus("1");
         return this.selectOneByBo(bo);
     }
+
     /**
      * 根据卡流水号获取对应的卡片信息
      *
@@ -329,7 +331,7 @@ public class PtCardServiceImpl implements IPtCardService {
     public PtCardVo queryCardByCardNo(Long cardNo) {
         PtCardVo vo;
         List<PtCardVo> redisList = RedisUtils.getCacheList(CacheNames.PT_USER_CARD);
-        if (ObjUtil.isNotNull(redisList)&& !redisList.isEmpty()) {
+        if (ObjUtil.isNotNull(redisList) && !redisList.isEmpty()) {
             vo = redisList.stream().filter(p -> Objects.equals(p.getCardNo(), cardNo)).findFirst().orElse(null);
             if (ObjUtil.isNotNull(vo)) {
                 return vo;
@@ -339,17 +341,18 @@ public class PtCardServiceImpl implements IPtCardService {
         bo.setCardNo(cardNo);
         return this.selectOneByBo(bo);
     }
+
     /**
      * 根据物理卡号号获取对应的卡片信息
      *
-     * @param factoryId   物理卡号
+     * @param factoryId 物理卡号
      * @return 卡片信息
      */
     @Override
     public PtCardVo queryCardByFactoryId(Long factoryId) {
         PtCardVo vo;
         List<PtCardVo> redisList = RedisUtils.getCacheList(CacheNames.PT_USER_CARD);
-        if (ObjUtil.isNotNull(redisList)&& !redisList.isEmpty()) {
+        if (ObjUtil.isNotNull(redisList) && !redisList.isEmpty()) {
             vo = redisList.stream().filter(p -> Objects.equals(p.getFactoryId(), factoryId)).findFirst().orElse(null);
             if (ObjUtil.isNotNull(vo)) {
                 return vo;
@@ -378,6 +381,7 @@ public class PtCardServiceImpl implements IPtCardService {
         }
         return null;
     }
+
     /**
      * 获取已有的最大卡流水号
      *
@@ -412,7 +416,7 @@ public class PtCardServiceImpl implements IPtCardService {
     @Override
     public PtCardVo lockCardByBo(PtCardBo bo) {
         LambdaUpdateWrapper<PtCard> lpw = new LambdaUpdateWrapper<>();
-        lpw.set(PtCard::getStatus,CardStatusEnum.LOCK.code());
+        lpw.set(PtCard::getStatus, CardStatusEnum.LOCK.code());
         lpw.set(PtCard::getChangeTime, DateUtil.date());
         lpw.set(PtCard::getUpdateBy, bo.getOperatorId());
         lpw.set(PtCard::getUpdateTime, DateUtil.date());
@@ -421,16 +425,18 @@ public class PtCardServiceImpl implements IPtCardService {
         lpw.eq(bo.getCardId() != null, PtCard::getCardId, bo.getCardId());
         lpw.eq(bo.getFactoryId() != null, PtCard::getFactoryId, bo.getFactoryId());
         lpw.eq(bo.getCardNo() != null, PtCard::getCardNo, bo.getCardNo());
-        if(baseMapper.update(null,lpw)>0){
+        if (baseMapper.update(null, lpw) > 0) {
             List<PtCardVo> list = this.queryList(bo);
-            if(CollectionUtil.isNotEmpty(list)){
+            if (CollectionUtil.isNotEmpty(list)) {
                 return list.get(0);
             }
         }
         return null;
     }
+
     /**
      * 回收卡片
+     *
      * @param bo 卡片业务对象
      * @return 回收结果
      */
@@ -446,23 +452,45 @@ public class PtCardServiceImpl implements IPtCardService {
         lpw.eq(bo.getFactoryId() != null, PtCard::getFactoryId, bo.getFactoryId());
         lpw.eq(bo.getCardNo() != null, PtCard::getCardNo, bo.getCardNo());
 
-        return baseMapper.update(null,lpw)>0;
+        return baseMapper.update(null, lpw) > 0;
     }
+
     /**
      * 初始化卡片的餐消费信息
-     * @param cardNo 卡流水号
+     *
+     * @param cardNo   卡流水号
      * @param mealType 餐类
+     * @return 更新结果
      */
     @Override
-    public void initCardMealData(Long cardNo, String mealType) {
+    public Boolean initCardMealData(Long cardNo, String mealType) {
+        LambdaUpdateWrapper<PtCard> lpw = new LambdaUpdateWrapper<>();
+        lpw.set(PtCard::getLastMeal, mealType);
+        lpw.set(PtCard::getMealCount, 0);
+        lpw.set(PtCard::getMealTotal, 0);
 
+        lpw.eq(PtCard::getCardNo, cardNo);
+        lpw.eq(PtCard::getStatus, "1");
+
+        return baseMapper.update(null, lpw) > 0;
     }
+
     /**
      * 初始化卡片日消费数据
+     *
      * @param cardNo 卡流水号
+     * @return 更新结果
      */
     @Override
-    public void initCardDayData(Long cardNo) {
+    public Boolean initCardDayData(Long cardNo) {
+        LambdaUpdateWrapper<PtCard> lpw = new LambdaUpdateWrapper<>();
+        lpw.set(PtCard::getDayCount, 0);
+        lpw.set(PtCard::getDayTotal, 0);
+        lpw.set(PtCard::getLastPay, DateUtil.date());
+
+        lpw.eq(PtCard::getCardNo, cardNo);
+        lpw.eq(PtCard::getStatus, "1");
 
+        return baseMapper.update(null, lpw) > 0;
     }
 }

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/domain/vo/card/PtCardVo.java

@@ -91,7 +91,7 @@ public class PtCardVo implements Serializable {
      * 当日消费金额
      */
     @ExcelProperty(value = "当日消费金额")
-    private Long dayTotal;
+    private BigDecimal dayTotal;
 
     /**
      * 当日消费次数
@@ -103,7 +103,7 @@ public class PtCardVo implements Serializable {
      * 当餐交易金额
      */
     @ExcelProperty(value = "当餐交易金额")
-    private Long mealTotal;
+    private BigDecimal mealTotal;
 
     /**
      * 当餐消费次数

+ 2 - 2
ruoyi-server/ruoyi-server-common/src/main/java/org/dromara/server/common/constant/DefaultConstants.java

@@ -63,11 +63,11 @@ public interface DefaultConstants {
     /**
      * 研究生年份父部门Id(研究生部)
      */
-    Long GRADUATE_PARENT_DEPT_ID = 1850788795766460417L;
+    Long GRADUATE_PARENT_DEPT_ID = 118L;
     /**
      * 培训班年份父部门Id(培训班)
      */
-    Long TRAIN_PARENT_DEPT_ID = 1850788897130205186L;
+    Long TRAIN_PARENT_DEPT_ID = 103L;
     /**
      * 部门类型代码
      */

+ 18 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java

@@ -456,7 +456,7 @@ public class CheckBusiness {
         // 设备允许卡类
         int termCardTypeId = termVo.getCardType() == null ? 0 : termVo.getCardType();
         // 设备每天最大消费次数
-        Integer termDayCount = termVo.getDayCount() == null ? 0 : termVo.getDayCount();
+        int termDayCount = termVo.getDayCount() == null ? 0 : termVo.getDayCount();
         // 每天最大消费金额
         BigDecimal termDayMoney = termVo.getDayMoney() == null ? BigDecimal.ZERO : termVo.getDayMoney();
         // 每餐最大消费次数
@@ -469,7 +469,7 @@ public class CheckBusiness {
         boolean termUseValidity = Objects.equals(termVo.getTermValidity(), "0") ? Boolean.FALSE : Boolean.TRUE;
 
         LocalDateTime currentLocalDt = LocalDateTime.now();
-        LocalDateTime expiryLocalDt = LocalDateTime.now();
+        LocalDateTime expiryLocalDt;
 
         // 最后消费时间
         LocalDateTime lastPayLocalDt = LocalDateTime.ofInstant(userCardVo.getLastPay().toInstant(), ZoneOffset.of("+8"));
@@ -495,6 +495,7 @@ public class CheckBusiness {
         if (temp != offsetTypeId) {
             return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "设备卡类限制", TradeStatusEnum.CardTypeLimit.getName()));
         }
+        //餐限次验证
         String lastMeal = userCardVo.getLastMeal().toString();
         int mealCount = userCardVo.getMealCount().intValue();
         BigDecimal mealValue = userCardVo.getMealTotal();
@@ -509,7 +510,22 @@ public class CheckBusiness {
                 return R.fail(new ErrorInfo(400, TradeStatusEnum.MealLimitTimes.toString(), "餐限次", TradeStatusEnum.MealLimitTimes.getName()));
             }
         }
+        // 日限次 日限额效验(每日第一次消费)
+        int dayCount = userCardVo.getDayCount().intValue();
+        BigDecimal dayValue = userCardVo.getDayTotal();
 
+        if (!currentLocalDt.toLocalDate().isEqual(lastPayLocalDt.toLocalDate())) {
+            remoteCardService.initCardDayData(userCardVo.getCardNo());
+            dayCount = 0;
+            dayValue = BigDecimal.ZERO;
+        } else {
+            if (termDayCount > 0 && dayCount >= termDayCount) {// 20190417:改为>=号,因为大于号会导致消费可以多刷一次
+                return R.fail(new ErrorInfo(400, TradeStatusEnum.DayLimitTimes.toString(), "日限次", TradeStatusEnum.DayLimitTimes.getName()));
+            }
+            if (termDayMoney.compareTo(BigDecimal.ZERO) > 0 && termDayMoney.compareTo(dayValue.add(consumeValue)) < 0) {
+                return R.fail(new ErrorInfo(400, TradeStatusEnum.DayLimitMoney.toString(), "日限额", TradeStatusEnum.DayLimitMoney.getName()));
+            }
+        }
         return R.ok();
     }