浏览代码

feature: 卡务中心->卡务操作
1.PtParameterServiceImpl增加了根据参数代码查询参数值并写入缓存的功能
2.增加了其它的相关代码

luoyb 1 年之前
父节点
当前提交
312a7d4ce9
共有 32 个文件被更改,包括 824 次插入169 次删除
  1. 34 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/BalanceUpdateConstants.java
  2. 5 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  3. 1 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java
  4. 26 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CreditTypeConstants.java
  5. 1 1
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BalanceUpdateEnum.java
  6. 94 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CreditStatusEnum.java
  7. 183 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CreditTypeEnum.java
  8. 20 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/consume/BagException.java
  9. 1 1
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java
  10. 10 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtParameterService.java
  11. 19 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtParameterServiceImpl.java
  12. 0 33
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/bag/strategy/IUpdateStrategy.java
  13. 0 53
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/bag/strategy/impl/UpdateStrategyImpl.java
  14. 33 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/IPaymentsStrategy.java
  15. 45 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/PaymentsBusiness.java
  16. 43 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/CommissionPaymentsStrategyImpl.java
  17. 34 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/PaymentsStrategyContent.java
  18. 69 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/RechargePaymentsStrategyImpl.java
  19. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfCreditaccountController.java
  20. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfCreditaccountbackController.java
  21. 1 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfCreditAccountBackService.java
  22. 1 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfCreditAccountService.java
  23. 2 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumedetailServiceImpl.java
  24. 2 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumedetailoriginalServiceImpl.java
  25. 4 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfCreditAccountBackServiceImpl.java
  26. 4 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfCreditAccountServiceImpl.java
  27. 2 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfTermtotalServiceImpl.java
  28. 2 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfUsertotalServiceImpl.java
  29. 6 6
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java
  30. 29 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PtBagBo.java
  31. 7 7
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPtBagService.java
  32. 142 50
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtBagServiceImpl.java

+ 34 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/BalanceUpdateConstants.java

@@ -0,0 +1,34 @@
+package org.dromara.common.core.constant;
+
+/**
+ * name: BalanceUpdateConstants
+ * package: org.dromara.common.core.constant
+ * description: 余额更新操作常量
+ * date: 2024-08-19 21:22:25 21:22
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface BalanceUpdateConstants {
+    /**
+     * 充值
+     */
+    String RECHARGE = "recharge";
+    /**
+     * 退款
+     */
+    String REFUND= "refund";
+    /**
+     * 消费
+     */
+    String CONSUME = "consume";
+    /**
+     * 重置
+     */
+    String RECOVER = "recover";
+    /**
+     * 错扣补款
+     */
+    String COMPENSATE = "compensate";
+}

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

@@ -84,4 +84,9 @@ public interface CacheNames {
      */
     String USER_SECRET_KEY = "user_secret_key#30d";
 
+    /**
+     * 系统参数
+     */
+    String PT_PARAMETER = "pt_parameter";
+
 }

+ 1 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java

@@ -77,5 +77,6 @@ public interface Constants {
      */
     Long TOP_PARENT_ID = 0L;
 
+    String TAKE_COMMISSION = "1";
 }
 

+ 26 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CreditTypeConstants.java

@@ -0,0 +1,26 @@
+package org.dromara.common.core.constant;
+
+/**
+ * name: CreditTypeConstants
+ * package: org.dromara.common.core.constant
+ * description: 收支类型常量
+ * date: 2024-08-20 19:29:06 19:29
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface CreditTypeConstants {
+    /**
+     * 充值
+     */
+    String RECHARGE="recharge";
+    /**
+     * 退款
+     */
+    String REFUND="refund";
+    /**
+     * 管理费
+     */
+    String COMMISSION="takeCommission";
+}

+ 1 - 1
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BalanceUpdateEnum.java

