Преглед на файлове

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

luoyb преди 1 година
родител
ревизия
67e9431bea

+ 70 - 9
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java

@@ -23,15 +23,10 @@ import org.dromara.common.core.enums.UserAccountStatusEnum;
 import org.dromara.common.core.utils.RecordIdUtils;
 import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
 import org.dromara.server.consume.cache.TokenManager;
-import org.dromara.server.consume.domain.vo.PtBagVo;
-import org.dromara.server.consume.domain.vo.XfConsumeDetailOriginalVo;
-import org.dromara.server.consume.domain.vo.XfConsumeDetailVo;
-import org.dromara.server.consume.domain.vo.XfTermVo;
+import org.dromara.server.consume.domain.bo.XfCardLimitedBo;
+import org.dromara.server.consume.domain.vo.*;
 import org.dromara.server.consume.domain.vo.yc.TermToken;
-import org.dromara.server.consume.service.IConsumeDetailOriginalService;
-import org.dromara.server.consume.service.IPtBagService;
-import org.dromara.server.consume.service.IXfConsumeDetailService;
-import org.dromara.server.consume.service.IXfTermService;
+import org.dromara.server.consume.service.*;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 
@@ -40,6 +35,7 @@ import java.text.MessageFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
@@ -71,6 +67,7 @@ public class CheckBusiness {
     private final IXfConsumeDetailService consumeDetailService;
     private final IPtBagService bagService;
     private final TokenManager tokenManager;
+    private final IXfCardLimitedService cardLimitedService;
 
     /**
      * 消费记录参数检检查
@@ -531,10 +528,74 @@ public class CheckBusiness {
         return R.ok();
     }
 
-    public R<ErrorInfo> checkCardLimitDeal(ConsumptionBo bo, XfTermVo termVo, RemoteCardVo userCardVo, RemoteMealTypeVo mealTypeVo){
+    public R<ErrorInfo> checkCardLimitDeal(ConsumptionBo bo, XfTermVo termVo, RemoteCardVo userCardVo, RemoteMealTypeVo mealTypeVo) {
+        LocalDateTime currentLocalDt = LocalDateTime.now();
+        Long cardNo = userCardVo.getCardNo();
+        Long mealTypeId = Long.valueOf(mealTypeVo.getTypeId());
+        XfCardLimitedVo cardLimitedVo = cardLimitedService.queryByCardNo(cardNo);
+        if (ObjectUtil.isEmpty(cardLimitedVo)) {
+            cardLimitedVo = initXfCardLimited(cardNo, mealTypeVo.getMealId(), userCardVo);
+        }
+        // 每天限制消费次数
+        Long dayLimitCount = cardLimitedVo.getDayCount();
+        // 每餐限制消费次数
+        Long mealLimitCount = cardLimitedVo.getMealCount();
+        // 每天限制消费金额
+        BigDecimal dayLimitValue = cardLimitedVo.getDayMoney();
+        // 每餐限制消费金额
+        BigDecimal mealLimitValue = cardLimitedVo.getDayMoney();
+        // 每天折扣限制消费次数
+        Long zkDayCount = cardLimitedVo.getDayDiscountCount();
+        // 每餐折扣限制消费次数
+        Long zkMealCount = cardLimitedVo.getMealDiscountCount();
+        // 最后交易时间
+        LocalDateTime lastPayLimitLocalDt = LocalDateTime.ofInstant(cardLimitedVo.getLastPay().toInstant(),
+            ZoneOffset.of("+8"));
+        // 最后交易餐类
+        Long lastPayLimitMealType = cardLimitedVo.getLastMeal();
+        // 判断交易是否为新的一天(重置各项数据)
+        if (!lastPayLimitLocalDt.toLocalDate().isEqual(currentLocalDt.toLocalDate())) {
+            cardLimitedVo = cardLimitedService.resetDayCardLimitedData(cardNo, mealTypeId.toString());
+            if (ObjectUtil.isNotEmpty(cardLimitedVo)) {
+                lastPayLimitMealType = mealTypeId;
+                dayLimitCount = 0L;
+                mealLimitCount = 0L;
+                dayLimitValue = BigDecimal.ZERO;
+                mealLimitValue = BigDecimal.ZERO;
+                zkDayCount = 0L;
+                zkMealCount = 0L;
+            }
+        }
+        // 判断是否为新的餐类
+        if (!Objects.equals(lastPayLimitMealType, mealTypeId)) {
+            cardLimitedVo = cardLimitedService.resetMealCardLimitedData(cardNo, mealTypeId.toString());
+            if (ObjectUtil.isNotEmpty(cardLimitedVo)) {
+                mealLimitCount = zkMealCount = 0L;
+                mealLimitValue = BigDecimal.ZERO;
+                zkMealCount = 0L;
+            }
+        }
+
         return R.ok();
     }
 
+    private XfCardLimitedVo initXfCardLimited(Long cardNo, Long mealType, RemoteCardVo userCardVo) {
+        LocalDateTime lastPayLocalDt = LocalDateTime.ofInstant(userCardVo.getLastPay().toInstant(), ZoneOffset.of("+8"));
+        ;
+        XfCardLimitedBo bo = new XfCardLimitedBo();
+        bo.setCardNo(cardNo);
+        bo.setDayCount(0L);
+        bo.setDayMoney(BigDecimal.ZERO);
+        bo.setMealCount(0L);
+        bo.setMealMoney(BigDecimal.ZERO);
+        bo.setDayDiscountCount(0L);
+        bo.setMealDiscountCount(0L);
+        bo.setLastPay(Date.from(lastPayLocalDt.toInstant(ZoneOffset.of("+8"))));
+        bo.setLastMeal(mealType);
+
+        return cardLimitedService.insertReturnByBo(bo);
+    }
+
     private RemoteOperatorVo getOperatorVo(ConsumptionBo bo) {
         RemoteOperatorVo operatorVo = remoteOperatorService.getVoById(bo.getOperatorId());
         if (ObjectUtil.isEmpty(operatorVo)) {

+ 4 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/XfCardLimitedBo.java

@@ -5,7 +5,9 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.server.consume.domain.XfCardLimited;
+import org.dromara.server.consume.domain.vo.yc.BagInfo;
 
+import java.math.BigDecimal;
 import java.util.Date;
 /**
  * @ClassName XfCardLimitedBo
@@ -37,7 +39,7 @@ public class XfCardLimitedBo extends BaseEntity {
     /**
      * 每天限制消费金额
      */
-    private Long dayMoney;
+    private BigDecimal dayMoney;
 
     /**
      * 每餐限制消费次数
@@ -47,7 +49,7 @@ public class XfCardLimitedBo extends BaseEntity {
     /**
      * 每餐限制消费金额
      */
-    private Long mealMoney;
+    private BigDecimal mealMoney;
 
     /**
      * 每天折扣限制消费次数

+ 3 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/XfCardLimitedVo.java

@@ -8,6 +8,7 @@ import org.dromara.server.consume.domain.XfCardLimited;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -47,7 +48,7 @@ public class XfCardLimitedVo implements Serializable {
      * 每天限制消费金额
      */
     @ExcelProperty(value = "每天限制消费金额")
-    private Long dayMoney;
+    private BigDecimal dayMoney;
 
     /**
      * 每餐限制消费次数
@@ -59,7 +60,7 @@ public class XfCardLimitedVo implements Serializable {
      * 每餐限制消费金额
      */
     @ExcelProperty(value = "每餐限制消费金额")
-    private Long mealMoney;
+    private BigDecimal mealMoney;
 
     /**
      * 每天折扣限制消费次数

+ 30 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfCardLimitedService.java

@@ -66,4 +66,34 @@ public interface IXfCardLimitedService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 根据卡流水号查询卡片的限制数据
+     * @param cardNo 卡流水号
+     * @return 卡片限制信息
+     */
+    XfCardLimitedVo queryByCardNo(Long cardNo);
+
+    /**
+     * 新增卡片限制并返回新增数据
+     * @param bo 卡片限制
+     * @return 新增信息
+     */
+    XfCardLimitedVo insertReturnByBo(XfCardLimitedBo bo);
+
+    /**
+     * 重置当天的卡消费数据
+     * @param cardNo 卡流水号
+     * @param mealType 餐类
+     * @return 卡消费数据
+     */
+    XfCardLimitedVo resetDayCardLimitedData(Long cardNo, String mealType);
+
+    /**
+     * 重置当餐的卡消费数据
+     * @param cardNo 卡流水号
+     * @param mealTypeId 餐类
+     * @return 消费数据
+     */
+    XfCardLimitedVo resetMealCardLimitedData(Long cardNo, String mealTypeId);
 }

