Jelajahi Sumber

feature: 资金收支业务优化
1.对资金收支的业务处理逻辑进行了优化(充值/批量充值、退款/批量退款、补助到账)
2.相关代码的清理及规范化

luoyb 1 tahun lalu
induk
melakukan
779435e1c8
17 mengubah file dengan 310 tambahan dan 739 penghapusan
  1. 1 1
      pom.xml
  2. 100 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/PayStyleEnum.java
  3. 5 4
      ruoyi-common/ruoyi-common-core/src/main/resources/i18n/messages_zh_CN.properties
  4. 1 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/RuoYiBackstageApplication.java
  5. 54 10
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PayBaseBusiness.java
  6. 117 31
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PayOrderBusiness.java
  7. 0 319
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PaymentsBusiness.java
  8. 0 33
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/IPaymentsStrategy.java
  9. 0 33
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/PaymentsStrategyContent.java
  10. 0 49
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/CommissionPaymentsStrategyImpl.java
  11. 0 58
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/RechargePaymentsStrategyImpl.java
  12. 0 66
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/strategy/impl/RefundPaymentsStrategyImpl.java
  13. 8 28
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtCardController.java
  14. 18 105
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java
  15. 0 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PurseInOutBo.java
  16. 5 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/vo/PtBagVo.java
  17. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/task/SubsidyScheduled.java

+ 1 - 1
pom.xml

@@ -441,7 +441,7 @@
                     <source>${java.version}</source>
                     <target>${java.version}</target>
                     <encoding>${project.build.sourceEncoding}</encoding>
-                    <annotationProcessorPaths>
+                      <annotationProcessorPaths>
                         <path>
                             <groupId>com.github.therapi</groupId>
                             <artifactId>therapi-runtime-javadoc-scribe</artifactId>

+ 100 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/PayStyleEnum.java

@@ -0,0 +1,100 @@
+package org.dromara.common.core.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * name: BalanceUpdateEnum
+ * package: org.dromara.common.core.enums
+ * description: 资金来源枚举
+ * date: 2024-08-18 20:57:35 20:57
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public enum PayStyleEnum {
+    /**
+     * 现金
+     */
+    CASH(1,"现金"),
+    /**
+     * 支票
+     */
+    CHEQUE(2,"支票"),
+    /**
+     * 转账
+     */
+    TRANSFER(3,"转账"),
+    /**
+     * 微信
+     */
+    WECHAT(5,"微信"),
+    /**
+     * 支付宝
+     */
+    ALIPAY(6,"支付宝"),
+    /**
+     * 其它
+     */
+    OTHER(4,"其它");
+
+    private final Integer code;
+    private final String message;
+
+    PayStyleEnum(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 (PayStyleEnum item : PayStyleEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.message;
+            }
+        }
+        return name;
+    }
+    public static String getMessage(int code) {
+        for (PayStyleEnum item : PayStyleEnum.values()) {
+            if (item.code().equals(code)) {
+                return item.message;
+            }
+        }
+        return "未知";
+    }
+    public static Integer getCode(String name) {
+        for (PayStyleEnum item : PayStyleEnum.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) {
+        PayStyleEnum[] thisEnums = PayStyleEnum.values();
+        List<Integer> codeList = new ArrayList<>();
+        for (PayStyleEnum thisEnum : thisEnums) {
+            if (!codeList.contains(thisEnum.code)) {
+                codeList.add(thisEnum.code());
+            }
+        }
+    }
+}

+ 5 - 4
ruoyi-common/ruoyi-common-core/src/main/resources/i18n/messages_zh_CN.properties

@@ -63,10 +63,11 @@ tenant.expired=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u8FC7\u671
 bag.balance.valid=\u8D26\u6237\u4F59\u989D\u6821\u9A8C\u5931\u8D25
 bag.balance.update=\u8D26\u6237\u5361\u4F59\u66F4\u65B0\u5931\u8D25!{0}
 ## \u8D44\u91D1\u6536\u652F
-payments.OriginalRecord.create=\u521B\u5EFA\u539F\u59CB\u6536\u652F\u8BB0\u5F55\u5931\u8D25:{0}
-payments.OriginalRecord.get=\u65E0\u6B64Id\u5BF9\u5E94\u7684\u539F\u59CB\u6536\u652F\u8BB0\u5F55:{0}
-payments.OriginalRecord.isPost=\u8BE5\u7B14\u539F\u59CB\u6536\u652F\u8BB0\u5F55\u5DF2\u5165\u8D26,\u539F\u59CBId:{0},\u6536\u652FId:{1}
-payments.keepAccounts.create = \u539F\u59CB\u6536\u652F\u8BB0\u5F55\u5165\u8D26\u5931\u8D25,\u539F\u59CBId:{0}
+payments.OriginalRecord.create=\u521B\u5EFA\u6536\u652F\u8BA2\u5355\u8BB0\u5F55\u5931\u8D25:{0}
+payments.OriginalRecord.get=\u65E0\u6536\u652F\u8BA2\u5355\u8BB0\u5F55,\u8BA2\u5355Id:{0}
+payments.OriginalRecord.isPost=\u6536\u652F\u8BA2\u5355\u5DF2\u5165\u8D26,\u8BA2\u5355Id:{0},\u5165\u8D26Id:{1}
+payments.keepAccounts.create = \u6536\u652F\u5165\u8D26\u5199\u660E\u7EC6\u8868\u5931\u8D25,\u8BA2\u5355Id:{0}
+payments.userTotal.failure = \u6536\u652F\u5165\u8D26\u66F4\u65B0\u4EBA\u5458\u65E5\u7EDF\u8BA1\u8868\u5931\u8D25,\u8BA2\u5355Id:{0}
 ## \u6D88\u8D39
 consumption.userAccount.not.exists = \u4E0D\u5B58\u5728\u6B64\u6D88\u8D39\u8D26\u6237!{0}
 consumption.userCard.not.exists = \u4E0D\u5B58\u5728\u6B64\u5361\u7247\u4FE1\u606F!{0}

+ 1 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/RuoYiBackstageApplication.java