@@ -33,7 +33,7 @@ public enum BalanceUpdateEnum {
     /**
      * 错扣补款
      */
-    COMPENSATE(3,"补款");
+    COMPENSATE(4,"补款");
 
     private final Integer code;
     private final String message;

+ 94 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CreditStatusEnum.java

@@ -0,0 +1,94 @@
+package org.dromara.common.core.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * name: PayStyleEnum
+ * package: com.zd.api.standard.core.enums
+ * description: 收支订单状态枚举值
+ * date: 2021-08-06 18:28
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public enum CreditStatusEnum {
+    /**
+     * 创建
+     */
+    CREATE(0, "创建"),
+    /**
+     * 废弃
+     */
+    DISCARD(10, "废弃"),
+    /**
+     * 入账失败
+     */
+    FAILURE(11, "入账失败"),
+    /**
+     * 入账成功
+     */
+    SUCCESS(20, "入账成功");
+
+    private final Integer code;
+    private final String message;
+
+    CreditStatusEnum(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return this.code;
+    }
+
+    public String message() {
+        return this.message;
+    }
+
+    public static String getMessage(String name) {
+        for (CreditStatusEnum item : CreditStatusEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.message;
+            }
+        }
+        return name;
+    }
+
+    public static String getMessage(int code) {
+        for (CreditStatusEnum item : CreditStatusEnum.values()) {
+            if (item.code().equals(code)) {
+                return item.message;
+            }
+        }
+        return "未知";
+    }
+
+    public static Integer getCode(String name) {
+        for (CreditStatusEnum item : CreditStatusEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.code;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return this.name();
+    }
+
+    /***
+     * 校验重复的code值
+     */
+     public static void main(String[] args) {
+        CreditStatusEnum[] thisEnums = CreditStatusEnum.values();
+        List<Integer> codeList = new ArrayList<>();
+        for (CreditStatusEnum thisEnum : thisEnums) {
+            if (!codeList.contains(thisEnum.code)) {
+                codeList.add(thisEnum.code());
+            }
+        }
+    }
+}

+ 183 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CreditTypeEnum.java

@@ -0,0 +1,183 @@
+package org.dromara.common.core.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * name: CreditTypeEnum
+ * package: com.zd.core.enums
+ * description: 收支类型枚举
+ * date: 2019-08-21 21:59
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 17
+ */
+public enum CreditTypeEnum {
+    /**
+     * 收卡押金
+     */
+    CHARGE_DEPOSIT(110, "收卡押金"),
+    /**
+     * 退卡押金
+     */
+    RETURN_DEPOSIT(111, "退卡押金"),
+    /**
+     * 收卡折旧费
+     */
+    CHARGE_DEPRECIATION(112, "收卡折旧费"),
+    /**
+     * 充值
+     */
+    RECHARGE(113, "充值"),
+    /**
+     * 退款
+     */
+    REFUND(114, "退款"),
+    /**
+     * 充值机充值
+     */
+    RECHARGE_MACHINE_RECHARGE(115, "充值机充值"),
+    /**
+     * 转帐机充值
+     */
+    TRANSFER_MACHINE_RECHARGE(116, "转帐机充值"),
+    /**
+     * 转帐机退款
+     */
+    TRANSFER_MACHINE_REFUND(117, "转帐机退款"),
+    /**
+     * 补助机充值
+     */
+    SUBSIDY_MACHINE_RECHARGE(118, "补助机充值"),
+    /**
+     * 预存款
+     */
+    BEFORE_SAVE(120, "预存款"),
+    /**
+     * 自助圈存
+     */
+    SELF_TRANSFER(20200, "自助圈存"),
+    /**
+     * 预充值
+     */
+    BEFORE_RECHARGE(21150, "预充值"),
+    /**
+     * 空中圈存
+     */
+    AIR_TRANSFER(21200, "空中圈存"),
+    /**
+     * 管理费
+     */
+    COMMISSION_CHARGE(21280, "管理费"),
+    /**
+     * 工本费
+     */
+    COST(21281, "收工本费"),
+
+    /**
+     * 自助圈存
+     */
+    TRANSFER_PAY(22200, "圈存缴费"),
+    /**
+     * 订餐扣费
+     */
+    BOOKING_DEDUCTIONS(22420, "订餐扣费"),
+    /**
+     * 订餐退款
+     */
+    BOOKING_REFUND(22421, "订餐退款"),
+    /**
+     * 订餐账户充值
+     */
+    ORDER_ACCOUNT_RECHARGE(22422, "订餐账户充值"),
+    /**
+     * 订餐账户退款
+     */
+    ORDER_ACCOUNT_REFUND(22423, "订餐账户退款"),
+    /**
+     * 水电扣款
+     */
+    UTILITIES_DEDUCTIONS(22430, "水电扣款"),
+    /**
+     * 配餐券转账
+     */
+    MEAL_TICKET_TRANSFER(22500, "配餐券转账"),
+    /**
+     * 水控转账
+     */
+    WATER_TRANSFER(22600, "水控转账"),
+    /**
+     * 电费缴纳
+     */
+    ELECTRIC_PAY(22700, "电费缴纳"),
+    /**
+     * 支付宝充值
+     */
+    ALIPAY_RECHARGE(24500, "支付宝充值"),
+    /**
+     * 微信充值
+     */
+    WECHAT_RECHARGE(24600, "微信充值");
+
+    private final Integer code;
+    private final String message;
+
+    CreditTypeEnum(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return this.code;
+    }
+
+    public String message() {
+        return this.message;
+    }
+
+    public static String getMessage(String name) {
+        for (CreditTypeEnum item : CreditTypeEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.message;
+            }
+        }
+        return name;
+    }
+
+    public static String getMessage(int code) {
+        for (CreditTypeEnum item : CreditTypeEnum.values()) {
+            if (item.code().equals(code)) {
+                return item.message;
+            }
+        }
+        return "未知";
+    }
+
+    public static Integer getCode(String name) {
+        for (CreditTypeEnum item : CreditTypeEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.code;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return this.name();
+    }
+
+    /***
+     * 校验重复的code值
+     */
+    public static void main(String[] args) {
+        CreditTypeEnum[] thisEnums = CreditTypeEnum.values();
+        List<Integer> codeList = new ArrayList<>();
+        for (CreditTypeEnum thisEnum : thisEnums) {
+            if (!codeList.contains(thisEnum.code)) {
+                codeList.add(thisEnum.code());
+            }
+        }
+    }
+}

+ 20 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/consume/BagException.java

@@ -0,0 +1,20 @@
+package org.dromara.common.core.exception.consume;
+
+import org.dromara.common.core.exception.base.BaseException;
+
+import java.io.Serial;
+
+/**
+ * 用户信息异常类
+ *
+ * @author ruoyi
+ */
+public class BagException extends BaseException {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    public BagException(String code, Object... args) {
+        super("bag", code, args, null);
+    }
+}

+ 1 - 1
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java

@@ -15,6 +15,6 @@ public class UserException extends BaseException {
     private static final long serialVersionUID = 1L;
 
     public UserException(String code, Object... args) {
-        super("user", code, args, null);
+        super("bag", code, args, null);
     }
 }

+ 10 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtParameterService.java

@@ -1,6 +1,5 @@
 package org.dromara.backstage.basics.service;
 
-import org.dromara.backstage.basics.domain.PtParameter;
 import org.dromara.backstage.basics.domain.vo.PtParameterVo;
 import org.dromara.backstage.basics.domain.bo.PtParameterBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -66,4 +65,14 @@ public interface IPtParameterService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 根据键名查询参数配置信息
+     *
+     * @param paramCode 参数code
+     * @return 参数键值
+     */
+
+    String selectParamByCode(String paramCode);
+
 }