+ 75 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/XfCardLimitedServiceImpl.java

@@ -1,10 +1,14 @@
 package org.dromara.server.consume.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
+import org.apache.ibatis.annotations.Update;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -157,4 +161,75 @@ public class XfCardLimitedServiceImpl implements IXfCardLimitedService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+    /**
+     * 根据卡流水号查询卡片的限制数据
+     * @param cardNo 卡流水号
+     * @return 卡片限制信息
+     */
+    @Override
+    public XfCardLimitedVo queryByCardNo(Long cardNo) {
+        XfCardLimitedBo bo = new XfCardLimitedBo();
+        bo.setCardNo(cardNo);
+        List<XfCardLimitedVo> list = this.queryList(bo);
+        if(CollectionUtil.isNotEmpty(list)){
+            return list.get(0);
+        }
+        return null;
+    }
+    /**
+     * 新增卡片限制并返回新增数据
+     * @param bo 卡片限制
+     * @return 新增信息
+     */
+    @Override
+    public XfCardLimitedVo insertReturnByBo(XfCardLimitedBo bo) {
+        if(this.insertByBo(bo)){
+            return this.queryById(bo.getLimitedId());
+        }
+        return null;
+    }
+    /**
+     * 重置当天的卡消费数据
+     * @param cardNo 卡流水号
+     * @param mealType 餐类
+     * @return 卡消费数据
+     */
+    @Override
+    public XfCardLimitedVo resetDayCardLimitedData(Long cardNo, String mealType) {
+        LambdaUpdateWrapper<XfCardLimited> luw = new LambdaUpdateWrapper<>();
+        luw.set(XfCardLimited::getDayCount, 0);
+        luw.set(XfCardLimited::getDayMoney, 0);
+        luw.set(XfCardLimited::getMealCount, 0);
+        luw.set(XfCardLimited::getDayDiscountCount, 0);
+        luw.set(XfCardLimited::getMealDiscountCount, 0);
+        luw.set(XfCardLimited::getLastPay, DateUtil.date());
+        luw.set(XfCardLimited::getLastMeal, Long.parseLong(mealType));
+
+        luw.eq(XfCardLimited::getCardNo, cardNo);
+        if(baseMapper.update(null,luw)>0){
+            return this.queryByCardNo(cardNo);
+        }
+        return null;
+    }
+    /**
+     * 重置当餐的卡消费数据
+     * @param cardNo 卡流水号
+     * @param mealTypeId 餐类
+     * @return 消费数据
+     */
+    @Override
+    public XfCardLimitedVo resetMealCardLimitedData(Long cardNo, String mealTypeId) {
+        LambdaUpdateWrapper<XfCardLimited> luw = new LambdaUpdateWrapper<>();
+        luw.set(XfCardLimited::getMealCount, 0);
+        luw.set(XfCardLimited::getMealMoney, 0);
+        luw.set(XfCardLimited::getMealDiscountCount, 0);
+        luw.set(XfCardLimited::getLastMeal, Long.parseLong(mealTypeId));
+        luw.set(XfCardLimited::getLastPay, DateUtil.date());
+
+        luw.eq(XfCardLimited::getCardNo, cardNo);
+        if(baseMapper.update(null,luw)>0){
+            return this.queryByCardNo(cardNo);
+        }
+        return null;
+    }
 }