@@ -5,6 +5,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
 import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 /**
  * 系统模块

+ 54 - 10
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PayBaseBusiness.java

@@ -31,9 +31,9 @@ import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.backstage.payment.service.IPtBagService;
 import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.enums.CreditStatusEnum;
 import org.dromara.common.core.enums.CreditTypeEnum;
-import org.dromara.common.core.exception.consume.ConsumeException;
 import org.dromara.common.core.exception.payments.PaymentsException;
 import org.dromara.common.core.utils.MessageUtils;
 import org.dromara.common.core.utils.RecordIdUtils;
@@ -143,7 +143,7 @@ public class PayBaseBusiness {
      * @param orderBo 收支订单业务对象
      */
     public void calculateBalance(PtBagVo bagVo,PurseInOutBo orderBo){
-        if (Objects.requireNonNull(orderBo.getCreditType()) == CreditTypeEnum.TERM_CONSUME) {
+        if (Objects.requireNonNull(orderBo.getCreditType()) == CreditTypeEnum.COMMISSION_CHARGE) {
             //管理费实际是不扣钱包余额的
             orderBo.setBalance(bagVo.getBalance());
         } else {
@@ -160,14 +160,44 @@ public class PayBaseBusiness {
         XfCreditAccountBackVo xfCreditaccountbackVo = creditAccountBackService.queryById(originalId);
         if (ObjUtil.isEmpty(xfCreditaccountbackVo)) {
             message = MessageUtils.message("payments.OriginalRecord.get", originalId);
-            throw new PaymentsException("[资金收支]-[原始记录]", message);
+            throw new PaymentsException(message);
         }
         String accountId = xfCreditaccountbackVo.getCreditId();
         if (StrUtil.isNotEmpty(accountId)) {
             message = MessageUtils.message("payments.OriginalRecord.isPost", originalId, accountId);
-            throw new PaymentsException("[资金收支]-[原始记录]", message);
+            throw new PaymentsException(message);
         }
     }
+
+    /**
+     * 资金收支时计算管理费
+     * @param bo 资金收支业务对象
+     * @return 管理费收支业务对象
+     */
+     public PurseInOutBo computeCommission(PurseInOutBo bo) {
+        if (bo.getTakeCommission().equals(Constants.TAKE_COMMISSION)) {
+            Long cardType = bo.getCardTypeId();
+            if (bo.getCardTypeId() == null) {
+                PtUserAccountVo accountVo = userAccountService.queryById(bo.getUserId());
+                cardType = accountVo.getCardType();
+            }
+            bo.setCardTypeId(cardType);
+            //如果要收管理费,则计算管理费
+            PtBagBo bagBo = BeanUtil.copyProperties(bo, PtBagBo.class);
+            BigDecimal commission = cardService.computeCommission(bagBo);
+            if (commission.compareTo(BigDecimal.ZERO) > 0) {
+                //如果管理费>0,是要入资金收支记录的
+                PurseInOutBo commissionBo = new PurseInOutBo();
+                BeanUtil.copyProperties(bo, commissionBo);
+                commissionBo.setReceiptMoney(commission);
+                commissionBo.setCreditType(CreditTypeEnum.COMMISSION_CHARGE);
+                //个人收支入账的金额要减去收掉的管理费
+                bo.setReceiptMoney(bo.getReceiptMoney().subtract(commission));
+                return commissionBo;
+            }
+        }
+        return null;
+    }
     /**
      * 生成原始收支记录(收支流水备份表)
      *
@@ -213,11 +243,11 @@ public class PayBaseBusiness {
         if (ObjUtil.isNotEmpty(workstationVo)) {
             xfCreditaccountbackBo.setStationId(workstationVo.getStationId());
         }
-
+        //原始订单入库
         XfCreditAccountBackVo creditAccountBackVo = creditAccountBackService.createOriginalRecord(xfCreditaccountbackBo);
         if (ObjUtil.isEmpty(creditAccountBackVo)) {
             String message = MessageUtils.message("payments.OriginalRecord.create", JSONUtil.parse(bo));
-            throw new PaymentsException("资金收支-原始记录", message);
+            throw new PaymentsException(message);
         }
         return creditAccountBackVo;
     }
@@ -264,23 +294,23 @@ public class PayBaseBusiness {
         }
         //设置卡片信息
         xfCreditaccountbo.setCardNo(cardVo.getCardNo());
-        xfCreditaccountbo.setCardValue(bo.getBalance());
         xfCreditaccountbo.setCardType(cardVo.getCardType());
         xfCreditaccountbo.setCardCount(bagVo.getRechargeCount() + 1);
         xfCreditaccountbo.setCardTypeName(cardVo.getCardTypeName());
         xfCreditaccountbo.setMainCard(cardVo.getMainCard());
         //设置钱包信息
         xfCreditaccountbo.setBagType(bagVo.getBagCode());
+        xfCreditaccountbo.setCardValue(bo.getBalance());
         // 设置操作员信息
-        xfCreditaccountbo.setOperatorId(bo.getOperatorId());
         xfCreditaccountbo.setOperatorName(bo.getOperatorName());
+        xfCreditaccountbo.setOperatorId(bo.getOperatorId());
 
         xfCreditaccountbo.setOriginalId(originalId);
 
         XfCreditAccountVo creditAccountVo = creditAccountService.keepAccounts(xfCreditaccountbo);
         if (ObjUtil.isEmpty(creditAccountVo)) {
             String message = MessageUtils.message("payments.keepAccounts.create", originalId);
-            throw new PaymentsException("资金收支-收支入账", message);
+            throw new PaymentsException(message);
         }
         return creditAccountVo;
     }
@@ -302,7 +332,11 @@ public class PayBaseBusiness {
         xfUserTotalBo.setUseType(bo.getUseType().code());
         xfUserTotalBo.setCreditMoney(bo.getReceiptMoney());
 
-        userTotalService.createOrUpdateUserTotal(xfUserTotalBo);
+        XfUserTotalVo vo = userTotalService.createOrUpdateUserTotal(xfUserTotalBo);
+        if (ObjUtil.isEmpty(vo)) {
+            String message = MessageUtils.message("payments.userTotal.failure", bo.getOriginalId());
+            throw new PaymentsException(message);
+        }
     }
 
     /**
@@ -325,9 +359,19 @@ public class PayBaseBusiness {
         creditAccountBackService.updateStatusById(bo.getOriginalId(), status, bo.getCreditId(), cardValue);
     }
 
+    /**
+     * 获取待入账的补助明细
+     * @return 补助明细
+     */
     public List<PtSubsidyitemVo> selectPostSubsidyItem(){
         return subsidyItemService.selectPostSubsidyItem();
     }
+
+    /**
+     * 更新补助明细的到账状态
+     * @param bo 补助明细
+     * @return 更新状态
+     */
     public boolean updatePostSubsidyItemStatus(PtSubsidyitemBo bo){
         return subsidyItemService.updateByBo(bo);
     }

+ 117 - 31
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PayOrderBusiness.java

@@ -10,7 +10,6 @@ import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo;
-import org.dromara.backstage.cardCenter.service.IPtSubsidyitemService;
 import org.dromara.backstage.consumption.domain.vo.XfCreditAccountBackVo;
 import org.dromara.backstage.consumption.domain.vo.XfCreditAccountVo;
 import org.dromara.backstage.consumption.domain.vo.XfTermVo;
@@ -18,10 +17,7 @@ import org.dromara.backstage.payment.domain.bo.PurseInOutBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.common.core.domain.R;
-import org.dromara.common.core.enums.BalanceUpdateEnum;
-import org.dromara.common.core.enums.CreditStatusEnum;
-import org.dromara.common.core.enums.CreditTypeEnum;
-import org.dromara.common.core.enums.SystemUseTypeEnum;
+import org.dromara.common.core.enums.*;
 import org.dromara.common.core.exception.consume.ConsumeException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -48,6 +44,12 @@ import java.util.Map;
 public class PayOrderBusiness {
 
     private final PayBaseBusiness payBaseBusiness;
+
+    /**
+     * 生成收支原始订单信息,写t_xf_creditAccountBack表
+     * @param orderBo 收支订单业务对象
+     * @return 原始订单信息
+     */
     public XfCreditAccountBackVo createOrder(PurseInOutBo orderBo) {
         log.info("[{}订单信息验证-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
         // 获取创建订单的辅助信息
@@ -58,15 +60,22 @@ public class PayOrderBusiness {
         PtWorkstationVo workstationVo = payBaseBusiness.checkWorkStation(orderBo);
 
         // 生成原始订单记录
-        // 生成原始订单记录前先计算收支后的钱包余额,这里只是记录下收支完成后的钱包应有余额,但还没有实际更新钱包余额
         log.info("[{}订单验证通过,创建订单]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
+        // 生成原始订单记录前先计算收支后的钱包余额,这里只是记录下收支完成后的钱包应有余额,但还没有实际更新钱包余额
         payBaseBusiness.calculateBalance(userBagVo,orderBo);
         return payBaseBusiness.createOriginalRecord(orderBo, userAccountVo,
             userCardVo, userBagVo, termVo, workstationVo);
     }
 
+    /**
+     * 收支订单入库
+     * 写/更新表:收支明细表:t_xf_creditAccount 个人日统计表:t_xf_userTotal 账户钱包表:t_pt_bag
+     * @param orderBo 收支订单业务对象
+     * @return 入库后的收支订单业务对象
+     */
     @Transactional(rollbackFor = ConsumeException.class)
-    public PtBagVo postOrder(PurseInOutBo orderBo) {
+    public PurseInOutBo postOrder(PurseInOutBo orderBo) {
+        //校验待入库的原始订单
         payBaseBusiness.ValidOriginalRecord(orderBo.getOriginalId());
         // 获取入库订单的辅助信息
         PtUserAccountVo userAccountVo = payBaseBusiness.checkUserAccount(orderBo);
@@ -78,65 +87,76 @@ public class PayOrderBusiness {
         log.info("[{}订单处理收支明细]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
         XfCreditAccountVo orderDetailVo = payBaseBusiness.keepAccounts(orderBo, userAccountVo, userCardVo, userBagVo, termVo, workstationVo, orderBo.getOriginalId());
         orderBo.setCreditId(orderDetailVo.getCreditId());
-
+        orderBo.setBalance(userBagVo.getBalance());
         //如果交易类型不为收管理费,则继续下面的操作以完成订单入库
         if(!orderBo.getCreditType().equals(CreditTypeEnum.COMMISSION_CHARGE)){
-            // TODO 2024-10-29 22:54:57 luoyibo 处理个人日统计表
+            // 处理个人日统计表
             log.info("[{}订单处理人日统计表]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
             payBaseBusiness.createOrUpdateUserTotal(orderBo, userAccountVo, userCardVo);
 
-            // TODO 2024-10-29 22:55:48 luoyibo 更新个人钱包余额
+            // 更新个人钱包余额
             log.info("[{}订单处理钱包余额]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
             PtBagVo afterBagVo = payBaseBusiness.updateBalance(orderBo);
-
-            // TODO 2024-10-30 14:43:15 luoyibo 入账成功,更新原始订单的入账状态
+            orderBo.setBalance(afterBagVo.getBalance());
+            // 入账成功,更新原始订单的入账状态
             log.info("[{}订单更新入账状态]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
             payBaseBusiness.updateOriginalOrderStatus(orderBo, CreditStatusEnum.SUCCESS.code(), afterBagVo.getBalance());
-
-            return afterBagVo;
         }
-        return null;
+        return orderBo;
     }
 
+    /**
+     * 普通收支业务处理:充值/批量充值 退款/批量退款
+     * @param orderBo 收支业务对象
+     * @return 处理结果
+     */
     @Transactional(rollbackFor = ConsumeException.class)
-    public R<Object> createNormalOrder(PurseInOutBo orderBo) {
+    public R<PurseInOutBo> createNormalOrder(PurseInOutBo orderBo) {
         //将收支请求写入原始收支记录表
         log.info("[准备创建{}订单-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
         XfCreditAccountBackVo OriginalOrder = createOrder(orderBo);
         orderBo.setOriginalId(OriginalOrder.getBackId());
 
         //原始收支记录成功,收支入账
-        log.info("[{}订单入账]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
-        PtBagVo result = postOrder(orderBo);
+        log.info("准备[{}订单入账]-[{}]",orderBo.getCreditType().message(), JSONUtil.toJsonStr(orderBo));
+        PurseInOutBo result = postOrder(orderBo);
 
         return R.ok(result);
     }
+
+    /**
+     * 补助收支入账
+     * @return 入账结果
+     */
     @Transactional(rollbackFor = ConsumeException.class)
     public R<Object> createSubsidyOrder(){
         List<String> infoList = new ArrayList<>();
         Map<String, Integer> mapCount = new HashMap<>();
         mapCount.put("successCount",0);
         mapCount.put("errorCount",0);
-
+        //获取需要入账的补助明细
         List<PtSubsidyitemVo> list = payBaseBusiness.selectPostSubsidyItem();
-        if(ObjUtil.isEmpty(list)||list.size()<=0){
-            return R.ok("没有需要入账的补助明细");
+        if(ObjUtil.isEmpty(list)|| list.isEmpty()){
+            return R.fail("[补助到账]-[没有需要入账的补助明细]");
         }
-        list.forEach(item->{
+        list.parallelStream().forEach(item->{
             PurseInOutBo orderBo = createSubsidyPostBo(item);
             int successCount;
             int errorCount;
 
             try {
-                R<Object> result = createNormalOrder(orderBo);
+                R<PurseInOutBo> result = createNormalOrder(orderBo);
                 if (result.getCode() == R.SUCCESS) {
-                    successCount = mapCount.get("successCount");
-                    successCount ++;
-                    mapCount.put("successCount",successCount);
+                    //到账成功,更新补助明细的到账状态
                     item.setGetDate(DateUtil.date());
                     item.setFillStatus("Y");
                     PtSubsidyitemBo bo = BeanUtil.copyProperties(item, PtSubsidyitemBo.class);
-                    payBaseBusiness.updatePostSubsidyItemStatus(bo);
+                    boolean bl = payBaseBusiness.updatePostSubsidyItemStatus(bo);
+                    if(bl){
+                        successCount = mapCount.get("successCount");
+                        successCount ++;
+                        mapCount.put("successCount",successCount);
+                    }
                 } else {
                     errorCount = mapCount.get("errorCount");
                     errorCount ++;
@@ -147,16 +167,82 @@ public class PayOrderBusiness {
                 infoList.add(MessageFormat.format("[补助到账失败]-[补助信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(orderBo), e.getMessage()));
             }
         });
-        log.info("补助到账完成,成功[{}]条,失败[{}]条", mapCount.get("successCount"), mapCount.get("errorCount"));
+        String message = MessageFormat.format("补助到账完成,成功[{0}]条,失败[{1}]条", mapCount.get("successCount"), mapCount.get("errorCount"));
         infoList.forEach(log::error);
-        return R.ok();
+        log.info(message);
+        return R.ok(message);
+    }
+    /**
+     * 资金收支时计算管理费
+     * @param bo 资金收支业务对象
+     * @return 管理费收支业务对象
+     */
+    public PurseInOutBo computeCommission(PurseInOutBo bo){
+        return payBaseBusiness.computeCommission(bo);
+    }
+
+    /**
+     * 充值入账
+     * @param bo 充值业务对象
+     * @return 入账结果
+     */
+    @Transactional(rollbackFor = ConsumeException.class)
+    public R<PurseInOutBo> recharge(PurseInOutBo bo){
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        PurseInOutBo commissionBo = computeCommission(bo);
+        try {
+            if (commissionBo != null) {
+                R<PurseInOutBo> commissionResult = createNormalOrder(commissionBo);
+                if (commissionResult.getCode() != R.SUCCESS) {
+                    return R.fail(commissionResult.getMsg());
+                }
+            }
+            R<PurseInOutBo> result = createNormalOrder(bo);
+            if (result.getCode() == R.SUCCESS) {
+                return R.ok(result.getData());
+            } else {
+                return R.fail(result.getMsg());
+            }
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
     }
 
-    public static PurseInOutBo createSubsidyPostBo(PtSubsidyitemVo item) {
+    /**
+     * @param bo 退款业务对象
+     * @return 退款结果
+     */
+    @Transactional(rollbackFor = ConsumeException.class)
+    public R<PurseInOutBo>refund(PurseInOutBo bo){
+        //校验钱包余额是否充足
+        PtBagVo bagVo = payBaseBusiness.checkUserBag(bo);
+        if (bagVo.getBalance().compareTo(bo.getReceiptMoney()) < 0) {
+            return R.fail(MessageFormat.format("钱包余额不足,当前余额为:{0}", bagVo.getBalance()),bo);
+        }
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        //退款是记支出,所以金额设置为负数
+        bo.setReceiptMoney(bo.getReceiptMoney().negate());
+        try {
+            R<PurseInOutBo> result = createNormalOrder(bo);
+            if (result.getCode() == R.SUCCESS) {
+                return R.ok(result.getData());
+            } else {
+                return R.fail(result.getMsg(),bo);
+            }
+        } catch (Exception e) {
+            return R.fail(e.getMessage(),bo);
+        }
+    }
+    /**
+     * 将要入账的补助信息转成收支订单业务对象
+     * @param item 补助信息
+     * @return 收支订单
+     */
+    private static PurseInOutBo createSubsidyPostBo(PtSubsidyitemVo item) {
         PurseInOutBo orderBo = new PurseInOutBo();
         orderBo.setUserId(item.getUserId());
         orderBo.setBagCode(item.getBagCode());
-        orderBo.setPayStyle("4");
+        orderBo.setPayStyle(PayStyleEnum.OTHER.code().toString());
         orderBo.setTakeCommission("0");
         orderBo.setReceiptMoney(item.getFillMoney());
         orderBo.setOperationMode(BalanceUpdateEnum.RECHARGE);

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

@@ -1,319 +0,0 @@
-package org.dromara.backstage.business.payments;
-
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.util.ObjUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONUtil;
-import lombok.RequiredArgsConstructor;
-import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
-import org.dromara.backstage.basics.service.IPtWorkstationService;
-import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
-import org.dromara.backstage.cardCenter.service.IPtCardService;
-import org.dromara.backstage.consumption.domain.bo.XfCreditAccountBackBo;
-import org.dromara.backstage.consumption.domain.bo.XfCreditAccountBo;
-import org.dromara.backstage.consumption.domain.bo.XfUserTotalBo;
-import org.dromara.backstage.consumption.domain.vo.XfCreditAccountBackVo;
-import org.dromara.backstage.consumption.domain.vo.XfCreditAccountVo;
-import org.dromara.backstage.consumption.domain.vo.XfTermVo;
-import org.dromara.backstage.consumption.domain.vo.XfUserTotalVo;
-import org.dromara.backstage.consumption.service.IXfCreditAccountBackService;
-import org.dromara.backstage.consumption.service.IXfCreditAccountService;
-import org.dromara.backstage.consumption.service.IXfTermService;
-import org.dromara.backstage.consumption.service.IXfUserTotalService;
-import org.dromara.backstage.payment.domain.bo.PtBagBo;
-import org.dromara.backstage.payment.domain.vo.PtBagVo;
-import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
-import org.dromara.backstage.payment.service.IPtBagService;
-import org.dromara.backstage.payment.service.IPtUserAccountService;
-import org.dromara.common.core.enums.CreditStatusEnum;
-import org.dromara.common.core.exception.payments.PaymentsException;
-import org.dromara.common.core.utils.MessageUtils;
-import org.dromara.common.core.utils.RecordIdUtils;
-import org.jetbrains.annotations.NotNull;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-/**
- * 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 static final Logger log = LoggerFactory.getLogger(PaymentsBusiness.class);
-    private final IPtWorkstationService workstationService;
-    private final IPtUserAccountService userAccountService;
-    private final IXfTermService termService;
-    private final IPtCardService cardService;
-    private final IPtBagService bagService;
-    private final IXfCreditAccountBackService creditAccountBackService;
-    private final IXfCreditAccountService creditAccountService;
-    private final IXfUserTotalService userTotalService;
-
-    /**
-     * 账户资金收支时获取必要的辅助信息
-     *
-     * @param bo 资金收支信息
-     * @return 辅助信息列表
-     */
-    public List<Object> getOtherInfo(PtBagBo bo) {
-        List<Object> list = new ArrayList<>();
-        //1.人员辅助信息
-        PtUserAccountVo userAccountVo = userAccountService.queryById(bo.getUserId());
-        list.add(userAccountVo);
-        //2.卡片辅助信息
-        PtCardVo ptCardVo;
-        if (bo.getCardId() != null && bo.getCardId() > 0) {
-            //如果传入了cardId,根据cardId查询卡片信息
-            ptCardVo = cardService.queryById(bo.getCardId());
-        } else {
-            //查询当前人的正常主卡
-            ptCardVo = cardService.queryMainCardByUserId(bo.getUserId());
-        }
-        list.add(ptCardVo);
-        //3.钱包辅助信息
-        PtBagVo ptBagVo = bagService.queryByUserBagCode(bo.getUserId(), bo.getBagCode());
-        list.add(ptBagVo);
-        //4.设备辅助信息
-        XfTermVo xfTermVo = termService.queryByNo(bo.getTermNo() == null ? 0 : bo.getTermNo());
-        list.add(xfTermVo);
-        //5.工作站辅助信息
-        PtWorkstationVo ptWorkstationVo = workstationService.queryById(bo.getStationId());
-        list.add(ptWorkstationVo);
-
-        return list;
-    }
-
-    /**
-     * 生成原始收支记录(收支流水备份表)
-     *
-     * @param bo            资金收支信息
-     * @param accountVo     资金收支账户信息
-     * @param cardVo        资金收支卡片信息
-     * @param termVo        资金收支消费设备信息
-     * @param workstationVo 资金收支工作站信息
-     * @return 原始收支记录
-     */
-    public XfCreditAccountBackVo createOriginalRecord(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo) {
-        XfCreditAccountBackBo xfCreditaccountbackBo = new XfCreditAccountBackBo();
-        String backId = getRecordKeyId(bo, accountVo, bagVo);
-        xfCreditaccountbackBo.setBackId(backId);
-
-        //设置交易数据
-        xfCreditaccountbackBo.setCreditTime(new Date());
-        xfCreditaccountbackBo.setCreditType(bo.getCreditType().code().toString());
-        xfCreditaccountbackBo.setReceiptMoney(bo.getReceiptMoney());
-        xfCreditaccountbackBo.setPayStyle(bo.getPayStyle());
-        xfCreditaccountbackBo.setCreditStatus(CreditStatusEnum.CREATE.code());
-        xfCreditaccountbackBo.setUseType(bo.getUseType().code());
-        xfCreditaccountbackBo.setOperatorId(bo.getOperatorId());
-
-        //设置交易人数据
-        xfCreditaccountbackBo.setUserId(bo.getUserId());
-
-        //设置交易卡片数据mq
-        if (ObjUtil.isNotEmpty(cardVo)) {
-            xfCreditaccountbackBo.setCardNo(cardVo.getCardNo());
-            //xfCreditaccountbackBo.setMainCard(cardVo.getMainCard());
-        }
-        //设置账户钱包信息
-        xfCreditaccountbackBo.setBagType(bagVo.getBagCode());
-        xfCreditaccountbackBo.setCardValue(bagVo.getBalance());
-
-        //设置交易设备信息
-        if (ObjUtil.isNotEmpty(termVo)) {
-            xfCreditaccountbackBo.setTermNo(termVo.getTermNo());
-            xfCreditaccountbackBo.setTermRecordId(bo.getTermRecordId());
-        }
-
-        //设置交易工作站信息
-        if (ObjUtil.isNotEmpty(workstationVo)) {
-            xfCreditaccountbackBo.setStationId(workstationVo.getStationId());
-        }
-
-        XfCreditAccountBackVo creditAccountBackVo = creditAccountBackService.createOriginalRecord(xfCreditaccountbackBo);
-        if (ObjUtil.isEmpty(creditAccountBackVo)) {
-            String message = MessageUtils.message("payments.OriginalRecord.create", JSONUtil.parse(bo));
-            throw new PaymentsException("资金收支-原始记录", message);
-        }
-        return creditAccountBackVo;
-    }
-
-    /**
-     * 收支记账(收支流水表)
-     *
-     * @param bo            资金收支信息
-     * @param accountVo     资金收支账户信息
-     * @param cardVo        资金收支卡片信息
-     * @param termVo        资金收支消费设备信息
-     * @param workstationVo 资金收支工作站信息
-     * @param originalId    原始收支记录Id(收支备份表主键)
-     * @return 正式收支记录
-     */
-    public XfCreditAccountVo keepAccounts(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtWorkstationVo workstationVo, String originalId) {
-        //校验要处理的原始收支记录
-        ValidOriginalRecord(originalId);
-        XfCreditAccountBo xfCreditaccountbo = new XfCreditAccountBo();
-        String accountId = getRecordKeyId(bo, accountVo, bagVo);
-        xfCreditaccountbo.setCreditId(accountId);
-
-        //设置交易数据
-        xfCreditaccountbo.setCreditTime(DateUtil.date());
-        xfCreditaccountbo.setCreditType(bo.getCreditType().code().toString());
-        xfCreditaccountbo.setReceiptMoney(bo.getReceiptMoney());
-        xfCreditaccountbo.setPayStyle(bo.getPayStyle());
-        xfCreditaccountbo.setUseType(bo.getUseType().code());
-
-        //设置交易账户信息
-        xfCreditaccountbo.setUserId(accountVo.getUserId());
-        xfCreditaccountbo.setUserNumb(accountVo.getUserNumb());
-        xfCreditaccountbo.setRealName(accountVo.getRealName());
-        xfCreditaccountbo.setDeptId(accountVo.getDeptId());
-        xfCreditaccountbo.setDeptName(accountVo.getDeptName());
-        //设置设备信息
-        xfCreditaccountbo.setTermNo(termVo.getTermNo());
-        xfCreditaccountbo.setTermName(termVo.getTermName());
-        xfCreditaccountbo.setTermRecordId(bo.getTermRecordId());
-        //设置工作站信息
-        xfCreditaccountbo.setStationNumb(workstationVo.getStationNumb());
-        xfCreditaccountbo.setStationName(workstationVo.getStationName());
-        //设置卡片信息
-        xfCreditaccountbo.setCardNo(cardVo.getCardNo());
-        xfCreditaccountbo.setCardValue(bagVo.getBalance());
-        xfCreditaccountbo.setCardType(cardVo.getCardType());
-        xfCreditaccountbo.setCardCount(bagVo.getRechargeCount() + 1);
-        xfCreditaccountbo.setCardTypeName(cardVo.getCardTypeName());
-        xfCreditaccountbo.setMainCard(cardVo.getMainCard());
-        //设置钱包信息
-        xfCreditaccountbo.setBagType(bagVo.getBagCode());
-        // 设置操作员信息
-        xfCreditaccountbo.setOperatorId(bo.getOperatorId());
-        xfCreditaccountbo.setOperatorName(bo.getOperatorName());
-
-        xfCreditaccountbo.setOriginalId(originalId);
-
-        XfCreditAccountVo creditAccountVo = creditAccountService.keepAccounts(xfCreditaccountbo);
-        if (ObjUtil.isEmpty(creditAccountVo)) {
-            String message = MessageUtils.message("payments.keepAccounts.create", originalId);
-            throw new PaymentsException("资金收支-收支入账", message);
-        }
-        return creditAccountVo;
-    }
-
-    public XfUserTotalVo createOrUpdateUserTotal(PtBagBo bo, PtUserAccountVo accountVo, PtCardVo cardVo) {
-        XfUserTotalBo xfUserTotalBo = new XfUserTotalBo();
-        xfUserTotalBo.setUserId(accountVo.getUserId());
-        xfUserTotalBo.setUserNumb(accountVo.getUserNumb());
-        xfUserTotalBo.setRealName(accountVo.getRealName());
-        xfUserTotalBo.setDeptName(accountVo.getDeptName());
-        xfUserTotalBo.setCardNo(cardVo.getCardNo());
-        xfUserTotalBo.setDateDay(DateUtil.format(new Date(), "yyyy-MM-dd"));
-        xfUserTotalBo.setUseType(bo.getUseType().code());
-        xfUserTotalBo.setCreditMoney(bo.getReceiptMoney());
-
-        return userTotalService.createOrUpdateUserTotal(xfUserTotalBo);
-    }
-
-    public PtBagVo updateBalance(PtBagBo bagBo) {
-        return bagService.updateBalanceByBo(bagBo);
-    }
-
-    /**
-     * 通用收支入账处理逻辑
-     * 这里主要是处理一次性完成的原始订单生成、收支记账
-     *
-     * @param bo 资金收支信息
-     * @return 辅助信息
-     */
-    public List<Object> createOrderMin(PtBagBo bo) {
-        log.info("[开始生成{}订单]-{}", bo.getCreditType().message(), JSONUtil.toJsonStr(bo));
-        //1.处理入账需要的其它信息
-        List<Object> list = getOtherInfo(bo);
-        PtUserAccountVo accountVo = list.get(0) == null ? new PtUserAccountVo() : (PtUserAccountVo) list.get(0);
-        PtCardVo cardVo = list.get(1) == null ? new PtCardVo() : (PtCardVo) list.get(1);
-        PtBagVo bagVo = list.get(2) == null ? new PtBagVo() : (PtBagVo) list.get(2);
-        XfTermVo termVo = list.get(3) == null ? new XfTermVo() : (XfTermVo) list.get(3);
-        PtWorkstationVo workstationVo = list.get(4) == null ? new PtWorkstationVo() : (PtWorkstationVo) list.get(4);
-
-        //2.创建收支订单
-        XfCreditAccountBackVo creditBackVo = createOriginalRecord(bo, (PtUserAccountVo) list.get(0),
-            (PtCardVo) list.get(1), (PtBagVo) list.get(2), (XfTermVo) list.get(3), (PtWorkstationVo) list.get(4));
-        bo.setOriginalId(creditBackVo.getBackId());
-        //3.收支入账,此处只需要入收支明细表就可以了
-        log.info("[{}订单生成完成,开始生成{}收支记录]-{}", bo.getCreditType().message(), bo.getCreditType().message(), JSONUtil.toJsonStr(bo));
-        XfCreditAccountVo creditVo = keepAccounts(bo, accountVo, cardVo, bagVo, termVo, workstationVo, creditBackVo.getBackId());
-        bo.setCreditId(creditVo.getCreditId());
-        return list;
-    }
-
-    /**
-     * 通用收支入账处理逻辑
-     * 这里主要是处理一次性完成的原始订单生成、收支记账和更新个人日统计表功能
-     *
-     * @param bo 资金收支信息
-     */
-    public void createOrderNormal(PtBagBo bo) {
-        List<Object> list = createOrderMin(bo);
-        PtUserAccountVo accountVo = list.get(0) == null ? new PtUserAccountVo() : (PtUserAccountVo) list.get(0);
-        PtCardVo cardVo = list.get(1) == null ? new PtCardVo() : (PtCardVo) list.get(1);
-
-        //4.写日统计表
-        log.info("[收支记录生成完成,开始写个人日统计表]-{}", JSONUtil.toJsonStr(bo));
-        createOrUpdateUserTotal(bo, accountVo, cardVo);
-    }
-
-    public void updateOrderStatus(PtBagBo bo, Integer status, BigDecimal cardValue) {
-        creditAccountBackService.updateStatusById(bo.getOriginalId(), status, bo.getCreditId(), cardValue);
-    }
-
-    /**
-     * 收支入账前校验收支原始记录
-     *
-     * @param originalId 原始记录Id
-     */
-    private void ValidOriginalRecord(String originalId) {
-        String message;
-        XfCreditAccountBackVo xfCreditaccountbackVo = creditAccountBackService.queryById(originalId);
-        if (ObjUtil.isEmpty(xfCreditaccountbackVo)) {
-            message = MessageUtils.message("payments.OriginalRecord.get", originalId);
-            throw new PaymentsException("资金收支-原始记录", message);
-        }
-        String accountId = xfCreditaccountbackVo.getCreditId();
-        if (StrUtil.isNotEmpty(accountId)) {
-            message = MessageUtils.message("payments.OriginalRecord.isPost", originalId, accountId);
-            throw new PaymentsException("资金收支-原始记录", message);
-        }
-    }
-
-    /**
-     * 生成资金收支备份表和收支表的32位主键Id
-     *
-     * @param bo        资金收支信息
-     * @param accountVo 人员账户信息
-     * @param bagVo     账户钱包信息
-     * @return 生成的记录Id
-     */
-    @NotNull
-    private String getRecordKeyId(PtBagBo bo, PtUserAccountVo accountVo, PtBagVo bagVo) {
-        BigDecimal a = new BigDecimal(100);
-        int key3 = 0;
-        if (bo.getReceiptMoney().compareTo(BigDecimal.ZERO) > 0) {
-            key3 = bo.getReceiptMoney().multiply(a).intValue();
-        } else {
-            key3 = bo.getReceiptMoney().negate().multiply(a).intValue();
-        }
-        return RecordIdUtils.getRecordId(new Date(), Short.parseShort(bo.getCreditType().code().toString()), Integer.parseInt(accountVo.getUserNo().toString()), key3, Integer.parseInt(bagVo.getBagCode()));
-    }
-}

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

@@ -1,33 +0,0 @@
-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);
-
-}

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

@@ -1,33 +0,0 @@
-package org.dromara.backstage.business.payments.strategy;
-
-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);
-    }
-}

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

@@ -1,49 +0,0 @@
-package org.dromara.backstage.business.payments.strategy.impl;
-
-import cn.hutool.json.JSONUtil;
-import lombok.RequiredArgsConstructor;
-import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
-import org.dromara.backstage.business.payments.PaymentsBusiness;
-import org.dromara.backstage.business.payments.strategy.IPaymentsStrategy;
-import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
-import org.dromara.backstage.consumption.domain.vo.XfTermVo;
-import org.dromara.backstage.payment.domain.bo.PtBagBo;
-import org.dromara.backstage.payment.domain.vo.PtBagVo;
-import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
-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
- */
-@RequiredArgsConstructor
-@Service(CreditTypeConstants.COMMISSION)
-public class CommissionPaymentsStrategyImpl implements IPaymentsStrategy {
-    private static final Logger log = LoggerFactory.getLogger(CommissionPaymentsStrategyImpl.class);
-    private final PaymentsBusiness business;
-    /**
-     * 新增管理费收支明细订单管理费是不需要更新钱包数据的
-     *
-     * @param bo 资金收支明细。,
-     * @return 是否新增成功
-     */
-    @Override
-    public PtBagVo creteOrder(PtBagBo bo) {
-        business.createOrderMin(bo);
-        return null;
-    }
-
-    @Override
-    public PtBagVo postOrder(PtBagBo bo) {
-        return null;
-    }
-}

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

@@ -1,58 +0,0 @@
-package org.dromara.backstage.business.payments.strategy.impl;
-
-import cn.hutool.json.JSONUtil;
-import lombok.RequiredArgsConstructor;
-import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
-import org.dromara.backstage.business.payments.strategy.IPaymentsStrategy;
-import org.dromara.backstage.business.payments.PaymentsBusiness;
-import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
-import org.dromara.backstage.consumption.domain.vo.XfCreditAccountBackVo;
-import org.dromara.backstage.consumption.domain.vo.XfTermVo;
-import org.dromara.backstage.payment.domain.bo.PtBagBo;
-import org.dromara.backstage.payment.domain.vo.PtBagVo;
-import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
-import org.dromara.common.core.constant.CreditTypeConstants;
-import org.dromara.common.core.enums.CreditStatusEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * 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 PaymentsBusiness business;
-    /**
-     * 新增资金收支明细订单
-     *
-     * @param bo 资金收支明细
-     * @return 是否新增成功
-     */
-    @Override
-    public PtBagVo creteOrder(PtBagBo bo) {
-        business.createOrderNormal(bo);
-        //5.写钱包余额
-        log.info("[个人日统计表处理成功,开始更新账户余额-{}", JSONUtil.toJsonStr(bo));
-        PtBagVo vo = business.updateBalance(bo);
-        business.updateOrderStatus(bo, CreditStatusEnum.SUCCESS.code(),vo.getBalance());
-        return vo;
-    }
-
-    @Override
-    public PtBagVo postOrder(PtBagBo bo) {
-        return null;
-    }
-}

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

@@ -1,66 +0,0 @@
-package org.dromara.backstage.business.payments.strategy.impl;
-
-import cn.hutool.json.JSONUtil;
-import lombok.RequiredArgsConstructor;
-import org.dromara.backstage.basics.domain.vo.PtWorkstationVo;
-import org.dromara.backstage.business.payments.PaymentsBusiness;
-import org.dromara.backstage.business.payments.strategy.IPaymentsStrategy;
-import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
-import org.dromara.backstage.consumption.domain.vo.XfCreditAccountBackVo;
-import org.dromara.backstage.consumption.domain.vo.XfCreditAccountVo;
-import org.dromara.backstage.consumption.domain.vo.XfTermVo;
-import org.dromara.backstage.consumption.domain.vo.XfUserTotalVo;
-import org.dromara.backstage.payment.domain.bo.PtBagBo;
-import org.dromara.backstage.payment.domain.vo.PtBagVo;
-import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
-import org.dromara.common.core.constant.CreditTypeConstants;
-import org.dromara.common.core.enums.CreditStatusEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * 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.REFUND)
-public class RefundPaymentsStrategyImpl implements IPaymentsStrategy {
-    private static final Logger log = LoggerFactory.getLogger(RefundPaymentsStrategyImpl.class);
-    private final PaymentsBusiness business;
-
-    /**
-     * 新增资金收支明细订单
-     * <p>
-     * 因为管理平台的退款操作是一次性完成,所以将订单创建及更新钱包一次性完成
-     *
-     * @param bo 资金收支明细
-     * @return 是否新增成功
-     */
-    @Override
-    public PtBagVo creteOrder(PtBagBo bo) {
-        BigDecimal doValue = bo.getReceiptMoney();
-        business.createOrderNormal(bo);
-
-        //5.写钱包余额
-        log.info("[个人日统计表处理成功,开始更新账户余额-{}", JSONUtil.toJsonStr(bo));
-        bo.setReceiptMoney(doValue.negate());
-        PtBagVo vo = business.updateBalance(bo);
-        business.updateOrderStatus(bo, CreditStatusEnum.SUCCESS.code(),vo.getBalance());
-        return vo;
-    }
-
-    @Override
-    public PtBagVo postOrder(PtBagBo bo) {
-        return null;
-    }
-}

+ 8 - 28
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtCardController.java

@@ -6,11 +6,12 @@ import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
-import org.dromara.backstage.business.payments.strategy.PaymentsStrategyContent;
+import org.dromara.backstage.business.payments.PayOrderBusiness;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.bo.PurseInOutBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.service.IPtBagService;
 import org.dromara.common.core.constant.Constants;
@@ -30,6 +31,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
+import java.text.MessageFormat;
 import java.util.List;
 
 /**
@@ -44,11 +46,8 @@ import java.util.List;
 @RestController
 @RequestMapping("/cardOperation/ptCard")
 public class PtCardController extends BaseController {
-
     private final IPtCardService ptCardService;
-    private final PaymentsStrategyContent paymentsStrategyContent;
-    private final IPtBagService bagService;
-
+    private final PayOrderBusiness payOrderBusiness;
     /**
      * 查询账户卡片列表
      */
@@ -145,23 +144,8 @@ public class PtCardController extends BaseController {
     @Log(title = "账户充值", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PostMapping("/recharge")
-    public R<PtBagVo> recharge(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
-        PtBagVo vo;
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
-        if (bo.getTakeCommission().equals(Constants.TAKE_COMMISSION)) {
-            //如果要收管理费
-            BigDecimal commission = ptCardService.computeCommission(bo);
-            if (commission.compareTo(BigDecimal.ZERO) > 0) {
-                PtBagBo commissionBo = new PtBagBo();
-                BeanUtil.copyProperties(bo, commissionBo);
-                commissionBo.setReceiptMoney(commission);
-                commissionBo.setCreditType(CreditTypeEnum.COMMISSION_CHARGE);
-                bo.setReceiptMoney(bo.getReceiptMoney().subtract(commission));
-                paymentsStrategyContent.createOrder(commissionBo);
-            }
-        }
-        vo = paymentsStrategyContent.createOrder(bo);
-        return R.ok(vo);
+    public R<PurseInOutBo> recharge(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
+        return payOrderBusiness.recharge(bo);
     }
 
     /**
@@ -171,11 +155,7 @@ public class PtCardController extends BaseController {
     @Log(title = "账户退款", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PostMapping("/refund")
-    public R<PtBagVo> refund(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
-        //退款是记支出,所以金额设置为负数
-        bo.setReceiptMoney(bo.getReceiptMoney().negate());
-        PtBagVo vo = paymentsStrategyContent.createOrder(bo);
-        return R.ok(vo);
+    public R<PurseInOutBo> refund(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
+        return payOrderBusiness.refund(bo);
     }
 }

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

@@ -1,7 +1,6 @@
 package org.dromara.backstage.payment.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.json.JSONUtil;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.NotEmpty;
@@ -10,18 +9,12 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.backstage.business.errfill.ErrFillBusiness;
 import org.dromara.backstage.business.payments.PayOrderBusiness;
-import org.dromara.backstage.business.payments.strategy.PaymentsStrategyContent;
-import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.backstage.payment.domain.bo.PurseInOutBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
-import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.backstage.payment.service.IPtBagService;
-import org.dromara.backstage.payment.service.IPtUserAccountService;
-import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.domain.R;
-import org.dromara.common.core.enums.CreditTypeEnum;
 import org.dromara.common.core.enums.SystemUseTypeEnum;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
@@ -57,11 +50,7 @@ import java.util.List;
 public class PtBagController extends BaseController {
 
     private final IPtBagService ptBagService;
-    private final IPtCardService cardService;
-    private final IPtUserAccountService accountService;
-    private final PaymentsStrategyContent paymentsStrategyContent;
     private final ErrFillBusiness errFillBusiness;
-    private final IPtBagService bagService;
     private final PayOrderBusiness payOrderBusiness;
 
     //根据userId查询账户余额
@@ -146,25 +135,8 @@ public class PtBagController extends BaseController {
     @Log(title = "账户钱包", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PostMapping("/recharge")
-    public R<PtBagVo> recharge(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
-        PurseInOutBo commissionBo = computeCommission(bo);
-        try {
-            if (commissionBo != null) {
-                R<Object> commissionResult = payOrderBusiness.createNormalOrder(bo);
-                if (commissionResult.getCode() != R.SUCCESS) {
-                    return R.fail(commissionResult.getMsg());
-                }
-            }
-            R<Object> result = payOrderBusiness.createNormalOrder(bo);
-            if (result.getCode() == R.SUCCESS) {
-                return R.ok((PtBagVo) result.getData());
-            } else {
-                return R.fail(result.getMsg());
-            }
-        } catch (Exception e) {
-            return R.fail(e.getMessage());
-        }
+    public R<PurseInOutBo> recharge(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
+        return payOrderBusiness.recharge(bo);
     }
 
     /**
@@ -174,25 +146,8 @@ public class PtBagController extends BaseController {
     @Log(title = "账户钱包", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PostMapping("/refund")
-    public R<PtBagVo> refund(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
-        //校验钱包余额是否充足
-        PtBagVo bagVo = bagService.queryByUserBagCode(bo.getUserId(), bo.getBagCode());
-        if (bagVo.getBalance().compareTo(bo.getReceiptMoney()) < 0) {
-            return R.fail(MessageFormat.format("账户余额不足,当前余额为:{0}", bagVo.getBalance()));
-        }
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
-        //退款是记支出,所以金额设置为负数
-        bo.setReceiptMoney(bo.getReceiptMoney().negate());
-        try {
-            R<Object> result = payOrderBusiness.createNormalOrder(bo);
-            if (result.getCode() == R.SUCCESS) {
-                return R.ok((PtBagVo) result.getData());
-            } else {
-                return R.fail(result.getMsg());
-            }
-        } catch (Exception e) {
-            return R.fail(e.getMessage());
-        }
+    public R<PurseInOutBo> refund(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
+        return payOrderBusiness.refund(bo);
     }
 
     /**
@@ -212,20 +167,13 @@ public class PtBagController extends BaseController {
         for (Long userId : userIds) {
             bo.setUserId(userId);
             bo.setReceiptMoney(doValue);
-            PurseInOutBo commissionBo = computeCommission(bo);
             try {
-                if (commissionBo != null) {
-                    R<Object> commissionResult = payOrderBusiness.createNormalOrder(bo);
-                    if (commissionResult.getCode() != R.SUCCESS) {
-                        resultList.add(MessageFormat.format("[收管理费失败]-[管理费信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(bo), commissionResult.getData().toString()));
-                    }
-                }
-                R<Object> result = payOrderBusiness.createNormalOrder(bo);
+                R<PurseInOutBo> result = payOrderBusiness.recharge(bo);
                 if (result.getCode() == R.SUCCESS) {
                     succesCount++;
                 } else {
                     errorCount++;
-                    resultList.add(MessageFormat.format("[充值失败]-[充值信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(bo), result.getData().toString()));
+                    resultList.add(MessageFormat.format("[充值失败]-[充值信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(bo), result.getMsg()));
                 }
             } catch (Exception e) {
                 errorCount++;
@@ -233,7 +181,7 @@ public class PtBagController extends BaseController {
             }
         }
         resultList.forEach(log::error);
-        return R.ok(MessageFormat.format("批量充值完成,成功[{0}]条失败[{1}]条", succesCount, errorCount));
+        return R.ok(MessageFormat.format("批量充值完成,成功[{0}]条,失败[{1}]条", succesCount, errorCount));
     }
 
     /**
@@ -247,29 +195,22 @@ public class PtBagController extends BaseController {
         List<String> resultList = new ArrayList<>();
         int succesCount = 0;
         int errorCount = 0;
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
         BigDecimal doValue = bo.getReceiptMoney();
-        //退款是记支出,所以金额设置为负数
-        bo.setReceiptMoney(doValue.negate());
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
         for (Long userId : userIds) {
             bo.setUserId(userId);
-            PtBagVo bagVo = bagService.queryByUserBagCode(userId, bo.getBagCode());
-            if (bagVo.getBalance().compareTo(doValue) < 0) {
-                errorCount++;
-                resultList.add(MessageFormat.format("[退款失败]-[退款信息:{0}]-[错误信息:余额不足,当前余额:{1}]",JSONUtil.toJsonStr(bo), bagVo.getBalance()));
-            } else {
-                try {
-                    R<Object> result = payOrderBusiness.createNormalOrder(bo);
-                    if (result.getCode() == R.SUCCESS) {
-                        succesCount++;
-                    } else {
-                        errorCount++;
-                        resultList.add(MessageFormat.format("[退款失败]-[退款信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(bo), result.getData().toString()));
-                    }
-                } catch (Exception e) {
+            bo.setReceiptMoney(doValue);
+            try {
+                R<PurseInOutBo> result = payOrderBusiness.refund(bo);
+                if (result.getCode() == R.SUCCESS) {
+                    succesCount++;
+                } else {
                     errorCount++;
-                    resultList.add(MessageFormat.format("[退款失败]-[退款信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(bo), e.getMessage()));
+                    resultList.add(MessageFormat.format("[退款失败]-[退款信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(bo), result.getMsg()));
                 }
+            } catch (Exception e) {
+                errorCount++;
+                resultList.add(MessageFormat.format("[退款失败]-[退款信息:{0}]-[错误信息:{1}]", JSONUtil.toJsonStr(bo), e.getMessage()));
             }
         }
         resultList.forEach(log::error);
@@ -307,32 +248,4 @@ public class PtBagController extends BaseController {
         String message = MessageFormat.format("错扣补款成功,补款后钱包代码:[{0}]的余额:[{1}元]", vo.getBagCode(), vo.getBalance().setScale(2, RoundingMode.HALF_UP));
         return R.ok(message, vo);
     }
-
-    /**
-     * 计算管理费
-     */
-    private PurseInOutBo computeCommission(PurseInOutBo bo) {
-        if (bo.getTakeCommission().equals(Constants.TAKE_COMMISSION)) {
-            Long cardType = bo.getCardTypeId();
-            if (bo.getCardTypeId() == null) {
-                PtUserAccountVo accountVo = accountService.queryById(bo.getUserId());
-                cardType = accountVo.getCardType();
-            }
-            bo.setCardTypeId(cardType);
-            //如果要收管理费,则计算管理费
-            PtBagBo bagBo = BeanUtil.copyProperties(bo, PtBagBo.class);
-            BigDecimal commission = cardService.computeCommission(bagBo);
-            if (commission.compareTo(BigDecimal.ZERO) > 0) {
-                //如果管理费>0,是要入资金收支记录的
-                PurseInOutBo commissionBo = new PurseInOutBo();
-                BeanUtil.copyProperties(bo, commissionBo);
-                commissionBo.setReceiptMoney(commission);
-                commissionBo.setCreditType(CreditTypeEnum.COMMISSION_CHARGE);
-                //个人收支入账的金额要减去收掉的管理费
-                bo.setReceiptMoney(bo.getReceiptMoney().subtract(commission));
-                return commissionBo;
-            }
-        }
-        return null;
-    }
 }

+ 0 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PurseInOutBo.java

@@ -56,7 +56,6 @@ public class PurseInOutBo implements Serializable {
     /**
      * 资金收支入账金额
      */
-    //@NotBlank(message = "收支金额", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal receiptMoney;
 
     /**

+ 5 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/vo/PtBagVo.java

@@ -84,5 +84,10 @@ public class PtBagVo implements Serializable {
     @ExcelProperty(value = "充值总次数")
     private Long rechargeCount;
 
+    /**
+     * 钱包名称
+     */
+    private String bagName;
+
 
 }

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/task/SubsidyScheduled.java

@@ -24,7 +24,7 @@ import org.springframework.stereotype.Component;
 public class SubsidyScheduled implements CommandLineRunner {
     private final PayOrderBusiness subsidyOrderBusiness;
 
-    @Scheduled(fixedDelay = 1 * 60 * 1000)
+    @Scheduled(fixedDelay = 10 * 60 * 1000)
     public void rechargeSubsidy(){
         R<Object> result = subsidyOrderBusiness.createSubsidyOrder();
         log.info(result.getMsg());