+ 19 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtParameterServiceImpl.java

@@ -1,5 +1,7 @@
 package org.dromara.backstage.basics.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -8,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.dromara.backstage.basics.domain.bo.PtParameterBo;
 import org.dromara.backstage.basics.domain.vo.PtParameterVo;
@@ -127,4 +130,20 @@ public class PtParameterServiceImpl implements IPtParameterService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+    /**
+     * 根据键名查询参数配置信息
+     *
+     * @param paramCode 参数code
+     * @return 参数键值
+     */
+    @Cacheable(cacheNames = CacheNames.PT_PARAMETER, key = "#paramCode")
+    @Override
+    public String selectParamByCode(String paramCode) {
+        PtParameter parameter = baseMapper.selectOne(new LambdaQueryWrapper<PtParameter>()
+            .eq(PtParameter::getParamCode, paramCode));
+        if(ObjectUtil.isNotNull(parameter)){
+            return parameter.getParamValue();
+        }
+        return StringUtils.EMPTY;
+    }
 }

+ 0 - 33
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/bag/strategy/IUpdateStrategy.java

@@ -1,33 +0,0 @@
-package org.dromara.backstage.business.bag.strategy;
-
-import org.dromara.backstage.payment.domain.bo.PtBagBo;
-import org.dromara.backstage.payment.domain.vo.PtBagVo;
-
-/**
- * name: IUpdateStrategy
- * package: org.dromara.backstage.business.bag.Strategy
- * description: 钱包更新策略
- * date: 2024-08-19 16:31:27 16:31
- *
- * @author yubo
- * @version 0.1
- * @since JDK 1.8
- */
-public interface IUpdateStrategy {
-    /**
-     * 校验账户钱包余额
-     * 校验规则:获取钱包的明文和密文卡余,如果两者一致则通过,否则抛出异常
-     *
-     * @param bo 账户钱包
-     */
-    void verification(PtBagBo bo);
-
-    /**
-     * 重新组装钱包逻辑
-     *
-     * @param bo 账户钱包
-     */
-    void reassembly(PtBagBo bo);
-
-    PtBagVo update(PtBagBo bo);
-}

+ 0 - 53
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/bag/strategy/impl/UpdateStrategyImpl.java

@@ -1,53 +0,0 @@
-package org.dromara.backstage.business.bag.strategy.impl;
-
-import cn.hutool.core.util.StrUtil;
-import lombok.RequiredArgsConstructor;
-import org.dromara.backstage.business.bag.strategy.IUpdateStrategy;
-import org.dromara.backstage.payment.domain.bo.PtBagBo;
-import org.dromara.backstage.payment.domain.vo.PtBagVo;
-import org.dromara.backstage.payment.service.IPtBagService;
-import org.dromara.common.encrypt.utils.YcEncryptUtil;
-import org.springframework.stereotype.Service;
-
-import java.math.BigDecimal;
-
-/**
- * name: UpdateStrategyImpl
- * package: org.dromara.backstage.business.bag.strategy.impl
- * description: 钱包更新策略接口实现
- * date: 2024-08-19 16:55:27 16:55
- *
- * @author yubo
- * @version 0.1
- * @since JDK 1.8
- */
-@RequiredArgsConstructor
-@Service
-public class UpdateStrategyImpl implements IUpdateStrategy {
-
-    private final IPtBagService bagService;
-
-    @Override
-    public void verification(PtBagBo bo) {
-        PtBagVo vo = bagService.queryById(bo.getBagId());
-
-        BigDecimal entryptValue = BigDecimal.ZERO;
-        if (StrUtil.isNotBlank(vo.getEncryptBalance())) {
-            String decryptValue = YcEncryptUtil.decryptBagBalanceByPublicKey(vo.getEncryptBalance(), vo.getUserId().toString());
-            entryptValue = new BigDecimal(decryptValue);
-        }
-        if(entryptValue.compareTo(vo.getBalance()) != 0){
-            String message = "";
-        }
-    }
-
-    @Override
-    public void reassembly(PtBagBo bo) {
-
-    }
-
-    @Override
-    public PtBagVo update(PtBagBo bo) {
-        return bagService.updateBalanceByBo(bo);
-    }
-}

+ 33 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/IPaymentsStrategy.java

@@ -0,0 +1,33 @@
+package org.dromara.backstage.business.payments.strategy;
+
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
+
+/**
+ * name: IUpdateStrategy
+ * package: org.dromara.backstage.business.bag.Strategy
+ * description: 资金收支策略
+ * date: 2024-08-19 16:31:27 16:31
+ *
+ * @author yubo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface IPaymentsStrategy {
+    /**
+     * 创建资金收支订单
+     *
+     *
+     * @param bo 资金收支账户钱包
+     * @return 资金收支订单信息
+     */
+    PtBagVo creteOrder(PtBagBo bo);
+
+    /**
+     * 资金收支入账
+     *
+     * @param bo 账户钱包
+     */
+    PtBagVo postOrder(PtBagBo bo);
+
+}

+ 45 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/PaymentsBusiness.java

@@ -0,0 +1,45 @@
+package org.dromara.backstage.business.payments.strategy;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.basics.service.IPtParameterService;
+import org.dromara.common.core.constant.Constants;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * name: PaymentsBusiness
+ * package: org.dromara.backstage.business.payments.strategy
+ * description: 资金收支业务处理类
+ * date: 2024-08-20 20:21:39 20:21
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+public class PaymentsBusiness {
+    private final IPtParameterService parameterService;
+    /**
+     * 计算管理费
+     *
+     * @param data   需要计算管理费的金额
+     * @param cardNo 卡流水号
+     * @return 管理费
+     */
+    public BigDecimal computeCommission(BigDecimal data, Long cardNo) {
+        BigDecimal commission = BigDecimal.ZERO;
+        String commType = parameterService.selectParamByCode("COMMISSION_TYPE");
+        //从系统参数表中拿收管理费的设置
+        if(Constants.TAKE_COMMISSION.equals(commType)) {
+            BigDecimal commissionRate = BigDecimal.TEN;
+            commission = data.multiply(commissionRate.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP)).setScale(2, RoundingMode.HALF_UP);
+        }else {
+            //查找卡流水号对卡类的管理费
+            commission = BigDecimal.ZERO;
+        }
+        return commission;
+    }
+}

+ 43 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/CommissionPaymentsStrategyImpl.java

@@ -0,0 +1,43 @@
+package org.dromara.backstage.business.payments.strategy.impl;
+
+import cn.hutool.json.JSONUtil;
+import org.dromara.backstage.business.payments.strategy.IPaymentsStrategy;
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.dromara.common.core.constant.CreditTypeConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * name: RechargePaymentsStrategyImpl
+ * package: org.dromara.backstage.business.payments.strategy.impl
+ * description: 收管理费时资金收支处理策略实现
+ * date: 2024-08-20 19:37:01 19:37
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Service(CreditTypeConstants.COMMISSION)
+public class CommissionPaymentsStrategyImpl implements IPaymentsStrategy {
+    private static final Logger log = LoggerFactory.getLogger(CommissionPaymentsStrategyImpl.class);
+    /**
+     * 新增管理费收支明细订单管理费是不需要更新钱包数据的
+     *
+     * @param bo 资金收支明细
+     * @return 是否新增成功
+     */
+    @Override
+    public PtBagVo creteOrder(PtBagBo bo) {
+        log.info("[开始生成管理费收支订单]-{}", JSONUtil.toJsonStr(bo));
+        //1.创建收支订单
+        //2.收支入账,此处只需要入收支明细表就可以了
+        return null;
+    }
+
+    @Override
+    public PtBagVo postOrder(PtBagBo bo) {
+        return null;
+    }
+}

+ 34 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/PaymentsStrategyContent.java

@@ -0,0 +1,34 @@
+package org.dromara.backstage.business.payments.strategy.impl;
+
+import org.dromara.backstage.business.payments.strategy.IPaymentsStrategy;
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * name: UpdateStrategyContent
+ * package: org.dromara.backstage.business.bag.strategy.impl
+ * description: 资金收支策略上下文
+ * date: 2024-08-19 22:08:12 22:08
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Service
+public class PaymentsStrategyContent {
+    private final Map<String, IPaymentsStrategy> strategyMap = new ConcurrentHashMap<>();
+
+    @Autowired
+    public PaymentsStrategyContent(Map<String, IPaymentsStrategy> strategyMap) {
+        this.strategyMap.putAll(strategyMap);
+    }
+
+    public PtBagVo createOrder(PtBagBo bo){
+        return strategyMap.get(bo.getCreditType().name()).creteOrder(bo);
+    }
+}

+ 69 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/RechargePaymentsStrategyImpl.java

@@ -0,0 +1,69 @@
+package org.dromara.backstage.business.payments.strategy.impl;
+
+import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.business.payments.strategy.IPaymentsStrategy;
+import org.dromara.backstage.business.payments.strategy.PaymentsBusiness;
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.constant.CreditTypeConstants;
+import org.dromara.common.core.enums.CreditTypeEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+/**
+ * name: RechargePaymentsStrategyImpl
+ * package: org.dromara.backstage.business.payments.strategy.impl
+ * description: 充值时资金收支处理策略实现
+ * date: 2024-08-20 19:37:01 19:37
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service(CreditTypeConstants.RECHARGE)
+public class RechargePaymentsStrategyImpl implements IPaymentsStrategy {
+    private static final Logger log = LoggerFactory.getLogger(RechargePaymentsStrategyImpl.class);
+    private final PaymentsStrategyContent strategyContent;
+    private final PaymentsBusiness business;
+    /**
+     * 新增资金收支明细订单
+     *
+     * @param bo 资金收支明细
+     * @return 是否新增成功
+     */
+    @Override
+    public PtBagVo creteOrder(PtBagBo bo) {
+        log.info("[开始生成{}订单]-{}",bo.getOperationMode().message(), JSONUtil.toJsonStr(bo));
+        BigDecimal doMoney = bo.getReceiptMoney();
+        if(bo.getTakeCommission().equals(Constants.TAKE_COMMISSION)){
+            // TODO 2024-08-20 20:01:58 luoyibo 要收管理费,在此处理
+            //1.计算管理费
+            BigDecimal commission = business.computeCommission(bo.getReceiptMoney(), bo.getCardNo());
+            if(commission.compareTo(BigDecimal.ZERO)>0) {
+                //管理费大于0,需要收支入账
+                bo.setReceiptMoney(commission);
+                bo.setCreditType(CreditTypeEnum.COMMISSION_CHARGE);
+
+                strategyContent.createOrder(bo);
+                //管理入账成功后重新设置充值数据
+                //交易类型重置为充值,交易金额为原交易金额-管理费
+                bo.setCreditType(CreditTypeEnum.RECHARGE);
+                bo.setReceiptMoney(doMoney.subtract(commission));
+            }
+        }
+        //1.创建收支订单
+        //2.收支入账,此处只需要入收支明细表就可以了
+        return null;
+    }
+
+    @Override
+    public PtBagVo postOrder(PtBagBo bo) {
+        return null;
+    }
+}

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfCreditaccountController.java

@@ -19,7 +19,7 @@ import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.backstage.consumption.domain.vo.XfCreditaccountVo;
 import org.dromara.backstage.consumption.domain.bo.XfCreditaccountBo;
-import org.dromara.backstage.consumption.service.IXfCreditaccountService;
+import org.dromara.backstage.consumption.service.IXfCreditAccountService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 /**
@@ -35,7 +35,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 @RequestMapping("/consumption/xfCreditaccount")
 public class XfCreditaccountController extends BaseController {
 
-    private final IXfCreditaccountService xfCreditaccountService;
+    private final IXfCreditAccountService xfCreditaccountService;
 
     /**
      * 查询资金收支明细列表

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfCreditaccountbackController.java

@@ -19,7 +19,7 @@ import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.backstage.consumption.domain.vo.XfCreditaccountbackVo;
 import org.dromara.backstage.consumption.domain.bo.XfCreditaccountbackBo;
-import org.dromara.backstage.consumption.service.IXfCreditaccountbackService;
+import org.dromara.backstage.consumption.service.IXfCreditAccountBackService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 /**
@@ -35,7 +35,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 @RequestMapping("/consumption/xfCreditaccountback")
 public class XfCreditaccountbackController extends BaseController {
 
-    private final IXfCreditaccountbackService xfCreditaccountbackService;
+    private final IXfCreditAccountBackService xfCreditaccountbackService;
 
     /**
      * 查询资金收支备份列表

+ 1 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfCreditaccountbackService.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfCreditAccountBackService.java

@@ -1,6 +1,5 @@
 package org.dromara.backstage.consumption.service;
 
-import org.dromara.backstage.consumption.domain.XfCreditaccountback;
 import org.dromara.backstage.consumption.domain.vo.XfCreditaccountbackVo;
 import org.dromara.backstage.consumption.domain.bo.XfCreditaccountbackBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -15,7 +14,7 @@ import java.util.List;
  * @author Yb
  * @date 2024-08-15
  */
-public interface IXfCreditaccountbackService {
+public interface IXfCreditAccountBackService {
 
     /**
      * 查询资金收支备份

+ 1 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfCreditaccountService.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfCreditAccountService.java

@@ -1,6 +1,5 @@
 package org.dromara.backstage.consumption.service;
 
-import org.dromara.backstage.consumption.domain.XfCreditaccount;
 import org.dromara.backstage.consumption.domain.vo.XfCreditaccountVo;
 import org.dromara.backstage.consumption.domain.bo.XfCreditaccountBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -15,7 +14,7 @@ import java.util.List;
  * @author LionLi
  * @date 2024-08-15
  */
-public interface IXfCreditaccountService {
+public interface IXfCreditAccountService {
 
     /**
      * 查询资金收支明细

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

@@ -1,5 +1,6 @@
 package org.dromara.backstage.consumption.service.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DS;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -27,6 +28,7 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Service
+@DS("storage")
 public class XfConsumedetailServiceImpl implements IXfConsumedetailService {
 
     private final XfConsumedetailMapper baseMapper;

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

@@ -1,5 +1,6 @@
 package org.dromara.backstage.consumption.service.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DS;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -27,6 +28,7 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Service
+@DS("storage")
 public class XfConsumedetailoriginalServiceImpl implements IXfConsumedetailoriginalService {
 
     private final XfConsumedetailoriginalMapper baseMapper;

+ 4 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfCreditaccountbackServiceImpl.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfCreditAccountBackServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.backstage.consumption.service.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DS;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -13,7 +14,7 @@ import org.dromara.backstage.consumption.domain.bo.XfCreditaccountbackBo;
 import org.dromara.backstage.consumption.domain.vo.XfCreditaccountbackVo;
 import org.dromara.backstage.consumption.domain.XfCreditaccountback;
 import org.dromara.backstage.consumption.mapper.XfCreditaccountbackMapper;
-import org.dromara.backstage.consumption.service.IXfCreditaccountbackService;
+import org.dromara.backstage.consumption.service.IXfCreditAccountBackService;
 
 import java.util.List;
 import java.util.Map;
@@ -27,7 +28,8 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Service
-public class XfCreditaccountbackServiceImpl implements IXfCreditaccountbackService {
+@DS("storage")
+public class XfCreditAccountBackServiceImpl implements IXfCreditAccountBackService {
 
     private final XfCreditaccountbackMapper baseMapper;
 

+ 4 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfCreditaccountServiceImpl.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfCreditAccountServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.backstage.consumption.service.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DS;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -13,7 +14,7 @@ import org.dromara.backstage.consumption.domain.bo.XfCreditaccountBo;
 import org.dromara.backstage.consumption.domain.vo.XfCreditaccountVo;
 import org.dromara.backstage.consumption.domain.XfCreditaccount;
 import org.dromara.backstage.consumption.mapper.XfCreditaccountMapper;
-import org.dromara.backstage.consumption.service.IXfCreditaccountService;
+import org.dromara.backstage.consumption.service.IXfCreditAccountService;
 
 import java.util.List;
 import java.util.Map;
@@ -27,7 +28,8 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Service
-public class XfCreditaccountServiceImpl implements IXfCreditaccountService {
+@DS("storage")
+public class XfCreditAccountServiceImpl implements IXfCreditAccountService {
 
     private final XfCreditaccountMapper baseMapper;
 

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

@@ -1,5 +1,6 @@
 package org.dromara.backstage.consumption.service.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DS;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -27,6 +28,7 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Service
+@DS("storage")
 public class XfTermtotalServiceImpl implements IXfTermtotalService {
 
     private final XfTermtotalMapper baseMapper;

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

@@ -1,5 +1,6 @@
 package org.dromara.backstage.consumption.service.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DS;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -27,6 +28,7 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Service
+@DS("storage")
 public class XfUsertotalServiceImpl implements IXfUsertotalService {
 
     private final XfUsertotalMapper baseMapper;

+ 6 - 6
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java

@@ -110,9 +110,9 @@ public class PtBagController extends BaseController {
     @SaCheckPermission("payment:ptBag:edit")
     @Log(title = "账户钱包", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
-    @PutMapping("/recharge")
-    public R<Void> recharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
-        return toAjax(ptBagService.updateByBo(bo));
+    @PostMapping("/recharge")
+    public R<PtBagVo> recharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
+        return R.ok(ptBagService.updateBalanceByBo(bo));
     }
     /**
      * 账户钱包退款
@@ -120,8 +120,8 @@ public class PtBagController extends BaseController {
     @SaCheckPermission("payment:ptBag:edit")
     @Log(title = "账户钱包", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
-    @PutMapping("/refund")
-    public R<Void> refund(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
-        return toAjax(ptBagService.updateByBo(bo));
+    @PostMapping("/refund")
+    public R<PtBagVo> refund(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
+        return R.ok(ptBagService.updateBalanceByBo(bo));
     }
 }

+ 29 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PtBagBo.java

@@ -2,6 +2,7 @@ package org.dromara.backstage.payment.domain.bo;
 
 import org.dromara.backstage.payment.domain.PtBag;
 import org.dromara.common.core.enums.BalanceUpdateEnum;
+import org.dromara.common.core.enums.CreditTypeEnum;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
@@ -23,6 +24,7 @@ import java.math.BigDecimal;
 @AutoMapper(target = PtBag.class, reverseConvertGenerate = false)
 public class PtBagBo extends BaseEntity {
 
+    //region 这是钱包数据库对应的数据
     /**
      * 钱包Id,主键
      */
@@ -44,7 +46,6 @@ public class PtBagBo extends BaseEntity {
     /**
      * 钱包余额
      */
-    @NotNull(message = "钱包余额不能为空", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal balance;
 
     /**
@@ -67,29 +68,52 @@ public class PtBagBo extends BaseEntity {
      */
     private BigDecimal rechargeTotal;
 
+
     /**
      * 充值总次数
      */
     private Long rechargeCount;
+    //endregion
 
+    //region 以下属性是钱包余额变更业务所需要的
     /**
      * 资金来源
      */
-    private String funding;
+    private String payStyle;
 
     /**
      * 是否收管理费
      */
-   private String commission;
+   private String takeCommission;
 
     /**
      * 充值/退款/重置余额时的操作金额
      */
-   private BigDecimal operationMoney;
+   private BigDecimal receiptMoney;
 
     /**
      * 卡余的操作类型
      */
    private BalanceUpdateEnum operationMode;
-
+    /**
+     * 交易类型
+     */
+   private CreditTypeEnum creditType;
+    /**
+     * 卡流水号
+     */
+   private Long cardNo;
+    /**
+     * 设备机号
+     */
+   private Long termNo;
+    /**
+     * 工作站编号
+     */
+   private Long stationId;
+    /**
+     * 操作员Id
+     */
+    private Long operatorId;
+    //endregion
 }

+ 7 - 7
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/IPtBagService.java

@@ -1,5 +1,6 @@
 package org.dromara.backstage.payment.service;
 
+import org.dromara.backstage.payment.domain.PtBag;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -83,18 +84,17 @@ public interface IPtBagService {
     Boolean initAccountBag(Long userId);
 
     /**
-     * 账户钱包充值
+     * 更新钱包
      *
      * @param bo 账户钱包
-     * @return 是否修改成功
+     * @return 更新后的钱包
      */
-    Boolean rechargeByBo(PtBagBo bo);
-
+    PtBagVo updateBalanceByBo(PtBagBo bo);
     /**
-     * 更新钱包
+     * 钱包更新前的验证
      *
      * @param bo 账户钱包
-     * @return 更新后的钱包
+     * @return 验证通过后的账户钱包
      */
-    PtBagVo updateBalanceByBo(PtBagBo bo);
+    PtBag verification(PtBagBo bo);
 }

+ 142 - 50
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtBagServiceImpl.java

@@ -2,8 +2,8 @@ package org.dromara.backstage.payment.service.impl;
 
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-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;
@@ -12,14 +12,13 @@ import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.mapper.PtBagMapper;
 import org.dromara.backstage.payment.service.IPtBagService;
-import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.exception.consume.BagException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.encrypt.utils.YcEncryptUtil;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.redis.utils.RedisUtils;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -115,10 +114,9 @@ public class PtBagServiceImpl implements IPtBagService {
     @Override
     public Boolean updateByBo(PtBagBo bo) {
         PtBag update = MapstructUtils.convert(bo, PtBag.class);
-
-        if (update != null && validBalance(update)) {
-            String encryptValue = YcEncryptUtil.encryptBagBalanceByPublicKey(bo.getBalance().toString(), bo.getUserId().toString());
-            update.setEncryptBalance(encryptValue);
+        if (update != null) {
+            verification(bo);
+            setEncryptBalance(update);
             return baseMapper.updateById(update) > 0;
         } else {
             return false;
@@ -132,26 +130,6 @@ public class PtBagServiceImpl implements IPtBagService {
         //TODO 做一些数据校验,如唯一约束
     }
 
-    /**
-     * 校验账户钱包余额
-     * 校验规则:获取钱包的明文和密文卡余,如果两者一致则通过
-     *
-     * @param data 账户钱包
-     * @return 校给是否成功
-     */
-    private boolean validBalance(PtBag data) {
-        PtBag entity = baseMapper.selectOne(Wrappers.<PtBag>lambdaQuery()
-            .eq(PtBag::getBagCode, data.getBagCode())
-            .eq(PtBag::getUserId, data.getUserId()));
-
-        BigDecimal entryptValue = BigDecimal.ZERO;
-        if (StrUtil.isNotBlank(entity.getEncryptBalance())) {
-            String decryptValue = YcEncryptUtil.decryptBagBalanceByPublicKey(entity.getEncryptBalance(), entity.getUserId().toString(), RedisUtils.getCacheObject(CacheNames.CUSTOM_PUB_KEY).toString());
-            entryptValue = new BigDecimal(decryptValue);
-        }
-        return entryptValue.compareTo(entity.getBalance()) == 0;
-    }
-
     /**
      * 校验并批量删除账户钱包信息
      *
@@ -223,40 +201,154 @@ public class PtBagServiceImpl implements IPtBagService {
     }
 
     /**
-     * 账户钱包充值
+     * 更新钱包
      *
      * @param bo 账户钱包
-     * @return 是否充值成功
+     * @return 更新后的账户钱包
      */
     @Override
-    public Boolean rechargeByBo(PtBagBo bo) {
-        return baseMapper.update(null, new LambdaUpdateWrapper<PtBag>()
-            .set(PtBag::getBalance, bo.getBalance())
-            .set(PtBag::getEncryptBalance, bo.getEncryptBalance())
-            .set(PtBag::getRechargeCount, bo.getRechargeTotal())
-            .set(PtBag::getRechargeTotal, bo.getRechargeTotal())
-            .eq(PtBag::getBagCode, bo.getBagCode())
-            .eq(PtBag::getUserId, bo.getUserId())) > 0;
+    public PtBagVo updateBalanceByBo(PtBagBo bo) {
+        //校验入库数据
+        PtBag entity = verification(bo);
+        //根据不同的操作组装入库数据
+        switch (bo.getOperationMode()) {
+            case REFUND:
+                refundBag(entity, bo);
+                break;
+            case CONSUME:
+                consumeBag(entity, bo);
+                break;
+            case RECOVER:
+                recoverBag(entity, bo);
+                break;
+            case COMPENSATE:
+                compensateBag(entity, bo);
+                break;
+            case RECHARGE:
+            default:
+                rechargeBag(entity, bo);
+        }
+        //数据入库
+        if (baseMapper.updateById(entity) > 0) {
+            return queryById(entity.getBagId());
+        } else {
+            return null;
+        }
     }
-
     /**
-     * 更新钱包
+     * 钱包更新前的验证
      *
      * @param bo 账户钱包
-     * @return 更新后的账户钱包
+     * @return 验证通过后的账户钱包
      */
     @Override
-    public PtBagVo updateBalanceByBo(PtBagBo bo) {
-        PtBag update = MapstructUtils.convert(bo, PtBag.class);
-        if (update != null){
-            if(baseMapper.updateById(update)>0){
-                return queryById(update.getBagId());
-            } else{
-                return null;
-            }
-        } else {
-            return null;
+    public PtBag verification(PtBagBo bo) {
+        //获取数据库中对应的钱包
+        PtBag entity = baseMapper.selectOne(Wrappers.<PtBag>lambdaQuery()
+            .eq(PtBag::getBagId, bo.getBagId()));
+
+        //解密余额密文,得到加密的余额
+        BigDecimal entryptValue = BigDecimal.ZERO;
+        if (StrUtil.isNotBlank(entity.getEncryptBalance())) {
+            String decryptValue = YcEncryptUtil.decryptBagBalanceByPublicKey(entity.getEncryptBalance(), entity.getUserId().toString());
+            entryptValue = new BigDecimal(decryptValue);
+        }
+        //如果明文余额与解密后余额不一致则验证不通过
+        if (entryptValue.compareTo(entity.getBalance()) != 0) {
+            throw new BagException("bag.balance.valid", JSONUtil.parse(bo));
         }
+        return entity;
+    }
+    /**
+     * 组装充值钱包数据
+     * 1.设置充值后余额=账户原余额+充值金额
+     * 2.设置充值次数+1
+     * 3.设置充值总金额额=原总金额+充值金额
+     * 4.对充值后余额进行加密处理
+     *
+     * @param bag 账户钱包(数据库)
+     * @param bo 账户钱包(业务)
+     */
+    private void rechargeBag(PtBag bag, PtBagBo bo) {
+        bag.setBalance(bag.getBalance().add(bo.getReceiptMoney()));
+        bag.setRechargeCount(bag.getRechargeCount() + 1);
+        bag.setRechargeTotal(bag.getRechargeTotal().add(bo.getReceiptMoney()));
+        setEncryptBalance(bag);
+    }
+    /**
+     * 组装退款钱包数据
+     * 1.如果原账户余额>退款金额,则设置退款后余额=账户原余额-退款金额,否则为0
+     * 2.对退款后余额进行加密处理
+     *
+     * @param bag 账户钱包(数据库)
+     * @param bo 账户钱包(业务)
+     */
+    private void refundBag(PtBag bag, PtBagBo bo) {
+        //退款后的余额
+        BigDecimal after = BigDecimal.ZERO;
+        //账户现有余额
+        BigDecimal balance  = bag.getBalance();
+        //退款金额
+        BigDecimal doValue = bo.getReceiptMoney();
+        //如果账户现有余额比退款金额大,则最后余额为账户余额-退款金额,否则为0
+        if(balance.compareTo(doValue)>0){
+            after = balance.subtract(doValue);
+        }
+        bag.setBalance(after);
+        setEncryptBalance(bag);
+    }
+    /**
+     * 组装重置钱包数据
+     * 1.设置重置后余额=操作金额
+     * 2.对退款后余额进行加密处理
+     *
+     * @param bag 账户钱包(数据库)
+     * @param bo 账户钱包(业务)
+     */
+    private void recoverBag(PtBag bag, PtBagBo bo) {
+        bag.setBalance(bo.getReceiptMoney());
+        setEncryptBalance(bag);
+    }
+    /**
+     * 组装消费钱包数据
+     * 1.设置消费后余额=账户原余额-消费金额
+     * 2.设置消费次数+1
+     * 3.设置消费总金额额=原总金额+消费金额
+     * 4.对消费后余额进行加密处理
+     *
+     * @param bag 账户钱包(数据库)
+     * @param bo 账户钱包(业务)
+     */
+    private void consumeBag(PtBag bag, PtBagBo bo) {
+        bag.setBalance(bag.getBalance().subtract(bo.getReceiptMoney()));
+        bag.setConsumeCount(bag.getConsumeCount() + 1);
+        bag.setConsumeTotal(bag.getConsumeTotal().add(bo.getReceiptMoney()));
+        setEncryptBalance(bag);
+    }
+    /**
+     * 组装错扣补款钱包数据
+     * 1.设置补款后余额=账户原余额+补款金额
+     * 2.设置消费次数+1
+     * 3.设置消费总金额额=原总金额-补款金额
+     * 4.对补款后余额进行加密处理
+     *
+     * @param bag 账户钱包(数据库)
+     * @param bo 账户钱包(业务)
+     */
+    private void compensateBag(PtBag bag, PtBagBo bo) {
+        bag.setBalance(bag.getBalance().add(bo.getReceiptMoney()));
+        bag.setConsumeCount(bag.getConsumeCount() + 1);
+        bag.setConsumeTotal(bag.getConsumeTotal().subtract(bo.getReceiptMoney()));
+        setEncryptBalance(bag);
+    }
+    /**
+     * 设置加密卡余
+     *
+     * @param bag 账户钱包(数据库)
+     */
+    private void setEncryptBalance(PtBag bag) {
+        String encryptValue = YcEncryptUtil.encryptBagBalanceByPublicKey(bag.getBalance().toString(), bag.getUserId().toString());
+        bag.setEncryptBalance(encryptValue);
     }
 
 }